1. 程式人生 > >分治法來解決大整數乘法問題

分治法來解決大整數乘法問題

設 x 和 y 都是 n 位的二進位制整數,現在要計算它們的乘積 xy ,顯然我們可以用一般的方法來計算。但是這樣計算步驟太多,效率低下。如果將每 2 個 1 位數的乘法或加法看作一步運算,那麼這種方法要作 O(n^2) 步運算才能求出乘積 xy 。那麼我們如何來設計一個更有效的方法來實現大整數乘法呢?我們可以把x、y分別分解為左、右兩半,每一半長度為 n/2,如:x = 10110110, 則 xl = 1011,xr = 0110。由此可得

   xy= (2^n * xl * yl) + 2^(n/2)(xl * yr + xr * yl) + (xr * yl)

此表示式的複雜性在於 4 個乘法運算。然而,我們還可以繼續推導,使它簡化為 3 次乘法運算,化簡後的式子如下:

         xy= (xl * yl)2^n +[(xl - xr)(yr - yl) + (xl * yl) + (xr * yr)]2^(n/2) + (xr * yr)   (1)

顯然,在(1)式中,只有三次乘法運算 (xl * yl)、(xl - xr)(yr - yl)、(xr * yr)。從而演算法複雜度就會從蠻力計算時的 n^2 降到(3/4)n^2