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