[FFT&NTT及其加拿大28平台出租扩展]详解+完整证明

1.系数表示法加拿大28平台出租 haozbbs.com Q1446595067

我们最常用的多项式表示法就是系数表示法,一个次数界为n
的多项式S(x)可以用一个向量s=(s0,s1,s2,⋯,sn−1)

系数表示如下:
S(x)=∑k=0n−1skxk

系数表示法很适合做加法,可以在O(n)

的时间复杂度内完成,表达式为:
S(x)=A(x)+B(x)=∑k=0n−1(ak+bk)xk

当中
sk=ak+bk

但是,系数表示法不适合做乘法,时间复杂度为O(n2)

,表达式为:
S(x)=A(x)B(x)=∑k=0n−1(∑j=0n−1ajbk−j)xk

当中
sk=∑j=0kajbk−j

这就是卷积的一般形式,记s=a⊗b

,我们要想办法加速这个过程。
2.点值表示法

顾名思义,点值就是多项式在一个点处的值。多项式A(x)

的点值表达是一个集合:
{(x0,y0),(x1,y1),(x2,y2),⋯,(xn−1,yn−1)}

使得对于k=0,1,2,⋯,n−1
有xk两两不相同且yk=A(xk)

n
个点可以确定唯一一个n

次多项式。

点值表达有很多优良的性质,加法和乘法都可以在O(n)

的时间复杂度内完成。

现有A(x)

的点值表达
{(x0,y0),(x1,y1),(x2,y2),⋯,(xn−1,yn−1)}
和B(x)的点值表达
{(x0,y′0),(x1,y′1),(x2,y′2),⋯,(xn−1,y′n−1)}

则C(x)=A(x)+B(x)

的点值表达为:
{(x0,y0+y′0),(x1,y1+y′1),(x2,y2+y′2),⋯,(xn−1,yn−1+y′n−1)}

C(x)=A(x)B(x)

的点值表达为:
{(x0,y0y′0),(x1,y1y′1),(x2,y2y′2),⋯,(xn−1,yn−1y′n−1)}

可见,点值表示可以帮助我们更快地进行卷积,可是如何在系数表示法和点值表示法之间相互转化呢?
3、复数

当x
为实数时,无法很好地对转换方法进行优化。为了优化计算xn所浪费的时间,我们需要x有循环的性质。但点值表示法需要n个两两不同的值,而在实数域中只有1和−1

,因此,我们需要复数的帮助。
1.复数、复平面的定义

我们把形如a+bi
的数称为复数z,其中a为实部(Real),记为Rz;b为虚部(Imaginary),记为Iz

每一点都对应唯一复数的平面叫复平面,如图:

模长:复平面上原点到复数z
的距离,记为|z|。根据勾股定理,|z|=|a+bi|=a2+b2−−−−−−√

辐角:复平面上x
轴与复数z所对应向量之间的夹角,在(−π2,π2)之间的记为辐角主值argz


2.欧拉公式

大名鼎鼎的欧拉公式:
eit=cost+isint

几何意义:

当中θ
为角度,t

为弧长。

则根据欧拉公式,可将一个复数表示为一个二元组(a,θ)
,即模长和辐角。值为:a(cosθ+isinθ)

特殊情况:欧拉恒等式eiπ+1=0

3.复数的运算
(1)复数加法

运算规则:实部、虚部分别相加
(a+bi)+(c+di)=a+c+bi+di=(a+c)+(b+d)i

几何意义:如图

结果相当于两个向量所构成的平行四边形的对角线。如果把一个复数所对应的向量视为一个移动的变换,那么向量加法就是连续运用这两个变换相当于的新变换。
(2)复数乘法

运算规则:展开
(a+bi)(c+di)=ac+adi+bci+bdi2=(ac−bd)+(ad+bc)i

几何意义:如图

如图,arga+argb=arga×b
,|a|×|b|=|a×b|

总结就是:模长相乘,辐角相加。

因此,如果模长为1
,那么它的n

次方一定还在单位圆上。

证明:

根据欧拉公式,已知x=(a1,θ1)=a1(cosθ1+isinθ1),y=(a2,θ2)=a2(cosθ2+isinθ2)


