首页 > 其他分享 >生成函数

生成函数

时间:2023-06-11 22:33:09浏览次数:25  
标签:dots infty frac 函数 sum 生成 aligned

简单写一下基本概念。

多项式

简介

对于求和式 \(\sum a_nx^n\),如果是有限项相加,称为多项式,记作 \(f(x) = \sum_{n=0}^ma_nx^n\)。

可列项相加的求和式称为级数。在和式 \(\sum_{n=0}^\infty a_nx^n\) 中,每项均为非负整数次幂函数乘一个常数系数,这种形式的级数称为幂级数。

多项式的度

对于一个多项式 \(f(x)\) ,称其最高次项的次数称为该多项式的度,也称次数,记作 \(\deg f\)。

多项式运算

加减运算

\[F(x)+G(x)=\sum_{n\ge 0}(a_n+b_n)x^n \]

乘法运算(卷积运算)

\[\begin{aligned} F(x)\cdot G(x) &=\sum_{i\ge0}a_ix^i\sum_{j\ge0}b_jx^j \\ &=\sum_{n\ge0}x^n\sum_{i=0}^na_ib_{n-i} \end{aligned} \]

生成函数

简介

生成函数(Generating Function),又称母函数,是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。

形式幂级数简单来说,就是我们只关注这个幂级数的系数和未知数的指数,而不关注未知数的取值,这就是形式幂级数。

生成函数大多可以表示为一个统一的形式:

\[F(x) = \sum_na_nk_n(x) \]

其中 \(k_n(x)\) 被称为核函数,不同的核函数会导出不同的生成函数,从而有着不同的性质,解决不同的问题。

分类

普通生成函数

形如

\[F(x) = \sum_{n\ge0}a_nx^n \]

的生成函数,就是普通生成函数,它的核函数 \(k_n(x) = x^n\)。

常见生成函数

在运用生成函数的过程中,我们不会一直使用形式幂级数的形式,而会适当转化为封闭形式来更好地化简。

例如,\(<1,1,1,\dots>\) 的普通生成函数 \(F(x) = \sum_{n\ge0}x^n\),我们发现

\[\begin{aligned} xF(x)+1 &= F(x)\\ F(x)&=\frac{1}{1-x} \end{aligned} \]

这就是 \(\sum_{n\ge0}x^n\) 的封闭形式。

这个式子仅在 \(x\in(-1,1)\) 的时候成立,如果大于就不行了,因为大于 \(1\) 了这个式子就是发散的了。实际做题中我们不需要考虑是否发散,因为生成函数是一个形式幂级数,我们不考虑 \(x\) 的取值。

此外,还有一些常见的生成函数:

  • \[ \frac{1}{1-x}=1+x+x^2+\dots=\sum_{n=0}^{\infty}x^n \]

  • \[ \frac{1}{1-2x}=1+2x+4x^2+\dots=\sum_{n=0}^{\infty}2^nx^n \]

    推广一下,就有
  • \[ \frac{1}{1-kx}=1+kx+k^2x^2+\dots=\sum_{n=0}^{\infty}k^nx^n \]

  • \[ \frac{k}{1-x}=1+kx+kx^2+\dots=k\sum_{n=0}^{\infty}x^n \]

  • \[ \frac{x^3}{1-x}=0+0x+0x^2+x^3+x^4+\dots=k\sum_{n=0}^{\infty}x^n \]

    分母是 \(x^n\) ,那么前 \(n\) 项的系数都是 \(0\)。
  • \[ \frac{1}{1-x^2}=1+x^2+x^4+\dots=\sum_{n=0}^{\infty}x^{2n} \]

    实质上就是把一式的 \(x\) 换成了 \(x^2\)
  • \[ \frac{1}{1-x^3}=1+x^3+x^6+\dots=\sum_{n=0}^{\infty}x^{3n} \]

    同理。
  • \[ \frac{1}{(1-x)^2}=1+2x+3x^2+\dots=\sum_{n=0}^{\infty}(n+1)x^n \]

    这其实是对一式求导得来的。

