将整个式子递归下去处理,每一层多项式次数规模减半,个数翻倍,总共最多 \log n 层,所以我们得到了一个 O(n\log n) 的卷积算法。
算法本质
那么这个算法实际上在做什么呢?我们注意到,在上述递归算法的边界情况,即次数为 1 时,我们计算出的结果是 F 和 G 模 (x-\omega) 的余数,满足 \omega^n=c。我们在算法的第一步取 c 等于 1,那么 n 个 \omega 值,其实就是 n 次单位根。更进一步地,F 和 G 模 (x-\omega) 的余数,其实就是它们在 \omega 处的点值。所以实际上,这个递归求余式的过程,实际上就是一个 DFT 的过程。
Cooley-Tukey 的合并:X_k=E_k+e^{-\frac{2\pi ik}{n}}O_k,X_{k+n/2}=E_k-e^{-\frac{2\pi i k}n}O_k。
新算法的合并:X_k=L_k+cR_k,X_{k+n/2}=L_k-cR_k。
它们看上去是两个类似的东西,但是新算法中的系数 c 在每一层递归都是一个相同的数,而 Cooley-Tukey 中的 e^{\frac{2\pi i k}{n}} 在每一层中对于不同的 k 仍然是不同的值。计算 e^{\frac{2\pi i k}{n}} 是 Cooley-Tukey 的瓶颈,所以将其优化成一个常数 k 使这个新算法有了很大的常数优化空间。
一些杂谈
这个已经很快的算法,仍然有一些常数优化,例如 n 的选择不一定需要固定是 2 的幂,和「虚部循环」等优化,感兴趣可以查看算法发明者原帖和帖子下的评论。