综评 暂存

生成函数 研究报告

本文先引入了广义二项式定理,幂级数展开,随后研究了 OGF、EGF 最简单的应用,用其推导出了斐波那契数列的通项公式,并研究了几个简单应用。

0. 符号与基本定理

0. 符号

\[\sum_{i=1}^{n} a_i \]

表示 \(a_1+a_2+\cdots+a_n\)

\(n!\) 表示 \(1\times2\times\cdots\times n\)

\(\mathbb{R}\) 为实数集,\(\mathbb{N}\) 为整数集。

\(e\) 是自然对数的底数,即 \(\ln k= \log_e k\)\(e≈2.718\)

1. 上升/下降幂:

\[n^{\underline{k}} = n \times (n-1) \times \cdots \times (n-k+1) \]

称为 \(n\) 的下降幂。

同理:

\[n^{\overline{k}} = n \times (n-1) \times \cdots \times (n+k-1) \]

称为 \(n\) 的上升幂。

2. 组合数:

\[\operatorname{C}^m_n = \binom{n}{m} = \dfrac{n!}{m!(n-m)!} \]

组合数的几个重要公式:

对称性:

\[\binom{n}{m} = \binom{n}{n-m} \]

吸收性:

\[\binom{n}{m} = \dfrac{n}{m}\binom{n-1}{m-1} \]

递推:

\[\binom{n}{m} = \binom{n-1}{m-1} + \binom{n-1}{m} \]

证明:不妨直接拆组合数。

也可以考虑杨辉三角。

上指标求和:

\[\sum_{i=m}^n \binom{i}{m} = \binom{n+1}{m+1} \]

证明:

\[\sum_{i=m}^n \binom{i}{m} = \binom{m}{m} +\binom{m+1}{m}+\cdots+\binom{n}{m} \]

因为 \(\binom{m}{m} = 1 = \binom{m+1}{m+1}\),所以可以用上文的递推公式将右式的前两项合并得到 \(\binom{m+1}{m+1}+\binom{m+1}{m} = \binom{m+2}{m+1}\)

接着,可以将 \(\binom{m+2}{m+1}\)\(\binom{m+2}{m}\) 合并得到 \(\binom{m+3}{m+1}\)

以此类推即可。

3. (广义)二项式定理:

\[(a+b)^n = \sum_{k=0}^{n}\dbinom{n}{k} a^{n-k}b^{k} \]

我们考虑更改组合数的定义。

广义二项式系数:

\[\binom{\alpha}{k} = \dfrac{\alpha^{\underline{k}}}{k!},\alpha \in\color{orange}\mathbb{R}\color{qaq},k\in\color{orange}\mathbb{N} \]

广义二项式定理:

\[(a+b)^\alpha = \sum_{k=0}^{\infty}\dbinom{\alpha}{k} a^{\alpha-k}b^{k} \]

由于证明较为复杂,略去。

上指标反转:

\[\binom{n}{m} = (-1)^m\binom{m-n-1}{m} \]

证明:
考虑 \(n^{\underline{m}} = n(n-1)\cdots (n-m+1) = (-1)^m(-n)(-n+1)\cdots(m-n-1)=(m-n-1)^{\underline{m}}\)

等价于右式。证毕。

4. 多项式定理:

对于 \((x_1+x_2+\cdots+x_t)^n\) 的展开式,\(x_1^{n_1}x_2^{n_2}\cdots x_t^{n_t}\) 项的系数是:

\[\dfrac{n!}{n_1!n_2!\cdots n_t!},\sum n_i = n \]

证明:考虑组合意义。

先从 \(n\) 中选择 \(n_1\) 个式子,方案数为 \(\dbinom{n}{n_1}\)

接着,从 \(n-n_1\) 中选择 \(n_2\) 个式子,方案数为 \(\dbinom{n-n_1}{n_2}\)

\(\cdots\)

最后,从 \(n-n_1-n_2-\cdots-n_{t-1}\) 中选择 \(n_t\) 个式子,方案数为 \(\dbinom{n-n_1-n_2-\cdots-n_{t-1}}{n_t}\)

由乘法原理,方案数为 \(\dbinom{n}{n_1}\dbinom{n-n_1}{n_2}\cdots\dbinom{n-n_1-n_2-\cdots-n_{t-1}}{n_t}\)

能够化简为:\(\dfrac{n!}{n_1!n_2!\cdots n_t!}\)

证毕。

值得注意的是,这个问题等价于可重集的排列方案数。

1. 幂级数展开

