用 Karatsuba 算法计算多项式乘法
给定两个多项式
A(x)B(x)=k=0∑n−1akxk=a0+a1x+a2x2+⋯+anxn−1,=k=0∑m−1akxk=b0+b1x+b2x2+⋯+bmxm−1,
不妨假设 n⩾m 。如果 n<m 就交换 A(x) 和 B(x) 。
将 A(x) 分成两部分:
A(x)=Al(x)+x⌊n/2⌋Ah(x)
同样地,将 B(x) 分成两部分:
B(x)=Bl(x)+x⌊n/2⌋Bh(x)
计算以下 3 个乘积:
z0(x)z1(x)z2(x)=Al(x)Bl(x),=(Al(x)+Ah(x))(Bl(x)+Bh(x)),=Ah(x)Bh(x).
最后的乘积为:
A(x)B(x)=z0(x)+(z1(x)−z0(x)−z2(x))x⌊n/2⌋+z2(x)x2⋅⌊n/2⌋.
所以我们可以将一个规模为 n 的问题分解为三个规模为 n/2 的问题,在 Θ(n) 的时间里分解、合并,因此该算法的运行时间为
T(n)=3T(n/2)+Θ(n)=Θ(nlog23).
注意,这个算法很慢(和 FFT 相比),不加任何优化的情况下无法通过后十组测试数据。相比之下, O(nm) 的暴力算法虽然时间复杂度更高,但它的实际运行时间具有较小的常数因子,在 n 和 m 比较小的时候表现非常优秀。你能否据此设计出一种 Karatsuba 的优化?