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

FWT 快速沃尔什变换

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

ci=jk=iajbk

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

andor 卷积

or 为例

FWT(a)i=j|i=iaj

FWT(c)i=FWT(a)iFWT(b)i=j|i=iaik|i=ibk=(j|k)|i=iajbk

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

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

FWT(a)=merge(FWT(a0),FWT(a0)+FWT(a1))

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

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

a=merge(a0,a1a0)

再来考虑 and

FWT(a)i=j&i=iaj

FWT(a)=merge(a0+a1,a1)

a=merge(a0a1,a1)

xor 卷积

这里记

FWT(a)i=ji=0ajji=1aj

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

(ji)xor(ki)=(jxork)i

因此:

FWT(c)=FWT(a)FWT(b)=(ji=0ajji=1aj)(ki=0bkki=1bk)

=(jxork)i=0ajbk(jxork)i=1ajbk

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

FWT(a)=merge(FWT(a0)+FWT(a1),FWT(a0)FWT(a1))

a=merge(a0+a12,a0a12)

然后到这里就做完了!

posted @   _YangZJ  阅读(36)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
主题色彩