Safe Haskell | Safe |
---|---|
Language | Haskell2010 |
Prime numbers and related number theoretical stuff.
Synopsis
- primes :: [Integer]
- primesSimple :: [Integer]
- primesTMWE :: [Integer]
- groupIntegerFactors :: [Integer] -> [(Integer, Int)]
- integerFactorsTrialDivision :: Integer -> [Integer]
- powerMod :: Integer -> Integer -> Integer -> Integer
- millerRabinPrimalityTest :: Integer -> Integer -> Bool
- isProbablyPrime :: Integer -> Bool
- isVeryProbablyPrime :: Integer -> Bool
List of prime numbers
primesSimple :: [Integer] Source #
A relatively simple but still quite fast implementation of list of primes. By Will Ness http://www.haskell.org/pipermail/haskell-cafe/2009-November/068441.html
primesTMWE :: [Integer] Source #
List of primes, using tree merge with wheel. Code by Will Ness.
Prime factorization
groupIntegerFactors :: [Integer] -> [(Integer, Int)] Source #
Groups integer factors. Example: from [2,2,2,3,3,5] we produce [(2,3),(3,2),(5,1)]
integerFactorsTrialDivision :: Integer -> [Integer] Source #
The naive trial division algorithm.
Modulo m
arithmetic
powerMod :: Integer -> Integer -> Integer -> Integer Source #
Efficient powers modulo m.
powerMod a k m == (a^k) `mod` m
Prime testing
millerRabinPrimalityTest :: Integer -> Integer -> Bool Source #
Miller-Rabin Primality Test (taken from Haskell wiki).
We test the primality of the first argument n
by using the second argument a
as a candidate witness.
If it returs False
, then n
is composite. If it returns True
, then n
is either prime or composite.
A random choice between 2
and (n-2)
is a good choice for a
.
isProbablyPrime :: Integer -> Bool Source #
For very small numbers, we use trial division, for larger numbers, we apply the
Miller-Rabin primality test log4(n)
times, with candidate witnesses derived
deterministically from n
using a pseudo-random sequence
(which should be based on a cryptographic hash function, but isn't, yet).
Thus the candidate witnesses should behave essentially like random, but the resulting function is still a deterministic, pure function.
TODO: implement the hash sequence, at the moment we use Random
instead...
isVeryProbablyPrime :: Integer -> Bool Source #
A more exhaustive version of isProbablyPrime
, this one tests candidate
witnesses both the first log4(n) prime numbers and then log4(n) pseudo-random
numbers