Erathostene sieve

This commit is contained in:
2026-01-19 15:13:33 +01:00
parent 7a12d6b21a
commit 0a112cb2fc
5 changed files with 30 additions and 1 deletions

View File

@@ -28,6 +28,7 @@ library
Primes.FermatPrimeTest Primes.FermatPrimeTest
Primes.MillerRabin Primes.MillerRabin
Primes.SolovayStrassen Primes.SolovayStrassen
Primes.ErathosteneSieve
Factorization.FermatFactorization Factorization.FermatFactorization
Factorization.PollardPminus1 Factorization.PollardPminus1
ModularSquareRoot.TonelliShanks ModularSquareRoot.TonelliShanks
@@ -60,6 +61,7 @@ test-suite haskell-math-test
other-modules: other-modules:
GF2test GF2test
TonelliShanksTest TonelliShanksTest
ErathosteneSieveTest
build-depends: build-depends:
base ^>=4.18.2.1, base ^>=4.18.2.1,
haskell-math, haskell-math,

View File

@@ -1,5 +1,6 @@
module Primes ( fermatPrimeTest, millerRabin, solovayStrassen) where module Primes ( fermatPrimeTest, millerRabin, solovayStrassen, erathosteneSieve) where
import Primes.FermatPrimeTest import Primes.FermatPrimeTest
import Primes.MillerRabin import Primes.MillerRabin
import Primes.SolovayStrassen import Primes.SolovayStrassen
import Primes.ErathosteneSieve

View File

@@ -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 [] = []

View File

@@ -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."

View File

@@ -2,11 +2,13 @@ module Main (main) where
import GF2test (run) import GF2test (run)
import TonelliShanksTest (run) import TonelliShanksTest (run)
import ErathosteneSieveTest (run)
main :: IO () main :: IO ()
main = do main = do
putStrLn "Running all tests" putStrLn "Running all tests"
GF2test.run GF2test.run
TonelliShanksTest.run TonelliShanksTest.run
ErathosteneSieveTest.run
putStrLn "All tests done." putStrLn "All tests done."