首页 > 其他分享 >FWT 快速沃尔什变换学习笔记

FWT 快速沃尔什变换学习笔记

时间:2023-02-14 19:24:17浏览次数:48  
标签:xor text sum 笔记 merge 沃尔什 FWT oplus

\(\text{FWT}\) 快速沃尔什变换

给定两个序列 \(a,b\) ,求解序列 \(c\) 满足:

\[c_i=\sum_{j\cdot k=i}a_jb_k \]

其中 \(\cdot\) 可以为 \(\&\) ,\(|\) ,还有 \(\oplus\) 等位运算。快速沃尔什变换用于求解位运算卷积等问题。

\(\text{and}\) 、\(\text{or}\) 卷积

以 \(\text{or}\) 为例

\[FWT(a)_i=\sum_{j|i=i}a_j \]

\[FWT(c)_i=FWT(a)_iFWT(b)_i=\sum_{j|i=i}a_i\sum_{k|i=i}b_k=\sum_{(j|k)|i=i}a_jb_k \]

那么我们只要完成 \(a \rightarrow FWT(a)\) 和 \(FWT(a) \rightarrow a\) 这两种操作即可。

先考虑前者,分治处理,将 \(a\) 序列中按照下标最高位分类。记 \(a_0\) 为最高位为 \(0\) 的那一部分,\(a_1\) 为最高位为 \(1\) 的那一部分,考虑合并的过程:

\[FWT(a)=merge(FWT(a_0),FWT(a_0)+FWT(a_1)) \]

\(merge\) 表示将两个序列拼接,\(+\) 表示对应位相加。其原理是 \(a_0\) 中的每一位都是其在 \(a_1\) 中的子集,需要做贡献。

那么第二种操作就是将上述分治过程逆过来即可:

\[a=merge(a_0,a_1-a_0) \]

再来考虑 \(\text{and}\)

\[FWT(a)_i=\sum_{j \& i=i}a_j \]

\[FWT(a)=merge(a_0+a_1,a_1) \]

\[a=merge(a_0-a_1,a_1) \]

\(\text{xor}\) 卷积

这里记

\[FWT(a)_i=\sum_{j\oplus i=0}a_j-\sum_{j \oplus i=1}a_j \]

其中 \(j\oplus i=popcount(j \& i)\&1\) ,考虑每一位对答案的贡献,不难发现满足:

\[(j \oplus i)\: \text{xor}\: (k \oplus i)=(j \: \text{xor} \:k)\oplus i \]

因此:

\[FWT(c)=FWT(a)FWT(b)=\left( \sum_{j \oplus i=0}a_j-\sum_{j\oplus i=1}a_j \right )\left( \sum_{k\oplus i=0}b_k-\sum_{k \oplus i=1}b_k\right) \]

\[=\sum_{(j\:\text{xor} \: k)\oplus i=0}a_jb_k-\sum_{(j \: \text{xor} \:k)\oplus i=1}a_jb_k \]

两部分求解过程依然是考虑分治与还原。

\[FWT(a)=merge(FWT(a_0)+FWT(a_1),FWT(a_0)-FWT(a_1)) \]

\[a=merge\left(\frac{a_0+a_1}{2},\frac{a_0-a_1}{2}\right) \]

然后到这里就做完了!

标签:xor,text,sum,笔记,merge,沃尔什,FWT,oplus
From: https://www.cnblogs.com/oscaryangzj/p/17120641.html

相关文章

  • 机器学习 吴恩达 第十一章 笔记
    十一、支持向量机(SupportVectorMachines)11.1优化目标  到目前为止,你已经见过一系列不同的学习算法.在监督学习中,许多学习算法的性能都非常类似.因此,重要的不是......
  • 【读书笔记】WebKit 技术内幕
    本文总结下《WebKit技术内幕》的要点。第一章浏览器和浏览器内核浏览器背景:80年代后期90年代初期:世界上第一个浏览器WorldWideWeb(后改名为Nexus),Berners-Lee发明......
  • C语言学习笔记(九):文件的操作
    C文件的知识什么是文件操作系统把各种设备都统一作为文件来处理。例如,终端键盘是输入文件,显示屏和打印机是输出文件。文件一般指存储在外部介质上数据的集合。操作系统......
  • 【学习笔记】Spring注解开发
    Spring注解开发使用注解开发首先要导入context约束,然后开启注解支持<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/bea......
  • 读书笔记(三)--世界上最伟大的推销员
    读书笔记--第3篇--《世界上最伟大的推销员》1.我用全身心的爱来迎接今天。我赞美敌人。我在心里默默地为每一个人祝福。我爱自己,我用清洁与节制来珍惜我的身体,我用智慧和......
  • 读书笔记(十三)--成交
    ​读书笔记--第13篇--《成交》​管理可以分为五个层次:第一个层次,最常见的时间管理,比如员工上下班打卡,有固定的工位,从事固定的工作。第二个层次,属地管理。人在一个固......
  • 读书笔记(六)--成交
    读书笔记--第6篇--《成交》​1.在IT企业,陌生人很容易一眼就能分辨出谁做销售,谁做技术,谁做管理。冲着陌生人微笑言语客气的一般是销售,一脸漠然甚至有些高傲的是技术,用......
  • 读书笔记(五)--公司绝不会告诉你的50大秘密
    读书笔记--第5篇--《公司绝不会告诉你的50大秘密》0.法律解救不了您。1.聪明过头并非明智之举。2.年龄和性别歧视是活生生的现实。3.公司并非畅所欲言的好地方。4.如果你与......
  • 三角函数学习笔记
    不会三角函数/ng基础定义锐角定义定义:直角所对的边称作斜边,角\(\theta\)所对的边称为对边,剩下的那条边(和\(\theta\)相邻)称为邻边。则\[\begin{aligned}\sin(\t......
  • Rust学习笔记
    CargoCargo是Rust的构建系统和包管理器。因为它可以为你处理很多任务,比如构建代码、下载依赖库并编译这些库查看版本号cargo--versionrustc--version#查看ru......