我目前正在从事Project Euler并认为如果不只是蛮力解决所有问题,它可能会更有趣(和更好的学习体验)。在问题 3 中,它要求一个数的素因数,我的解决方案是对数进行因式分解(使用另一种因式分解算法),然后测试这些因数的素数。我为米勒-拉宾素数测试提出了这段代码(在彻底研究素数测试之后),它对我输入的所有复合奇数返回 true。有人能帮我找出原因吗?我以为我已经正确编码了算法。
public static boolean isPrime(long num)
{
if(num % 2 == 0)
return false;
else
{
double d;
int r=0;
while((num-1) % Math.pow(2,r+1) == 0)
r++;
d = (num-1) % Math.pow(2,r);
int[] a = {2,3,5,7,11,13,17,23,31,62,73,1662803};
boolean primality = true;
for(int k = 0; k < a.length; k++)
{
if((Math.pow(a[k],d)-1) % num != 0)
{
for(int s = 0; s < r-1; s++)
{
if((Math.pow(a[k],Math.pow(2,s)*d)+1) % num != 0)
primality = false;
}
}
}
return primality;
}