1{-# LANGUAGE PackageImports #-}
2
3module Number.F2m (benchF2m) where
4
5import Gauge.Main
6import System.Random
7
8import Crypto.Number.Basic (log2)
9import Crypto.Number.F2m
10
11genInteger :: Int -> Int -> Integer
12genInteger salt bits
13    = head
14    . dropWhile ((< bits) . log2)
15    . scanl (\a r -> a * 2^(31 :: Int) + abs r) 0
16    . randoms
17    . mkStdGen
18    $ salt + bits
19
20benchMod :: Int -> Benchmark
21benchMod bits = bench (show bits) $ nf (modF2m m) a
22  where
23    m = genInteger 0 bits
24    a = genInteger 1 (2 * bits)
25
26benchMul :: Int -> Benchmark
27benchMul bits = bench (show bits) $ nf (mulF2m m a) b
28  where
29    m = genInteger 0 bits
30    a = genInteger 1 bits
31    b = genInteger 2 bits
32
33benchSquare :: Int -> Benchmark
34benchSquare bits = bench (show bits) $ nf (squareF2m m) a
35  where
36    m = genInteger 0 bits
37    a = genInteger 1 bits
38
39benchInv :: Int -> Benchmark
40benchInv bits = bench (show bits) $ nf (invF2m m) a
41  where
42    m = genInteger 0 bits
43    a = genInteger 1 bits
44
45bitsList :: [Int]
46bitsList = [64, 128, 256, 512, 1024, 2048]
47
48benchF2m =
49    [ bgroup    "modF2m" $ map benchMod    bitsList
50    , bgroup    "mulF2m" $ map benchMul    bitsList
51    , bgroup "squareF2m" $ map benchSquare bitsList
52    , bgroup    "invF2m" $ map benchInv    bitsList
53    ]
54