FFT 傅里叶万岁
FFT --- Fast Foulier Transformation
以 $O(n \log n)$ 的速度计算 $\forall k=1,2,\dots,n, c[k]=\sum\limits_{i=0}^{k} a[i]b[k-i]$
记住,要 10min 内默出来!
注意事项:
- $tr[i]$ 是算出 $i$ 的二进制翻转的。
- 一定要判断 $is_idft$,如果是则 $w$ 虚部要取反。
- $n$ 必须是 2 的幂。
对于 $\forall k=1,2,\dots,n, c[k]=\sum\limits_{i=0}^{k} a[i]b[k+c+i]$ 这样的方式:
令 $ b'[i]=b[n-i] $
则 $ b[k+c-i]=b'[n-(k+c-i)]=b'[(n-k-c)-i] $
于是 $ c[k]=\sum\limits_{i=0}^{k} a[i]b[k+c+i]=\sum\limits_{i=0}^{k} a[i]b'[(n-k-c)-i] $
若 $n-k-c \geq k$,则 $c[k]=\sum\limits_{i=0}^{k} a[i]b'[(n-k-c)-i] =\sum\limits_{i=0}^{n-k-c} a[i]b'[(n-k-c)-i] (let\ a[j]=0, \forall k \lt j \leq n-k-c) $
卷积!