![750847c4beddb980891a9aa3be500c34.png](https://img-blog.csdnimg.cn/img_convert/750847c4beddb980891a9aa3be500c34.png)
为了方便讲解,会穿插代码到文案之中,但这样会让文章变得很冗长,同时也很详细。
不用担心复制代码测试很麻烦,文末附有所有完整整洁的代码,可直接查看
网上的karatsuba 算法几乎都是关于两个数相乘的算法,本文里的karatsuba算法是两个多项式相乘的算法。
Problem Statement
给定两个多项式,函数输出多项式相乘的结果。
![93158059b8e51c92357d90a0627d967f.png](https://img-blog.csdnimg.cn/img_convert/93158059b8e51c92357d90a0627d967f.png)
input:
Two n-1 degree polynomials
output:
The product polynomial
where
![22250128e1552541d7e337eb30f47418.png](https://img-blog.csdnimg.cn/img_convert/22250128e1552541d7e337eb30f47418.png)
Naive Solution
Pseudo code
MultPoly(A, B, n):
C = [0]*(2n-1) #设定好最终数组的长度为2n-1
for i in range(n):
for j in range(n):
C[i+j] += A[i]*B[j]
return C
教案里的方法是将两个数组元素分别两两相乘,存到一个二维数组里,然后将二位数组里的数按顺序累加到一维数组中。这种方法不太简洁。其实只要把握i+j的与相应的项的对应关系进行累加就行。
两个循环嵌套,复杂度是
我们当然不能满足
Naive Divide and Conquer Solution
分治法的精髓在于,将问题拆分成同样性质的子问题,然后逐个击破,最后合并。
那么,两个多项式相乘如何拆分成子问题呢?
似乎不太好拆,那么两个多项式是否可拆呢?如果拆,就要拆成两半。
同样的,
如此一来
可以看到,高阶的项参数都被
剩下的