矩阵快速幂

类比快速幂 只是把底数和乘方换成了矩阵 乘法换成了矩阵相乘

矩阵快速幂模板:

      

 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;
    }

}

 

posted @ 2021-03-20 17:25  nb小歪  阅读(43)  评论(0编辑  收藏  举报