[英]Is there a more efficient way to work with large numbers than using Java's BigInteger class?
我注意到,當使用Java的BigInteger類時,即使使用相同的數字和運算,基本算術運算的效率似乎也要比原始運算低。 與使用相同數字的長表示形式的完全相同的算法相比,使用數字的BI表示形式的算法需要大量的時間來運行。
為了說明我的意思,我提供了一個工作代碼示例。 在下面的示例中,我簡單地迭代了1到1000000000之間的所有整數,對每次迭代執行mod 2操作,然后打印出循環的總運行時間。 我首先使用long,然后使用BigInteger:
import java.math.BigInteger;
public class FunWithNumbers {
public static void main(String[] args) {
long myNumL = 100000000L; // Long representation of some number n
BigInteger myNumB = new BigInteger("100000000"); // BI representation of same number
/* long version */
long startTime = System.nanoTime();
for (long i=1L; i<= myNumL; i++) {
long a = myNumL % 2;
}
System.out.println("Total computation time (long representation): " +
(System.nanoTime() - startTime)*Math.pow(10, -9) + " seconds.");
/* BI version */
startTime = System.nanoTime();
BigInteger index = new BigInteger("1");
while (!index.equals(myNumB)) {
BigInteger b = myNumB.remainder(index);
index = index.add(BigInteger.ONE);
}
System.out.println("Total computation time (BI representation): " +
(System.nanoTime() - startTime)*Math.pow(10, -9) + " seconds.");
}
}
這將產生以下輸出:
總計算時間(長表示):0.035671096秒。
總計算時間(BI表示):7.031978092秒。
如您所見,運行時間甚至無法遠程比較。 我的問題是我需要處理太大而無法容納“長”數據類型的數字。
有沒有辦法恢復原始算術的效率,並且仍然能夠處理超過long的最大大小的任意大數字?
如果需要的話,我可以切換到另一種語言。 我絕不局限於Java。
我建議您嘗試使用C或C ++。 有各種C / C ++庫可以有效地執行較大的整數運算。 例如,我遇到了一個看起來很有前途的“ ttmath ”。
BigInteger
效率問題的很大一部分是它使用不可變的對象對數字進行建模。 因此,每個大的算術運算都會導致創建一個新的BigInteger
。
有沒有辦法恢復原始算術的效率,並且仍然能夠處理超過long的最大大小的任意大數字?
否 。如果是Java。
如果您不需要確切的答案,請考慮加倍。 它具有范圍廣泛且運算速度非常快的特性,但僅代表53個有效位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.