[大整數乘法]分治算法的時間復雜度研究


開篇


 

最近研究分治算法,對大整數算法(包括加減乘數)、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

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM