Fast exponentiation of numbers: http://machlearner.blogspot.in/2013/09/modular-exponentiation.html
Same concept can be applied to raise matrices to a power.
Implementation:
// If the original matrix is stored in a[][], matexp(n) calculates a^n.
#define DIM 10
#define MOD 1000000007
LL a[DIM][DIM],cpy[DIM][DIM];
void matmultiply(LL y[DIM][DIM])
{
for(int i=0;i<DIM;i++)
for(int j=0;j<DIM;j++)
{
cpy[i][j]=0;
for(int r=0;r<DIM;r++)
cpy[i][j]=(cpy[i][j] + a[i][r]*y[r][j]) % MOD;
}
memcpy(a,cpy,sizeof cpy);
}
void matexp(int n)
{
if(n==1)
return;
else if(n%2==0)
{
matexp(n/2);
matmultiply(a);
}
else
{
LL temp[DIM][DIM];
memcpy(temp,a,sizeof a);
matexp(n-1);
matmultiply(temp);
}
}
No comments:
Post a Comment