介绍原理
karatsuba 算法要求乘数与被乘数要满足以下几个条件,第一,乘数与被乘数的位数相同;第二,乘数与被乘数的位数应为 2 次幂,即为 2 ^ 2, 2 ^ 3, 2 ^ 4, 2 ^ n 等数值。
ratsuba算法,乘法规模就下降一半。所以,对于两个n= 2^K位数乘法运算,我们需要计算3^k次乘法运算。而K=logn(底数为2),3^K=3^logn=2 ^(log3*logn)=2^(lo
下面我们先来看几个简单的例子,并以此来了解 karatsuba 算法的使用方法。
t = int(n1_pad[:mid_len]) q: int = int(n1_pad[mid_len:]) r: int = int(n2_pad[:mid_len]) s:
两位数相乘
我们设被乘数 A = 85,乘数 B = 41。下面来看我们的操作步骤:
的情况下的时间复杂度为W(n),则可以列出递推方程式。W(n)=W(n-1)+n-1,W(1)=0很容易求出上述的W(n)=n(n-1)/21.2二分归并排序时间复杂度求解设二分归并排序的最坏情况下时
将 A, B 一分为二,令 p = A 的前半部分 = 8,q = A 的后半部分 = 5 , r = B 的前半部分 = 4 ,s = B 的后半部分 = 1,n = 2。通过简单的数学运算:
w)*10+w。换成数值求解的过程如下:A*B=85*41=(8*10+5)*(4*10+1)=8*4*10*10+(8*1+5*4)*10+5*1。其中u=8*4=32,v=(8-5)(1-4)=-
A * B = pq * rs= (p * 10 + q) * (r * 10 + s) =p * r * 10 ^ 2 + (p * s + q * r ) * 10 + q * s。
间复杂度。比如两个N位数相乘,我们需要将每一位按规则相乘,所以需要计算 N*N次乘法。而使用 Karatsuba算法每层需要计算三次乘法,两次加法,以及若干次加法,每使用一次karatsuba算法,乘
令 u = p * r,v =(p - q) * (s - r),w = q * s。所以 A * B = u * 10 ^ 2 + (u + v +