花费了一天,终于理解了这个知识点,写个博客记录一下,方便日后复习
一.复数
哎,别看到这里就走啊~
形如 \(z=a+bi\) 的数称为复数,\(a\)为实部,\(bi\)为虚部
\(i\):虚数单位,满足\(i^2=-1\)
如果你学过向量,请把它理解成一个向量
如果你没有学过,那么它是复平面上的一个点\((a,b)\)
复数相乘的规则:
模长相乘,幅角相加
二.单位根
满足\(x^n-1=0\)的\(x\)称为\(n\)次单位根
若 \(\omega\)是\(n\)次单位根,且\(\omega^0\),\(\omega^1\),\(\omega^2\),...,\(\omega^{n-1}\)恰好是所有的\(n\)次单位根,则称\(\omega\)为\(n\)次本原单位根,记作\(\omega_n\)
重要的性质:\(n\)次单位根在复平面上等分单位圆
如何求\(n\)次本原单位根?
欧拉公式指出,在复数域\(\mathbb{C}\)上,\(e^{ix}=cosx+isinx\)
由前面"重要的性质"可以得到,\(\omega_n\)=\(exp(2\pi in)\)=\(cos \frac{2\pi }{n}\)+\(isin \frac{2\pi }{n}\)
以此我们可以表示出所有的\(n\)次单位根,即:
\(\omega_n^k\)=\(cos \frac{2\pi k}{n}\)+\(isin \frac{2\pi k}{n}\)
三.离散傅里叶变换DFT
前置芝士:多项式的点值表达
对于一个多项式\(f(x)\),我们代入每个\(x_i\),会得到对应的\(f(x_i)\),这些\((x_i,f(x_i))\)构成了这个多项式的点值表达,且唯一确定了这个多项式
前置芝士2:多项式相乘
两个多项式的乘积被定义为:
\(A(x)B(x)\)=\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}{a_ib_jx^{i+j}}\)=\(\sum\limits_{i=1}^{2n}{c_kx^k}\)
其中\(c\)是\(a\)和\(b\)的卷积,计算两个多项式相乘的朴素算法是\(O(n^2)\)的
这时,我们惊喜的发现,如果将两个多项式先转换为点值表达,再相乘,时间复杂度只有\(O(n)\)
那只要将多项式转为点值表达不久可以啦?
很不幸,朴素的将多项式转为点值表达是\(O(n^2)\)的
怎么办?
这时,傅里叶横空出世