FWT - 快速沃尔什变换
FWT - 快速沃尔什变换
更好的阅读体验戳此进入
(建议您从上方链接进入我的个人网站查看此 Blog,在 Luogu 中图片会被墙掉,部分 Markdown 也会失效)
题外话:写 COCI 的一道题的时候发现需要用到
进制 FWT,然后来填 FWT 的坑,然后发现 也是 FMT,然后又发现 FMT 我也不会,于是准备在挖个坑,以后有时间也补一下 FMT ...
这里额外说一下对于多项式约定俗成的几种运算表示什么
相信你们一定都知道这里我们假设
最高次为 次, 最高次为 次。 令
。
目的
FWT(快速沃尔什变换)一般用于处理形如如下式子的卷积:
此处的
思路
与大多数多项式快速变换的思路一样,我们的目的都是找到一种变换,对于 FWT 可以考虑记作:
我们需要让这个变换满足以下性质:
且:
对于不同的运算都有着与之对应的不同的变换方式,我们的目的就是要找到一种优秀的变换并快速地进行变换。
或卷积
或卷积和与卷积应该算是 FWT 和 FMT 的交集了吧,我们这里为了方便理解亦或卷积所以也要讲一下或和与卷积。
显然式子如下:
或者记作:
一些定义
这里我们定义 FWT 正变换为:
可以理解为下标的子集求和,而对于下标子集这个概念,也就是二进制上的子集,如
定义
一些性质与证明
显然有如下性质:
证明也很简单,考虑将每一位分别考虑:
显然我们可以得到如下的递归式子:
证明:
首先明确一下,多项式的项数为
我们可以考虑按二进制来观察
所以我们就能发现,
于是显然,
还有一个性质,即我们这个变换之后的式子是可以按位乘的。
证明:
有一种感性理解的证明方法,仔细思考了一下感觉挺正确的,这里也写一下:
感性理解其实很简单,
记录的是 的子集之和, 也是,那么他们相乘,其实就是双方子集中的每一个元素两两相乘,取出来的两个元素的下标或起来一定还是 的子集中的一个,由于 记录的是下标或起来为 的乘积之和,那么全部乘完之后,我们不仅得到了 ,还得到了 的所有子集的 ,也就是 。
严格证明:
而对于 FWT 的逆运算,即 IFWT,仅需要把加法变成减法即可,即:
证明很简单,根据
Code
//TODO
与卷积
和或卷积几乎一样,求的是:
定义:
有递归式子:
Code:
//TODO
异或卷积
异或卷积才是真正的 FWT 内容。
Tips: 这里建议如果下面的内容不太理解可以直接翻到下面,从矩阵的角度去思考,我个人感觉多项式这里如果能把矩阵理解透了,从转移矩阵去考虑,才会发现多项式美妙在哪里,而且整个推导过程很合理直观!
显然异或卷积求的式子为如下:(
一些“人类智慧”的定义
令
然后下面这个定义特别离谱
对于异或运算,由前人的智慧我们可知有如下的 FWT 变换:
或记作:
看着就很离谱而且和异或没有关系,这个东西也确实很离谱,后面会进行证明。
此时我们考虑,为了更快速地算出结果,
并且有如下递归公式:
这个看起来也很奇怪,如果实在不明白为什么会有这种思路也可以考再去看看与和或的卷积看完,难度上要比异或好理解。
一些离谱的证明
对于递推公式的证明:
首先
依然考虑最高位,显然对于
对于 $ FWT(A)1
对于这个运算可以按位乘的证明,我认为比较离谱,如果从矩阵的角度考虑更好理解一些,所以标准的方法这里就咕掉了,具体的证明会在后文提到。
然后逆运算大概这样,和之前与和或的区别不大,同理证明。
Code
//TODO
进制与卷积和或卷积
这个网上似乎没有说的,有的也只是一句话,我感性理解了一下,似乎和二进制的差不多?把包含的定义感性理解为每一位都小于,应该就可以解决了吧(这个不保证正确性,也没找到合适的例题)
upd - 然后再某篇文章里看到了这样一句话,验证了猜想的正确性。
由于
进制下,FMT 仍然能解决或卷积以及和卷积,因此 FWT 一般用来解决异或卷积。
进制异或卷积
众所周知,
进制异或指的是,按照 进制每一位相加后 。(可以感性理解为不进位的 进制加法)
进制与运算指的是,按照 进制相乘后 ,(不进位的 进制乘法)
进制与和或运算也可以理解为,按位取 或 。
进制的求 指的是二进制每一位求和后 。
单位根?
对于二进制的异或,我们选取的底数为
然而这里我们发现对于这个东西,似乎很难理解,这里我们全部重头再来,从矩阵的角度再次思考。
再看目的与思路
如果用矩阵的角度取思考,我们可以想到,对于任意一个 FWT 变换我们可以设存在一个矩阵
而我们就是要找到这样一个矩阵
再看二进制异或卷积
与卷积和或卷积比较好理解就不说了,我们直接考虑异或卷积。
我们考虑令矩阵
将我们的目标式子进行如下转化:
考虑我们要构造什么?显然是要上面的式子求出满足
观察这个式子不难看出我们要构造的矩阵需要满足:
这样式子就能转化为:
于是发现,我们想要的最终式子出现了!
然后我们考虑如何快速求,显然与之前的思路类似,进行递归。
首先我们知道了
显然按位拆分后,异或起来值不变,所以我们可以将按位拆分的式子更严谨地写成如下:
进行如下定义:
定义
定义
考虑进行如下推导:
Tips: 对于这个
解释一下最后两步变换。
对于前后两部分的下标,显然前者所有项最高位一定为
对于第四步,简单观察即可发现很显然,于是我们便可以将其进行递归,可以通过主定理计算复杂度:
现在,唯一的问题就是如何构造这个矩阵
对于二进制下的异或,我们只需要构造一个
即:
其需要满足以下性质:
因为需要有逆,所以需要矩阵的秩为
于是可以考虑到如下矩阵:
矩阵求逆的方法这里不再赘述,到此我们就解决了 FWT 二进制异或卷积。
//TODO
回到 进制
如果是从矩阵的角度解决二进制,我们仔细想一下就会发现,在矩阵的意义上,
我们同样目的是构造:
此时多项式项数一定为
而我们依然考虑将
定义
将
于是和之前思路一样,有:
通过主定理计算时间复杂度:
考虑
或写成:
此时我们再考虑单位根,便可发现可以构造如下的
观察发现这个矩阵显然符合我们的要求,且我们在 FFT 的时候就用过这个矩阵,且其存在逆矩阵,为:
然后这个矩阵似乎叫范德蒙德矩阵(不会)
至此,我们终于完成了
Code
//TODO
Luogu 模板题
P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT)
Code
//TODO
进制 FWT 题
【清华集训2016】石家庄的工人阶级队伍比较坚强
[LG-P7930 [COCI2021-2022#1] Set](P7930 [COCI2021-2022#1] Set)
嗯这道题就是梦开始的地方
写在后面
关于 FWT 仍然有很多扩展,比如在模意义下考虑单位根不存在,然后进行扩域等一系列看不懂的操作,比如这个链接。
以及
只能说学无止境吧,以后有时间再去研究研究。
UPD
update-2022_09_01 与和或完成
update-2022_09_02 初稿
本文作者:Tsawke
本文链接:https://www.cnblogs.com/tsawke/p/16710306.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步