FFT,快速傅里叶变换
描述问题
计算两个n阶多项式的加法,需要 Θ(n) 的时间。只需要将两式对应次数的系数相加即可。但是两个n阶多项式A、B相乘需要 Θ(n2) 的时间,因为我们需要将A式的每一个系数乘上B式中每一个系数,在找次数相同的系数进行合并。我们希望加速多项式相乘的过程。
多项式有两种表示法,系数表示法与点值表示法。系数表示法表示一个多项式A可以记为:
A(x)=∑i=0n−1aixj
点值法表示多项式B可以记为:
{
(x0,B(x0)),(x1,B(x1))...(xn−1,B(xn−1)) }
可以证明,一个包含n个点的点值表示法可以唯一确定一个n-1次多项式(最高项次数为n-1)。
点值表示法得优势在于:对于点值表示的多项式,相加相乘都很方便,我们只需要将同一x对应的y相乘,就得到新多项式的点值表示。注意,因为两个n次多项式的乘积是2n次,所以我们在选点时要选2n个点。这样乘起来才会得到2n个点。所以我们快速做多项式乘法的思路就是先将系数表示的多项式转化成点值表示,相乘,在转化回系数表示。
但是一般而言,对于系数表示法的多项式A,我们要求出2n个点,需要 Θ(n2) 的时间。因为我们求一个x对应的 A(x) 需要 Θ(n) 的时间, A(x0)=a0+x0(a1+x0(a2+...+x0(an−2+x0(an−1)))) 。但是如果我们选取2n次单位复数根,并利用单位复数根单位性质进行分治,就可以将复杂度降至 Θ(nlog