module Data.Prime (primes, isPrime, isComposite) where
primes :: [Integer]
primes :: [Integer]
primes = Integer -> [Integer] -> [Integer]
f Integer
2 [] where
f :: Integer -> [Integer] -> [Integer]
f Integer
n [Integer]
ps = if Integer -> [Integer] -> Bool
checkPrimes Integer
n [Integer]
ps
then Integer
n Integer -> [Integer] -> [Integer]
forall a. a -> [a] -> [a]
: Integer -> [Integer] -> [Integer]
f (Integer -> Integer
forall a. Enum a => a -> a
succ Integer
n) ([Integer]
ps [Integer] -> [Integer] -> [Integer]
forall a. [a] -> [a] -> [a]
++ [Integer
n])
else Integer -> [Integer] -> [Integer]
f (Integer -> Integer
forall a. Enum a => a -> a
succ Integer
n) [Integer]
ps
isPrime :: Integral n => n -> Bool
isPrime :: n -> Bool
isPrime n
n = if n
n n -> n -> Bool
forall a. Ord a => a -> a -> Bool
< n
2
then Bool
False
else Integer -> [Integer] -> Bool
checkPrimes (n -> Integer
forall a. Integral a => a -> Integer
toInteger n
n) [Integer]
primes
isComposite :: Integral n => n -> Bool
isComposite :: n -> Bool
isComposite n
n = if n
n n -> n -> Bool
forall a. Ord a => a -> a -> Bool
< n
2
then Bool
False
else Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Integer -> [Integer] -> Bool
checkPrimes (n -> Integer
forall a. Integral a => a -> Integer
toInteger n
n) [Integer]
primes
checkPrimes :: Integer -> [Integer] -> Bool
checkPrimes :: Integer -> [Integer] -> Bool
checkPrimes Integer
_ [] = Bool
True
checkPrimes Integer
n (Integer
p:[Integer]
ps)
| Integer
p Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
p Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> Integer
n = Bool
True
| Integer
n Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
`mod` Integer
p Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
0 = Bool
False
| Bool
otherwise = Integer -> [Integer] -> Bool
checkPrimes Integer
n [Integer]
ps