mcl-1.0.0: src/MCL/Curves/Fp254BNb/Fp12.hs
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE UnliftedFFITypes #-}
module MCL.Curves.Fp254BNb.Fp12
( Fp12
, beta
, mkFp12
, fp12_c0
, fp12_c1
, fp12_c2
, fp12_c3
, fp12_c4
, fp12_c5
, fp12_isZero
) where
import Control.DeepSeq
import Data.Binary
import Foreign.C.Types
import MCL.Curves.Fp254BNb.Fp2
import qualified MCL.Internal.Field as I
import qualified MCL.Internal.Prim as I
-- | Sixth degree field extension of 'Fp2' defined as @Fp2(β)@, where @β⁶ = 1 + α@.
data Fp12 = Fp12 { unFp12 :: I.CC Fp12 }
instance Binary Fp12 where
put n = put (fp12_c0 n) *> put (fp12_c1 n) *> put (fp12_c2 n)
*> put (fp12_c3 n) *> put (fp12_c4 n) *> put (fp12_c5 n)
get = mkFp12 <$> get <*> get <*> get <*> get <*> get <*> get
instance NFData Fp12 where
rnf = (`seq` ())
instance Num Fp12 where
(+) = I.addFp
(-) = I.subtractFp
(*) = I.multiplyFp
negate = I.negateFp
abs = I.absFp
signum = I.signumFp
fromInteger n = mkFp12 (fromInteger n) 0 0 0 0 0
instance Fractional Fp12 where
recip = I.recipFp
fromRational = I.fromRationalFp
instance Eq Fp12 where
(==) = I.eqFp
instance Show Fp12 where
showsPrec p a = showsPrec p (fp12_c0 a, fp12_c1 a, fp12_c2 a,
fp12_c3 a, fp12_c4 a, fp12_c5 a)
-- | Root of the polynomial @x⁶ - 1 - α@.
{-# NOINLINE beta #-}
beta :: Fp12
beta = mkFp12 0 0 0 1 0 0
-- Construct an element of Fp12 from six coordinates in Fp2.
{-# INLINE mkFp12 #-}
mkFp12 :: Fp2 -> Fp2 -> Fp2 -> Fp2 -> Fp2 -> Fp2 -> Fp12
mkFp12 = I.unsafeOp6_ c_mcl_fp254bnb_fp12_from_base
-- | Return first Fp2 coordinate of the element in Fp12.
{-# INLINE fp12_c0 #-}
fp12_c0 :: Fp12 -> Fp2
fp12_c0 = I.unsafeOp1_ c_mcl_fp254bnb_fp12_c0
-- | Return second Fp2 coordinate of the element in Fp12.
{-# INLINE fp12_c1 #-}
fp12_c1 :: Fp12 -> Fp2
fp12_c1 = I.unsafeOp1_ c_mcl_fp254bnb_fp12_c1
-- | Return third Fp2 coordinate of the element in Fp12.
{-# INLINE fp12_c2 #-}
fp12_c2 :: Fp12 -> Fp2
fp12_c2 = I.unsafeOp1_ c_mcl_fp254bnb_fp12_c2
-- | Return fourth Fp2 coordinate of the element in Fp12.
{-# INLINE fp12_c3 #-}
fp12_c3 :: Fp12 -> Fp2
fp12_c3 = I.unsafeOp1_ c_mcl_fp254bnb_fp12_c3
-- | Return fifth Fp2 coordinate of the element in Fp12.
{-# INLINE fp12_c4 #-}
fp12_c4 :: Fp12 -> Fp2
fp12_c4 = I.unsafeOp1_ c_mcl_fp254bnb_fp12_c4
-- | Return sixth Fp2 coordinate of the element in Fp12.
{-# INLINE fp12_c5 #-}
fp12_c5 :: Fp12 -> Fp2
fp12_c5 = I.unsafeOp1_ c_mcl_fp254bnb_fp12_c5
-- | Check whether the element of Fp12 is zero.
{-# INLINE fp12_isZero #-}
fp12_isZero :: Fp12 -> Bool
fp12_isZero = I.isZero
----------------------------------------
-- | Internal
instance I.Prim Fp12 where
prim_size _ = fromIntegral c_mcl_fp254bnb_fp12_size
prim_wrap = Fp12
prim_unwrap = unFp12
-- | Internal
instance I.HasArith Fp12 where
c_add _ = c_mcl_fp254bnb_fp12_add
c_subtract _ = c_mcl_fp254bnb_fp12_subtract
c_multiply _ = c_mcl_fp254bnb_fp12_multiply
c_negate _ = c_mcl_fp254bnb_fp12_negate
c_invert _ = c_mcl_fp254bnb_fp12_invert
c_eq _ = c_mcl_fp254bnb_fp12_eq
c_is_zero _ = c_mcl_fp254bnb_fp12_is_zero
foreign import ccall unsafe "hs_mcl_fp254bnb_fp12_size"
c_mcl_fp254bnb_fp12_size :: CInt
foreign import ccall unsafe "hs_mcl_fp254bnb_fp12_add"
c_mcl_fp254bnb_fp12_add :: I.CC Fp12 -> I.CC Fp12 -> I.MC Fp12 -> IO ()
foreign import ccall unsafe "hs_mcl_fp254bnb_fp12_subtract"
c_mcl_fp254bnb_fp12_subtract :: I.CC Fp12 -> I.CC Fp12 -> I.MC Fp12 -> IO ()
foreign import ccall unsafe "hs_mcl_fp254bnb_fp12_multiply"
c_mcl_fp254bnb_fp12_multiply :: I.CC Fp12 -> I.CC Fp12 -> I.MC Fp12 -> IO ()
foreign import ccall unsafe "hs_mcl_fp254bnb_fp12_negate"
c_mcl_fp254bnb_fp12_negate :: I.CC Fp12 -> I.MC Fp12 -> IO ()
foreign import ccall unsafe "hs_mcl_fp254bnb_fp12_from_base"
c_mcl_fp254bnb_fp12_from_base :: I.CC Fp2 -> I.CC Fp2 -> I.CC Fp2
-> I.CC Fp2 -> I.CC Fp2 -> I.CC Fp2
-> I.MC Fp12 -> IO ()
foreign import ccall unsafe "hs_mcl_fp254bnb_fp12_invert"
c_mcl_fp254bnb_fp12_invert :: I.CC Fp12 -> I.MC Fp12 -> IO ()
foreign import ccall unsafe "hs_mcl_fp254bnb_fp12_eq"
c_mcl_fp254bnb_fp12_eq :: I.CC Fp12 -> I.CC Fp12 -> IO CInt
foreign import ccall unsafe "hs_mcl_fp254bnb_fp12_c0"
c_mcl_fp254bnb_fp12_c0 :: I.CC Fp12 -> I.MC Fp2 -> IO ()
foreign import ccall unsafe "hs_mcl_fp254bnb_fp12_c1"
c_mcl_fp254bnb_fp12_c1 :: I.CC Fp12 -> I.MC Fp2 -> IO ()
foreign import ccall unsafe "hs_mcl_fp254bnb_fp12_c2"
c_mcl_fp254bnb_fp12_c2 :: I.CC Fp12 -> I.MC Fp2 -> IO ()
foreign import ccall unsafe "hs_mcl_fp254bnb_fp12_c3"
c_mcl_fp254bnb_fp12_c3 :: I.CC Fp12 -> I.MC Fp2 -> IO ()
foreign import ccall unsafe "hs_mcl_fp254bnb_fp12_c4"
c_mcl_fp254bnb_fp12_c4 :: I.CC Fp12 -> I.MC Fp2 -> IO ()
foreign import ccall unsafe "hs_mcl_fp254bnb_fp12_c5"
c_mcl_fp254bnb_fp12_c5 :: I.CC Fp12 -> I.MC Fp2 -> IO ()
foreign import ccall unsafe "hs_mcl_fp254bnb_fp12_is_zero"
c_mcl_fp254bnb_fp12_is_zero :: I.CC Fp12 -> IO CInt