You have noticed in this chapter that finite fields have a great deal of structure. We have also seen finite fields in Sage regularly as examples of rings and fields. Now we can combine the two, mostly using commands we already know, plus a few new ones.
By Theorem 22.6 we know that all finite fields of a given order are isomorphic and that possible orders are limited to powers of primes. We can use the FiniteField() command, as before, or a shorter equivalent is GF(). Optionally, we can specify an irreducible polynomial for the contruction of the field. We can view this polynomial as the generator of the principal ideal of a polynomial ring, or we can view it as a “re-writing” rule for powers of the field's generator that allow us to multiply elements and reformulate them as linear combinations of lesser powers.
Absent providing an irreducible polynomial, Sage will use a Conway polynomial. You can determine these with the conway_polynomial() command, or just build a finite field and request the defining polynomial with the .polynomial() method.
Just to be more readable, we coerce a list of coefficients into the set of polynomials (obtained with the .parent() method on a simple polynomial) to define a polynomial.
One useful command we have not described is the .log() method for elements of a finite field. Since we now know that the multiplicative group of nonzero elements is cyclic, we can express every element as a power of the generator. The log method will return that power.
Usually we will want to use the generator as the base of a lograithm computation in a finite field. However, other bases may be used, wih the understanding that if the base is not a generator, then the logarithm may not exist (i.e. there may not be a solution to the relevant equation).
Since we already know many Sage commands, there is not much else worth introducing before we can work profitably with finite fields. The exercises explore the ways we can examine and exploit the structure of finite fields in Sage.