NumberSieves-0.1.1: tests/NumberSieves-tests.hs
module Main where
import qualified Math.Sieve.ONeill as O
import qualified Math.Sieve.Factor as F
import qualified Math.Sieve.Phi as P
import Control.Monad(when)
limit = 10^6
primes = O.primesToLimit limit
factors = F.sieve limit
phis = P.sieve limit
phi = P.phi phis
phi' = product . map (\(p,k) -> (p-1)*p^(k-1)) . F.factor factors
prop_oneill_factor = primes == filter (F.isPrime factors) [1..limit]
prop_oneill_phi = primes == filter (P.isPrime phis) [1..limit]
prop_factor_phi = all (\n -> phi n == phi' n) [1..limit]
tests = [ ( prop_oneill_phi , "prop_oneill_phi" )
, ( prop_oneill_factor , "prop_oneill_factor" )
, ( prop_factor_phi , "prop_factor_phi" ) ]
main = do
let failed_tests = filter (\(passed,_) -> not passed) tests
mapM_ (\(_,name) -> putStrLn (name ++ " failed!")) failed_tests
let num_failed = show (length failed_tests)
let num_tests = show (length tests)
if null failed_tests
then putStrLn (num_tests ++ " of " ++ num_tests ++ " tests passed!")
else putStrLn (num_failed ++ " of " ++ num_tests ++ " tests failed.")