開篇
最近研究分治算法,對大整數算法(包括加減乘數)、strassen矩陣乘法、合並排序的優化、線性時間選擇和最接近點對問題學習了一下。
這篇文章主要是關於大整數乘法算法復雜度的研究。
本人菜鳥,本科就讀北京一工科院校土建專業,現就讀北京一所二流985的計算機研究生。
希望在這里分享和學習,如有錯誤還請多多指點!
正文
一,引入問題
在某些情況下,我們需要計算很大的整數,它無法在計算機硬件能直接表示的整數范圍內進行處理,如果用浮點數則會有精度問題,這就必須用軟件的方法來實現大整數的算術運算。
二,大整數乘法的分治解決方案
2.1原始低效算法
我們將n位(為方便討論簡化問題,我們假設n是2的冪)十進制整數(二進制也可以)X、Y都分為2段,每段的長度是n/2位。
如果現在直接用遞歸或分治進行編程,其算法復雜度為:
其中:T(n)代表規模為n的問題,系數4表示問題縮小到T(n/2)時,包含四次乘法(上式中AC/AD/BC/BD四次)
這是在沒有進行優化情況下的算法復雜度(注意,此處雖然用了分治思想,但分治並不會降低算法復雜度,反而因其需要使用棧,增加了算法的空間復雜度)。
2.2如何進行優化降低復雜度?
我們知道,大整數乘法的基本運算是“乘法”運算,我們可以通過減少乘法的次數來降低算法復雜度!
從公式中可以發現,原來有四個基本乘積項:AC、AD、BC、BD,現在只有三個基本乘積項:(A-B)(C-D)、AC、BD。乘法運算的數量降低了,下面看看其復雜度變化:
復雜度從n2降到n1.59
三,時間復雜度還能優化嗎?
3.1上面討論中,我們將大整數X、Y都分為2段,每段的長度是n/2位,那分成3段4段會如何?
3.1.1大整數分3段:
3.2.2大整數分4段:
3.2.3大整數分n段:
結論:
在大整數乘法中,當把大整數分為2段時,算法時間復雜度最低n1.59
隨着段數逐漸增加,算法的時間復雜度也隨之增加,當分段增加到n段時,算法時間復雜度退化到n2
3.2算法復雜度還能降低嗎?
用快速傅里葉變換只需要O(N*logN)的時間復雜度!(該部分后續添加)
四,編程思想
本人用java實現了大整數乘法的計算,代碼部分會另起一篇,以下是連接:
http://www.cnblogs.com/McQueen1987/p/3401979.html