您的位置:首页 > 其它

多项式相关

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: