我正在尝试实现一种方法,该方法检查任何整数,如果使用Fermat的素数测试是素数,则返回true。
我根据输入是否小于40来划分问题。如果输入小于40,则对每个整数应用测试,直到n-1。否则,如果整数大于40,则对直到40的每个整数应用测试。但是,对于某些素数,测试将失败。
public static boolean isPrime (double n){
int counter=0;
boolean isPrime=false;
if(n<40) {
for (int a = 2; a < n - 1; a++) {
if (Math.pow(a, n - 1) % n == 1) counter++;
}
if (counter == n - 3) isPrime = true;
}
else {
for (int a = 2; a <= 40; a++) {
if (Math.pow(a, n - 1) % n == 1) counter++;
}
if (counter == 39) isPrime = true;
}
return isPrime;
}
这是逻辑问题还是其他问题?
答案 0 :(得分:2)
Math.pow适用于双打,其结果仅为近似值。另一方面,Modulo适用于范围最大超过20亿的整数,您的战利品产生的数字是否一定比这个数字大? (17 ^ 18似乎是19的肯定下注...)
那么如何解决这个问题: 您可以使用乘法和对整数取模来实现自己的pow(a,b,n)(幂模n)。那应该正常工作。使用一系列乘法,将a乘以b,然后将%n应用于中间结果...