目录

Reeds-Sloane 算法

算法介绍

Reeds-Sloane 算法是 BM 算法的拓展,可以处理模任意正整数的递推式。

设环 $\mathbb{Z}/m\mathbb{Z}$ 上有一数列 $s_{0},s_{1},\cdots,s_{n-1}$,我们想要找到一个尽可能短的数列 $a_{0}=1,a_{1},\cdots,a_{l}$,使得 $\sum_{i=0}^{l}a_{i}s_{j-i}=0$ 对 $j=l,l+1,\cdots,n-1$ 成立。

不妨用多项式的语言来简单地定义一下递推式的长度:设 $a(x)=\sum_{i=0}^{l}a_{i}x^{i}$,$S(x)=\sum_{i=0}^{n-1}s_{i}x^{i}$,$a(x)S(x)\equiv b(x)\pmod{x^{n}}$,定义二元组 $A=(a(x),b(x))$,其长度 $L(A)=\max\{\deg(a(x)),\deg(b(x))+1\}$。当 $\deg(a(x))\le\deg(b(x))$ 时可能有些不好理解,这里可以当做是 $a$ 后面补充了一些 $0$,以跳过开始若干不满足递推式的项。

中国剩余定理

设 $m=\prod p_{i}^{e_{i}}$,假设我们能够对每个 $p_{i}^{e_{i}}$ 求出递推式,那么对递推式的每一项做 crt 即可得到模 $m$ 意义下的一个递推式,且显然长度不变。当然也容易证明不存在比这长度更短的递推式,否则对于递推式最长的那个质因子会产生矛盾。因此我们将问题归约到了模质数的幂。下面设模数为 $p^{e}$。

算法介绍

Reeds-Sloane 算法事实上解决了一个更加 general 的问题,即对每个 $\eta=0,1,\cdots,e-1$ 求出 $a(0)=p^{\eta}$ 时的最短递推式。算法的基本流程是对 $s$ 的每个前缀依次处理。

首先定义几个记号,$a_{\eta}^{(k)}(x)$ 表示 $a(0)=p^{\eta}$ 时,$s_{0},\cdots,s_{k}$ 的递推式,$b_{\eta}^{(k)}(x)$ 是右边的余数,$A_{\eta}^{(k)}=(a_{\eta}^{(k)}(x),b_{\eta}^{(k)}(x))$。将 $\mathbb{Z}/p^{e}\mathbb{Z}$ 简记为 $R$,设 $R$ 中可逆的元素为 $R^{*}$。

引理 1

设 $\mathscr{E}_{\eta}^{(k)}$ 表示所有满足 $a(x)S(x)\equiv b(x)\pmod{x^{k}}$,$a(0)=p^{\eta}$ 的二元组 $(a(x),b(x))$,$\mathscr{B}_{\eta}^{(k)}$ 表示所有满足 $a(x)S(x)\equiv b(x)+\theta p^{\eta}x^{k}\pmod{x^{k+1}}$ 的二元组 $(a(x),b(x))$,其中 $\theta\in R^{*}$。

设 $(a(x),b(x))\in\mathscr{E}_{\eta}^{(k)}$,$(c(x),d(x))\in\mathscr{B}_{u}^{(k-1)}$,且 $\eta+u<e$,那么 $L(a(x),b(x))+L(c(x),d(x))\ge k$。

证明:

$$ \begin{aligned} a(x)S(x)&\equiv b(x)\pmod{x^{k}}\\ c(x)S(x)&\equiv d(x)+\theta p^{u}x^{k-1}\pmod{x^{k}}\\ c(x)a(x)S(x)&\equiv a(x)d(x)+\theta p^{u}x^{k-1}a(x)\pmod{x^{k}}\\ c(x)b(x)-a(x)d(x)&\equiv\theta p^{u}x^{k-1}a(x)\pmod{x^{k}} \end{aligned} $$

注意到等号右侧的最低次项是 $x^{k-1}$,系数为 $\theta p^{\eta+u}\not\equiv0$,因此 $$ \begin{aligned} \deg(c(x)b(x)-a(x)d(x))&\ge k-1\\ \max\{\deg(c(x)b(x)),\deg(a(x)d(x))\}&\ge k-1\\ \max\{\deg(c(x))+\deg(b(x))+1,\deg(a(x))+\deg(d(x))+1\}&\ge k\\ \max\{\deg(a(x)),\deg(b(x))+1\}+\max\{\deg(c(x)),\deg(d(x))+1\}&\ge k\\ L(a(x),b(x))+L(c(x),d(x))&\ge k\Box \end{aligned} $$

初始化

令 $a_{\eta}^{(0)}(x)=p^{\eta}$,$b_{\eta}^{(0)}=0$,$a_{\eta}^{(1)}(x)=p^{\eta}$,$b_{\eta}^{(1)}=p^{\eta}S_{0}$,$L(A_{\eta}^{(0)})=0$。定义 $S_{0}=\delta p^{\varepsilon}$,其中 $\delta\in R^{*}$,若 $\eta+\varepsilon<e$,$L(A_\eta^{(1)})=1$;否则 $L(A_\eta^{(1)})=0$。这两处的 $L$ 显然是最小的。

另外我们定义 $\theta_{\eta k}$ 和 $u_{\eta k}$,满足 $S(x)a_{\eta}^{(k)}(x)\equiv b_{\eta}^{(k)}(x)+\theta_{\eta k}p^{u_{\eta k}}x^{k}\pmod{x^{k+1}}$,其中 $\theta_{\eta k}\in R^{*}$,$0\le u_{\eta k}\le e$。例如在初始化中,若 $\eta+\varepsilon<e$,那么可以令 $\theta_{\eta0}=\delta$,$u_{\eta0}=\eta+\varepsilon$;否则可以令 $\theta_{\eta0}=1$,$u_{\eta0}=e$。

递推计算

考虑对每个 $\eta$,计算 $k$ 变化到 $k+1$ 时的答案。我们归纳地证明 $L(A_{\eta}^{(k)})$ 是最小的,以及 $L(A_{\eta}^{(k)})<L(A_{\eta}^{(k+1)})$ 时,存在一个 $0\le g<e$,使得$\eta+u_{gk}<e$,并且 $L(A_{\eta}^{(k+1)})=k+1-L(A_{g}^{(k)})$。

附注

两个实现时的数值分析与 BM 算法类似,从而有:对于一个由 $k$ 阶矩阵转移而来的数列,至多需要 $2k$ 项即可由 RS 算法计算出递推式。

例题

暂时没有见到如此丧心病狂的出题人,不过应用场景与 BM 算法类似,可参考 BM 算法的例题。

参考文献

[1] Reeds J A, Sloane N J A. Shift register synthesis (modulo m)[J]. SIAM Journal on Computing, 1985, 14(3): 505-513.