快速幂(算法篇)

算法之快速幂

快速幂算法

概念

  • 计算XN的最常见的算法是使用N-1次乘法自乘,但是可以使用一种将利用分治思想跟递归结合的算法 更好,效率更高。判断N是偶数还是奇数,如果是偶数的话,我们有XN=XN/2*XN/2,如果为奇数,我们有XN=X(N-1)/2*X(N-1)/2*X,然后在不断的递归并将N等于0和N等于1为递归的基准情形,当N等于1返回X,该算法的时间复杂度为O(logn)

代码:

  • 递归
cpp 复制代码
long int Pow(long int X,long int N){
    if(N==0)
        return 1;
    if(N==1)
        return X;
    if(X%2==0){
        return Pow(X*X,N/2);
    }else{
        return Pow(X*X,N/2)*X;
    }
}
  • 非递归
cpp 复制代码
//有些题目数字过大防止溢出会对结果取模
long long quickpow(long long a,long long b,int mod){
    long long res=1;
    if(b==0) return 1;
    while(b){
        //b为奇数
        if(b%2==1){
            res=res*a%mod;
        }
        b/=2;
        a=a*a%mod;
    }
    return res;
}
  • 位运算加速 :假设我们要求a的11次方那么他会分解成8+2+1,那如何将其分解成8+2+1的情况,我们可以将其转换成二进制 ,11的二进制为1011,11=1*23+0*22+1*1+1*20,这样我们每次取11的二进制的最后一位这样就能分解成8+2+1了

    cpp 复制代码
    long long quickpow(long long a,long long b,int mod){
        long long res=1;
        if(b==0) return 1;
        while(b){
            //b&1就可以等价于b%2==1,如果b为偶数b&1==0,为奇数b&1==1
            if(b&1){
                res=res*a%mod;
            }
            b>>=1;  //等价于b/=2
            a=a*a%mod;
        }
        return res;
    }

尾言

完整版笔记也就是数据结构与算法专栏完整版可到我的博客进行查看,或者在github库中自取(包含源代码)

相关推荐
重生之我是Java开发战士14 分钟前
【优选算法】模拟算法:替换所有的问号,提莫攻击,N字形变换,外观数列,数青蛙
算法
仟濹19 分钟前
算法打卡 day1 (2026-02-06 周四) | 算法: DFS | 1_卡码网98 可达路径 | 2_力扣797_所有可能的路径
算法·leetcode·深度优先
yang)20 分钟前
欠采样时的相位倒置问题
算法
历程里程碑23 分钟前
Linux20 : IO
linux·c语言·开发语言·数据结构·c++·算法
A尘埃25 分钟前
物流公司配送路径动态优化(Q-Learning算法)
算法
天若有情67326 分钟前
【自研实战】轻量级ASCII字符串加密算法:从设计到落地(防查岗神器版)
网络·c++·算法·安全·数据安全·加密
啊森要自信1 小时前
CANN ops-cv:AI 硬件端视觉算法推理训练的算子性能调优与实战应用详解
人工智能·算法·cann
仟濹1 小时前
算法打卡day2 (2026-02-07 周五) | 算法: DFS | 3_卡码网99_计数孤岛_DFS
算法·深度优先
驭渊的小故事1 小时前
简单模板笔记
数据结构·笔记·算法
YuTaoShao2 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展