我试图看看大数是否是质数,长度为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。这是怎么发生的?另外,检查大数以确定它们是否是素数的更好方法是什么?
最佳答案
这个奇怪的值是溢出的结果。 BigInteger
实例保存的数字大于 2^31-1 (Integer.MAX_VALUE
),因此不能用 int
表示>。对于 primcheck:BigInteger
提供 isProbablePrime(int)
还有其他几种快速(或多或少)的算法可以检查一个数字是否是具有给定失败率的素数。如果您希望获得 100% 的确定性,可以通过将要检查的数字上限减少到 sqrt(input)
并将步长增加 2 来优化代码。或者,如果该算法被多次使用,则生成一个 prim-table。
关于java - 检查大 int 值是否为质数,Java 中的 BigInteger 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31892936/