首页 > 其他分享 >卷积全家桶

卷积全家桶

时间:2024-08-04 16:40:47浏览次数:6  
标签:dotsi frac 卷积 text FFT 全家 notag omega

卷积全家桶

FFT 快速傅里叶变换

应用场景:

有\(2^n-1\)次多项式\(f(x),g(x)\),求多项式\(f(x)g(x)\)的各项系数.

换言之,有长为\(2^n\)数组\(f,g\),(下标从\(0\)开始),求长为\(2^{n+1}-1\)数组\(h\)满足\(h_i=\sum_{j=0}^{i}f_jg_{i-j}\)(超出\(f,g\)下标范围的地方用\(0\)补全).

在下面的推导中,我们用\(n\)代替\(2^n\).约定用\(f_i\)表示多项式\(f\)的\(i\)次项系数,\(f(x)\)表示在\(x\)处多项式\(f\)的值.

单位根及其性质

让我们考察方程\(x^n=1\)的解的特点.注意到在实数域内解的性质随\(n\)的变化千奇百怪,因此我们在复数域内考虑这个问题.我们用模长和幅角去描述一个复数,就可以注意到\(|x|=1,n\theta=2k\pi(k\in \mathbb{Z})\),为了简便,我们约定\(k=1\),这样我们发现\(x=e^{i\frac{2\pi}{n}}=\cos\frac{2\pi}{n}+i\sin\frac{2\pi}{n}\)是最简便的一个解.

我们定义\(n\)阶单位根\(\omega_n=\cos\frac{2\pi}{n}+i\sin\frac{2\pi}{n}\).

性质1:由定义,发现\(\omega_1^1=1,\omega_2^1=-1\).

性质2:由定义,发现\(\omega_n^k=e^{\frac{2\pi k}{n}i}\)只与\(\frac{k}{n}\)有关,因此\(\omega_{pn}^{pk}=\omega_n^k\).

性质3:由于在复数坐标系中,\(\omega_n^0,\omega_n^1,\dotsi,\omega_n^{n-1}\)的终点成一个正多边形,由对称性,这些向量的和为零向量.也即:\(\sum_{i=0}^{n-1}\omega_n^i=0\)

FFT/IFFT 的过程

我们设\(\text{FFT}(f)_i=f(\omega_n^i)\).我们将\(f\)按照下标的奇偶性分成两半:

\[\begin{align} f(\omega_n^i) & =f_0\omega_n^{0*i}+f_1\omega_n^{1*i}+f_2\omega_n^{2*i}+\dotsi +f_{n-2}\omega_n^{(n-2)*i}+f_{n-1}\omega_n^{(n-1)*i} \notag \\ & =(f_0\omega_n^{0*i}+f_2\omega_n^{2*i}+\dotsi +f_{n-2}\omega_n^{(n-2)*i})+(f_1\omega_n^{1*i}+f_3\omega_n^{3*i}+\dotsi+f_{n-1}\omega_n^{(n-1)*i}) \notag \\ & = (f_0\omega_n^{0*i}+f_2\omega_n^{2*i}+\dotsi +f_{n-2}\omega_n^{(n-2)*i})+\omega_n^{i}(f_1\omega_n^{0*i}+f_3\omega_n^{2*i}+\dotsi+f_{n-1}\omega_n^{(n-2)*i}) \notag \\ & = (f_0\omega_\frac{n}{2}^{0*i}+f_2\omega_\frac{n}{2}^{1*i}+\dotsi +f_{n-2}\omega_\frac{n}{2}^{(\frac{n}{2}-1)*i})+\omega_n^{i}(f_1\omega_\frac{n}{2}^{0*i}+f_3\omega_\frac{n}{2}^{1*i}+\dotsi+f_{n-1}\omega_\frac{n}{2}^{(\frac{n}{2}-1)*i}) \notag \\ & = f_L(\omega_\frac{n}{2}^i)+\omega_n^{i}f_R(\omega_\frac{n}{2}^i) \notag \\ \end{align} \]

则有:

