写在前面
我多项式实在是太菜了,所以必须写一篇博客来巩固一下。。。
多项式乘法与卷积
对于给定的两个多项式
\[
F(x),G(x)
\]
我们称
\[
S(x)=\sum_k\sum_{i+j==k}F(i)G(j)
\]
为\(F,G\)的卷积。不难证明,这就是多项式乘法,即
\[
F(x)G(x)=\sum_k\sum_{i+j==k}F(i)G(j)
\]
(简单地说,\(F,G\)的乘积中次数为\(k\)的项系数为
\[
\sum_{i+j==k}F(i)G(j)
\]
计算\(F,G\)的卷积显然有\(O(n^2)\)的朴素思路,但是对于较高的数据范围这样的时间复杂度是无法接受的。
多项式的点值表达
除了常见的系数表达以外,多项式还可以用点值表达来表示。
对于已知次数为\(n\)的多项式\(F(x)\),我们可以用
\[
X=\{(x_1,F(x_1)),(x_2,F(x_2),...,(x_{n+1},F(x_{n+1})))\}
\]
来唯一确定其系数表达式。证明可以由代数基本定理推出。
多项式的点值表达相对于系数表达有一个优点:在计算卷积时时间复杂度缩减为\(O(n)\)。更准确地说,有
\[
S(x)=\{(x_1x_2,F(x_1)G(x_2))...\}=F(x)G(x)
\]
但是将系数表达转换为点值表达的过程仍然是\(O(n^2)\)的,于是我们想到对这个过程进行优化。
FFT
快速傅里叶变换能够在\(O(nlogn)\)的时间内解决系数表达到点值表达的过程,是因为引入了单位根的概念。