我们推广一下一式和四式,首先引入广义二项式定理

\[(x+y)^a = \sum_{k=0}^\infty C_a^kx^{a-k}y^k \]

其中 \(C_a^k = \frac{a(a-1)\dots(a-k+1)}{k!}\)

证明略了/cy。接下来把它写成一式四式的形式。

\[\frac{1}{(1-x)^n} = \sum_{i=0}^\infty C_{n+i-1}^{i}x^i \]

步骤如下:

  1. 扩展域

\[(1+x)^n = \sum_{i=0}^{n}C_{n}^{i}x^i \]

其中若 \(i>n,C_n^i=0\),这就说明越往后其实加的都是 \(0\) 了。

  1. 扩展指数为负数:

\[\begin{aligned} C_{-n}^i &= \frac{(-n)(-n-1)\dots(-n-i+1)}{i!}\\ &=(-1)^i\frac{n(n+1)\dots(n+i-1)}{i!}\\ &=(-1)^iC_{n+i-1}^i \end{aligned} \]

那么

\[\begin{aligned} (1+x)^{-n}&= \sum_{i=0}^\infty C_{-n}^ix^i\\ &=\sum_{i=0}^\infty(-1)^iC_{n-i+1}^ix^i \end{aligned} \]

  1. 加号变减号

\[\begin{aligned} (1-x)^{-n}&= \sum_{i=0}^\infty C_{-n}^i(-x)^i\\ &=\sum_{i=0}^\infty(-1)^iC_{n-i+1}^i(-x)^i\\ &=\sum_{i=0}^\infty C_{n+i-1}^ix^i \end{aligned} \]

运用这个可以求解一些生成函数,例题


还有一些有穷序列的生成函数,可以用数列求和的式子整一整。

  • \[ 1+x+x^2 = \frac{1-x^3}{1-x} \]

  • \[ 1+x+x^2+x^3 = \frac{1-x^4}{1-x} \]

运算

加减运算

\[F(x)\pm G(x)=\sum_{n\ge 0}(a_n\pm b_n)x^n \]

因此 \(F(x)\pm G(x)\) 是序列 \(<a_n\pm b_n>\) 的普通生成函数。

乘法运算

\[\begin{aligned} F(x)\cdot G(x) &=\sum_{i\ge0}a_ix^i\sum_{j\ge0}b_jx^j \\ &=\sum_{n\ge0}x^n\sum_{i=0}^na_ib_{n-i} \end{aligned} \]

因此 \(F(x)\cdot G(x)\) 是序列 \(<\sum_{i=0}^na_ib_{n-i}>\) 的普通生成函数。

应用

普通生成函数可以用来解决多重集组合数问题

\(n\) 种物品,每种物品 \(a_i\) 个,问取 \(m\) 个物品的方案数。

通过构造普通生成函数来解决。

我们让第一种物品的生成函数为 \((1+x^1+x^2+\dots+x^{a_1})\),第 \(n\) 种就是 \((1+x^1+x^2+\dots+x^{a_n})\),令这些生成函数相乘,那么题目就转化成了求 \(x^m\) 的系数。

指数生成函数

形如

\[F(x) = \sum_{n\ge0}a_n\frac{x^n}{n!} \]

的生成函数就是指数生成函数。

此外,还有一些常见的指数生成函数:

  • \[ e^x = 1+\frac{x^1}{1!}+\frac{x^2}{2!}+\dots=\sum_{n=0}^{\infty}\frac{x^n}{n!} \]

    泰勒展开!
  • \[ e^{-x} = 1-\frac{x^1}{1!}+\frac{x^2}{2!}+\dots=\sum_{n=0}^{\infty}(-1)^n\frac{x^n}{n!} \]

  • \[ \frac{e^x+e^{-x}}{2} = 1+\frac{x^2}{2!}+\frac{x^4}{4!}+\dots=\sum_{n=0}^{\infty}\frac{x^{2n}}{(2n)!} \]

  • \[ \frac{e^x-e^{-x}}{2} = x+\frac{x^3}{3!}+\frac{x^5}{5!}+\dots=\sum_{n=0}^{\infty}\frac{x^{2n+1}}{(2n+1)!} \]

