電腦代數與符號計算

任意精度算術(arbitrary-precision arithmetic)

硬體整數住在一個固定大小的盒子裡——64 位元,可容納到約 920 京的數——超過就溢位。但數學沒有這種上限:100! 有 158 位數,而一把密碼學金鑰長達數百位。任意精度算術正是這樣的技巧:把一個數橫跨它所需的任意多個機器字來表示,使它能成長到數千、數百萬位,僅受記憶體所限,而對它的每個運算都是精確的。

其想法是換到更大進位制的小學算術。一個大數以一個「數字」陣列保存,每個數字其實是一整個機器字(所以進位制是 2^32 或 2^64,而非 10)。加法從一個字進位到下一個字,就像你在紙上從一欄進位到下一欄;用課本方法把兩個 n 字的數相乘要花 O(n^2) 次字乘法,而聰明的演算法(卡拉楚巴,再到以 FFT 為本的方法)能把巨大的數降到接近 O(n log n)。因為從不捨入,2^1000 被算到它精確的最後一位,巨大的階乘、精確的冪次與大行列式都完美算出。這是電腦代數系統底下的基石:每個精確整數,以及每個精確分數的分子與分母,都是一個大數。

任意精度在凡是精確不可妥協之處都至關重要:密碼學(RSA 把數百位長的數相乘)、數論,以及符號計算內部的精確整數與有理數算術。誠實的提醒是成本——大數遠慢於 64 位元加法所需的單一硬體指令,而且它們的大小(以及對它們做運算的時間)會隨著數本身成長。這是表達式膨脹的引擎之一:一個精確的計算可能正確卻爬得極慢,因為它的中間數字已悄悄膨脹到數千位。

100!(一百階乘)是 9332621544...0000000000,一個有二十四個尾隨零的 158 位整數,由大數函式庫精確算出。64 位元機器整數在 21!(約 5.1 * 10^19)就已溢位,無聲地繞回成一個錯誤、更小的數——這正是任意精度存在所要防止的失敗。

精確的 158 位階乘:受限於記憶體,而非固定的字長。

任意精度不等同於位數更多的浮點數。大數整數或分數是精確的;任意精度的浮點數仍會捨入,只是捨在你選定的更高精度上。精確性來自整數與有理數,而非多帶幾位小數。

又称
bignum arithmeticmultiple-precision arithmetic大數運算任意精度