多项式和递推
本文共约 9300 字。
Key Words:线性递推,Berlekamp-Massey 算法,整式递推,微分有限(D-finite),微分方程,快速阶乘算法,二维递推(多项式递推),斯特林数,欧拉数,附加因子法,基变换换元
线性递推
线性递推
对于数列
,若存在 使得 则称 为线性递推数列。
求线性递推的单项
数列
给出
多项式取模
维护一个无穷数列
根据递推式,我们知道
从高位到低位执行替换操作,这和大除法非常相似。构造特征多项式
用快速幂计算
复杂度
获得线性递推数列的生成函数
注意到递推式很像卷积。令
记
最终
根据多项式求逆的递推算法,我们知道任意分式
Bostan–Mori 算法
根据前文,我们可以
分子分母同乘
记
递归会进行
- 例题 6.4.1. Luogu6296 轮换式 加强版
Berlekamp-Massey 算法
- 给出
项数列 ,求 的最短线性递推式。
记
BM 算法的思路是增量法,假设我们已经求出
若幸运地,
假设递推式上一次变长是
(事实上,利用任意一次“失配”即可得到正确的构造,使用“上一次变长”的位置,是为了保证递推式最短)
具体实现时,计算是否失配,只需
边界:找出
- 定理 BM 算法求出的递推式为最短递推式。
证明略。
实际应用中,往往已知无穷数列
- 定理 若无限数列
是 阶线性递推,取 的前 项求出最短递推式,即为 的递推式。
证明:反证法,假设存在两种不同的不超过
两侧同乘
故至多只存在一种符合要求的不超过
线性递推的性质
- 线性递推的封闭性
- 线性递推数列的线性组合是线性递推数列。
- 线性递推数列的加法卷积是线性递推数列。
- 线性递推数列的点积是线性递推数列。
证明:性质一、二:线性递推等价于分式
性质三:根据特征根法,线性递推数列可以表示为若干等比数列(公比是特征根)的线性组合(反之也成立)。对于线性递推数列
- 例题 6.4.2. CF717A Festival Organization
矩阵幂的线性递推
为 阶方阵,则矩阵列 存在不超过 阶的线性递推式。
证明:记
- 例题 6.4.3. Luogu7820 [RC-05] 01 序列
整式递推与 D-finite
基本概念
整式递推
对于无穷数列
,若存在不超过 次的多项式 使得 则称 为整式递推数列。
不难发现,线性递推是整式递推的一种特例。
最简单的整式递推是阶乘
不加证明地给出如下性质。
微分有限(D-finite)
若存在不超过
次的多项式 ,使得如下微分方程(ODE) 恒成立,则称 微分有限。
- 定理 数列
为整式递推,当且仅当 的生成函数 微分有限。
证明:若
反之,在下降幂基
例如:
整式递推的性质
首先我们要判断一个数列是否拥有整式递推,这相当于研究生成函数的 D-finite 性质。
代数形式幂级数
若形式幂级数
是某个多项式方程 的解,其中
是整式,则称 是“代数的”。
易知用(有限次)加减乘除和
不加证明的给出如下性质:
- D-finite 的性质
- 如果
是代数的,那么它微分有限。 - 如果
微分有限,则 微分有限。 - 如果
微分有限, 是代数的,则 微分有限。(注意,不保证 微分有限)
- 如果
- 整式递推的封闭性
- 整式递推数列的线性组合是整式递推数列。
- 整式递推数列的加法卷积是整式递推数列。
- 整式递推数列的点积是整式递推数列。
根据这些性质,我们可以推定一大类函数的 D-finite 性质,如:易知
- 例题 6.4.4. Luogu4931 情侣?给我烧了!(加强版)
待定系数法
对于常见的生成函数,预知 D-finite 性质是较为容易的,但它们所满足的微分方程可能非常复杂,难以手工计算。这时,可以用待定系数法(高斯消元)得到整式递推式。
设定最大阶数
注意,得到的递推式可能不唯一。在解线性方程组的过程中,若遇到自由变量,选择一个赋值为
例如,计算可知
常用微分方程(ODE)
超几何数列
- 若数列
满足相邻两项之比 是 的有理分式,则称 是超几何数列。
以超几何数列为系数的生成函数称作超几何级数。根据定义易知:超几何数列属于整式递推数列的一种,超几何级数微分有限,而且微分方程容易推导。
通过微分方程,可以解出部分超几何函数的封闭形式。如
以下是一些常见超几何级数的微分方程。
微分方程的复合
若
如“部分 exp”:设
已知
此外,若
当微分方程不齐次(带有尾项时),计算可能较为繁琐。此时可以进行如下简化:
若
- 例题 6.4.5. Luogu5401 [CTS2019] 珍珠(算法二)
求整式递推的单项
在前文中,我们通过
快速阶乘算法
先来看最简单的整式递推数列
- 多点求值法
构造多项式
具体地,取
复杂度
- 维护点值法
上一个算法复杂度瓶颈在于
定义
先确定块长
操作一:令
加一,求出 。, 操作二:令
乘二,求出 。,
若能实现这两个操作,可以
下面介绍具体解决方案。
操作一:
,前 项递推,多出的末项 暴力计算。复杂度 。操作二:首先使用“Luogu5667 拉格朗日插值2”平移点值,计算出
,然后有 。复杂度 。
倍增复杂度递推式
一般情形
现在我们尝试处理一般的整式递推,可以将计算阶乘的两种算法简单地类比过来。
数列
- 多点求值法
模仿线性递推的矩阵优化,将
具体地,根据
构造
求出乘积
分母上的
于是,
仍然考虑分块,设块长为
用多项式平移(复合
多点求值的复杂度是
取
- 维护点值法
方法类似,记
操作一(令
加一): ,前 项递推,多出的 个末项 暴力计算。复杂度 。操作二(令
乘二):首先使用“Luogu5667 拉格朗日插值2”平移点值,计算出 ,然后有 。复杂度 。
可以倍增求出
总复杂度
实践中,
二维递推
常系数二维递推
组合数
组合数可以视作(最简单的)二维递推产生的数。我们抛弃其组合意义,只从递推式出发,看看能得到什么结果。
记
边界
写出二元生成函数
简单递推一例
- 例题 6.4.6. Luogu7342 『MdOI R4』Destiny
系数与行有关的二维递推
例题 6.4.7.
多项式数列
满足如下递推式边界为
,求 。
Solution:
(法一)转移可以写作
(法二)为了消除递推式中不对齐的
对于以上两例,我们将二维递推的一行
其中,常系数二维递推对应
系数与列有关的二维递推
若递推式系数和列有关,多项式数列不能被写成简单的整式递推,需要引入微分。
两类斯特林数是很好的例子。由于它们背后的组合意义较为简洁,解析组合方法收效良好。但是,并非所有递推式都有好的(或显然的)组合背景,下面是一个略有变易的例子。
例题 6.4.8. 带符号第二类斯特林数
二维数阵
满足如下递推关系 给出 ,对 ,求出 。
Solution:有三种方法处理这个递推式。方法一通过翻转避开了难点,但复杂度较劣;方法二通过解析组合轻松解决,但需要一定的观察能力;方法三是纯代数手段,但需要求解偏微分方程。
- 方法一:转化为多项式整式递推
注意到
记行的生成函数
- 方法二:考虑递推式的组合意义,解析组合
以
- 方法三:直接解偏微分方程
记
由
一类常见的微分递推
更一般地,考虑如下模型:
多项式序列
首先运用附加因子法简化递推式。
将递推式改写为一阶线性常微分方程的标准形式
这启示我们构造
接下来,解决关于这个递推式的两类任务。
- 任务一:求
只需求
如果
如果
考虑递推式
或者利用递推式
例如如下递推式
- 任务二:对
求出
(同【例题
6.4.8】方法一)可以将系数行列翻转,从而将列相关(微分)转化为行相关,进而用分治
FFT 解决。(如果
若需要更优的复杂度,建立二元生成函数
对比
例如如下递推式
如果
系数和行列均有关的二维递推
- 例题 6.4.9. Loj#6703 小 Q 的序列
欧拉数
从递推式入手求一行欧拉数。
记
计算附加因子
由