玄学算法与精彩DS Memairos Again

本系列恢复更新了。它将重新阐释之前学过的算法。

Fast Fourier Transform

快速傅里叶变换在算法竞赛中特指一种\(O(n\log n)\)转换系数表示法和点值表示法的算法。

单位根

\(\omega_n\)\(n\)次单位根,即\(\omega_n^n=1\)
单位根有一个良好性质\(\omega_n^{k+\frac n2}=-\omega_n^k\),可以通过复数的几何意义来证明。

离散傅里叶变换

\(A(x)=a_0+a_1x+a_2x^2+\cdots+a_{n-1}x^{n-1}\)
\((b_0,b_1,b_2,\cdots,b_{n-1})\)是多项式\(A(x)\)的离散傅里叶变换,即将\((\omega_n^0,\omega_n^1,\omega_n^2,\cdots,\omega_n^{n-1})\)代入\(A(x)\)得到的点值表示。
再令\(B(x)=b_0+b_1x+b_2x^2+\cdots+b_{n-1}x^{n-1}\),将\((\omega_n^0,\omega_n^{-1},\omega_n^{-2},\cdots,\omega_n^{-(n-1)})\)代入:

\[B(\omega_n^{-k})=\sum_{i=0}^{n-1}b_i(\omega_n^{-k})^i\\=\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}a_j(\omega_n^i)^j(\omega_n^{-k})^i\\=\sum_{j=0}^{n-1}a_j\sum_{i=0}^{n-1}(\omega_n^{j-k})^i \]

\(j=k\)时,\(\omega_n^{j-k}=1\)
\(j\neq k\)时,\(\displaystyle\sum_{i=0}^{n-1}(\omega_n^{j-k})^i=\frac{(\omega_n^{j-k})^n-1}{\omega_n^{j-k}-1}=0\)
\(B(\omega_n^k)=na_k\),将每一项除以\(n\)就可以得到\(A(x)\)。该过程即为离散傅里叶逆变换。
离散傅里叶变换最常用于多项式乘法中。由于两个点值表示的多项式相乘是\(O(n)\)的,那么我们只需要对两个多项式都进行离散傅立叶变换后相乘,再逆变换回来,就可以得到相乘后的系数表示的多项式。
这启发我们用更优秀的复杂度进行傅里叶变换的过程。

分治

可以尝试使用分而治之的方法。
假定\(n\)为偶数,将\(A(x)\)按下标奇偶分成两部分,即令\(A_1(x)=a_0+a_2x+a_4x^2+\cdots+a_{n-2}x^{\frac n2-1},A_2(x)=a_1+a_3x+a_5x^2+\cdots+a_{n-1}x^{\frac n2-1}\),则

\[A(x)=A_1(x^2)+xA_2(x^2) \]

蝴蝶操作

名字起的很美。

MTT

Blue-Steins

Number Theory Transform

posted @ 2020-09-29 00:37  teafrogsf  阅读(324)  评论(0编辑  收藏  举报