省流:集合幂就是 R [ x 1 , x 2 , … , x n ] / ( x 1 2 , x 2 2 , … , x n 2 ) R[x_1,x_2,\dots,x_n]/(x_{\thinspace 1}^2,x_2^{\thinspace 2},\dots,x_n^{\thinspace 2}) R[x1​,x2​,…,xn​]/(x12​,x22​,…,xn2​) 的结果,所有变换都是插值。

零、前言

可以先看一看吕凯风《集合幂级数的性质与应用及其快速算法》。尽管这个链接是多数人都无法访问的。

你以为它很抽象?你有没有想过,其实我们还可以定义矩阵幂,即 f i , j x i , j f_{i,j}x^{i,j} fi,j​xi,j 满足 x i , j ⋅ x j , k = x i , k x^{i,j}\cdot x^{j,k}=x^{i,k} xi,j⋅xj,k=xi,k 这种东西?只要牢牢地记住,所谓 形式 级数就是,这一切都只是为了形式化罢了。就像生成函数从不考虑收敛域——形式幂级数的本质不过是系数的序列 ⟨ a 0 , a 1 , … , a n , … ⟩ \langle a_0,a_1,\dots,a_n,\dots\rangle ⟨a0​,a1​,…,an​,…⟩ 罢了。

壹、定义

0.记号

设全集为有限集 U = { 1 , 2 , 3 , … , n } \Bbb U=\{1,2,3,\dots,n\} U={1,2,3,…,n} 。设 F F F 是某个域。

1.集合幂级数

对于任意 c ∈ F , S ⫅ U c\in F,\;S\subseteqq\Bbb U c∈F,S⫅U,用 c x S cx^{S} cxS 表示第 S S S 项系数为 c c c,其余各项系数均为 0 0 0 的 集合幂级数。这里的 x S x^S xS 无非是个占位符,表示把 c c c 放在 S S S 这个位置。

那么,一般的集合幂级数可写成
f = ∑ S ⫅ U f S x S f=\sum_{S\subseteqq\Bbb U}f_Sx^{S} f=S⫅U∑​fS​xS

2.加法与减法

设 f , g f,g f,g 均为集合幂级数,那么二者的和 h = f + g h=f{+}g h=f+g 是满足如下条件的集合幂级数:
h S = f S + g S h_S=f_S+g_S hS​=fS​+gS​

减法则为逆运算。容易看出,集合幂级数构成了加法阿贝尔群。

3.乘法

记乘法为 h = f ⋅ g h=f\cdot g h=f⋅g,显然我们希望 乘法对加法有分配律。那么,我们定义 ( f a x a ) ⋅ ( g b x b ) = ( f a g b ) x a ⋆ b (f_ax^{a})\cdot(g_bx^{b})=(f_ag_b)x^{a\star b} (fa​xa)⋅(gb​xb)=(fa​gb​)xa⋆b,然后根据分配律直接定义项数更长的乘法。

自然,我们希望 ⋆ \star ⋆ 是某种集合运算。如果它满足:

  • 交换律。即 L ⋆ R = R ⋆ L L\star R=R\star L L⋆R=R⋆L 。
  • 结合律。即 ( L ⋆ M ) ⋆ R = L ⋆ ( M ⋆ R ) (L\star M)\star R=L\star (M\star R) (L⋆M)⋆R=L⋆(M⋆R) 。

那么,集合幂级数就会满足 交换律、结合律。虽然绝大多数集合运算都满足。

然而,这不足以让乘法是良定义的。我们需要

  • 单位元为空集,即 S ⋆ ∅ = S S\star\varnothing=S S⋆∅=S 。

否则就有一个尴尬的处境是,下面这个看上去很合理的式子
c x S = c x ∅ ⋅ x S = c ⋅ x S cx^{S}=cx^{\varnothing}\cdot x^{S}=c\cdot x^{S} cxS=cx∅⋅xS=c⋅xS

