fixed

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

commit 4bee193289b86adadbfc8144e9a17d9e4fe91099
parent 736355e962618618cae4a932c469a66de81e3352
Author: Jared Tobin <jared@jtobin.io>
Date:   Fri, 12 Dec 2025 16:34:31 +0400

lib: simplify using odd

Diffstat:
Mlib/Numeric/Montgomery/Secp256k1/Curve.hs | 5++---
Mlib/Numeric/Montgomery/Secp256k1/Scalar.hs | 7+++----
2 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/lib/Numeric/Montgomery/Secp256k1/Curve.hs b/lib/Numeric/Montgomery/Secp256k1/Curve.hs @@ -54,7 +54,6 @@ module Numeric.Montgomery.Secp256k1.Curve ( ) where import Control.DeepSeq -import qualified Data.Bits as B import qualified Data.Choice as C import Data.Word.Limb (Limb(..)) import qualified Data.Word.Limb as L @@ -1010,11 +1009,11 @@ sqrt n = -- 1024 exp :: Montgomery -> Wider -> Montgomery exp b = loop 1 b where - loop !r !m !e@(Wider (# Limb (W# -> w), _, _, _ #)) = case WW.cmp e 0 of + loop !r !m !e = case WW.cmp e 0 of GT -> let !nm = sqr m !ne = WW.shr1 e - !nr | B.testBit w 0 = r * m + !nr | WW.odd e = r * m | otherwise = r in loop nr nm ne _ -> r diff --git a/lib/Numeric/Montgomery/Secp256k1/Scalar.hs b/lib/Numeric/Montgomery/Secp256k1/Scalar.hs @@ -53,7 +53,6 @@ module Numeric.Montgomery.Secp256k1.Scalar ( ) where import Control.DeepSeq -import qualified Data.Bits as B import qualified Data.Choice as C import Data.Word.Limb (Limb(..)) import qualified Data.Word.Limb as L @@ -61,7 +60,7 @@ import qualified Data.Word.Wide as W import Data.Word.Wider (Wider(..)) import qualified Data.Word.Wider as WW import GHC.Exts (Word(..)) -import Prelude hiding (div, mod, or, and, not, quot, rem, recip, exp) +import Prelude hiding (or, and, not, exp, odd) -- montgomery arithmetic, specialized to the secp256k1 scalar group order -- 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 @@ -948,11 +947,11 @@ inv (Montgomery w) = Montgomery (inv# w) -- 1024 exp :: Montgomery -> Wider -> Montgomery exp b = loop 1 b where - loop !r !m !e@(Wider (# Limb (W# -> w), _, _, _ #)) = case WW.cmp e 0 of + loop !r !m !e = case WW.cmp e 0 of GT -> let !nm = sqr m !ne = WW.shr1 e - !nr | B.testBit w 0 = r * m + !nr | WW.odd e = r * m | otherwise = r in loop nr nm ne _ -> r