矩阵快速幂的系数矩阵

参考博客1

问题: 对于 f i = A ⋅ f i − 1 + B ⋅ f i − 2 + C , ( i ≥ 3 ) f_i=A\cdot f_{i-1}+B\cdot f_{i-2}+C,(i\geq3) fi=Afi1+Bfi2+C,(i3),已知 f 1 , f 2 f_1,f_2 f1,f2,求解 f n ( n ≤ 1 0 18 ) f_n(n\leq10^{18}) fn(n1018),由于结果可能过大,答案对 1 0 9 + 7 10^9+7 109+7取模
显然这个问题没法在 O ( n ) O(n) O(n)复杂度内解决,所以我们另寻他法。

系数矩阵及推导:
我们从最熟悉的 F i b o n a c c i Fibonacci Fibonacci入手
f 1 = 1 , f 2 = 1 , f i = f i − 1 + f i − 2 , ( i ≥ 3 ) f_1=1,f_2=1,f_i=f_{i-1}+f_{i-2},(i\geq3) f1=1,f2=1,fi=fi1+fi2,(i3)
F i b o n a c c i Fibonacci Fibonacci通式写成上面式子的模样,得到 f i = 1 ⋅ f i − 1 + 1 ⋅ f i − 2 f_i=1 \cdot f_{i-1}+1\cdot f_{i-2} fi=1fi1+1fi2
初始矩阵为:
[ f i − 1 f i − 2 ] \left[ \begin{matrix} f_{i-1} \\ f_{i-2} \end{matrix} \right] [fi1fi2]
想要通过初始矩阵得到结果矩阵:
[ f i f i − 1 ] \left[ \begin{matrix} f_{i} \\ f_{i-1} \end{matrix} \right] [fifi1]
那么初始矩阵必然左乘一个 2 × 2 2\times 2 2×2的系数矩阵:
[ k 1   k 2 k 3   k 4 ] \left[ \begin{matrix} k_1 \ k_2 \\ k_3 \ k_4 \end{matrix} \right] [k1 k2k3 k4]
这样得到的矩阵为:

[ k 1   k 2 k 3   k 4 ] [ f i − 1 f i − 2 ] = [ k 1 f i − 1 + k 2 f i − 2 k 3 f i − 1 + k 4 f i − 2 ] \left[ \begin{matrix} k_1 \ k_2 \\ k_3 \ k_4 \end{matrix} \right] \left[ \begin{matrix} f_{i-1} \\ f_{i-2} \end{matrix} \right]= \left[ \begin{matrix} k_1f_{i-1}+k_2f_{i-2} \\ k_3f_{i-1}+k4f_{i-2} \end{matrix} \right] [k1 k2k3 k4][fi1fi2]=[k1fi1+k2fi2k3fi1+k4fi2]
由我们写成标准形式的 F i b o n a c c i Fibonacci Fibonacci式得到:
k 1 = 1 , k 2 = 1 k_1=1,k_2=1 k1=1,k2=1
k 3 f i − 1 + k 4 f i − 1 = f i − 2 k_3f_{i-1}+k4f_{i-1} =f_{i-2} k3fi1+k4fi1=fi2,故 k 3 = 1 , k 4 = 0 k_3=1,k_4=0 k3=1,k4=0
F i b o n a c c i Fibonacci Fibonacci通项的系数矩阵即:
[ 1     1 1     0 ] \left[ \begin{matrix} 1 \ \ \ 1 \\ 1 \ \ \ 0 \end{matrix} \right] [1   11   0]


回到我们的问题所给通项: f i = A ⋅ f i − 1 + B ⋅ f i − 2 + C , ( i ≥ 3 ) f_i=A\cdot f_{i-1}+B\cdot f_{i-2}+C,(i\geq3) fi=Afi1+Bfi2+C,(i3)
初始矩阵:
[ f i − 1 f i − 2 C ] \left[ \begin{matrix} f_{i-1} \\ f_{i-2} \\ C\\ \end{matrix} \right] fi1fi2C
想要通过初始矩阵得到结果矩阵:
[ f i f i − 1 C ] \left[ \begin{matrix} f_{i} \\ f_{i-1} \\ C \end{matrix} \right] fifi1C
那么初始矩阵必然左乘一个 3 × 3 3\times 3 3×3的系数矩阵:
[ k 1   k 2   k 3 k 4   k 5   k 6 k 7   k 8   k 9 ] \left[ \begin{matrix} k_1 \ k_2 \ k_3\\ k_4 \ k_5 \ k_6\\ k_7 \ k_8 \ k_9 \end{matrix} \right] k1 k2 k3k4 k5 k6k7 k8 k9
这样得到的矩阵为:

