关于多项式、FFT的一些理解

前言

最近写了一道题[HNOI2017]礼物,要用一下FFT,然而上一次写FFT已经是8months之前了。。。

所以来复习一下

然后就温故而知新了

于是来博客写一下感悟

 

内容一:泰勒展开

它就是这个东西:(将f(x)在x0处进行泰勒展开)

它的本质就是从点x0开始逼近函数f(x)

这个有什么用呢?

它可以定义复数的exp

我们只需要把x带成z=a+b*i就可以计算复数的exp

同样sinx,cosx都可以进行泰勒展开

 

内容二:欧拉公式

如果我们把z带为ib

我们就会发现一个神奇(明显)的现象:所有的项的系数是四个一循环(废话,i^x的最小循环节不就是4嘛)

e^{ib}=1+\frac{1}{1!}*ib-\frac{1}{2!}*b^2-\frac{1}{3!}ib^3+\frac{1}{4!}b^4+...

如果我们把实数分为一组,虚数分为一组:

e^{ib}=(1-\frac{1}{2!}b^2+\frac{1}{4!}b^4+...)+i*(\frac{1}{1!}b-\frac{1}{3!}b^3+\frac{1}{5!}b^5+...)

稍有常识的人就能看出经常被泰勒展开的人就能看出,经常用泰勒展开的人就知道

cosb=1-\frac{1}{2!}b^2+\frac{1}{4!}b^4+...

sinb=\frac{1}{1!}b-\frac{1}{3!}b^3+\frac{1}{5!}b^5+...

于是我们就发现了欧拉公式:

e^{ib}=cosb+i*sinb

所以复数的exp就可以表示为:

e^{a+ib}=e^a*(cosb+i*sinb)

其实e^a就是这个新复数e^(a+ib)的模长,b就是就是这个新复数与x轴的夹角

 

 

内容三:复数

让我们再来理解一下复数

我们在复平面上的一个复数z=a+ib,我们也可以把它表示为另一个复数的exp (有点极坐标的思想)

那我们再来理解一下复数的乘法,设z1=e^(a+ib),z2=e^(c+id)

那么:

z_1*z_2=e^{a+ib}*e^{c+id}=e^a*e^c*e^{i*(b+d)}

把后面那一个带入欧拉公式,得:

e^a*e^c*(cos(b+d)+i*sin(b+d))

因为原来复数的长度分别为e^a和e^c,夹角分别为b和d

而新复数的长度为e^a*e^c,夹角为b+d

于是我们就通过欧拉公式得到了复数乘法的几何意义:

两个复数相乘,所得复数模长为这两个复数的模长乘积,夹角为这两个复数的夹角之和

 

感觉棒棒哒

 

 

内容四:单位根

