原根的求解证明 附代码

本文介绍了求解质数x的原根的方法,包括暴力枚举和优化后的算法,将复杂度从O(P-1)降低到O(m)*log(P-1),其中m为x-1的质因子个数。同时,文章提供了原根存在的证明,阐述了为何只需检查x-1的因数即可。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求解方法:

枚举
从2开始枚举,然后暴力判断g^(P-1) = 1 (mod P)是否当且当指数为P-1的时候第一次成立
而由于原根一般都不大大多都在200以内,所以可以暴力得到.

方法
例如求任何一个质数x的任何一个原根,一般就是枚举2到x-1,并检验。有一个方便的方法就是,求出x-1所有不同的质因子p1,p2…pm,对于任何2<=a<=x-1,判定a是否为x的原根,只需要检验a^((x-1)/p1),a^((x-1)/p2),…a^((x-1)/pm)这m个数中,是否存在一个数mod x为1,若存在,a不是x的原根,否则就是x的原根。
原来的复杂度是O(P-1),现在变成O(m)*log(P-1)m为x-1质因子的个数。质因子的个数也是log级别的。

证明
若存在,那么显然不是原根。
否则,假设存在一个最小的t < phi(x)=x-1使得a^t = 1 (mod x)
那么t一定整除于x-1。
为什么呢?我们假设t不整除于x-1,那么因为t < x-1,所以一定能得到一组k,p,使得x-1 = k * t+p。因为a^t = 1 (mod x),所以a^(k * t) = 1 (mod x),又因为a^(x-1) = 1 (mod x),所以a^p = 1 (mod x),而p < t 所以t不是最小的,矛盾。
所以那么t一定整除于x-1。所以我们只需要判断x-1的所有因数就行了。我们考虑,t一定是比x-1少一些质因子。而如果a^t = 1 (mod x) 则a^(k*t) = 1 (mod x)。所以我们分解x-1的质因数只要a^((x-1)/pi )!=1(mod x)那么所有不包含pi这个质因子的t就不满足a^t = 1 (mod x) 。遍历一遍pi就排除了所有的t。

void divi(int n){
  
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值