packages feed

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