矩阵快速幂

因为一个线性递推做不出来码一个矩阵快速幂的板子
先是一个矩阵乘法的部分

double * Matrix (double *a,double *b,double*res,int m,int r,int n){//矩阵乘法,返回结果指针 
	for (int i=0;i<m;i++){
		for (int j=0;j<n;j++){
			res[m*i+j]=0;
			for (int k=0;k<r;k++)res[n*i+j]+=a[i*r+k]*b[k*n+j];
		}
	}
	return res;
} 

然后类似快速幂直接码一个就行了

double * qpow(double *a,int n,int m){//矩阵快速幂,返回幂后的指针 
 	double *p=(double *)malloc(sizeof(double)*n*n);
 	double *res=(double*)malloc(sizeof(double)*n*n);
 	double *tmp;
 	for (int i=0;i<n;i++)
 	for (int j=0;j<n;j++){
 		if(i==j)p[i*n+j]=1;
 		else p[i*n+j]=0;
	 }//初始化p为In 
 	while (m>0){
 		if (m%2)Matrix(a,p,res,n,n,n);
 		tmp=p;
 		p=res;
 		res=p;
 		Matrix(a,a,res,n,n,n);
 		tmp=a;
 		a=res;
 		res=tmp;
 		m/=2;
	 }
	 return p;
 }

然后稍微写一下矩阵快速幂在切线性递推题中的妙用不过不知道怎么导入公式
大致意思就是线性递推可以写成一个nn的矩阵左乘一个n1的矩阵然后迭代。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值