Karatsuba与大数相乘

本文介绍了Karatsuba乘法算法,一种比暴力算法更高效的分治策略,用于大数相乘。通过二分法将乘法问题分解,减少乘法操作,从而降低时间复杂度到Θ(nlog23)。此外,还探讨了基于Karatsuba的三分法,进一步优化算法,时间复杂度达到O(nlog35)。
摘要由CSDN通过智能技术生成

暴力算法

	  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)A1B1A0B0)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,省去一个乘法。

注:

  1. 计算机在完成 A 1 B 1 , A 0 B 0 A{_1}B{_1}, A{_0}B{_0} A1B1,A0B0的计算后,可以存储在内存中等待直接调用
  2. 计算机本质都是以二进制进行存储,所以基于这种方式拆分数字是很效的

时间复杂度: Θ ( 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 +

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值