由于广义二项式定理的存在,我们可以对某些式子进行展开。以下是几个例子:

\[\begin{aligned} \dfrac{1}{x-1} &= \sum_{k=0}^{\infty}\binom{-1}{k}(-x)^k \\&= \sum_{k=0}^{\infty}\dfrac{(-1)^kk!}{k!}(-x)^k \\&= \sum_{k=0}^{\infty} x^k \\&= 1+x+x^2+\cdots \end{aligned} \]

\[\dfrac{1}{x+1} = 1-x+x^2-x^3+x^4+\cdots \]

另外几个常见展开:

\[e^x=\sum_{n\ge 0} \dfrac{1}{n!}x^n \]

\[xe^x=\sum_{n\ge 1}\dfrac{n}{n!}x^n \]

\[e^{Cx}=\sum_{n\ge 0} \dfrac{C^n}{n!}x^n \]

\[\ln(1-x) = -\sum_{n\ge \color{orange}1}\color{qaq}\dfrac{1}{n}x^n \]

\[\dfrac{e^x+e^{-x}}{2}=\sum_{n\ge0}\dfrac{1}{(2n+1)!}x^{2n+1} \]

\[\dfrac{e^x-e^{-x}}{2}=\sum_{n\ge0}\dfrac{1}{(2n)!}x^{2n} \]

可以使用泰勒公式证明,但是证明在此不重要。

同时,我们不关心是否收敛,因为在生成函数中,重要的是系数而非值。

2.OGF

对于数列 \(A\),其 OGF 定义为:

\[A(x)=\sum_{i\ge0}A_ix^i \]

OFG 与无标号计数有关。

例:BZOJ3028 食物

首先分别给出每个条件对应的生成函数。

\(0\)\(1\) 个:\(1+x\)

\(0\)\(1\)\(2\) 个:\(1+x+x^2\)

\(0\)\(1\)\(2\)\(3\) 个:\(1+x+x^2+x^3\)

奇数个:\(\dfrac{x}{1-x^2}\)

偶数个:\(\dfrac{1}{1-x^2}\)

\(3\) 的倍数:\(\dfrac{1}{1-x^3}\)

\(4\) 的倍数:\(\dfrac{1}{1-x^4}\)

我们将这些生成函数的式子相乘,得到:

\[\begin{aligned} f(x)&=\dfrac{x}{(1-x)^4} \\&= x\sum_{k=0}^{\infty} \binom{-4}{k}(-x)^k \\&= x\sum_{k=0}^{\infty}(-1)^k\binom{k+3}{3}(-x)^k \\&= \sum_{k=1}^{\infty}\binom{k+2}{3}x^{k} \end{aligned} \]

\([x^n]f(x)\) 就是选 \(n\) 个的答案。

正确性:多项式乘法等价于枚举在每一个对象中选择了多少个。

生成函数可以用来求数列的通项公式。

引入:化简 \(\sum_{i=0}^{\infty}(i+1)x^i\)

\(S=1+2x+3x^2+\cdots\),则 \(xS=x+2x^2+3x^3+\cdots\)

相减,得:\((1-x)S=1+x+x^2+x^3+\cdots=\dfrac{1}{1-x}\)

解方程,得: \(S=\dfrac{1}{(1-x)^2}\)

例:求 fib 数列的通项公式。

即求出 \(f_0=\color{orange}0\color{qaq},f_1=1,f_n=f_{n-2}+f_{n-1}\) 的通项公式。

依照上例子,我们设生成函数 \(f(x)=\sum_{i=0}^{\infty}f_ix^i\)

那么有:

\[\begin{aligned} f(x) &= \sum_{i=0}^{\infty}f_ix^i \\ &= f_0+f_1x+\sum_{i=2}^{\infty} (f_{i-2}+f_{i-1}) x^i \\ &= x+\sum_{i=2}^{\infty} (f_{i-1}x^{n-1}\times x+f_{i-2}x^{n-2}\times x^2) \\ &= x+x\sum_{i=0}^{\infty}f_ix^i+x^2\sum_{i=0}^{\infty}f_ix^i \\ &= x+xf(x)+x^2f(x) \end{aligned} \]

所以 \(F=\dfrac{x}{1-x-x^2}\)。(封闭形式)

将这个式子进行因式分解,得到 \(\dfrac{x}{(1-\frac{1+\sqrt{5}}{2}x)(1-\frac{1-\sqrt{5}}{2})x}\)

