知识点简单总结——FWT(快速沃尔什变换),FST(快速子集变换)
知识点简单总结——FWT(快速沃尔什变换),FST(快速子集变换)
闲话
博客园的markdown也太傻逼了吧。
快速沃尔什变换
位运算卷积
形如 $ f[ i ] = \sum\limits_{ j \oplus k = i} g[ j ] * h[ k ] $ 的形式的式子。
正常计算是 $ n^{ 2 } $ 。
与运算卷积
众所周知有 $ ( i \& j ) == k \longleftrightarrow ( i \& k == k ) \& \& ( j \& k == k ) $ 。
考虑构造 $ F( i ) = \sum\limits_{ j \& i == i } f( j ) $ 。
由上述结论容易推导得 $ F( i ) = G( i ) * H( i ) $ 。
将 $ f $ 正变换为 $ F $ 的方法:
由于 $ F $ 为父集和,考虑从低到高对于每一位,每次考虑仅有这一位不同的两个数,将该位为1的元素加到对应只有该位不同为0的元素上。
逆变换则是按照相同顺序每次从某一位为0的元素减去该位对应为1的元素。
或运算卷积
上述结论对或运算依然成立即 $ ( i | j ) == k \longleftrightarrow ( i | k == k ) \& \& ( j | k == k ) $ 。
同样构造 $ F( i ) = \sum\limits_{ j | i == i } f( j ) $ 。
正变换与与运算相似,不过是为将该位为0的元素加到该位为1的元素上,逆变换反之。
异或运算卷积
有结论 $ bitcount( i \& k ) \oplus bitcount ( j \& k ) \text{的奇偶} == bitcount( ( i \oplus j ) \& k ) \text{的奇偶} $ 。
构造 $ F( i ) = \sum\limits_{j} ( -1 )^{ bitcount( j \& i ) } f( j ) $ ,借助上述结论证明。
正变换依然从低到高位考虑每一对仅有对应位不同的两个数,
仅用0和1进行与运算,只有 $ 1 \& 1 = 1 $ ,其余均为0,
也就是说只有这一种运算改变奇偶性。
所以每次变换有 $ a = a + b , b = a - b $ 。
逆运算重新计算回去就是 $ a = \frac{ a + b }{2} , b = \frac{ a - b }{2} $ 。
快速子集变换
在DP问题中经常会有 $ f[ i ] = \sum\limits_{ j \subseteq i } g[ j ] * h[ i - j ] $ 一类的式子。
直接枚举子集是 $ 3^{ n } $ 。
把上式转换为 $ f[ i ] = \sum\limits_{ j | k == i , j \& k == 0} g[ j ] * h[ k ] $ 。
为了避免集合相交,考虑增加一维变成 $ f[c][i] $ , $ c $ 代表集合大小( $ 1 $ 的个数),仅在对应正确集合大小的时候某一位才有值。
然后直接或卷积就好了。
k进制异或卷积
考虑在上述二进制异或卷积中所使用的运算
二进制异或相当于二进制下不进位加法。
二进制与相当于二进制下不进位乘法。
$ bitcount $ 也可以同理推论。
因此我们用这个定义将其扩展到k进制。
之后考虑二进制卷积中 $ -1 $ 的含义。
异或卷积这玩意是有点类似循环卷积的。
所以我们可以想到利用单位根。
用类似方法就能求出对应k进制下的变换。
或者证不明白直接背个简单结论就行了:
$ j $ 对 $ i $ 的正贡献为 $ f_{ i , j } = \omega_{ k }^{ ij } $ ,逆贡献为 $ f_{ i , j }^{ -1 } $ 。
知识点简单总结——FWT(快速沃尔什变换),FST(快速子集变换)的更多相关文章
- Codeforces 662C(快速沃尔什变换 FWT)
感觉快速沃尔什变换和快速傅里叶变换有很大的区别啊orz 不是很明白为什么位运算也可以叫做卷积(或许不应该叫卷积吧) 我是看 http://blog.csdn.net/liangzhaoyang1/ar ...
- 快速沃尔什变换(FWT)及K进制异或卷积&快速子集变换(FST)讲解
前言: $FWT$是用来处理位运算(异或.与.或)卷积的一种变换.位运算卷积是什么?形如$f[i]=\sum\limits_{j\oplus k==i}^{ }g[j]*h[k]$的卷积形式(其中$\ ...
- 关于快速沃尔什变换(FWT)的一点学习和思考
最近在学FWT,抽点时间出来把这个算法总结一下. 快速沃尔什变换(Fast Walsh-Hadamard Transform),简称FWT.是快速完成集合卷积运算的一种算法. 主要功能是求:,其中为集 ...
- FWT快速沃尔什变换学习笔记
FWT快速沃尔什变换学习笔记 1.FWT用来干啥啊 回忆一下多项式的卷积\(C_k=\sum_{i+j=k}A_i*B_j\) 我们可以用\(FFT\)来做. 甚至在一些特殊情况下,我们\(C_k=\ ...
- 快速沃尔什变换 FWT 学习笔记【多项式】
〇.前言 之前看到异或就担心是 FWT,然后才开始想别的. 这次学了 FWT 以后,以后判断应该就很快了吧? 参考资料 FWT 详解 知识点 by neither_nor 集训队论文 2015 集合幂 ...
- 浅谈算法——FWT(快速沃尔什变换)
其实FWT我啥都不会,反正就是记一波结论,记住就好-- 具体证明的话,推荐博客:FWT快速沃尔什变换学习笔记 现有一些卷积,形如 \(C_k=\sum\limits_{i\lor j=k}A_i*B_ ...
- 集合并卷积的三种求法(分治乘法,快速莫比乌斯变换(FMT),快速沃尔什变换(FWT))
也许更好的阅读体验 本文主要内容是对武汉市第二中学吕凯风同学的论文<集合幂级数的性质与应用及其快速算法>的理解 定义 集合幂级数 为了更方便的研究集合的卷积,引入集合幂级数的概念 集合幂级 ...
- 能轻松背板子的FWT(快速沃尔什变换)
FWT应用 我不知道\(FWT\)的严格定义 百度百科和维基都不知道给一坨什么****东西** FWT(Fast Walsh Fransform),中文名快速沃尔什变换 然后我也不知道\(FWT\)到 ...
- [学习笔记]FWT——快速沃尔什变换
解决涉及子集配凑的卷积问题 一.介绍 1.基本用法 FWT快速沃尔什变换学习笔记 就是解决一类问题: $f[k]=\sum_{i\oplus j=k}a[i]*b[j]$ 基本思想和FFT类似. 首先 ...
随机推荐
- 如何在 Flutter 中集成华为云函数服务
介绍 云函数是一项 Serverless 计算服务,提供 FaaS(Function as a Service)能力,可以帮助开发者大幅简化应用开发与运维相关事务,降低应用功能的实现门槛,快速构建业务 ...
- 2.go-GIN快速入门
一.go mod安装 1.为什么要安装go mod 在项目中需要某个依赖包,必须使用go get安装,否则运行go run main.go会报错.这种方式在依赖包较多时不便于管理,于是在go1.11版 ...
- python-利用random模块生成测试数据封装方法总结
1.前言: 在测试中经常有需要用到参数化,我们可以用random模块,faker模块生成测试数据,也可以用到pymysql,此文主要针对random模块生成任意个数的随机整数,随机字符串,随机手机号, ...
- 利用AWVS扫描Web漏洞
实验目的 利用AWVS扫描Web漏洞. 实验原理 AWVS是一款知名的网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测流行安全漏洞. 实验内容 AWVS是一个自动化的web应用程序安全测试工具, ...
- IMIX功能测试——网络测试仪实操
在真实的网络环境中,用户产生的网络数据报文的长度并不是固定的,也就要求我们在评估DUT转发能力时,不能仅仅测试固定长度的报文,而是需要测试多种不同报文长度的组合. 信而泰RENIX测试仪中的iMIX报 ...
- Java的诞生历史
Java帝国的诞生 1.1972年C诞生 贴近硬件,运行极快,效率极高 操作系统,编译器,数据库,网络系统等都采用C语言 但是,它的指针和内存管理给程序员安上了"枷锁".它的指针没 ...
- 【基础知识】CPU 是如何工作的 |CPU 通过总线读取内存的工作方式
一.简单cpu 是如何工作 方式讲解 CPU 的根本任务就是执行指令,对计算机来说最终都是一串由 0 和 1 组成的序列.CPU 从逻辑上可以划分成 3 个模块,分别是控制单元.运算单元和存储单元 ...
- mysql集群--基于centos7
1 MySQL主从备份 主机:192.168.43.8 从机:192.168.43.6 条件:主机和从机都安装了mysql,开启了二进制日志 安装mysql (mysql 和 mysql-server ...
- html实现随机验证码
代码: <!DOCTYPE html> <html> <!-- head --> <head> <title>图片登录验证</titl ...
- VSCode空格变成虚点
"editor.renderWhitespace": "all",