运算

加减运算

\[\begin{aligned} F(x)\pm G(x)&=\sum_{i\ge 0}a_i\frac{x^i}{i!}\pm \sum_{j\ge 0}b_i\frac{x^j}{j!}\\ &=\sum_{n\ge0}(a_n\pm b_n)\frac{x^n}{n!} \end{aligned} \]

因此 \(F(x)\pm G(x)\) 是序列 \(<a_n\pm b_n>\) 的指数生成函数。

乘法运算

\[\begin{aligned} F(x)\cdot G(x) &=\sum_{i\ge0}a_i\frac{x^i}{i!}\sum_{j\ge0}b_j\frac{x^j}{j!} \\ &=\sum_{n\ge0}x^n\sum_{i=0}^na_ib_{n-i}\frac{1}{i!(n-i)!}\\ &=\sum_{n\ge0}\frac{x^n}{n!}\sum_{i=0}^na_ib_{n-i}\frac{n!}{i!(n-i)!}\\ &=\sum_{n\ge0}\frac{x^n}{n!}\sum_{i=0}^nC_n^ia_ib_{n-i} \end{aligned} \]

因此 \(F(x)\cdot G(x)\) 是序列 \(<\sum_{i=0}^nC_n^ia_ib_{n-i}>\) 的指数生成函数。

应用

指数生成函数可以用来解决多重集排列数问题

\(n\) 种物品,每种物品 \(a_i\) 个,问取 \(m\) 个物品的排列 数。

首先要知道多重集排列公式:设从每种物品中取 \(b_i(0\leq b_i \leq a_i),m=\sum_{i=1}^nb_i\),那么对于一组选定的 \(b_i\) 进行排列的方案数为 \(\frac{m!}{b_1!b_2!\dots b_n!}\)。

这就是把里面相同的进行去重的一个操作。这样以后,我们就知道所有满足 \(b_1+b_2+\dots +b_n=m\) 的排列数之和就是答案。

通过构造指数生成函数来解决。

我们让第一种物品的生成函数为 \((1+\frac{x^1}{1!}+\frac{x^2}{2!}+\dots+\frac{x^{a_1}}{a_1!})\),第 \(n\) 种就是 \((1+\frac{x^1}{1!}+\frac{x^2}{2!}+\dots+\frac{x^{a_n}}{a_n!})\),令这些生成函数相乘,那么题目就转化成了求 \(\frac{x^m}{m!}\) 的系数。

为什么?考虑一种满足 \(\sum b_i=m\) 的情况,做乘法,得到

\[\begin{aligned} &\frac{x^{b_1}}{b_1!}\times\frac{x^{b_2}}{b_2!}\times\dots\times\frac{x^{b_n}}{b_n!}\\ &=\frac{x^{b_1+b_2+\dots+b_n}}{b_1!b_2!\dots b_n!}\\ &=\frac{x^m}{b_1!b_2!\dots b_n!}\\ &=\frac{m!}{b_1!b_2!\dots b_n!}\cdot \frac{x^m}{m!} \end{aligned} \]

做卷积,合并同类项,最后 \(\frac{x^m}{m!}\) 的系数就是答案。

狄利克雷生成函数

形如

\[F(x) = \frac{a_1}{1^x}+\frac{a_2}{2^x}+\frac{a_3}{3^x} + \dots =\sum_{n=1}^\infty \frac{a_n}{n^x} \]

的生成函数,称之为狄利克雷生成函数。

注意 \(n\) 和 \(x\) 的位置。

运算

乘法运算

\[\sum_{i=1}^\infty \frac{a_i}{i^x}\sum_{j=1}^\infty \frac{b_j}{j^x} \]

