实系数多项式卷积 DFT的优化

如果要计算 C ( x ) = A ( x ) B ( x ) C(x)=A(x)B(x) C(x)=A(x)B(x),通常的做法是对 A , B A,B A,B各做一次DFT,各处点值相乘后再做一次逆DFT
但是这样做了三次DFT,在某些丧心病狂的题目中可能会被卡常
但是如果 A ( x ) , B ( x ) A(x),B(x) A(x),B(x) 的系数都是实数,可以只做两次DFT

方法一

从毛爷论文上搬的
P ( x ) = A ( x ) + i B ( x ) , Q ( x ) = A ( x ) − i B ( x ) P(x)=A(x)+iB(x),Q(x)=A(x)-iB(x) P(x)=A(x)+iB(x),Q(x)=A(x)iB(x)
如果我们求出了 P ( x ) , Q ( x ) P(x),Q(x) P(x),Q(x) 的点值,那么 A ( ω n k ) = P ( ω n k ) + Q ( ω n k ) 2 , B ( ω n k ) = − i P ( ω n k ) − Q ( ω n k ) 2 A(\omega_n^k)=\frac{P(\omega_n^k)+Q(\omega_n^k)}{2},B(\omega_n^k)=-i\frac{P(\omega_n^k)-Q(\omega_n^k)}{2} A(ωnk)=2P(ωnk)+Q(ωnk),B(ωnk)=i2P(ωnk)Q(ωnk)
事实上只要求出了 P ( x ) P(x) P(x)的点值就相当于求出了 Q ( x ) Q(x) Q(x)的点值,因为 c o n j ( P ( ω n k ) ) = Q ( ω n n − k ) conj(P(\omega_n^k))=Q(\omega_n^{n-k}) conj(P(ωnk))=Q(ωnnk)
证明可以考虑几何意义, P , Q P,Q P,Q的每一项系数都共轭,而 c o n j ( ω n k ) = ω n n − k conj(\omega_n^k)=\omega_n^{n-k} conj(ωnk)=ωnnk,所以乘起来也共轭

方法二

D ( x ) = A ( x ) + B ( x ) + i ( A ( x ) − B ( x ) ) D(x)=A(x)+B(x)+i(A(x)-B(x)) D(x)=A(x)+B(x)+i(A(x)B(x))
直接对 D ( x ) D(x) D(x)做DFT,将点值自乘,再做逆DFT
最后 D ( x ) D(x) D(x)中实部恰好就是我们要求的值的4倍
也就是说, D 2 ( x ) D^2(x) D2(x)的实部所组成的多项式的各项系数恰好是 ( A ∗ B ) ( x ) (A*B)(x) (AB)(x)各项系数的4倍
证明 : r e a l ( D 2 ( x ) ) = r e a l ( [ A ( x ) + B ( x ) + i ( A ( x ) − B ( x ) ) ] 2 ) = ( A ( x ) + B ( x ) ) 2 − ( A ( x ) − B ( x ) ) 2 = 4 A ( x ) B ( x ) real(D^2(x))=real([A(x)+B(x)+i(A(x)-B(x))]^2)=(A(x)+B(x))^2-(A(x)-B(x))^2=4A(x)B(x) real(D2(x))=real([A(x)+B(x)+i(A(x)B(x))]2)=(A(x)+B(x))2(A(x)B(x))2=4A(x)B(x)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值