fixed

Pure Haskell large fixed-width integers.
git clone git://git.ppad.tech/fixed.git
Log | Files | Refs | README | LICENSE

commit 407da8ed6946dbfa3be4c1bc71b50a3f6a6e7715
parent 055c7bf6207e738c6b0ebf0743effb1a46fa96ec
Author: Jared Tobin <jared@jtobin.io>
Date:   Sat, 15 Nov 2025 17:26:36 +0400

lib: montgomery negation

Diffstat:
Mlib/Data/Word/Montgomery.hs | 12++++++++++++
1 file changed, 12 insertions(+), 0 deletions(-)

diff --git a/lib/Data/Word/Montgomery.hs b/lib/Data/Word/Montgomery.hs @@ -308,6 +308,7 @@ to (Wider x) (Wider r2) (Wider m) (W# n) = Wider (to# x r2 m n) from :: Wider -> Wider -> Word -> Wider from = retr +-- | Addition in the Montgomery domain. add# :: (# Word#, Word#, Word#, Word# #) -- ^ augend -> (# Word#, Word#, Word#, Word# #) -- ^ addend @@ -319,6 +320,7 @@ add# a b m = WW.add_mod# a b m add :: Wider -> Wider -> Wider -> Wider add (Wider a) (Wider b) (Wider m) = Wider (add# a b m) +-- | Subtraction in the Montgomery domain. sub# :: (# Word#, Word#, Word#, Word# #) -- ^ minuend -> (# Word#, Word#, Word#, Word# #) -- ^ subtrahend @@ -330,3 +332,13 @@ sub# a b m = WW.sub_mod# a b m sub :: Wider -> Wider -> Wider -> Wider sub (Wider a) (Wider b) (Wider m) = Wider (sub# a b m) +-- | Modular negation in the Montgomery domain. +neg# + :: (# Word#, Word#, Word#, Word# #) -- ^ argument + -> (# Word#, Word#, Word#, Word# #) -- ^ modulus + -> (# Word#, Word#, Word#, Word# #) -- ^ modular negation +neg# a m = sub# (# 0##, 0##, 0##, 0## #) a m +{-# INLINE neg# #-} + +neg :: Wider -> Wider -> Wider +neg (Wider a) (Wider m) = Wider (neg# a m)