考虑到我们能够计算出形如 \(\dfrac{c}{1-kx}\) 的式子的值,因此可以使用待定系数法,将封闭形式变为 \(\dfrac{A}{1-\frac{1+\sqrt{5}}{2}x}+\dfrac{B}{1-\frac{1-\sqrt{5}}{2}x}\)

于是有:

\[A\times (1-\dfrac{1-\sqrt{5}}{2}x) +B\times (1-\dfrac{1+\sqrt{5}}{2}x) = x \\ A+B-A(\dfrac{1-\sqrt{5}}{2}x)-B(\dfrac{1+\sqrt{5}}{2}x)=x \]

由于 \(A+B=0\),有:

\[-A\dfrac{1-\sqrt{5}}{2}-B\dfrac{1+\sqrt{5}}{2}=1 \\ A=\dfrac{1}{\sqrt{5}},B=-\dfrac{1}{\sqrt{5}} \]

所以:

\[F=-\dfrac{1}{\sqrt{5}} \times \dfrac{1}{1-\frac{1-\sqrt{5}}{2}x} + \dfrac{1}{\sqrt{5}}\times \dfrac{1}{1-\frac{1+\sqrt{5}}{2}x} \]

按一般方法进行展开,得:

\[f(x)=\sum_{n=0}^{\infty}(\dfrac{1-\sqrt{5}}{2})^nx^n \times (-\dfrac{1}{\sqrt{5}}) + \sum_{n=0}^{\infty}(\dfrac{1+\sqrt{5}}{2})^nx^n \times (\dfrac{1}{\sqrt{5}}) \]

由此,我们得到了 fib 数列的通项公式:

\[fib_n=[x^n]f(x)=\dfrac{(\dfrac{1+\sqrt{5}}{2})^n-(\dfrac{1-\sqrt{5}}{2})^n}{\sqrt{5}} \]

4.EGF

定义一个数列 \(A\) 的指数型生成函数 EGF 为:

\[f(x)=\sum_{i=0}^{\infty}f_i\dfrac{x^i}{i!} \]

EGF 一般与有标号计数有关,考虑其组合意义:

假设我们要从 \(r\) 个数中分别选择 \(x_1,x_2,x_3\)排成一排,记答案为 \(a_r\)。由多项式定理,\(a_r=\dfrac{r!}{x_1!x_2!x_3!}\)

\(a_r=\sum_{x_1+x_2+x_3=r}\dfrac{r!}{x_1!x_2!x_3!}\),而我们在定义 EGF 时就已经预处理好了分母,但是没有处理分子 \(r!\)

\(f(i)=\sum_{i=0}^{\infty}\dfrac{x^i}{i!}\),有 \(a_r=r!\times [x^r]f(x)\)。也就是在 OGF 的基础上再乘以 \(r!\)

例:用红蓝绿 \(3\) 种颜色去涂 \(1\times n\) 的棋盘,每格涂一种颜色,求使得被涂成红色和蓝色的方格数均为偶数的的涂色方法数。

不妨设 \(G(x)=(1+\dfrac{x^2}{2!}+\dfrac{x^4}{4!}\cdots)^2(1+\dfrac{x}{1!}+\dfrac{x^2}{2!}+\dfrac{x^3}{3!}+\cdots)\)

则:

\[\begin{aligned} G(x)&=(\dfrac{e^x+e^{-x}}{2})^2e^x \\ &=\dfrac{e^{3x}+2e^x+e^{-x}}{4} \\ &=\sum_{n=0}^{\infty}\dfrac{1}{4}(3^n+2+(-1)^n)\dfrac{x^n}{n!} \end{aligned} \]

故答案为 \(\dfrac{1}{4}(3^n+2+(-1)^n)\)

FFT 学习笔记

FFT 是一种可以在 \(O(n\log n)\) 时间内进行 \(n\) 项式卷积的工具,利用 FFT,我们可以大幅度加快多项式乘法的运算,进而与生成函数等配合,进行更为快速的问题解决。

1.多项式与卷积

1.1 多项式

对于多项式 \(F(x)=a_0+a_1x+a_2x^2+a_3x^3+\dots+a_nx^n\),我们称 \(a_0,a_1,\dots,a_n\) 为它的系数,这种表示法叫做系数表示法。

定义 \(F(x)\)\(n\) 次项系数为 \(f_n\)

我们有:

\[F(x)=\sum_{i=0}^nf_ix^i \]

1.2 卷积

考虑两个多项式进行乘法,即\(P(x)=F(x)G(x)\),有 \(p_k=\sum_{i=0}^kf_ig_{k-i}\),也可写作 \(p_k=\sum_{i+j=k}f_ig_j\)

