arithmoi-0.8.0.0: benchmark/Math/NumberTheory/GCDBench.hs
{-# OPTIONS_GHC -fno-warn-type-defaults #-}
{-# OPTIONS_GHC -fno-warn-deprecations #-}
module Math.NumberTheory.GCDBench
( benchSuite
) where
import Gauge.Main
import Math.NumberTheory.GCD as A
import Prelude as P
import Numeric.Natural
averageGCD :: Integral a => (a -> a -> a) -> a -> a
averageGCD gcdF lim = sum [ gcdF x y | x <- [lim .. 2 * lim], y <- [lim .. x] ]
benchSuite :: Benchmark
benchSuite = bgroup "GCD"
[ subSuite "large coprimes" 1073741823 100003
, subSuite "powers of 2" (2^12) (2^19)
, subSuite "power of 23" (23^3) (23^7)
, bench "average prelude Int" $ nf (averageGCD P.gcd) (2000 :: Int)
, bench "average arithmoi Int" $ nf (averageGCD A.binaryGCD) (2000 :: Int)
, bench "average prelude Word" $ nf (averageGCD P.gcd) (2000 :: Word)
, bench "average arithmoi Word" $ nf (averageGCD A.binaryGCD) (2000 :: Word)
, bench "average prelude Integer" $ nf (averageGCD P.gcd) (2000 :: Integer)
, bench "average arithmoi Integer" $ nf (averageGCD A.binaryGCD) (2000 :: Integer)
, bench "average prelude Natural" $ nf (averageGCD P.gcd) (2000 :: Natural)
, bench "average arithmoi Natural" $ nf (averageGCD A.binaryGCD) (2000 :: Natural)
]
where subSuite :: String -> Int -> Int -> Benchmark
subSuite name m n = bgroup name
[ bench "Prelude.gcd" $ nf (P.gcd m) n
, bench "binaryGCD" $ nf (A.binaryGCD m) n
, bench "Prelude.coprime" $ nf (\t -> 1 == P.gcd m t) n
, bench "coprime" $ nf (A.coprime m) n
]