定义:
代码可直接看下面求素数p原根的最终方法
对于素数 p,如果存在一个正整数 1<a<p,
使得 a1,a2,…,ap−1a1,a2,…,ap−1 模 p 的值
取遍 1,2,…,p−11,2,…,p−1 的所有整数,
称 a 是 p 的一个原根(primitive root),就是循环群的生成元。
下面求原根是基于素数来说的
原理
欧拉定理
欧拉定理表明,若n,a为正整数,且互素,则
a ϕ ( n ) = 1 ( m o d n ) ϕ ( n ) 是 欧 拉 函 数 , 素 数 的 ϕ ( n ) = n − 1 a^{\phi(n)} = 1\ \ (mod\ n)\\ \phi(n)是欧拉函数,素数的\phi(n)=n-1 aϕ(n)=1 (mod n)ϕ(n)是欧拉函数,素数的ϕ(n)=n−1
所以对于素数来说
a的n-1次方模n 一定是1
对于 a^j ≡ a^i(mod p),则 i≡j(mod p−1)。这里有两个例子:
- 3是7的原根,因为3–>2–>6–>4–>5–>1,然后开始循环
- 2不是7的原根,因为2–>4–>1–>2–>4–>1,过早的循环了
对 于 素 数 p a p − 1 ≡ 1 ( m o d p ) 对于素数p\\a^{p-1} ≡ 1 (mod\ \ p)\\ 对于素数pap−1≡1(mod p)
原根在p-1之前不会有循环
也就是原根的循环节为 p−1,非原根有较小的循环节,且是 p−1 的约数(因为元素的阶整除群的阶)
算法
(参考别人的博客)
所以我们可以求p-1非自身的约数m1,m2,m3…,如果出现
a m n ≡ 1 ( m o d p ) a^{m_n} ≡ 1(mod\ \ p)