前置知识
FFT(Fast Fourier Transformation),中文名快速傅里叶变换,用来加速多项式乘法
什么是多项式?
多项式是指如以下形式的式子:
系数表示法:
也就是平时用的方法
点值表示法:
把多项式放到平面直角坐标系里面,看成一个函数
-
朴素系数转点值的算法叫DFT(离散傅里叶变换),点值转系数叫IDFT(离散傅里叶逆变换)
-
为了实现多项式乘法并得到系数序列,我们可以考虑实现的方法,如果直接暴力(通过定义直接算系数)是O(n2)复杂度,肯定会超时,于是我们这样考虑
首先可以选取n+1个点,把两个多项式转化为点值表示法。
然后将两个点值表示法的多项式相乘(复杂度为O(n)),然后将新得到的多项式的点值表示法转化为系数表示法。
注意:假设最高有n次方,最高有m次方,所以*g(x)最高有次方,但是可能不是2的幂次方,如果不是,则需要选取点的数量应该是大于的2的幂次方个,假设这个值为1<<k,所以从系数表示法到点值表示法的转化过程中,我们要在和g(x)内选择1<<k的点,才能保证点值表示法的和之后,至少仍有个点,才能确定唯一一个 的多项式。所以在选取点的数量的时候,要保证点的个数能确定后的多项式。
如果任意的选取个点然后转化,复杂度还是太高,所以我们需要巧妙的选取个点,从而使得系数表示法与点值表示法之间转化的复杂度降为,这就是FFT算法。
我们也可以记忆化优化。
如何记忆化?
每次求f(x)记忆化。
那每次一定取得不一样啊
只要
如何?
- 取模(NTT)
- 复数(FFT)