import System.CPUTime
import Text.Printf
import Control.Monad
import Data.Number.Flint
main = do
putStrLn "Polynomial multiplication over GF(q)\n\
\------------------------------------\n\
\\ntimes measured per function application\n"
state <- newFRandState
withFRandState state $ \state -> do
putStrLn "1) Two length-10,000 polynomials over GF(3^2)"
ctx <- newFqCtxConway 3 2 "X"
fqPolyTest state ctx 10000 1 100 100
putStrLn "2) Two length-500 polynomials over GF(3^263)"
ctx <- newFqCtxConway 3 263 "X"
fqPolyTest state ctx 500 1 1 100
putStrLn "3) Two length-5 polynomials over GF(109987^4)"
ctx <- newFqCtxConway 109987 4 "X"
fqPolyTest state ctx 5 10000 10000 10000
-- test and timing -------------------------------------------------------------
fqPolyTest state ctx len c r k = do
putStr "\n"
withNewFqPoly ctx $ \f -> do
withNewFqPoly ctx $ \g -> do
withNewFqPoly ctx $ \h -> do
withFqCtx ctx $ \ctx -> do
fq_poly_randtest g state len ctx
fq_poly_randtest h state len ctx
timeItNamed "Classical" (fq_poly_mul_classical f g h ctx) c
timeItNamed "Reorder" (fq_poly_mul_reorder f g h ctx) r
timeItNamed "KS" (fq_poly_mul_KS f g h ctx) k
putStr "\n"
timeItNamed s f n = do
t0 <- getCPUTime
replicateM n f
t1 <- getCPUTime
let dt = fromIntegral (t1 - t0) / 10^9 / (fromIntegral n) :: Double
printf "%s: %.6f ms\n" s dt