事实上,形如 \(P[k]=\sum_{i\oplus j=k}f_ig_j\) 的操作叫做卷积,\(\oplus\) 为任意运算。

多项式乘法为 \(\oplus\)\(+\) 的操作,即加法卷积,暴力进行的时间复杂度为 \(O(n^2)\)

2.DFT 思想

有定理:平面上的 \(n+1\) 个点唯一确定一个 \(n\) 次多项式(常见应用是待定系数法和拉格朗日插值公式)。于是我们可以用点值的方法表示一个多项式,这被称作点值表示法。

对于两个多项式相乘,我们可以直接将它们对应点的点值相乘。对于两个次数为 \(n\) 的多项式,我们只需要取 \(2n+1\) 个点相乘即可,时间复杂度为 \(O(n)\),优于暴力卷积的 \(O(n^2)\)

DFT(离散傅里叶变换)所做的就是将一个多项式的系数表达法转换为点值表示法。

但是我们取的点是什么呢?

3.复数和单位圆

3.1 复数

定义 \(i^2=-1\),这里 \(i\) 被称作虚数单位。

复数可以记为 \(a+bi\)\(a\) 称作实部,\(b\) 称作虚部。

虚数没有大小和正负之分。注意:部分实数的运算公式不能拓展到复数。

定义虚部互为相反数的复数为共轭复数。

虚数的基本运算如下:

  1. 加减法:实部、虚部分别相加。如:\((a+bi)\pm(c+di)=a\pm c+(b\pm d)i\)

  2. 乘法:当做一次多项式相乘即可。如:\((a+bi)\times (c+di)=ac-bd+(ad+bc)i\)

  3. 除法:同乘分母的共轭复数。如:\(\dfrac{a+bi}{c+di}=\dfrac{(a+bi)(c-di)}{(c+di)(c-di)}=\dfrac{ac+bd+(bc-ad)i}{c^2+d^2}\)

我们同时注意到复数的几何含义:我们可以用数对 \((a,b)\) 来表示复数 \((a+bi)\),事实上,复数 \(a+bi\) 所对应的是平面直角坐标系上横坐标为 \(a\),纵坐标为 \(b\) 的点。

定义一个虚数 \(a+bi\) 的模长为 \(\sqrt{a^2+b^2}\),即其到原点的距离,幅角为与 \(x\) 轴形成的夹角。

有定理:复数相乘,模长相乘,幅角相加。

首先证明模长相乘:

证明:

设两个复数分别为 \(a+bi\)\(c+di\),则它们的模长分别为 \(\sqrt{a^2+b^2}\)\(\sqrt{c^2+d^2}\),相乘后的模长为 \(\sqrt{a^2c^2+a^2d^2+b^2c^2+b^2d^2}\)

\((a+bi)(c+di)=ac-bd+(ad+bc)i\) ,其对应点的坐标为 \((ac-bd,ad+bc)\)。其模长为 \(\sqrt{(ac-bd)^2+(ad+bc)^2}\),展开即为 \(\sqrt{a^2c^2+a^2d^2+b^2c^2+b^2d^2}\),证毕。

然后证明幅角相加。

如图,\(B=3+2i,C=1+4i,D=BC=-5+14i\)

\(AD:AB=AC,AC:AE=AC\) 我们通过两点之间距离公式可以证明 \(DC:EB=AC\),即可得到 \(\triangle AEB\backsim\triangle ACD\),进而证明幅角相加。

3.2 单位圆

定义单位圆是平面直角坐标系上一个圆心为原点,半径为 \(1\) 的圆。

求方程 \(x^n=1\) 的所有复数解,不难发现,其所有解都在单位圆上。这些解对应着分别是幅角为 \(0,\dfrac{1}{n},\dfrac{2}{n},\dots,\dfrac{n-1}{n}\) 圆周的点,此时正好对应着 \(0,1,2,\dots,n-1\) 倍圆周。我们将这些点称作单位根,表示为 \(\omega_n^1,\dots,\omega_n^{n-1}\)。由代数基本定理:\(n\) 次方程恰有 \(n\) 个复数根,可知这就是原方程的所有根。

单位根有如下性质:

  1. \(\omega^{2k}_{2n}=\omega^k_n\)

    感性证明:把单位圆等分成 \(2n\) 份取 \(2k\) 份等价于等分成 \(n\) 份取 \(k\) 份。

  2. \(\omega_n^{k+\frac{n}{2}}=-\omega^k_n\)

    感性证明:转动半周即关于原点对称。

4.FFT