\[f(\omega_n^i) = f_L(\omega_\frac{n}{2}^i)+\omega_n^{i}f_R(\omega_\frac{n}{2}^i) (i<\frac{n}{2}) \\ f(\omega_n^i) = f_L(\omega_\frac{n}{2}^{i-\frac{n}{2}})-\omega_n^{i-\frac{n}{2}}f_R(\omega_\frac{n}{2}^{i-\frac{n}{2}}) (i\geq \frac{n}{2}) \\ \]

观察到这是一个分治结构,因此我们可以递归解决这个问题,也可以倍增的迭代式解决问题.

由多项式乘法定义,不难观察到:

\[\text{FFT}(h)_i=h(\omega_n^i)=f(\omega_n^i)g(\omega_n^i)=\text{FFT}(f)_i\text{FFT}(g)_i \]

也就是说,我们把\(f\)和\(g\)做FFT的结果对应相乘,就能得到\(h\)的FFT.那么如何通过\(\text{FFT}(h)\)还原回\(h\)呢?

我们用矩阵考虑这个问题.我们把一个多项式\(f\)的系数和\(\text{FFT}(f)\)的结果都描述为一个列向量,令矩阵\(A\)为\(n\)阶方阵,且\(A_{i,j}=\omega_n^{ij}\),发现:\(\text{FFT}(f)=A*\mathbb{f}\). 因此,我们只要找出\(A\)的逆矩阵\(A^{-1}\),就可以实现IFFT.

给出结论:若\(B_{i,j}=\frac{\omega_n^{-ij}}{n}\),则\(A*B=I_n\).证明:

\[\begin{align} (A*B)_{i,j} & =\sum_{k=0}^{n-1}A_{i,k}B_{k,j} \notag \\ & = \sum_{k=0}^{n-1}\omega_n^{ik}\frac{\omega_n^{-kj}}{n} \notag \\ & = \frac{1}{n}\sum_{k=0}^{n-1}\omega_n^{(i-j)k} \notag \\ \end{align} \]

我们发现,上面式子当\(i=j\)时,\((A*B)_{i,j}\)显然为\(1\),余下情况中,我们不妨设\(m=i-j(i>j)\)

\[\begin{align} (A*B)_{i,j} & = \frac{1}{n}\sum_{k=0}^{n-1}\omega_n^{(i-j)k} \notag \\ & = \frac{1}{n}\sum_{k=0}^{n-1}\omega_n^{mk \mod n} \notag \\ & = \frac{(m,n)}{n} \sum_{k=0}^{\frac{n}{(m,n)} -1}\omega_{\frac{n}{(m,n)}}^{k} \notag \\ & = 0 \notag \\ \end{align} \]

综上,\((A*B)_{i,j}=[i=j],B=A^{-1}\).实际上,我们可以忽略掉矩阵中除以\(n\)的系数,在最后的结果处除以\(n\)即可.

\[\begin{align} \text{IFFT}(f)_i & =f_0\omega_n^{-0*i}+f_1\omega_n^{-1*i}+f_2\omega_n^{-2*i}+\dotsi +f_{n-2}\omega_n^{-(n-2)*i}+f_{n-1}\omega_n^{-(n-1)*i} \notag \\ & =(f_0\omega_n^{-0*i}+f_2\omega_n^{-2*i}+\dotsi +f_{n-2}\omega_n^{-(n-2)*i})+(f_1\omega_n^{-1*i}+f_3\omega_n^{-3*i}+\dotsi+f_{n-1}\omega_n^{-(n-1)*i}) \notag \\ & = (f_0\omega_n^{-0*i}+f_2\omega_n^{-2*i}+\dotsi +f_{n-2}\omega_n^{-(n-2)*i})+\omega_n^{-i}(f_1\omega_n^{-0*i}+f_3\omega_n^{-2*i}+\dotsi+f_{n-1}\omega_n^{-(n-2)*i}) \notag \\ & = (f_0\omega_\frac{n}{2}^{-0*i}+f_2\omega_\frac{n}{2}^{-1*i}+\dotsi +f_{n-2}\omega_\frac{n}{2}^{-(\frac{n}{2}-1)*i})+\omega_n^{-i}(f_1\omega_\frac{n}{2}^{-0*i}+f_3\omega_\frac{n}{2}^{-1*i}+\dotsi+f_{n-1}\omega_\frac{n}{2}^{-(\frac{n}{2}-1)*i}) \notag \\ & = \text{IFFT}(f_L)_i + \omega_n^{-i}*\text{IFFT}(f_R)_i \notag \\ \end{align} \]

