zoukankan      html  css  js  c++  java
  • 玄学算法与精彩DS Memairos Again

    本系列恢复更新了。它将重新阐释之前学过的算法。

    Fast Fourier Transform

    快速傅里叶变换在算法竞赛中特指一种(O(nlog n))转换系数表示法和点值表示法的算法。

    单位根

    (omega_n)(n)次单位根,即(omega_n^n=1)
    单位根有一个良好性质(omega_n^{k+frac n2}=-omega_n^k),可以通过复数的几何意义来证明。

    离散傅里叶变换

    (A(x)=a_0+a_1x+a_2x^2+cdots+a_{n-1}x^{n-1})
    ((b_0,b_1,b_2,cdots,b_{n-1}))是多项式(A(x))的离散傅里叶变换,即将((omega_n^0,omega_n^1,omega_n^2,cdots,omega_n^{n-1}))代入(A(x))得到的点值表示。
    再令(B(x)=b_0+b_1x+b_2x^2+cdots+b_{n-1}x^{n-1}),将((omega_n^0,omega_n^{-1},omega_n^{-2},cdots,omega_n^{-(n-1)}))代入:

    [B(omega_n^{-k})=sum_{i=0}^{n-1}b_i(omega_n^{-k})^i\=sum_{i=0}^{n-1}sum_{j=0}^{n-1}a_j(omega_n^i)^j(omega_n^{-k})^i\=sum_{j=0}^{n-1}a_jsum_{i=0}^{n-1}(omega_n^{j-k})^i ]

    (j=k)时,(omega_n^{j-k}=1)
    (j eq k)时,(displaystylesum_{i=0}^{n-1}(omega_n^{j-k})^i=frac{(omega_n^{j-k})^n-1}{omega_n^{j-k}-1}=0)
    (B(omega_n^k)=na_k),将每一项除以(n)就可以得到(A(x))。该过程即为离散傅里叶逆变换。
    离散傅里叶变换最常用于多项式乘法中。由于两个点值表示的多项式相乘是(O(n))的,那么我们只需要对两个多项式都进行离散傅立叶变换后相乘,再逆变换回来,就可以得到相乘后的系数表示的多项式。
    这启发我们用更优秀的复杂度进行傅里叶变换的过程。

    分治

    可以尝试使用分而治之的方法。
    假定(n)为偶数,将(A(x))按下标奇偶分成两部分,即令(A_1(x)=a_0+a_2x+a_4x^2+cdots+a_{n-2}x^{frac n2-1},A_2(x)=a_1+a_3x+a_5x^2+cdots+a_{n-1}x^{frac n2-1}),则

    [A(x)=A_1(x^2)+xA_2(x^2) ]

    蝴蝶操作

    名字起的很美。

    MTT

    Blue-Steins

    Number Theory Transform

  • 相关阅读:
    如何用VSCode手动编译Ace Editor
    libuv源码分析
    二叉平衡查找树---红黑树
    tcp滑动窗口与拥塞控制
    ceph架构剖析
    腾讯面试总结
    协程的实现原理
    dhcp协议交互报文
    libuv源码分析前言
    Protobuf使用规范分享
  • 原文地址:https://www.cnblogs.com/teafrogsf/p/post-FFT.html
Copyright © 2011-2022 走看看