Two basic finite fields are:
Create a finite field with q = p^n elements using
i1 : F = GF(81,Variable=>a)
o1 = F
o1 : GaloisField
|
This creates the ring of characteristic 3, having 3^4 = 81 elements. The elements of this ring are 0, a, a^2, a^3, ..., a^80.
i2 : a^80
o2 = 1
o2 : F
|
i3 : a^40
o3 = 1
o3 : F
|
Note that, except for 0 and 1, every element is displayed as a power of the variable
a. Use
ambient to see the quotient ring the field is made from.
i4 : ambient F
ZZ
-- [a]
3
o4 = ----------------
4 3 2
a + a + a + 1
o4 : QuotientRing
|
Now check that
a satisfies this equation.
i5 : a^4 + a - 1
3 2
o5 = - a - a + a + 1
o5 : F
|
It is often preferable to view elements of
F as polynomials in
a rather than as powers of
a. This can be accomplished by lifting the elements back to this ambient ring.
i6 : lift(a^20, ambient F)
o6 = -1
ZZ
-- [a]
3
o6 : ----------------
4 3 2
a + a + a + 1
|
i7 : apply({20,40,80}, i -> lift(a^i, ambient F))
o7 = {-1, 1, 1}
o7 : List
|
(for more details on lift, see ,
working with multiple rings).
Finite fields can be used as base rings for polynomial rings.
i8 : R = F[x,y,z]
o8 = R
o8 : PolynomialRing
|
i9 : f = random(2,R)
3 2 2 3 3 2 3 2
o9 = (a + a + a + 1)x + (- a + 1)x*y + a y + (a - 1)y*z + (a + a +
------------------------------------------------------------------------
2
a)z
o9 : R
|
i10 : f = (leadCoefficient f)^(-1) * f
2 3 2 2 2 3 2 2
o10 = x + (- a - a - a)x*y + (- a + a + 1)y + a*y*z + (a - a )z
o10 : R
|
Groebner bases, and all related computations work in these rings.
The prime finite fields can be made easily as quotient rings of
ZZ.
i11 : ZZ/101
ZZ
o11 = ---
101
o11 : QuotientRing
|
In general, to make a finite field with
q elements, we use
GF.
i12 : k = GF 81
o12 = k
o12 : GaloisField
|
The generator of the field can be obtained as usual.
i13 : k_0
o13 = GF$a
o13 : k
|
Notice that the name of the generator is displayed with a
$ in it to indicate that it is not accessible by typing. Of course, you could assign the generator to the symbol of your choice, but it will still print the same way.
i14 : a = k_0
o14 = GF$a
o14 : k
|
i15 : a^20+1
o15 = 0
o15 : k
|
You may use
ambient to see the quotient ring the field is made from.
i16 : ambient k
ZZ
-- [GF$a]
3
o16 = ------------------------
4 2
GF$a + GF$a + GF$a + 1
o16 : QuotientRing
|
Use
ideal to see the ideal that defined that quotient ring.
i17 : ideal oo
4 2
o17 = ideal(GF$a + GF$a + GF$a + 1)
ZZ
o17 : Ideal of -- [GF$a]
3
|
Finally, you may use
_ to recover the generator of the ideal.
i18 : oo_0
4 2
o18 = GF$a + GF$a + GF$a + 1
ZZ
o18 : -- [GF$a]
3
|
To specify a different name for the generator when the field is created, use the
Variable option.
i19 : F = GF(16, Variable => b)
o19 = F
o19 : GaloisField
|
i20 : b^20 + 1
2
o20 = b + b + 1
o20 : F
|
i21 : random F
3
o21 = b + b + 1
o21 : F
|
Finite fields can be used as base rings for polynomial rings.
i22 : R = F[x,y,z]
o22 = R
o22 : PolynomialRing
|
i23 : random(2,R)
2 3 2 2 2 3 2
o23 = x + (b + b + b + 1)y + b x*z + b*y*z + (b + b)z
o23 : R
|
If you have a quotient ring that you know is a finite field, then you can convert it to ring that is known by the system to be a finite field.
i24 : GF (ZZ/2[T]/(T^9+T+1), Variable => T)
o24 = GF 512
o24 : GaloisField
|
You may also provide your own choice of primitive element. Internally, elements of the finite field are stored as powers of the primitive element. First we assign our quotient ring to a global variable to ensure that
T gets set to a value in the quotient ring, and then we call
GF.
i25 : A = ZZ/2[T]/(T^9+T+1)
o25 = A
o25 : QuotientRing
|
i26 : k = GF (A, PrimitiveElement => T^3+1)
o26 = k
o26 : GaloisField
|
Notice that
T is still recorded as an element of its quotient ring, rather than this finite field.
Use
substitute to see how the generator
T appears as an element of the finite field.
i28 : substitute(T,k)
o28 = 0
o28 : k
|
Conversely, a given element of the finite field can be transferred back to the quotient ring with
lift.
i29 : lift(k_0, ring T)
o29 = T
o29 : A
|
We can even lift it back to the polynomial ring.
i30 : lift(k_0, ambient ring T)
o30 = T
ZZ
o30 : -- [T]
2
|
For more information see
GaloisField.