NTT和它的常数技巧

本文介绍了快速傅里叶变换(FFT)和数论变换(NTT)的基本原理及其在多项式乘法中的应用。通过点表示法简化计算,详细探讨了如何在O(NlogN)的时间复杂度内实现FFT/NTT,并讨论了常数优化技术,如自底向上非递归优化、蝴蝶优化、缓存策略等,以提高算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一次做FFT/NTT的题就是一题超难的…想看系数优化的可以跳2。

1. FFT/NTT简单原理:

总结来说:

  1. O ( N l o g N ) O(NlogN) O(NlogN)把多项式系数表示转换成点表示
  2. O ( N ) O(N) O(N)在点操作上做各种操作
  3. O ( N l o g N ) O(NlogN) O(NlogN)点表示转换回系数表示

假设我们现在要做大整数相乘 ( a N . . . a 2 a 1 a 0 ‾ ) 10 ∗ ( b N . . . b 2 b 1 b 0 ‾ ) 10 (\overline{a_N...a_2 a_1 a_0})_{10} * (\overline{b_N...b_2 b_1 b_0})_{10} (aN...a2a1a0)10(bN...b2b1b0)10正常来说我们需要一位一位来乘,需要 O ( N 2 ) O(N^2) O(N2)复杂度。

让我们看看另外一个思路:
其实我们要计算 F a ( 10 ) ∗ F b ( 10 ) F_a(10)*F_b(10) Fa(10)Fb(10)
,其中 { F a ( x ) = a 0 + a 1 ∗ x + a 2 ∗ x 2 + . . . + a n ∗ x N F b ( x ) = b 0 + b 1 ∗ x + b 2 ∗ x 2 + . . . + b m ∗ x N \begin{cases}F_a(x)=a_0+a_1*x+a_2*x^2+...+a_n*x^N \\ F_b(x)=b_0+b_1*x+b_2*x^2+...+b_m*x^N\end{cases} { Fa(x)=a0+a1x+a2x2+...+anxNFb(x)=b0+b1x+b2x2+...+bmxN
G ( x ) = F a ( x ) ∗ F b ( x )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值