快速沃尔什变换:从入门到背板(含推导过程)

前(che)言(dan)

FWTFWTFWT是个神奇的东西。

然而网上多数讲解多数直接给结论,顶多用归纳法证一证。

所以本文会讲解FWTFWTFWT的推导过程。

虽然也用到了构造,但是好背得多

参考博客:https://www.cnblogs.com/ACMSN/p/11031072.html

能干啥

众所周知,FFTFFTFFT求的是

Ck=∑i+j=kAiBjC_k=\sum_{i+j=k}A_iB_jCk=i+j=kAiBj

FWTFWTFWT求的是

Ck=∑i⊕j=kAiBjC_k=\sum_{i\oplus j=k}A_iB_jCk=ij=kAiBj
其中⊕\oplus为逻辑位运算符,即&,∣,^\&,|,\hat{}&,,^

两者思想类似,但实际上是两条不同的线。

约定

大写字母A,B,CA,B,CA,B,C表示一个序列(多项式),下标从000开始,到n−1n-1n1结束

小写字母i,j,ki,j,ki,j,k表示循环变量

A+B,A−B,A∗BA+B,A-B,A*BA+B,AB,AB表示对应位直接相加,相减或相乘

A⊕BA \oplus BAB表示对应的卷积,⊕\oplus&,∣,^,×(乘法)\&,|,\hat{},\times(乘法)&,,^,×()

A[i]A[i]A[i]表示序列第iii

A0,A1A_0,A_1A0,A1表示序列前半部分和后半部分

(A,B)(A,B)(A,B)表示将两个序列拼接在一起

如果涉及了集合运算,表示这个数二进制111的位置构成的集合

分析

回忆FFTFFTFFT的过程,它的思想是构造一个FFTFFTFFT函数及其逆运算IFFTIFFTIFFT,使得

IFFT(FFT(A)∗FFT(B))=A×BIFFT(FFT(A)*FFT(B))=A \times BIFFT(FFT(A)FFT(B))=A×B

FWTFWTFWT则构造

IFWT(FWT(A)∗FWT(B))=A⊕BIFWT(FWT(A)*FWT(B))=A \oplus BIFWT(FWT(A)FWT(B))=AB

以下都假装NNN222的整数次幂

先说主要思想:构造一个i,ji,ji,j的关系式g(i,j)g(i,j)g(i,j),使得

FWT(A)[i]=∑j=0n−1g(i,j)A[j]FWT(A)[i]=\sum_{j=0}^{n-1}g(i,j)A[j]FWT(A)[i]=j=0n1g(i,j)A[j]

我们想要

FWT(A⊕B)=FWT(A)∗FWT(B)FWT(A\oplus B)=FWT(A)*FWT(B)FWT(AB)=FWT(A)FWT(B)

即对于任意的iii

FWT(A⊕B)[i]=FWT(A)[i]∗FWT(B)[i]FWT(A\oplus B)[i]=FWT(A)[i]*FWT(B)[i]FWT(AB)[i]=FWT(A)[i]FWT(B)[i]

代入

∑j=0n−1g(i,j)((A⊕B)[j])=∑j=0n−1g(i,j)A[j]∑k=0n−1g(i,k)B[k]\sum_{j=0}^{n-1}g(i,j)((A \oplus B)[j])=\sum_{j=0}^{n-1}g(i,j)A[j]\sum_{k=0}^{n-1}g(i,k)B[k]j=0n1g(i,j)((AB)[j])=j=0n1g(i,j)A[j]k=0n1g(i,k)B[k]

拆开

∑x=0n−1g(i,x)∑j⊕k=xA[j]∗B[k]=∑j=0n−1g(i,j)A[j]∑k=0n−1g(i,k)B[k]\sum_{x=0}^{n-1}g(i,x)\sum_{j\oplus k=x}A[j]*B[k]=\sum_{j=0}^{n-1}g(i,j)A[j]\sum_{k=0}^{n-1}g(i,k)B[k]x=0n1g(i,x)jk=xA[j]B[k]=j=0n1g(i,j)A[j]k=0n1g(i,k)B[k]

右边可以乘法分配率合并(其实就是换个顺序)

∑x=0n−1g(i,x)∑j⊕k=xA[j]∗B[k]=∑j=0n−1∑k=0n−1g(i,j)g(i,k)A[j]B[k]\sum_{x=0}^{n-1}g(i,x)\sum_{j\oplus k=x}A[j]*B[k]=\sum_{j=0}^{n-1}\sum_{k=0}^{n-1}g(i,j)g(i,k)A[j]B[k]x=0n1g(i,x)jk=xA[j]B[k]=j=0n1k=0n1g(i,j)g(i,k)A[j]B[k]

左边更换枚举项

∑j=0n−1∑k=0n−1g(i,j⊕k)A[j]B[k]=∑j=0n−1∑k=0n−1g(i,j)g(i,k)A[j]B[k]\sum_{j=0}^{n-1}\sum_{k=0}^{n-1}g(i,j\oplus k)A[j]B[k]=\sum_{j=0}^{n-1}\sum_{k=0}^{n-1}g(i,j)g(i,k)A[j]B[k]j=0n1k=0n1g(i,jk)A[j]B[k]=j=0n1k=0n1g(i,j)g(i,k)A[j]B[k]

即:

g(i,j⊕k)=g(i,j)g(i,k)g(i,j\oplus k)=g(i,j)g(i,k)g(i,jk)=g(i,j)g(i,k)

我们还需要证一个东西:

FWT(A+B)=FWT(A)+FWT(B)FWT(A+B)=FWT(A)+FWT(B)FWT(A+B)=FWT(A)+FWT(B)

对于每个iii

FWT(A+B)[i]=FWT(A)[i]+FWT(B)[i]FWT(A+B)[i]=FWT(A)[i]+FWT(B)[i]FWT(A+B)[i]=FWT(A)[i]+FWT(B)[i]

套定义

∑j=0n−1g(i,j)(A+B)[j]=∑j=0n−1g(i,j)A[j]+∑j=0n−1g(i,j)B[j]\sum_{j=0}^{n-1}g(i,j)(A+B)[j]=\sum_{j=0}^{n-1}g(i,j)A[j]+\sum_{j=0}^{n-1}g(i,j)B[j]j=0n1g(i,j)(A+B)[j]=j=0n1g(i,j)A[j]+j=0n1g(i,j)B[j]

然后很显然 证毕

完结撒花

构造

g(i,j∣k)=g(i,j)g(i,k)g(i,j | k)=g(i,j)g(i,k)g(i,jk)=g(i,j)g(i,k)

写成集合形式

g(i,j∪k)=g(i,j)g(i,k)g(i,j \cup k)=g(i,j)g(i,k)g(i,jk)=g(i,j)g(i,k)

构造g(i,j)=[j⊂i]g(i,j)=[j \subset i]g(i,j)=[ji]即可

实现

FWT(A)[i]=∑j⊂iA[j]FWT(A)[i]=\sum_{j\subset i}A[j]FWT(A)[i]=jiA[j]

考虑分治

将一个序列分成左右两部分,左边最高位为000 右边最高位为111

对于左边,其子集就是上一个的子集

右边再加上左边,因为可以不选最高位

FWT(A)=(FWT(A0),FWT(A0)+FWT(A1))FWT(A)=(FWT(A_0),FWT(A_0)+FWT(A_1))FWT(A)=(FWT(A0),FWT(A0)+FWT(A1))

只有一项直接返回

