簡體   English   中英

是否有比使用Java的BigInteger類更有效的處理大量數字的方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM