首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定BigInteger在Java中是否为素数

确定BigInteger在Java中是否为素数
EN

Stack Overflow用户
提问于 2014-05-27 06:53:38
回答 1查看 374关注 0票数 0

我正在尝试验证输入的BigInteger数字是否为素数

但是,对于13,31这样的较小的数字,它运行得很好,但是在15的情况下,它会产生错误,方法是将它声明为。我无法找出这个错误,可能它隐藏在涉及binary-search!的squareroot()方法方法中。

请查看代码,并帮助我指出错误!

调用代码:-

代码语言:javascript
复制
boolean p=prime(BigInteger.valueOf(15));
    System.out.println("P="+p);

调用代码:-

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-27 07:04:00

您的问题是,您从squareroot返回squareroot,而不将其重新评估为(low + high) / 2。这导致它返回算法上一次迭代的中点;这几乎总是错误的。

这样做的效果是,你有时会错过一些主要因素。在15的情况下,因为squareroot返回2,所以忽略了查找3作为一个主要因素。在13和31的情况下,没有主要的因素让你错过,所以你得到了正确的结果。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23882873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档