美文网首页
快速幂(二分,结合律)

快速幂(二分,结合律)

作者: zilla | 来源:发表于2020-06-14 00:14 被阅读0次

快速幂(二分,结合律)

一般的快速幂,计算(a^b)%c

从朴素的O(n)到O(lg n)。

基本思路:把b看做二进制。底数a反复平方(存下来),迭代or递归。

计算5^122 = 5^(1111010)B = 5^64 * 5^32 * 5^16 * 5^8 * 5^2

  • 迭代

    //calculate a^b mod p
    int fastPow_iterative(int a, int b, int p) {
        int res = 1;
        while (b) {
            if (b & 1) res = a * 1ll * res % p;
            a = a * 1ll * a % p;
            b >>= 1;
        }
        return res;
    }
    
  • 递归

    int fastPow_recursive(int a, int b, int p) {
        if (b == 0) return 1;
        if (b & 1) { // odd
            return fastPow_recursive(a, b-1, p) * a % p;
        } else { // even
            int temp = fastPow_recursive(a, b >> 1, p);
            return temp * 1ll * temp % p;
        }
    }
    

矩阵快速幂

在递推(动态规划)的应用:LeetCode70 爬楼梯,题虽简单,官方题解很精彩。

注意矩阵的构造。

const int MATRIX_SIZE = 2;
struct Matrix {
  int arr[MATRIX_SIZE][MATRIX_SIZE];
  Matrix() {
    memset(arr, 0, sizeof(arr));
  }
  
  // init as E
  void unit() {
    for(int i = 0; i < MATRIX_SIZE; i++) arr[i][i] = 1;
  }
  
  // Overload op *
  // const A(this), const B
  Matrix operator*(const Matrix &B) const{
    Matrix ans;
    for(int i = 0; i < MATRIX_SIZE; i++) {
      for(int j = 0; j < MATRIX_SIZE; j++) {
        for(int k = 0; k < MATRIX_SIZE; k++) {
          ans[i][j] += arr[i][k]*B.arr[k][j];
        }
      }
    }
    return ans;
  }
  
  Matrix operator^(int n) const{
    Matrix ans;
    ans.unit(); // ans = E
    Matrix A = *this;
    while(n) {
        if (n & 1) ans = ans * A;
        A = A * A;
        n >>= 1;
    }
  }
};

相关文章

  • 快速幂(二分,结合律)

    快速幂(二分,结合律) 一般的快速幂,计算(a^b)%c 从朴素的O(n)到O(lg n)。 基本思路:把b看做二...

  • 2021-10-12leetcode

    快速加 快速幂 二分图的最大匹配 一次A掉

  • 二分快速幂

  • 50. Pow(x, n)

    问题 Implement pow(x, n). 例子 pow(8, 8)16777216 分析 二分法快速幂 要点...

  • 二分求幂

    二分求幂法是快速计算形如 的求幂运算的方法。朴素计算 的方式是将 连乘 次,代码如下: 这需要计算 次,...

  • (矩阵)快速幂

    快速乘法: 快速幂: 矩阵快速幂:

  • 快速幂

    常规求幂 快速求幂(一般) 快速求幂 (递归) 快速求幂(位运算) 快速求幂(位运算,更简洁)

  • 快速幂,矩阵快速幂

    快速幂:复杂度为logn,比普通的n快了很多了. 原理 : 实现代码如下:(位运算,简单,简洁) 矩阵快速幂: 所...

  • 模板 | 整数快速幂 & 快速幂取模

    快速幂: 所谓的快速幂,其目的是为了快速求幂,将时间复杂度从朴素算法的降到。 假如现在要求 ,按照朴素算法,就是将...

  • 常用算法

    快速幂 Fast Power 快速取模 FastMode 快速排序 FastSort

网友评论

      本文标题:快速幂(二分,结合律)

      本文链接:https://www.haomeiwen.com/subject/hiptxktx.html