# galois.primitive_elements¶

galois.primitive_elements(irreducible_poly, start=None, stop=None, reverse=False)

Finds all primitive elements $$g(x)$$ of the Galois field $$\mathrm{GF}(p^m)$$ with degree-$$m$$ irreducible polynomial $$f(x)$$ over $$\mathrm{GF}(p)$$.

The number of primitive elements of $$\mathrm{GF}(p^m)$$ is $$\phi(p^m - 1)$$, where $$\phi(n)$$ is the Euler totient function. See :obj:galois.euler_phi.

Parameters
• irreducible_poly (galois.Poly) – The degree-$$m$$ irreducible polynomial $$f(x)$$ over $$\mathrm{GF}(p)$$ that defines the extension field $$\mathrm{GF}(p^m)$$.

• start (int, optional) – Starting value (inclusive, integer representation of the polynomial) in the search for primitive elements $$g(x)$$ of $$\mathrm{GF}(p^m)$$. The default is None which represents $$p$$, which corresponds to $$g(x) = x$$ over $$\mathrm{GF}(p)$$.

• stop (int, optional) – Stopping value (exclusive, integer representation of the polynomial) in the search for primitive elements $$g(x)$$ of $$\mathrm{GF}(p^m)$$. The default is None which represents $$p^m$$, which corresponds to $$g(x) = x^m$$ over $$\mathrm{GF}(p)$$.

• reverse (bool, optional) – Search for primitive elements in reverse order, i.e. largest to smallest. Default is False.

Returns

List of all primitive elements of $$\mathrm{GF}(p^m)$$ with irreducible polynomial $$f(x)$$. Each primitive element $$g(x)$$ is a polynomial over $$\mathrm{GF}(p)$$ with degree less than $$m$$.

Return type

list

Examples

In : GF = galois.GF(3)

In : f = galois.Poly([1,1,2], field=GF); f
Out: Poly(x^2 + x + 2, GF(3))

In : galois.is_irreducible(f)
Out: True

In : galois.is_primitive(f)
Out: True

In : g = galois.primitive_elements(f); g
Out: [Poly(x, GF(3)), Poly(x + 1, GF(3)), Poly(2x, GF(3)), Poly(2x + 2, GF(3))]

In : len(g) == galois.euler_phi(3**2 - 1)
Out: True

In : GF = galois.GF(3)

In : f = galois.Poly([1,0,1], field=GF); f
Out: Poly(x^2 + 1, GF(3))

In : galois.is_irreducible(f)
Out: True

In : galois.is_primitive(f)
Out: False

In : g = galois.primitive_elements(f); g
Out:
[Poly(x + 1, GF(3)),
Poly(x + 2, GF(3)),
Poly(2x + 1, GF(3)),
Poly(2x + 2, GF(3))]

In : len(g) == galois.euler_phi(3**2 - 1)
Out: True
`