classmethod galois.FieldArray.primitive_root_of_unity(n: int) Self

Finds a primitive $$n$$-th root of unity in the finite field.

Parameters:
n: int

The root of unity.

Returns:

The primitive $$n$$-th root of unity, a 0-D scalar array.

Raises:

ValueError – If no primitive $$n$$-th roots of unity exist. This happens when $$n$$ is not a divisor of $$p^m - 1$$.

A primitive $$n$$-th root of unity $$\omega_n$$ is such that $$\omega_n^n = 1$$ and $$\omega_n^k \ne 1$$ for all $$1 \le k \lt n$$.

In $$\mathrm{GF}(p^m)$$, a primitive $$n$$-th root of unity exists when $$n$$ divides $$p^m - 1$$. Then, the primitive root is $$\omega_n = \alpha^{(p^m - 1)/n}$$ where $$\alpha$$ is a primitive element of the field.

Examples

In $$\mathrm{GF}(31)$$, primitive roots exist for all divisors of 30.

In : GF = galois.GF(31)

In : GF.primitive_root_of_unity(2)
Out: GF(30, order=31)

In : GF.primitive_root_of_unity(5)
Out: GF(16, order=31)

In : GF.primitive_root_of_unity(15)
Out: GF(9, order=31)


However, they do not exist for $$n$$ that do not divide 30.

In : GF.primitive_root_of_unity(7)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In, line 1
----> 1 GF.primitive_root_of_unity(7)

888     raise ValueError(f"Argument 'n' must be in [1, {cls.order}), not {n}.")
889 if not (cls.order - 1) % n == 0:
--> 890     raise ValueError(f"There are no primitive {n}-th roots of unity in {cls.name}.")
892 return cls.primitive_element ** ((cls.order - 1) // n)

ValueError: There are no primitive 7-th roots of unity in GF(31).


For $$\omega_5$$, one can see that $$\omega_5^5 = 1$$ and $$\omega_5^k \ne 1$$ for $$1 \le k \lt 5$$.

In : root = GF.primitive_root_of_unity(5); root
Out: GF(16, order=31)

In : powers = np.arange(1, 5 + 1); powers
Out: array([1, 2, 3, 4, 5])

In : root ** powers
Out: GF([16,  8,  4,  2,  1], order=31)