模板:快速傅里叶变换(FFT)

参考:http://blog.csdn.net/f_zyj/article/details/76037583
若是公式炸了请去个人csdn博客:http://blog.csdn.net/luyouqi233/article/details/79323568
原文便是一篇很好的FFT入门博客,可是笔者打算为了往后的学习,则将原篇章的结构删改增添一下,若有思路上的雷同十分正常。
“是时候打开FFT的大门了!”
html

预备知识:

1.至少知道基础数论与必定解三角形知识(大概是高中水平)。
2.定义\(i=\sqrt{-1}\)
3.引入复数(即形如\(a+bi\)(a,b均为实数)的数的集合)
4.\((cos\theta+i\times sin\theta)^k=cos(k\theta)+i\times sin(k\theta)\)
5.显然咱们对多项式FFT以后获得的答案不是咱们想要的,那么这时候就须要反着用FFT把式子再变回去(本文记作IFFT)。算法

这里证实一下第四条,用概括法。
显然当\(k=1\)时成立。
\(k\)成立时,咱们有:
\((cos\theta+i\times sin\theta)^{k+1}\)
\(=(cos\theta+i\times sin\theta)^k\times (cos\theta+i\times sin\theta)\)
\(=(cos(k\theta)+i\times sin(k\theta))\times (cos\theta+i\times sin\theta)\)
\(=cos(k\theta)cos\theta+i\times sin(k\theta)cos\theta+i\times cos(k\theta)sin\theta+i^2\times sin(k\theta) sin\theta\)
\(=cos(k\theta)cos\theta-sin(k\theta) sin\theta+i\times (sin(k\theta)cos\theta+cos(k\theta)sin\theta)\)
\(=cos((k+1)\theta)+i\times sin((k+1)\theta)\)
得证。函数

问题引入:

\(A(x)=\sum_{i=0}^{n-1}a_ix^i,B(x)=\sum_{i=0}^{n-1}b_ix^i\),求\(A(x)\times B(x)\)后的多项式系数。学习

初探:

显然咱们有一个\(O(n^2)\)的解法,可是实在是太慢了。
考虑到一个\(n-1\)次多项式能够看作是定义在复数域上的函数,则咱们必定能够找到n个点来惟一肯定这个函数。
固然咱们也能够经过这些点来表示这个多项式。
假设:
\(A(x)\)被表示为:\(<(x_0,y_{a_0}),(x_1,y_{a_1}),\ldots,(x_{2n-2},y_{a_{2n-2}})>\)
\(B(x)\)被表示为:\(<(x_0,y_{b_0}),(x_1,y_{b_1}),\ldots,(x_{2n-2},y_{b_{2n-2}})>\)
显然\(A(x)\times B(x)\)被表示为:\(<(x_0,y_{a_0}y_{b_0}),(x_1,y_{a_1}y_{b_1}),\ldots,(x_{2n-2},y_{a_{2n-2}}y_{b_{2n-2}})>\)优化

这里多取了点的缘由在于\(A(x)\times B(x)\)是一个\(2n-2\)次多项式,则至少要取\(2n-1\)个点才能保证正确。spa

可是显然仍是\(O(n^2)\)的。.net

再试:

考虑设\(A(x_i)=A_0(x_i^2)+x_iA_1(x_i^2)\),其中:
\(A_0(x)=a_0+a_2x+a_4x^2+\ldots+a_{n-2}x^{\frac{n}{2}+1}\)
\(A_1(x)=a_1+a_3x+a_5x^2+\ldots+a_{n-1}x^{\frac{n}{2}+1}\)htm

其实就是按照系数下标的奇偶性分类了一下。blog

此时咱们再令取点的\(x\)值为\(<x_0,x_1,\ldots,x_{\frac{n}{2}-1},-x_0,-x_1,\ldots,-x_{\frac{n}{2}-1}>\)
咱们发现把\(x\)平方后咱们的取值瞬间缩小了一半,而原式惟一变化的就是\(A_1(x)\)前的符号。
看起来咱们彷佛找到了\(O(nlogn)\)的可行方案。
可是很惋惜,这样优秀的\(x\)取值的性质只会保留一次,也就是说咱们只是获得了一个\(O(\frac{n^2}{2})\)
如何才能每次将问题的规模缩小一半是咱们的目标。递归

插曲:

有我的告诉你:不如试试\(X_n=cos\frac{2\pi}{n}+i\times sin\frac{2\pi}{n}\)\(0\ldots n-1\)次方做为\(x\)的取值。