则有:

\[\text{IFFT}(f)_i= \text{IFFT}(f_L)_i + \omega_n^{-i}*\text{IFFT}(f_R)_i \ \ (i<\frac{n}{2}) \\ \text{IFFT}(f)_i= \text{IFFT}(f_L)_{i-\frac{n}{2}} - \omega_n^{-(i-\frac{n}{2})}*\text{IFFT}(f_R)_{i-\frac{n}{2}} \ \ (i\geq\frac{n}{2}) \]

这与FFT有类似的分治结构,我们只需要把系数取倒数,最后结果除以\(n\)即可,总复杂度\(O(n \log n)\).

FWT 快速沃尔什变换

有时我们需要对下标做位运算的卷积,也即:

\[h_i=\sum_{p\oplus q=i}f_pg_q \]

其中\(\oplus\)可以是按位或,按位与,按位异或中的一种.

与FFT的想法类似,我们数列到数列的映射\(\text{FWT}\),使得对任意\(i\in[0,n)\)有\(\text{FWT}(h)_i=\text{FWT}(f)_i\text{FWT}(g)_i\)成立.

对于或运算而言,我们构造\(\text{FWT}(f)_i=\sum_{j\in i}f_j\)即可.

对于与运算而言,我们构造\(\text{FWT}(f)_i=\sum_{i\in j}f_j\)即可.

