content: module Test.Extension where
  
  import Protolude
  
  import Data.Field.Galois
  import Test.Tasty
  
  import Test.Galois
  import Test.Prime
  
  data P111
  instance IrreducibleMonic P111 FS2 where
    poly _ = X2 + X + 1
  type FS4 = Extension P111 FS2
  
  data P1101
  instance IrreducibleMonic P1101 FS2 where
    poly _ = X3 + X + 1
  type FS8 = Extension P1101 FS2
  
  data P1011
  instance IrreducibleMonic P1011 FS2 where
    poly _ = X3 + X2 + 1
  type FS8' = Extension P1011 FS2
  
  data P101
  instance IrreducibleMonic P101 FS3 where
    poly _ = X2 + 1
  type FS9 = Extension P101 FS3
  
  data P211
  instance IrreducibleMonic P211 FS3 where
    poly _ = X2 + X - 1
  type FS9' = Extension P211 FS3
  
  data P221
  instance IrreducibleMonic P221 FS3 where
    poly _ = X2 - X - 1
  type FS9'' = Extension P221 FS3
  
  instance IrreducibleMonic P101 FM0 where
    poly _ = X2 + 1
  type FL0 = Extension P101 FM0
  
  instance IrreducibleMonic P101 FM1 where
    poly _ = X2 + 1
  type FL1 = Extension P101 FM1
  
  instance IrreducibleMonic P101 FM2 where
    poly _ = X2 + 1
  type FL2 = Extension P101 FM2
  
  instance IrreducibleMonic P101 FM3 where
    poly _ = X2 + 1
  type FL3 = Extension P101 FM3
  
  instance IrreducibleMonic P101 FM4 where
    poly _ = X2 + 1
  type FL4 = Extension P101 FM4
  
  instance IrreducibleMonic P101 FVL where
    poly _ = X2 + 17
  type FV2 = Extension P101 FVL
  
  instance IrreducibleMonic P101 FXL where
    poly _ = X2 + 17
  type FX2 = Extension P101 FXL
  
  instance IrreducibleMonic P101 FZL where
    poly _ = X2 + 17
  type FZ2 = Extension P101 FZL
  
  data PU
  instance IrreducibleMonic PU Fq where
    poly _ = X2 + 1
  type Fq2 = Extension PU Fq
  
  data PV
  instance IrreducibleMonic PV Fq2 where
    poly _ = X3 - 9 - Y X
  type Fq6 = Extension PV Fq2
  
  data PW
  instance IrreducibleMonic PW Fq6 where
    poly _ = X2 - Y X
  type Fq12 = Extension PW Fq6
  
  testExtension :: TestTree
  testExtension = testGroup "Extension fields"
    [ test' "FS4"   (witness :: FS4  ) -- not implemented.
    , test  "FS8"   (witness :: FS8  )
    , test  "FS8'"  (witness :: FS8' )
    , test  "FS9"   (witness :: FS9  )
    , test  "FS9'"  (witness :: FS9' )
    , test  "FS9''" (witness :: FS9'')
    , test  "FL0"   (witness :: FL0  )
    , test  "FL1"   (witness :: FL1  )
    , test  "FL2"   (witness :: FL2  )
    , test  "FL3"   (witness :: FL3  )
    , test  "FL4"   (witness :: FL4  )
    , test  "FV2"   (witness :: FV2  )
    , test  "FX2"   (witness :: FX2  )
    , test  "FZ2"   (witness :: FZ2  )
    , test  "Fq2"   (witness :: Fq2  )
    , test' "Fq6"   (witness :: Fq6  ) -- time out.
    , test' "Fq12"  (witness :: Fq12 ) -- time out.
    ]
  