Copyright | (c) 2016-2018 Andrew.Lelechenko |
---|---|
License | MIT |
Maintainer | Andrew Lelechenko <andrew.lelechenko@gmail.com> |
Safe Haskell | None |
Language | Haskell2010 |
Documentation
Wrapper for prime elements of a
. It is supposed to be constructed
by nextPrime
/ precPrime
.
and eliminated by unPrime
.
One can leverage Enum
instance to generate lists of primes.
Here are some examples.
- Generate primes from the given interval:
>>>
[nextPrime 101 .. precPrime 130]
[Prime 101,Prime 103,Prime 107,Prime 109,Prime 113,Prime 127]
- Generate an infinite list of primes:
>>>
[nextPrime 101 ..]
[Prime 101,Prime 103,Prime 107,Prime 109,Prime 113,Prime 127...
- Generate primes from the given interval of form p = 6k+5:
>>>
[nextPrime 101, nextPrime 107 .. precPrime 150]
[Prime 101,Prime 107,Prime 113,Prime 131,Prime 137,Prime 149]
- Get next prime:
>>>
succ (nextPrime 101)
Prime 103
- Get previous prime:
>>>
prec (nextPrime 101)
Prime 97
- Count primes less than a given number (cf.
approxPrimeCount
):
>>>
fromEnum (precPrime 100)
25
- Get 25-th prime number (cf.
nthPrimeApprox
):
>>>
toEnum 25 :: Prime Int
Prime 97
Instances
nextPrime :: (Bits a, Integral a, UniqueFactorisation a) => a -> Prime a Source #
Smallest prime, greater or equal to argument.
nextPrime (-100) == 2 nextPrime 1000 == 1009 nextPrime 1009 == 1009
precPrime :: (Bits a, Integral a, UniqueFactorisation a) => a -> Prime a Source #
Largest prime, less or equal to argument. Undefined, when argument < 2.
precPrime 100 == 97 precPrime 97 == 97
class Num a => UniqueFactorisation a where Source #
A class for unique factorisation domains.
factorise :: a -> [(Prime a, Word)] Source #
Factorise a number into a product of prime powers. Factorisation of 0 is an undefined behaviour. Otherwise following invariants hold:
abs n == abs (product (map (\(p, k) -> unPrime p ^ k) (factorise n))) all ((> 0) . snd) (factorise n)
>>>
factorise (1 :: Integer)
[]>>>
factorise (-1 :: Integer)
[]>>>
factorise (6 :: Integer)
[(Prime 2,1),(Prime 3,1)]>>>
factorise (-108 :: Integer)
[(Prime 2,2),(Prime 3,3)]
This function is a replacement
for factorise
.
If you were looking for the latter, please import
Math.NumberTheory.Primes.Factorisation instead of this module.
Warning: there are no guarantees of any particular order of prime factors, do not expect them to be ascending. E. g.,
>>>
factorise 10251562501
[(Prime 101701,1),(Prime 100801,1)]
isPrime :: a -> Maybe (Prime a) Source #
Check whether an argument is prime. If it is then return an associated prime.
>>>
isPrime (3 :: Integer)
Just (Prime 3)>>>
isPrime (4 :: Integer)
Nothing>>>
isPrime (-5 :: Integer)
Just (Prime 5)
This function is a replacement
for isPrime
.
If you were looking for the latter, please import
Math.NumberTheory.Primes.Testing instead of this module.
Instances
Old interface
primes :: Integral a => [Prime a] Source #
Ascending list of primes.
>>>
take 10 primes
[Prime 2,Prime 3,Prime 5,Prime 7,Prime 11,Prime 13,Prime 17,Prime 19,Prime 23,Prime 29]
primes
is a polymorphic list, so the results of computations are not retained in memory.
Make it monomorphic to take advantages of memoization. Compare
>>>
:set +s
>>>
primes !! 1000000 :: Prime Int
Prime 15485867 (5.32 secs, 6,945,267,496 bytes)>>>
primes !! 1000000 :: Prime Int
Prime 15485867 (5.19 secs, 6,945,267,496 bytes)
against
>>>
let primes' = primes :: [Prime Int]
>>>
primes' !! 1000000 :: Prime Int
Prime 15485867 (5.29 secs, 6,945,269,856 bytes)>>>
primes' !! 1000000 :: Prime Int
Prime 15485867 (0.02 secs, 336,232 bytes)