module GaloisField
( GaloisField(..)
) where
import Protolude
import Control.Monad.Random (MonadRandom, Random)
import Test.Tasty.QuickCheck (Arbitrary)
import Text.PrettyPrint.Leijen.Text (Pretty)
class (Arbitrary k, Eq k, Fractional k, Pretty k, Random k, Show k)
=> GaloisField k where
{-# MINIMAL char, deg, frob, pow, rnd #-}
char :: k -> Integer
deg :: k -> Int
frob :: k -> k
order :: k -> Integer
order = (^) <$> char <*> deg
{-# INLINE order #-}
pow :: k -> Integer -> k
rnd :: MonadRandom m => m k