\[\begin{aligned} &=(\frac{a_1}{1^x}+\frac{a_2}{2^x}+\frac{a_3}{3^x} + \dots)(\frac{b_1}{1^x}+\frac{b_2}{2^x}+\frac{b_3}{3^x} + \dots )\\ &=\frac{a_1b_1}{1^x}+\frac{a_1b_2+a_2b_1}{2^x}+\frac{a_1b_3}{3^x} + \frac{a_1b^4+a_2b_2+a_4b^2}{4^x} + \dots\\ &=\sum_{n=1}^\infty \frac{1}{n^x}\sum_{d|n}a_db_{\frac{n}{d }} \end{aligned} \]

这个形式其实就很像狄利克雷卷积的形式了。

\(\frac{1}{n^x}\) 的系数之和就是下标为 \(n\) 的一对因数的乘积的和,举个例子。

\(\frac{1}{4^x}\) 的系数 \(a_1b_4+a_2b_2+a_4b_1\);

\(\frac{1}{6^x}\) 的系数 \(a_1b_6+a_2b_3+a_3b_2+a_6b_1\)。

生成函数的应用

这个困扰了我 \(\inf\) 年的问题终于理解了,即使它并不是很难。

求斐波那契数列的通项公式,其中 \(f_i=f_{i-1}+f_{i-2},f_0 = f_1 = 1\)

构造一下生成函数,设

\[A(x)=1+1x+2x^2+3x^3+5x^4+8x^5\dots \]

根据递推式我们可以做一些变化:

\[\begin{aligned} A(x)&=1+1x+2x^2+3x^3+5x^4+8x^5\dots\\ xA(x)&=\ \ \ \ \ \ \ \ \ x+1x^2+2x^3+3x^4+5x^5\dots\\ x^2A(x)&=\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 1x^2+1x^3+2x^4+3x^5\dots \end{aligned} \]

整理一下我们可以得到一个方程

\[A-xA-x^2 = 1 \]

\[A = \frac{1}{1-x-x^2} \]

这样我们就得到了斐波那契数列的生成函数的封闭形式,但是如果我们想要进一步得到每一项的系数,还要进行进一步的化简。

我们已经知道了 \(\frac{1}{1-kx}\) 所代表的序列,那我们自然而然要往这个方面凑。

这个式子的分母 \(1-x-x^2\) 是一个一元二次方程,我们可以进行配方:

\[1-x-x^2 = (1-k_1x)(1-k_2x) \]

解得

\[k_1 = \frac{1+\sqrt 5}{2},k_2=\frac{1-\sqrt 5}{2} \]

如此以后,我们就可以把原式变成 \(\frac{1}{(1-k_1x)(1-k_2x)}\) 的形式了,我们给它裂项一下,就能表示出最终的式子了。原式裂项后变为

\[\frac{a}{1-k_1x}+ \frac{b}{1-k_2x} \]

那么则有

\[a(1-k_2x)+b(1-k_1x) = 1 \]

这个里面 \(x\) 的取值其实是无关紧要的,我们可以把这个式子转化成

\[(a+b-1) - x(ak_2+bk_1) = 0 \]

所以

