FFT 学习笔记
没写完,各位先帮我找找错/fn/fn/fn
FFT 的用途
求解两个多项式相乘,如:
则
朴素的算法需要 \(O(n^2)\) 的时间复杂度,但是 FFT 算法可以在 \(O(n \log n)\) 的时间内求出。
前置知识
没上过高中,语言非常不严谨,轻喷。
复数、平面向量及其运算
平面向量:带方向的线段。
定义虚数单位 \(i=\sqrt{-1}\),则任何的复数都可以被表示为 \(a+bi\) 的形式,其中 $a,b\in \mathbb{R} $
复平面的定义:一个平面直角坐标系,横轴是实数轴,纵轴是虚数轴。对于复数 \(z=a+bi\) ,则其在复平面内坐标为 \(Z(a,b)\) ,可知任意一个复数对应复平面内唯一一点。如果把 \(\vec{OZ}\) 看作复平面内一向量,那么任意一个复数对应复平面内唯一向量。
复数的模:\(z=a+bi\) ,则 \(z\) 的模 \(|z| = \sqrt{a^2+b^2}\) ,对应这个复数在复平面内向量的模(长度)。
复数加减乘:直接把 \(i\) 当作一个普通的字母即可,在乘的时候注意 \(i^2=-1\) 可以化简。
共轭复数:有一复数 \(z=a+bi\) ,则 \(z\) 的共轭复数等于 \(z'=a-bi\),易知两个互为共轭复数的复数相乘结果是实数,在复平面内两个共轭复数关于实轴对称。
复数除法:对于 $ \frac{x}{y}$ ,直接分子分母同乘 \(y\) 的共轭复数,分母化为实数后直接除即可。
复数运算的几何意义:复数相加对应两个复数相对应的向量相加,复数相减对应两个复数相对应的向量相减。复数乘除对应向量的旋转和缩放,较为复杂,在后面欧拉公式再讲。
欧拉公式及其几何意义
欧拉公式: \(e^{i\pi} +1 =0\)
上面的式子其实是这个式子的特例:$ e^{ix}=\cos x+i\sin x$ ,当 \(x=\pi\) 时取得。
复数 \(z=e^{ix}\) ,在复平面内的坐标为 \(Z(\cos x,\sin x)\) 。非常眼熟,它就是单位圆上的坐标,也即单位圆上 \(\theta=x\) 时的坐标。
欧拉公式证明
方法较多,我只会泰勒展开的证明方法,这也是欧拉他老人家某天心血来潮手玩泰勒公式的时候偶然得到欧拉公式的方法。
由泰勒公式易知
令 \(u=ix\)
将其暴力拆开
根据 \(i^t\) 的周期性,继续展开
把负号和 \(i\) 提出来
按照纯实数和纯虚数分组,提出 \(i\)
到这里暂且结束,先写出它的前几项
定睛一看,这不就是 \(\cos x\) 和 \(\sin x\) 的泰勒展开吗?!所以
结论
二级结论:一个向量 \(\vec{OZ}\) 乘上 \(\vec{e^{ix}}\) ,几何意义是将其逆时针旋转 \(x\) 。
同理地,把 \(\vec{OZ}\) 看作一个复数,同样成立。
单位根
单位根的定义:\(x^n-1=0\) 的根。\(x\) 被称为 \(n\) 阶单位根,由代数基本定理易知其至少有一根,然而 \(n\) 阶单位根有 \(n\) 个解。
求解单位根:
根据欧拉公式有 \(e^{2\pi i} = 1\)
令 \(k \in \mathbb{N}\)进而有 \({e^{2\pi i}}^k = e^{2k\pi i} =1^k=1\)
所以 \(x^n = e^{2k\pi i}\)
左右两边开 \(n\) 次根,\(x=e^{\frac{2k\pi i}{n}}\)
注意到 \(k > n\) 时,有 $ e^{\frac{2k\pi i}{n}}=e^{\frac{2(k-n)\pi i}{n}} $
\(k=0\) 时,有 \(e^{\frac{2k\pi i}{n}} = e^{\frac{2n\pi i}{n}}\)
所以,当 $k= { 1,2,3,\cdots,n } $ 时,\(x=e^{\frac{2k\pi i}{n}}\) 有 \(n\) 个不同的复数根。
把这 \(n\) 个根在复平面上标出,它正好构成正 \(n\) 边形的 \(n\) 个顶点。
单位根的一些性质
- 若 \(x\) 是单位根,则它的共轭复数也是
- 若 \(s\) 是单位根,则 \(x^k(k \in N)\) 也是
本原单位根
如果一个 \(n\) 阶单位根的 \(0\) 到 \((n-1)\) 次方能生成所有的 \(n\) 阶单位根,则称它为本原单位根,记为 \(\omega_n\) ,显而易见,\(e^{\frac{2\pi i}{n}}\) 是一个 \(n\) 阶本原单位根。