CTS2010 性能优化 [* medium]
( m Sol:)
首先可以证明循环卷积只需要直接代入 (n) 次单位根进去就可以了。
注意到:
[egin{aligned}
&sum_i sum_j[(i+j)mod n=k]A_iB_j
\&iffsum_isum_j frac{1}{n}sum_{r=0}^{n-1}omega_{n}^{(i+j-k)r}A_iB_j
\&ifffrac{1}{n}sum_r^{n-1}omega_n^{-kr}sum_iomega_n^{ir} A_isum_j omega_n^{jr}B_j
end{aligned}]
所以后者本质上是 (n) 次单位根代入多项式 (A) 的点值,所以结果也是点值相乘,所以还原本质是代入 (omega_{n}^{-k}) 作为点值的结果,再乘以 (frac{1}{n})
注意到 FFT 的本质是线性变换,设后者为 DFT,前者为 IDFT,那么计算 (A imes F^k) 等价于 ( extrm{IDFT}( extrm{DFT}(A) imes extrm{DFT}(B)^k)),于是只需要代入 (omega_n^i) 即可。
答案要对 (n+1) 取模且 (n+1) 为质数,注意到长度 (n|(n+1-1)),这意味着原根可以表示为 (g^{1}) 来表示,计算的循环卷积本质是原根的次幂。
那么考虑 Bluestein's Algorithm,考虑对于每个 (k) 计算:
[egin{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_iomega_n^{-frac{(k-i)^2}{2}} cdot A_i imes 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
]
那么有:
[egin{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(dnlog_d n)),本题中可以认为是 (mathcal O(7nlog_7 n))