首页 > 其他分享 >浅谈快速莫比乌斯/沃尔什变换(FMT/FWT)

浅谈快速莫比乌斯/沃尔什变换(FMT/FWT)

时间:2022-12-08 21:14:59浏览次数:48  
标签:浅谈 limits 卷积 FMT 变换 沃尔什 subseteq sum

前置知识

  • 多项式基础
  • 快速傅里叶变换/数论变换(FFT/FNTT)
  • 位运算(集合运算)

引入·位运算卷积

典型的 FFT, NTT 被用于解决 加法卷积 问题。具体地,它可以解决的基本问题是:给定 \(\{f(i)\}, \{g(i)\}\) ,求:

\[\{h(i) = \sum\limits_{k+t=i}f(k)\cdot g(t)\} \]

而 FMT, FWT 对应地,用来解决一类被称为 位运算卷积 的问题。这类问题的基本形式为:给定 \(\{f(i)\}, \{g(i)\}\) ,求:

\[\{h(i) = \sum\limits_{k\star t=i}f(k)\cdot g(t)\}\\ (其中\star\in\{|, \&, \oplus, \odot\}) \]

其中,用于 \(|, \&\) 的是 快速莫比乌斯变换 ,用于 \(\oplus, \odot\) 的是 快速沃尔什变换 ,它们的原理有一定差异。然而,无论是 FFT 还是其它多项式变换,核心都是将复杂的 卷积 转化成简单的 点乘 运算,从而加快计算。

注意到“或”和“与”、“异或”和“同或”同构,所以下文主要分析“或卷积”和“异或卷积”,同时也给出后两者的式子和实现。

二进制位运算和集合的交、并、对称差运算有着等价关系,所以 FMT, FWT 也可以被用于集合的处理。后文也将集合的符号如 \(|A|\) 、\(\subseteq\) 等应用于二进制整数。

快速莫比乌斯变换

正变换

快速莫比乌斯变换的核心是 高维前缀和和子集反演 。首先推一个或运算卷积的基本式子:

\[设F(x) = \sum\limits_{i\subseteq x}f(i),G(x) = \sum\limits_{i\subseteq x}g(i), H(x) = \sum\limits_{i\subseteq x}h(i);\\ \begin{align*} 则F(x)\cdot G(x) &= \left(\sum\limits_{i\subseteq x}{f(i)}\right)\cdot\left(\sum\limits_{i\subseteq x}{g(i)}\right)\\ &= \sum\limits_{i\subseteq x}{\sum\limits_{j\subseteq x}{f(i)\cdot g(j)}}\\ &= \sum\limits_{y\subseteq x}{\sum\limits_{i|j=y}{f(i)\cdot g(j)}}\\ &= \sum\limits_{y\subseteq x}{g(y)}\\ &= H(x) \end{align*} \]

类比 FFT 的知识,可以看出,这个式子就给出了从 卷积点乘 的变换。然而,暴力计算上式是 \(\Theta(n^2)\) 的,当然,通过 \(\Theta(3^{|S|})\) 枚举子集的技术,可以把复杂度优化到\(\Theta(3^{\log_2n}) = \Theta(n^{1.585})\),但这显然不够。运用一些高维前缀和技巧,这一复杂度可以被优化到\(\Theta(n\log n)\)。这就是 FMT。

具体地,在计算数组 \(\{F(x)\}\) 时,FMT 依次考虑 \(x\) 的二进制位。设 \(B_i(x)\) 表示 \(x\) 在二进制下的第 \(i\) 位;再定义 \(F_i(x)\) :

\[F_i(x) = \sum\limits_{y}{[\forall j \le i, B_j(y) \le B_j(x);~\forall j > i, B_j(y) = B_j(x)]f(y)} \]

也就是说,\(F_i(x)\) 是 \(f(x)\) 二进制 \(i\) 位以前的前缀和,而 \(i+1\) 位开始的位则原封不动,不进行前缀和。因此有 \(F_{|n|}(x) = F(x)\) 即为待求多项式(其中 \(|n|\) 表示 \(n\) 的二进制位数——也就是最大的 \(x\) 的二进制位数),另外设 \(F_{-1}(x) = f(x)\) 表示什么也没有组合。

接下来,考虑当前正在计算 \(F_k(x), k\ge 0\) 。那么有:

\[F_k(x) = \begin{cases} F_{k-1}(x) + F_{k-1}(x-2^k), &B_k(x) = 1\\ F_{k-1}(x), &B_k(x) = 0 \end{cases} \]

这是因为,对于所有元素,它 \(k-1\) 之前的前缀和已经保存在 \(F_{k-1}\) ,现在直接组合第 \(k\) 位,得到的就是 \(k\) 位之前的前缀和。

逆变换

根据 FMT 基本式,逆变换的实质就是:

\[已知F(x) = \sum\limits_{i\subseteq x}f(i),求f(x) \]

这就是子集反演。直接带入:

