首页 > 其他分享 >【学习笔记】多项式学习笔记2:集合幂级数

【学习笔记】多项式学习笔记2:集合幂级数

时间:2023-02-03 12:00:21浏览次数:65  
标签:幂级数 Lg 卷积 text sum 笔记 学习 集合 subseteq

点击查看目录

目录

参考资料:集合幂级数相关 by Alex_Wei

集合幂级数

定义

定义集合 \(U=\{1,2,\cdots,n\}\),\(2^U\) 表示 \(U\) 的所有子集构成的集合。

定义从集合到数值的映射 \(f\),则集合幂级数 \(f=\sum_{S\in 2^{U}} f_{S}x^S\),\(x^S\) 只是占位符,用来表示 \(S\) 对应位置,并无实际意义。

运算

加法运算同正常形式幂级数相同,对应位置加和即可。

乘法运算的系数仍然是对应相乘,而下标的运算则是按照一种关于集合的运算 \(\oplus\)。

\[h=f\cdot g=\sum_{L\in 2^U}f_Lx^L\cdot\sum_{R\in 2^U}g_Rx^R \]

对于某一项而言:

\[h_S=\sum_{L,R\in 2^U}[L\oplus R=S]f_Lg_R \]

于是整体:

\[h=\sum_{S\in 2^U}\sum_{L,R\in 2^U}[L\oplus R=S]a_Lb_R x^S \]

应用

多数情况下我们将状态压成二进制并卷积进行计算,因此应用较广的是以位运算作为 \(\oplus\),也称为 位运算卷积

子集相关运算

高位前(后)缀和

\[f(S)=\sum_{T\subseteq S} g(T) \]

\[f(S)=\sum_{S\subseteq T}g(T) \]

对于第一个式子,枚举当前位置 \(k\),假设已知前 \(k-1\) 位的和,即 \(f(S)\) 得到的贡献 \(g(T)\) 中 \(T\) 在前 \(k-1\) 位是 \(S\) 的子集,剩余位置与 \(S\) 相同,计算第 \(k\) 位实际上是这一位是 \(0\) 的答案贡献到是 \(1\) 的位置。

而第二个式子则是 \(1\) 到 \(0\) 的贡献。

点击查看代码
//前缀
for(int k=0;k<n;++k){
    for(int i=0;i<(1<<n);++i){
        if(i&(1<<k)) f[i]+=f[i^(1<<k)];
    }
}
//后缀
for(int k=0;k<n;++k){
    for(int i=0;i<(1<<n);++i){
        if(!(i&(1<<k))) f[i]+=f[i^(1<<k)];
    }
}

高维前(后)缀差分

子集和超集反演之后,得到:

\[g(S)=\sum_{T\subseteq S}(-1)^{|S|-|T|} f(T) \]

\[g(S)=\sum_{S\subseteq T}(-1)^{|T|-|S|} f(T) \]

只需要在转移时增加一个系数 \(-1\),至于没有次数的原因,考虑 \(T\) 到 \(S\) 的靠拢过程应当是增补 \(1\)(作为子集)或削去 \(1\)(作为超集),这样转移次数就是两个集合大小之差,每次转移乘 \(-1\),正符合上面式子的次数。

点击查看代码
//前缀
for(int k=0;k<n;++k){
    for(int i=0;i<(1<<n);++i){
        if(i&(1<<k)) f[i]-=f[i^(1<<k)];
    }
}
//后缀
for(int k=0;k<n;++k){
    for(int i=0;i<(1<<n);++i){
        if(!(i&(1<<k))) f[i]-=f[i^(1<<k)];
    }
}

快速莫比乌斯变换 \(\text{FMT(Fsat Mobius Transform)}\)

或卷积(集合并卷积)

考虑构造 \(f'_S=\sum_{T\subseteq S}f_T\),则 \(f_S=\sum_{T\subseteq S}(-1)^{|S|-|T|}f'_T\)。

\[\begin{aligned} h’_S&=\sum_{T\subseteq S}\sum_{L\in 2^U,R\in 2^U}[L\cup R=T] f_Lg_R\\ &=\sum_{L\in 2^U,R\in 2^U}[L\cup R\subseteq S] f_Lg_R\\ &=\sum_{L\in 2^U,R\in 2^U}[L\subseteq S][R\subseteq T] f_Lg_R\\ &=\sum_{L\in 2^U} [L\subseteq S] f_L\sum_{R\in 2^U} [R\subseteq S] g_R\\ &=f'_Lg'_R \end{aligned}\]