逆运算解个方程就行了
{FWT(A)0=FWT(A0)FWT(A)1=FWT(A0)+FWT(A1)\left\{ \begin{aligned} FWT(A)_0 & = FWT(A_0) \\ FWT(A)_1 & = FWT(A_0)+FWT(A_1) \end{aligned} \right. {FWT(A)0FWT(A)1=FWT(A0)=FWT(A0)+FWT(A1)

{FWT(A0)=FWT(A)0FWT(A1)=FWT(A)1−FWT(A)0\left\{ \begin{aligned} FWT(A_0) & = FWT(A)_0 \\ FWT(A_1) & = FWT(A)_1-FWT(A)_0 \end{aligned} \right. {FWT(A0)FWT(A1)=FWT(A)0=FWT(A)1FWT(A)0

IFWT(A)=(IFWT(A0),IFWT(A1)−IFWT(A0))IFWT(A)=(IFWT(A_0),IFWT(A_1)-IFWT(A_0))IFWT(A)=(IFWT(A0),IFWT(A1)IFWT(A0))

同理,略

FWT(A)=(FWT(A0)+FWT(A1),FWT(A1))FWT(A)=(FWT(A_0)+FWT(A_1),FWT(A_1))FWT(A)=(FWT(A0)+FWT(A1),FWT(A1))

IFWT(A)=(IFWT(A0)−IFWT(A1),IFWT(A1))IFWT(A)=(IFWT(A_0)-IFWT(A_1),IFWT(A_1))IFWT(A)=(IFWT(A0)IFWT(A1),IFWT(A1))

异或

构造

g(i,j^k)=g(i,j)g(i,k)g(i,j \hat{\quad} k)=g(i,j)g(i,k)g(i,j^k)=g(i,j)g(i,k)

我也不知道怎么想到的构造

g(i,j)=(−1)∣i∩j∣g(i,j)=(-1)^{|i\cap j|}g(i,j)=(1)ij

用到了异或不会改变111的总数的奇偶性 意识流得证

实现

FWT(A)[i]=∑j=0n−1(−1)∣i∩j∣A[j]FWT(A)[i]=\sum_{j=0}^{n-1}(-1)^{|i\cap j|}A[j]FWT(A)[i]=j=0n1(1)ijA[j]

仍然分成左右两部分,右边表示选择最高位

发现只有两侧都填111的时候会改变∣i∩j∣|i\cap j|ij的奇偶性,相当于产生负的贡献。其余都产生正贡献。

FWT(A)=(FWT(A0)+FWT(A1),FWT(A0)−FWT(A1))FWT(A)=(FWT(A_0)+FWT(A_1),FWT(A_0)-FWT(A_1))FWT(A)=(FWT(A0)+FWT(A1),FWT(A0)FWT(A1))

IFWT(A)=(IFWT(A0)+IFWT(A1)2,IFWT(A0)−IFWT(A1)2)IFWT(A)=(\frac{IFWT(A_0)+IFWT(A_1)}{2},\frac{IFWT(A_0)-IFWT(A_1)}{2})IFWT(A)=(2IFWT(A0)+IFWT(A1),2IFWT(A0)IFWT(A1))

代码

void ForT(int* a,int n,int type)
{for (int len=2;len<=(1<<n);len<<=1){int mid=len>>1;for (int s=0;s<(1<<n);s+=len)for (int k=0;k<mid;k++){a[s+mid+k]=(a[s+mid+k]+type*a[s+k])%MOD;if (a[s+mid+k]<0) a[s+mid+k]+=MOD;}}
}
void FandT(int* a,int n,int type)
{for (int len=2;len<=(1<<n);len<<=1){int mid=len>>1;for (int s=0;s<(1<<n);s+=len)for (int k=0;k<mid;k++){a[s+k]=(a[s+k]+type*a[s+mid+k])%MOD;if (a[s+k]<0) a[s+k]+=MOD;}}	
}
void FxorT(int* a,int n,int type)
{for (int len=2;len<=(1<<n);len<<=1){int mid=len>>1;for (int s=0;s<(1<<n);s+=len)for (int k=0;k<mid;k++){a[s+k]=(a[s+k]+a[s+mid+k])%MOD;a[s+mid+k]=(a[s+k]-2*a[s+mid+k])%MOD;if (a[s+mid+k]<0) a[s+mid+k]+=MOD;if (type==-1) a[s+k]=(ll)a[s+k]*INV%MOD,a[s+mid+k]=(ll)a[s+mid+k]*INV%MOD;}}		
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务探索与实践—总述

背景软件开发是一个不断发展的过程&#xff0c;从当初的面向过程为主到如今的面向对象的开发&#xff0c;软件开发者不断探索与实践更加符合时代发展要求的开发模式与架构思想&#xff0c;而这&#xff0c;也在极大程度上提高了软件开发的效率。微服务是一种架构模式或者说是架…

P4097 [HEOI2013]Segment 李超线段树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 实现以下两个操作&#xff1a; (1)(1)(1)在平面上加入一条线段。记第iii条被插入的线段的标号为iii (2)(2)(2)给定一个数kkk&#xff0c;询问与直线xkxkxk相交的线段中&#xff0c;交点纵坐标最大的线段的编…

【CF1204D】Kirk and a Binary String【结论题】【LIS】

传送门 题意&#xff1a;给一个01串SSS&#xff0c;求一个等长的01串TTT SSS和TTT所有对应位置的子串最长不下降子序列长度&#xff08;以下简称LIS\text{LIS}LIS&#xff09;相同TTT中0的数量尽量多 ∣S∣≤100000|S| \leq 100000∣S∣≤100000 对于一个01串SSS&#xff0c;…

这周,全球首个IT技术全中文免费学习平台诞生了!太惊艳!

本周三的Developer Wednesday为大家揭秘了Microsoft Learn网站的全新学习模式一时间Microsoft Learn圈粉无数如果你正在为错过直播而暴风哭泣等一等&#xff0c;看这里&#xff01;全程高清回播将为你持续解密这一次你一定不可以再错过了哦&#xff01;什么是Microsoft Learn&…

【CF1182D】Complete Mirror【树的重心】

传送门 题意&#xff1a;给一棵NNN个结点的树&#xff0c;你需要钦定一个根&#xff0c;使得所有深度相同的点的度数相同。 N≤100000N \leq 100000N≤100000 用脑子想一想&#xff0c;就是根节点直接相连的子树都长得一模一样。 如果根节点度数大于1&#xff0c;我们发现它…

P1989 无向图三元环计数 思维 + 建图

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 统计无向图中三元环的个数。 思路&#xff1a; 很明显有一种暴力的方法&#xff0c;就是枚举每条边&#xff0c;让后再跑两个点的所有边&#xff0c;可以卡到复杂度O(m2)O(m^2)O(m2)。 我们可以考虑给点之…

十分钟了解Kubernetes

何为Kubernetes?最简单的一句话来概括Kubernetes。它就是一套成熟的商用服务编排解决方案。Kubernetes定位在Paas层&#xff0c;重点解决了微服务大规模部署时的服务编排问题。Kubernetes组件介绍了解Kubernetes都是从Pod开始的。Pod是Kubernetes最小的调度单元&#xff0c;所…

【CF1020C】Election【贪心】

传送门 题意&#xff1a;NNN个人给MMM个党派投票&#xff0c;开始时每个人选择一个党派投票&#xff08;给定&#xff09;&#xff0c;每个人可以花费一定代价贿赂&#xff08;每个人给定代价&#xff09;&#xff0c;求让1号党派胜出&#xff08;票数严格最大&#xff09;的最…

Codeforces Round #627 (Div. 3) E. Sleeping Schedule dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一天hhh小时&#xff0c;初始时间是000&#xff0c;每天可以使时间aia_iai​或者ai−1a_i-1ai​−1&#xff0c;问最多可以让多少天的时间在[l,r][l,r][l,r]范围内。 思路&#xff1a; 算是个比较简单…

【CF1194E】Count The Rectangles【类扫描线】【单调性】【树状数组】

传送门 题意&#xff1a;给定NNN条与坐标轴平行的线段&#xff0c;保证不垂直的线段没有交点&#xff0c;求一共构成多少个矩形&#xff08;以线段交点为顶点&#xff09;。 1≤N≤50001\leq N\leq50001≤N≤5000 显然是个数据结构乱搞题。 直觉告诉我们先枚举一条线段。 假…

.NET Core 的过去、现在和未来

在最新的微软 Build 大会主题网站上&#xff0c;微软.NET 程序经理 Scott Hunter 发表了一篇文章&#xff0c;指出.NET Core 是.NET 的未来。去年&#xff0c;微软就已经确认 Visual Studio Live 中的.NET 框架将会被.NET Core 取代。将.NET Core 作为开源开发技术栈在 2014 年…

Ozon Tech Challenge 2020 (Div.1 + Div.2) C. Kuroni and Impossible Calcul 抽屉原理

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个数组ana_nan​&#xff0c;求∏1≤i<j≤n∣aj−ai∣modm\begin{matrix} \prod_{1\le i<j\le n} |a_j-a_i| \end{matrix}\bmod m∏1≤i<j≤n​∣aj​−ai​∣​modm。 n≤2e5,m≤1e3n\le2e5…

【HAOI2015】按位或【Min-Max容斥】【FWT】

传送门 题意&#xff1a;开始时你有一个数000,每次选出[0,2n−1][0,2^n-1][0,2n−1]中的一个数进行按位或&#xff0c;每个数选中的概率给定。求得到2n−12^n-12n−1的期望操作次数。 1≤n≤201\leq n\leq 201≤n≤20 神仙题 首先发现每一位都是独立的&#xff0c;可以分开考…

Visual Basic 兴衰记

这是一篇暴露年龄的文章。为什么这么说&#xff1f;因为现在年轻的程序员可能没有接触过当年红极一时的 Visual Basic。28 年前的 1991 年 4 月&#xff0c;Microsoft 发布了 Visual Basic 1.0 for Windows&#xff0c;次年 9 月&#xff0c;发布了 Visual Basic 1.0 for DOS。…

Ozon Tech Challenge 2020 (Div.1 + Div.2, Rated) D. Kuroni and the Celebration 交互 + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一颗树&#xff0c;每次可以询问两个点的lcalcalca&#xff0c;询问次数不能超过⌊n2⌋\left \lfloor \frac{n}{2} \right \rfloor⌊2n​⌋&#xff0c;求它的根。 n≤1e3n\le1e3n≤1e3。 思路&#xf…

【CF1047D】Little C Loves 3 II【构造】【赛瓦维斯特定理】

传送门 题意&#xff1a;给一个NMN \times MNM的空棋盘&#xff0c;每次选取两个曼哈顿距离为3的空格子放上棋子&#xff0c;问最多能放多少个。 1≤N,M≤1e91 \leq N,M \leq 1e91≤N,M≤1e9 暴力讨论 假装N≤MN \leq MN≤M ①N1N1N1 容易得到&#xff0c;详见代码 ②N2N…

函数式编程里的Materialization应该翻译成什么?

Materialization是函数式编程里的一个专业术语, 用于特指函数式编程中查询被实际执行并生成结果的这一过程.首先, 搜了一下中文资料, 暂时没有对该词的中文翻译, CSDN\博客园\阿里云上所有关于它的文档都没有做中文翻译, 直接沿用这个英文单词.难道轮到我来创造这个词的中文翻…

Ozon Tech Challenge 2020 (Div.1 + Div.2) E.Kuroni and the Score Distribution 构造

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 不难想到&#xff0c;长度为nnn的数组最多的满足条件的三元组序列是1,2,3....,n1,2,3....,n1,2,3....,n&#xff0c;对于每一个位置贡献为i−12\frac{i-1}{2}2i−1​&#xff0c;那么如果m…

【CF1209E】Rotate Columns【状压DP】【位运算】【贪心】

题意&#xff1a;给一个NMN \times MNM的矩阵&#xff0c;可以进行任意多次操作将一列轮换&#xff0c;求每一行的最大值之和的最大值。多组数据。 Easy VersionN≤4N \leq 4N≤4,M≤100M \leq100M≤100 Hard VersionN≤12N \leq 12N≤12,M≤2000M \leq2000M≤2000 看这数据…

Exceptionless(二) - 使用进阶

作者&#xff1a;markjiang7m2原文地址&#xff1a;https://www.cnblogs.com/markjiang7m2/p/11100563.html官网地址&#xff1a;http://letyouknow.net在上一篇文章Exceptionless - .Net Core开源日志框架中就说到如何对Exceptionless进行本地化部署&#xff0c;不过我也跟大家…