【施工ing】生成函数与多项式——学习笔记

生成函数大概是一个无穷幂级数形式的函数,我们只关心它的形式,而不会去带入 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=AB C 中的 an=|{(x,y)|xA,yB,|x|+|y|=n}| ,好像叫做笛卡尔积,即是满足体积和为 n 的有序二元组数。

定义 SEQ(A) 是一个由生成函数 A 得到的生成函数。

SEQ(A)=i=0Ai

对应的组合意义是, SEQ(A) A 中的所有元素的有序组合。

例: A={'0','1'} , |0|=|1|=1 ,则 SEQ(A)={01}

A={1,2,3,...} , |i|=i ,则 SEQ(A)={}

可以等比数列求和:

SEQ(A)=i=0Ai=11A

关于指数生成函数(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 项,即 ff0(modxn) ff00(modxn)

    Taylor 展开得 0=g(f)=g(f0)+g(f0)(ff0)1!+g′′(f0)(ff0)22!+...g(f0)+g(f0)(ff0)(modx2n)

    所以 g(f0)+g(f0)(ff0)0(modx2n)f=f0g(f0)g(f0)(modx2n)

    也就是说由前 n 项能得到前 2n 项,每次要多项式求逆,复杂度 T(n)=T(n/2)+O(nlogn)=O(nlogn)

  • 给定 A lnA

    f=lnA f=AA ,就好了。

  • 给定 A eA

    f=eA ,设 g(x)=lnxA ,则 g(f)=0 ,牛顿迭代即可。

【施工ing……..】

你可能感兴趣的:(生成函数)