\(F(x)=f_0+f_1x+f_2x^2+\dots+f_{n-1}x^{n-1}\),为方便计算,这里使 \(n=2^k\)

我们可以按照奇偶将 \(F(x)\) 分为 \(A(x)\)\(B(x)\),其中,\(A(x)=f_0+f_2x+\dots+f_{n-2}x^{\frac{n}{2}-1}\)\(B(x)=f_1+f_3x+\cdots+f_{n-1}x^{\frac{n}{2}-1}\)

这样,我们有:

\[F(x)=A(x^2)+xB(x^2) \]

\(k<\dfrac{n}{2}\),将 \(\omega^k_n\) 分别代入 \(F(x),A(x),B(x)\),则:

\[\begin{aligned} F(\omega^k_n)&=A((\omega^k_n)^2)+\omega^k_nB((\omega^k_n)^2)\\ &=A(\omega^k_{\frac{n}{2}})+\omega^k_nB(\omega^k_{\frac{n}{2}}) \end{aligned} \]

代入 \(\omega^{k+\frac{n}{2}}_n\),则:

\[\begin{aligned} F(\omega^{k+\frac{n}{2}}_n)&=A((\omega^{k+\frac{n}{2}}_n)^2)+\omega^{k+\frac{n}{2}}_nB((\omega^{k+\frac{n}{2}}_n)^2) \\&=A(\omega^{2k}_n)+\omega^{k+\frac{n}{2}}_nB(\omega^{2k}_n) \\&=A(\omega^k_{\frac{n}{2}})-\omega^k_nB(\omega^k_{\frac{n}{2}}) \end{aligned} \]

我们注意到:两个式子的结果仅存在一个正负号的差异,这就也意味着,我们若知道两个多项式 \(A(x),B(x)\)\(\omega^0_{\frac{n}{2}}\)\(\omega^{\frac{n}{2}-1}_{\frac{n}{2}}\) 处的点值表示,我们就可以以 \(O(n)\) 的时间复杂度求出多项式 \(F(x)\)\(\omega^0_n\)\(\omega^{n-1}_n\) 处的点值表示。这个过程可以不断分治到 \(n=1\) 的情况,再逐层合并即可,这就是 FFT 的思想。

5.IDFT

我们为什么要将单位根代入式子?

\(G_{n}\) 表示多项式 \(F(x)\) 在经过 DFT 后的点值,有:

\[G_k=\sum^{n-1}_{i=0}(\omega^k_n)^if_i \]

我们能够证明:

\[nf_k=\sum^{n-1}_{i=0}(\omega^{-k}_n)^ig_i \]

证明:

\[\begin{aligned} &\sum^{n-1}_{i=0}(\omega^{-k}_n)^ig_i \\&=\sum^{n-1}_{i=0}\sum^{n-1}_{j=0}(\omega^i_n)^j(\omega^{-k}_n)^if_j \\&=\sum^{n-1}_{i=0}\sum^{n-1}_{j=0}(\omega^{i(j-k)}_n)f_j \end{aligned} \]

\(j=k\) 时的贡献是:

\[\sum_{i=0}^{n-1}f_k=nf_k \]

否则,当 \(j\neq k\) 时:

考虑式子 \(\sum^{n-1}_{j=0}(\omega^{i(j-k)}_n)\) 的贡献,由等比数列求和公式,我们有:

\[\sum^{n-1}_{j=0}(\omega^{i(j-k)}_n)=\omega^0_n\dfrac{1-\omega^n_n}{1-\omega^1_n}=0 \]

故原式成立。证毕。

由此,我们只需要将多项式进行 DFT 后的点值代入单位根的相反数再进行一次 DFT,即可得到原多项式。

注:

\[\omega_n^1=(\cos\dfrac{2\pi}{n},\sin\dfrac{2\pi}{n}) \omega_n^{-1}=(\cos\dfrac{2\pi}{n},-\sin\dfrac{2\pi}{n}) \]

由此,我们完成了 FFT 的全部过程。

一个小优化:

计算 \(F(x)G(x)\),朴素的需要进行两次 DFT,一次 IDFT,共三次操作。

设 复数多项式\(P(x)=F(x)+G(x)i\),计算 \(P(x)^2=F(x)^2-G(x)^2+2F(x)G(x)i\)

注意到此时 \(P(x)\) 的虚部恰巧时答案的两倍,这样我们只需要一次 DFT 和一次 IDFT 共两次操作即可完成。

posted @ 2025-04-20 22:41  Rosentツ  阅读(37)  评论(0)    收藏  举报