我正在尝试验证输入的 BigInteger 号码是否为 Prime号码!
但是,它适用于较小的数字,如 13,31 ,但在 15 的情况下会产生错误;通过将其声明为Prime。我无法弄清楚错误,可能隐藏在 squareroot()方法方法中,涉及二进制搜索!
请查看代码并帮我指出错误!!!
致电代码: -
boolean p=prime(BigInteger.valueOf(15));
System.out.println("P="+p);
来电代码: -
public static boolean prime(BigInteger bi2){
if(bi2.equals(BigInteger.valueOf(2)) || bi2.equals(BigInteger.valueOf(3)))
{
return true;
}
BigInteger bi,bin;
bin=squareroot(bi2);
for(bi=BigInteger.valueOf(2);bi.compareTo(bin)<=0;bi=bi.add(ONE)){
if(bi2.mod(bi).equals(ZERO))
return false;
else continue;
}
return true;
}
public static BigInteger squareroot(BigInteger bi){
BigInteger low,high,mid=ZERO,two;
low=ONE;
high=bi;
two=BigInteger.valueOf(2);
while(low.compareTo(high)<0)
{
mid =(BigInteger)(low.add(high)).divide(two);
//System.out.println("Low-Mid-High="+low+" "+mid+" "+high);
if(mid.multiply(mid).compareTo(bi)==0)
return mid;
if(mid.multiply(mid).compareTo(bi)>0)
high = mid.subtract(ONE);
else if(mid.multiply(mid).compareTo(bi)<0)
low = mid.add(ONE);
}
return mid;
}
答案 0 :(得分:3)
您的问题是,您从[{1}}返回mid
而未将其重新评估为squareroot
。这导致它返回算法的前一次迭代的中点;这几乎总是错的。
这样做的结果是你有时会错过一些主要因素。在15的情况下,因为(low + high) / 2
返回2,所以你错过了3作为主要因素。在13和31的情况下,没有错过的主要因素,所以你得到了正确的结果。