[ k 1   k 2   k 3 k 4   k 5   k 6 k 7   k 8   k 9 ] [ f i − 1 f i − 2 C ] = [ k 1 f i − 1 + k 2 f i − 2 + k 3 C k 4 f i − 1 + k 5 f i − 2 + k 6 C k 7 f i − 1 + k 8 f i − 2 + k 9 C ] \left[ \begin{matrix} k_1 \ k_2 \ k_3\\ k_4 \ k_5 \ k_6\\ k_7 \ k_8 \ k_9 \end{matrix} \right] \left[ \begin{matrix} f_{i-1} \\ f_{i-2} \\ C\\ \end{matrix} \right]= \left[ \begin{matrix} k_1f_{i-1}+k_2f_{i-2}+k_3C \\ k_4f_{i-1}+k_5f_{i-2}+k_6C\\ k_7f_{i-1}+k_8f_{i-2}+k_9C \end{matrix} \right] k1 k2 k3k4 k5 k6k7 k8 k9fi1fi2C=k1fi1+k2fi2+k3Ck4fi1+k5fi2+k6Ck7fi1+k8fi2+k9C
由问题给定的通项: f i = A ⋅ f i − 1 + B ⋅ f i − 2 + C , ( i ≥ 3 ) f_i=A\cdot f_{i-1}+B\cdot f_{i-2}+C,(i\geq3) fi=Afi1+Bfi2+C,(i3)
f i = k 1 f i − 1 + k 2 f i − 2 + k 3 C = A ⋅ f i − 1 + B ⋅ f i − 2 + C f_i = k_1f_{i-1}+k_2f_{i-2}+k_3C = A\cdot f_{i-1}+B\cdot f_{i-2}+C fi=k1fi1+k2fi2+k3C=Afi1+Bfi2+C
k 1 = A , k 2 = B , k 3 = 1 k_1=A,k_2=B,k_3=1 k1=A,k2=B,k3=1
f i − 1 = k 4 f i − 1 + k 5 f i − 2 + k 6 C f_i-1=k_4f_{i-1}+k_5f_{i-2}+k_6C fi1=k4fi1+k5fi2+k6C
k 4 = 1 , k 2 = k 3 = 0 k_4=1,k_2=k_3=0 k4=1,k2=k3=0
C = k 7 f i − 1 + k 8 f i − 2 + k 9 C C = k_7f_{i-1}+k_8f_{i-2}+k_9C C=k7fi1+k8fi2+k9C
k 7 = k 8 = 0 , k 9 = 1 k_7=k_8=0,k_9=1 k7=k8=0,k9=1
系数矩阵为:
[ A   B   1 1   0   0 0   0   1 ] \left[ \begin{matrix} A\ B\ 1\\ 1\ 0\ 0\\ 0\ 0\ 1\\ \end{matrix} \right] A B 11 0 00 0 1


思考: f i = c i − f i − 1 f_i=c^i-f_{i-1} fi=cifi1的矩阵形式
解法:
初始矩阵为:
[ f i − 1 c i − 1 ] \left[ \begin{matrix} f_{i-1} \\ c^{i-1} \end{matrix} \right] [fi1ci1]
这里需要上述标准式不同的是,你要想到第 i − 1 i-1 i1项中 c c c的指数为多少,为 i − 1 i-1 i1,故初始矩阵和标准式不完全相同,同时我们求的是 f i f_i fi,所以其不能加上负号,负号都是丢到系数上的。

想要通过初始矩阵得到结果矩阵:
[ f i c i ] \left[ \begin{matrix} f_{i} \\ c^{i} \end{matrix} \right] [fici]
那么初始矩阵必然左乘一个 2 × 2 2\times 2 2×2的系数矩阵:
[ k 1   k 2 k 3   k 4 ] \left[ \begin{matrix} k_1 \ k_2 \\ k_3 \ k_4 \end{matrix} \right] [k1 k2k3 k4]
这样得到的矩阵为:

[ k 1   k 2 k 3   k 4 ] [ f i − 1 c i − 1 ] = [ k 1 f i − 1 + k 2 c i − 1 k 3 f i − 1 + k 4 c i − 1 ] \left[ \begin{matrix} k_1 \ k_2 \\ k_3 \ k_4 \end{matrix} \right] \left[ \begin{matrix} f_{i-1} \\ c^{i-1} \end{matrix} \right]= \left[ \begin{matrix} k_1f_{i-1}+k_2c^{i-1} \\ k_3f_{i-1}+k_4c^{i-1} \end{matrix} \right] [k1 k2k3 k4][fi1ci1]=[k1fi1+k2ci1k3fi1+k4ci1]
k 1 f i − 1 + k 2 c i − 1 = f i k_1f_{i-1}+k_2c^{i-1} =f_i k1fi1+k2ci1=fi,故 k 1 = − 1 , k 2 = c k_1=-1,k_2=c k1=1,k2=c
k 3 f i − 1 + k 4 c i − 1 = c i k_3f_{i-1}+k_4c^{i-1} = c^i k3fi1+k4ci1=ci,故 k 3 = 0 , k 4 = c k_3=0,k_4=c k3=0,k4=c
系数矩阵:
[ − 1   c   0    c ] \left[ \begin{matrix} -1 \ c \\ \ 0 \ \ c \end{matrix} \right] [1 c 0  c]


矩阵快速幂:
F n F_n Fn为所求的第 n n n项的矩阵形式, A A A为系数矩阵:
那么 F n = A F n − 1 = A 2 F n − 2 = . . . = A n − 1 F 1 F_n=AF_{n-1}=A^2F_{n-2}=...=A^{n-1}F_1 Fn=AFn1=A2Fn2=...=An1F1
A n − 1 A^{n-1} An1这个系数部分可以直接通过快速幂计算得到,最后再乘上初始矩阵即可。
注:初始矩阵一般都是给定的数值。
最后我们直接取出 F n F_n Fn矩阵中的对应的 f n f_n fn即可。


例题自取

你可能感兴趣的:(数学)