单位根就是满足x^n=1的所有复数解,记为\omega _{n}^{0}\omega _{n}^{1}\omega _{n}^{2}...\omega _{n}^{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取\omega _{n}^{0}\omega _{n}^{1}\omega _{n}^{2}...\omega _{n}^{n-1}的值(假设n是2的幂)

首先单位根有一个很好的性质:\omega _n^i=\omega_{n*k}^{i*k}(显然)

如果我们把k取2:

\omega_n^0,\omega_n^1,\omega_n^2...\omega_n^{n-1} \Leftrightarrow \omega_{2n}^0,\omega_{2n}^2,\omega_{2n}^4...\omega_{2n}^{2n-2}

再把每一个值乘以\omega_{2n}^1

那么我们就可以把\omega _{n}^{0}\omega _{n}^{1}\omega _{n}^{2}...\omega _{n}^{n-1}变成\omega_{2n}^0,\omega_{2n}^2,\omega_{2n}^4...\omega_{2n}^{2n-2}(不乘\omega_{2n}^1)和\omega_{2n}^1,\omega_{2n}^3,\omega_{2n}^5...\omega_{2n}^{2n-1}(乘以\omega_{2n}^1

这个有什么用呢?

它告诉我们:

如果想要求出f(x)在\omega_{2n}^0,\omega_{2n}^1,\omega_{2n}^2...\omega_{2n}^{2n-1}处的取值

那么我们可以先求出f(x)在\omega _{n}^{0}\omega _{n}^{1}\omega _{n}^{2}...\omega _{n}^{n-1}上的取值,再通过加减乘除得到f(x)在\omega_{2n}^0,\omega_{2n}^1,\omega_{2n}^2...\omega_{2n}^{2n-1}的取值

 

但是因为\omega _{n}^{0}\omega _{n}^{1}\omega _{n}^{2}...\omega _{n}^{n-1}在2n等分圆上对应的点是\omega_{2n}^0,\omega_{2n}^2,\omega_{2n}^4...\omega_{2n}^{2n-2}(不乘\omega_{2n}^1)和\omega_{2n}^1,\omega_{2n}^3,\omega_{2n}^5...\omega_{2n}^{2n-1}(乘以\omega_{2n}^1

如果直接带入的话会导致系数不对:

\omega_{2n}^0,\omega_{2n}^2,\omega_{2n}^4...\omega_{2n}^{2n-2}带入的是一个n次多项式,系数分别为:a_0,a_2,a_4...a_{n-2}

\omega_{2n}^1,\omega_{2n}^3,\omega_{2n}^5...\omega_{2n}^{2n-1}带入的也是一个n次多项式,系数分别为:a_1,a_3,a_5...a_{n-1}

所以我们应该把\omega _{n}^{0}\omega _{n}^{1}\omega _{n}^{2}...\omega _{n}^{n-1}分别带入两个不同的多项式求值

说白了一句话:系数与带入点值同时分治

 

看一个例子就明白了

多项式f(x)=a_0+a_1x+a_2x^2+a_3x^3+...+a_7x^7

需要带入的点值\omega _{8}^{0},\omega _{8}^{1},\omega _{8}^{2},...\omega _{8}^{7}

我们把f(x)按ai下表的奇偶来分治

f_0(x)=a_0+a_2x+a_4x^2+a_6x^3

f_1(x)=a_1+a_3x+a_5x^2+a_7x^3

把带入点值分治为\omega _{8}^{0},\omega _{8}^{2},\omega _{8}^{4},\omega _{8}^{6}\omega _{8}^{1},\omega _{8}^{3},\omega _{8}^{5},\omega _{8}^{7},分别对f0(x)和f1(x)求值

但是因为\omega _{8}^{0},\omega _{8}^{2},\omega _{8}^{4},\omega _{8}^{6}\Leftrightarrow \omega _{4}^{0},\omega _{4}^{1},\omega _{4}^{2},\omega _{4}^{3}  ,  (\omega _{8}^{0},\omega _{8}^{2},\omega _{8}^{4},\omega _{8}^{6})*\omega_8^1\Leftrightarrow \omega _{8}^{1},\omega _{8}^{3},\omega _{8}^{5},\omega _{8}^{7}

所以我们只需要求f0(x)和f1(x)在\omega _{8}^{0},\omega _{8}^{2},\omega _{8}^{4},\omega _{8}^{6}的值就可以了

然后我们就可以通过暴算得到下面等式:

f(\omega_8^0)=f_0(\omega_4^0)+f_1(\omega_4^0)*\omega_8^0

f(\omega_8^1)=f_0(\omega_4^1)+f_1(\omega_4^1)*\omega_8^1

f(\omega_8^2)=f_0(\omega_4^2)+f_1(\omega_4^2)*\omega_8^2

f(\omega_8^3)=f_0(\omega_4^3)+f_1(\omega_4^3)*\omega_8^3

f(\omega_8^4)=f_0(\omega_4^0)-f_1(\omega_4^0)*\omega_8^0(把左边的\omega_8^4=-1提出来就好了)

f(\omega_8^5)=f_0(\omega_4^1)-f_1(\omega_4^1)*\omega_8^1

f(\omega_8^6)=f_0(\omega_4^2)-f_1(\omega_4^2)*\omega_8^2

f(\omega_8^7)=f_0(\omega_4^3)-f_1(\omega_4^3)*\omega_8^3

 

读者自己验证吧,笔者实在打不动了。。。。

 

 

其实FFT的分治思想的确挺巧妙的,主要是单位复数根的性质太好了

(以后用fft就不要把它当成黑盒算法了)

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值