• 任意长度循环卷积&单位根反演 学习笔记


    今天听 \(\texttt{m}\color{red}{\texttt{yee}}\) 嘴的,赶紧来补个学习笔记。

    PS:FFT 本质是长度为 \(2^n\) 的循环卷积。

    单位根反演

    反演本质:

    \[\frac1n\sum_{i=0}^{n-1}\omega_{n}^{ai}=[n|a] \]

    证明:

    • 如果 \(n|i\),那么显然可以将 \(a\) 拆为若干个 \(\omega_n^n\),之后式子只剩下了 \(n\)\(\omega_{n}^{n}\),那么乘上 \(\frac1n\) 就是 \(1\) 啦。
    • 如果 \(n\not|a\),容易发现 \(\omega_n^{i}\) 还是能够互相抵消,那么等于 \(0\)

    形式:

    \[g_n=\sum_{i=0}^{n-1}f_{i}\omega_{k}^{in}\Leftrightarrow f_n=\frac1n\sum_{i=0}^{n-1}g_i\omega_k^{-in} \]

    循环卷积

    定义 \(k\) 进制循环卷积为(就是 \(k\) 进制不进位加法):

    \[h_n=\sum_{i+j\equiv n\pmod{k}}f_i\times g_j \]

    可以写出二进制循环卷积(不就是异或吗)的转移矩阵:

    \[fwt=\begin{bmatrix}1&1\\1&-1\end{bmatrix}ifwt=\dfrac12\begin{bmatrix}1&1\\1&-1\end{bmatrix} \]

    \(k\) 进制的转移矩阵是这样的:

    \[fwt=\begin{bmatrix}\omega_k^0&\omega_k^0&\omega_k^0&\cdots&\omega_k^0\\\omega_k^0&\omega_k^1&\omega_k^2&\cdots&\omega_k^{k-1}\\\omega_k^0&\omega_k^2&\omega_k^4&\cdots&\omega_k^{2k-2}\\\vdots&\vdots&\vdots&\ddots&\vdots\\\omega_k^0&\omega_k^{k-1}&\omega_k^{2k-2}&\cdots&\omega_k^{k^2-2k+1}\end{bmatrix}ifwt=\frac1n\begin{bmatrix}\omega_k^{-0}&\omega_k^{-0}&\omega_k^{-0}&\cdots&\omega_k^{-0}\\\omega_k^{-0}&\omega_k^{-1}&\omega_k^{-2}&\cdots&\omega_k^{-k+1}\\\omega_k^{-0}&\omega_k^{-2}&\omega_k^{-4}&\cdots&\omega_k^{-2k+2}\\\vdots&\vdots&\vdots&\ddots&\vdots\\\omega_k^{-0}&\omega_k^{-k+1}&\omega_k^{-2k+2}&\cdots&\omega_k^{-k^2+2k-1}\end{bmatrix} \]

    这样可以 \(\mathcal{O(k^2)}\) 地完成 fwt 变换(但板题 任意模数 Chirp Z-Transform 需要用 FFT 优化加速),\(\mathcal{O(k)}\) 地点乘。

    PS:如果需要将对应系数相加,可以在 fwt 后直接相加减,因为这是个线性变换。

    咕咕咕

    P4191 [CTSC2010]性能优化

  • 相关阅读:
    bzoj1036 [ZJOI2008]树的统计Count(树链剖分)
    poj2348 Euclid's Game
    bzoj3575 [Hnoi2014]道路堵塞
    poj2484 A Funny Game
    bzoj2286 [Sdoi2011]消耗战
    虚树学习笔记
    bzoj4518 [Sdoi2016]征途
    node.js开发环境配置
    js中阻止事件冒泡和浏览器默认行为
    css3 background-clip和background-origin 区别
  • 原文地址:https://www.cnblogs.com/EricQian/p/16557815.html
Copyright © 2020-2023  润新知