矩阵快速幂的系数矩阵

参考博客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) ,已知 f 1 , f 2 f_1,f_2 ,求解 f n ( n 1 0 18 ) f_n(n\leq10^{18}) ,由于结果可能过大,答案对 1 0 9 + 7 10^9+7 取模
显然这个问题没法在 O ( n ) O(n) 复杂度内解决,所以我们另寻他法。

系数矩阵及推导:
我们从最熟悉的 F i b o n a c c i 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)
F i b o n a c c i Fibonacci 通式写成上面式子的模样,得到 f i = 1 f i 1 + 1 f i 2 f_i=1 \cdot f_{i-1}+1\cdot f_{i-2}
初始矩阵为:
[ f i 1 f i 2 ] \left[ \begin{matrix} f_{i-1} \\ f_{i-2} \end{matrix} \right]
想要通过初始矩阵得到结果矩阵:
[ f i f i 1 ] \left[ \begin{matrix} f_{i} \\ f_{i-1} \end{matrix} \right]
那么初始矩阵必然左乘一个 2 × 2 2\times 2 的系数矩阵:
[ k 1   k 2 k 3   k 4 ] \left[ \begin{matrix} k_1 \ k_2 \\ k_3 \ k_4 \end{matrix} \right]
这样得到的矩阵为:

[ 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]
由我们写成标准形式的 F i b o n a c c i Fibonacci 式得到:
k 1 = 1 , k 2 = 1 k_1=1,k_2=1
k 3 f i 1 + k 4 f i 1 = f i 2 k_3f_{i-1}+k4f_{i-1} =f_{i-2} ,故 k 3 = 1 , k 4 = 0 k_3=1,k_4=0
F i b o n a c c i Fibonacci 通项的系数矩阵即:
[ 1     1 1     0 ] \left[ \begin{matrix} 1 \ \ \ 1 \\ 1 \ \ \ 0 \end{matrix} \right]


回到我们的问题所给通项: 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)
初始矩阵:
[ f i 1 f i 2 C ] \left[ \begin{matrix} f_{i-1} \\ f_{i-2} \\ C\\ \end{matrix} \right]
想要通过初始矩阵得到结果矩阵:
[ f i f i 1 C ] \left[ \begin{matrix} f_{i} \\ f_{i-1} \\ C \end{matrix} \right]
那么初始矩阵必然左乘一个 3 × 3 3\times 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]
这样得到的矩阵为:

[ 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]
由问题给定的通项: 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)
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
k 1 = A , k 2 = B , k 3 = 1 k_1=A,k_2=B,k_3=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
k 4 = 1 , k 2 = k 3 = 0 k_4=1,k_2=k_3=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
k 7 = k 8 = 0 , k 9 = 1 k_7=k_8=0,k_9=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]


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

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

[ 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]
k 1 f i 1 + k 2 c i 1 = f i k_1f_{i-1}+k_2c^{i-1} =f_i ,故 k 1 = 1 , k 2 = c k_1=-1,k_2=c
k 3 f i 1 + k 4 c i 1 = c i k_3f_{i-1}+k_4c^{i-1} = c^i ,故 k 3 = 0 , k 4 = c k_3=0,k_4=c
系数矩阵:
[ 1   c   0    c ] \left[ \begin{matrix} -1 \ c \\ \ 0 \ \ c \end{matrix} \right]


矩阵快速幂:
F n F_n 为所求的第 n n 项的矩阵形式, 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
A n 1 A^{n-1} 这个系数部分可以直接通过快速幂计算得到,最后再乘上初始矩阵即可。
注:初始矩阵一般都是给定的数值。
最后我们直接取出 F n F_n 矩阵中的对应的 f n f_n 即可。


例题自取

猜你喜欢

转载自blog.csdn.net/weixin_43900869/article/details/107007214