Miller-Rabin素数测试

bool Miller_Rabin_2(long long n) //正向迭代
{
long long p=n-1;
long long a=11;
long long x=quicks(a,p,n);
if(x==n-1) return true;
else
{
long long w;
do
{
p>>=1;
w=quicks(a,p,n);
if(w==n-1) return true;
else if(w!=1) return false;
}
while((p&1)!=1);
if(w==1||w==n-1) return true;
else return false;
}
}

判定一个数是否是素数,10^18次方内可以精确判断

最初的判断:满足2^(n-1)%n==1的数不一定是素数,不满足一定不是素数,反例341=1113,2^341%341=1;

升级判断:用快速幂计算2^(n-1) mod n 的值,值是1并且不再伪素数表中的就是素数;伪素数在满足上式后,需要判断是否是素数,可以从2到根号n一一判断;

高级判断(错误示范):一个数n,以2到n-1为底k,逐一判断k^(n-1)%n的值是否都是1,561是满足从2到560为底的伪素数

终极判断(正确):一个数n,以随机数a为底,计算a^(n-1)%n==1||n-1;如果正确则继续判断a^((n-1)/2)%n是否等于1,当是1时,继续判断直到2用完它还是1为止,如果中间出现一个n-1,直接返回素数,因为n一定是奇数,所以n-1一定是偶数,可以变成d(一个奇数)*2的x次方,

上述代码为正向判断,p必定是偶数。

**

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值