1.1 1.1 1.1 定义:对于无限数列 { a 0 , a 1 , a 2 , . . . } \{a_0,a_1,a_2,...\} {a0,a1,a2,...}和有限非空数列 { r 0 , r 1 , r 2 , . . . , r m − 1 } \{r_0,r_1,r_2,...,r_{m-1}\} {r0,r1,r2,...,rm−1},若对于任意 p ≥ m − 1 p\ge m-1 p≥m−1,有 ∑ k = 0 m − 1 a p − k r k = 0 \sum_{k=0}^{m-1}a_{p-k}r_k=0 ∑k=0m−1ap−krk=0, r 0 = 1 r_0=1 r0=1,我们称数列 r r r为数列 a a a的线性递推式。我们称存在线性递推式的无线序列为线性递推数列。 r 0 = 1 r_0=1 r0=1说明 a p = − ( a p − 1 r 1 + . . . + a p − m + 1 r m − 1 ) a_p=-(a_{p-1}r_1+...+a_{p-m+1}r_{m-1}) ap=−(ap−1r1+...+ap−m+1rm−1),就是所谓的递推式。
1.2 1.2 1.2对于无限数列 { a 0 , a 1 , a 2 , . . . } \{a_0,a_1,a_2,...\} {a0,a1,a2,...}和有限非空序列 { r 0 , r 1 , r 2 , . . . , r m − 1 } \{r_0,r_1,r_2,...,r_{m-1}\} {r0,r1,r2,...,rm−1},设数列 a a a和数列 r r r所对应的生成函数为 A A A和 R R R,数列 r r r为数列 a a a的线性递推式等价于存在次数不超过 m − 2 m-2 m−2的多项式 S S S满足 A R + S = 0 AR+S=0 AR+S=0。对于有限数列 { a 0 , a 1 , a 2 , . . . , a n − 1 } \{a_0,a_1,a_2,...,a_{n-1}\} {a0,a1,a2,...,an−1},则为 A R + S = 0 ( m o d x n ) AR+S=0\pmod{x^n} AR+S=0(modxn)。
1.3 1.3 1.3 Berlekamp-Massey 算法,先考虑有限的情形。该算法找一个阶数最小的 R R R,使得 A R = S ( m o d x n ) AR=S\pmod{x^n} AR=S(modxn),且 S S S的阶数小于 R R R的阶数。具体做法是对于 i = 2 , 3 , . . . , n i=2,3,...,n i=2,3,...,n,在 m o d x i \mod{x^i} modxi的意义下递推求出 R i R_i Ri和 S i S_i Si。
假设已经知道 m o d x i − 1 \bmod\ {x^{i-1}} mod xi−1 的答案是 R i R_i Ri,那么求 m o d x i \bmod\ {x^i} mod xi 的答案 R i R_i Ri。
1.3.1 1.3.1 1.3.1 先检验一下是否有 A R i − 1 = S i − 1 ( m o d x i ) AR_{i-1}=S_{i-1}\pmod{x^i} ARi−1=Si−1(modxi),如果是,那么 R i = R i − 1 R_i=R_{i-1} Ri=Ri−1
1.3.2 1.3.2 1.3.2 如果不是,那么有 A R i − 1 − S i − 1 = d x i − 1 ( m o d x i ) ( 1 ) AR_{i-1}-S_{i-1}=dx^{i-1}\pmod{x^i}(1) ARi−1−Si−1=dxi−1(modxi)(1)。考虑上次是再 p ( p < i ) p(pp(p<i)增长的递推式,当时有 A R p − 1 − S p − 1 = c x p − 1 ( m o d x p ) ( 2 ) AR_{p-1}-S_{p-1}=cx^{p-1}\pmod{x^p}(2) ARp−1−Sp−1=cxp−1(modxp)(2)。
( 2 ) (2) (2) 同时乘 x i − p d c − 1 x^{i-p}dc^{-1} xi−pdc−1,有 x i − p d c − 1 ( A R p − 1 − S p − 1 ) = d x i − 1 ( m o d x i ) ( 3 ) x^{i-p}dc^{-1}(AR_{p-1}-S_{p-1})=dx^{i-1}\pmod{x^i}(3) xi−pdc−1(ARp−1−Sp−1)=dxi−1(modxi)(3)
( 1 ) − ( 3 ) : A ( R i − 1 − x i − p d c − 1 R p − 1 ) = S i − 1 − x i − p d c − 1 S p − 1 ( m o d x i ) (1)-(3):A(R_{i-1}-x^{i-p}dc^{-1}R_{p-1})=S_{i-1}-x^{i-p}dc^{-1}S_{p-1}\pmod{x^i} (1)−(3):A(Ri−1−xi−pdc−1Rp−1)=Si−1−xi−pdc−1Sp−1(modxi)
令 R i = R i − 1 − x i − p d c − 1 R p − 1 R_i=R_{i-1}-x^{i-p}dc^{-1}R_{p-1} Ri=Ri−1−xi−pdc−1Rp−1, S i = S i − 1 − x i − p d c − 1 S p − 1 S_i=S_{i-1}-x^{i-p}dc^{-1}S_{p-1} Si=Si−1−xi−pdc−1Sp−1即可。
初始 R 0 = 1 , S 0 = 0 R_0=1,S_0=0 R0=1,S0=0,如果 A 0 A_0 A0到 A i − 2 A_{i-2} Ai−2都是 0 0 0,而 A i − 1 A_{i-1} Ai−1不为零,此时修改递推式,让 R i = 1 + x i R_{i}=1+x^i Ri=1+xi, S i = A i − 1 x i − 1 S_i=A_{i-1}x^{i-1} Si=Ai−1xi−1即可。
其最短性不再赘述。由于初值和递推过程中, S i S_i Si次数小于 R i R_i Ri次数,所以最后得到的结果中, S S S的次数也是小于 R R R的次数的。复杂度 O ( n 2 ) O(n^2) O(n2)。
对于无限长的数列 { a 0 , a 1 , a 2 , . . . } \{a_0,a_1,a_2,...\} {a0,a1,a2,...},若它的最短线性递推式阶数不超过 s s s,那么 { a 0 , a 1 , a 2 , . . . , a s + s − 1 } \{a_0,a_1,a_2,...,a_{s+s-1}\} {a0,a1,a2,...,as+s−1}的最短线性递推式即为 a a a的最短线性递推式。
1.4 1.4 1.4 设已知 a i + 1 = − ( a i − n + 1 b n + a i − n + 2 b n − 1 + . . . + a i b 1 ) a_{i+1}=-(a_{i-n+1}b_n+a_{i-n+2}b_{n-1}+...+a_ib_1) ai+1=−(ai−n+1bn+ai−n+2bn−1+...+aib1),且已知 a 1 ∼ n a_{1\sim n} a1∼n, b 1 ∼ n b_{1\sim n} b1∼n,求 a k a_k ak的值。
我们知道 A R = S AR=S AR=S,所以 A = S R A=\frac{S}{R} A=RS。
问题转化为,求 P ( x ) Q ( x ) \frac{P(x)}{Q(x)} Q(x)P(x)的第 n n n项。因为 F ( x ) = P ( x ) Q ( − x ) Q ( x ) Q ( − x ) F(x)=\frac{P(x)Q(-x)}{Q(x)Q(-x)} F(x)=Q(x)Q(−x)P(x)Q(−x),所以 Q ( x ) Q ( − x ) Q(x)Q(-x) Q(x)Q(−x)只有偶数项不为 0 0 0,设 P ( x ) Q ( − x ) = E ( x 2 ) + x O ( x 2 ) P(x)Q(-x)=E(x^2)+xO(x^2) P(x)Q(−x)=E(x2)+xO(x2), V ( x ) = Q ( x ) Q ( − x ) V(x)=Q(x)Q(-x) V(x)=Q(x)Q(−x),所以得到分解 P ( x ) Q ( x ) = E ( x 2 ) V ( x 2 ) + x O ( x 2 ) V ( x 2 ) \frac{P(x)}{Q(x)}=\frac{E(x^2)}{V(x^2)}+x\frac{O(x^2)}{V(x^2)} Q(x)P(x)=V(x2)E(x2)+xV(x2)O(x2),只需按 n n n的奇偶性递归到一侧即可。递归到常数项时答案就是分子分母常数项相除。
复杂度 O ( n log n log k ) O(n\log n\log k) O(nlognlogk)。
1.5 1.5 1.5 求向量/矩阵的最短递推式
考虑将向量/矩阵转化为标量序列的最短线性递推式。具体做法是随机一个向量 v v v与每个向量相乘,矩阵的情况也类似。
1.6 1.6 1.6 求矩阵的最小多项式
相当于求矩阵 { I , M , M 2 , . . . } \{I,M,M^2,...\} {I,M,M2,...}的线性递推式,我们知道 M M M的最小多项式阶数 ≤ n \le n ≤n(特征多项式),所以只需对矩阵 { I , M , M 2 , . . . , M 2 n } \{I,M,M^2,...,M^{2n}\} {I,M,M2,...,M2n}应用 B M BM BM算法即可。
1.7 1.7 1.7 求矩阵的特殊多项式
由于特征多项式是一个 n n n阶多项式,所以可以带入 n + 1 n+1 n+1个值进去,求 n n n个行列式的值,然后插值。复杂度 O ( n 4 ) O(n^4) O(n4)。