您的位置:首页 > 其它

矩阵快速幂,简单粗暴

2016-02-24 08:37 211 查看


快速幂

数的快速幂;

计算x^n,n=10000000

递归算法

intpow(int x,int n)

{


if(n==1)



return x;



else if(n%2==1)



{



return x*pow(x,n/2);



}



else



{



return pow(x,n/2);



}


}

非递归算法

intpow(int x,int n)

{


int temp=1;



if(n%2==1)



{



temp*=x;



n-=1;



}



while(n)



{



x=x*x;



n/=2;



}



return x;


}

矩阵快速幂

1*.矩阵乘法的实现;

structasd{


int a

;


};

asdcheng(asd q,asd w,int n)

{


asd r;



int i,j,k;



for(i=0;i<n;i++)



{



for(j=0;j<n;j++)



{



r.a[i][j]=0;



for(k=0;k<n;k++)



{



r.a[i][j]+=q.a[i][k]*w.a[k][j];



}



}



}



return r;


}

2*.类比于数的快速幂做出矩阵的快速幂

#include <stdio.h>

#include <string.h>

#define Matr 110 //矩阵大小

struct mat//矩阵结构体

{

inta[Matr][Matr];

mat()//构造函数

{

memset(a,0,sizeof(a));

}

};

int Size,mod;

mat multi(mat m1,mat m2)//两个相等矩阵的乘法

{

mat ans=mat();

for(inti=0;i<Size;i++)

for(intj=0;j<Size;j++)

for(intk=0;k<Size;k++)

ans.a[i][k]=(ans.a[i][k]+m1.a[i][j]*m2.a[j][k])%mod;

return ans;

}

mat quickmulti(mat m,int n)//二分快速幂

{

mat ans=mat();

int i;

for(i=0;i<Size;i++)ans.a[i][i]=1;

while(n)

{

if(n&1)ans=multi(m,ans);

m=multi(m,m);

n>>=1;

}

return ans;

}

void print(mat m)//输出矩阵信息

{

int i,j;

printf("%d\n",Size);

for(i=0;i<Size;i++)

{

for(j=0;j<Size;j++)

printf("%d ",m.a[i][j]);

printf("\n");

}

}

int main()

{

int n,p;

while(~scanf("%d%d",&n,&p))

{

matA;

for(inti=0;i<n;i++)

for(int j=0;j<n;j++)

scanf("%d",&A.a[i][j]);

Size=n;

mod=p;

A=quickmulti(A,n);

print(A);

}

return 0;

}

-------斐波那契前四位(主要代码),用公式做的————不知道百度

doublet1=log10((double)(1.0+sqrt(5.0))/2);

double t2=log10(sqrt(5.0));

double t;

int ans1;

t=n*t1-t2;

t=t-(int)t;

ans1=pow(10.0,t)*1000;

printf("%d\n",ans1);

------矩阵的一些变换
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: