【施工ing】生成函数与多项式——学习笔记
2018-01-18 21:16
357 查看
生成函数大概是一个无穷幂级数形式的函数,我们只关心它的形式,而不会去带入 x 求值。可以看做是多项式,只是带入没有意义。它的一些运算可以对应组合意义,所以能通过它解决一些组合问题。
一般生成函数(OGF):
f(x)=a0+a1x1+a2x2+a3x3+a4x4...
指数型生成函数(EGF),之后会看到为什么要定义这样的函数:
f(x)=a0+a11!x1+a22!x2+a33!x3...
重要的是要把生成函数的代数形式和组合意义对应起来:
考虑一类组合对象组成的集合 A ,给每个 A 中的元素定义一个 “大小”,记为 |a|。一个生成函数的系数 an 等于大小为 n 的元素的个数,这个生成函数是一类组合对象对应的生成函数。
加法就是组合对象的并。
乘法 C=A∗B ,C 中的 an=|{(x,y)|x∈A,y∈B,|x|+|y|=n}| ,好像叫做笛卡尔积,即是满足体积和为 n 的有序二元组数。
定义 SEQ(A) 是一个由生成函数 A 得到的生成函数。
SEQ(A)=∑i=0∞Ai
对应的组合意义是,SEQ(A) 是 A 中的所有元素的有序组合。
例:A={'0','1'}, |0|=|1|=1,则 SEQ(A)={每种长度的01串}
A={1,2,3,...} , |i|=i ,则 SEQ(A)={正整数有序拆分}
可以等比数列求和:SEQ(A)=∑i=0∞Ai=11−A
关于指数生成函数(EGF):
除一个阶乘,就可以对应带标号的组合对象,其他和普通生成函数类型。
定义 SET(A)=∑∞i=0Aii! , 和 SEQ(A) 不同的是算得的是无序的方案数。
由 Taylor 展开,有 ex=1+x11!+x22!+x33!+x44!... ,所以 SET(A)=∑∞i=0Aii!=eA
差不多就这些…
重要的是如何实现多项式的某些运算:
多项式求逆:
Newton 迭代:
已知 g , g(f)=0 ,可以迭代出 f。
设已知 f 前 n 项,即 f≡f0(modxn) ,f−f0≡0(modxn)
Taylor 展开得 0=g(f)=g(f0)+g′(f0)(f−f0)1!+g′′(f0)(f−f0)22!+...≡g(f0)+g′(f0)(f−f0)(modx2n)
所以 g(f0)+g′(f0)(f−f0)≡0(modx2n)→f=f0−g(f0)g′(f0)(modx2n)
也就是说由前 n 项能得到前 2n 项,每次要多项式求逆,复杂度 T(n)=T(n/2)+O(nlogn)=O(nlogn)
给定 A 求 lnA :
f=lnA ,f′=A′A ,就好了。
给定 A 求 eA :
f=eA ,设 g(x)=lnx−A ,则 g(f)=0 ,牛顿迭代即可。
【施工ing……..】
一般生成函数(OGF):
f(x)=a0+a1x1+a2x2+a3x3+a4x4...
指数型生成函数(EGF),之后会看到为什么要定义这样的函数:
f(x)=a0+a11!x1+a22!x2+a33!x3...
重要的是要把生成函数的代数形式和组合意义对应起来:
考虑一类组合对象组成的集合 A ,给每个 A 中的元素定义一个 “大小”,记为 |a|。一个生成函数的系数 an 等于大小为 n 的元素的个数,这个生成函数是一类组合对象对应的生成函数。
加法就是组合对象的并。
乘法 C=A∗B ,C 中的 an=|{(x,y)|x∈A,y∈B,|x|+|y|=n}| ,好像叫做笛卡尔积,即是满足体积和为 n 的有序二元组数。
定义 SEQ(A) 是一个由生成函数 A 得到的生成函数。
SEQ(A)=∑i=0∞Ai
对应的组合意义是,SEQ(A) 是 A 中的所有元素的有序组合。
例:A={'0','1'}, |0|=|1|=1,则 SEQ(A)={每种长度的01串}
A={1,2,3,...} , |i|=i ,则 SEQ(A)={正整数有序拆分}
可以等比数列求和:SEQ(A)=∑i=0∞Ai=11−A
关于指数生成函数(EGF):
除一个阶乘,就可以对应带标号的组合对象,其他和普通生成函数类型。
定义 SET(A)=∑∞i=0Aii! , 和 SEQ(A) 不同的是算得的是无序的方案数。
由 Taylor 展开,有 ex=1+x11!+x22!+x33!+x44!... ,所以 SET(A)=∑∞i=0Aii!=eA
差不多就这些…
重要的是如何实现多项式的某些运算:
多项式求逆:
Newton 迭代:
已知 g , g(f)=0 ,可以迭代出 f。
设已知 f 前 n 项,即 f≡f0(modxn) ,f−f0≡0(modxn)
Taylor 展开得 0=g(f)=g(f0)+g′(f0)(f−f0)1!+g′′(f0)(f−f0)22!+...≡g(f0)+g′(f0)(f−f0)(modx2n)
所以 g(f0)+g′(f0)(f−f0)≡0(modx2n)→f=f0−g(f0)g′(f0)(modx2n)
也就是说由前 n 项能得到前 2n 项,每次要多项式求逆,复杂度 T(n)=T(n/2)+O(nlogn)=O(nlogn)
给定 A 求 lnA :
f=lnA ,f′=A′A ,就好了。
给定 A 求 eA :
f=eA ,设 g(x)=lnx−A ,则 g(f)=0 ,牛顿迭代即可。
【施工ing……..】
相关文章推荐
- 数据结构之多项式最大子列和问题(学习笔记)
- 多项式求逆——学习笔记
- [BZOJ3456]城市规划(生成函数+多项式求逆+多项式求ln)
- bzoj3456 城市规划【生成函数+多项式求逆元】
- 浅谈生成函数和多项式
- Codeforces 250 E. The Child and Binary Tree [多项式开根 生成函数]
- 有标号的二分图计数 [生成函数 多项式]
- 【BZOJ3625】【CF438E】小朋友和二叉树 NTT 生成函数 多项式开根 多项式求逆
- BZOJ3992 [SDOI2015]序列统计 【生成函数 + 多项式快速幂】
- [bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)
- [多项式ln][多项式exp][多项式求幂][生成函数][DP][FNT] BZOJ 3684: 大朋友和多叉树
- BZOJ3625 [Codeforces Round #250]小朋友和二叉树(生成函数+多项式开根)
- BZOJ 3456: 城市规划 [多项式求逆元 组合数学 | 生成函数 多项式求ln]
- 【XSY2612】Comb Avoiding Trees 生成函数 多项式求逆 矩阵快速幂
- BZOJ 3625: [Codeforces Round #250]小朋友和二叉树 dp 生成函数 多项式开根
- [多项式ln][多项式exp][背包DP][生成函数] LOJ #556. 咱们去烧菜吧
- [BZOJ2259]异化多肽(生成函数+NTT+多项式求逆)
- 【算法专题】多项式运算与生成函数
- 002-多项式求值(Horner规则)-归纳法-《算法设计技巧与分析》M.H.A学习笔记
- [生成函数][NTT][多项式求逆]BZOJ 3456: 城市规划