首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

BigArithmetic:基於快速傅立葉變換的任意精度算術運算靜態類實現

     編輯:關於C語言

前言

在上一篇文章「使用快速傅立葉變換計算大整數乘法」中,我們詳細探討了利用快速傅立葉變換(FFT)實現大整數乘法的原理。本文將進一步展示如何應用該原理,構建一個功能完整的靜態類 BigArithmetic,提供任意精度的算術運算能力,包括加減乘除、平方根、倒數等核心運算。

核心設計理念

BigArithmetic 採用以 100 為基數(Base = 100)的位元組陣列來表示大整數,陣列首元素存放最高有效位。這種設計在儲存效率與運算便利性之間取得了平衡。所有運算均直接對位元組陣列進行,避免了中間格式轉換的開銷。

快速傅立葉變換實現

ComplexFFT:複數 FFT 核心

類別的第一個核心方法是 ComplexFFT,實現了複數的快速傅立葉變換。由於 C# 內建不支援複數型別,採用實數陣列交替存放實部與虛部的方式。演算法基於 Danielson-Lanczos 引理,將長度為 N 的 DFT 分解為兩個長度為 N/2 的 DFT,透過位序顛倒重排與 log₂N 層疊代完成。為提升效率,三角函數遞歸計算僅在外層迴圈呼叫,內層透過遞歸關係更新旋轉因子。

RealFFT:實數 FFT 優化

針對實數輸入序列,RealFFT 將 N 個實數點打包為 N/2 個複數點,呼叫 ComplexFFT 後再分離重組,將儲存與運算量均減半。此法廣泛應用於訊號處理與大整數乘法的卷積運算中。

基礎算術運算

類別提供了完整的基礎運算組件:

  • 比較:Compare 逐位比較兩陣列大小。
  • 補碼:Negative 計算陣列的補碼,支援減法實現。
  • 加減法:Add、Subtract 採用逐位進位/借位邏輯,另提供 Add(byte[] sum, byte[] augend, int n, byte addend) 針對單位元加法優化。
  • 捷除法:Divide 實現大整數除以單位元,採用長除法逐位試商。

核心運算:乘法與除法

FFT 乘法

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,提供更友善的高階介面。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved