单位根反演和循环卷积
Posted 66t6
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单位根反演和循环卷积相关的知识,希望对你有一定的参考价值。
这是(FFT)涉及到的一(两)个小知识
单位根反演
单位根
如果一个数(x),对(forall 1le i<n)有(x^i e 1)且(x^n=1)则(x)称为(n)次单位根
此定义在复数,膜意义下都是良定义
求和引理
([k|n]=frac{1}{k}sumlimits_{i=0}^{k-1}w_k^{in})
在前面已经有过证明
例题
(mathtt{BSOJ1683}):求给出素数(p)和(k)满足(k|p-1)求(displaystyle{sum_{i=0}^n [k|i]inom{n}{i}F_imod p})
[sum_{i=0}^n [k|i]inom{n}{i}F_imod p
=sum_{i=0}^n frac{1}{k}sum_{j=0}^{k-1}omega_k^{ij}inom{n}{i}F_imod p]
因为我们知道(A=egin{bmatrix}1&11&0end{bmatrix},A^n)可以代表(F_n)同时具有关于数乘的结合律交换律
[
=frac{1}{k}sum_{j=0}^{k-1}sum_{i=0}^ninom{n}{i}left(omega_k^jA
ight)^i
=frac{1}{k}sum_{j=0}^{k-1}left(I+omega_k^jA
ight)^i
]
有(I+omega_k^jA=egin{bmatrix}omega_k^j+1&omega_k^jomega_k^j&1end{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+jequiv kpmod n])
问题变得诡异起来,( ext{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(nlg n))的分治乘法
性质
循环卷积那么难求,相对应的,性质却很好
对于正常的(DFT),点值表达式的快速幂不等价于多项式的快速幂因为你取的点值少了,除法也是类似的原因
而对于循环卷积,这个问题不复存在,两种多项式上的操作都可以嫁接到点值表达式上
例题
非常少,这是一道强行拼凑的题
(mathtt{BSOJ5287}):对(pA=q)给出循环矩阵(A)和向量(q)求向量(p)
首先有一个结论:循环矩阵作用在一个向量上就相当于对这个向量为系数表示的多项式做循环卷积
具体的(A_{i,j}=a_{i+j~mod~ n})
(y_i=sumlimits_{j}A_{i,j}x_j=sumlimits_j a_{i+j~mod~n}x_j)
这是下标差为定值卷积,翻转 的卷积
前面说过循环卷积中除法也兼容
另外还有一道题用到二维(DFT)
后面附的是题解
最后直观感受一下循环卷积
以上是关于单位根反演和循环卷积的主要内容,如果未能解决你的问题,请参考以下文章