首页 > 其他分享 >FWT(快速沃尔什变换)

FWT(快速沃尔什变换)

时间:2025-01-03 20:45:57浏览次数:1  
标签:变换 sum fwt 沃尔什 FWT oplus 卷积

FWT(快速沃尔什变换)

前言

萌新刚学多项式 1ms,有误或者不严谨指出欢迎指出,感谢大佬!

参考

OI Wiki

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

题解 P4717 【【模板】快速沃尔什变换】

位运算卷积(FWT) & 集合幂级数

鸽掉的介绍,我是 OIer 诶,不是 MOer 啊,要这么多证明干什么!直接背代码好了!写多了自然就理解了啊!

简介

使用类似 FFT 的方法求位运算卷积。

我们熟知的多项式卷积是求 \(\sum_{i=1}^n a_i b_{n-i}\)。

对于位运算 \(\oplus\),可以是 or,and,xor。其卷积大概是 \(\sum_{i=1}^n \sum_{i \oplus j = n} a_i b_j\)。

比如或卷积是 \(\sum_{i=1}^n \sum_{i|j = n} a_i b_j\),也就是我们常说的枚举子集。

对于 \(c_n = \sum_{i=1}^n \sum_{i \oplus j = n} a_i b_j\),我们要求出 \(c_n\) 或者 \(\{c_i\}\),最朴素的暴力枚举 \(i,j\) 时间复杂度是 \(O(n^2)\) 的。考虑使用 FWT 优化到 \(O(n \log n)\)。

算法流程

记对序列 \(A=\{a_i\}\) 进行 FWT 变换后的序列(形式幂级数)是 \(fwt(A)\)。

\(A,B,C\) 均指序列,\(a_i\) 之类是序列的第 \(i\) 项(从 \(0\) 开始记下标)。\(fwt(A)\) 之类是序列,\(fwt(A)_i\) 之类是指序列的第 \(i\) 项(同样从 \(0\) 开始记下标)。

我们要构造 \(A \oplus B = C \Longleftrightarrow fwt(A) \cdot fwt(B) = fwt(C)\)。需要再 \(O(n \log n)\) 的时间复杂度内计算 \(A \to fwt(A)\) 和 \(fwt(A)\to A\),和线性求出 \(fwt(A) \cdot fwt(B) = fwt(C)\)。

其中 \(A \oplus B = C\) 指 \(c_n = \sum_{i \oplus j = i} a_i b_j\),即位运算卷积。

\(fwt(A) \cdot fwt(B) = fwt(C)\) 指 \(fwt(C)_n = fwt(A)_n fwt(B)_n\),即点值相乘。

至于为什么要这么定义我还不知道,但是这么定义是可以做的

设 \([i,j]\) 表示 \(a_j\) 对 \(fwt(A)_i\) 的贡献系数。应该有 \([i,j] \in \{0,1\}\)。

即 \(fwt(A)_i=\sum_{j=0}^i [i,j] a_j\)。


我们需要知道 \([i,j]\) 是什么,即如何构造 \(fwt(A)\)。

\[\begin{aligned} fwt(A)_i \cdot fwt(B)_i & = fwt(C)_i\\ \sum_{j=0}^i [i,j] a_j \sum_{k=0}^i [i,k] b_k & = \sum_{p=0}^i [i,p] c_p\\ \sum_{j=0}^i \sum_{k=0}^i [i,j] [i,k] a_j b_k & = \sum_{p=0}^i [i,p] c_p\\ \end{aligned} \]

由于 \(A \oplus B = C\),我们有 \(c_n = \sum_{i \oplus j = i} a_i b_j\)。

因此我们只需要保证对于所有的 \([i,p]=1\) 当且仅当 \(j \oplus k = p\) 的时候 \([i,j]=[i,k]=1\)。

因为是位运算,我们只需要分别考虑每一位就好。即考虑 \([0,0],[0,1],[1,0],[1,1]\) 的取值。每种位运算都是不同的取值。


\(fwt(A)_i=\sum_{j=0}^i [i,j] a_j\),快速根据 \(A\) 求 \(fwt(A)\)。

code

不能理解,不是很好背诵。又学不会,又背不会,真是文理兼废,怎么办呢?

函数:

void calc() { rep(i,0,n-1) _mul(a[i],b[i]); }
void OR(int *f,int x=1) {
    for(int o=2,k=1; o<=n; o<<=1,k<<=1)     
        for(int i=0; i<n; i+=o)
            rep(j,0,k-1) _add(f[i+j+k],mul(f[i+j],x));
}
void AND(int *f,int x=1) {
    for(int o=2,k=1; o<=n; o<<=1,k<<=1)     
        for(int i=0; i<n; i+=o)
            rep(j,0,k-1) _add(f[i+j],mul(f[i+j+k],x));
}
void XOR(int *f,int x=1) {
    for(int o=2,k=1; o<=n; o<<=1,k<<=1)     
        for(int i=0; i<n; i+=o)
            rep(j,0,k-1) 
                _add(f[i+j],f[i+j+k]), f[i+j+k]=add(f[i+j],mod-add(f[i+j+k],f[i+j+k])), _mul(f[i+j],x), _mul(f[i+j+k],x);
}

