浅谈多项式与生成函数
本文源码约 34k,可能需要一段时间加载 \(\LaTeX\)。
首先需要注意的是,本文中将不会涉及具体的程式化求解,即与代码实现无关。
同样的,阅读本文需要你掌握基础的快速傅里叶变换理论知识,并已理解如何对多项式进行形式化操作。
本文只会初步地涉及计数需要的手法和套路,具体的讲解就留待以后的文章吧。
如果读者认为本文存在内容的缺漏或错误,请在评论区指出,我会在收到后第一时间处理。
后续内容:符号化方法
目录
\(1.\) 多项式与幂级数
\(1.1\) 基础定义
\(\textbf{定义 1.1.1 } \text{(多项式) }\)
一个多项式 \(f\) 形如
\[f(x) = \sum_{i=0}^n a_i x^i,\quad a_n\neq 0 \]
其中 \(a_i\) 被称为多项式 \(f\) 的第 \(i\) 项系数;\(n\) 被称为多项式 \(f\) 的度数(次数),记为 \(\deg f\)。度数有时可以取 \(\infty\),这时这个多项式也可以被称为幂级数。一般地,记 \(f(x)\) 的第 \(i\) 项系数为 \([x^i]f(x)\) 或 \(f[i]\)。为简便,在上下文信息足够时可以将形如 \(f(x)\) 的多项式记作 \(f\)。
由一些基础数学知识可以知道,一个 \(n\) 次多项式的系数和 \(n + 1\) 个点值是可以互相唯一地得到的。由系数得到点值的操作被称为多点求值,由点值得到系数的操作被称为插值。
在接下来的内容中,我们一般不关心当 \(x\) 为某个特定的值时 \(f(x)\) 的取值,而会将它作为一个操作系数的工具使用,一般称之为操作对象。我们认为 \(x\) 只是一个占位符,起到对系数某一信息的标识作用。这种情况下将幂级数称作形式幂级数。
很多时候我们无力操作度数过于大的多项式,这就需要一个度数的界 \(\pmod {x^n}\) 来限制。如果度数均是非负整数,且运算均由卷积定义,在操作中我们可以只保留界以内的信息。\(F(x) \bmod x^n\) 被称作 \(F\)(在 \(n\) 次项内)的一个截取。
对于一般的环 \(R\),定义系数 \(\in R\) 的所有多项式 \(f(x)\) 组成一个多项式环 \(R[x]\),任意 \(f\in R[x]\) 都可以表示为系数列 \(\langle f_n\rangle\) 的形式。考察度取到 \(+\infty\) 的 \(f\),称 \(f\) 的全体组成一个形式幂级数环 \(R[[x]]\),其中的任意元素 \(f\) 都被称作一个形式幂级数,在不引起歧义的情况下可以简称幂级数。
在 OI 应用中/下文中,\(R\) 一般定义在模 \(p\) 整数集 \(\mathbb F_p = GF(p)\) 上。更特殊地,\(p\) 常可以被表示为 \(a\times 2^k + 1\) 的形式,其中 \(k\) 应当较大。
同时,下文中更常见的是对无穷序列的操作,只是在某个特殊位置截断,这时更应当称其为幂级数。然而,多项式和幂级数都只是用于指代我们所操作对象的名称,具体含义应视上下文而定。
定义对一个常数项为 \(0\) 的幂级数 \(f(x)\) 进行左移得到 \(\dfrac{f(x)}{x}\)。定义对一个幂级数 \(f(x)\) 进行右移得到 \(xf(x)\)。
操作多项式的核心是两个多项式的乘法,这个操作又称卷积。
\(\textbf{定义 1.1.2 } \text{(卷积/乘法) }\)
给定两个多项式 \(f, g\),度数分别为 \(n, m\)。二者的卷积/乘法 \(f\times g\) 定义如下:
\[f\times g = \sum_{i=0}^n \sum_{j=0}^m f[i]g[j] x^{i + j} \]
可以发现卷积得到的多项式的度数是给定多项式的度数相加。从系数的角度去观察,推得
承接上文对 \(p\) 的讨论。当 \(R\) 上存在 \(2^k\) 次单位根时,快速傅里叶变换允许我们在 \(O(k2^k)\) 的时间复杂度内计算两个多项式的乘法。这类整数集对应的模数 \(p\) 又被称作 NTT 模数,常见的有 \(998244353,\ 1004535809,\ 167772161\) 等。
然后有了乘法就能自然定义除法和取模。首先定义一个幂级数 \(f(x)\) 在 \(\text{mod } {x^n}\) 意义下的乘法逆 \(g(x)\) 满足 \(f(x)\times g(x) \equiv 1 \pmod{x^n}\)。容易发现 \(f(x)\) 有乘法逆当且仅当 \(f[0] \neq 0\)。
\(\textbf{定义 1.1.3 } \text{(带余除法) }\)
给定两个多项式 \(f, g\),度数分别为 \(n, m\)。存在唯一的 \(Q, R\) 满足
\[f(x) = Q(x) g(x) + R(x) \quad \deg R < \deg g \]当 \(\deg f \ge \deg g\) 时 \(\deg Q = \deg f - \deg g\),反之 \(=0\)。我们称 \(Q\) 为 \(f\) 除 \(g\) 的商,\(R\) 为 \(f\) 除 \(g\) 的余数。
幂级数乃至有理函数的复合是下文中很重要的一类操作,尤其在应用拉格朗日反演时。因此这里首先介绍复合。
\(\textbf{定义 1.1.4 } \text{(复合) }\)
给定两个多项式 \(f, g\),度数分别为 \(n, m\)。二者的复合 \(f\circ g\) 定义如下:
\[f\circ g = \sum_{i=0}^n f[i] g(x)^i \]\((f\circ g)(x)\) 又常记作 \(f(g(x))\)。
\(\textbf{定义 1.1.5 } \text{(复合逆) }\)
给定一个多项式 \(f\)。\(f\) 的复合逆 \(f^{\langle -1 \rangle}\) 是满足 \(f\circ f^{\langle -1 \rangle} = x\) 的函数。
对于 DFT 相关的定义,可以查阅本博客。
\(1.2\) 多项式牛顿迭代
在第二节的描述中,我们常常使用递归构造的幂级数作为操作对象,这常常是由于幂级数的系数由给定的递推式获得。一个幂级数 \(F(x)\) 是递归构造的,即说明 \(F(x)\) 可以由形如 \(F(x) = G(F(x))\) 的式子得到。我们现在需要做的就是先获得求解递归构造的幂级数的方法。
我们首先引出泰勒展开的形式。
\(\textbf{定义 1.2.1 } \text{(泰勒展开) }\)
对于一个多项式 \(F(x)\),我们可以从 \(a\) 点处采用高阶导数用无穷级数展开它,即
\[F(x) = \sum_{i=0}^{\infty}\frac{F^{(i)}(a)}{i!}(x - a)^i \]
在数学分析上,更实用的是 \(a = 0\) 的情况,这时得到的无穷级数被称作麦克劳林级数。
\(\textbf{定义 1.2.2 } \text{(麦克劳林级数) }\)
如上地写出形式,得到
\[F(x) = \sum_{i=0}^{\infty}\frac{F^{(i)}(0)}{i!}x^i \]
可以发现这是一个幂级数的形式。我们可以通过麦克劳林级数导出一些简单的形式,并通过卷积来定义一些东西。经典例子是 \(e^x = \sum_{i=0}^{\infty}x^i / i!\)。
我们常通过多项式牛顿迭代来获得 \(F(x)\) 的一个截取。在牛顿迭代的过程中度数是倍增的,因此牛顿迭代本身一般不会带来复杂度的增加。下面给出多项式牛顿迭代的一般形式。
\(\textbf{引理 1.2.1 } \text{(牛顿迭代) }\)
给定多项式 \(G\),需要求得多项式 \(F\) 满足 \(G(F(x)) \equiv 0 \pmod{x^{2n}}\)。若已知 \(F_0(x)\equiv F(x) \pmod{x^n}\),则 \(F\) 由下式给出:
\[F(x) = F_0(x) - \frac{G(F_0(x))}{G'(F_0(x))} \]
证明:
由于 \(F_0(x)\) 也满足 \(G(F_0(x)) \equiv 0 \pmod{x^{n}}\),因此 \(F(x) - F_0(x) \equiv 0 \pmod{x^n}\),即 \(F(x) - F_0(x)\) 的最低次项次数 \(\ge n\)。
我们将 \(G(F(x))\) 在 \(F_0(x)\) 处展开,得到
由于 \(i > 1\) 时 \((F(x) - F_0(x))^i\) 最低次项次数 \(\ge 2n\),因此在 \(x^{2n}\) 处截断后 \(i > 1\) 的项都是不必要的。因此得到
整理即可得到牛顿迭代的表达形式。
关于优化该做法常数的方式,可以查阅关于优化形式幂级数计算的 Newton 法的常数, negiizhao。然而需要注意的是,费脑子卡你板子的常还不如先打一个半在线卷积
\(1.3\) 形式 \(\text{Laurent}\) 级数
我们可以构造一类非正式的幂级数,满足其最低次项为 \(n_0 \in \mathbb Z\)。这种级数被称作形式 \(\text{Laurent}\) 级数。形式 \(\text{Laurent}\) 级数可以看作是普通幂级数的一种延拓。首先给出定义。
\(\textbf{定义 1.3.1 }\text{(形式 Laurent 级数)}\)
一个最低次项为 \(n_0\) 次的形式 \(\text{Laurent}\) 级数 \(A(x)\) 被定义为
\[A(x) = \sum_{i=n_0}^{\infty} a_i x^i \]
注意,对于不同的两个形式 \(\text{Laurent}\) 级数,二者的 \(n_0\) 可能不同。可以看到,\(n_0 \ge 0\) 的形式 \(\text{Laurent}\) 级数就是普通的幂级数。形式 \(\text{Laurent}\) 级数的形式运算和正常幂级数类似,下面只对除法进行展开。
对于两个形式 \(\text{Laurent}\) 级数的除法运算,需要先对其作转化。我们将 \(A(x)\) 改写成如下形式:
即 \(x^{n_0}\) 乘上一个幂级数的形式。对于 \(n_0\) 分别为 \(n_a, n_b\) 的两个形式 \(\text{Laurent}\) 级数 \(A, B\),定义 \(A / B\) 的结果是一个形式 \(\text{Laurent}\) 级数 \(C\),满足
因此 \(C\) 是一个 \(n_0 = n_a - n_b\) 的形式 \(\text{Laurent}\) 级数。
可以发现,形式 \(\text{Laurent}\) 级数可以通过系数的位移采用经典幂级数表示,但我们为何要定义如此的一个函数呢?答案将随着接下来对形式留数的探讨揭晓。
\(\textbf{定义 1.3.2 }\text{(形式留数)}\)
一个形式 \(\text{Laurent}\) 级数的形式留数为 \(x^{-1}\) 次项前的系数。
自然地,可以得出以下引理:
\(\textbf{引理 1.3.1 }\)
一个形式 \(\text{Laurent}\) 级数求导后形式留数为 \(0\)。
注意到 \(x^0\) 在求导后系数不会传递给 \(x^{-1}\),而 \(x^{-1}\) 在求导后系数会传递给 \(x^{-2}\)。
\(\textbf{引理 1.3.2 }\)
对于 \(n_0 = 1\) 的形式 \(\text{Laurent}\) 级数 \(A(x)\),\(A'(x)A^k (x)\) 的形式留数为 \([k = -1]\)。
当 \(k \neq -1\) 时,\(A'(x)A^k(x) = \left(A^{k + 1}(x) / (k + 1)\right)'\),由引理 \(1.3.1\) 得到其为 \(0\);
当 \(k = -1\) 时,
后面的分式是一个 \(n_0 = 0\) 且常数项为 \(1\) 的形式 \(\text{Laurent}\) 级数,从而得证。
到了这里,我们就可以用形式 \(\text{Laurent}\) 级数来做一些事情了。具体地,我们将证明一系列拉格朗日反演公式。
\(1.4\) 拉格朗日反演
\(\textbf{定理 1.4.1 }\text{(拉格朗日反演)}\)
给定一个 \(n_0 = 1\) 的形式 \(\text{Laurent}\) 级数 \(Q(x)\)。对于任意整数 \(n, k\),有
\[n[x^n]Q^k(x) = k[x^{-k}]\left(Q^{\langle -1\rangle}(x)\right)^{-n} \]
证明:
我们将复合逆的定义两边求 \(k\) 次方得到
两边求导。这里强调 \(f'(x)\),记作 \((f)'(x)\)。
两边乘 \(\left(Q^{\langle -1\rangle}(x)\right)^{-n}\),同时将函数 \((Q^k)'\) 展开,得到
我们把最前面的 \(\left(Q^{\langle -1\rangle}(x)\right)'\) 和 \(\left(\left(Q^{\langle -1\rangle}(x)\right) ^{i - 1 - n} \right)\) 乘起来,得到引理 \(1.3.2\) 的形式,并取左右两边的形式留数,得到
由引理 \(1.3.2\),只有 \(n = i\) 时才有贡献,这就得到了
得证。
EI 的十行证明是怎么来的?
其实就是把上面的东西压缩了一下。
令 \(P(Q(x)) = x\),要证的就是 \(n[x^n]P^k(x) = k[x^{-k}]Q^{-n}(x)\)。
最后一步使用了引理 \(\text{1.3.2}\),我们只需要 \(i - 1 - n = -1\) 的 \(i\),即 \(i = n\)。
\(\textbf{定理 1.4.2 }\text{(拓展拉格朗日反演)}\)
给定一个形式 \(\text{Laurent}\) 级数 \(P(x)\) 和一个 \(n_0 = 1\) 的形式 \(\text{Laurent}\) 级数 \(Q(x)\)。对于非零整数 \(n\),有
\[[x^n] P(Q(x)) = \frac{1}{n} [x^{n-1}]P'(x) \left(\frac{x}{Q^{\langle -1 \rangle}(x)}\right)^n \]
我们只需要针对 \(P(x) = px^k\) 的形式验证即可。对于 \(P\) 由多项组成的情况可以求和解决。
两边变成
这其实就是定理 \(1.4.1\) 的形式。
拓展拉格朗日反演的形式往往更适合 OI 中的计算,这是由于 \(Q^{\langle -1 \rangle}\) 是一个幂级数,而当 \(P\) 也是幂级数时整个的形式就很友好了。只要我们能计算复合逆,我们就能直接转成幂级数的操作。复合逆的计算一般采用迭代。
当然这两个公式在一些情况下的应用不是很顺畅。因此 EI 提出了另类拉格朗日反演,形式如下。
\(\textbf{定理 1.4.3 }\text{(另类拉格朗日反演)}\)
给定一个 \(n_0 = 1\) 的形式 \(\text{Laurent}\) 级数 \(Q(x)\)。对于任意整数 \(n, k\),有
\[[x^n] Q^k(x) = [x^{-k-1}] \left(Q^{\langle -1\rangle}(x)\right)'\left(Q^{\langle -1\rangle}(x)\right)^{-n-1} \]
仍然考虑从复合逆的定义两边 \(k\) 次方入手。
不需要求导,直接将左边展开并乘入右边缺的 \(\left(Q^{\langle -1\rangle}(x)\right)'\left(Q^{\langle -1\rangle}(x)\right)^{-n-1}\)。
两边取形式留数得到
同样考虑只有 \(n = i\) 时有贡献。得到
得证。
同样的手法可以用于求得更实用的形式。(该叫拓展另类拉格朗日反演?)
\(\textbf{定理 1.4.4 }\text{(另类拉格朗日反演)}\)
给定一个形式 \(\text{Laurent}\) 级数 \(P(x)\) 和一个 \(n_0 = 1\) 的形式 \(\text{Laurent}\) 级数 \(Q(x)\)。对于整数 \(n\),有
\[[x^n] P(Q(x)) = [x^{n}]P(x) \left(Q^{\langle -1\rangle}(x)\right)' \left(\frac{x}{Q^{\langle -1 \rangle}(x)}\right)^{n + 1} \]
我们只需要针对 \(P(x) = px^k\) 的形式验证即可。对于 \(P\) 由多项组成的情况可以求和解决。
两边变成
这其实就是定理 \(1.4.3\) 的形式。
重新写出常用的两个拉格朗日反演形式:
然后我们就能用他们去推导一系列问题了。应用牛顿迭代和拉格朗日反演的例题见此,附 \(3\) 也是应用拉格朗日反演证明的。
\(1.5\) 分式分解
在正式阐述分式分解的形式前,我们需要先引入一个有着良好性质的分式:
可以采用归纳法证明,不再赘述。
一个有限个级数的和函数 \(S(z)\) 也具有良好的性质,其形式为
这是由于我们可以轻易地提取系数:
可以证明,任意 \(R(0) \neq \infty\) 的有理函数
都可以被写成形如 \(S(z) + T(z)\) 的形式,其中 \(S(z)\) 如上定义,\(T(z)\) 是一个多项式。因此对于 \(R(z)\) 的系数总有一个封闭形式来表示。求得 \(S(z)\) 与 \(T(z)\) 等价于找到 \(R(z)\) 的“部分分式展开”。
注意到 \(T(z)\) 在 \(z \neq \infty\) 时定不为 \(0\)。因此 \(R(z) = \infty\) 的情况只能说明 \(S(z) = \infty\),即 \(z \in\{1/\rho_1 , 1/\rho_2 ,\dots, 1/\rho_l\}\) 的情况。因此如果我们想顺利地将 \(R(z)\) 表为 \(S(z) + T(z)\) 的形式,所需的每个 \(\rho_i\) 就应当分别是 \(Q(\alpha)\) 的零点 \(\alpha_i\) 的倒数。
我们假设 \(Q(z)\) 形如
需要满足 \(q_0, q_m \neq 0\)。
我们定义 \(Q(z)\) 的“翻转” \(Q^{R}(z)\) 形如
我们可以发现 \(Q(z)\) 和它的翻转具有以下的关系:
这表明一个多项式 \(Q(z)\) 的零点是它翻转的对应零点的倒数。因此,我们若想找到 \(\rho_i\),就可以将 \(Q^R(z)\) 进行分式分解。具体的应用将会在下方给出,现在首先介绍两条定理。
\(\textbf{定理 1.5.1 }\text{(不同根的有理展开定理)}\)
设 \(R(z) = P(z) / Q(z)\),其中 \(Q(z) = q_0(1 - \rho_1z) (1 - \rho_2z) \cdots (1 - \rho_lz)\)。若 \(\rho_1, \rho_2, \dots, \rho_l\) 彼此不同,且 \(P(z)\) 是一个度数小于 \(l\) 的多项式,则我们有
\[[z^n]R(z) = a_1 \rho_1^n + \cdots + a_l \rho_l^n, \qquad a_k = \frac{-\rho_k P(1 / \rho_k)}{Q'(1 / \rho_k)} \]
证明:
令 \(a_i\) 如上地定义。如果定理成立,则 \(R(z) = P(z)/Q(z)\) 应当等于
为证明这一点,我们只需要证明 \(T(z) = R(z) - S(z)\) 在 \(z \to 1 / \rho_i\) 时不会趋向正无穷。这将表明一个分式永远不可能取得正无穷,也就是这个分式退化为了一个多项式。我们同样可以证明当 \(z \to \infty\) 时 \(T(z)\to 0\),这表明 \(T(z) = 0\)。
令 \(\alpha_i = 1 / \rho_i\)。为证明 \(\lim_{z\to \alpha_i} T(z) \neq \infty\),我们只需证明 \(\lim_{z\to \alpha_i} (z - \alpha_i)T(z) = 0\),这是由于 \(T(z)\) 是一个有理函数。我们想证明的即为
等号右侧的处理是简单的。对任意 \(j \neq i\),我们有
因此等号右侧只剩第 \(i\) 项,消同类项得到右侧即为 \(\dfrac{-a_i}{\rho_i} = \dfrac{P(\alpha_i)}{Q'(\alpha_i)}\)。
左侧的极限可以通过洛必达法则(定理 附 \(1.1\))求得:
证毕。
这样,我们就解决了 \(Q(z)\) 无重根的情况。当 \(Q(z)\) 存在重根时,计算就会变得复杂起来。但是我们仍然可以加强我们得到的结论,得到以下的一般结果:
\(\textbf{定理 1.5.2 }\text{(有理生成函数的一般展开定理)}\)
设 \(R(z) = P(z) / Q(z)\),其中 \(Q(z) = q_0(1 - \rho_1z)^{d_1} (1 - \rho_2z)^{d_2} \cdots (1 - \rho_lz)^{d_l}\),且 \(\rho_1, \rho_2, \dots, \rho_l\) 彼此不同。若 \(P(z)\) 是一个度数小于 \(l\) 的多项式,则我们有
\[[z^n]R(z) = f_1(n) \rho_1^n + \cdots + f_l(n) \rho_l^n \]其中 \(f_k(n)\) 是一个 \(d_k - 1\) 度的多项式,其首项系数为
\[a_k = \frac{-\rho_k^{d_k} P(1/\rho_k)d_k}{Q^{(d_k)}(1 / \rho_k)} = \frac{P(1 / \rho_k)}{(d_k - 1)! q_0 \prod_{j\neq k} (1 - p_j / p_k)^{d_j}} \]
此定理可以通过在 \(\max \{d_i\}\) 上做归纳得到,需要用到
是一个分母多项式无法被任意 \((1 - \rho_k z)^{d_k}\) 整除的有理函数。
需要注意的是,该定理本身无法确定任意 \(f_i\) 的表示形式,需要使用待定系数法求解。
在实际应用中不好使用如上的两种做法,这里也提供一些做法以供代替使用。下面仍然定义 \(R(z) = P(z) / Q(z)\)。
第一种方法是找到一个 \((1 - z^k)^t\) 满足 \(Q(z) \mid (1 - z^k)^t\),这时我们可以将一个简单的形式放在分子上。我们记 \(A(z) = \dfrac{(1 - z^k)^t}{Q(z)}\),则 \(R(z) = \dfrac{A(z)P(z)}{(1 - z^k)^t}\)。我们应当构造尽量简单的封闭形式来表出 \(R(z)\)。
第二种方法是待定系数法,也是常见的做法。具体内容在上面的链接中有讲述。
到这里幂级数相关的知识就大致介绍完了。下面我们将介绍——
\(2.\) 生成函数(\(\underline{\textbf{G}}\text{enerating} \ \underline{\textbf{F}}\text{unction}, \ \text{GF}\))
生成函数是一种工具,就像是一个袋子。我们并不去独立地考察那些个体,那是很愚蠢的。相反,我们将它们全部放进一个袋子。这之后,我们所需要考察的对象就只有一个了——那袋子。
—— $\text{George Polya}\qquad$
\(2.1\) 定义及性质
一个无穷序列的生成函数是一个形式幂级数,每一项的系数可以提供关于这个序列每个元素的信息。生成函数的构造应当是易于在具体情况下分析序列信息的。下面具体定义:
\(\textbf{2.1.1 }\text{(生成函数)}\)
对于一个无穷数列 \(\langle a_i \rangle\),定义其关于占位元 \(k_i(x)\) 的生成函数 \(F(x)\) 如下:
\[F(x) = \sum_{i = 0}^{\infty} a_i k_i(x) \]
其中,占位元的不同取法分别对应着不同的情况,常见的例子如下:
- \(k_i(x) = x^i\)
这对应着普通生成函数(\(\underline{\textbf{O}}\text{rdinary} \ \underline{\textbf{G}}\text{enerating} \ \underline{\textbf{F}}\text{unction}, \ \text{OGF}\)),其常用于组合问题。 - \(k_i(x) = \dfrac{x^i}{i!}\)
这对应着指数生成函数(\(\underline{\textbf{E}}\text{xponential} \ \underline{\textbf{G}}\text{enerating} \ \underline{\textbf{F}}\text{unction}, \ \text{EGF}\)),其常用于排列问题。 - \(k_i(x) = \dfrac{1}{i^x}\)
这对应着狄利克雷生成函数(\(\underline{\textbf{D}}\text{irichlet} \ \underline{\textbf{G}}\text{enerating} \ \underline{\textbf{F}}\text{unction}, \ \text{DGF}\)),其常用于元素按狄利克雷卷积贡献的问题。
我们在下面常用 \(\text{OGF}\) 作例子。
给定一个数列 \(\langle 1, 1, 1, \dots \rangle\),我们可以写出它的 \(\text{OGF } F(x)\) 如下:
这样,我们就将一个数列用一个函数表示出来了,在需要第 \(i\) 项时只需要提取系数即可。但我们时时都带着一个求和号运算是很不方便的,这就启发我们去寻找一个更加简便的形式表示生成函数。这个形式常被称作封闭形式。一个生成函数的封闭形式有时不唯一,你可以把简明地表述这个数列的任意形式叫做封闭形式。
注意:考虑生成函数的“函数值”是完全无意义的,我们只关心生成函数每一项对应的系数,以及数列在幂级数形式下表现的性质。
例如 \(F(x) = 1 + x^2 + x^3 + \cdots\) 满足 \(F(x) = xF(x) + 1\),因此 \(F(x)\) 的封闭形式为 \(\dfrac{1}{1 - x}\)。
数列 \(1, p, p^2, \dots\) 的 \(\text{OGF}\) \(F(x) = \sum_{i=0}^{\infty} (px)^i\) 的封闭形式也可以类似地导出,是 \(\dfrac {1}{1 - px}\)。
\(2.2\) 常用的形式操作和 \(\text{OGF}\)
下面我们将采用生成函数法求解一些经典问题。
\(2.3\) 例题
\(2.3.1\):找零问题
你有无穷多的 \(1\) 元、\(2\) 元和 \(5\) 元的硬币。你需要支付 \(n\) 元,请问有多少种方案。
我们设 \(F[n] =\) 支付 \(n\) 元的方案数。特殊的,\(F[0] = 1\)。
我们用 \(\langle 1\rangle\)、\(\langle 2\rangle\) 与 \(\langle 5\rangle\) 分别表示三种面值的硬币。我们定义一种支付方案为一组硬币的组合。若一组硬币有 \(a\) 个 \(\langle 1\rangle\)、\(b\) 个 \(\langle 2\rangle\)、\(c\) 个 \(\langle 5\rangle\),则记作 \(\langle 1\rangle^a \langle 2\rangle^b \langle 5\rangle^c\)。一种支付方案的价值记为这种方案内硬币的价值总和,记作 \(value\left(\langle 1\rangle^a \langle 2\rangle^b \langle 5\rangle^c\right) = a + 2b + 5c\)。
定义两种支付方案 \(S_1, S_2\) 的乘法表示这两种支付方案同时支付。这样定义,任意硬币在 \(S_1\times S_2\) 中被使用的次数是两边对应硬币幂次之和,这符合我们对幂的认知。同时 \(value(S_1\times S_2) = value(S_1) + value(S_2)\)。
定义两种支付方案 \(S_1, S_2\) 的加法表示这两种方案的并列。容易验证乘法对加法有分配律。
我们采用无穷求和来表示所有可能的支付方式的并列。
假设我们只能支付 \(1\) 元的硬币,则所有可能的支付方案可以表示为
注意,我们并不考虑代入一个值后的实际意义,这只是表述支付方案的封闭形式。
随后我们加入 \(2\) 元的硬币。这表示我们能够在每种方案中加入任意数量的 \(\langle 2 \rangle\)。这时的支付方案可以表示为
类似地,我们能得到加入 \(5\) 元硬币的答案:
需要注意的是,\(P_{\{1,2,5\}} \neq \sum_{k \ge 0}\left(\langle 1 \rangle + \langle 2 \rangle + \langle 5 \rangle\right)^k\)。
若我们只关心总面值,则可以记 \(z^k\) 为一种面值和为 \(k\) 的方案,则 \(\langle 1 \rangle = z^1, \langle 2 \rangle = z^2, \langle 5\rangle = z^5\)。我们的答案即为
具体表出答案将用到分式分解的知识,留作读者练习。
\(2.3.2\):斐波那契数列
首先需要对斐波那契数列进行定义。斐波那契数列是一个无穷数列 \(\langle f_i \rangle\),满足
考虑斐波那契数列的 \(\text{OGF}\),记作 \(F(x)\)。我们可以通过一系列对生成函数系数的变换,使得所组合的新生成函数的任意一位可以通过原递归式表示变换前的生成函数对应位。以 \(F(x)\) 为例。
可以发现,\(xF(x) + x^2F(x)\) 的系数正好对应 \(F(x)\) 中第二项及以后部分的系数。也就是说,\(F(x)\) 满足
等号右侧加入的 \(x\) 是修正系数用的。
不难从如上的关系式中推得 \(F(x)\) 的封闭形式
然而目前而言,这个封闭形式并未给我们提供有用的信息,还需要进一步地转换。举个例子,我们想求得 \(f_n\) 仅使用 \(n\) 的表示法,即提取 \(F(x)\) 的第 \(n\) 项系数。这里我们仍然可以采用分式分解中的待定系数法。
具体地,我们首先计算分母的因式分解,随后设未知数使 \(F(x)\) 被表示为两个简单分式的和的形式,最后平凡地提取系数。
我们可以解得 \(1 - x - x^2 = 0\) 的两个根 \(x_1 = \dfrac{-1 + \sqrt 5}{2}, x_2 = \dfrac{-1 - \sqrt 5}{2}\)。随后 \(F(x)\) 的分母就是 \((x - x_1)(x - x_2)\) 了。
随后我们设
这直接给出了方程组
解得 \(a = \dfrac{5 + \sqrt 5}{10}, b = \dfrac{5 - \sqrt 5}{10}\)。随后提取系数:
带入即可得到
此处同样可以应用不同根的有理展开定理。对比 \(R(z)\) 的表达式可以发现 \(P(z) = z, Q(z) = 1 - z - z^2 = (1 - \phi z)(1 - \hat\phi z)\),其中 \(\phi,\hat\phi\) 为 \(Q^R(z) = z^2 - z - 1\) 的两个根。容易得到 \(Q'(z) = -1 - 2z\),
根据定理 \(1.5.1\),\(\phi\) 的系数就应当是 \(\dfrac{\phi}{\phi + 2} = \dfrac{1}{\sqrt 5}\),而 \(\hat\phi\) 的系数是 \(\dfrac{\hat\phi}{\hat\phi + 2} = \dfrac{-1}{\sqrt 5}\)。带入得到
\(2.3.3\):卡特兰数
我们定义卡特兰数 \(Cat(i)\) 如下:\(Cat(0) = 1, Cat(n) = n\) 对括号的合法匹配数。例如:三对括号时合法匹配有 ((()))
、(()())
、()()()
、()(())
、(())()
,因此 \(Cat(3) = 5\)。
想要通过生成函数刻画一个组合对象,一个经典的思路就是首先得到递推式,随后使用生成函数刻画对应的递推式,得到递归构造,最终解出封闭形式或采用牛顿迭代法求解。在本题中也不例外,我们首先寻找卡特兰数满足的递推式。寻找递推式的过程应当具体地结合组合对象自己的性质,这点是无法总结归纳的。在本题中,我们可以枚举新一对括号内的子括号序列,并在其外面放置合法的括号序列。这也得到了
构造卡特兰数的 \(\text{OGF } C(z)\)。可以发现 \(Cat(n + 1) = [z^n]C^2(z)\)。这里考虑 \(Cat(n + 1)\) 的 \(\text{OGF}\),容易发现其就是将零次项改为 \(0\) 后系数左移。也就是
这自然地导出了 \(C(z)\) 的封闭形式:
这里发现出现了两个根,我们要讨论根的取舍问题。然而由于数列是存在的,因此必有一根可以取到,我们只需要判断哪个根满足显然的性质即可。考虑 \(C(0) = [z^0]C(z) = 1\),而 \(+\) 的情况取到正无穷,不满足该性质,因此我们得到了
得到了封闭形式后提取系数就变得简便了。我们可以直接应用广义二项式定理,得到
这就得到了卡特兰数的经典形式。
\(2.4\) 简析生成函数
\(2.4.1 \text{ OGF}\)
\(\text{OGF}\) 正如它的名字,是最简单的构造一个序列的生成函数的方法,我们将每个元素加入以编号为幂次的占位元来区分每个元素。两个 \(\text{OGF}\) 的乘法是经典的加卷积。
两个 \(\text{OGF}\) 之间的运算有着一系列的组合意义。
加法:在生成函数意义上,两个 \(\text{OGF}\) 的对应位置的值相加,这表示着不相交的两个集合的并。
乘法:两个 \(\text{OGF}\) 对应位置代表着两个集合,而乘法就产生了这两个集合的笛卡尔积,即在这两个集合中分别选出一个组成二元组的全体对应的集合。
我们可以发现,\(\text{OGF}\) 的乘法和计数背包的合并是同构的。这也表明了 \(\text{OGF}\) 在处理组合问题上的代数意义。
常见的 \(\text{OGF}\) 形式已于上方列出。
\(2.4.2 \text{ EGF}\)
考察 \(e^x\) 的麦克劳林级数形式,我们能够发现 \(\text{EGF}\) 得名的原因。同时,这个形式也为其处理排列问题提供了方便,因为其卷积能自然地拼凑出组合数的形式。如下:
这也表明了为何 \(\text{EGF}\) 更加适合应用于有标号有顺序对象的组合问题。首先可以发现,一组标号给一组对象只能产生一种情况,因为我们需要保证标号是有序的。我们需要从这 \(i + j\) 个标号中选择 \(i\) 个标号给前一部分元素,因此得到一个系数 \(C_k^i\)。
两个 \(\text{EGF}\) 之间的运算有着一系列的组合意义。
加法仍然和 \(\text{OGF}\) 相同,是不相交集合的并。
乘法:在上面已经阐述,我们产生两个集合的笛卡尔积时,应当考虑一次产生会出现多少不同标号的集合,将这一值作为系数加入乘积对应项。这也就是有标号对象对应集合的笛卡尔积。
在这里需要介绍多项式指数函数施在 \(\text{EGF}\) 上的组合意义。
我们取一个 \(\text{EGF } F(x)\),其描述了一种有标号的组合元素,则 \(\exp F(x)\) 就描述了由这种组合元素构成的有标号集合的方案数。有兴趣进一步了解的可以参阅 OI-Wiki 对这部分内容的讲解。
一些常见的 \(\text{EGF}\) 形式:
实现时处理 \(\text{EGF}\) 常将 \(x^k\) 和 \(1/k!\) 分开,后者作为 \(x^k\) 系数的一部分储存。因此在提取 \([x^n/n!]\) 项系数时应当改作提取 \([x^n]\) 项系数的 \(n!\) 倍。
\(2.4.3 \text{ DGF}\)
\(\text{DGF}\) 的特殊构造和其名字有着密不可分的联系。也就是说,其是被专门构造来处理数论函数的。
两个 \(\text{DGF}\) 之间的乘法有着一系列的数论意义。我们能看到,两个数论函数的 \(\text{DGF}\) 的乘积是两者的狄利克雷卷积对应的 \(\text{DGF}\)。
如果一个 \(\text{DGF } F(x)\) 对应着一个积性函数 \(f(n)\),则该 \(\text{DGF}\) 可以被 \(f\) 在质数幂次处的取值表示。记 \(\mathbb P\) 为质数集合,我们有
可以应用它证明一些结论,或是构造一些筛法的函数。相关的应用可以类比贝尔级数。
\(2.5\) 二元生成函数
以二元生成函数(\(\underline{\textbf{B}}\text{ivariate} \ \underline{\textbf{G}}\text{enerating} \ \underline{\textbf{F}}\text{unction}, \ \text{BGF}\))为主的多占位元生成函数是为了分析多维序列而构造的一类生成函数,其与一元生成函数不同之处在于其存在多个占位元,分别用于标识不同变量。本文将以二元生成函数为例探讨多占位元生成函数的应用。
\(\textbf{定义 2.5.1 }\text{(二元生成函数)}\)
对于一个无穷序列 \(\langle a_{i, j}\rangle\),定义其关于占位元 \(k_i(x), k_j(y)\) 的二元生成函数 \(G(x, y)\) 如下:
\[G(x, y) = \sum_{i = 0}^{\infty}\sum_{j = 0}^{\infty} a_{i, j} k_i(x) k_j(y) \]
这里 \(k_i(x),k_j(y)\) 不一定是同一类占位元,应用见小孩召开法。
二元生成函数在实际计数问题中常用于标识”恰好选 \(k\) 个组合元素“的限制。假设我们构造了一个组合元素的 \(\text{EGF } F(x)\),那如果我们需要恰好 \(m\) 个组合元素中 \(n\) 个最小的单元组成的对象的方案数,我们就可以直接做 \([x^ny^m / n!]\exp(F(x)y)\)。例如 [PA 2019 Final] Grafy。
另外的,也可以头铁。在使用诸如解二元微分方程组的方式后,能得到一个二元生成函数的封闭形式。我们可以借助一些组合或配凑的方式,将占位元各个击破,最后得到最简单的形式。例如本篇闲话中的方法 2。
附录
附 \(1.\) 经典微积分
请自行阅读《高等数学(上册)》获得必要知识,这里只作列出。
\(\textbf{定义 附 1.1 } \text{(求导) }\)
定义对函数 \(f(x)\) 的形式导数 \(f'(x)\) 满足 \([x^{k-1}] f'(x) = k f[k]\)。
下面 \(f, g\) 都是以 \(x\) 为自变量的一元函数,\(c\) 为常数。
记对 \(f(x)\) 求 \(k\) 次导数得到的值为 \(f^{(k)}(x)\)。
记函数 \(f(x, y)\) 对 \(x\) 求偏导为 \(\frac{\partial}{\partial x} f(x, y)\).
求导是操作系数的一个经典方法,因此定义如下的算子:
\(\textbf{定义 附 1.2 } \text{(}\vartheta\text{ 算子) }\)
对一个函数 \(f(x)\) 定义 \(\vartheta\) 算子 \(\vartheta f(x)\):
\[\vartheta f(x) = x f'(x) \]可以发现 \([x^k]\vartheta f(x) = kf[k]\)。需要注意的是,\(0\) 次项可能需要重新定义。
积分和求导同样重要。
\(\textbf{定义 附 1.3 } \text{(积分) }\)
定义对函数 \(f(x)\) 的形式积分操作 \(\int f(x)\) 满足 \([x^{k+1}] \int f(x) = f[k] / (k + 1)\)。
下面 \(f, g\) 都是以 \(x\) 为自变量的一元函数,\(c\) 为常数。
\(\textbf{定理 附 1.1 } \text{(洛必达法则) }\)
若函数 \(f(x), g(x)\) 满足如下条件:
- \(\lim\limits_{x \to a} f(x) = 0, \ \lim\limits_{x \to a} g(x) = 0\)
- \(f,g\) 在点 \(a\) 的某一去心邻域内可导,且 \(g'(x)\neq 0\)。
- \(\lim\limits_{x \to a} \dfrac{f'(x)}{g'(x)} = A\),其中 \(A \in \mathbb R\) 或 \(A = \pm \infty\)。
则我们有\[\lim_{x \to a} \frac{f(x)}{g(x)} = \lim_{x \to a} \frac{f'(x)}{g'(x)} = A \]
附 \(2.\) 离散微积分
类比经典微分算子 \(\text d\) 取到无穷小的操作,这里定义差分算子取到离散情况的最小:\(1\)。当然我们也需要定义点值平移的算子。
\(\textbf{定义 附 2.1 }\text{(差分算子 }\Delta\text { )}\)
对于一个函数 \(f\),我们定义 \(\Delta f(x) = f(x + 1) - f(x)\)。
经典微分中存在 \(\text d (e^x) = e^x\text dx\),而在这里存在 \(\Delta 2^n = 2^n\)。
\(\textbf{定义 附 2.2 }\text{(平移算子 E )}\)
对于一个函数 \(f\),我们定义 \(\text E f(x) = f(x + 1)\)。
\(\Delta = \text E - 1\)。
众所周知,\(\text d (x^n) = n x^{n-1}\text dx\)。那么在离散微积分中有没有类似的函数呢?是有的。我们接下来就将阐述这种函数:
\(\textbf{定义 附 2.3 }\text{(阶乘幂) }\)
阶乘幂分为下降幂和上升幂。
- 下降幂 \(x^{\underline n} = x(x - 1)(x - 2)\cdots (x - n + 1)\)。
当 \(n > 0, -n < 0\) 的时候,有 \(x^{\underline{-n}} = \frac{1}{(x + 1)(x + 2)\cdots (x + n)}\)。
\(x^{\underline{a + b}} = x^{\underline a}(x - a)^{\underline b}\)- 上升幂 \(x^{\overline n} = x(x + 1)(x + 2)\cdots (x + n - 1)\)。
当 \(n > 0, -n < 0\) 的时候,有 \(x^{\overline{-n}} = \frac{1}{(x - 1)(x - 2)\cdots (x - n)}\)。
\(x^{\overline{a + b}} = x^{\overline a}(x + a)^{\overline b}\)
\(x^{\underline n} = (-1)^n (- x)^{\overline n}\)
可以发现,\(\Delta x^{\underline n} = n x^{\underline {n-1}}\)。
类比经典不定积分算子 \(\int\),我们也可以使用求和代替不定积分算子,得到有限积分(通常求和 \([0, n)\))。
有:
附 \(3.\) 一些具体的级数
在推导的过程中可以发现,这两种广义级数对应的定理从证明方法到具体步骤都是很相似的,同时两者之间也有着不小的联系。
参考资料:
广义二项/指数级数, qwaszx
《具体数学》
\(3.1\) 广义二项级数
\(\textbf{定义 附 3.1.1 }\text{(广义二项级数)}\)
定义广义二项级数为
\[\mathcal{B}_t(z) = \sum_{n \ge 0} \binom{tn + 1}{n} \frac{z^n}{tn + 1} = \sum_{n\ge 0}(tn)^{\underline{n-1}} \frac{z^n}{n!} \]
我们首先需要得到其封闭形式。这就需要我们证明如下的定理:
\(\textbf{定理 附 3.1.1 }\text{(封闭形式)}\)
广义二项级数满足
\[\mathcal{B}_t(z) = z\mathcal{B}_t(z)^t + 1 \]
证明:
令 \(F(z) = \mathcal{B}_t(z) - 1\),这就得到
这个形式容易构造 \(G(z) = F^{\langle -1\rangle} = \dfrac{z}{(1 + z)^t}\)。应用定理 \(1.4.2\) 得到
\(n > 0\) 时应用吸收恒等式得到
\(n = 0\) 时显然成立。
因此得到了如此构造的 \(\mathcal{B}_t(z)\) 满足定义式。
证毕。
有时我们会发现这个形式并不广泛,这就启发我们构造一些更广泛的形式,如下。
\(\textbf{定理 附 3.1.2 }\)
广义二项级数满足
\[\mathcal{B}_t(z)^r = \sum_{n \ge 0} \binom{tn + r}{n} \frac{r}{tn + r}z^n \]
证明:
令 \(H(z) = (z + 1)^r\),应用定理 \(1.4.2\) 得到
如上地讨论可以得到 \(\mathcal{B}_t(z)^r\) 的系数满足定理。
证毕。
然后我们需要证明一个虽然有用但是证明十分麻烦的定理。
\(\textbf{定理 附 3.1.3 }\)
广义二项级数满足
\[\frac{\mathcal{B}_t(z)^r}{ 1 - t + t\mathcal{B}_t(z)^{-1}} = \sum_{n \ge 0} \binom{tn + r}{n}z^n \]
令 \(H(z) = \dfrac{(1 + z)^r}{1 - t + t(1 + z)^{-1}}\)。应用定理 \(1.4.2\) 得到
证毕。
发生了严重的中间表示膨胀 神乎其技
中间由生成函数形式转化为系数形式再转化为生成函数形式的手法来自 营业日志 2020.5.9, EntropyIncreaser。这个手法常用在被提取级数形式简单但无法进一步化简的情况。
感觉直接在生成函数上推导的方式是可以试着从结果倒着推导出来的,但未成功。
关于这些定理的组合意义证明可以参考《具体数学》\(7.5\) 章例 \(5\)。
这里提一句,\(\mathcal{B}_2(z)\) 的系数又称卡特兰数。
\(\text{Bonus :}\)(具体数学 习题 \(5.19\))如何证明 \(\mathcal{B}_t(z)\times \mathcal{B}_{1 - t}(-z) = 1\)?
\(3.2\) 广义指数级数
\(\textbf{定义 附 3.2.1 }\text{(广义指数级数)}\)
定义广义指数级数为
\[\mathcal{E}_t(z) = \sum_{n \ge 0} {(nt + 1)}^{n-1}\frac{z^n}{n!} \]
下面仍然是三个和上面类似的定理。
\(\textbf{定理 附 3.2.1 }\)
广义指数级数满足
\[\mathcal{E}_t(z)^{-t} \ln \mathcal{E}_t(z) = z \]
令 \(F(z) = \ln \mathcal{E}_t(z)\),则有
我们现在需要验证满足上面的 \(F(z)\) 对应的 \(e^{F(z)}\) 的系数是否即为 \(\mathcal{E}_t(z)\) 的系数。由上式可以发现 \(F^{\langle -1\rangle}(z) = \dfrac{z}{e^{tz}}\)。应用定理 \(1.4.2\) 得到
证毕。
\(\textbf{定理 附 3.2.2 }\)
广义指数级数满足
\[\mathcal{E}_t(z)^r = \sum_{n \ge 0} r {(tn + r)}^{n-1}\frac{z^n}{n!} \]
我们需要提取 \(e^{rF(z)}\) 的系数。由于我们已经得到了 \(F^{\langle -1\rangle}(z)\),直接应用定理 \(1.4.2\) 得到
具体数学 p.364 写到,这个定理可以通过将 \(\mathcal{E}_t(z)^r\) 视作 \(\mathcal{B}_t(z)\) 的极限情况来证明,因为不难证明
这个证明不难。先不考虑 \(r\) 次幂,写出
证毕。
\(\textbf{定理 附 3.2.3 }\)
广义指数级数满足
\[\frac{\mathcal{E}_t(z)^r}{1 - zt\mathcal{E}_t(z)^t} = \sum_{n\ge 0} (tn + r)^n \frac{z^n}{n!} \]
由定理 附 \(3.2.1\) 可以得到 \(F(z) = z\mathcal{E}_t(z)^t\)。于是我们仍然可以直接应用定理 \(1.4.2\) 得到
证毕。
以下是博客签名,与正文无关。
请按如下方式引用此页:
本文作者 joke3579,原文链接:https://www.cnblogs.com/joke3579/p/poly-and-gf.html。
遵循 CC BY-NC-SA 4.0 协议。
请读者尽量不要在评论区发布与博客内文完全无关的评论,视情况可能删除。