\[\left\{ \begin{aligned} & a+b-1=0 \\ & ak_2+bk_1 = 0 \\ \end{aligned} \right. \]

解得

\[a = \frac{1}{\sqrt 5}k_1,b=-\frac{1}{\sqrt 5}k_2 \]

代回原式,得到

\[A(x) = \frac{k_1}{\sqrt 5}\frac{1}{1-k_1x}-\frac{k_2}{\sqrt 5}\frac{1}{1-k_2x} \]

把封闭形式转化为生成函数的形式,那么第 \(n\) 项的系数,也就是斐波那契数列的第 \(n\) 项就是

\[A_n = \frac{1}{\sqrt 5}((\frac{1+\sqrt 5}{2})^{n+1}-(\frac{1-\sqrt 5}{2})^{n+1}) \]

这就是生成函数题最基本的推式子的思路,终于理解了/oh。

其中涉及到部分分式的内容:

对于 \(\frac{p(x)}{q(x)}\) 一类的分式,其中 \(q(x)\) 是含有 \(k\) 个不同实根 \(x_1,\dots,x_k\) 的 \(k\) 次多项式,那么这个分式一定能写成

\[\frac{c_1}{x-x_1}+\frac{c_2}{x-x_2}+\dots+\frac{c_k}{x-x_k} \]

如果有重根,那么就合并起来,变成 \(\frac{c_i}{(x-x_i)^k}\) 的形式即可。

标签:dots,infty,frac,函数,sum,生成,aligned
From: https://www.cnblogs.com/bloodstalk/p/17473760.html

相关文章

  • Python生成指定大小的文件
    转载请注明出处❤️作者:测试蔡坨坨原文链接:caituotuo.top/400bd75c.html你好,我是测试蔡坨坨。在日常测试工作中,我们经常需要对上传的文件大小进行测试,例如:一个文件上传功能,限制文件大小最大为10MB,此时我们可能需要测试10MB以及其边界值9MB和11MB;再或者我们有时需要测试一个超大......
  • [GPT] js 外部参数怎么传给 setTimeout 的匿名函数 ?
     你可以将外部参数作为setTimeout()函数的第三个参数传递,然后在匿名函数中使用这个参数。例如:varmyParam="Hello,world!";setTimeout(function(param){console.log(param);//输出:"Hello,world!"},1000,myParam); 在这个例子中,我们将外部参数myParam作......
  • Goland 包导入正常,但是无法解析函数和成员属性,编译不报错
    这段时间Goland突然出现了一个毛病,每次goget依赖后,虽然依赖拉下来了,但是代码里使用了这个module的地方无法引用出他的成员和属性,大片的标红,都提示「Unresolvedreference'xxxxx'」,但是只要把项目关了,重新打开,再次触发module的index索引动作,就恢复正常了。本来想看看有没......
  • Go语言中的init函数: 特点、用途和注意事项
    1.引言在Go语言中,init()函数是一种特殊的函数,用于在程序启动时自动执行一次。它的存在为我们提供了一种机制,可以在程序启动时进行一些必要的初始化操作,为程序的正常运行做好准备。在这篇文章中,我们将详细探讨init()函数的特点、用途和注意事项,希望能帮助你更好地理解和使用这个......
  • Hugging News #0609: 最新代码生成模型 StarCoder+ 和 StarChat Beta 重磅发布!
    每一周,我们的同事都会向社区的成员们发布一些关于HuggingFace相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「HuggingNews」,本期HuggingNews有哪些有趣的消息,快来看看吧!重磅更新StarCoder+和StarChatβ发布!......
  • Go语言中的init函数: 特点、用途和注意事项
    1.引言在Go语言中,init()函数是一种特殊的函数,用于在程序启动时自动执行一次。它的存在为我们提供了一种机制,可以在程序启动时进行一些必要的初始化操作,为程序的正常运行做好准备。在这篇文章中,我们将详细探讨init()函数的特点、用途和注意事项,希望能帮助你更好地理解和使用这个......
  • 2.4类神经网路训练不起来怎么办 (四):损失函数 (Loss) 也可能有影响
    1.classification与regression的区别1.1classification与regression输出的区别  classification中,我们用one-hot向量表示不同的类别(一个向量中只有1个1,其余都为0,1在不同的位置代表不同类别).在regression中的神经网络输出只有一个,而classification则有多个输......
  • pandas读取excel表格内容后重新生成表格时因为序号再次生成,出现:Unnamed: 0
    出现的问题如下图:在读取数据的函数中增加:index_col=0,即可。......
  • 隐函数存在唯一性定理
    ......
  • .net framework生成Nuget包简单教程
    前言nuget包生成在.netframework和.netcore/.netstandard下的是不同的。.netframework中稍微复杂些,下面记录了我自己在.netframework中本地生成Nuget包的过程,只涉及主要步骤,更多细节参见微软官方文档。步骤1,到https://www.nuget.org/downloads下载nuget.exe,下载完我放在D......