Karatsuba算法-大数相乘
暴力算法
X X X X
X X X X
---------
X X X X \
X X X X \ O(n^2) 次相乘 + O(n^2)次相加
X X X X / = O(n^2)
X X X X /
--------------
X X X X X X X
时间复杂度: O ( n 2 ) O(n^{2}) O(n2)
Karatsuba乘法(二分法)
基于Divide-and-conquer,将一个大小为 n n n 的问题分解(divide)成 a a a个大小为 n a {\frac{n}{a}} an小问题,再对每一个小问题进行处理。
对输入的两个数 A , B A, B A,B,分为两段:
A = A 1 2 n 2 + A 0 B = B 1 2 n 2 + B 0 A B = A 1 B 1 2 n + ( A 1 B 0 + A 0 B 1 ) 2 n 2 + A 0 B 0 A B = A 1 B 1 2 n + ( ( A 1 + A 0 ) ( B 0 + B 1 ) − A 1 B 1 − A 0 B 0 ) 2 n 2 + A 0 B 0 \begin{aligned} &A = A{_1}2^{\frac{n}{2}} + A{_0} \\ &B = B{_1}2^{\frac{n}{2}} + B{_0} \\ &AB = A{_1}B{_1}2^{n} + (A{_1}B{_0}+A{_0}B{_1})2^{\frac{n}{2}}+A{_0}B{_0} \\ &AB = A{_1}B{_1}2^{n} + ((A{_1}+A{_0})(B{_0}+B{_1})-A{_1}B{_1}-A{_0}B{_0})2^{\frac{n}{2}}+A{_0}B{_0} \end{aligned} A=A122n+A0B=B122n+B0AB=A1B12n+(A1B0+A0B1)22n+A0B0AB=A1B12n+((A1+A0)(B0+B1)−A1B1−A0B0)22n+A0B0
现在只有3个乘法: ( A 1 + A 0 ) ( B 0 + B 1 ) , A 1 B 1 , A 0 B 0 (A{_1}+A{_0})(B{_0}+B{_1}), A{_1}B{_1}, A{_0}B{_0} (A1+A0)(B0+B1),A1B1,A0B0,省去一个乘法。
注:
- 计算机在完成 A 1 B 1 , A 0 B 0 A{_1}B{_1}, A{_0}B{_0} A1B1,A0B0的计算后,可以存储在内存中等待直接调用
- 计算机本质都是以二进制进行存储,所以基于这种方式拆分数字是很效的
时间复杂度: Θ ( n l o g 2 3 ) \Theta(n^{log^{3}_{2}}) Θ(nlog23)
设两个长度为 n n n 的数字相乘所需的时间为 T ( n ) T(n) T(n),分解为2段大小为 n 2 {\frac{n}{2}} 2n ,需要进行 3 次长度为 n 2 {\frac{n}{2}} 2n 的数字相乘 T ( n ) = 3 T ( n 2 ) T(n)=3T({\frac{n}{2}}) T(n)=3T(2n),每一项相乘所得结果进行相加,为线性关系,即 c n cn cn。
T ( n ) = 3 T ( n 2 ) + c n T(n)=3T({\frac{n}{2}})+cn T(n)=3T(2n)+cn
对 T ( n ) T(n) T(n)进行求解,基于master therom:
a = 3 ; b = 2 ; f ( n ) = c n ; n l o g a b = n l o g 2 3 a = 3; \qquad b=2; \qquad f(n) = cn; \qquad n^{log^{b}_{a}} =n^{log^{3}_{2}} a=3;b=2;f(n)=cn;nlogab=nlog23 f ( n ) = c n = c n l o g 2 3 − ε 0 < ε < 0.5 T ( n ) = Θ ( n l o g 2 3 ) ≤ Θ ( n 1.585 ) \begin{aligned} &f(n) = cn=cn^{log^{3}_{2}-\varepsilon} \\ &0 < \varepsilon < 0.5 \\ &T(n) = \Theta(n^{log^{3}_{2}}) \le \Theta(n^{1.585}) \end{aligned} f(n)=cn=cnlog23−ε0<ε<0.5T(n)=Θ(nlog23)≤Θ(n1.585)
对Karatsuba算法进行类推(三分法)
将数字进行3次分段
A = X X X . . . X X ⏟ k b i t s o f A 2 X X X . . . X X ⏟ k b i t s o f A 2 X X X . . . X X ⏟ k b i t s o f A 2 A = \underbrace{XXX...XX}_{k \, bits \, of A_{2}} \underbrace{XXX...XX}_{k \ bits \ of A_{2}} \underbrace{XXX...XX}_{k \ bits \ of A_{2}} \\ A=kbitsofA2
XXX...XXk bits ofA2
XXX...XXk bits ofA2
XXX...XX A = A 2 2 2 k + A 1 2 k + A 0 B = B 2 2 2 k + B 1 2 k + A 0 A B = A 2 B 2 2 4 k + ( A 2 B 1 +