x×y=a1a2(cosθ1+isinθ1)(cosθ2+isinθ2)=a1a2[(cosθ1cosθ2−sinθ1sinθ2)+i(cosθ1sinθ2+sinθ1cosθ2)]=a1a2[(cos(θ1+θ2)+cos(θ1−θ2)2+cos(θ1+θ2)−cos(θ1−θ2)2)+i(sin(θ1+θ2)−sin(θ1−θ2)2+sin(θ1+θ2)+sin(θ1−θ2)2)]=a1a2cos(θ1+θ2)+isin(θ1+θ2)

∴|x×y|=|x|×|y|,arg(x×y)=argx+argy

证毕。
4.单位复数根
(1)基本性质

单位复数根是方程ωn=1
的解,第k个解记为ωkn(这里的k

事实上是乘方的含义)

n=16
的解在复平面上的位置如下:

可以看到,n个解把单位圆分成了n等弧,交点即为根。而且,ωkn实际上是ωn的n次方,模长仍为1

,辐角翻倍!

为什么呢?

∵|xn|=|x|n,argxn=nargx

∴|ω|n=|ωn|,argωn=nargω

∴|ω|n=1(|ω|∈R+),argω=360∘n

∴|ω|=1,argω=360∘n

这就很明显了。

所以,ωkn
事实上表示的是ωn的k次幂。为什么选择单位复数根呢?因为它有循环的优良性质,即ωnn=1。由于其他的都可以由ω1n得到,因此称为主n次单位根,又记为ωn

根据单位复数根的平分圆的意义和欧拉公式,ωkn=e2πikn=cos2πkn+isin2πkn


(2)计算引理

显然,由于单位复数根循环(ωznn=e2πiz=[(eπi)2]z=1z=1

),有变换恒等式:
ωkn=ωk+wnn(w∈Z)

每一份再分成k
份,编号也变成k倍,位置自然不变(ωdkdn=e2πidkdn=e2πikn=ωkn

),所以有消去引理:
ωdkdn=ωkn

由于过了n/2
就会绕过半圈(ωn/2n=eπinn=eπi=−1

),所以有折半引理:
ωkn=−ωk±n/2n

对单位复数根求和,根据几何级数(等差数列求和公式),可得(∑n−1k=0(ωkn)j=(ωnn)j−1ω1n−1=0

),即有求和引理:
∑k=0n−1(ωkn)j=0

4、DFT&FFT
1.DFT

DFT就是求多项式A(x)
在点(ω0n,ω1n,ω2n,⋯,ωn−1n)

处取值的过程。即:
yk=A(ωkn)=∑j=0n−1ajωkjn

结果y=(y0,y1,y2,⋯,yn−1)
就是a的离散傅里叶变换(DFT),记为y=DFTn(a)

2.FFT
(1)递归

DFT的O(n2)
算法太慢了,FFT使用分治策略优化速度到O(nlogn)

现在,我们假设n=2t
,设原系数a=(a0,a1,a2,⋯,an−1),偶数部分a1=(a0,a2,a4,⋯,an−2),奇数部分a2=(a1,a3,a5,⋯,an−1),y=DFTn(a),y1=DFTn/2(a1),y2=DFTn/2(a2),现在我们要合并y1,y2,得到y

(蝴蝶操作)。

对于k<n/2


yk=A(ωkn)=∑j=0n−1ajωkjn=∑j=0n/2−1a2jω2kjn+∑j=0n/2−1a2j+1ω2kj+kn=∑j=0n/2−1a2jω2kjn+ωkn∑j=0n/2−1a2j+1ω2kjn=∑j=0n/2−1a1jωkjn/2+ωkn∑j=0n/2−1a2jωkjn/2=y1k+ωkny2k(消去引理)

对于k≥n/2


yk=A(ωkn)=∑j=0n−1ajωkjn=∑j=0n/2−1a2jω2kjn+∑j=0n/2−1a2j+1ω2kj+kn=∑j=0n/2−1a2jω2kjn+ωkn∑j=0n/2−1a2j+1ω2kjn=∑j=0n/2−1a1jωkjn/2+ωkn∑j=0n/2−1a2jωkjn/2=∑j=0n/2−1a1jω(k−n/2)jn/2+ωkn∑j=0n/2−1a2jω(k−n/2)jn/2=y1k−n/2+ωkny2k−n/2=y1k−n/2−ωk−n/2ny2k−n/2(消去引理)(变换恒等式)(折半引理)

以下图的递归序,就可以在O(nlogn)

的时间复杂度内完成求解了。
(2)迭代

递归方法消耗内存过大,不忍直视。我们每次把下标分为奇数部分和偶数部分,是否有办法直接求出最后的递归运算顺序,以避免递归呢?

