Mnożenie nn-bitowych liczb naturalnych

by Jerry Sky

2020-03-11



Algorytm mnożenia nn-bitowych liczb naturalnych xyx \cdot y

Możemy przedstawić liczby xx i yy jako ciągi binarne, które potem możemy podzielić na pół tak, że x=2n2xL+xRy=2n2yL+yR x = 2^{\frac{n}{2}} x_L + x_R \\ y = 2^{\frac{n}{2}} y_L + y_R

Przykładowo: x=(1011 0110)2x = (1011~0110)_2, wówczas xL=(1011)2x_L = (1011)_2, xR=(0110)2x_R = (0110)_2

Następnie zauważmy, że xy=2nxLyL+2n2(xLyR+xRyL)+xRyRx \cdot y = 2^n x_L y_L + 2^{\frac{n}{2}} \left( x_L y_R + x_R y_L \right) + x_R y_R.
Niestety algorytm typu Divide & Conquer wykorzystujący powyższy podział i połączenie pod-problemów nie ma lepszej złożoności obliczeniowej od standardowego mnożenia, czyli O(n2)O(n^2). Natomiast jeśli zauważymy, że xLyR=(xL+xR)(yL+yR)xLyLxRyRx_L y_R = (x_L + x_R)(y_L + y_R) - x_L y_L - x_R y_R wtedy dostajemy trzy n2\frac{n}{2}-bitowe (a nie cztery jak wcześniej) pod-problemy:
xLyLx_L y_L, xRyRx_R y_R, (xL+xR)(yL+yR)(x_L + x_R)(y_L + y_R) co skutkuje złożonością O(nlog23)O\big(n^{\log_2 3}\big), gdzie log231.59\log_2 3 \approx 1.59.

Złożoność obliczeniowa

Zamiast T(n)=4T(n2)+O(n) T(n) = \bold4 \cdot T\Big(\frac{n}{2}\Big) + O(n) mamy T(n)=3T(n2)+O(n) T(n) = \bold3 \cdot T\Big(\frac{n}{2}\Big) + O(n) co daje nam złożoność jedynie O(n1.59)O\big(n^{1.59}\big).

Całkowity czas spędzony na poziomie kk w drzewie rekursji wynosi 3kO(n2k)=(32)kO(n). 3^k \cdot O\Big(\frac{n}{2^k}\Big) = \Big(\frac{3}{2}\Big)^k \cdot O(n). ponieważ każdy pod-problem kk tworzy trzy pod-pod-problemy o rozmiarze n2k\frac{n}{2^k}.

Warto zauważyć, że O(3log2n)=O(nlog23)O\big(3^{\log_2n}\big) = O\big(n^{\log_23}\big), ponieważ 3log2n=(nlogn3)log2n=nlogn3  log2n=nlog2(nlogn3)=nlog23. 3^{\log_2 n} = \Big(n^{\log_n 3} \Big)^{\log_2 n} = n^{\log_n3~\cdot~\log_2n} = n^{\log_2(n^{\log_n3})} =\\ n^{\log_23}.

Pseudokod:

function multiply(x,yx,y):
input: x,yNx,y \in \natnums w kodzie binarnym o długości nn
output: multiply(x,yx,y)=xy= x \cdot y

Source: Algorithms: Dasgupta, Papadimitriou, Vazirani - paragraph 2.1