第一次做FFT/NTT的题就是一题超难的…想看系数优化的可以跳2。
1. FFT/NTT简单原理:
总结来说:
- O ( N l o g N ) O(NlogN) O(NlogN)把多项式系数表示转换成点表示
- O ( N ) O(N) O(N)在点操作上做各种操作
- O ( N l o g N ) O(NlogN) O(NlogN)把点表示转换回系数表示
假设我们现在要做大整数相乘 ( a N . . . a 2 a 1 a 0 ‾ ) 10 ∗ ( b N . . . b 2 b 1 b 0 ‾ ) 10 (\overline{a_N...a_2 a_1 a_0})_{10} * (\overline{b_N...b_2 b_1 b_0})_{10} (aN...a2a1a0)10∗(bN...b2b1b0)10正常来说我们需要一位一位来乘,需要 O ( N 2 ) O(N^2) O(N2)复杂度。
让我们看看另外一个思路:
其实我们要计算 F a ( 10 ) ∗ F b ( 10 ) F_a(10)*F_b(10) Fa(10)∗Fb(10)
,其中 { F a ( x ) = a 0 + a 1 ∗ x + a 2 ∗ x 2 + . . . + a n ∗ x N F b ( x ) = b 0 + b 1 ∗ x + b 2 ∗ x 2 + . . . + b m ∗ x N \begin{cases}F_a(x)=a_0+a_1*x+a_2*x^2+...+a_n*x^N \\ F_b(x)=b_0+b_1*x+b_2*x^2+...+b_m*x^N\end{cases} {
Fa(x)=a0+a1∗x+a2∗x2+...+an∗xNFb(x)=b0+b1∗x+b2∗x2+...+bm∗xN
令 G ( x ) = F a ( x ) ∗ F b ( x )