系数表示法与点值表示法
一个N次多项式有N+1个系数, 它们可以唯一确定这个多项式; 此外可以取N+1个点, 计算多项式在这些点的值; 这样N+1个不同的键值对也可以唯一确定一个N次的多项式
在计算多项式乘法时, 系数表示法需要O(n2)的时间复杂度, 而点值表示法只需要O(n)的复杂度. 这是因为两个多项式乘积在一点的值等于它们俩在这点值的乘积
如果能有很快的方法在系数表示法与点值表示法之间转换, 将能极大地加速多项式乘法
单位根与FFT
首先将系数表达式转化为点值不能朴素地计算, 这是因为计算一个点值需要N次乘法, 这样复杂度仍然是O(n2), 没有意义. 不过若是取单位根
xk=e2kπ/N
它的任意次方都可以以常数复杂度求出, 而不用进行乘法
xkm=e2mkπ/N
如果有多项式
f(x)=a0+a1x+⋯+aNxN=n=0∑N−1akxn
那么
f(xk)=n=0∑N−1akei2πnk/N
这个形式容易让人想起一位故人, 因而不妨取单位根是负指数,那么不妨再直接一点
f(xk)=n=0∑N−1ake−i2πnk/N=DFT{a}[k]
因而
而FFT的复杂度是O(nlogn), 这就实现了加速
自然, 将点值表示还原回系数表示, 也只需要进行傅里叶逆变换
ak=IDFT{x}[k]
进行傅里叶逆变换也可以由FFT以O(nlogn)的复杂度完成