确定Java中的BigInteger是否为Prime

时间:2014-05-27 06:53:38

标签: java primes biginteger binary-search square-root

我正在尝试验证输入的 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;
}

1 个答案:

答案 0 :(得分:3)

您的问题是,您从[{1}}返回mid而未将其重新评估为squareroot。这导致它返回算法的前一次迭代的中点;这几乎总是错的。

这样做的结果是你有时会错过一些主要因素。在15的情况下,因为(low + high) / 2返回2,所以你错过了3作为主要因素。在13和31的情况下,没有错过的主要因素,所以你得到了正确的结果。