fixed

Pure Haskell large fixed-width integers.
git clone git://git.ppad.tech/fixed.git
Log | Files | Refs | README | LICENSE

Main.hs (2510B)


      1 {-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns -fno-warn-type-defaults #-}
      2 {-# LANGUAGE BangPatterns #-}
      3 {-# LANGUAGE OverloadedStrings #-}
      4 
      5 module Main where
      6 
      7 import qualified Numeric.Montgomery.Secp256k1.Curve as C
      8 import qualified Numeric.Montgomery.Secp256k1.Scalar as S
      9 import Criterion.Main
     10 
     11 main :: IO ()
     12 main = defaultMain [
     13     add
     14   , sub
     15   , mul
     16   , sqr
     17   , inv
     18   , redc
     19   , retr
     20   ]
     21 
     22 add :: Benchmark
     23 add = bgroup "add" [
     24     bench "curve:  M(1) + M(2)" $ nf (C.add 1) 2
     25   , bench "curve:  M(1) + M(2 ^ 255 - 19)" $ nf (C.add 1) (2 ^ 255 - 19)
     26   , bench "scalar: M(1) + M(2)" $ nf (S.add 1) 2
     27   , bench "scalar: M(1) + M(2 ^ 255 - 19)" $ nf (S.add 1) (2 ^ 255 - 19)
     28   ]
     29 
     30 sub :: Benchmark
     31 sub = bgroup "sub" [
     32     bench "curve:  M(2 ^ 255 - 1) - M(1)" $ nf
     33       (C.sub (2 ^ 255 - 1))
     34       1
     35   , bench "curve:  M(2 ^ 255 - 1) - M(2 ^ 255 - 19)" $ nf
     36       (C.sub (2 ^ 255 - 1))
     37       (2 ^ 255 - 19)
     38   , bench "scalar: M(2 ^ 255 - 1) - M(1)" $ nf
     39       (S.sub (2 ^ 255 - 1))
     40       1
     41   , bench "scalar: M(2 ^ 255 - 1) - M(2 ^ 255 - 19)" $ nf
     42       (S.sub (2 ^ 255 - 1))
     43       (2 ^ 255 - 19)
     44   ]
     45 
     46 mul :: Benchmark
     47 mul = bgroup "mul" [
     48     bench "curve:  M(2) * M(2)" $ nf (C.mul 2) 2
     49   , bench "curve:  M(2) * M(2 ^ 255 - 19)" $ nf (C.mul 2) (2 ^ 255 - 19)
     50   , bench "scalar: M(2) * M(2)" $ nf (S.mul 2) 2
     51   , bench "scalar: M(2) * M(2 ^ 255 - 19)" $ nf (S.mul 2) (2 ^ 255 - 19)
     52   ]
     53 
     54 sqr :: Benchmark
     55 sqr = bgroup "sqr" [
     56     bench "curve:  M(2) ^ 2" $ nf C.sqr 2
     57   , bench "curve:  M(2 ^ 255 - 19) ^ 2" $ nf C.sqr (2 ^ 255 - 19)
     58   , bench "scalar: M(2) ^ 2" $ nf S.sqr 2
     59   , bench "scalar: M(2 ^ 255 - 19) ^ 2" $ nf S.sqr (2 ^ 255 - 19)
     60   ]
     61 
     62 inv :: Benchmark
     63 inv = bgroup "inv" [
     64     bench "curve:  M(2) ^ -1" $ nf C.inv 2
     65   , bench "curve:  M(2 ^ 255 - 19) ^ -1" $ nf C.inv (2 ^ 255 - 19)
     66   , bench "scalar: M(2) ^ -1" $ nf S.inv 2
     67   , bench "scalar: M(2 ^ 255 - 19) ^ -1" $ nf S.inv (2 ^ 255 - 19)
     68   ]
     69 
     70 redc :: Benchmark
     71 redc = bgroup "redc" [
     72      bench "curve:  REDC(M(2), M(2))" $ nf (C.redc 2) 2
     73   ,  bench "curve:  REDC(M(2), M(2 ^ 255 - 19))" $ nf (C.redc 2) (2 ^ 255 - 19)
     74   ,  bench "scalar: REDC(M(2), M(2))" $ nf (S.redc 2) 2
     75   ,  bench "scalar: REDC(M(2), M(2 ^ 255 - 19))" $ nf (S.redc 2) (2 ^ 255 - 19)
     76   ]
     77 
     78 retr :: Benchmark
     79 retr = bgroup "retr" [
     80     bench "curve:  RETR(M(2))" $ nf C.retr 2
     81   , bench "curve:  RETR(M(2 ^ 255 - 19))" $ nf C.retr (2 ^ 255 - 19)
     82   , bench "scalar: RETR(M(2))" $ nf S.retr 2
     83   , bench "scalar: RETR(M(2 ^ 255 - 19))" $ nf S.retr (2 ^ 255 - 19)
     84   ]
     85