>>> :set -XFlexibleContexts >>> [nextPrime 101 .. precPrime 130] [Prime 101,Prime 103,Prime 107,Prime 109,Prime 113,Prime 127]
[nextPrime 101 ..] [Prime 101,Prime 103,Prime 107,Prime 109,Prime 113,Prime 127...
>>> [nextPrime 101, nextPrime 107 .. precPrime 150] [Prime 101,Prime 107,Prime 113,Prime 131,Prime 137,Prime 149]
>>> succ (nextPrime 101) Prime 103
>>> pred (nextPrime 101) Prime 97
>>> fromEnum (precPrime 100) 25
>>> toEnum 25 :: Prime Int Prime 97
>>> 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
>>> primes !! 1000000 :: Prime Int -- (5.32 secs, 6,945,267,496 bytes) Prime 15485867 >>> primes !! 1000000 :: Prime Int -- (5.19 secs, 6,945,267,496 bytes) Prime 15485867against
>>> let primes' = primes :: [Prime Int] >>> primes' !! 1000000 :: Prime Int -- (5.29 secs, 6,945,269,856 bytes) Prime 15485867 >>> primes' !! 1000000 :: Prime Int -- (0.02 secs, 336,232 bytes) Prime 15485867
>>> take 10 primes [Prime 2+ω,Prime 2,Prime 3+2*ω,Prime 3+ω,Prime 4+3*ω,Prime 4+ω,Prime 5+3*ω,Prime 5+2*ω,Prime 5,Prime 6+5*ω]
>>> take 10 primes [Prime 1+ι,Prime 2+ι,Prime 1+2*ι,Prime 3,Prime 3+2*ι,Prime 2+3*ι,Prime 4+ι,Prime 1+4*ι,Prime 5+2*ι,Prime 2+5*ι]
>>> splitIntoCoprimes [(140, 1), (165, 1)] Coprimes {unCoprimes = [(28,1),(33,1),(5,2)]} >>> splitIntoCoprimes [(360, 1), (210, 1)] Coprimes {unCoprimes = [(7,1),(5,2),(3,3),(2,4)]}
>>> import Data.Maybe >>> import Math.NumberTheory.Primes >>> sqrtsModPrime 1 (fromJust (isPrime 5)) [1,4] >>> sqrtsModPrime 0 (fromJust (isPrime 5)) [0] >>> sqrtsModPrime 2 (fromJust (isPrime 5)) []
>>> import Data.Maybe >>> import Math.NumberTheory.Primes >>> sqrtsModPrimePower 7 (fromJust (isPrime 3)) 2 [4,5] >>> sqrtsModPrimePower 9 (fromJust (isPrime 3)) 3 [3,12,21,24,6,15]
>>> 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.
nextPrime (-100) == 2 nextPrime 1000 == 1009 nextPrime 1009 == 1009
precPrime 100 == 97 precPrime 97 == 97
toPrimeIntegral :: (Integral a, Integral b) => a -> Maybe b toPrimeIntegral (Prime a) | toInteger a == b = Just (Prime (fromInteger b)) | otherwise = Nothing where b = toInteger aThe point of toPrimeIntegral is to avoid redundant conversions and conditions, when it is safe to do so, determining type sizes statically with bitSizeMaybe. For example, toPrimeIntegral from Prime Int to Prime Word boils down to Just . fromIntegral.
approxPrimeCount n >= primeCount n || n >= approxPrimeCountOverestimateLimit