10
我想知道BigInt和其他類似的東西是如何實現的。我試圖查看JAVA源代碼,但它對我來說都是希臘語和拉丁語。 你能否用言語解釋我的算法 - 沒有代碼,以便我明白當我使用JAVA API中的某些東西時我實際使用的是什麼。 關於BigNums實現如何工作?
我想知道BigInt和其他類似的東西是如何實現的。我試圖查看JAVA源代碼,但它對我來說都是希臘語和拉丁語。 你能否用言語解釋我的算法 - 沒有代碼,以便我明白當我使用JAVA API中的某些東西時我實際使用的是什麼。 關於BigNums實現如何工作?
從概念上講,就像你手動任意大小算術一樣。你有類似於數組值的東西,以及用於數組上的各種操作的算法。如果你想添加100
到901
。你開始用兩個數字作爲數組:
[0, 1, 0, 0]
[0, 9, 0, 1]
當您添加,您除了算法從右邊開始,需要0+1
,給人1
,0+0
,給人0
,並且 - 現在棘手的問題 - 9+1
給10
,但現在我們需要進行,所以我們在下一列加1,並將(9+1)%10
放入第三列。
當你的數字變得足夠大 - 在這個例子中大於9999 - 那麼你必須以某種方式分配更多的空間。
當然,如果您將號碼存儲在反向的順序中,這當然會稍微簡化。
真正的實現使用完整的單詞,所以模數實際上是兩個大的冪,但概念是相同的。
Knuth上有很好的一節。
非常感謝:) – shahensha 2010-09-03 10:39:18
在Numerical Recipes中還有一個部分(它緊隨Knuth)。棘手的部分是獲得乘法權。學校算法不能很好地擴展,所以你使用技巧(例如FFT)。一旦你有乘法,你可以用它來表達很多事情。 – 2011-11-02 08:32:14