From 0a112cb2fc5ac2e192033fcc6f6db388bd3b8f23 Mon Sep 17 00:00:00 2001 From: Sam HADOW Date: Mon, 19 Jan 2026 15:13:33 +0100 Subject: [PATCH] Erathostene sieve --- haskell-math.cabal | 2 ++ src/Primes.hs | 3 ++- src/Primes/ErathosteneSieve.hs | 11 +++++++++++ test/ErathosteneSieveTest.hs | 13 +++++++++++++ test/Main.hs | 2 ++ 5 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 src/Primes/ErathosteneSieve.hs create mode 100644 test/ErathosteneSieveTest.hs diff --git a/haskell-math.cabal b/haskell-math.cabal index c98af7b..58e5827 100644 --- a/haskell-math.cabal +++ b/haskell-math.cabal @@ -28,6 +28,7 @@ library Primes.FermatPrimeTest Primes.MillerRabin Primes.SolovayStrassen + Primes.ErathosteneSieve Factorization.FermatFactorization Factorization.PollardPminus1 ModularSquareRoot.TonelliShanks @@ -60,6 +61,7 @@ test-suite haskell-math-test other-modules: GF2test TonelliShanksTest + ErathosteneSieveTest build-depends: base ^>=4.18.2.1, haskell-math, diff --git a/src/Primes.hs b/src/Primes.hs index 08ec9fc..fb51375 100644 --- a/src/Primes.hs +++ b/src/Primes.hs @@ -1,5 +1,6 @@ -module Primes ( fermatPrimeTest, millerRabin, solovayStrassen) where +module Primes ( fermatPrimeTest, millerRabin, solovayStrassen, erathosteneSieve) where import Primes.FermatPrimeTest import Primes.MillerRabin import Primes.SolovayStrassen +import Primes.ErathosteneSieve diff --git a/src/Primes/ErathosteneSieve.hs b/src/Primes/ErathosteneSieve.hs new file mode 100644 index 0000000..cc40db1 --- /dev/null +++ b/src/Primes/ErathosteneSieve.hs @@ -0,0 +1,11 @@ +module Primes.ErathosteneSieve (erathosteneSieve) where + +erathosteneSieve :: Integer -> [Integer] +erathosteneSieve n + | n < 2 = [] + | otherwise = sieve [2..n] + where + sieve (p:xs) + | p * p > n = p : xs + | otherwise = p : sieve [x | x <- xs, x `mod` p /= 0] + sieve [] = [] diff --git a/test/ErathosteneSieveTest.hs b/test/ErathosteneSieveTest.hs new file mode 100644 index 0000000..4125881 --- /dev/null +++ b/test/ErathosteneSieveTest.hs @@ -0,0 +1,13 @@ +module ErathosteneSieveTest (run) where + +import Test.HUnit + +import Primes (erathosteneSieve) + +run :: IO () +run = do + putStrLn "Erathostene sieve test" + + assertEqual "Erathostene sieve n=30" (erathosteneSieve 30) [2,3,5,7,11,13,17,19,23,29] + + putStrLn "Erathostene sieve test done." diff --git a/test/Main.hs b/test/Main.hs index 8b117f9..0ecf7b9 100644 --- a/test/Main.hs +++ b/test/Main.hs @@ -2,11 +2,13 @@ module Main (main) where import GF2test (run) import TonelliShanksTest (run) +import ErathosteneSieveTest (run) main :: IO () main = do putStrLn "Running all tests" GF2test.run TonelliShanksTest.run + ErathosteneSieveTest.run putStrLn "All tests done."