首页 > 其他分享 >[FWT/FMT] 位运算

[FWT/FMT] 位运算

时间:2023-01-26 20:33:09浏览次数:48  
标签:dots 运算 cup mathscr FMT sf FWT otimes sum

快速位运算变换学习笔记

集合占位幂级数

设 \(R\) 是环,定义 \(R\langle S\rangle = {(2^S)}^R\),同时定义 \(R\langle S\rangle\) 中的加法和乘法:

\[(a+b)(S)=a(S)+b(S)\\ (a * b)(S) = \sum_{A\otimes B=S} a(A)b(B) \]

。当 \(\otimes=\triangle\) 时,\(R\langle S \rangle\) 同构于 \(R[[S]]/(s^2 - 1 \mid s \in S)\)。当 \(\otimes=\sqcup\) 时,\(R\langle S \rangle\) 同构于 \(R[[S]]/(s^2 \mid s \in S)\)。

\(\otimes = \cup\)

考虑 \(\mathscr S_{\sf OR}[f](A) = \sum\limits_{a \subseteq A} f(a)\),则有

\[\begin{aligned} \mathscr S_{\sf OR}[f * g](A) &= \sum_{a \cup b \subseteq A} f(a) g(b) \\ &= \sum_{a \subseteq A} \sum_{b \subseteq A} f(a) g(b) \\ &= \mathscr S_{\sf OR}[f](A) \times \mathscr S_{\sf OR}[g](A) \end{aligned} \]

。考虑将 \(2^S\) 同构于 \(\mathbb F_2^{n}\)。则 \(\mathscr S_{\sf OR}\) 相当于 \(f\) 上的前缀和操作。考虑高维前缀和算法:

  • 当 \(n=1\) 时:显然可以得到正确结果。
  • 当 \(n > 1\) 时:对于 \(n \notin S\) 和 \(n \in S\) 的两个集合进行 \(n-1\)-\(\mathscr S_{\sf OR}\),再进行 \(1\)-\(\mathscr S_{\sf OR}\) 即可。求和号交换即可证明。

对于 \(\mathscr S_{\sf IOR}\),可以在 \(n=1\) 时将 \(a+b\) 替换为 \(a-b\) 即可。

\(\otimes = \cap\)

\[\begin{aligned} (a*b)(S)&= \sum_{A \cap B = S} a(A) b(B) \\ &= \sum_{A^C \cup B^C = S^C} a(A^C) b(B^C) \\ &= (a*b)(S^C) & \text{which }\otimes=\cup \end{aligned} \]

\(\otimes=\sqcup\)

显然 \(A \cup B = A \sqcup B \iff |A \cup B|=|A|+|B|\)。 \(\sigma_i[a](A) = [|A|=i] a(A)\),则有

\[\begin{aligned} (a*b)(S) &= \sum_{A \cup B = S} [|A|+|B|=|S|]a(A)b(B) \\ &= \sum_{i+j=|S|} \sum_{A \cup B = S} \sigma_i[a](A)\sigma_j[b](B) \\ &= \sum_{i+j=|S|} (\sigma_i[a] * \sigma_j[b])(S) & \text{which } \otimes=\cup \end{aligned} \]

最后这个式子可以在 \(R\langle S \rangle[[x]]\) 上乘积求出。由于常数较小,所以一般不使用 FFT,暴力求出。

这种卷积(如果扩展到 \(* : R[S] \times R[S] \to R[S \sqcup S]\))和 \(R[S]\) 同态。

扩展

主要思想:

\[{\sf Poly}(a) = \sum_{i\ge0} \sigma_i[a] x^i \]

polyinv

分治 FFT 定义式:

\[f_i = \sum_{j=0}^{i-1} f_j g_{i-j} \iff {\rm OGF}[f] = \dfrac 1{1 - {\rm OGF}[g]} \]

,则我们可以通过两边同乘 \(g_0^{-1}\) 等方式得到通用 \(\Theta(n^2)\) Polyinv 计算。

在 \(R\langle S \rangle[[x]]\) 中 \(g_0\) 只有常数项,所以可以求逆。

类似地可以推导出其他操作。

应用

集合的划分计数:

TODO

\(\otimes = \triangle\)

注意到 \(A \sqcup B \equiv A \operatorname\triangle B \pmod 2\),于是可以将其视为高维循环卷积。高维 FFT 即可,也即 \(B_0 = A_0 + A_1; B_1 = A_0 - A_1\)。

