快速傅里叶变换——FFTyL2013-9我们关心的问题快速解决多项式乘法问题衍生问题——高精度乘法问题的描述记一个多项式次数界为n的多项式A(x)则其中a为每一项的系数注意最高次系数为n-110)(njjjxaxA问题的描述两个多项式相乘我们记一般形式为C的次数界为A与B次数界的和普通的时间复杂度为O(n^2))()()(xBxAxCPART1——中心思想1点值与插值2N次单位复数根3FFT4演示转换思路普通的相乘方法提出概念:点值,插值ijjijibac01点值与插值2N次单位复数根3FFT4演示点值一个次数界为n的多项式A(x)的点值表达就是一个由n个点值对所组成的集合:其中每一个x都不相同,且E.G.多项式的一个合法点值表达是)},(,),,(),,{(111100nnyxyxyx)(kkxAy23)(2xxxA)}12,5(),2,0{(1点值与插值2N次单位复数根3FFT4演示插值插值运算是点值运算的逆运算假设我们得到了一个有n个点值对的点值表达那我们可以确定唯一的一个次数界为n的多项式1点值与插值2N次单位复数根3FFT4演示多项式乘法我们来探究一下如何用点值与插值来完成多项式乘法我们确定一组x,求得A与B的点值表达那我们可以得知C的点值表达通过插值运算,我们可以知道多项式C的系数)},(,),,(),,{(:111100nnyxyxyxA)},(,),,(),,{(:111100nnyxyxyxB)},(,),,(),,{(:111111000nnnyyxyyxyyxC1点值与插值2N次单位复数根3FFT4演示注意的地方设A与B的次数界均为n则C的次数界为2n则我们要找出2n个x来求点值表达否则不可以进行插值运算1点值与插值2N次单位复数根3FFT4演示算法流程对于次数界均为n的多项式A与B1点值运算构造长度为2n的点值表达2逐点相乘计算出C的点值表达3插值运算通过C的点值表达求出多项式C的每项系数1点值与插值2N次单位复数根3FFT4演示时间复杂度可以证明,若选取n个x计算点值与插值的时间复杂度均为O(N^2)本质上没有解决时间的问题但我们可以巧妙的选择这些数来优化时间复杂度。1点值与插值2N次单位复数根3FFT4演示PART2——N次单位复数根及其性质1点值与插值2N次单位复数根3FFT4演示N次单位复数根n次单位复数根是满足的复数w。n次单位复数根根恰好有n个,对于k=0,1,...,n-1,这些根是。为了解释这个表达式,我们利用复数的指数形式的定义:下一页图说明n个单位复数根均匀地分布在以复平面的原点为圆心的单位半径的圆周上。1nwnike/2)sin()cos(uiueiu1点值与插值2N次单位复数根3FFT4演示N次单位复数根28w18w08w78w68w58w48wii38w},,,,{N1210nnnnn次单位复数根为我们记1点值与插值2N次单位复数根3FFT4演示性质我们需要N次单位复数根我们首先来探究这些根的性质1点值与插值2N次单位复数根3FFT4演示性质1——主n次单位根我们称为主n次单位根同时注意到,n次单位复数根都是经过旋转而得到的每次旋转都是一定角度n次单位复数根可视为公比为主n次单位根的等比数列1nnwwninin1点值与插值2N次单位复数根3FFT4演示性质2——群的性质因为所以推论10nnnwwnkjnkjnknjn)(nknknwwknknww22)(1点值与插值2N次单位复数根3FFT4演示11nnnww性质3——消去引理&折半引理....消去引理:推论:折半引理:如果n0为偶数,那么n次单位复数根的平方的集合就是n/2次单位复数根的集合。证明:可以知道的平方相同。kndkdnww122/wwnn)2/(nknknww与222222/)()(knknnnknnknnknknknww2/2)(1点值与插值2N次单位复数根3FFT4演示性质4——求和引理求和引理:对于任意整数n≥1和不能被n整除的非负整数k,有等比数列求和所以注意k不能是n的倍数,否则分母为0100)(njjknw011)1(11)(11)()(10knkknknnknnknnjjkn——FFT及其关键算法1点值与插值2N次单位复数根3FFT4演示DFT——离散傅里叶变换我们希望计算次数界为n的多项式在n次单位复数根处的值(共n个)接下来定义结果yy即为a的离散傅里叶变换(DFT)我们也可记为10)(njjjxaxA10)(njkjnjknkwawAy)(aDFTyn1点值与插值2N次单位复数根3FFT4演示FFT——快速傅里叶变换大前提:n为2的整数幂(方便计算)利用复数单位根复数根的特殊性质我们可以在时间内计算出FFT利用了分治策略)lg(nnO)(aDFTn1点值与插值2N次单位复数根3FFT4演示PART3.1——点值运算1点值与插值2N次单位复数根3FFT4演示分治策略如何求出单个数x的函数值A(x)?我们定义两个新多项式观察两个多项式的特点1分别拥有奇数下标的系数与偶数下标的系数2次数界变为n/2(缩小了一半)12/12531]1[12/22420]0[)()(nnnnxaxaxaaxAxaxaxaaxA1点值与插值2N次单位复数根3FFT4演示分治策略对于一个数x,求A(x)则根据上两个多项式)()()(2]1[2]0[xxAxAxAy1点值与插值2N次单位复数根3FFT4演示分治策略至此我们成功的转换了问题原问题:求一个多项式A(x)在的函数值。现问题:求两个多项式在的函数值。110,,,nnnn)(A)(]1[]0[xxA与212120)(,,)(,)(nnnn1点值与插值2N次单位复数根3FFT4演示分治策略现问题:求两个多项式在的函数值。根据折半引理,并不是n个不同的值,而是由n/2个n/2次单位复数根组成,而每个根恰好出现2次于是,我们递归地对n/2的多项式A[0](x)与A[1](x)在n/2个n/2次单位复数根进行求值)(A)(]1[]0[xxA与212120)(,,)(,)(nnnn212120)(,,)(,)(nnnn1点值与插值2N次单位复数根3FFT4演示程序实现1点值与插值2N次单位复数根3FFT4演示我们关心的程序实现问题1/2:规定程序递归出口3/4/12:定义主n次单位根,更新w值5/6/7/8:定义两个多项式并递归求解13:返回DFT9/10/11:递归结束后的处理工作1点值与插值2N次单位复数根3FFT4演示递归结束后的处理工作10:11:)()()(2]1[2]0[]1[]0[knknknknkknkkwAwAwwAywyy)()()()()()2/(2]1[)2/(2]0[2]1[)2/(2]0[]1[)2/(]0[]1[]0[)2/(nknnknnknnknknnknknknknkkknknkwAwAwwAwAwwAywyywyy1点值与插值2N次单位复数根3FFT4演示FFT时间复杂度对于运行时间有以下的递归式所以采用FFT,我们可以在O(nlgn)时间内实现点值运算(求出次数界为n的多项式在n次单位复数根处的值)。)lg()()2/(2)(nnOnOnTnT1点值与插值2N次单位复数根3FFT4演示PART3.2——插值运算1点值与插值2N次单位复数根3FFT4演示矩阵乘积我们可以把点值运算表示成一个矩阵方程我们把DFT写成矩阵乘积y=Vna13210)1)(1()1(3)1(21)1(3963)1(2642132113210111111111nnnnnnnnnnnnnnnnnnnnnnnnnnaaaaa1点值与插值2N次单位复数根3FFT4演示逆矩阵到此为止我们把插值运算改写成y与的逆矩阵的乘积1nnVyaaVy1nVnV1点值与插值2N次单位复数根3FFT4演示逆矩阵定理:证明比较冗长。我们证明,其中In为n*n的单位矩阵。考虑中(j,j')处的元素:如果j=j',则此和为1否则根据求和引理,此和为0./),(1nwkjVkjnn处元素为的nnnIVV11nnVV10)(101/))(/(][nkjjknnkjknkjnjjnnnwwnwVV1点值与插值2N次单位复数根3FFT4演示逆DFT给定矩阵,可以推导出:通过比较DFT的运算我们可以看到,对FFT作以下修改就可以计算出逆DFT:把a与y互换,用,再把计算结果的每个元素除以n。于是我们也可以在O(nlgn)时间内算出逆DFT。1nV)(1yDFTn101nkkjnkjwyna10njkjnjkwaynnww代替11点值与插值2N次单位复数根3FFT4演示PART4——标程演示1点值与插值2N次单位复数根3FFT4演示程序实现优化因为像伪代码中,赋值数组是不切实际的但我们发现,a中的应用的系数是有规律的所以根据位移与起始点的不同来优化FFT的实现1点值与插值2N次单位复数根3FFT4演示程序实现优化(a0,a1,a2,a3,a4,a5,a6,a7)(a0,a2,a4,a6)(a1,a3,a5,a7)(a0,a4)(a2,a6)(a1,a5)(a3,a7)(a0)(a4)(a2)(a6)(a1)(a5)(a3)(a7)1点值与插值2N次单位复数根3FFT4演示typeNode=recordx,y:double;end;arr=array[0..200000]ofNode;operator+(a,b:Node)c:Node;beginc.x:=a.x+b.x;c.y:=a.y+b.y;end;operator-(a,b:Node)c:Node;beginc.x:=a.x-b.x;c.y:=a.y-b.y;end;operator*(a,b:Node)c:Node;beginc.x:=a.x*b.x-a.y*b.y;c.y:=a.x*b.y+a.y*b.x;end;//定义复数类型,复数运算procedureDft(vara:arr;s,t:longint);//a答案数组,s起始量,t位移量beginif(nt)=1thenexit;Dft(a,s,t+1);Dft(a,s+1t,t+1);fori:=0ton(t+1)-1dobeginj:=s+i(t+1);wt:=w[i(t)]*a[j+1t];tt[i]:=a[j]+wt;tt[i+n(t+1)]:=a[j]-wt;end;fori:=0tont-1doa[s+it]:=tt[i];end;1点值与插值2N次单位复数根3FFT4演示beginn:=1;cin(a);cin(b);fori:=0ton-1dow[i].x:=cos(pi*i*2/n);fori:=0ton-1dow[i].y:=sin(pi*i*2/n);Dft(a,0,0);Dft(b,0,0);//DFTfori:=0ton-1doa[i]:=a[i