mirror of
https://github.com/logos-storage/rust-bn254-hash.git
synced 2026-01-03 14:23:07 +00:00
52 lines
1.3 KiB
Haskell
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
|
|
|
|
--------------------------------------------------------------------------------
|