矩阵快速幂与快速斐波那契数列

矩阵快速幂与快速斐波那契数列

已知\(f(n)=af(n-1)+bf(b-2)\),因为有两项所以我们构造一个\(2*2\)的矩阵使得

\[\begin{bmatrix}f(n-1)&f(n-2)\end{bmatrix}* \begin{bmatrix} t1&t2\\ t3&t4 \end{bmatrix} =\begin{bmatrix}f(n)&f(n-1)\end{bmatrix} \]

根据矩阵乘法规律

\[f(n)=t1*f(n-1)+t3*f(n-2)\\ f(n-1)=t2*f(n-1)+t4*f(n-2) \]

推得\(t1=a,t2=1,t3=b,t4=0\)

\[\begin{bmatrix}f(n-1)&f(n-2)\end{bmatrix}* \begin{bmatrix} a&1\\ b&0 \end{bmatrix} =\begin{bmatrix}f(n)&f(n-1)\end{bmatrix} \]

所以有

\[\begin{bmatrix}f(2)&f(1)\end{bmatrix}* \begin{bmatrix} a&1\\ b&0 \end{bmatrix}^{n-2} =\begin{bmatrix}f(n)&f(n-1)\end{bmatrix} \]

同理斐波那契数列为

\[\begin{bmatrix}1&1\end{bmatrix}* \begin{bmatrix} 1&1\\ 1&0 \end{bmatrix}^{n-2} =\begin{bmatrix}f(n)&f(n-1)\end{bmatrix} \]

矩阵乘法:

#define ll long long
const int N = 3,mod = 1e9 + 7;
struct jz{
    ll a[N][N];
    jz(){memset(a,0,sizeof(a));}//构造
    jz(bool f){memset(a,0,sizeof(a));//单位矩阵
    for(int i = 1;i <= 2;i++)
        a[i][i] = 1;
    }//构造单位矩阵
    jz operator*(const jz &other)const{
        jz ans;
        for(int i = 1;i <= 2;i++)
            for(int j = 1;j <= 2;j++)
                for(int k = 1;k <= 2;k++)
                    ans.a[i][j] = (ans.a[i][j] + a[i][k]*other.a[k][j]) % mod;
       	return ans;
    }
}

单位矩阵:

从左上角到右下角的对角线上的元素均为1。除此以外全都为0。根据单位矩阵的特点,任何矩阵与单位矩阵相乘都等于本身

矩阵快速幂:

jz jzfpow(jz a,ll n){
	jz ans(true);
    while(n){
        if(n&1) ans = (ans*a);
        n >>= 1;
        a=a*a;
    }
    return ans;
}
const ll N = 101,mod = 1e9 + 7;
int n;
struct jz{
    ll a[N][N];
    jz(){memset(a,0,sizeof(a));}//构造
    jz(bool f){memset(a,0,sizeof(a));//单位矩阵
    for(int i = 1;i <= n;i++)
        a[i][i] = 1;
    }//构造单位矩阵
    jz operator*(const jz &other)const{
        jz ans;
        for(int i = 1;i <= n;i++)
            for(int j = 1;j <= n;j++)
                for(int k = 1;k <= n;k++)
                    ans.a[i][j] = (ans.a[i][j] + (a[i][k]*other.a[k][j]) % mod) % mod;
       	return ans;
    }
};
jz jzfpow(jz a,ll n){
	jz ans(true);
    while(n){
        if(n&1) ans = (ans*a);
        n >>= 1;
        a=a*a;
    }
    return ans;
}
posted @ 2023-07-08 21:32  xxcdsg  阅读(16)  评论(0)    收藏  举报