\[f(x) = \sum\limits_{i\subseteq x}(-1)^{|x|-|i|}F(i) \]

这个形式比正变换多了一个容斥系数。考察一下前面的推导,看看那些部分需要改。因为 FMT 计算高维前缀和的过程就是在逐位累计,而 \((-1)^{|x|-|i|}\) 的值变化当且仅当|x|增加一位( \(i\) 的部分是不变的,始终是 \((-1)^{-|i|}\) 同 \(F(i)\) 相对应),也就是当前集合的二进制位多了一位,所以只需要在这些时候考虑即可。

具体地,计算 \(f_k(x)\) 时,当且仅当将 \(f_{k-1}(x-2^k)\) 累计到 \(f_{k}(x)\)中时,集合 \(x\) 变大 1。因此将转移式修改为:

\[f_k(x) = \begin{cases} f_{k-1}(x) - f_{k-1}(x-2^k), &B_k(x) = 1\\ f_{k-1}(x), &B_k(x) = 0 \end{cases} \]

而对于初值\(f_{-1}(x)\) ,因为没有做前缀和,所以 \(|x| - |i| = 0\) ,则 \(f_{-1}(x) = F(x)\) 。

与运算卷积

仅给出式子:

\[\begin{align} &F(x) = \sum\limits_{x\subseteq i}f(i)\\ &F_i(x) = \sum\limits_{y}{[\forall j \le i, B_j(y) \ge B_j(x);~\forall j > i, B_j(y) = B_j(x)]f(y)}\\ &F_k(x) = \begin{cases} F_{k-1}(x) + F_{k-1}(x+2^k), &B_k(x) = 0\\ F_{k-1}(x), &B_k(x) = 1 \end{cases}\\ &f_k(x) = \begin{cases} f_{k-1}(x) - f_{k-1}(x+2^k), &B_k(x) = 0\\ f_{k-1}(x), &B_k(x) = 1 \end{cases} \end{align} \]

实现

// 不想写了

快速沃尔什变换

标签:浅谈,limits,卷积,FMT,变换,沃尔什,subseteq,sum
From: https://www.cnblogs.com/kyeecccccc/p/16965898.html

相关文章

  • 浅谈“配置化”与 normalize 在复杂嵌套组件开发中的应用
    简介视图层相比脚本,具有不便于调试、无效信息过多(与当前逻辑不相关的属性)等特点,因此,同样的逻辑位于视图可能比位于脚本中的复杂程度更高。因此,在开发复杂组件,尤其是嵌套......
  • 浅谈软件编程中的8大数据结构
    文章目录​​前言​​​​一、为什么要研究数据结构​​​​二、数据结构的分类​​​​1.数组(Array)​​​​2.链表(LinkedList)​​​​3.队列(Queue)​​​​4.栈(Stack)​​​......
  • 浅谈电动汽车充电桩建设现状及规划方案
    摘要:为实现对电动汽车充电桩的优化建设,对其建设现状及规划方案展开研究。当前充电桩建设存在建设区域分布不均匀、社会公共停车场充电费用较高和部分充电设施维护不及时等......
  • 浅谈无线测温在化工行业配电系统的应用
    摘要:稳定的电力供应是保障企业正常生产的基础,因此如何保证电力设备的正常运行,是企业重点关注的一个问题。温度是表征电力设备运行正常的一个重要参数,在电力设备运行的过程中......
  • 浅谈船舶岸电系统绝缘监测及故障定位需求及应用
     摘要:随着现代船舶发展,船舶电气化程度越来越高,船舶电站的的容量也越来越大,随之而来的是电网的绝缘问题更加复杂化。船舶电力系统一般采用IT系统,即不接地系统。由于电网是......
  • 浅谈Linux容器安全:chroot,capability与namespace技术
    作者只是个萌新,大佬轻喷。文章最终确定以时间顺序浅谈Linux容器安全原理。安全原理相关知识网上已经有很多了,咱通过几个具体攻击实例来讲讲它们的真实作用。演示均在猫......
  • (转)JS核心系列:浅谈函数的作用域
    一、作用域(scope)所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。复制代码1functionscope(){2varfoo="global";3if(windo......
  • MySQL 存储过程浅谈
    一、存储过程定义​存储过程(StoredProcedure):一组为了完成特定功能的SQL语句集,存储在数据库中,经过一次编译后不需要再次编译。二、存储过程特点1、可以完成复杂的判断和......
  • 浅谈性能测试中混合场景比例控制方式
    控制比例的方式很多,下面来举例研究。 方式一:吞吐量控制器控制比例(同一个线程组中)      持续3秒  结论:可以控制比例 方式二:吞吐量控制器控......
  • 浅谈Java
    这里必须说明,我着实是厌恶Java这门语言的。只是很不凑巧,这世界的确需要一门虚拟机编程语言。我想,如果服务端程序用C/C++来写的话,我想,一旦服务器被恶意攻击,当操作系统崩溃的......