2011-12-08 20 views
3

我正在查看primes上的維基百科頁面,當然,我遇到了最大的已知素數2^43,112,609 − 1。這個數字非常大。所以爲了好玩,我決定把這個放入BigInteger。要計算這一點,這將需要很長時間(我放棄了一段時間後)。更快的計算大數字的方法java

有沒有更快的計算這樣一個非常大的數字?或者是BigInteger和更好的電腦唯一的辦法?任何時間的減少都會很大。

*請注意,我的問題與查找素數無關。我在問是否有更好的方法來計算數字2^43,112,609 − 1

+0

怎麼樣使用對數表?所以像'Math.exp(n * Math.log(2))-1'。這應該會更快。 – aishwarya

+0

請提供例子,我不知道對數表,但我會「谷歌它」。 –

+0

剛剛編輯我的評論 – aishwarya

回答

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將會在一分鐘內完成。

+0

非常感謝!正是我在找什麼。 –

0

BigInteger有一個pow方法,這可能是最好的處理大數字。查看Javadoc瞭解更多信息。

此外,正如鏈接問題@prusswan提出的,許多答案也顯示了primegen算法,這將有所幫助。

+0

實際上,在OP的情況下,使用'shiftLeft'會比'pow'更有效率,因爲它是'2' – st0le

1

正如上面Mysticial所指出的,BigInteger並不是真正意義上的處理這麼大的數字。這是一個指向GMP Java包裝的鏈接。我沒有用它,但我聽說了一些積極的東西,所以它可能是值得給它一試:

Java wrapper for GMP

相關問題