GaloisField`Private`ad = AdditionGF4 GaloisField`Private`mlt = MultipleGF4 GaloisField`Private`pow = PowerGF4 GaloisField`Private`vQ = VGF4Q GaloisField`Private`cQ = ConGF4Q GaloisField`Private`alvQ = AlVGF4Q BaseField[GF4] ^= GF2 Characteristic[GF4] ^= 2 ExtensionDegree[GF4] ^= 2 GFElements[GF4] ^= {0, 1, 2, 3} GFExponents[GF4] ^= {DirectedInfinity[1], 0, 1, 2} IrreduciblePolynomial[GF4] ^= {1, 1, 1} Order[GF4] ^= 4 Sqrt[GF4[0]] ^:= GF4[0] Sqrt[GF4[1]] ^:= GF4[1] Sqrt[GF4[GaloisField`Private`y$_Integer]] ^:= Block[{GaloisField`Private`a, GaloisField`Private`b}, GaloisField`Private`a = GFExponents[GF4][[GaloisField`Private`y$ + 1]]; If[OddQ[GaloisField`Private`a], GaloisField`Private`b = (GaloisField`Private`a + Order[GF4] - 1)/2; Return[GF4[GFElements[GF4][[GaloisField`Private`b + 2]]]], Return[GF4[GFElements[GF4][[GaloisField`Private`a/2 + 2]]]]]] /; Characteristic[GF4] == 2 Sqrt[GF4[GaloisField`Private`y$_Integer]] ^:= GF4[GFElements[GF4][[GFExponents[GF4][[GaloisField`Private`y$ + 1]]/2 + 2]]] /; EvenQ[GFExponents[GF4][[GaloisField`Private`y$ + 1]]] Attributes[GaloisField`Private`y$] = {Temporary} GaloisField`Private`addi = AdditionGF4 AdditionGF4[GaloisField`Private`x$_Integer, GaloisField`Private`y$_Integer] := Block[{GaloisField`Private`lstab}, GaloisField`Private`lstab = Mod[IntegerDigits[GaloisField`Private`y$, 2, 2] + IntegerDigits[GaloisField`Private`x$, 2, 2], 2]; Return[ChToDecimal[GaloisField`Private`lstab, 2]]; Null] Attributes[GaloisField`Private`x$] = {Temporary} GaloisField`Private`multi = MultipleGF4 MultipleGF4[GaloisField`Private`y$_Integer, GaloisField`Private`z$_Integer] := GFElements[GF4][[Mod[GFExponents[GF4][[GaloisField`Private`y$ + 1]] + GFExponents[GF4][[GaloisField`Private`z$ + 1]], Order[GF4] - 1] + 2]] Attributes[GaloisField`Private`z$] = {Temporary} GaloisField`Private`pwe = PowerGF4 PowerGF4[GaloisField`Private`x$_Integer, GaloisField`Private`y$_Integer] := GFElements[GF4][[Mod[GFExponents[GF4][[GaloisField`Private`x$ + 1]]* GaloisField`Private`y$, Order[GF4] - 1] + 2]]