快速幂算法

该函数 qpow 实现了快速幂算法(Fast Exponentiation) ,用于高效计算幂运算 <math xmlns="http://www.w3.org/1998/Math/MathML"> x n x^n </math>xnmod MOD的结果(其中 MOD 是一个全局常量)。以下是详细说明:

功能:

计算 xn 次幂,并对全局常量取模,即返回 <math xmlns="http://www.w3.org/1998/Math/MathML"> x n x^n </math>xnmod MOD的值。

算法原理:

  1. 二进制分解指数 n : 将指数 n 视为二进制形式(例如 n =13 的二进制为 <math xmlns="http://www.w3.org/1998/Math/MathML"> 110 1 2 = 8 + 4 + 1 1101_2=8+4+1 </math>11012=8+4+1),则:

    <math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> x n = x 2 k 1 + 2 k 2 + ⋯ = x 2 k 1 × x 2 k 2 × ⋯ x^n=x^{2^{k_1}+2^{k_2}+⋯}=x^{2^{k_1}} \times x^{2^{k_2}} \times \cdots </math>xn=x2k1+2k2+⋯=x2k1×x2k2×⋯

  2. 平方迭代 : 通过循环反复平方 x (即 x ← <math xmlns="http://www.w3.org/1998/Math/MathML"> x 2 x^2 </math>x2 mod  MOD),生成的 <math xmlns="http://www.w3.org/1998/Math/MathML"> x 1 , x 2 , x 4 , x 8 , . . . x^1,x^2,x^4,x^8,... </math>x1,x2,x4,x8,...的序列。

  3. 按位累积结果 : 遍历 n 的二进制位。若某位为1,则将当前的 x 累积到结果 res 中。

代码解析:

c++ 复制代码
long long qpow(long long x, int n) {
    long long res = 1;          // 初始化结果为 1
    while (n) {                 // 当指数 n 未处理完时循环
        if (n & 1) {            // 检查 n 的最低位是否为 1
            res = res * x % MOD; // 若为 1,累积当前 x 到结果(取模)
        }
        x = x * x % MOD;        // 平方迭代:x = x^2 mod MOD
        n >>= 1;                // 右移一位(等价于 n /= 2)
    }
    return res;                 // 返回最终结果
}

示例:

以 x=2,n=13,MOD=1000 为例:

  1. 初始化res = 1, x = 2, n = 13 (二进制 1101).
  2. 循环步骤
    • 迭代 1:n & 1 = 1res = 1 * 2 % 1000 = 2 x = 2^2 % 1000 = 4, n = 6 (二进制 110).
    • 迭代 2:n & 1 = 0 → 不更新 res x = 4^2 % 1000 = 16, n = 3 (二进制 11).
    • 迭代 3:n & 1 = 1res = 2 * 16 % 1000 = 32 x = 16^2 % 1000 = 256, n = 1 (二进制 1).
    • 迭代 4:n & 1 = 1res = 32 * 256 % 1000 = 8192 % 1000 = 192 x = 256^2 % 1000 = 65536 % 1000 = 536, n = 0.
  3. 返回结果res = 192(即 <math xmlns="http://www.w3.org/1998/Math/MathML"> 2 13 m o d    1000 = 8192 m o d    1000 = 192 2^{13} mod  1000 = 8192 mod  1000=192 </math>213mod  1000=8192mod  1000=192)。

关键点:

  • 时间复杂度O (logn ),远优于朴素循环 O (n)。
  • 模运算优化:每一步乘法和平方后立即取模,避免溢出。
  • 适用场景:大数幂运算(如密码学、组合数学中常见的模幂计算)。
  • 注意事项
    • 假设 MOD 是全局定义的常量。
    • 指数 n 必须为非负整数(负数会导致死循环)。
相关推荐
xh didida20 小时前
算法 -- 位运算
开发语言·c++·算法
祁_z21 小时前
大模型轻量化:模型格式选型(ONNX/GGUF/TFLite) + 压缩三剑客(量化/剪枝/蒸馏)+ 大模型推理执行流程介绍
算法·机器学习·剪枝·量化·蒸馏·大模型轻量化
绛橘色的日落(。・∀・)ノ21 小时前
机器学习之手写数字识别
算法
流年如夢21 小时前
单链表Ⅲ(LeetCode)
数据结构·算法·leetcode·职场和发展
鉴生Eric21 小时前
FOR算法中的AI智能体具体如何实现频谱感知和动态信道选择?请用技术术语详细说明其决策流程
人工智能·算法
量子炒饭大师21 小时前
【优化算法】双指针算法的「义体化」重构 ——【双指针】双指针算法中的指针是如何定义的?如何使用它进行一些简单的算法?
c++·算法·重构·优化算法·双指针
通信小呆呆21 小时前
ZC序列符号同步:多径信道下的四种经典算法
算法
机器学习之心HML21 小时前
粒子群算法求解速冻食品冷链配送路径优化问题,MATLAB代码
算法·matlab·冷链配送路径优化
fie888921 小时前
基于粒子群优化(PSO)算法的带STATCOM的IEEE 30节点系统最优潮流MATLAB实现
开发语言·算法·matlab
hele_two1 天前
SDL2高效画实心圆的算法(一)
c++·算法·图形渲染