核心概述

线性递推快速求项:在给定阶数 k 的线性递推与初始值下,使用 Kitamasa 或“多项式模特征多项式”的快速幂,在 O(k^2 log n) 或 O(k log k log n) 时间内返回第 n 项。

原文引述

Description: Compute n-th term of linear recurrence of order k using Kitamasa or polynomial exponentiation modulo characteristic polynomial. Works over any field (e.g. mod prime). O(k^2 log n) simple, O(k log k log n) with NTT. Time: O(k^2 log n) naive; O(k log k log n) with FFT/NTT Status: tested ——摘自本节点现有英文注释

展开阐述

  • 定义与问题形式

    • 递推:a_n = Σ_{i=1..k} c_i·a_{n−i}(常见为常系数线性递推)。
    • 初始:a_0, a_1, …, a_{k−1}。
    • 目标:对大 n(可至 10^{18} 量级)求 a_n。
  • Kitamasa 算法(O(k^2 log n))

    1. 设特征多项式 C(x) = x^k − Σ_{i=1..k} c_i·x^{k−i}。
    2. 返回系数 d[0..k−1] 使 a_n = Σ d[i]·a_i(n<k 为基例)。
    3. 分治 n:先解 d1 表示 a_{⌊n/2⌋},再做 d2 = d1 与自身的卷积;若 n 为奇,加一次由递推系数定义的“进一”算子。
    4. 每次卷积后按 C(x) 做多项式取模降到次数 < k。
    5. 输出 a_n = Σ d[i]·a_i。
  • 多项式快速幂法(等价表述)

    1. 计算 X^n mod C(x) 得 Q(x)=Σ_{i=0..k−1} q_i x^i。
    2. a_n = Σ q_i·a_i。
    • 乘法复杂度:朴素 O(k^2),若域支持快速卷积可用 FFT/NTT 达到 O(k log k);整体乘法次数 O(log n)。
  • 接口/数据与输入输出(据仓库约定)

    • solveLinearRecurrence(c[1..k], a[0..k−1], n) → a_n(必要时在模 p 下返回 a_n mod p)。
    • 多项式法需要“多项式乘/模”的实现;Kitamasa 需要“系数卷积 + 按 C(x) 降阶”。
  • 数值稳定性/精度与实现要点

  • 复杂度与边界条件、常见变体/扩展

    • Kitamasa:O(k^2 log n)。
    • 多项式法:朴素 O(k^2 log n);NTT 版 O(k log k log n)。
    • 变体:先用 096-数值算法-伯利坎普梅西 从前若干项求最短递推,再用本模板求第 n 项。
  • 正确性要点与不变式

    • 任何时刻表示向量/多项式均等价于“用初始项线性组合得到 a_t”的不变式;按 C(x) 模降保证次数不超过 k−1。

关联节点