【问题标题】:Determining if a BigInteger is Prime in Java在 Java 中确定 BigInteger 是否为素数
【发布时间】:2025-11-25 10:00:02
【问题描述】:

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

但是,对于像 13,31 这样的较小数字,它运行良好,但在 15 的情况下会产生错误;通过将其声明为 Prime。我无法找出错误,可能它隐藏在涉及 binary-searchsquareroot() 方法 方法中!

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

调用代码:-

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;
}

【问题讨论】:

  • 我认为这里的部分挑战是从头开始实现所有方法?因此平方根实现?
  • 我强烈建议使用调试器逐步完成此操作。相信你会在几秒钟内找到问题。
  • 15(和大多数数字)的平方根不是整数,因此您的平方根函数将无法找到正确的答案。例如,对于 15,它返回 2 的平方根。
  • 不,@shekhar,尝试通过您的 squareroot 函数运行 15。无论您相信谁,它都会返回 2。
  • 你不觉得反驳正确指出你错误的两个人有点粗鲁吗?

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


【解决方案1】:

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

这样做的结果是您有时会错过一些主要因素。在 15 的情况下,因为 squareroot 返回 2,所以您错过了将 3 作为主要因素。在 13 和 31 的情况下,您不会错过任何主要因素,因此您会得到正确的结果。

【讨论】:

  • 按照你的说法,我必须尝试什么???我知道用这种方式计算平方根的二进制搜索方法已经足够好了!!!请详细说明一下。
  • 我的回答解释了你必须做什么。
  • 这样好吗:-return low.add(high).divide(two);
  • @shekhar 你为什么不试试看?
  • 为什么这种方式是错误的(不正确/为什么这很好?意思是,通常我看到人们以这种方式编写二进制搜索(),这不是为了我的目的吗?请详细说明,我有点困惑,只是因为最后一步更正!