瞎讲:FFT三次变二次优化

2020年了我怎么还是没有学会任意模数NTT……
发现自己多项式的技能没有点的还有很多。


处理任意模数NTT有一系列的方法,其中有个看起来比较优的算法需要FFT三次变二次优化。
众所周知,普通的FFT长这样:
假设是多项式 A ( x ) A(x) A(x) B ( x ) B(x) B(x)求卷积,首先求 D F T ( A ) DFT(A) DFT(A) D F T ( B ) DFT(B) DFT(B),两者相乘后求 I D F T IDFT IDFT
这样算了三次 D F T DFT DFT
接下来的算法可以将三次 D F T DFT DFT优化成两次。


P ( x ) = A ( x ) + i B ( x ) P(x)=A(x)+iB(x) P(x)=A(x)+iB(x) Q ( x ) = A ( x ) − i B ( x ) Q(x)=A(x)-iB(x) Q(x)=A(x)iB(x)
推一波式子(设 L L L表示长度, θ = 2 π j k L \theta=\frac{2\pi jk}{L} θ=L2πjk
D F T ( P ) k = P ( ω k ) = ∑ j = 0 L − 1 ( A j + i B j ) ω j k = ∑ j = 0 L − 1 ( A j + i B j ) ( cos ⁡ θ + i sin ⁡ θ ) = ∑ j = 0 L − 1 ( A j cos ⁡ θ − B j sin ⁡ θ ) + i ( A j sin ⁡ θ + B j cos ⁡ θ ) DFT(P)_k=P(\omega^k)\\ =\sum_{j=0}^{L-1}(A_j+iB_j)\omega^{jk} \\ =\sum_{j=0}^{L-1}(A_j+iB_j)(\cos \theta + i\sin \theta) \\ =\sum_{j=0}^{L-1}(A_j\cos\theta-B_j\sin\theta)+i(A_j\sin\theta+B_j\cos\theta) DFT(P)k=P(ωk)=j=0L1(Aj+iBj)ωjk=j=0L1(Aj+iBj)(cosθ+isinθ)=j=0L1(AjcosθBjsinθ)+i(Ajsinθ+Bjcosθ)
D F T ( Q ) k = Q ( ω k ) = ∑ j = 0 L − 1 ( A j − i B j ) ω j k = ∑ j = 0 L − 1 ( A j − i B j ) ( cos ⁡ θ + i sin ⁡ θ ) = ∑ j = 0 L − 1 ( A j cos ⁡ θ + B j sin ⁡ θ ) + i ( A j sin ⁡ θ − B j cos ⁡ θ ) = ∑ j = 0 L − 1 ( A j cos ⁡ ( − θ ) − B j sin ⁡ ( − θ ) ) − i ( A j sin ⁡ ( − θ ) + B j cos ⁡ ( − θ ) ) DFT(Q)_k=Q(\omega^k)\\ =\sum_{j=0}^{L-1}(A_j-iB_j)\omega^{jk} \\ =\sum_{j=0}^{L-1}(A_j-iB_j)(\cos \theta + i\sin \theta) \\ =\sum_{j=0}^{L-1}(A_j\cos\theta+B_j\sin\theta)+i(A_j\sin\theta-B_j\cos\theta) \\ =\sum_{j=0}^{L-1}(A_j\cos(-\theta)-B_j\sin(-\theta))-i(A_j\sin(-\theta)+B_j\cos(-\theta)) DFT(Q)k=Q(ωk)=j=0L1(AjiBj)ωjk=j=0L1(AjiBj)(cosθ+isinθ)=j=0L1(Ajcosθ+Bjsinθ)+i(AjsinθBjcosθ)=j=0L1(Ajcos(θ)Bjsin(θ))i(Ajsin(θ)+Bjcos(θ))
对比一下,可以发现 D F T ( Q ) k DFT(Q)_k DFT(Q)k D F T ( P ) L − k DFT(P)_{L-k} DFT(P)Lk(即 D F T ( P ) − k DFT(P)_{-k} DFT(P)k)共轭。
于是算出 D F T ( P ) DFT(P) DFT(P),就可以在 O ( n ) O(n) O(n)时间内求出 D F T ( Q ) DFT(Q) DFT(Q)


显然 A ( x ) = P ( x ) + Q ( x ) 2 A(x)=\frac{P(x)+Q(x)}{2} A(x)=2P(x)+Q(x) B ( x ) = − i P ( x ) − Q ( x ) 2 B(x)=-i\frac{P(x)-Q(x)}{2} B(x)=i2P(x)Q(x)
于是就可以求出 D F T ( A ) DFT(A) DFT(A) D F T ( B ) DFT(B) DFT(B),进而求出 D F T ( A ∗ B ) DFT(A*B) DFT(AB),然后 I D F T IDFT IDFT回去。
这样就将 D F T DFT DFT从调用三次优化到调用两次了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值