对于异或运算而言,我们构造\(\text{FWT}(f)_i=\sum_{j = 0}^{n-1}f_j*(-1)^{\#(i\&j)}\)即可.

我们按照实际含义去思考如何递归处理FWT和IFWT都是不难的.

我们也可以从递归时前/后半段结果对答案贡献时的矩阵来考虑FWT.可以证明,只需构造一个\(2\times2\)的矩阵\(c\)使得\(c_{i,j\oplus k}=c_{i,j}c_{i,k}\),且\(c\)的逆矩阵存在即可,这种方法不多赘述.

子集卷积

有时我们需要解决\(h_i=\sum_{(p \cup q = i) \wedge (p \cap q = \emptyset)}f_pg_q\),发现交集为空并不好做,但是发现\((p \cup q = i) \wedge (p \cap q = \emptyset) \Leftrightarrow (p \cup q = i) \wedge \#\{p\}+\#\{q\}=\#\{i\}\)
,就可以想到从集合大小的角度来解决问题.我们构造\(FWT_k(h)_i=\sum_{j\in i \wedge\#\{j\}=k}h_j\),就可以发现\(FWT_k(h)_i=FWT_k(f)_iFWT_k(g)_i\)类似前面做卷积就可以了,复杂度\(O(n\log^2n)\).

NTT 快速数论变换

有时我们需要解决FFT的问题,但是我们又对精度有要求/需要在模意义下解决问题时,就需要使用NTT.

实际上,浮点数运算是复数不可避免的问题,那我们需要构造一个什么样的\(\omega\)呢?

我们约束模数是一个质数\(p\).我们需要构造一个\(\omega_n\)使得\(\omega_n^i \mod p\)各不相同(\(i\in[0,n)\)),并且\(\omega_n^n \equiv 1 \mod p\)成立.考虑到上述第一个条件,我们去考虑原根\(g\).由于\(g^{p-1} \equiv 1\)成立,因此我们需要让\(\omega_n=g^{\frac{p-1}{n}}\),替换掉FFT中的单位根就可以解决问题了.

由于上式中需要有\(n | (p-1)\)成立,而\(n=2^l\),因此\(p-1\)中需要含有较多质因子\(2\).因此有一些质数是不适合作为NTT模数的.

\(p=998244353=119*2^{23}+1,g=3\)是一组常见的质数/原根.

标签:dotsi,frac,卷积,text,FFT,全家,notag,omega
From: https://www.cnblogs.com/snowycat1234/p/18341921

相关文章

  • Pytorch笔记|小土堆|P16-22|神经网络基本骨架、卷积层、池化层、非线性激活层、归一化
    torch.nnContainers是神经网络骨架,含6个类,最常用的是Module——BaseclassforallNNmodulesModule所有神经网络模型(子类)都必须继承Module(父类),Module相当于给所有的神经网络提供了模板,但可进行修改官方示例:importtorch.nnasnnimporttorch.nn.functionalasFclass......
  • 二维计算几何全家桶
    快网络赛了但是计算几何还一点不会,所以最近狠狠恶补了一下计算几何的知识,但是由于本人实力有限,暂时还没有学会三维的计算几何,所以本文只介绍二维计算几何中一些比较常用到的知识符号函数符号函数是计算几何中经常用到的一个函数,它虽然很简单,但是在帮助我们判断几何中的位置和方......
  • 深入探索EPSA:提升卷积神经网络性能的新式注意力模块
     原论文地址:https://arxiv.org/abs/2105.14447摘要摘要部分提出了一种新的注意力模块——金字塔分割注意力(PSA)模块,该模块通过替代ResNet瓶颈块中的3x3卷积,显著提升了模型性能。PSA模块能够作为即插即用组件,增强网络的多尺度表征能力,使EPSANet在多个计算机视觉任务上超越了......
  • 【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+
    一、项目介绍眼疾识别系统,使用Python作为主要编程语言进行开发,基于深度学习等技术使用TensorFlow搭建ResNet50卷积神经网络算法,通过对眼疾图片4种数据集进行训练('白内障','糖尿病性视网膜病变','青光眼','正常'),最终得到一个识别精确度较高的模型。然后使用Django框架开发Web网......
  • 通过颜色反卷积进行组织化学染色的定量分析
    颜色反卷积(ColorDeconvolution)是免疫组织化学(Immunohistochemistry,IHC)和其他组织染色技术中常用的一种图像分析方法。它被用来从复合染色图像中分离出单独的染色成分,以便进行更精确的定量分析。这种方法特别适用于多重染色实验,其中不同的染色标记使用不同的颜色,如DAB(二氨基......
  • 神经网络之卷积篇:详解计算机视觉(Computer vision)
    详解计算机视觉计算机视觉是一个飞速发展的一个领域,这多亏了深度学习。深度学习与计算机视觉可以帮助汽车,查明周围的行人和汽车,并帮助汽车避开它们。还使得人脸识别技术变得更加效率和精准,即将能够体验到或早已体验过仅仅通过刷脸就能解锁手机或者门锁。当解锁了手机,猜手机上一定......
  • 位运算卷积学习笔记
    位运算卷积学习笔记位运算卷积,即快速沃尔什变换\(\text{FWT}\)和快速莫比乌斯变换\(\text{FMT}\),但事实上最常用的是\(\text{FWT}\),因为\(\text{FMT}\)所求解的内容是\(\text{FWT}\)的子集。位运算卷积首先要知道位运算卷积指的是\[c_i=\sum_{j\odotk=i}a_jb_k\]形......
  • 数论函数集与狄利克雷卷积在群论上的证明
    狄利克雷卷积\((f*g)(n)=\sum\limits_{d|n}f(d)g(\dfrac{n}{d})\)。数论函数集上的运算将函数加法视为数论函数集上的加法,狄利克雷卷积视为乘法,则\((G,+,*)\)是一个整环。\((G,+)\)是阿贝尔群封闭性、结合律、交换律是显然的。单位元是常数函数\(f(x)=0\),逆元显然存在。......
  • Adobe2024全家桶免费安装包下载路径+方法教程
    Adobe发布了其全家桶的最新版本Adobe2024。Adobe全家桶是一组由AdobeSystems开发和发行的图形设计、影像编辑与网络开发的软件产品套装,包括图像编辑软件Photoshop、矢量图形设计软件Illustrator等多款知名软件。Adobe全家桶的更新不仅意味着新功能的增加和性能的提升,也预示着......
  • Adobe2024全家桶下载+详细安装教程
    “我电脑里安装了20多个Adobe软件,但真正用到的只有PS。”近日,有网友在社交平台发帖称,自己的电脑里安装了大量Adobe软件,但实际上只经常使用Photoshop。对此,有其他网友回复道:“你这是买椟还珠,Adobe全家桶里有很多宝藏工具,比如AE、PR、AU等。”Adobe全家桶永久免费领取入口:http......