2025-01-25 12:35:54 +01:00

52 lines
1.3 KiB
Haskell

-- | The BN254 scalar field
{-# LANGUAGE BangPatterns #-}
module BN254 where
--------------------------------------------------------------------------------
import Data.Bits
--------------------------------------------------------------------------------
newtype F = MkF Integer deriving (Eq,Show)
fromF :: F -> Integer
fromF (MkF x) = x
toF :: Integer -> F
toF = MkF . modP
fieldPrime :: Integer
fieldPrime = 21888242871839275222246405745257275088548364400416034343698204186575808495617
modP :: Integer -> Integer
modP x = mod x fieldPrime
instance Num F where
fromInteger = toF . fromInteger
negate (MkF x) = toF (negate x)
(+) (MkF x) (MkF y) = toF (x+y)
(-) (MkF x) (MkF y) = toF (x-y)
(*) (MkF x) (MkF y) = toF (x*y)
abs x = x
signum _ = toF 1
square :: F -> F
square x = x*x
--------------------------------------------------------------------------------
power :: F -> Integer -> F
power x0 exponent
| exponent < 0 = error "power: expecting positive exponent"
| otherwise = go 1 x0 exponent
where
go !acc _ 0 = acc
go !acc s e = go acc' s' (shiftR e 1) where
s' = s*s
acc' = if e .&. 1 == 0 then acc else acc*s
--------------------------------------------------------------------------------