Java算法学习11——快速幂与矩阵快速幂

一、快速幂

1.介绍详情
https://blog.csdn.net/qq_19782019/article/details/85621386

2.快速幂模板

(1) 简单模板,便于理解

long long fastPower(long long base, long long power) {
    long long result = 1;
    while (power > 0) {
        if (power % 2 == 0) {
            //如果指数为偶数
            power = power / 2;//把指数缩小为一半
            base = base * base % 1000;//底数变大成原来的平方
        } else {
            //如果指数为奇数
            power = power - 1;//把指数减去1,使其变成一个偶数
            result = result * base % 1000;//此时记得要把指数为奇数时分离出来的底数的一次方收集好
            power = power / 2;//此时指数为偶数,可以继续执行操作
            base = base * base % 1000;
        }
    }
    return result;
}

(2) 二次优化

long long fastPower(long long base, long long power) {
    long long result = 1;
    while (power > 0) {
        if (power % 2 == 1) {
            result = result * base % 1000;
        }
        power = power / 2;
        base = (base * base) % 1000;
    }
    return result;
}

(3) 优化模板

注意:两个十进制数进行与运算,会先转换为二进制数,然后比较二进制数的最后一位,如果相同则为1,不同则为0,所以当为奇数时,二进制最后一位为1,与1进行与运算返回1;为偶数时,二进制最后一位为0,进行与运算,返回0

long long fastPower(long long base, long long power) {
    long long result = 1;
    while (power > 0) {
        if (power & 1) {//此处等价于if(power%2==1)
            result = result * base % 1000;
        }
        power >>= 1;//此处等价于power=power/2
        base = (base * base) % 1000;
    }
    return result;
}

二、矩阵快速幂

1.介绍详情

https://blog.csdn.net/wust_zzwh/article/details/52058209

2.矩阵快速幂模板

static int [][]temp=new int [n][n];
static int [][]res=new int [n][n];

//矩阵乘法,将结果送回a[][]中
void multi(int a[][],b[][],n)
{
  //对中间矩阵进行清零
   for(int i=0;i<n;i++){
      for(int j=0;j<n;j++){
         temp[i][j]=0;
         }
     }
     
   //中间矩阵存储相乘结果
   for(int i=0;i<n;i++){
     for (int j=0;j<n;j++){
       for(int k=0;k<n;k++){
         temp[i][j]=a[i][k]*b[i][k];
         }
       }
     }
   
   //将结果放回a[][]数组
   for(int i=0;i<n;i++){
     for(int j=0;j<n;j++){
       a[i][j]=temp[i][j];
       }
    }
}

//矩阵快速幂模板,其实就是把第一部分介绍的快速幂的乘法变成矩阵的乘法就行

void fastPower(int a[][],int n,int power)
{
  //初始化 res数组为单位矩阵,相当于第一步的int result=1
  for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
      if(i==j) res[i][j]=1;
      else res[i][j]=0;
      }
   }
  
  while(power>0){
   if(power&1) multi(res,a,n);//相当于 result=result*base
   power>>=1;
   multi(a,a,n);//相当于base=(base*base)
   }
}

3.矩阵快速幂的应用

(1) 套路
①先根据题意求出递推公式
②根据递推公式写出它的转移矩阵T,即TX^ (n-1)=X^ n。注意此转移矩阵的系数不包含未知数,这样才可以进行第③步
③求出转移矩阵T后,T
X^ (n-1)=X^ n,利用矩阵的快速幂求出X^(n-1)的值,最后乘以系数矩阵T(也称为转移矩阵)得出矩阵X ^ n的值

(2) 知识点

①根据递推公式构造系数矩阵(即转移矩阵)用于快速幂
在这里插入图片描述
系数矩阵的套路:
第一行一般就是递推式,后面的行就是不需要的项就让与其的相乘系数为0

注意:将右边的两项含未知数n的项写成列向量

其它的例子
在这里插入图片描述

详情请看:

https://blog.csdn.net/u012061345/article/details/52224623?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161642449416780261955341%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=161642449416780261955341&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_v2~rank_v29-1-52224623.pc_v2_rank_blog_default&utm_term=矩阵

https://blog.csdn.net/wust_zzwh/article/details/52058209

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值