Safe Haskell | None |
---|---|
Language | Haskell2010 |
This modules provides access to the Integer
constructors and
exposes some highly optimized GMP-operations.
- data Integer
- = S# Int#
- | J# Int# ByteArray#
- gcdInt :: Int# -> Int# -> Int#
- gcdInteger :: Integer -> Integer -> Integer
- gcdExtInteger :: Integer -> Integer -> (#Integer, Integer#)
- lcmInteger :: Integer -> Integer -> Integer
- nextPrimeInteger :: Integer -> Integer
- testPrimeInteger :: Integer -> Int# -> Int#
- powInteger :: Integer -> Word# -> Integer
- powModInteger :: Integer -> Integer -> Integer -> Integer
- powModSecInteger :: Integer -> Integer -> Integer -> Integer
- recipModInteger :: Integer -> Integer -> Integer
- sizeInBaseInteger :: Integer -> Int# -> Word#
- importIntegerFromByteArray :: ByteArray# -> Word# -> Word# -> Int# -> Integer
- importIntegerFromAddr :: Addr# -> Word# -> Int# -> State# s -> (#State# s, Integer#)
- exportIntegerToMutableByteArray :: Integer -> MutableByteArray# s -> Word# -> Int# -> State# s -> (#State# s, Word##)
- exportIntegerToAddr :: Integer -> Addr# -> Int# -> State# s -> (#State# s, Word##)
The Integer
type
Number theoretic functions
gcdInteger :: Integer -> Integer -> IntegerSource
Compute greatest common divisor.
gcdExtInteger :: Integer -> Integer -> (#Integer, Integer#)Source
Extended euclidean algorithm.
For a
and b
, compute their greatest common divisor g
and the coefficient s
satisfying as + bt = g
.
lcmInteger :: Integer -> Integer -> IntegerSource
Compute least common multiple.
nextPrimeInteger :: Integer -> IntegerSource
Compute next prime greater than n
probalistically.
According to the GMP documentation, the underlying function
mpz_nextprime()
"uses a probabilistic algorithm to identify
primes. For practical purposes it's adequate, the chance of a
composite passing will be extremely small."
testPrimeInteger :: Integer -> Int# -> Int#Source
Probalistic Miller-Rabin primality test.
"
" determines whether testPrimeInteger
n kn
is prime
and returns one of the following results:
2#
is returned ifn
is definitely prime,1#
ifn
is a probable prime, or0#
ifn
is definitely not a prime.
The k
argument controls how many test rounds are performed for
determining a probable prime. For more details, see
GMP documentation for `mpz_probab_prime_p()`.
Exponentiation functions
powInteger :: Integer -> Word# -> IntegerSource
"
" computes base powInteger
b eb
raised to exponent e
.
powModInteger :: Integer -> Integer -> Integer -> IntegerSource
"
" computes base powModInteger
b e mb
raised to
exponent e
modulo m
.
Negative exponents are supported if an inverse modulo m
exists. It's advised to avoid calling this primitive with negative
exponents unless it is guaranteed the inverse exists, as failure to
do so will likely cause program abortion due to a divide-by-zero
fault. See also recipModInteger
.
powModSecInteger :: Integer -> Integer -> Integer -> IntegerSource
"
" computes base powModSecInteger
b e mb
raised to
exponent e
modulo m
. It is required that e > 0
and
m
is odd.
This is a "secure" variant of powModInteger
using the
mpz_powm_sec()
function which is designed to be resilient to side
channel attacks and is therefore intended for cryptographic
applications.
recipModInteger :: Integer -> Integer -> IntegerSource
"
" computes the inverse of recipModInteger
x mx
modulo m
. If
the inverse exists, the return value y
will satisfy 0 < y <
abs(m)
, otherwise the result is 0
.
Note: The implementation exploits the undocumented property of
mpz_invert()
to not mangle the result operand (which is initialized
to 0) in case of non-existence of the inverse.
Import/export functions
sizeInBaseInteger :: Integer -> Int# -> Word#Source
Compute number of digits (without sign) in given base
.
It's recommended to avoid calling sizeInBaseInteger
for small
integers as this function would currently convert those to big
integers in order to call mpz_sizeinbase()
.
This function wraps mpz_sizeinbase()
which has some
implementation pecularities to take into account:
- "
" (see also comment insizeInBaseInteger
0 base = 1exportIntegerToMutableByteArray
). - This function is only defined if
base >= 2#
andbase <= 256#
(Note: the documentation claims that onlybase <= 62#
is supported, however the actual implementation supports up to base 256). - If
base
is a power of 2, the result will be exact. In other cases (e.g. forbase = 10#
), the result may be 1 digit too large sometimes. - "
" can be used to determine the most significant bit ofsizeInBaseInteger
i 2#i
.
importIntegerFromByteArray :: ByteArray# -> Word# -> Word# -> Int# -> IntegerSource
Read Integer
(without sign) from byte-array in base-256 representation.
The call
importIntegerFromByteArray
ba offset size order
reads
size
bytes from theByteArray#
ba
starting atoffset
- with most significant byte first if
order
is1#
or least significant byte first iforder
is-1#
, and - returns a new
Integer
importIntegerFromAddr :: Addr# -> Word# -> Int# -> State# s -> (#State# s, Integer#)Source
Read Integer
(without sign) from memory location at addr
in
base-256 representation.
importIntegerFromAddr
addr size order
See description of importIntegerFromByteArray
for more details.
exportIntegerToMutableByteArray :: Integer -> MutableByteArray# s -> Word# -> Int# -> State# s -> (#State# s, Word##)Source
Dump Integer
(without sign) to mutable byte-array in base-256 representation.
The call
exportIntegerToMutableByteArray
i mba offset order
writes
- the
Integer
i
- into the
MutableByteArray#
mba
starting atoffset
- with most significant byte first if
order
is1#
or least significant byte first iforder
is-1#
, and - returns number of bytes written.
Use "
" to compute the exact number of
bytes written in advance for sizeInBaseInteger
i 256#i /= 0
. In case of i == 0
,
exportIntegerToMutableByteArray
will write and report zero bytes
written, whereas sizeInBaseInteger
report one byte.
It's recommended to avoid calling exportIntegerToMutableByteArray
for small
integers as this function would currently convert those to big
integers in order to call mpz_export()
.
exportIntegerToAddr :: Integer -> Addr# -> Int# -> State# s -> (#State# s, Word##)Source
Dump Integer
(without sign) to addr
in base-256 representation.
exportIntegerToAddr
addr o e
See description of exportIntegerToMutableByteArray
for more details.