CTSC2010 性能优化

CTS2010 性能优化 [* medium]

题面

\(\rm Sol:\)

首先可以证明循环卷积只需要直接代入 \(n\) 次单位根进去就可以了。

注意到:

\[\begin{aligned} &\sum_i \sum_j[(i+j)\mod n=k]A_iB_j \\&\iff\sum_i\sum_j \frac{1}{n}\sum_{r=0}^{n-1}\omega_{n}^{(i+j-k)r}A_iB_j \\&\iff\frac{1}{n}\sum_r^{n-1}\omega_n^{-kr}\sum_i\omega_n^{ir} A_i\sum_j \omega_n^{jr}B_j \end{aligned}\]

所以后者本质上是 \(n\) 次单位根代入多项式 \(A\) 的点值,所以结果也是点值相乘,所以还原本质是代入 \(\omega_{n}^{-k}\) 作为点值的结果,再乘以 \(\frac{1}{n}\)

注意到 FFT 的本质是线性变换,设后者为 DFT,前者为 IDFT,那么计算 \(A\times F^k\) 等价于 \(\textrm{IDFT}(\textrm{DFT}(A)\times \textrm{DFT}(B)^k)\),于是只需要代入 \(\omega_n^i\) 即可。

答案要对 \(n+1\) 取模且 \(n+1\) 为质数,注意到长度 \(n|(n+1-1)\),这意味着原根可以表示为 \(g^{1}\) 来表示,计算的循环卷积本质是原根的次幂。

那么考虑 Bluestein's Algorithm,考虑对于每个 \(k\) 计算:

\[\begin{aligned} &\sum_i \omega_n^{ik} A_i \\&=\sum_{i}\omega_n^{\frac{i^2+k^2-(k-i)^2}{2}}A_i \\&=\omega_n^{\frac{k^2}{2}}\sum_i\omega_n^{-\frac{(k-i)^2}{2}} \cdot A_i\times \omega_n^{\frac{i^2}{2}} \end{aligned}\]

在对于 \(k\) 考虑的时候,上式已经变成了卷积的形式,所以我们处理一边卷积就可以计算循环卷积了。

然而这个样子可能会有部分单位根是未定义的,或许会无法通过 NTT 处理本题。

然而注意到 \(n\) 的质因子不大于 \(10\),考虑如何高效的做任意长度 DFT,不妨设 \(d\)\(n\) 的质因子,那么此处应该有:

\[A_i(x)=\sum^{n/d}_j A_{i+jd} x^j \]

那么有:

\[\begin{aligned} &A(x)=A_0(x^d)+xA_1(x^d)+x^2A_2(x^d)+... \\&\iff A(\omega_n^k)=\sum_i^{d-1} \omega_n^{ik}A_i(\omega_{n/d}^{k}) \end{aligned}\]

那么直接分治即可,单层复杂度为 \(\mathcal O(dn)\),分治层数为 \(\log_d n\),所以复杂度为 \(\mathcal O(dn\log_d n)\),本题中可以认为是 \(\mathcal O(7n\log_7 n)\)

posted @ 2020-09-11 19:45  Soulist  阅读(161)  评论(0编辑  收藏  举报