码迷,mamicode.com
首页 > 其他好文 > 详细

单位根反演和循环卷积

时间:2020-02-09 23:34:02      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:ash   lol   fft   math   交换   oid   原因   感受   res   

这是\(FFT\)涉及到的一(两)个小知识

单位根反演

单位根

如果一个数\(x\),对\(\forall 1\le i<n\)\(x^i\ne 1\)\(x^n=1\)\(x\)称为\(n\)次单位根

此定义在复数,膜意义下都是良定义

求和引理

\([k|n]=\frac{1}{k}\sum\limits_{i=0}^{k-1}w_k^{in}\)

在前面已经有过证明

例题

\(\mathtt{BSOJ1683}\):求给出素数\(p\)\(k\)满足\(k|p-1\)\(\displaystyle{\sum_{i=0}^n [k|i]\binom{n}{i}F_i\bmod p}\)

\[\sum_{i=0}^n [k|i]\binom{n}{i}F_i\bmod p \\=\sum_{i=0}^n \frac{1}{k}\sum_{j=0}^{k-1}\omega_k^{ij}\binom{n}{i}F_i\bmod p\]
因为我们知道\(A=\begin{bmatrix}1&1\\1&0\end{bmatrix},A^n\)可以代表\(F_n\)同时具有关于数乘的结合律交换律
\[ =\frac{1}{k}\sum_{j=0}^{k-1}\sum_{i=0}^n\binom{n}{i}\left(\omega_k^jA\right)^i \\=\frac{1}{k}\sum_{j=0}^{k-1}\left(I+\omega_k^jA\right)^i \]
\(I+\omega_k^jA=\begin{bmatrix}\omega_k^j+1&\omega_k^j\\\omega_k^j&1\end{bmatrix}\)直接快速幂即可

应用

主要就是\(FFT\)逆变换那奇妙的一步,可以用单位根反演理解

考虑卷积\(\displaystyle{h(k)=\sum_{i,j}[i+j=k]f(i)g(j)}\)

\(n\)足够大时\([i+j=k]=[n|i+j-k]\)

\[\sum_{i,j}[n|i+j-k]f(i)g(j) \\=\sum_{i,j}\frac{1}{n}\sum_{t=0}^{n-1}\omega_n^{t(i+j-k)}f(i)g(j) \\=\frac{1}{n}\sum_{t=0}^{n-1}\omega_n^{-tk}F(\omega_n^t)G(\omega_n^t) \]
\(F\)\(G\)分别表示\(f\),\(g\)\(DFT\)后对应位置上的取值

循环卷积

定义

悲惨的故事当卷积\(\displaystyle{h(k)=\sum_{i,j}[i+j=k]f(i)g(j)}\)中的\(n\)不够大,那么\([i+j=k]=[i+j\equiv k\pmod n]\)

问题变得诡异起来,\(\text{mod}\)是什么下标操作呢

考虑如果直接\(DFT\)会发生什么事情,那就是后面的要加到前面来,这是不敢想象的是

因此只能暴力\(DFT\)

inline void DFT(re cp a[],re char flag){
    re int i,j;re cp now,wn;
    for(i=0;i<n;++i){
        wn=cp(cos(2*i*PI/n),flag*sin(2*i*PI/n));now=cp(0,0);
        for(j=n-1;~j;--j)now=now*wn+a[j];
        res[i]=now;
    }
    if(flag==-1)for(i=0;i<n;++i)res[i].x/=n,res[i].y/=n;
    for(i=0;i<n;++i)a[i]=res[i],res[i]=cp(0,0);
}

其实存在\(O(n\lg n)\)的分治乘法

性质

循环卷积那么难求,相对应的,性质却很好

对于正常的\(DFT\),点值表达式的快速幂不等价于多项式的快速幂因为你取的点值少了,除法也是类似的原因

而对于循环卷积,这个问题不复存在,两种多项式上的操作都可以嫁接到点值表达式上

例题

非常少,这是一道强行拼凑的题

\(\mathtt{BSOJ5287}\):对\(pA=q\)给出循环矩阵\(A\)和向量\(q\)求向量\(p\)

首先有一个结论:循环矩阵作用在一个向量上就相当于对这个向量为系数表示的多项式做循环卷积

具体的\(A_{i,j}=a_{i+j~\bmod~ n}\)
\(y_i=\sum\limits_{j}A_{i,j}x_j=\sum\limits_j a_{i+j~\bmod~n}x_j\)

这是下标差为定值卷积,翻转 的卷积

前面说过循环卷积中除法也兼容

另外还有一道题用到二维\(DFT\)

\(Chef~and~Bike\)

后面附的是题解

最后直观感受一下循环卷积

技术图片

单位根反演和循环卷积

标签:ash   lol   fft   math   交换   oid   原因   感受   res   

原文地址:https://www.cnblogs.com/66t6/p/12289300.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!