矩阵快速幂
类比快速幂 只是把底数和乘方换成了矩阵 乘法换成了矩阵相乘
矩阵快速幂模板:
1 static long[][] matrixpower(long[][] q, int n) { //实现矩阵q的n次 2 long[][] res=new long[2][2]; 3 //把res矩阵初始化为单位矩阵 4 for(int i=0;i<q.length;i++){ 5 res[i][i]=1; 6 } 7 //快速幂实现 8 while(n>0){ 9 if((n&1)==1){ 10 res = mutiply(res, q); 11 } 12 q =mutiply(q, q);//乘方一直翻倍 13 n>>=1; 14 } 15 return res; 16 } 17 //mutiply函数实现两个矩阵相乘 18 static long[][] mutiply(long[][] a, long[][] b) { 19 long[][] res=new long[a.length][b.length]; 20 for(int i=0;i<a.length;i++){ 21 for(int j=0;j<b.length;j++){ 22 for(int k=0;k<a[0].length;k++){ 23 res[i][j] += a[i][k]*b[k][j]; 24 } 25 } 26 } 27 return res; 28 }
应用:
矩阵快速幂求斐波那契数列
public class 斐波那契_矩阵快速幂 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); int n=sc.nextInt(); long q[][]={{0,1},{1,1}};//下标从0开始 long a[][]={{1,1}}; long res[][]; long end[][]; res=matrixpower(q,n-1); //res为q矩阵的n-1次方 end=mutiply(a,res); //mutiply实现两个矩阵相乘 System.out.println(end[0][0]); } private static long[][] matrixpower(long[][] q, int n) { //实现矩阵q的n次 long[][] res=new long[2][2]; //把res矩阵初始化为单位矩阵 for(int i=0;i<q.length;i++){ res[i][i]=1; } //快速幂实现 while(n>0){ if((n&1)==1){ res = mutiply(res, q); } q =mutiply(q, q);//乘方一直翻倍 n>>=1; } return res; } private static long[][] mutiply(long[][] a, long[][] b) { long[][] res=new long[a.length][b.length]; for(int i=0;i<a.length;i++){ for(int j=0;j<b.length;j++){ for(int k=0;k<a[0].length;k++){ res[i][j] += a[i][k]*b[k][j]; } } } return res; } }