module Crypto.PVSS.Polynomial
( Polynomial(..)
, generate
, evaluate
, atZero
) where
import Crypto.PVSS.ECC
import Crypto.Random
import Control.Monad
import Control.DeepSeq
import Data.List
newtype Polynomial = Polynomial [Scalar]
deriving (Show,Eq,NFData)
generate :: MonadRandom randomly => Int -> randomly Polynomial
generate i
| i <= 0 = error ("invalid polynomial degree: " ++ show i)
| otherwise = Polynomial <$> replicateM i keyGenerate
evaluate :: Polynomial -> Scalar -> Scalar
evaluate (Polynomial a) v =
foldl' (#+) (keyFromNum 0) $ zipWith (#*) a es
where
es = [ (v #^ degree) | degree <- [0..] ]
atZero :: Polynomial -> Scalar
atZero (Polynomial coeffs) = coeffs !! 0