FFT
多项式
定义
多项式是形如 A(x)=∑i=0nai×xi 的表达式,其中 x 为不定元,这是多项式的系数表示法。
将多项式中不定元的最大次数称为多项式的次数,记做 ∂(A(x))。
运算
A(x)=∑i=0naixi,B(x)=∑i=0mbixi A(x)±B(x)=∑i=0max{n,m}(ai±bi)xi A(x)×B(x)=∑i=0n∑j=0m(ai×bj)xi+j=∑k=0n+m∑i=0n(ai×bk−i)xk
多项式乘法满足交换律,结合律和分配率。
多项式的除法通常指带余除法。
A(x)=q(x)B(x)+r(x)∂(r(x))<∂(B(x)) A(x)≡r(x)(modB(x))
q(x) 称为 B(x) 除 A(x) 的商式,r(x) 称为 B(x) 除 A(x) 的余式。若 r(x)=0,则称 B(x) 整除 A(x),记作 B(x)∣A(x)。
点值表示法
n 个点可以确定唯一的 n−1 次多项式。如果多项式 f(x) 和 g(x) 的次数不超过 n,且对于 n+1 个不同的数都有相同的对应值,则 f(x)=g(x)。
如果选取 n+1 个不同的数,x0∼xn 对多项式求职,得到 A(x0),A(x1),⋯,A(xn)。那么称 {(xi,A(xi)∣0≤i≤n,i∈N} 为多项式 A(x) 的点值表示。通过系数表示求点值表示的过程叫做求值,通过点值表示求系数表示的过程叫做插值。
设 A(x) 和 B(x) 是两个多项式,它们在 x0∼sn 上的取值分别为 c0∼cn 和 D0∼Dn。那么 A(x)×B(x) 在 x0,x1,…,xn 上的取值分别为 c0D0∼cnDn。
复数
虚数单位 i=−1。
形如 a+bi(a,b∈R) 的数称为复数,a 称为实部,b 称为虚部。全体复数的集合记为 C。
设 z=a+bi,w=c+di,有
z±w=(a±c)+(b±d)i z×w=ac+adi+bci+bdi2=(ac−bd)+(ad+bc)i z÷w=c+dia+bi=(c+di)(c−di)(a+bi)(c−di)=c2+d2(ac+bd)+(bc−ad)i
复数的相加满足平行四边形法则。
![多项式卷积 FFT 和 NTT 多项式卷积 FFT 和 NTT](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzc0NC80Y2I1ZjYyYWM1ODNkMjJhZGNlODYxNmE3MzgxMWExOC5wbmc=)
共轭复数:z=a−bi,相当于对虚部取反。
令横轴为实轴,纵轴为虚轴。复数 a+bi 就对应坐标为 (a,b) 的点或向量。
复数对应的点到原点的距离称为复数的模长,记为 r=∣z∣。 由勾股定理 ∣z∣=a2+b2=zz
复数与实轴正半轴形成的角称为复数的辐角,记为 φ=argz。
复数也可以用模长和辐角表示,称为复数的极坐标形式。由极坐标与直角坐标的转化关系,z=r(cosφ+isinφ)。
![多项式卷积 FFT 和 NTT 多项式卷积 FFT 和 NTT](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNC9jOTA5ZjMxNDc0Y2JlN2VjNGMyNWJlYzc2MmE4NGVhZS5wbmc=)
复数的乘法,按照模长相乘,辐角相加的运算规则。除法为乘法的逆运算。
复数的共轭,则为复数对应向量与实轴轴对称的结果。
单位根
欧拉公式
对于任意实数 x,都有
eix=cosx+isinx
证明略。这个公式可以说明当 x 为实数时,函数 f(x)=eix 可以再复数屏幕表述一个单位元,且 x 为平面上的一个幅角。
![多项式卷积 FFT 和 NTT 多项式卷积 FFT 和 NTT](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgvZmU0NGU3MTRlZDMyZmIxNGJiZGY2MGIzMjhmNGQ4OTgucG5n)
定义
将方程 zn=1 的所有复数根称为 n 次单位根,这样的单位根共有 n 个。
en2πki(k=0,1,⋯,n−1)
这些单位根分布在复数平面的单位圆上,构成了一个正 n 边形,它们把单位圆等分成 n 个部分。
![多项式卷积 FFT 和 NTT 多项式卷积 FFT 和 NTT](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE0Mi9mYWIwMDUxNGZjNzY0OGYyOTIxODRjNzBiNDE0MmJmNi5wbmc=)
简单的,定义 ω=en2πki,若有 n 与 k 互质,则 ω 称为 n 次本原单位根。wx(x=0,1,⋯,n−1) 构成了所有的 n 次单位根。特殊的,当 k=1 时,本原单位根记为 ωn。
性质
单位根的共轭复数为其倒数。
ωnk=cosn2πk+isinn2πk ωnk=ω2n2k ωn2n=eiπ=−1 ωnk+2n=−ωnk
Cooley-Tukey 算法
离散傅里叶变换 DFT
多项式有两个表示方法——系数表示法和点值表示法。它们各有千秋,系数表示法适用范围广,但乘法操作为 O(n2);点值表示法适用范围窄,但乘法操作为线性。那么能不能在两个表示法相互转换呢?
假设现在有一个 n−1 次多项式,A(x)=∑i=0nai×xi。为了方便,设 n=2m,m∈N,不足在高位补 0。
将 n 个 n 次单位根 ωn0,ωn1,…,ωnn−1 代入 A(x) 将其转换成点值表达 A(ωnk)=∑i=0n−1aiωki。 点值向量 y=(A(ωn0),A(ωn1),…,A(ωnn−1)) 称为系数向量 a=(a0,a1,…,an−1) 的离散傅里叶变换,记为 y=DFTn(a)。
可以发现离散傅里叶变换的复杂度为 O(n2) 的。Cooley-Tukey 算法对 DFT 进行了优化,它将每一项进行了奇偶分类。当 k<2n 时
根据性质 ωnk=ω2n2k
A(ωnk)=i=0∑n−1aiωnki=i=0∑n−1a2iωn2ki+ωnki=0∑2n−1a2i+1ωn2ki=i=0∑2n−1a2iω2nki+ωnki=0∑2n−1a2i+1ω2nki
根据性质 ωnk+2n=−ωnk
A(ωnk+2n)=i=0∑2n−1a2iω2nki+ωnk+2ni=0∑2n−1a2i+1ω2nki=i=0∑2n−1a2iω2nki−ωnki=0∑2n−1a2i+1ω2nki
可以发现左右两个式子相似。令左式的系数表达式为 A1,右式的系数表达式为 A2。
A(ωnk)=A1(ω2nk)+A2(ω2nk) A(ωnk+2n)=A1(ω2nk)−A2(ω2nk)
这意味着,如果能求出 A1(ω2nk) 和 A2(ω2nk),那么可以直接求出 A(ωnk) 和 A(ωnk+2n)
于是,我们只要算出 a0,a2,…,a2n−2 和 a1,a3,…,a2n−1 的 DFT 就可以算出 a0,a1,…a2n−1 的 DFT,递归下去即可。时间复杂度 O(nlog2n)。
傅里叶逆变换 IDFT
刚刚计算的是 y=DFTn(a), 可以将多项式转化成点值表示,现在为了将点值表示转化成系数表示,需要计算 IDFT,它是 DFT 的逆运算,也就是插值的过程。提起插值,可能先想起拉格朗日插值,不过 FFT 不需要它。
考虑解一个线性同余方程组
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧a0(ωn0)0a0(ωn1)0⋮a0(ωnn−1)0+⋯+⋯⋮+⋯+an−2(ωn0)n−2+an−2(ωn1)n−2⋮+an−2(ωnn−1)n−2+an−1(ωn0)n−1+an−1(ωn1)n−1⋮+an−1(ωnn−1)n−1=A(ωn0)=A(ωn1)=A(ωnn−1)
写成矩阵的形式
⎣⎢⎢⎢⎢⎡(ωn0)0(ωn1)0⋮(ωnn−1)0(ωn0)1(ωn1)1⋮(ωnn−1)1⋯⋯⋱⋯(ωn0)n−1(ωn1)n−1⋮(ωnn−1)n−1⎦⎥⎥⎥⎥⎤⎣⎢⎢⎢⎡a0a1⋮an−1⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡A(ωn0)A(ωn1)⋮A(ωnn−1)⎦⎥⎥⎥⎤
左矩阵即为系数矩阵 V,要求它的逆矩阵 V−1。可以发现,这个矩阵可以使用范德蒙德矩阵的逆矩阵公式,令 D 为 V 的伴随矩阵。
V−1=n1D=n1⎣⎢⎢⎢⎢⎢⎡(ωn−0)0(ωn−1)0⋮(ωn−(n−1))0(ωn−0)1(ωn−1)1⋮(ωn−(n−1))1⋯⋯⋱⋯(ωn−0)n−1(ωn−1)n−1⋮(ωn−(n−1))n−1⎦⎥⎥⎥⎥⎥⎤
证明较为复杂,我们简单验证一下,设 E=V×D,则有
Ei,j=k=0∑n−1DikVkj=k=0∑n−1ωn−ikωnkj=k=0∑n−1ωnk(j−i)
当 i=j 时,显然 Ei,j=n。当 i=j 时,有
Ei,j=k=0∑n−1(ωnj−i)k=1−ωnj−i1−(ωnj−i)n=0
因此 D 的主对角线都是 n,其它位置都是 0,除以 n 后即为单位矩阵,证毕。
综上所述,可以得到
⎣⎢⎢⎢⎡a0a1⋮an−1⎦⎥⎥⎥⎤=n1⎣⎢⎢⎢⎢⎢⎡(ωn−0)0(ωn−1)0⋮−(n−1)(ωn−0)1(ωn−1)1⋮(ωn−(n−1))1⋯⋯⋱⋯(ωn−0)n−1(ωn−1)n−1⋮(ωn−(n−1))n−1⎦⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎡A(ωn0)A(ωn1)⋮A(ωnn−1)⎦⎥⎥⎥⎤
IDFT 就相当于把 DFT 过程中的 wni 换成 wn−i,然后做一次 DFT,将结果除以 n 即可。
递归实现
迭代实现
NTT
原根