伯利坎普–梅西(Berlekamp–Massey, BM)算法:为给定序列找到长度最小的线性递推关系(最小多项式/线性反馈移位寄存器 LFSR)。常在模素数域下工作,用于预测后续项与 O(k log n) 求第 n 项。时间复杂度 O(N^2)。

Description: Given the first N terms of a sequence over a field (typically mod prime), finds the shortest linear recurrence. Supports fast n-th term via linear-recurrence exponentiation. Time: O(N^2) to build; O(k log n) per n-th term (k = order) Status: tested

  • 函数/接口(据实现)

    • vector berlekampMassey(const vector& s)
      • 输入序列 s(通常在模 p 下),返回最小递推系数 C(长度 k),使得 s[i] = −Σ_{j=1..k} C[j-1] · s[i−j](按实现约定亦可无负号)。
    • ll linearRecurrence(const vector& C, const vector& init, long long n)
      • 已知递推系数 C 与前 k 项 init,计算第 n 项(0-index)。用多项式“降维幂”/Kitamasa 方法:O(k log n)。
    • 可选:vector minPoly(const vector& s) 与 nth_term(C, init, n)。
  • 核心思路(BM 迭代)

    • 维护当前特征多项式 C(x)、备份多项式 B(x)、当前长度 L、上次更新时刻 m 及当时的误差标量 b。
    • 逐项扫 i=0..N−1,计算“差错” d = s[i] + Σ_{j=1..L} C[j]·s[i−j](在域上)。
    • 若 d==0:仅 m++(当前 C 可解释 s[0..i])。
    • 若 d≠0:构造 T(x)=C(x) − (d/b)·x^m·B(x) 修正 C。
      • 若 2L ≤ i:更新 L ← i+1−L,B ← 旧 C,b ← d,m ← 1。
      • 否则仅设置 C ← T,m++。
    • 最终 C 的长度即最小递推阶 k。
  • n 项快速求值(线性递推快速幂)

    • 将递推写成向量/多项式形式,使用“多项式平方取模特征多项式”或 Kitamasa:
      • 维护向量/系数 f,按二进制指数对转移做快速幂,并每步按 C 做降维(取模)。
      • 复杂度 O(k log n),适合极大 n。
    • 亦可转化为 k×k 伴随矩阵的幂并乘初始向量(矩阵幂 O(k^3 log n);当 k 较大时不如 Kitamasa)。
  • 输出语义

    • berlekampMassey 返回 C(长度 k):
      • 序列满足 s[n] = Σ_{j=1..k} a_j · s[n−j](a_j 与 C 的符号/次序视实现)。
    • linearRecurrence 返回目标下标 n 处的值。
  • 复杂度

    • 构建:BM O(N^2)。
    • 查询:O(k log n)。
  • 使用与注意

    • 域要求:标准 BM 需在域上(常用模素数 p)。若模数合成,需分解到素数模并用 081-数论-中国剩余定理 合并,或采用扩展版本。
    • 归一化:外部应对输入 s[i] 做模归一化到 [0,p)。
    • 边界:序列全 0 时返回空递推(k=0);短序列时 k ≤ N/2。
    • 数值稳定:整域下仅做模运算;需要模逆,见 088-数论-模逆091-数论-模幂
    • 与多项式:结合多项式快速幂/卷积可做“线性递推卷积加速”(见 106-数值算法-线性递推)。

关联节点