不成立。那么 常数将不再是集合幂级数,这是令人恼怒的!

在单位元为空集时,容易发现,现在集合幂级数构成交换环,并且整个域 F F F 都是它的子环。

贰、莫比乌斯变换

适用于乘法定义为集合并,即 c L x L ⋅ c R x R = ( c L c R ) x L ∪ R c_Lx^L\cdot c_Rx^R=(c_Lc_R)x^{L\cup R} cL​xL⋅cR​xR=(cL​cR​)xL∪R 的情况。

1.定义

集合幂级数 f f f 的莫比乌斯变换为 f ^ \hat{f} f^​,反过来, f ^ \hat f f^​ 的莫比乌斯反演为 f f f 。其定义为
f S ^ = ∑ T ⫅ S f T \hat{f_S}=\sum_{T\subseteqq S}f_T fS​^​=T⫅S∑​fT​

我们可以推出
f S = ∑ T ⫅ S ( − 1 ) ∣ S ∣ − ∣ T ∣ f ^ T f_S=\sum_{T\subseteqq S}(-1)^{|S|-|T|}\hat{f}_T fS​=T⫅S∑​(−1)∣S∣−∣T∣f^​T​

所以 莫比乌斯变换与原集合幂级数是双射。此时 h = f ⋅ g h=f\cdot g h=f⋅g 恰满足
h ^ S = f ^ S ⋅ g ^ S \hat{h}_S=\hat{f}_S\cdot\hat{g}_S h^S​=f^​S​⋅g^​S​

2.性质

莫比乌斯变换对加法有分配律,即
h ^ = f ^ + g ^ ( h = f + g ) \hat h=\hat f{+}\hat g\quad(h=f{+}g) h^=f^​+g^​(h=f+g)

对于任意形式幂级数 T ( x ) T(x) T(x),我们现在需要求得 T ( f ) T(f) T(f),可以考虑其莫比乌斯变换的值:由于多项式只涉及乘法和加法,而莫比乌斯变换对二者都有 “分配律”,所以它一定会化简为 T ( f ^ ) T(\hat f) T(f^​),其中序列加法和序列乘法都是对应位进行操作。换句话说, T ( f S ^ ) T(\hat{f_S}) T(fS​^​) 就是 T ( f ) T(f) T(f) 的莫比乌斯变换后 x S x^S xS 的系数。

3.除法

原本应该放在 1.定义 中,但是那里 ÷ \div ÷ 是未定义的。而现在我们可以很轻松的定义 h = f g h=\frac{f}{g} h=gf​ 为
h ^ S = f S ^ g ^ S \hat{h}_S=\frac{\hat{f_S}}{\hat{g}_S} h^S​=g^​S​fS​^​​

除法运算是有意义的,当且仅当除数的莫比乌斯变换的每一项系数均非零。这完全是废话。

叁、沃尔什变换

适用于乘法定义为集合对称差的情况。

1.定义

f S ^ = ∑ T ⫅ U ( − 1 ) ∣ S ∩ T ∣ f T \hat{f_S}=\sum_{T\subseteqq\Bbb U}(-1)^{|S\cap T|}f_T fS​^​=T⫅U∑​(−1)∣S∩T∣fT​

f S = 1 2 n ∑ T ⫅ U ( − 1 ) ∣ S ∩ T ∣ f T ^ f_S=\frac{1}{2^n}\sum_{T\subseteqq\Bbb U}(-1)^{|S\cap T|}\hat{f_T} fS​=2n1​T⫅U∑​(−1)∣S∩T∣fT​^​

2.另一种理解

FWT \textit{FWT} FWT 其实就是高维点值。我在另一博客中说了不少,这里就不说了吧。

肆、集合占位幂级数

可用于解决子集卷积问题,即 c L x L ⋅ c R x R = { ( c L c R ) x L ∪ R ( L ∩ R = ∅ ) 0 ( L ∩ R ≠ ∅ ) c_Lx^L\cdot c_Rx^R=\begin{cases}(c_Lc_R)x^{L\cup R}&(L\cap R=\varnothing)\\0&(L\cap R\ne\varnothing)\end{cases} cL​xL⋅cR​xR={(cL​cR​)xL∪R0​(L∩R=∅)(L∩R=∅)​ 。

事实上,因为只有它的定义是最良好的,后文的讨论都只针对它。

1.定义

引入 z z z 作为 形式幂级数 的自变量。即形式幂级数环 F ⟦ z ⟧ F\llbracket z\rrbracket F[[z]] 上的集合幂级数。引入这玩意儿,目的也很明显:限制 ∣ L ∣ + ∣ R ∣ = ∣ L ∪ R ∣ |L|+|R|=|L\cup R| ∣L∣+∣R∣=∣L∪R∣ 嘛。

对于集合幂级数 σ \sigma σ,用 σ S \sigma_S σS​ 表示它的系数。当然也需要用 σ S , i \sigma_{S,i} σS,i​ 表示 [ z i ] σ S [z^i]\;\sigma_S [zi]σS​(即 σ S \sigma_S σS​ 这个关于 z z z 的形式幂级数中 z i z^i zi 的系数)。

论文中要求 ∀ i < ∣ S ∣ , σ S , i = 0 \forall i<|S|,\;\sigma_{S,i}=0 ∀i<∣S∣,σS,i​=0 。显然这是为了使得 σ S , ∣ S ∣ \sigma_{S,|S|} σS,∣S∣​ 就是子集卷积的结果系数。那么同理,反过来,若 ∀ i > ∣ S ∣ , σ S , i = 0 \forall i>|S|,\;\sigma_{S,i}=0 ∀i>∣S∣,σS,i​=0,这也是良定义的占位多项式。

这里保留论文中记法。称 F ⟦ z ⟧ F\llbracket z\rrbracket F[[z]] 上的集合幂级数 σ \sigma σ 为集合幂级数 f f f 的 集合占位幂级数,当且仅当
σ = ∑ S ⫅ U f S z ∣ S ∣ x S + ∑ S ⫅ U ∑ k > ∣ S ∣ σ S , i z i x S \sigma=\sum_{S\subseteqq{\Bbb U}}f_Sz^{|S|}x^S +\sum_{S\subseteqq\Bbb U}\sum_{k>|S|}\sigma_{S,i}z^ix^{S} σ=S⫅U∑​fS​z∣S∣xS+S⫅U∑​k>∣S∣∑​σS,i​zixS

2.子集卷积

若直接进行 FMT \textit{FMT} FMT,则有 O ( n 2 n ) \mathcal O(n2^n) O(n2n) 次形式幂级数加法,复杂度 O ( n 2 2 n ) \mathcal O(n^22^n) O(n22n) 。

但反过来,我们以 z z z 作为主元,只需要进行 O ( n 2 ) \mathcal O(n^2) O(n2) 的普通卷积。由于 FMT \textit{FMT} FMT 结果可以保留,所以只有 O ( n ) \mathcal O(n) O(n) 次 FMT \textit{FMT} FMT,复杂度也是 O ( n 2 2 n ) \mathcal O(n^22^n) O(n22n) 的。

3.半在线卷积

可以以 z z z 为主元,从小到大枚举其指数,每层直接做 FMT \textit{FMT} FMT 然后卷积即可。复杂度不变。

也可以以 x x x 为主元分治,类似 NTT \textit{NTT} NTT,先递归左侧,并求出正变换结果(对于 ( n − 1 ) (n{-}1) (n−1) 个变元的插值)。左侧对右侧作贡献,然后递归右侧,并求出正变换结果。

最后考虑当前变元,就得到了整个区间的正变换结果,可以 return \texttt{return} return 。

注意操作是对占位幂级数进行的。我们需要预先进行插值——比如,可以做长为 n n n 的循环卷积的插值变换,或者求 [ 0 , 2 n ] [0,2n] [0,2n] 连续点值等,才能保证乘法复杂度是 O ( n ) \mathcal O(n) O(n) 的。显然插值和还原都不会超过 O ( n 2 2 n ) \mathcal O(n^22^n) O(n22n) 总复杂度。

所以共 O ( n 2 n ) \mathcal O(n2^n) O(n2n) 操作,总复杂度 O ( n 2 2 n ) \mathcal O(n^22^n) O(n22n) 。

伍、其他

1.微分

将集合幂视为 n n n 元生成函数。取微分算子
D = ∑ x i ∂ ∂ x i {\frak D}=\sum x_i\frac{\partial}{\partial x_i} D=∑xi​∂xi​∂​
此时有 D ( x a ⋅ x b ) = x b D x a + x a D x b ( a ∩ b = ∅ ) {\frak D}(x^{a}\cdot x^{b})=x^b{\frak D}x^a+x^a{\frak D}x^b\;(a\cap b=\varnothing) D(xa⋅xb)=xbDxa+xaDxb(a∩b=∅),因此是良定义的。

或者用集合幂的角度,就是
D x S = ∑ i ∈ S x S ∖ { i } {\frak D}x^S=\sum_{i\in S}x^{S\setminus\{i\}} DxS=i∈S∑​xS∖{i}

2.逐点牛顿迭代法

任取 n n n 变元中任意 x x x 。注意到 ∂ ∂ x F \frac{\partial}{\partial x}F ∂x∂​F 就是 [ x 1 ] F [x^1]F [x1]F,用这个提取 [ x 1 ] [x^1] [x1],很可能只需要从 [ x 0 ] F = F ∣ x = 0 [x^0]F=F\big\vert_{x=0} [x0]F=F∣ ∣​x=0​ 推出。

比如,求算 G = exp ⁡ F G=\exp F G=expF,其中 F F F 是集合占位幂级数。有 ∂ ∂ x G = G ∂ ∂ x F \frac{\partial}{\partial x}G=G\frac{\partial}{\partial x}F ∂x∂​G=G∂x∂​F,因此将 [ x 0 ] G [x^0]G [x0]G 求出后与 [ x 1 ] F [x^1]F [x1]F 卷积就是 [ x 1 ] G [x^1]G [x1]G 。

由于乘法长度在倍增,这显然是 O ( n 2 2 n ) \mathcal O(n^22^n) O(n22n) 的复杂度。并且它并不涉及逆元,即在任意交换环上都可以进行该运算。

在域上,则可以先 FMT \textit{FMT} FMT,再对每个形式幂级数 F ^ S \hat F_S F^S​ 作 exp ⁡ \exp exp,最后做 FMT \textit{FMT} FMT 逆变换。这里 exp ⁡ \exp exp 涉及逆元(比如最平凡的求导方法)。

【学习笔记】集合幂级数相关推荐

  1. 离散数学学习笔记——集合运算的基本等式

    离散数学学习笔记--集合运算的基本等式 集合运算的基本等式 集合运算的基本等式 设 UUU 为全集,A,B,CA, B, CA,B,C 为任意集合. (1) A∪A=A,A∩A=A.A \cup A= ...

  2. python学习笔记——集合与字典

    python学习笔记--集合与字典 1. 集合的基本概念 1.1 set(x)函数 1.2 集合类型的10个操作函数 2. 字典的基本概念 2.1 字典的索引 2.2 字典的操作 2.3 字典小结 1 ...

  3. Spring、SpringMVC、SpringBoot及其插件学习笔记集合(持续更新中....)

    笔记目录 语言 1.MyBatis 1.1 普通用法 1.1.1 配置文件 1.1.2 mapper文件 1.2 通用mapper文件 2.Thymeleaf 2.1 命名空间 2.2 依赖 2.3 ...

  4. kotlin学习笔记——集合及集合操作符

    1.创建集合 可以使用listOf/setOf/arrayListOf/hashSetOf/mapOf/hashMapOf/linkedMapOf等来创建一个集合 如:var items = list ...

  5. scala学习笔记-集合操作(15)

    Scala的集合体系结构 1 // Scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trai.这个结构与Java的集合体系非常相似 ...

  6. 二十三、PHP框架Laravel学习笔记——集合的常用方法

    一.常用方法 all()方法,转换为属性形式输出,使用 dd 方法看类型: $collection = collect([1, 2, 2, 3, 4, 4, 4]); dd($collection-& ...

  7. 二十二、PHP框架Laravel学习笔记——集合的使用

    一.创建集合 什么是集合?即:它是一种更具读取性和处理能力的数组封装: 比如,我们从数据库得到的数据列表,它就是一种集合: 数据集合,提供了大量的方法方便我们进行各种操作: 除了数据库对象返回的数据集 ...

  8. scala 学习笔记--集合

    1.scala集合的null 是nil 而不是null 2.set的三个方法union,intersect,diff union--合并去重 intersect--交集 diff--a减去(a和b交集 ...

  9. 3dsmax scripts 学习笔记集合_未整理

    相关方法 1. setSilentMode <boolean> 开关Silent 模式.如果设为Off,在位图输入.输出过程中发生的任何错误都会导致一 个错误信息对话框.如果设为On,在位 ...

  10. Java学习笔记----------集合Set

    Java集合-----Set 集合:就像一种容器,可以把多个对象放进该容器中. Java集合分为:Set.List.Map三种体系.Set:无序的,不可重复的:List:有序的,可重复的:Map:代表 ...

最新文章

  1. Confluence 6 用户目录图例 - 连接 Jira 和 Jira 连接 LDAP
  2. excel调用python编程-使用python集合进行EXCEL数据分析
  3. 【数据可视化应用】绘制极坐标(附Python代码)
  4. spring boot进行上传文件
  5. MVVM架构结合阿里ARouter,打造一套Android-Databinding组件化
  6. 没有一个产品,竟捞金200亿!2021年最大胆设想,已沦为圈钱工具
  7. Python计算绘图——曲线拟合问题(转)
  8. 奥威软件大数据bi_哪家BI软件能做Sql server的数据可视化分析?
  9. mysql force Index 强制索引[转]
  10. 多线程——java练习题
  11. matlab作图函数的总结与分析.pdf,Matlab作图函数的总结与分析_黄琼湘
  12. 金蝶k3wise云服务器配置,金蝶K3WISEV15.0系统配置说明
  13. catia 桥接曲面圆角_CATIA建模教程(二)——圆角及桥接在空间曲线中的应用.pdf...
  14. 百度服务器保存信息多久,百度识图会保存图片在服务器上吗?
  15. 浅谈JSONP跨域漏洞
  16. ue4 源码编译 虚拟内存不足 堆限制
  17. 沃尔玛全球最便宜的10美元智能机评测报告
  18. 什么是主动式计算机用户,电脑电源主动PFC是什么意思
  19. 电影《不夜城》的主题曲:金城武、山本未来主演
  20. xxx is not in the sudoers file. This incident will be reported.解決方法

热门文章

  1. sublime 4 设置文件编码 GBK
  2. 【最全面详细解释】背包问题详解
  3. 基于SL773-2018计算土壤流失量的Python实现
  4. C语言错误:expected declaration or statement at end of input、编写函数求100万以内的素数
  5. 优课在线C语言作业3,2018春C语言程序设计(苏小红)
  6. LevelDB的边边角角之一
  7. 2020年第四届计算机检测维修与数据恢复国赛模拟比赛
  8. Oil Deposits HDU - 1241 并查集思想 + bfs搜索
  9. PAT日志 1095
  10. LIMS系统平台在第三方检测实验室中的意义