检查大的int值,如果它们是素数,Java中的BigInteger问题

时间:2015-08-08 12:04:53

标签: java

我试着看看大数是否为素数,长度为11的数字。这是我正在使用的代码:

private static boolean isPrime(BigInteger eval_number){

        for(int i=2;i < eval_number.intValue();i++) {
            if(eval_number.intValue() % i==0)
                return false;
        }
        return true;

    }

现在我在调试器中检查的数字是eval_number,它等于11235813213.但是,当我检查调试器中的eval_number.intValue()而不是值11235813213时,值为-1649088675。这是怎么回事?还有什么更好的方法来检查大数字,看看它们是否是素数?

6 个答案:

答案 0 :(得分:3)

奇怪的值是溢出的结果。 BigInteger实例持有的数字大于2 ^ 31-1(Integer.MAX_VALUE),因此无法用int表示。对于primcheck:BigInteger提供isProbablePrime(int),还有其他几种快速(或多或少)算法,可以检查数字是否是具有给定失败率的原始数字。如果您更愿意100%确定,则可以通过减少数字的上限来检查sqrt(input)并将步长增加2来优化代码。如果多次使用该算法,则生成一个prim-table。

答案 1 :(得分:2)

intValue()返回给定BigInteger数的等效整数。

由于您传递的值11235813213,远大于Integer.MAX_VALUE(int变量的最大可能值),即2147483647.因此,它导致整数溢出。

  

另外,检查大数字是否更好的方法是什么   他们是素数?

您应该只使用BigInteger数字来查找大质数。另外,请查看一年前我问过的this question (Determining if a BigInteger is Prime in Java)

答案 2 :(得分:2)

正如其他人所说,你检查的数字是int范围的一部分 你可以使用很长时间,但这只能延迟问题,它仍会在超出长度范围的数字上失败 解决方案是使用BigInteger算法:

system.time({for(i in 1:n){
  CJ(a,b)
}})

这只是对您的问题所涉及的中间问题的更正。还有一些事情需要改进。检查质量可以提高效率。您不必检查除2之外的偶数,您只需要检查相关数字的平方根。

答案 3 :(得分:1)

您将BigInteger转换为32位整数。如果大于2 ^ 31,则返回错误值。您需要对BigInteger实例执行所有操作。我假设你使用BigInteger因为长期不足以满足其他情况,但是你说的数字就是使用long而不是int。 (数字长达2 ^ 63就足够了。)

答案 4 :(得分:0)

您必须使用BigInteger进行所有操作,而不必将其转换为int

private static boolean isPrime(BigInteger eval_number) {
    for (BigInteger i = BigInteger.valueOf(2); i.compareTo(eval_number) < 0; i = i.add(BigInteger.ONE)) {
        if (eval_number.divideAndRemainder(i)[1].equals(BigInteger.ZERO)) {
            System.out.println(i);
            return false;
        }

    }
    return true;
} 

答案 5 :(得分:0)

如果你想检查BigInteger是否为Prime,你可以使用al.stream().forEach(System.out::println); 如果java.math.BigInteger.isProbablePrime(int certainty)可能是素数,它将返回true,如果肯定是复合则返回false。如果确定性为BigInteger,则会返回≤ 0