我正在查看primes上的維基百科頁面,當然,我遇到了最大的已知素數2^43,112,609 − 1
。這個數字非常大。所以爲了好玩,我決定把這個放入BigInteger
。要計算這一點,這將需要很長時間(我放棄了一段時間後)。更快的計算大數字的方法java
有沒有更快的計算這樣一個非常大的數字?或者是BigInteger
和更好的電腦唯一的辦法?任何時間的減少都會很大。
*請注意,我的問題與查找素數無關。我在問是否有更好的方法來計算數字2^43,112,609 − 1
。
我正在查看primes上的維基百科頁面,當然,我遇到了最大的已知素數2^43,112,609 − 1
。這個數字非常大。所以爲了好玩,我決定把這個放入BigInteger
。要計算這一點,這將需要很長時間(我放棄了一段時間後)。更快的計算大數字的方法java
有沒有更快的計算這樣一個非常大的數字?或者是BigInteger
和更好的電腦唯一的辦法?任何時間的減少都會很大。
*請注意,我的問題與查找素數無關。我在問是否有更好的方法來計算數字2^43,112,609 − 1
。
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將會在一分鐘內完成。
非常感謝!正是我在找什麼。 –
正如上面Mysticial所指出的,BigInteger並不是真正意義上的處理這麼大的數字。這是一個指向GMP Java包裝的鏈接。我沒有用它,但我聽說了一些積極的東西,所以它可能是值得給它一試:
怎麼樣使用對數表?所以像'Math.exp(n * Math.log(2))-1'。這應該會更快。 – aishwarya
請提供例子,我不知道對數表,但我會「谷歌它」。 –
剛剛編輯我的評論 – aishwarya