抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

这两个”根“在多项式乘法里面运用非常广泛。

单位根(FFT)

关于我自己对单位根的理解。

单位根其实就是一些复数,他们的模长为11

所以单位根一定在单位圆上

假设一个单位根zz的极角为θ\theta,那么我们可以将zz表示为cosθ+isinθ\cos \theta +i \sin \theta

数形结合考虑,从圆上某一个点做一条垂线,那么垂线长度为sinθ\sin \theta,垂足到原点距离为cosθ\cos \theta

考虑使用向量模长验证,z=sin2θ+cos2θ=1|z|=\sqrt{\sin ^2 \theta + \cos ^2 \theta}=1

ωnk=coskn2π+isinkn2π\omega_n^k = \cos \frac{k}{n} 2 \pi+ i \sin \frac{k}{n} 2 \pi

感性地理解这个式子,注意到2π2 \pi360°360°,所以这个式子的意义就是将单位圆用一些经过圆心的线分成nn份,从1+0i1+0i往逆时针数kk次,数到的线的端点所代表的复数。

于是发现四个推FFTFFT所用的经典的式子都非常naivenaive

1.ωnk=ω2n2k1.\omega _n^k=\omega _{2n}^{2k}

这个代表的意思就是把单位圆分成nn份,数kk次,和分成2n2n份,数2k2k次所代表复数是一样的。非常智障。

也可以通过三角函数证明:

ωnk=coskn2π+isinkn2π=cos2k2n2π+isin2k2n2π=ω2n2k\omega^k_n=\cos{k\over n}2 \pi +i\sin{k\over n} 2\pi =\cos{2k\over 2n}2\pi+i\sin{2k\over 2n} 2\pi=\omega^{2k}_{2n}

2.ωnk+n2=ωnk2.\omega _n^{k+{n \over 2}}=-\omega _n^k

定义:对于复数z=a+biz=a+biz=abi-z=-a-bi

这个也非常好理解,n/2n/2代表半圈,所以这个式子的意思是从编号为kk的复数开始走半圈,代表的复数和之前的正好相反(实部和虚部都相反)

3.ωn0=ωnn=1,ωnn2=13. \omega _n^0=\omega _n^n =1,\omega _n^{\frac{n}{2}}=-1

编号为00和编号为nn的点代表的复数相等,都为1+0i1+0i,编号为n/2n/2的点其实就是1+0i1+0i转过半圈,就是1+0i-1+0i

4.ωnp×ωnq=ωnp+q4.\omega _n^p \times \omega _n^q = \omega _n ^ {p+q}

复数的乘法其实像三角函数一样,设z1=a1+ib1,z2=a2+ib2z_1=a_1+ib_1,z_2=a_2+ib_2

根据复数乘法定义,那么我们有z1×z2=(a1×a2b1×b2)+i(a1×b2+a2×b1)z_1 \times z_2 = (a_1 \times a_2 - b_1 \times b_2)+i(a_1 \times b_2+a_2 \times b_1)

我们有三角函数的合角公式:

sin(A+B)=sinAcosB+cosAsinB\sin(A+B)=\sin A \cos B+\cos A \sin B
cos(A+B)=cosAcosBsinAsinB\cos (A+B)=\cos A\cos B-\sin A \sin B

换元:α=pn2π,β=qn2π\alpha = \frac{p}{n} 2 \pi, \beta = \frac{q}{n} 2 \pi

于是ωnp=cosα+isinα\omega _n^p = \cos \alpha + i \sin \alpha

还有ωnq=cosβ+isinβ\omega _n^q = \cos \beta + i \sin \beta

于是ωnp×ωnq=(cosαcosβsinαsinβ)+i(sinαcosβ+cosαsinβ)=cos(α+β)+isin(α+β)=ωnp+q\omega _n ^p \times \omega _n ^q = (\cos \alpha \cos \beta-\sin \alpha \sin \beta) + i (\sin \alpha \cos \beta+\cos \alpha \sin \beta) = \cos (\alpha + \beta)+i \sin(\alpha +\beta) = \omega ^{p+q}_n

(吐槽一句,复数的乘法好像就是为了这个东西定义的)

这个式子要好好体会。

有了第四个式子,我们就可以再推出第三个式子:

ωnk+n2=ωnn2×ωnk=(1+0i)×ωnk=ωnk\omega _n ^{k+\frac{n}{2}}=\omega _n^{\frac{n}{2}} \times \omega _n^k = (-1+0i) \times \omega _n^k = -\omega_n^k

原根(NTT)

有时候题目要求对一个大质数取模,这时就不能用单位根,要用原根。

pp的原根是满足g0%p,g1%p,g2%p...gp2%pg^0\%p,g^1\%p,g^2\%p...g^{p-2}\%p恰好等于[1,p1][1,p-1]中的所有数的最小的gg

现实中,可以从2p12 \to p-1枚举gg,如果满足gp1pi!=1(modp)g ^\frac{p-1}{p_i} !=1 \pmod p均成立,那么我们就找到了pp的原根。

我们称gng_nnn的原根,那么我们也得到了类似于ωnk\omega_n^k一长串的gn0,gn1,gn2,...,gnn2g_n^0,g_n^1,g_n^2, ... ,g^{n-2}_{n},而且他们模意义下和[1,p1][1,p-1]中的所有数一一对应。

我们设一个素数p=a×2b+1p=a \times 2^b+1

有以下等价关系:gn=gp1nωn=cos2πn+isin2πng_n=g^{\frac{p-1}{n}} \Leftrightarrow \omega_n=\cos \frac{2\pi}{n}+i\sin\frac{2\pi}{n}。(下面证明)

并且有gnk=gp1n×kg_n^k=g^{\frac{p-1}{n} \times k}

显然有gnp×gnq=gp1n×(p+q)=gnp+qg_n^p \times g_n^q=g^{\frac{p-1}{n} \times (p+q)}=g_n^{p+q}

1.g2n2k=gnk1.g_{2n}^{2k}=g_n^k

显然,g2n2k=gp12n×2k=gp1nk=gnkg_{2n}^{2k}=g^{\frac{p-1}{2n} \times 2k}=g^{\frac{p-1}{n}k}=g_n^k

2.gnn2=1,gn0=gnn=12.g_n^{\frac{n}{2}}=-1,g_n^{0}=g_{n}^n=1

显然gn0=g0=1,gnn=gp1=1(modp)g_n^0=g^0=1,g_n^n=g^{p-1}=1 \pmod p

因为(gnn2)2=gnn=1(g_n^{\frac{n}{2}})^2=g_n^n=1

gnn2=±1g_n^{\frac{n}{2}}=\pm 1

又因为gnn!=gnn2g_n^n!=g_n^{\frac{n}{2}},且gnn=1g_n^n=1,所以gnn2=1g_n^{\frac{n}{2}}=-1

3.gnk+n2=gnk3.g_n^{k+\frac{n}{2}}=-g_n^k

上面的式子套入p=k,q=n2p=k,q=\frac{n}{2},显然。

评论