原根和循环卷积 2016国家集训队论文集—再探快速傅里叶变换

原根和循环卷积\(\ \ \ 2016\)国家集训队论文集—再探快速傅里叶变换

这个连原根都不明白的屑来补坑了


原根

\(:\)

\(m>1,\gcd(a,m)=1,\)那么最小的\(r\)满足\(a^r=1(\mod m)\)称为\(r\)\(a\)\(\mod m\)意义下的阶,记为\(\delta_m(a)\)

有关定理\(:\)

\(1.\)\(m>1,\)并且\(\gcd(a,m)=1,\)又有\(a^n=1(\mod m),\)\(\delta_m(a)|n\),较为显然,\(1\times 1\times 1...=1\)

\(2.\delta_m(a)|\phi(m)\)易证

\(a^{\delta_m(a)}=1(\mod m),a^{\phi(m)}=1(\mod m)\)

原根\(:\)(至于怎么求暴力就好了,原根是\(3\)的就很多)
\(a\)的阶等于\(\phi(m),a\)就是原根

有关定理\(:\)

\(1.\)\(m=2,4,p^k,2\times p^k\)存在原根

\(2.\)每一个素数\(p\)都有\(\phi(p-1)\)个原根,每一个数都有\(\phi(\phi(m))\)个原根

\(3.\)\(g\)\(m\)的一个原根,则\(g,g^2,...g^{\phi(m)}\)对于\(m\)取模就是与\(m\)互质数的排列

主要是下午看到一个神奇的东西,模意义下对数等于模数变为原根


这个屑连循环卷积都不会

循环卷积

先考虑一般的线性卷积

\(f[i]=\sum_{j=0}^i a[j]\times b[i-j]\)到现在,我这个再不会就可以退役了...

时间还够,那就通读一遍论文吧

卷积的定义

\(c_r=\sum[(p+q)\mod n=r]a_pb_q\)

首先设\(w^n=1,n\)是最小的使得\(w^n=1\)的数

可以得到\(\frac{1}{n}\sum_{k=0}^{n-1}w^{vk}=[v\mod n=0]\)

如果是\(n\)的倍数,每个都是\(1\),否则每个都能互相消掉

那么

\([(p+q)\mod n=r]\)

\(=[(p+q-r)\mod n=0]\)

\(=\frac{1}{n}\sum_{k=0}^{n-1}w^{(p+q-r)k}\)

带回原式

\(c_r=\sum_{p,q}\frac{1}{n}\sum_{k=0}^{n-1}w^{(p+q-r)k}a_p b_q\)

\(\frac{1}{n}\sum_{k=0}^{n-1}w^{-rk}\sum_pw^{pk}a_p\sum_qw^{qk}b_q\)

我们可以得到两种式子

\(a_m=\sum_{k=0}^{n-1}w^{mk}b_k\)

\(c_m=\frac{1}{n}\sum_{k=0}^{n-1}w^{-mk}d_k\)

设多项式\(A(x)=\sum_{k=0}^{n-1}b_kx^k\)

\(A(w^m)=\sum_{k=0}^{n-1}b_kw^{mk}=a_m\)

我们现在知道\(b_k\)系数,可以求得当前值下的权值,系数表示法就成功转化为点值表示法

现在开始今天的重点,循环卷积

还是考虑我们的式子的\(\mod n\)不能忽略,就很不好写了

\(a_m=\sum_{k=0}^{n-1}w^{mk}b_k\)

\(=\sum_{k=0}^{n-1}w^{\frac{-(m-k)^2+m^2+k^2}{2}}b_k\)

\(=w^{-\frac{m^2}{2}}\sum_{k=0}^{n-1}w^{-\frac{(m-k)^2}{2}}w^{-\frac{k^2}{2}}b_k\)

我们把这个式子化成了卷积形式,也就是说可以用卷积实现\(DFT\)

我们设\(B_i=w^\frac{-{(i-n)^2}}{2}\)

原式可化为

\(a_m=w^{-\frac{m^2}{2}}\sum_{k=0}^{n-1}B_{m-k+n}B_{k+n}b_k\)

就可以卷积了

所以说,我们只需要对于这个东西,按\(FFT\)一样卷积一下,就得到了结果

下面废弃

就是一堆式子\(a\times b(x^{i\mod n})\times c(x^{i\mod n})\)

就是卷积完之后下标都变成\(i\mod n\)

这个东西可以使用\(Bluestein\)算法,都不讲人话...

看看论文吧...(毕竟我没找到一个我能看明白的博客)

大概式子长这样

\(a\times b(\mod n)\)就是把上标全部\(\mod n\)得到解

还是从最暴力方向考虑,直接暴力做一遍\(FFT,\)然后把对应项取模后加到相应位置就好了

这是做一次循环卷积,好多次就直接\(TLE\)

我们考虑能不能直接做长度为\(n\)\(DFT\)

\(upd(3.30)\)

任意模数多项式乘法\(MTT\)

当多项式乘法不是\(998244353\)这个模数的时候,需要一些其他的办法

考虑两种方法,虽然说拆系数\(FFT\)(目前)可以完全代替三模数\(NTT,\)(在\(py\)由于自带高精类,其实\(NTT\)会更有前途)但是别人都会...我也得会是吧

\(sol_1:\)三模数\(NTT\)

中国剩余定理定理,我们可以唯一确定最小的满足三个模数

而且我们这个求出来的数字的模数达到了\(10^{23},\)那么这个数在\(\mod10^{23}\)确定了最小值,答案也必然是最小值了

\(sol_2:\)拆系数\(FFT\)

我们定一个\(M\)

把两个数列的数字拆成

\(x=k\times M+b\)的形式

我们拆完之后两两进行\(FFT,\)然后加起来就好了,精度很安全

加一些优化方法,可以把\(DFT\)次数降到\(4\)

posted @ 2022-03-27 20:51  Authentic_k  阅读(76)  评论(0编辑  收藏  举报