OI 中的 FFT

不行啊最近备考简直变成文化狗了= =。。我还脑洞大开想学俄语什么心态。。

简单地说一下FFT(来,跟我一起念,法〰法〜塔,法斯特~福铝页~圈死佛而母)。。

FFT本来是做信号变换用的,当然OI和信号变换搭不上边.但是大家都知道,FFT可以快速求卷积.这可以说是由复数的性质决定的.

FFT是什么

FFT,是DFT的一种实现.它可以在$\Theta \left( n\log_2{n}\right)$(其中n为输入规模)时间内完成DFT.

也就是说,FFT是DFT的一种具体实现.因此,与其问FFT是什么,更不如问DFT是什么.

DFT:Discrete Fourier Transform即离散傅里叶变换.由于计算机并不能真正处理连续数据,因此我们所说的傅里叶变换仅限于DFT.

具体的,计算机和人类都不可能完全识别连续数据,设这个连续数据是一个函数$\mathtt{F} ( t) \mathtt{ \ } ( t \in \mathbb{R}^+)$,我们只能选择一些点$t_n \mathtt{ \ } ( t_n \in \mathbb{R}^+, n \in \mathbb{Z}^+, t_{n - 1} < t_n)$,令$f_n = \mathtt{F} ( t_n)$,这个过程称为采样,这些$t_n$被称为采样点.一般我们规定只能取有限个采样点并且每个采样点间距相同,即$t_n = t_{n - 1} + b \mathtt{ \ } \left( \mathtt{const } b = \frac{1}{\max n}, n \in \mathbb{Z}^+ \right)$,此时既然采样点间距相同,采样点的数据也是成序列的.不妨设这个序列为$\mathtt{S}_{\mathtt{F}}$.

傅里叶变换其实是由一个定义在F上的积分\[ \widehat{\mathtt{F}} (\xi) = \int_{- \infty}^{\infty} \mathtt{F} (x) e^{- 2 \pi i x \xi} \text{dx} \]定义的.这是连续傅立叶变换,自然的,我们可以很轻松地写出离散傅里叶变换\[ \widehat{\mathtt{S}_{\mathtt{F}}} [ k] = \sum_{n = 0}^{N - 1} \mathtt{S}_{\mathtt{F}} [ n] e^{\frac{- 2 \pi i n k}{N}} \left( \mathrm{for easier input,lets define N as }\max n \right) \]基本就是把积分换成求和而已.

附加题×1: 已知傅立叶变换的逆变换是\[ \mathtt{F} (x) = \int_{0}^{\infty} \hat{\mathtt{F}} (\xi) e^{2 \pi i \xi x} \hspace{0.25em} d \xi \]写出它的离散形式.

FFT适用性

很自然地,我们想到一个问题: FFT,既然是`快速`算法,它怎么做?

具体的,对于任何一个输入长度为N的序列,我们可以理论上精确地在$\Theta ( n \log_2 n)$的时间内完成FFT.但是由于混合基FFT过于复杂,我们这里只讨论$N=2^a \left( a\in  \mathbb{R}\right)$的情况,即序列长度为2的幂时的情况.

DFT与卷积的关系

(按照算导的写法,姑且将$\omega_n$理解为wiki里的$\omega_n$共轭,做刚好相对称的FFT.)

暂且设$\omega_n = e^{2 \pi i / n}$.注意到我们这里出现了复数次幂,这是什么意思呢?

\[e^{iu}=\cos{u}+i \sin{u}\]

因此,如果将每一个复数投射到复平面上,这些点顺时针形成一个圈.

 

我们的B点,称为我们的主n次单位根.其它点则都是它的幂.

我们求FFT,相当于对一个多项式在这一圈的所有复数上进行求值,因为\[ \widehat{\mathtt{S}_{\mathtt{F}}} [ k] = \sum_{n = 0}^{N - 1} \mathtt{S}_{\mathtt{F}} [ n] \omega_N^{nk} \]

- 概念

-- 复数的模

复数$x$的模,记作$| x |$.

 

\[ | x | = \sqrt{| \Im ( x)^2 | + \Re ( x)^2} \]

\[ | e^{ia+b} | = e^b , b\in \mathbb{R} \]

-- 复数乘法

两个复数$a+bi$与$c+di$的积$( a + b i) \cdot ( c + d i) = ( a c - b d) + ( b c + a d) i$

积的模等于原两复数模之积,积的幅角等于原两复数幅角之和.

- 引理

-- 消去引理

$\omega^{kn}_{dn}=\omega^{k}_{d}$

\[\begin{eqnarray*} | \omega^d_k | = 1 & & \mathtt{(1)}\\ \arg \omega_k = 2 \pi / k & & \mathtt{(2)}\\ & \Downarrow & \\ \arg \omega^{nd}_{nk} = n \arg \omega^d_{nk} = \arg \omega_k^d & & \mathtt{(res)} \end{eqnarray*}\]

-- 折半引理

对于n>0且!(n|1),$| \{ \omega^k_n \mid 0 \leqslant k \leqslant n, k \in \mathbb{Z} \} | = 2 | \{ w_n^{2 k} \mid 0 \leqslant k \leqslant n, k \in \mathbb{Z} \} |$,$\{ w_n^{2 k} \mid 0 \leqslant k \leqslant n, k \in \mathbb{Z} \} = \{ w_{n / 2}^k \mid 0 \leqslant k \leqslant n / 2, k \in \mathbb{Z} \}$.

证明很简单,留作思考题.

- FFT

 

posted @ 2015-03-07 21:28 zball 阅读(...) 评论(...) 编辑 收藏