已知数列{a0,a1,⋯ ,an−1}\{a_0,a_1,\cdots,a_{n-1}\}{a0,a1,⋯,an−1},求其最短线性递推式。即求数列{r0,r1,⋯ ,rm−1}\{r_0,r_1,\cdots,r_{m-1}\}{r0,r1,⋯,rm−1}满足∀i∈[m,n),ai=∑j=1mrj−1ai−j\forall i\in[m,n),a_i=\sum_{j=1}^mr_{j-1}a_{i-j}∀i∈[m,n),ai=∑j=1mrj−1ai−j。
考虑不停地修改答案递推式。设RpR_pRp表示得到的第ppp个递推式,最开始的递推式为空,即R0={}R_0=\{\}R0={}。记did_idi为由当前递推式算出的aia_iai与aia_iai的差。如果di=0d_i=0di=0那么说明递推式到iii都是对的,否则记fpf_pfp表示RpR_pRp的错误位置。考虑如何修改当前的RRR。设新的递推式为Rp+1R_{p+1}Rp+1,事实上,我们把RpR_pRp加上R′R'R′即可,其中R′R'R′是i−fp−1−1i-f_{p-1}-1i−fp−1−1个000拼上MMM拼上Rp−1R_{p-1}Rp−1的−M-M−M倍,其中M=didfp−1M=\frac{d_i}{d_{f_{p-1}}}M=dfp−1di。每次最多修改nnn项,最多修改nnn次,复杂度为O(n2)O(n^2)O(n2)。
举例说明:
先填上开头。
a | 1 | 2 | 4 | 7 | 14 | 24 | |
---|---|---|---|---|---|---|---|
d | N/A | -1 | |||||
R | {} | {0} |
计算d1=0×a0−a1=−2d_1=0\times a_0-a_1=-2d1=0×a0−a1=−2,不符合。计算R′R'R′是000个000(现在的位置-上次不符合位置+1)拼上MMM拼上{}\{\}{}的−M-M−M倍,M=−2−1M=\frac{-2}{-1}M=−1−2,算得{2}\{2\}{2}。于是R={0}+R′={2}R=\{0\}+R'=\{2\}R={0}+R′={2}。
a | 1 | 2 | 4 | 7 | 14 | 24 | |
---|---|---|---|---|---|---|---|
d | N/A | -1 | -2 | ||||
R | {} | {0} | {2} |
计算d2=2×2−4=0d_2=2\times 2-4=0d2=2×2−4=0符合。
a | 1 | 2 | 4 | 7 | 14 | 24 | |
---|---|---|---|---|---|---|---|
d | N/A | -1 | -2 | 0 | |||
R | {} | {0} | {2} |
计算d3=1d_3=1d3=1不符合,R′R'R′是111个000拼上MMM拼上{0}\{0\}{0}的−M-M−M倍,M=1−2M=\frac{1}{-2}M=−21。
a | 1 | 2 | 4 | 7 | 14 | 24 | |
---|---|---|---|---|---|---|---|
d | N/A | -1 | -2 | 0 | 1 | ||
R | {} | {0} | {2} | {2,-0.5,0} |
注意这里的RRR只对777适用,因为它的长度有333。
之后的请自行计算,不再展示过程。
a | 1 | 2 | 4 | 7 | 14 | 24 | |
---|---|---|---|---|---|---|---|
d | N/A | -1 | -2 | 0 | 1 | -2 | 0.5 |
R | {} | {0} | {2} | {2,-0.5,0} | {0,3.5,0} | {-0.25,4,-0.125,0} |
4.26