求大素数原根算法(python代码)

定义:

代码可直接看下面求素数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)=n1
所以对于素数来说

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)\\ pap11mod  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)

  • 16
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值