我试着看看大数是否为素数,长度为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。这是怎么回事?还有什么更好的方法来检查大数字,看看它们是否是素数?
答案 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
。