The multiplicative group of each finite field is cyclic and so for each divisor m of its order there is a unique subgroup of order m.

In [Lüb22] we define standardized generators x_m of these cyclic groups in the standard finite fields described in chapter 2 which fulfill the following compatibility condition: If k | m then x_m^{m/k} = x_k.

The condition that x_m can be computed is that m can be factorized. (If we do not know the prime divisors of m then we cannot show that a given element has order m.) Note that this means that we can compute x_m in `FF(p,n)`

when m | (p^n -1) and we know the prime divisors of m, even when the factorization of (p^n-1) is not known.

In the case that the factorization of m = p^n-1 is known the corresponding x_m is a standardized primitive root of `FF(p,n)`

that can be computed.

Let l | n and set m = p^n-1 and k = p^l-1. Then x_m and x_k are the standard primitive roots of `FF(p,n)`

and `FF(p,l)`

(considered as subfield of `FF(p,n)`

), respectively. The compatibity condition says that x_m^{m/k} = x_k. This shows that the minimal polynomials of x_m and x_k over the prime field fulfill the same compatibility conditions as Conway polynomials (see `ConwayPolynomial`

(Reference: ConwayPolynomial).

`‣ StandardCyclicGenerator` ( F[, m] ) | ( operation ) |

`‣ StandardPrimitiveRoot` ( F ) | ( attribute ) |

Returns: an element of `F` or `fail`

The argument `F` must be a standard finite field (see `FF`

(2.2-1)) and `m` a positive integer. If `m` does not divide |`F`| - 1 the function returns `fail`

. Otherwise a standardized element x_`m` of order `m` is returned, as described above.

The argument `m` is optional, if not given its default value is |`F`| - 1. In this case x_`m` can also be computed with the attribute `StandardPrimitiveRoot`

.

gap> F := FF(67, 18); # Conway polynomial was hard to compute FF(67, 18) gap> x := PrimitiveElement(F); ZZ(67,18,[0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]) gap> xprim := StandardPrimitiveRoot(F);; gap> k := (Size(F)-1) / Order(x); 6853662165340556076084083497526 gap> xm := StandardCyclicGenerator(F, Order(x));; gap> xm = xprim^k; true gap> F := FF(23, 201); # factorization of (|F| - 1) not known FF(23, 201) gap> m:=79*269*67939; 1443771689 gap> (Size(F)-1) mod m; 0 gap> OrderMod(23, m); 201 gap> xm := StandardCyclicGenerator(F, m);; gap> IsOne(xm^m); true gap> ForAll(Factors(m), r-> not IsOne(xm^(m/r))); true gap> F := FF(7,48); FF(7, 48) gap> K := FF(7,12); FF(7, 12) gap> emb := Embedding(K, F);; gap> x := StandardPrimitiveRoot(F);; gap> y := StandardPrimitiveRoot(K);; gap> y^emb = x^((Size(F)-1)/(Size(K)-1)); true gap> v := Indeterminate(FF(7,1), "v"); v gap> px := MinimalPolynomial(FF(7,1), x, v);; gap> py := MinimalPolynomial(FF(7,1), y, v);; gap> Value(py, PowerMod(v, (Size(F)-1)/(Size(K)-1), px)) mod px; 0*Z(7)

generated by GAPDoc2HTML