diff options
author | Sylvain Henry <sylvain@haskus.fr> | 2020-10-01 15:13:18 +0200 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2020-10-02 13:52:38 -0400 |
commit | 8dd4f40512bb18e296280acde0507b4233a27b69 (patch) | |
tree | d6eeb56964c495c8cccff53c91ec0e345de8a06f /libraries/integer-gmp | |
parent | 12c06927a03a2fdb516f7008c57d68568b02b576 (diff) | |
download | haskell-8dd4f40512bb18e296280acde0507b4233a27b69.tar.gz |
Bignum: implement integerPowMod (#18427)
Incidentally fix powModInteger which was crashing in integer-gmp for
negative exponents when the modular multiplicative inverse for the base
didn't exist. Now we compute it explicitly with integerRecipMod so that
every backend returns the same result without crashing.
Diffstat (limited to 'libraries/integer-gmp')
-rw-r--r-- | libraries/integer-gmp/src/GHC/Integer/GMP/Internals.hs | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/libraries/integer-gmp/src/GHC/Integer/GMP/Internals.hs b/libraries/integer-gmp/src/GHC/Integer/GMP/Internals.hs index cc1068ba10..2fcb0750ed 100644 --- a/libraries/integer-gmp/src/GHC/Integer/GMP/Internals.hs +++ b/libraries/integer-gmp/src/GHC/Integer/GMP/Internals.hs @@ -32,6 +32,7 @@ module GHC.Integer.GMP.Internals , gcdExtInteger , lcmInteger , sqrInteger + , powModInteger , recipModInteger -- ** Additional conversion operations to 'Integer' @@ -189,10 +190,16 @@ sqrInteger = I.integerSqr {-# DEPRECATED recipModInteger "Use integerRecipMod# instead" #-} recipModInteger :: Integer -> Integer -> Integer -recipModInteger x m = case I.integerRecipMod# x m of - (# y | #) -> y +recipModInteger x m = case I.integerRecipMod# x (I.integerToNatural m) of + (# y | #) -> I.integerFromNatural y (# | () #) -> 0 +{-# DEPRECATED powModInteger "Use integerPowMod# instead" #-} +powModInteger :: Integer -> Integer -> Integer -> Integer +powModInteger b e m = case I.integerPowMod# b e (I.integerToNatural m) of + (# r | #) -> I.integerFromNatural r + (# | () #) -> 0 + {-# DEPRECATED wordToNegInteger "Use integerFromWordNeg# instead" #-} wordToNegInteger :: Word# -> Integer wordToNegInteger = I.integerFromWordNeg# |