快速沃尔什变换(FWT)介绍
快速沃尔什变换(FWT)介绍
众所周知,FFT可以有效地解决如下的问题
A=(a1,…,an)B=(b1,...,bn)C=(c1,...,cn)ck=∑i+j=kai∗bjA=(a_1,\dots,a_n)\\ B=(b_1,...,b_n)\\ C=(c_1,...,c_n)\\ c_k=\sum_{i+j=k}a_i*b_j\\ A=(a1,…,an)B=(b1,...,bn)C=(c1,...,cn)ck=i+j=k∑ai∗bj
但事实上,把求和号里的条件里的“+”换成与、或、异或、同或也可以有O(nlogn)O(n\log n)O(nlogn)时间复杂度的计算方法,这就是快速沃尔什变换(FWT)
鉴于与和或、异或和同或的处理方式比较相似,因此这里就重点分析或、异或这两种情况,另外两种只给结论
注:这里假设序列长度都是2k2^k2k(事实上必须补成这个样子)
或卷积
对于卷积来说,我们肯定希望最后变成元素积来进行运算,那么能够进行元素积的这个状态就是我们的目标,在FFT中这个目标状态是插值,而在或卷积中,我们要的目标状态是这样的
FWTor(A)[i]=∑i∣j=iaj(∗)FWT_{or}(A)[i]=\sum_{i|j=i}a_j\ \ (*) FWTor(A)[i]=i∣j=i∑aj (∗)
事实上就是对于i来说FWTor(A)[i]FWT_{or}(A)[i]FWTor(A)[i]就是i的子集的对应位置的和(请记住这一点)
很容易看出
FWTor(C)[i]=FWTor(A)[i]∗FWTor(B)[i]FWT_{or}(C)[i]=FWT_{or}(A)[i]*FWT_{or}(B)[i] FWTor(C)[i]=FWTor(A)[i]∗FWTor(B)[i]
(这里事实上没有证明这个C就是我们想要的C,但是这对我们目前的学习影响不太)
接下来就是如何去求FWTor(A)FWT_{or}(A)FWTor(A)了
先给一个结论
FWTor(A+B)=FWTor(A)+FWTor(B)FWT_{or}(A+B)=FWT_{or}(A)+FWT_{or}(B) FWTor(A+B)=FWTor(A)+FWTor(B)
这里的“+”是对应的元素相加
我们把A分成两半,记A0(前一半)和A1(后一半)然后我们有
FWTor(A)=(FWTor(A0),FWTor(A0+A1))FWT_{or}(A)=(FWT_{or}(A0),FWT_{or}(A0+A1)) FWTor(A)=(FWTor(A0),FWTor(A0+A1))
简单地解释一下,FWTor(A1)FWT_{or}(A1)FWTor(A1)无法对FWTor(A)FWT_{or}(A)FWTor(A)的前半部分造成影响,因为A1部分的下标肯定不是A0部分下标的子集,(*)式中j的最高位只能为0
而对于FWTor(A)FWT_{or}(A)FWTor(A)的后半部分,最高位为1,也就是说,(*)式中j的最高位可以取0或1,也就是后半部分要把FWTor(A1)FWT_{or}(A1)FWTor(A1)和FWTor(A0)FWT_{or}(A0)FWTor(A0)合并起来
(不知道有没有讲清楚,如果没有的话,建议多理解一下(*)式)
当然,逆变换也非常显然,就只用把高位加的FWTor(A0)FWT_{or}(A0)FWTor(A0)减掉就好了
UFWTor(B)=(UFWTor(B0),UFWTor(B0−B1))UFWT_{or}(B)=(UFWT_{or}(B0),UFWT_{or}(B0-B1)) UFWTor(B)=(UFWTor(B0),UFWTor(B0−B1))
与卷积
这里就只给三个公式,用或卷积里的替换一下就好了
(*)式:
FWTand(A)[i]=∑i&j=iaj(∗)FWT_{and}(A)[i]=\sum_{i\&j=i}a_j\ \ (*) FWTand(A)[i]=i&j=i∑aj (∗)
变换:
FWTand(A)=(FWTand(A0+A1),FWTand(A0))FWT_{and}(A)=(FWT_{and}(A0+A1),FWT_{and}(A0)) FWTand(A)=(FWTand(A0+A1),FWTand(A0))
逆变换:
UFWTand(B)=(UFWTand(B0−B1),UFWTand(B0))UFWT_{and}(B)=(UFWT_{and}(B0-B1),UFWT_{and}(B0)) UFWTand(B)=(UFWTand(B0−B1),UFWTand(B0))
异或卷积
异或卷积的目标状态比较复杂
FWTxor(A)[i]=∑cnt1(i&j)为偶数aj−∑cnt1(i&j)为奇数aj(∗)FWT_{xor}(A)[i]=\sum_{cnt1(i\&j)为偶数}a_j-\sum_{cnt1(i\&j)为奇数}a_j\ \ (*) FWTxor(A)[i]=cnt1(i&j)为偶数∑aj−cnt1(i&j)为奇数∑aj (∗)
cnt1()cnt1()cnt1()指二进制下1的个数
FWTxor(C)[i]=FWTxor(A)[i]∗FWTxor(B)[i]FWT_{xor}(C)[i]=FWT_{xor}(A)[i]*FWT_{xor}(B)[i] FWTxor(C)[i]=FWTxor(A)[i]∗FWTxor(B)[i]
上式乘积的正确性证明就让大家自己证啦(太长了Latex写不动)
变换的公式:
FWTxor(A)=(FWTxor(A0+A1),FWTxor(A0−A1))FWT_{xor}(A)=(FWT_{xor}(A0+A1),FWT_{xor}(A0-A1)) FWTxor(A)=(FWTxor(A0+A1),FWTxor(A0−A1))
理解:
对于前半部分来说,最高位补0对于FWTxor(A0),FWTxor(A1)FWT_{xor}(A0),FWT_{xor}(A1)FWTxor(A0),FWTxor(A1)来说不会影响(*)式中cnt1(i&j)cnt1(i\&j)cnt1(i&j)的奇偶性,所以可以直接相加作为前半部分的结果
对于后半部分来说FWTxor(A0)FWT_{xor}(A0)FWTxor(A0)最高位补1仍然不影响(*)式中cnt1(i&j)cnt1(i\&j)cnt1(i&j)的奇偶性(1&0还是0嘛),而FWTxor(A1)FWT_{xor}(A1)FWTxor(A1)的最高位补1会引入一个新的1,这会导致奇偶性翻转,所以后半部分就成了FWTxor(A0−A1)FWT_{xor}(A0-A1)FWTxor(A0−A1)
然后对于逆变换来说就是解个方程就得到了
UFWTxor(B)=(UFWTor(B0+B1)/2,UFWTor(B0−B1)/2)UFWT_{xor}(B)=(UFWT_{or}(B0+B1)/2,UFWT_{or}(B0-B1)/2) UFWTxor(B)=(UFWTor(B0+B1)/2,UFWTor(B0−B1)/2)
同或卷积
照着异或卷积魔改一下就好了(cnt1改成cnt0,&改成|之类的)
快速沃尔什变换(FWT)介绍相关推荐
- 快速沃尔什变换(FWT)
1前言 在之前学完了FFT稍微码了一些题.也学习了一下NTT相关的知识之后,我觉得有必要学习一下FWT,这篇博客就是阐述我对FWT的理解的 2介绍 2.1解决的问题 对于FFT,它的过程本质上是cn= ...
- 解题报告(一)快速沃尔什变换FWT(ACM / OI)超高质量题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...
- [学习笔记]快速沃尔什变换 (FWT)
FWT的简介 一般 FWT \text{FWT} FWT用来解决一下问题: C k = ∑ i ∣ j = k A i B j C_k=\sum_{i|j=k}A_iB_j Ck=∑i∣j=kAi ...
- 快速沃尔什变换(FWT)及K进制异或卷积快速子集变换(FST)讲解
前言: $FWT$是用来处理位运算(异或.与.或)卷积的一种变换.位运算卷积是什么?形如$f[i]=\sum\limits_{j\oplus k==i}^{ }g[j]*h[k]$的卷积形式(其中$\ ...
- 【learning】快速沃尔什变换FWT
问题描述 已知\(A(x)\)和\(B(x)\),\(C[i]=\sum\limits_{j\otimes k=i}A[j]*B[k]\),求\(C\) 其中\(\otimes\)是三种位运算的其中一 ...
- 快速沃尔什变换(FWT) 学习笔记
最近在做多校联赛的题目,发现有一道题需要用到FWT,于是我就去学了一下.膜拜一下大神,本篇博客仅对这篇博客进行一些细节上的补充. FWT要解决的问题是 Ck=∑i⊕j=kai∗bi {C}_{k}=\ ...
- 《小学生都能看懂的快速沃尔什变换从入门到升天教程》(FWT / FMT / FMI)(最最严谨清晰的证明!零基础也能得学会!)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 0x00 卷积 0x01 多项式 0x02 卷积的定义 0x03 卷积的基本性质 0x04 位运 ...
- 快速沃尔什变换(FWT)讲解 解决集合卷积的方法
由于某次CSDN更新,文章样式已经丢失,大量公式无法正常显示,本博客也不再维护. 请到快速沃尔什变换FWT查看,有更加完整的公式讲解. 能看到这篇博客的人,一定知道FWT是干什么的.(什么?你不知道? ...
- [多项式算法](Part 4)FWT 快速沃尔什变换 学习笔记
其他多项式算法传送门: [多项式算法](Part 1)FFT 快速傅里叶变换 学习笔记 [多项式算法](Part 2)NTT 快速数论变换 学习笔记 [多项式算法](Part 3)MTT 任意模数FF ...
- [模板] 快速沃尔什变换
快速沃尔什变换 快速沃尔什变换是求这样的式子: 对序列 \(A\), \(B\), 求序列 \(C\), 使得 \[ C_{i}=\sum_{j \oplus k} A_{j} B_{k} \] 其中 ...
最新文章
- Navicat连接数据库成功,新建查询时提示错误“Cannot create file ……”
- SAP 远程连接出错 SAP GUI For Windows 7.40 hostname ‘NiHLGetNodeAddr‘ unknown
- 解决vue项目eslint校验 Do not use ‘new‘ for side effects 的两种方法
- activemq - 浅析消息确认模式
- UA MATH563 概率论的数学基础 中心极限定理16 Kolmogorov 3-series定理
- linux 分区_Linux文件系统、逻辑分区、物理分区
- python中列表的sort方法_python中列表的sort方法使用详解
- MR程序的几种提交运行模式
- 简述网桥、网关、网卡之间的联系和区别
- 关于数据结构,这个重要概念不了解可不行
- three.js 笑脸雨
- 人群与网络:搜索引擎广告位的定价
- 提取网页中的href 爬虫_教你一步一步实现当当图书爬虫
- SQL常用字符串截取
- 松本行弘:Ruby之父佳作松本行弘的程序世界
- android GPS开发
- 联想贺志强:联想专利其实很牛 只是你不知道
- 关于CSS Reset 于Normalize.css
- Unity小地图的实现
- 淘宝图片指纹匹配功能c#实现