前言
最近写了一道题[HNOI2017]礼物,要用一下FFT,然而上一次写FFT已经是8months之前了。。。
所以来复习一下
然后就温故而知新了
于是来博客写一下感悟
内容一:泰勒展开
它就是这个东西:(将f(x)在x0处进行泰勒展开)
它的本质就是从点x0开始逼近函数f(x)
这个有什么用呢?
它可以定义复数的exp
我们只需要把x带成z=a+b*i就可以计算复数的exp
同样sinx,cosx都可以进行泰勒展开
内容二:欧拉公式
如果我们把z带为ib
我们就会发现一个神奇(明显)的现象:所有的项的系数是四个一循环(废话,i^x的最小循环节不就是4嘛)
如果我们把实数分为一组,虚数分为一组:
稍有常识的人就能看出,经常被泰勒展开的人就能看出,经常用泰勒展开的人就知道
于是我们就发现了欧拉公式:
所以复数的exp就可以表示为:
其实e^a就是这个新复数e^(a+ib)的模长,b就是就是这个新复数与x轴的夹角
内容三:复数
让我们再来理解一下复数
我们在复平面上的一个复数z=a+ib,我们也可以把它表示为另一个复数的exp (有点极坐标的思想)
那我们再来理解一下复数的乘法,设z1=e^(a+ib),z2=e^(c+id)
那么:
把后面那一个带入欧拉公式,得:
因为原来复数的长度分别为e^a和e^c,夹角分别为b和d
而新复数的长度为e^a*e^c,夹角为b+d
于是我们就通过欧拉公式得到了复数乘法的几何意义:
两个复数相乘,所得复数模长为这两个复数的模长乘积,夹角为这两个复数的夹角之和
感觉棒棒哒
内容四:单位根
单位根就是满足x^n=1的所有复数解,记为
现在有了复数乘法的几何意义,我们就明白了为什么n次单位根是复平面单位圆的n等分点了
单位根的性质我就不再赘述了:https://blog.csdn.net/C20180602_csq/article/details/85015587
有了以上的性质,我们就可以比较轻松的看懂FFT的前置知识了
内容五:多项式基础知识(不赘述见https://blog.csdn.net/C20180602_csq/article/details/85015587)
内容六:FFT的分治思想
首先我们来考虑如何求f(x)在x取的值(假设n是2的幂)
首先单位根有一个很好的性质:(显然)
如果我们把k取2:
再把每一个值乘以
那么我们就可以把变成(不乘)和(乘以)
这个有什么用呢?
它告诉我们:
如果想要求出f(x)在处的取值
那么我们可以先求出f(x)在上的取值,再通过加减乘除得到f(x)在的取值
但是因为在2n等分圆上对应的点是(不乘)和(乘以)
如果直接带入的话会导致系数不对:
带入的是一个n次多项式,系数分别为:
带入的也是一个n次多项式,系数分别为:
所以我们应该把分别带入两个不同的多项式求值
说白了一句话:系数与带入点值同时分治
看一个例子就明白了
多项式
需要带入的点值
我们把f(x)按ai下表的奇偶来分治
把带入点值分治为和,分别对f0(x)和f1(x)求值
但是因为 ,
所以我们只需要求f0(x)和f1(x)在的值就可以了
然后我们就可以通过暴算得到下面等式:
(把左边的提出来就好了)
读者自己验证吧,笔者实在打不动了。。。。
其实FFT的分治思想的确挺巧妙的,主要是单位复数根的性质太好了
(以后用fft就不要把它当成黑盒算法了)