知识点简单总结——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(快速子集变换)的更多相关文章

  1. Codeforces 662C(快速沃尔什变换 FWT)

    感觉快速沃尔什变换和快速傅里叶变换有很大的区别啊orz 不是很明白为什么位运算也可以叫做卷积(或许不应该叫卷积吧) 我是看 http://blog.csdn.net/liangzhaoyang1/ar ...

  2. 快速沃尔什变换(FWT)及K进制异或卷积&快速子集变换(FST)讲解

    前言: $FWT$是用来处理位运算(异或.与.或)卷积的一种变换.位运算卷积是什么?形如$f[i]=\sum\limits_{j\oplus k==i}^{ }g[j]*h[k]$的卷积形式(其中$\ ...

  3. 关于快速沃尔什变换(FWT)的一点学习和思考

    最近在学FWT,抽点时间出来把这个算法总结一下. 快速沃尔什变换(Fast Walsh-Hadamard Transform),简称FWT.是快速完成集合卷积运算的一种算法. 主要功能是求:,其中为集 ...

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

    FWT快速沃尔什变换学习笔记 1.FWT用来干啥啊 回忆一下多项式的卷积\(C_k=\sum_{i+j=k}A_i*B_j\) 我们可以用\(FFT\)来做. 甚至在一些特殊情况下,我们\(C_k=\ ...

  5. 快速沃尔什变换 FWT 学习笔记【多项式】

    〇.前言 之前看到异或就担心是 FWT,然后才开始想别的. 这次学了 FWT 以后,以后判断应该就很快了吧? 参考资料 FWT 详解 知识点 by neither_nor 集训队论文 2015 集合幂 ...

  6. 浅谈算法——FWT(快速沃尔什变换)

    其实FWT我啥都不会,反正就是记一波结论,记住就好-- 具体证明的话,推荐博客:FWT快速沃尔什变换学习笔记 现有一些卷积,形如 \(C_k=\sum\limits_{i\lor j=k}A_i*B_ ...

  7. 集合并卷积的三种求法(分治乘法,快速莫比乌斯变换(FMT),快速沃尔什变换(FWT))

    也许更好的阅读体验 本文主要内容是对武汉市第二中学吕凯风同学的论文<集合幂级数的性质与应用及其快速算法>的理解 定义 集合幂级数 为了更方便的研究集合的卷积,引入集合幂级数的概念 集合幂级 ...

  8. 能轻松背板子的FWT(快速沃尔什变换)

    FWT应用 我不知道\(FWT\)的严格定义 百度百科和维基都不知道给一坨什么****东西** FWT(Fast Walsh Fransform),中文名快速沃尔什变换 然后我也不知道\(FWT\)到 ...

  9. [学习笔记]FWT——快速沃尔什变换

    解决涉及子集配凑的卷积问题 一.介绍 1.基本用法 FWT快速沃尔什变换学习笔记 就是解决一类问题: $f[k]=\sum_{i\oplus j=k}a[i]*b[j]$ 基本思想和FFT类似. 首先 ...

随机推荐

  1. 如何在 Flutter 中集成华为云函数服务

    介绍 云函数是一项 Serverless 计算服务,提供 FaaS(Function as a Service)能力,可以帮助开发者大幅简化应用开发与运维相关事务,降低应用功能的实现门槛,快速构建业务 ...

  2. 2.go-GIN快速入门

    一.go mod安装 1.为什么要安装go mod 在项目中需要某个依赖包,必须使用go get安装,否则运行go run main.go会报错.这种方式在依赖包较多时不便于管理,于是在go1.11版 ...

  3. python-利用random模块生成测试数据封装方法总结

    1.前言: 在测试中经常有需要用到参数化,我们可以用random模块,faker模块生成测试数据,也可以用到pymysql,此文主要针对random模块生成任意个数的随机整数,随机字符串,随机手机号, ...

  4. 利用AWVS扫描Web漏洞

    实验目的 利用AWVS扫描Web漏洞. 实验原理 AWVS是一款知名的网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测流行安全漏洞. 实验内容 AWVS是一个自动化的web应用程序安全测试工具, ...

  5. IMIX功能测试——网络测试仪实操

    在真实的网络环境中,用户产生的网络数据报文的长度并不是固定的,也就要求我们在评估DUT转发能力时,不能仅仅测试固定长度的报文,而是需要测试多种不同报文长度的组合. 信而泰RENIX测试仪中的iMIX报 ...

  6. Java的诞生历史

    Java帝国的诞生 1.1972年C诞生 贴近硬件,运行极快,效率极高 操作系统,编译器,数据库,网络系统等都采用C语言 但是,它的指针和内存管理给程序员安上了"枷锁".它的指针没 ...

  7. 【基础知识】CPU 是如何工作的 |CPU 通过总线读取内存的工作方式

    一.简单cpu  是如何工作 方式讲解 CPU 的根本任务就是执行指令,对计算机来说最终都是一串由 0 和 1 组成的序列.CPU 从逻辑上可以划分成 3 个模块,分别是控制单元.运算单元和存储单元 ...

  8. mysql集群--基于centos7

    1 MySQL主从备份 主机:192.168.43.8 从机:192.168.43.6 条件:主机和从机都安装了mysql,开启了二进制日志 安装mysql (mysql 和 mysql-server ...

  9. html实现随机验证码

    代码: <!DOCTYPE html> <html> <!-- head --> <head> <title>图片登录验证</titl ...

  10. VSCode空格变成虚点

    "editor.renderWhitespace": "all",