• 矩阵的快速幂(含整数的快速幂)


    整数的快速幂

      一个整数的幂 a^b,可以表示将b表示成二进制形式,然后,再把b的每一位数字单独拿出来,进行a的幂运算,然后再相乘。

      举个例子: 

      a^11,11可以表示成1011,

      进而a^11 = 

      

    //x是底数 n是幂指数
    int quickpow(int x,int n){
        int res = x;
        int ans = 1;
        while(n){
            if(n&1) //位运算
                ans = res * ans;
            res = res * res;
         n >>= 1; }
    return ans; }

    矩阵的快速幂

       整体思路与整数的快速幂相同,唯一不同是,我们需要自己写一个矩阵相乘的函数,mul。

    Matrix QuickPow(Matrix x,int n){
        int res = x;
        int ans = 1;
        while(n){
            if(n & 1)
                ans = mul(ans, res);
            res = mul(res, res);
            n >>= 1;
        }
        return ans;
    }
    class Solution {
    public:
        double myPow(double x, int n) {
            long long nn = n;
            if(nn < 0)   x = 1 / x, nn *= -1;
            double ans = 1.0;
            while(nn){
                if(1 & nn){
                    ans *= x;
                }
                x *= x;
                nn >>= 1;
            }
            return ans;
        }
    };

    矩阵快速幂的简单应用

    题目描述

    已知F(n)=F(n-1)+F(n-2), 且F(0) = 0, F(1) = 1,求F(10^1000000)

    解题思路

    可构造矩阵A 使得 [F(n),F(n-1)] = A * [F(n-1),F(n-2)]

    所以[F(n), F(n-1)] = A^(n-1) * [F(n-1),F(n-2)]

    利用矩阵的快速幂求得 A^(n-1),就很容易再求F(n)了

  • 相关阅读:
    golang实现单链表
    koa中间执行机制
    vuex源码简析
    从浏览器渲染过程看重绘回流
    javascript的this
    js 设计模式:观察者和发布订阅模式
    H5 移动端 键盘遮挡焦点元素解决方案
    webpack4 css modules
    Daily,一个入门级的 React Native 应用
    javascript: 类型转换
  • 原文地址:https://www.cnblogs.com/woxiaosade/p/10295408.html
Copyright © 2020-2023  润新知