于是做法是先构造出 \(f'\) 与 \(g'\),乘出 \(h'\),再逆变换回 \(h\),这个逆变换称为 \(\text{FMI(Fsat Mobius Inversion)}\)。

与卷积(集合交卷积)

考虑构造 \(f'_S=\sum_{S\subseteq T}f_T\),则 \(f_S\sum_{S\subseteq T}(-1)^{|S|-|T|}f'_T\)。

把或卷积稍微改变一下。

\[\begin{aligned} h’_S&=\sum_{S\subseteq T}\sum_{L\in 2^U,R\in 2^U}[L\cap R=T] f_Lg_R\\ &=\sum_{L\in 2^U,R\in 2^U}[S\subseteq L\cap R] f_Lg_R\\ &=\sum_{L\in 2^U,R\in 2^U}[S\subseteq L][S\subseteq R] f_Lg_R\\ &=\sum_{L\in 2^U} [S\subseteq L] f_L\sum_{R\in 2^U} [S\subseteq R] g_R\\ &=f'_Lg'_R \end{aligned}\]

点击查看代码
int n;

inline void FMT_or(int *f,int c){
    for(int k=0;k<n;++k){
        for(int i=0;i<(1<<n);++i){
            if(i&(1<<k)) f[i]=(f[i]+1ll*c*f[i^(1<<k)]%mod)%mod;
        }
    }
}
inline void FMT_and(int *f,int c){
    for(int k=0;k<n;++k){
        for(int i=0;i<(1<<n);++i){
            if(!(i&(1<<k))) f[i]=(f[i]+1ll*c*f[i^(1<<k)]%mod)%mod;
        }
    }
}

int a[maxn],b[maxn];
int F[maxn],G[maxn],H[maxn];

int main(){
    n=read();
    for(int i=0;i<(1<<n);++i) a[i]=read();
    for(int i=0;i<(1<<n);++i) b[i]=read();
    for(int i=0;i<(1<<n);++i) F[i]=a[i],G[i]=b[i];
    FMT_or(F,1),FMT_or(G,1);
    for(int i=0;i<(1<<n);++i) H[i]=1ll*F[i]*G[i]%mod;
    FMT_or(H,mod-1);
    for(int i=0;i<(1<<n);++i) printf("%d ",H[i]);
    printf("\n");
    for(int i=0;i<(1<<n);++i) F[i]=a[i],G[i]=b[i];
    FMT_and(F,1),FMT_and(G,1);
    for(int i=0;i<(1<<n);++i) H[i]=1ll*F[i]*G[i]%mod;
    FMT_and(H,mod-1);
    for(int i=0;i<(1<<n);++i) printf("%d ",H[i]);
    printf("\n");
    return 0;
}

特殊性质

注意到与多项式乘法中的 \(\text{FFT}\) 不同的是,\(\text{FMT}\) 是一个纯粹的线性求和,因此经过若干次运算后规模仍然是 \(2^U\)。

这使得我们在进行多次乘法时,可以全部 \(\text{FMT}\) 后求积再 \(\text{FMI}\),而不必要像 \(\text{FFT}\) 一样每次都在系数与点值之间来回切换。

快速沃尔什变换 \(\text{FWT(Fast Walsh Transform)}\)

异或卷积(集合对称差卷积)

标签:幂级数,Lg,卷积,text,sum,笔记,学习,集合,subseteq
From: https://www.cnblogs.com/SoyTony/p/Learning_Notes_about_Polynomial_2.html

相关文章

  • Go 语言学习之路(笔记)
    将大佬的博客整理成相关目录。查找方便go语言安装及介绍go语言环境搭建go语言基础之变量和常量go语言基础之基本数据类型go语言基础之运算符go语言基础之流程控制Go......
  • DTD 学习
    DTD教程目录目录DTD教程目录DTD简介DTD是什么?DTD与XML的关系?为什么使用DTD?内部DTD外部DTDXML构建模块元素属性实体PCDATACDATADTD元素DTD属性DTD实体参考......
  • 笔记:海量数据的查询方法
    概述:每年大约有几千万近一亿的业务数据量,如何提高查询性能。具体方案:在表结构初始化阶段时,需要添加查询条件的索引;并且可以使用uuid主键和数字主键的联合业务主键,根据......
  • (笔记)【NTP系列:06】NTP报文解读
    一、概念NTP(NetworkTimeProtocol),互联网时间协议。 UTC(CoordinatedUniversalTime),协调通用时间。根据原子振荡周期所计算的物理时钟,这种计算方式对于时间的计算误差......
  • 快速傅里叶变换学习简记
    多项式部分是OI中一个比较math和naive的部分,各种多项式题声(chou)名(ming)远(zhao)扬(zhu)。因为作者数学较弱,因此这篇文章会比较注重数学部分的理解。同时感谢所......
  • (笔记)NTP时间同步失败:Windows(W32Time)作为NTP时钟源服务端,Linux作为客户端
     一、问题现象使用windows(W32Time)作NTP时钟源服务端,控制板端Linux作为客户端,使用ntpd服务无法同步时间,但是ntpdate是可以同步成功。 二、问题分析 1.从报文的角度分......
  • 机器学习基本概念
    机器学习就是把无用的数据转换成有用的信息目标变量是机器学习算法的预测结果,在分类算法中目标变量的类型通常是标称型(枚举或者离散的)的,而在回归算法中通常是连续型的。......
  • 机器学习——k-近邻算法(KNN)、
    k-近邻算法(kNN),它的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新......
  • 机器学习——决策树
    决策树原理决策树的一个重要任务是获取数据中所蕴含的知识信息,因此决策树可以使用不熟悉的数据集合,并从中提取出一系列规则,在这些机器根据数据集创建规则时,就是机器学习的......
  • 机器学习——逻辑回归
    回归的含义——用观察使得认知接近真值的过程,回归本源。​在我们认知(测量)这个世界的时候,我们并不能得到这个世界的全部信息(真值),只能得到这个世界展现出的可被我们观测的部......