这样想:第一次划分,我们按照二进制的最后一位分开两个部分;第二次划分,按照二进制的倒数第二位;以此类推。因此,结果顺序就是原序列按照二进制位翻转的大小排序的结果。只要依次交换ak,arev(k)

,求出序列,就可以用迭代方法相邻归并实现快速傅里叶变换。

如n=8

时,求出二进制:
0 1 2 3 4 5 6 7
0002
0012
0102
0112
1002
1012
1102
1112

翻转:
0 1 2 3 4 5 6 7
0002
1002
0102
1102
0012
1012
0112
1112

按翻转后的值排序:
0 4 2 6 1 5 3 7
0002
0012
0102
0112
1002
1012
1102
1112

这样就可以迭代实现了。
5、IDFT&IFFT

何把点值表达变回系数表达呢?如果把求值写成矩阵形式,就是:
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢ω0nω0nω0nω0n⋮ω0nω0nω1nω2nω3n⋮ωn−1nω0nω2nω4nω6n⋮ω2(n−1)nω0nω3nω6nω9n⋮ω3(n−1)n⋯⋯⋯⋯⋱⋯ω0nωn−1nω2(n−1)nω3(n−1)n⋮ω(n−1)2n⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢a0a1a2a3⋮an−1⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢y0y1y2y3⋮yn−1⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥

如果我们要把y
变成a

,就需要求出第一个矩阵的逆,即:
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢a0a1a2a3⋮an−1⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢ω0nω0nω0nω0n⋮ω0nω0nω1nω2nω3n⋮ωn−1nω0nω2nω4nω6n⋮ω2(n−1)nω0nω3nω6nω9n⋮ω3(n−1)n⋯⋯⋯⋯⋱⋯ω0nωn−1nω2(n−1)nω3(n−1)n⋮ω(n−1)2n⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥−1⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢y0y1y2y3⋮yn−1⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥

这个范德蒙德矩阵极为特殊,它的逆矩阵是:
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢a0a1a2a3⋮an−1⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥=1n⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢ω0nω0nω0nω0n⋮ω0nω0nω−1nω−2nω−3n⋮ω−(n−1)nω0nω−2nω−4nω−6n⋮ω−2(n−1)nω0nω−3nω−6nω−9n⋮ω−3(n−1)n⋯⋯⋯⋯⋱⋯ω0nω−(n−1)nω−2(n−1)nω−3(n−1)n⋮ω−(n−1)2n⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢y0y1y2y3⋮yn−1⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥

只是把每项取倒数,并将结果除以n

即可。

证明:

记原矩阵为Ann
,我们给出的矩阵为Bnn

∴Aij=ωijn,Bij=1nω−ijn(0≤i,j≤n−1)

ABij=∑k=0n−1AikBkj=1n∑k=0n−1ωiknω−kjn=1n∑k=0n−1ωik−kjn=1n∑k=0n−1(ωi−jn)k

当i=j

时:

ABij=1n∑k=0n−11k=1n×n=1

当i≠j

时:

ABij=1n∑k=0n−1(ωi−jn)k=0(求和引理)

综上所述,AB=In
,即B=A−1

以上,离散傅里叶逆变换(IDFT)的表达式为:
ak=1n∑j=0n−1ykω−kjn

记a=IDFTn(y)。

同理,可以用相同的方法把IDFT加速到O(nlogn)

,称为IFFT。
6、NTT
1.定义

有时候我们会想要模素数p
意义下的多项式乘法。此时,由次数界为n的多项式A(x),B(x)的系数表达a,b求S(x)=A(x)B(x)的系数表达s

的公式为:
sk=∑j=0kajbk−jmodp

FFT无能为力,我们需要一种新的DFT,以数论的办法进行,这就是快速数论变换(NTT)。
2.原根
(1)定义

我们需要一种有数论循环性质的新数,原根恰好满足我们的要求。

设m
为正整数,a为整数,若a模m的阶等于φ(m),则称a为模m

的一个原根。

假设g
是素数p的原根,有1<g<p,且对于k=0,1,2,⋯,p−1,有gkmodp的结果两两不同,且gp−1≡1(modp)

可以发现,原根同样有循环的性质。因此,我们类比ωkn
的定义,把原来的ωkn=e2πikn替换为gk(p−1)n


(2)性质

我们来证明一些类似单位复数根的性质。

猜你喜欢

转载自blog.51cto.com/13861859/2139901