Java BigInteger nextProbablePrime方法是如何工作的?

Java BigInteger nextProbablePrime方法是如何工作的?,java,biginteger,Java,Biginteger,我正在使用JavaBigInteger类,对nextProbablePrime方法背后的算法很好奇。我知道一些有效的素性测试算法,比如Miller-Rabin,但不确定这里实现了哪种算法 尝试以下代码很长时间,但仍然没有响应 BigInteger number = BigInteger.ZERO; number = number.setBit(82589933); number = number.nextProbablePrime(); 我已经经历了很多次了。它在内部为该方法使用了。为什么您的

我正在使用Java
BigInteger
类,对
nextProbablePrime
方法背后的算法很好奇。我知道一些有效的素性测试算法,比如
Miller-Rabin
,但不确定这里实现了哪种算法

尝试以下代码很长时间,但仍然没有响应

BigInteger number = BigInteger.ZERO;
number = number.setBit(82589933);
number = number.nextProbablePrime();

我已经经历了很多次了。它在内部为该方法使用了。

为什么您的示例在不返回的情况下运行:

你的数字是8200万比特长,并且(通过质数th'm)这样的质数相隔8200万个/logêe(2)个数字。所以你要求米勒·拉宾测试大约1500万个ish候选者,其中每个候选者涉及8200万位,每个检查都是非常重要的。所以,是的,即使像米勒·拉宾这样高效的算法也需要一段时间来处理如此令人难以置信的大输入


(我记得有一次运行时,将一个数字提升到另一个数字,花费的时间太长,并向语言开发人员抱怨,他们应该使用重复的平方运算来加快求幂速度……然后我后退一步,意识到我的测试数字也有数百万位。)

你读过代码了吗?Java是开源的。如何获取代码?@ManojBanik大多数IDE都有查看源代码的选项。你也可以在谷歌上找到答案。我在这里也找到了答案:当测试失败时,增量如何?它是线性的吗?在检查bitLength()>6之后,它被写为线性方法,因此数字是复合循环继续。如果bitLength()小于4,则它是素数,否则它将使用Miller-Rabin算法进行检查
code
*n-1=m*(Math.pow(a,k))*T=Math.pow(a,m)mod n*对于p=1到k-1,T=Math.pow(T,2)mod n如果答案不是-1或1,那么T-n如果最终答案是-1,那么为
code
的复合端素数增加1,正如我发现的代码:“biginger result=this.add(ONE);”,当我从一个奇数开始,然后递增2,我可以改进这部分。不幸的是,这个答案是不完整的。从源代码中可以看出,如果素数的大小大于等于100位,则它同时使用Miller-Rabin和Lucas-Lehmer测试。