在上一篇文章「使用快速傅立葉變換計算大整數乘法」中,我們詳細探討了利用快速傅立葉變換(FFT)實現大整數乘法的原理。本文將進一步展示如何應用該原理,構建一個功能完整的靜態類 BigArithmetic,提供任意精度的算術運算能力,包括加減乘除、平方根、倒數等核心運算。
BigArithmetic 採用以 100 為基數(Base = 100)的位元組陣列來表示大整數,陣列首元素存放最高有效位。這種設計在儲存效率與運算便利性之間取得了平衡。所有運算均直接對位元組陣列進行,避免了中間格式轉換的開銷。
類別的第一個核心方法是 ComplexFFT,實現了複數的快速傅立葉變換。由於 C# 內建不支援複數型別,採用實數陣列交替存放實部與虛部的方式。演算法基於 Danielson-Lanczos 引理,將長度為 N 的 DFT 分解為兩個長度為 N/2 的 DFT,透過位序顛倒重排與 log₂N 層疊代完成。為提升效率,三角函數遞歸計算僅在外層迴圈呼叫,內層透過遞歸關係更新旋轉因子。
針對實數輸入序列,RealFFT 將 N 個實數點打包為 N/2 個複數點,呼叫 ComplexFFT 後再分離重組,將儲存與運算量均減半。此法廣泛應用於訊號處理與大整數乘法的卷積運算中。
類別提供了完整的基礎運算組件:
Compare 逐位比較兩陣列大小。Negative 計算陣列的補碼,支援減法實現。Add、Subtract 採用逐位進位/借位邏輯,另提供 Add(byte[] sum, byte[] augend, int n, byte addend) 針對單位元加法優化。Divide 實現大整數除以單位元,採用長除法逐位試商。Multiply 是本類別的亮點。將兩個大整數轉換為實數陣列,經 RealFFT 變換至頻域,對應頻率分量相乘(複數乘法),再經逆變換回時域得到卷積結果,最後統一處理進位。此法時間複雜度為 O(N log N),遠優於傳統 O(N²) 逐位相乘,適用於超大整數運算。
DivRem 採用「倒數乘法」策略:先以牛頓迭代法 Uᵢ₊₁ = Uᵢ(2 - V·Uᵢ) 求除數倒數(二次收斂),再乘以被除數得商。Inverse 獨立提供倒數運算,同樣基於牛頓迭代。迭代終止條件為近似值收斂至 1,即 V·U ≈ 1。
Sqrt 同樣採用牛頓迭代,公式為 Uᵢ₊₁ = Uᵢ(3 - V·Uᵢ²)/2,使 U 二次收斂於 1/√V,最後乘以 V 得平方根。InitialValue 利用雙精度浮點數提供初始近似值,保證迭代快速收斂。
FFT 採用雙精度浮點運算,尾數 53 位。為避免捨入誤差導致整數部分無法辨識,需滿足:
2·log₂B + log₂N + 3·log₂log₂N < 53
其中 B 為基數,N 為變換長度。本類別選 B=100,可支援約 2×10⁸ 位十進制數字。基數越小精度越高但速度越慢,100 是經驗折中值。
BigArithmetic 完整實現了任意精度整數的四則運算、平方根與倒數,核心乘法採用 FFT 達到準線性複雜度,除法與平方根利用牛頓迭代實現二次收斂。下一步將以此為基礎重構 Skyiv.Numeric.BigInteger,提供更友善的高階介面。