前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >整数快速幂与矩阵快速幂

整数快速幂与矩阵快速幂

作者头像
Cyril-KI
发布2022-09-19 14:14:36
3740
发布2022-09-19 14:14:36
举报
文章被收录于专栏:KI的算法杂记

前言

公众号菜单栏新增“精选文章”选项,欢迎使用!

一、整数快速幂

顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。

核心思想:求解12^11,等价于求解12 ^ (2 ^ 0+2 ^ 1+2 ^ 3)

代码:

代码语言:javascript
复制
typedef long long ll
代码语言:javascript
复制
ll fastpow(ll x,ll y) {   //求取x^y 
  ll res=1;
  while(y) {
    if(y % 2==1) { //为奇数,当前最低位为1,res就要乘以当前位置的权重 
      res *= x;
    }
    x *= x;   //每右移一次,最低位的权重都要乘以x 
    y /= 2;   //右移 
  }
  return res;
}

二、矩阵快速幂

矩阵快速幂和整数快速幂的思想一致,只不过答案矩阵的初始状态不再是整数1,而是一个单位矩阵:单位矩阵在矩阵乘法中的作用等同于整数中的1。

定义矩阵:

代码语言:javascript
复制
struct matrix {
  ll mat[6][6];
  init() {
    memset(mat, 0, sizeof(mat));
  }
};

定义矩阵乘法:

代码语言:javascript
复制
matrix mul(matrix a, matrix b) {   //return a*b
  matrix c;
  c.init();
  for(int i = 0; i < 6; i++) {
    for(int j = 0; j < 6; j++) {
      for(int k = 0; k < 6; k++) {
        c.mat[i][j] += ((a.mat[i][k] % mod) * (b.mat[k][j] % mod)) % mod;
        c.mat[i][j] %= mod;
      }
    }
  }
  return c;
}

定义矩阵快速幂:

代码语言:javascript
复制
matrix fast_pow(matrix A, int n) {   //return A^n % mod
  matrix B;
  B.init();
  for(int i = 0; i < 6; i++) {   //单位矩阵 
    B.mat[i][i] = 1;
  }
  while(n) {
    if(n & 1) {
      B = mul(B, A);
    }
    A = mul(A, A);
    n >>= 1; 
  }
  return B;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 KI的算法杂记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、整数快速幂
  • 二、矩阵快速幂
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档