fixed

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

commit 96a2b9d525c9ec2eda06e46b9128abaae5497931
parent 33d61325056e4e3622768b153faaaa57c90cefbc
Author: Jared Tobin <jared@jtobin.io>
Date:   Sat, 20 Dec 2025 15:11:07 -0330

lib: used unboxed sum for sqrt#

Diffstat:
Mlib/Numeric/Montgomery/Secp256k1/Curve.hs | 16+++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/lib/Numeric/Montgomery/Secp256k1/Curve.hs b/lib/Numeric/Montgomery/Secp256k1/Curve.hs @@ -997,16 +997,14 @@ inv (Montgomery w) = Montgomery (inv# w) -- >>> (*) <$> sqrt 15 <*> sqrt 15 -- Just 15 sqrt :: Montgomery -> Maybe Montgomery -sqrt (Montgomery n) = - let !rv = sqrt# n - in if C.decide (WW.eq# (sqr# rv) n) - then Just $! Montgomery rv - else Nothing +sqrt (Montgomery n) = case sqrt# n of + (# a | #) -> Just $! Montgomery a + _ -> Nothing -- generated by etc/generate_sqrt.sh sqrt# :: (# Limb, Limb, Limb, Limb #) - -> (# Limb, Limb, Limb, Limb #) + -> (# (# Limb, Limb, Limb, Limb #) | () #) sqrt# a = let !t0 = (# Limb 0x1000003D1##, Limb 0##, Limb 0##, Limb 0## #) !t1 = sqr# t0 @@ -1513,11 +1511,11 @@ sqrt# a = !t502 = sqr# t501 !t503 = sqr# t502 !r = t503 - in r + in if C.decide (WW.eq# (sqr# r) a) + then (# r | #) + else (# | () #) {-# INLINE sqrt# #-} --- XX want unboxed variants - -- | Exponentiation in the Montgomery domain. -- -- >>> exp 2 3