逆就是 \(\dfrac {A_0 \pm A_1}{2}\),可以发现就是 \(\dfrac 1n\) 在每一次迭代中分解。

这个同样存在一定扩展空间。

位运算卷积与多重线性变换

多重线性变换

设 \(V_1,V_2,\dots,V_n\) 是 \(\mathbb F\) 上的线性空间,则 \(f : \prod V \to \mathbb F\) 是多重线性函数当且仅当

  • 对于任意的 \(x_1,x_2,\dots,x_{i-1},x_{i+1},\dots,x_n\),\(g(t) = f(x_1,x_2,\dots,x_{i-1},t,x_{i+1},\dots,x_n)\) 是线性函数

则 \((L[V_1,V_2,\dots,V_n], +, \times)\) 在 \(\mathbb F\) 上构成线性空间,其中 \(L[V_1,V_2,\dots,V_n]\) 代表所有 \(\prod V\) 上的多重线性函数。设 \(V_i\) 的线性基为 \(\epsilon_{i,j}\),则有:

\[\begin{aligned} f(\boldsymbol v_1,\boldsymbol v_2,\dots, \boldsymbol v_n) &= f(\sum \lambda_{1,i} \epsilon_{1,i}, \sum \lambda_{2,i} \epsilon_{2,i}, \dots, \sum \lambda_{n,i} \epsilon_{n,i}) \\ &= \sum_{i_1,i_2,\dots,i_n} f(\boldsymbol \epsilon_i)\prod_j \lambda_{j,i_j} \end{aligned} \]

TODO

标签:dots,运算,cup,mathscr,FMT,sf,FWT,otimes,sum
From: https://www.cnblogs.com/lhx-oier/p/17068175.html

相关文章

  • 运算放大器的扩压扩流电路(三)
    这个部分是(二)的仿真部分。仿真电路和仿真结果如下图所示:  Q4、Q5和R8、R9构成一个恒流源,电流为VBE(Q4)/R9。Q2、Q3和R5、R6构成达林顿连接,作为中间级的放大电路,是反......
  • C# 泛型里使用四则运算的办法,委托的妙用
    直接上代码publicstaticclassTestGenricCalc{publicstaticTClac<T>(Tt1,Tt2,Func<T,T,T>func)whereT:struct{return......
  • 《程序是怎样跑起来的》·第三章 计算机进行小数运算时出错的原因
    开篇:[问题/答案](1)二进制数0.1,用十进制数表示的话是多少?   0.5(2)用小数点后有3位的二进制数,能表示十进制数0.625吗?   可以,0.101(3)将小数分为符号、尾数、基数......
  • 17 | 建立数据通路(上):指令+运算=CPU
    前面几讲里,我从两个不同的部分为你讲解了CPU的功能。指令计算然而,光知道这两部分还不能算是真正揭开了CPU的秘密,只有把“指令”和“计算”这两部分功能连通......
  • JS 数字运算的矫正函数
    代码:constmath_helper={};/*加法*/math_helper.add=function(num1,num2){//两个参数应为有效的数字if(typeofnum1!=='number'||typeofnum2!=......
  • JavaScript 运算符&算数运算符
    一、运算符运算符(operator)也被称为操作符,是用于实现赋值、比较和执行算数运算等功能的符号。JavaScript中常用的运算符有:算数运算符递增和递减运算符比较运算符逻辑运算符赋......
  • C++ 实现复制赋值运算符重载
    考察点返回值类型MyClass&,可以连续赋值参数类型:(constMyClass&rhs)或者(MyClassrhs)值传递(copy-swap)自赋值安全无内存泄漏,旧值需要析构异常安全参考实现c......
  • 位运算的小技巧
    1//1.使用左移运算符<<迅速得出2的次方21<<2//4,即2的2次方31<<10//1024,即2的10次方4//但是要注意使用场景5x=2e9;//2000000000......
  • 多项式基础运算
    多项式全家桶,但是这个做标题有失风雅。很多地方的严谨证明因为水平不足略过,等之后数学水平提高再回来修正。一些有用的资料:NTT与多项式全家桶-command_block的博客......
  • 07_运算符
    """_*_coding:utf-8_*_@Time:2023/1/2218:53@Author:软柠柠吖@Description:运算符/:正常除(含小数)//:整除(返回商的整数部分,不四舍五入)......