更快的计算大数java的方法

时间:2011-12-08 03:10:46

标签: java performance primes biginteger

我正在查看primes上的维基百科页面,当然,我遇到了最大的已知素数2^43,112,609 − 1。这个数字特别大。所以为了好玩,我决定把它放到BigInteger。为了计算这个,需要很长时间(我放弃了一段时间)。

计算这么大的数字有没有更快的速度?或者BigInteger和更好的计算机是唯一的方法吗?任何减少的时间都会很棒。

*请注意,我的问题与查找素数无关。我问是否有更好的方法来计算数字2^43,112,609 − 1

3 个答案:

答案 0 :(得分:2)

BigInteger的问题在于它不适用于如此大的数字。上次我检查时,它仍然使用 二次运行时算法 进行乘法和基本转换。

因此计算2^43,112,609 − 1花费这么长时间的原因是它只是巨大的 - 你试图通过二次运行时算法来实现它。

不幸的是,如果你想要更快的东西,你需要使用更好的bignum库。在C / C ++中,您有GMP。如果你在谷歌周围有它的Java包装。


*请注意,计算2^43,112,609 − 1本身很快,因为你可以只用一个班次。慢速部分在基数10中作为字符串打印出来.Java仍然使用O(n^2)算法进行此转换。

高效的程序将能够在大约O(n * log(n)^2)时间内进行此转换 - 在今天的大多数最新机器上使用最新版本的GMP将会在一分钟内完成。

答案 1 :(得分:1)

如上所述Mysticial,BigInteger并不是真正想要处理如此庞大的数字。这是一个GMP Java包装器的链接。我没有用它,但我听到了一些积极的事情,所以值得尝试一下:

Java wrapper for GMP

答案 2 :(得分:0)

BigIntegerpow方法,这可能是处理大数字的最佳方法。查看Javadoc了解更多信息。

另外,正如@prusswan提出的链接问题所解释的那样,其中许多答案也显示了有助于的Primegen算法。