我正在查看primes上的维基百科页面,当然,我遇到了最大的已知素数2^43,112,609 − 1
。这个数字特别大。所以为了好玩,我决定把它放到BigInteger
。为了计算这个,需要很长时间(我放弃了一段时间)。
计算这么大的数字有没有更快的速度?或者BigInteger
和更好的计算机是唯一的方法吗?任何减少的时间都会很棒。
*请注意,我的问题与查找素数无关。我问是否有更好的方法来计算数字2^43,112,609 − 1
。
答案 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包装器的链接。我没有用它,但我听到了一些积极的事情,所以值得尝试一下:
答案 2 :(得分:0)
BigInteger
有pow
方法,这可能是处理大数字的最佳方法。查看Javadoc了解更多信息。
另外,正如@prusswan提出的链接问题所解释的那样,其中许多答案也显示了有助于的Primegen算法。