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

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

已知f(n)=af(n1)+bf(b2),因为有两项所以我们构造一个22的矩阵使得

[f(n1)f(n2)][t1t2t3t4]=[f(n)f(n1)]

根据矩阵乘法规律

f(n)=t1f(n1)+t3f(n2)f(n1)=t2f(n1)+t4f(n2)

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

[f(n1)f(n2)][a1b0]=[f(n)f(n1)]

所以有

[f(2)f(1)][a1b0]n2=[f(n)f(n1)]

同理斐波那契数列为

[11][1110]n2=[f(n)f(n1)]

矩阵乘法:

#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 @   xxcdsg  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示