packages feed

galois-fft-0.1.0: bench/Poly.hs

{-# LANGUAGE NoImplicitPrelude #-}

module Poly (benchmarks) where

import Protolude

import Criterion.Main
import Data.Curve.Weierstrass.BN254 (Fr)
import Data.Pairing.BN254           (getRootOfUnity)

import FFT

k :: Int
k = 5

polySize :: Int
polySize = 2^k

leftCoeffs, rightCoeffs :: [Fr]
leftCoeffs = map fromIntegral [1..polySize]
rightCoeffs = map fromIntegral (reverse [1..polySize])

points :: [(Fr,Fr)]
points
  = map (\i -> (getRootOfUnity k ^ i, fromIntegral i))
        [1..polySize]

fftPoints :: [Fr]
fftPoints = map snd points

benchmarks :: [Benchmark]
benchmarks
  = [ bench "FFT-based multiplication"
            $ nf (uncurry $ fftMult getRootOfUnity)
                 (leftCoeffs, rightCoeffs)
    , bench "FFT-based interpolation"
            $ nf (interpolate getRootOfUnity) fftPoints
    ]