module Crypto.Lol.Types.IrreducibleChar2 () where
import Crypto.Lol.LatticePrelude hiding ((^))
import Crypto.Lol.Reflects
import Crypto.Lol.Types.PrimeField
import Data.Type.Natural (N2)
instance (CharOf a ~ N2, Ring a) => IrreduciblePoly a where
irreduciblePoly = do
pn <- taggedProxy
let n = proxy value pn :: Int
return $ case n of
1 -> X^1 + 1
2 -> X^2 + X^1 + 1
3 -> X^3 + X^1 + 1
4 -> X^4 + X^1 + 1
5 -> X^5 + X^2 + 1
6 -> X^6 + X^4 + X^3 + X^1 + 1
7 -> X^7 + X^1 + 1
8 -> X^8 + X^4 + X^3 + X^2 + 1
9 -> X^9 + X^4 + 1
10 -> X^10 + X^6 + X^5 + X^3 + X^2 + X^1 + 1
11 -> X^11 + X^2 + 1
12 -> X^12 + X^7 + X^6 + X^5 + X^3 + X^1 + 1
13 -> X^13 + X^4 + X^3 + X^1 + 1
14 -> X^14 + X^7 + X^5 + X^3 + 1
15 -> X^15 + X^5 + X^4 + X^2 + 1
16 -> X^16 + X^5 + X^3 + X^2 + 1
17 -> X^17 + X^3 + 1
18 -> X^18 + X^12 + X^10 + X^1 + 1
19 -> X^19 + X^5 + X^2 + X^1 + 1
20 -> X^20 + X^10 + X^9 + X^7 + X^6 + X^5 + X^4 + X^1 + 1
21 -> X^21 + X^6 + X^5 + X^2 + 1
22 -> X^22 + X^12 + X^11 + X^10 + X^9 + X^8 + X^6 + X^5 + 1
23 -> X^23 + X^5 + 1
24 -> X^24 + X^16 + X^15 + X^14 + X^13 + X^10 + X^9 + X^7 + X^5 + X^3 + 1
25 -> X^25 + X^8 + X^6 + X^2 + 1
26 -> X^26 + X^14 + X^10 + X^8 + X^7 + X^6 + X^4 + X^1 + 1
27 -> X^27 + X^12 + X^10 + X^9 + X^7 + X^5 + X^3 + X^2 + 1
28 -> X^28 + X^13 + X^7 + X^6 + X^5 + X^2 + 1
29 -> X^29 + X^2 + 1
30 -> X^30 + X^17 + X^16 + X^13 + X^11 + X^7 + X^5 + X^3 + X^2 + X^1 + 1
31 -> X^31 + X^3 + 1
32 -> X^32 + X^15 + X^9 + X^7 + X^4 + X^3 + 1
otherwise ->
error $ "The ConwayPoly instance for N2 included with the library (and exported by Crypto.Lol) only contains " ++
"irreducible polynomials for characteristic-2 fields up to GF(2^32). You need a polynomial " ++
"for GF(2^" ++ (show n) ++ "). Define your own instance of ConwayPoly and do " ++
"not import Crypto.Lol."