线性递推数列
求数列最小线性递推式
设有数列 a0⋯ana_0 \cdots a_na0⋯an,rir_iri 为数列 a0⋯ai{a_0 \cdots a_i}a0⋯ai 的最小线性递推式,lil_ili 为 rir_iri 的阶数。显然有 li−1⩽lil_{i-1} \leqslant l_ili−1⩽li。设 did_idi 为真实 aia_iai 与用 ri−1r_{i-1}ri−1 计算出的 aia_iai 的差。若 di=0d_i=0di=0 则 ri=ri−1r_i=r_{i-1}ri=ri−1,否则 li>li−1l_i>l_{i-1}li>li−1。设 ppp 为上次递推式增长的位置,则令 rir_iri 为 ri−1r_{i-1}ri−1 在所有的 j⩾i−pj \geqslant i-pj⩾i−p 下标上进去 didprp−1,j−i+p\frac{d_i}{d_p}r_{p-1,j-i+p}dpdirp−1,j−i+p 即可。正确性可以被验证。
时间复杂度 O(n2)O(n^2)O(n2),空间复杂度 O(n)O(n)O(n)
此为BerlekampMassey(BM)算法的执行过程。
BM算法应用
求向量列、矩阵列最小线性递推式
以长度为 nnn 的行向量为例,在模 PPP 意义下,对每一项乘以一随机列向量,再对数列求最小线性递推式。根据SchwartzZippel引理,正确的概率至少为 P−nP\frac{P-n}PPP−n。列向量同理。对于大小为 n×mn \times mn×m 的矩阵,先乘以一长度为 mmm 的随机列向量,转化成为向量列即可。
求矩阵最小多项式
对于方阵 MMM,其最小多项式即为矩阵列 I,M,M2⋯I,M,M^2 \cdotsI,M,M2⋯ 的最短线性递推式,直接求解即可。
时间复杂度 O(n3)O(n^3)O(n3),空间复杂度 O(n2)O(n^2)O(n2)
当矩阵较为稀疏时,计算向量与矩阵乘法时可以更快。若矩阵中有 eee 个非000位置,则时间复杂度可降为 O(n(n+e))O(n(n+e))O(n(n+e))。
解稀疏线性方程组
已知一长度为 nnn 的行向量 bbb,大小为 n×nn \times nn×n 的满轶矩阵 AAA,求一行向量 xxx 使得 xA=bxA=bxA=b,即 x=bA−1x=bA^{-1}x=bA−1。设 b,bA,bA2⋯b,bA,bA^2 \cdotsb,bA,bA2⋯ 的最短线性递推式为 r0⋯rmr_0 \cdots r_mr0⋯rm,有 ∑i=0mAibrm−i=0\sum_{i=0}^m A^ibr_{m-i}=0∑i=0mAibrm−i=0,移项得 A−1b=−1rm∑i=0m−1Aibrm−1−iA^{-1}b=-\frac{1}{r_m}\sum_{i=0}^{m-1}A^ibr_{m-1-i}A−1b=−rm1∑i=0m−1Aibrm−1−i。若矩阵中有 eee 个非零位置,则时间复杂度为 O(n(n+e))O(n(n+e))O(n(n+e)),空间复杂度为 O(n2)O(n^2)O(n2)
求稀疏矩阵行列式
已知一大小为 n×nn \times nn×n 的满轶矩阵 AAA,求 det(A)\det(A)det(A) 模 PPP 的值。令对角矩阵 BBB 和 AAA 有相同的大小,对角线上每个数为随机值,则有至少 1−2n2−nP1-\frac{2n^2-n}{P}1−P2n2−n 的概率满足矩阵 ABABAB 的最小多项式就是其特征多项式。对于任意的 n×nn \times nn×n 的矩阵,其特征多项式的常数项为其行列式的值乘以 (−1)n(-1)^n(−1)n,求出 det(AB)\det(AB)det(AB) 后,我们有 det(A)=det(AB)det(B)\det(A)=\frac{\det(AB)}{\det(B)}det(A)=det(B)det(AB)。若 AAA 中有 eee 个非零位置,则时间复杂度为 (n(n+e))(n(n+e))(n(n+e))
整式递推数列
定义
若数列 aaa 与多项式列 B0⋯BmB_0 \cdots B_mB0⋯Bm 满足对于任意的 i⩾mi \geqslant mi⩾m 都有 ∑j=0mai−jBj(i)=0\sum_{j=0}^m a_{i-j}B_j(i)=0∑j=0mai−jBj(i)=0,则 BBB 为数列 aaa 的整式递推式。
求整式递推式
设现已知 a0⋯ana_0 \cdots a_na0⋯an,BBB 的阶数为 mmm,BiB_iBi 的最大可能次数为 sss。设 Ci(x)=Bi(x+m)C_i(x)=B_i(x+m)Ci(x)=Bi(x+m),则可以根据定义将 CCC 中每一项的每个系数列方程组,求出 CCC。在解方程时对遇到第一个自由元可直接赋非000值。最后还原出 BBB。
时间复杂度 O(n2ms)O(n^2ms)O(n2ms),空间复杂度 O(nms)O(nms)O(nms)
这里 nnn 必须满足 n⩾(s+2)(m+1)n \geqslant (s+2)(m+1)n⩾(s+2)(m+1),且 nnn 越大正确的概率越大。
3528



被折叠的 条评论
为什么被折叠?



