• 「笔记」多项式任意长度循环卷积


    我们知道(FFT)是一个循环卷积。
    本质上的离散傅里叶变换满足的是这个性质:

    [c_k=sumlimits_{i,j}[i+j=k(mod n)]a_ib_j ]

    但是由于我们做的长度足够大((n)足够大)所以这种循环卷积卷不回去。
    这导致我们只能做特定长度的(FFT,n=2^w)
    如果我们需要做任意长度循环卷积呢?

    其实稍微推推式子就可以了。。。
    只说(DFT),(IDFT)也类似。
    其实我们要求的是这样一个多项式:

    [DFT(A,x)=sumlimits_{i=0}^{n}x^isumlimits_{j=0}^{n}a_iw_n^{ij} ]

    也就是所谓的点值表达式。
    那么也就是要求:

    [c_k=sumlimits_{i=0}^{n}a_iw_n^{ik} ]

    这样就可以用我们的小(trick)个换成卷积形式了。

    [c_k=sumlimits_{i=0}^{n}a_iw_n^{frac{i^2+k^2-(k-i)^2}{2}} ]

    这样可以拆了:

    [c_k=w_n^{frac{k^2}{2}}sumlimits_{i=0}^{n}left(a_iw_n^{frac{i^2}{2}} ight)w_n^{-frac{(k-i)^2}{2}} ]

    卷积形式吧!

    也就是说
    我们做一次任意长度循环卷积需要(FFT)上9次。。。
    常数还是蛮大的。
    有一种神仙的办法就是把虚部压进去一起(DFT),我还没搞太明白。
    晚上再去看吧。

  • 相关阅读:
    Kostya the Sculptor
    Parade
    zoj 1097 普吕弗序列
    API分析——Jquery UI Dialog
    伸缩性和可用性反模式(转)
    可伸缩性最佳实战(转)
    二叉索引树BIT
    RMQ
    线段树(区间树)
    双栈计算算术表达式
  • 原文地址:https://www.cnblogs.com/Lrefrain/p/12407358.html
Copyright © 2020-2023  润新知