diff --git a/src/projectEuler/question7.hs b/src/projectEuler/question7.hs new file mode 100644 index 0000000..975242f --- /dev/null +++ b/src/projectEuler/question7.hs @@ -0,0 +1,32 @@ +-- https://projecteuler.net/problem=7 +-- Find the 10_001 prime number + +primes1 :: [Integer] +primes1 = 2:3:prs + where + 1:p:candidates = [6*k+r | k <- [0..], r <- [1,5]] + prs = p : filter isPrime candidates + isPrime n = not (any (divides n) (takeWhile (\p -> p*p <= n) prs)) + divides n p = n `mod` p == 0 + + +primes2 = 2:([3..] `minus` composites) + where + composites = union [multiples p | p <- primes2] + + multiples n = map (n*) [n..] + + (x:xs) `minus` (y:ys) | x < y = x:(xs `minus` (y:ys)) + | x == y = xs `minus` ys + | x > y = (x:xs) `minus` ys + union = foldr merge [ ] + where + merge (x:xs) ys = x:merge' xs ys + merge' (x:xs) (y:ys) | x < y = x:merge' xs (y:ys) + | x == y = x:merge' xs ys + | x > y = y:merge' (x:xs) ys + + +primes3 = sieve [2..] + where + sieve (p : xs) = p : sieve [x | x <- xs, x `mod` p > 0]