快速沃尔什变换(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(nlog⁡n)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)介绍相关推荐

  1. 快速沃尔什变换(FWT)

    1前言 在之前学完了FFT稍微码了一些题.也学习了一下NTT相关的知识之后,我觉得有必要学习一下FWT,这篇博客就是阐述我对FWT的理解的 2介绍 2.1解决的问题 对于FFT,它的过程本质上是cn= ...

  2. 解题报告(一)快速沃尔什变换FWT(ACM / OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  3. [学习笔记]快速沃尔什变换 (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=k​Ai ...

  4. 快速沃尔什变换(FWT)及K进制异或卷积快速子集变换(FST)讲解

    前言: $FWT$是用来处理位运算(异或.与.或)卷积的一种变换.位运算卷积是什么?形如$f[i]=\sum\limits_{j\oplus k==i}^{ }g[j]*h[k]$的卷积形式(其中$\ ...

  5. 【learning】快速沃尔什变换FWT

    问题描述 已知\(A(x)\)和\(B(x)\),\(C[i]=\sum\limits_{j\otimes k=i}A[j]*B[k]\),求\(C\) 其中\(\otimes\)是三种位运算的其中一 ...

  6. 快速沃尔什变换(FWT) 学习笔记

    最近在做多校联赛的题目,发现有一道题需要用到FWT,于是我就去学了一下.膜拜一下大神,本篇博客仅对这篇博客进行一些细节上的补充. FWT要解决的问题是 Ck=∑i⊕j=kai∗bi {C}_{k}=\ ...

  7. 《小学生都能看懂的快速沃尔什变换从入门到升天教程》(FWT / FMT / FMI)(最最严谨清晰的证明!零基础也能得学会!)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 0x00 卷积 0x01 多项式 0x02 卷积的定义 0x03 卷积的基本性质 0x04 位运 ...

  8. 快速沃尔什变换(FWT)讲解 解决集合卷积的方法

    由于某次CSDN更新,文章样式已经丢失,大量公式无法正常显示,本博客也不再维护. 请到快速沃尔什变换FWT查看,有更加完整的公式讲解. 能看到这篇博客的人,一定知道FWT是干什么的.(什么?你不知道? ...

  9. [多项式算法](Part 4)FWT 快速沃尔什变换 学习笔记

    其他多项式算法传送门: [多项式算法](Part 1)FFT 快速傅里叶变换 学习笔记 [多项式算法](Part 2)NTT 快速数论变换 学习笔记 [多项式算法](Part 3)MTT 任意模数FF ...

  10. [模板] 快速沃尔什变换

    快速沃尔什变换 快速沃尔什变换是求这样的式子: 对序列 \(A\), \(B\), 求序列 \(C\), 使得 \[ C_{i}=\sum_{j \oplus k} A_{j} B_{k} \] 其中 ...

最新文章

  1. Navicat连接数据库成功,新建查询时提示错误“Cannot create file ……”
  2. SAP 远程连接出错 SAP GUI For Windows 7.40 hostname ‘NiHLGetNodeAddr‘ unknown
  3. 解决vue项目eslint校验 Do not use ‘new‘ for side effects 的两种方法
  4. activemq - 浅析消息确认模式
  5. UA MATH563 概率论的数学基础 中心极限定理16 Kolmogorov 3-series定理
  6. linux 分区_Linux文件系统、逻辑分区、物理分区
  7. python中列表的sort方法_python中列表的sort方法使用详解
  8. MR程序的几种提交运行模式
  9. 简述网桥、网关、网卡之间的联系和区别
  10. 关于数据结构,这个重要概念不了解可不行
  11. three.js 笑脸雨
  12. 人群与网络:搜索引擎广告位的定价
  13. 提取网页中的href 爬虫_教你一步一步实现当当图书爬虫
  14. SQL常用字符串截取
  15. 松本行弘:Ruby之父佳作松本行弘的程序世界
  16. android GPS开发
  17. 联想贺志强:联想专利其实很牛 只是你不知道
  18. 关于CSS Reset 于Normalize.css
  19. Unity小地图的实现
  20. 淘宝图片指纹匹配功能c#实现

热门文章

  1. 扎克伯格成功的六大因素
  2. 如何使用计算机文件共享,win7两台电脑用一根网线怎么共享文件
  3. 高数解题神器:拍照上传就出答案,这个中国学霸做的AI厉害了 | Demo
  4. 抖音生肖号项目评估,具体操作流程拆解,如何变现?
  5. 海姆立克急救法怎么做?最全必学急救知识看这里,关键时刻救你命!
  6. 3D全景特点展现,深入解读3D全景被追捧原因
  7. 【Tool】CRC8 校验计算 X8 + X2 + X + 1
  8. 证据理论:真相永远只有一个!
  9. html和css制作圣诞树
  10. 简单使用MenuItem特性