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必定是偶数。
**