素数判定

一个恒成立的等式a^(p-1)%p≡1(p为素数 a<p)

但如果反过来(倘若a^(p-1)%p=1,a<p,则p为素数)并不成立,也就是说它的逆定理并不成立。

但是,它的否逆定理成立。即若a^(p-1)%p≠1,则,p为合数。

所以,对于需要判断素数的p,我们随机枚举若干个a(a<p)判断,倘若a^(p-1)%p≠1,我们就可以判断它一定是合数,倘若a^(p-1)%p=1始终成立(判断二十次以上),那基本可以确定p为素数(并不能完全确定,但不是素数的几率特别小,判断次数越多几率越小)

显然a^(p-1)需要用快速幂,虽然可以边乘边模,但是a*a显然也有可能超。

所以定一个函数f(a,b,p)来计算a*b%p;

如果b为偶数 f(a,b,p)=f((a+a)%p,b/2,p);

else f(a,b,p)=a*f((a+a)%p,b/2,p)

在上面的基础上有一个优化

显然x^2%p=1(p为素数)的解为x1=1,x2=p-1;

倘若x存在其他解满足方程,那么p为合数;

显然,在快速幂的过程中,可以将p-1(显然是偶数,因为p是素数)分解成u*2^j*(j必定≥1,且u为奇数)

那么可以快速幂先算出u,然后乘j次2判断是否满足原基本式即a^(p-1)%p≡1(此时的a与p-1都是运算过程中的需要自己重新计算),倘若不满足等于1则为合数,这样可以增加测试次数,降低错误率。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值