调用方式:

OR(a), OR(b), calc(), OR(a,mod-1);
AND(a), AND(b), calc(), AND(a,mod-1);
XOR(a), XOR(b), calc(), XOR(a,ksm(2));

标签:变换,sum,fwt,沃尔什,FWT,oplus,卷积
From: https://www.cnblogs.com/liyixin0514/p/18644476

相关文章

  • 使用stable diffusion进行电商产品变换背景,一秒出大片效果!
    连接更自然关于AI绘画技术储备学好AI绘画不论是就业还是做副业赚钱都不错,但要学会AI绘画还是要有一个学习规划。最后大家分享一份全套的AI绘画学习资料,给那些想学习AI绘画的小伙伴们一点帮助!对于0基础小白入门:如果你是零基础小白,想快速入门AI绘画是可以考......
  • 利用CUDA编程实现在GPU中对图像的极坐标变换加速
    问题来源:1.需要对输入图像中的一个环形区域,进行极坐标逆变换,将该环形区域转换为一张新的矩形图像2.opencv没有直接对环形区域图像进行变换的函数,需要通过循环遍历的方式,利用polarToCart进行转换3.循环遍历不可避免的带来速度上的问题,尤其是图片较大时解决思路1:使用open......
  • 傅里叶变换的乘法性质&卷积定理
    傅里叶变换是将一个信号从时域转换到频域的工具。傅里叶变换有许多重要的性质,其中乘法性质和卷积定理是两个非常重要的概念。乘法性质:时域中的乘法对应于频域中的卷积。卷积定理:时域中的卷积对应于频域中的乘法。乘法性质傅里叶变换的乘法性质表明,如果两个函数......
  • 手把手教你学simulink(50.2)--DC-AC变换器场景示例:基于Simulink的PI控制的DC-AC变换器LC
    目录基于Simulink的PI控制的DC-AC变换器LC滤波器项目实例1.项目背景2.系统架构2.1DC电源2.2H桥逆变器2.3PI控制器2.4LC滤波器2.5系统框图3.模型设计3.1创建Simulink模型3.2PI控制器设计3.3LC滤波器设计3.4仿真环境搭建3.5仿真结果分析4.滤波器设......
  • 操作系统模拟虚拟存储器的地址变换过程
    设计用于模拟快表、页表、地址变换所用的寄存器的数据结构;编制页表的初始信息文件,举例说明文件中具有的信息:共有5块,每块的状态、在内存和外存的起始地址等。编程实现虚拟存储器地址变换算法程序,动态输入所要访问的逻辑地址,变换过程文字描述以及变换后的物理地址;测试:输入......
  • 【CSS in Depth 2 精译_097】第 17 章:CSS 动画特效概述 + 17.1:关键帧的概念及用法 + 1
    当前内容所在位置(可进入专栏查看其他译好的章节内容)第五部分添加动效✔️【第17章动画】✔️17.1关键帧✔️17.23D变换下的动画设置✔️17.2.1添加动画前页面布局的构建✔️17.2.2为布局添加动画✔️17.3动画延迟与填充模式文章目录17动画Animat......
  • CSS 2D3D变换
    1.2d位移2d位移可以改变元素的位置。具体使用方法如下1.先给元素添加转换属性transform2.编写transform的具体值translate()translateX()translateY()可以写长度值,百分比,百分比是相当于自身的长宽。1.位移与相对定位相似,都不脱离文档流。不会影响其他元素。2.位移对行内......
  • [ABC220H] Security Camera(FWT)
    题意给定一张\(n\)点\(m\)边的无向图,每个点都有权值0,你现在要将一部分点的权值变成1,使得边的两端的权值的按位或和为1的边的数量为偶数,求方案数。\(n\le40\)分析由于我是来学FWT的,所以不考虑线性代数。不难发现题意可以转化成求边的两端权值都为0的边的数量为偶......
  • 冈萨雷斯——《数字图像处理》(三)灰度变换和空间滤波
    3.1背景空间域处理基于表达式:g(x,y)......
  • manim边学边做--同伦变换
    在Manim中,移动一个元素除了之前介绍的方法之外,还可以通过同伦运算来移动一个元素。与普通的移动元素方式相比,使用同伦运算移动一个元素时,实际上是在考虑整个空间的连续变形过程中元素的相应变化。这种移动不是孤立地看待元素的位置改变,而是将元素置于空间的整体结构中,通过连续变......