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:
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