zoukankan      html  css  js  c++  java
  • CTSC2010 性能优化

    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))

  • 相关阅读:
    冲刺二4
    第十四周总结
    大道至简阅读笔记02
    冲刺二3
    冲刺二2
    大道至简阅读笔记01
    冲刺二1
    第十三周总结
    第一阶段意见评价
    5月23日团队开发日志
  • 原文地址:https://www.cnblogs.com/Soulist/p/13653698.html
Copyright © 2011-2022 走看看