多项式相关
2016-01-23 00:05
211 查看
引用
从多项式乘法到快速傅里叶变换【快速傅里叶变换】【FFT】
准备知识
多项式表达
对于一个多项式我们可以写成系数表达和点值表达对于多项式f(x)=∑i=ni=0ai⋅xif(x)=\sum_{i=0}^{i=n}a_i\cdot x^i
这个多项式有n+1项,最高次项次数为n这个多项式有n+1项,最高次项次数为n
系数表达
写成n+1n+1维向量形式a⃗ =(a0,a1,⋯,an)\vec{a}=(a_0,a_1,\cdots,a_n)
点值表达
我们要选取任意n+1n+1个点值x0,⋯,xnx_0,\cdots,x_n求出它的f(xi)f(x_i),得到{(xi,f(xi)):0<=i<=n,i∈Z}\{(x_i,f(x_i)):0<=i<=n,i\in Z\}
这n+1n+1个点值可以任意选取,FFTFFT的高效性也是因为这n+1n+1个点的特殊选取
卷积运算
点值表达有什么优越性?
对于两个多项式,我们分别得到了他们的点值表达,我们就能将两个点值表达式相乘(不足的位也要算出来)O(N)O(N)时间得到两个多项式乘积的多项式的点值表达式
这个乘积运算就是卷积
我们举个例子来看
A(x)=x2+2x−1 {(0,−1),(1,2),(2,7),(3,14),(4,23)}A(x)=x^2+2x-1~~~~~\{(0,-1),(1,2),(2,7),(3,14),(4,23)\}
B(x)=x2−x+2 {(0,2),(1,2),(2,4),(3,8),(4,14)}B(x)=x^2-x+2~~~~~~~\{(0,2),(1,2),(2,4),(3,8),(4,14)\}
C(x)=x4+x3−x2+5x−2 {(0,−2),(1,4),(2,28),(3,112),(4,322)}C(x)=x^4+x^3-x^2+5x-2~~~~\{(0,-2),(1,4),(2,28),(3,112),(4,322)\}
复数
nn次单位复根:满足ωn=1\omega^n=1的复根,记为ωin\omega_n^i
复数可以直观理解为旋转,即将平面上以原点为圆心的圆分成nn份,nn次单位复根分布在单位半径的圆周上
nn次单位复根为{ω0n,ω1n,⋯,ωn−1n}\{\omega_n^0,\omega_n^1,\cdots,\omega_n^{n-1}\}
其实我们只要知道单位复根的性质即可
ωin=ωi−1nω1n\omega_n^i=\omega_n^{i-1}\omega_n^1
ω0n=ωnn=1ωin⋅ωjn=ωj+kn=ω(j+k)mod nnω−1n=ωn−1n ωjn=ωn+jn\omega_n^0=\omega_n^n=1\\\omega_n^i\cdot \omega_n^j=\omega_n^{j+k}=\omega_n^{(j+k)mod~~n}\\\omega_n^{-1}=\omega_n^{n-1}~~~\omega_n^j=\omega_n^{n+j}
消去引理:ωdidn=ωin ωn2n=ω12=−1 (ωin)2=ωin2折半引理:如果n为偶数且n>0,那么(ωi+n2n)2=(ωin)2 证明:(ωi+n2n)2=ω2i+nn=ω2inωnn=ω2in=(ωin)2消去引理:\omega_{dn}^{di}=\omega_n^i~~~\omega_n^{\frac{n}{2}}=\omega_2^1=-1~~~(\omega_n^i)^2=\omega_{\frac{n}{2}}^i\\折半引理:如果n为偶数且n>0,那么(\omega_n^{i+\frac{n}{2}})^2=(\omega_n^i)^2\\~~~~~~~~~~~~~~~~证明:(\omega_n^{i+\frac{n}{2}})^2=\omega_n^{2i+n}=\omega_n^{2i}\omega_n^n=\omega_n^{2i}=(\omega_n^i)^2
求和引理:对于n>=1且n不能整除i,有∑n−1j=0(ωin)j=0证明:∑n−1j=0(ωin)j=(ωin)n−1ωin−1=0若n为i的倍数,分母为0求和引理:对于n>=1且n不能整除i,有\sum_{j=0}^{n-1}(\omega_n^i)^j=0\\证明:\sum_{j=0}^{n-1}(\omega_n^i)^j=\frac{(\omega_n^i)^n-1}{\omega_n^i-1}=0\\若n为i的倍数,分母为0
多项式乘法
对于多项式f(x)=∑i=ni=0ai⋅xif(x)=\sum_{i=0}^{i=n}a_i\cdot x^i这个多项式有n+1项,最高次项次数为n这个多项式有n+1项,最高次项次数为n
朴素暴力
用系数表达法O(N2)O(N^2)的时间复杂度来计算利用点值表达优化
利用得到的点值表达O(N)O(N)计算虽然我们求出两个多项式的点值时间复杂度为O(N2)O(N^2)与暴力并没有很大差异,但这给我们一些启发
根据以上我们得到求多项式乘法的方向
FFTFFT
我们用FFTFFT来优化求出多项式点值表达的过程我们现在有多项式A(x)=∑i=n−1i=0ai⋅xiA(x)=\sum_{i=0}^{i=n-1}a_i\cdot x^i
令n=2t(不足的位用ai=0补齐),t∈Zn=2^t(不足的位用a_i=0补齐),t\in \mathbb Z
我们按照指数的奇偶将多项式分类
我们用A(ωmn)A(\omega_n^m)中偶数下标的系数和奇数下标的系数定义两个次数界为n2−1\frac{n}{2}-1的多项式A0(ωmn)和A1(ωmn)A_0(\omega_n^m)和A_1(\omega_n^m)
A0(ωmn)=a0+a2ωmn+⋯+an−2(ωmn)n2−1A1(ωmn)=a1+a3ωmn+⋯+an−1(ωmn)n2−1A_0(\omega_n^m)=a_0+a_2\omega_n^m+\cdots+a_{n-2}(\omega_n^m)^{\frac{n}{2}-1}\\A_1(\omega_n^m)=a_1+a_3\omega_n^m+\cdots+a_{n-1}(\omega_n^m)^{\frac{n}{2}-1}
我们用这两个多项式来表达原多项式A(ωmn)A(\omega_n^m)
A(ωmn)==A0((ωmn)2)+ωmnA1((ωmn)2)A0(ωmn2)+ωmnA1(ωmn2)\begin{eqnarray*}A(\omega_n^m)&=&A_0((\omega_n^m)^2)+\omega_n^mA_1((\omega_n^m)^2)\\&=&A_0(\omega_{\frac{n}{2}}^m)+\omega_n^mA_1(\omega_{\frac{n}{2}}^m) \end{eqnarray*}
根据折半引理我们有下式
A(ωm+n2n)===A0((ωm+n2n)2)+ωm+n2nA1((ωm+n2n)2)A0((ωmn)2)+ωm+n2nA1((ωmn)2)A0(ωmn2)−ωmnA1(ωmn2)\begin{eqnarray*}A(\omega_n^{m+\frac{n}{2}})&=&A_0((\omega_n^{m+\frac{n}{2}})^2)+\omega_n^{m+\frac{n}{2}}A_1((\omega_n^{m+\frac{n}{2}})^2)\\&=&A_0((\omega_n^m)^2)+\omega_n^{m+\frac{n}{2}}A_1((\omega_n^m)^2)\\&=&A_0(\omega_{\frac{n}{2}}^m)-\omega_n^mA_1(\omega_{\frac{n}{2}}^m) \end{eqnarray*}
A(ωmn)和A(ωm+n2n)A(\omega_n^m)和A(\omega_n^{m+\frac{n}{2}})其实是由同样的两个多项式的点值表达得到的,问题的规模每次除以2,根据主定理它的时间复杂度从O(N2)O(N^2)降到了O(NlogN)O(NlogN)
相关文章推荐
- 强大的注入框架ButterKnife
- Nginx的反向代理和负载均衡的配置文件写法上的区别
- 浮点数转换成字符串的实现-C++实现
- Codeforces D. Professor GukiZ and Two Arrays
- Ant编译自动生成jni头文件
- AtScript特征
- ASP.NET 5系列教程
- 如何在 Linux 中安装微软的 .NET Core SDK
- java 常用正则表达式 的使用
- 分享提高ASP.NET Web应用性能的技巧
- Python随手笔记第一篇(2)之初识列表和元组
- Python字符串、元组、列表、字典互相转换的方法
- php上传图片获取路径及给表单字段赋值的方法
- jQuery操作Table技巧大汇总
- javascript实现全角转半角的方法
- JavaScript实现ASC转汉字及汉字转ASC的方法
- AngularJS使用ngOption实现下拉列表的实例代码
- AngularJS中监视Scope变量以及外部调用Scope方法
- jQuery form插件之formDdata参数校验表单及验证后提交
- jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象