这块你们一直有个疑惑:这是怎么构造出来的啊?
事实上傅里叶变换最先是应用于信号处理上的,傅里叶提出:任何连续周期信号能够由一组适当的正弦曲线组合而成。
多项式能够看作非连续周期信号,而后经过各类奇妙的姿式让它逼近正弦曲线的组合形,详情能够看松松松WC2018的课件。
“逼近”显然用到了微积分,不适合初学者,因此就直接跳过了。(其实我也不会……)
(再多说一点吧,其实上面和下面的数学推理彻底能够从物理层面理解,仍是能够参考松松松WC2018的课件)

继续:

那么令取点的\(x\)值为\(<X_n^0,X_n^1,\ldots,X_n^{n-1}>\)
咱们可知:
\((X_n^{k})^2\)

\(=X_n^{2k}\)

\(=cos\frac{2k\times 2\pi}{n}+i\times sin\frac{2k\times 2\pi}{n}\)

\(=cos\frac{2k\pi}{\frac{n}{2}}+i\times sin\frac{2k\pi}{\frac{n}{2}}\)

\(=X_{\frac{n}{2}}^k\)


\(X_n^{k}\)

\(=cos\frac{k\times 2\pi}{n}+i\times sin\frac{k\times 2\pi}{n}\)

根据三角函数的周期性可知,\(k\)\(n\)取模显然不会对答案形成影响。
因而咱们有\(X_n^{k}=X_n^{k\%n}\)

那么显然对于\(<(X_n^0)^2,(X_n^1)^2,\ldots,(X_n^{n-1})^2>\)

它等效于\(<X_{\frac{n}{2}}^0,X_{\frac{n}{2}}^1,\ldots,X_{\frac{n}{2}}^{\frac{n}{2}-1},X_{\frac{n}{2}}^0,X_{\frac{n}{2}}^1,\ldots,X_{\frac{n}{2}}^{\frac{n}{2}-1}>\)

咱们好像看到了\(O(nlogn)\)的曙光了。

尾声:

显然咱们能够对\(x\)的取值折半,而后对于左右区间的\(x\)值递归下去便可。
Q1:诶等等,“再试”里面的内容好像没有应用上啊……

A1:那就转化一下,其实咱们只须要求一个区间的\(A_0(x)\)\(A_1(x)\)值递归下去求\(A(x)\)便可。
也就是说其实咱们是获得了:
\(<(A_0)_0,(A_0)_1,\ldots,(A_0)_{\frac{n}{2}-1},(A_1)_0,(A_1)_1,\ldots,(A_1)_{\frac{n}{2}-1}>\)

Q2:这好像是多此一举……

A2:emmm……我说这个能够用于常数优化你信吗……
显然\(A(X_n^k)=(A_0)_{k\%\frac{n}{2}}+X_n^k(A_1)_{k\%\frac{n}{2}}\)

取模是由于,不要忘了咱们的取值是由两个同样的左右区间合并在一块儿的。

那么咱们获得了\(<A_0,A_1,\ldots,A_{n-1}>\)

(其中\(A_k=A(X_n^k)\)

咱们好像把这个序列的长度减小了一半诶!那天然是快了二倍啊。

不要忘了n要知足始终是2的倍数,因此n要取2的整数次幂,同时将没用的次幂的系数填成0。

Q3:IFFT怎么作啊?

A3:继续看下去……?

补遗:

略讲一下IFFT。
显然咱们能够把FFT的最初算法(也就是DFT)看作两个矩阵相乘。

两个矩阵分别一个填\((X_n^k)^m\),一个填系数,能够上参考处原博客看矩阵。

那么咱们把第一个矩阵变成逆矩阵岂不是为IFFT?
其实就是这样,而且事实上就是填\(((X_n^{-k})^m)/n\),具体证实过程看参考处原博客。
剩下的作法就和FFT同样啦。

谢幕:

事实上我上述讲的内容其实没有多少用(滑稽。
由于你理解半天也不如不理解知道怎么用而后默写下来。
可是理解了更好背啊。

例题:

模板:
HDU1402:A * B Problem Plus:http://www.cnblogs.com/luyouqi233/p/8448969.html

应用:
BZOJ3527:[ZJOI2014]力:http://www.cnblogs.com/luyouqi233/p/8452117.html

+++++++++++++++++++++++++++++++++++++++++++

+本文做者:luyouqi233。               +

+欢迎访问个人博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

相关文章
相关标签/搜索