From de4106efe7cebe84b804aeebd2f9dc6b201f9b5d Mon Sep 17 00:00:00 2001 From: Daniele Fucini Date: Sat, 23 Nov 2024 17:46:34 +0100 Subject: [PATCH] Improve Haskell solution for Problem 10 using prime sieve --- Haskell/ProjectEuler.hs | 5 +++++ Haskell/p010.hs | 7 ++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Haskell/ProjectEuler.hs b/Haskell/ProjectEuler.hs index b4b6b39..e0da29d 100644 --- a/Haskell/ProjectEuler.hs +++ b/Haskell/ProjectEuler.hs @@ -1,5 +1,6 @@ module ProjectEuler ( isPrime +, primeSieve , lcmm , digitSum , sumProperDivisors @@ -9,6 +10,7 @@ module ProjectEuler import Data.Char (digitToInt) import Data.List (nub) +import Data.List.Ordered (minus, unionAll) isPrime :: (Integral n) => n -> Bool isPrime 1 = False @@ -19,6 +21,9 @@ isPrime n = where candidates = [5,11..limit] limit = floor(sqrt(fromIntegral n)) + 1 +primeSieve :: (Integral n) => [n] +primeSieve = 2:3:[5,7..] `minus` unionAll [[p*p, p*p+2*p..] | p <- tail primeSieve] + lcmm :: (Integral n) => [n] -> n lcmm values | length values == 2 = lcm (head values) (last values) diff --git a/Haskell/p010.hs b/Haskell/p010.hs index d8bc5fd..e4d02c2 100644 --- a/Haskell/p010.hs +++ b/Haskell/p010.hs @@ -2,12 +2,9 @@ -- -- Find the sum of all the primes below two million. -import ProjectEuler (isPrime) - -sumPrimes :: Int -> Int -sumPrimes n = sum [ x | x <- [1..n], isPrime x ] +import ProjectEuler (primeSieve) main = do - let result = sumPrimes 2000000 + let result = sum $ takeWhile (<2000000) primeSieve putStrLn $ "Project Euler, Problem 10\n" ++ "Answer: " ++ show result