2025-02-11 00:23阅读: 4评论: 0推荐: 0

快速幂

快速幂算法详解

快速幂算法(也称为平方求幂法)是一种用于高效计算幂运算的算法,特别适用于计算大数的幂模运算(如 ( a^b \mod p ))。它的核心思想是通过将指数 ( b ) 分解为二进制形式,利用平方和乘法逐步计算结果。


1. 快速幂的核心思想

快速幂算法的核心是将指数 ( b ) 表示为二进制形式,例如:
[b = b_k \cdot 2^k + b_{k-1} \cdot 2^{k-1} + \cdots + b_0 \cdot 2^0]
其中 ( b_i ) 是二进制位(0 或 1)。因此:
[a^b = a^{b_k \cdot 2^k} \times a^{b_{k-1} \cdot 2^{k-1}} \times \cdots \times a^{b_0 \cdot 2^0}]
通过循环处理每一位,逐步计算幂运算。


2. 快速幂的步骤

  1. 初始化结果为 1。
  2. 将底数 ( a ) 对模数 ( p ) 取模,防止 ( a ) 过大。
  3. 循环处理指数 ( b ) 的每一位:
    • 如果当前最低位为 1,将 ( a ) 乘入结果。
    • 将 ( a ) 平方,准备处理下一位。
    • 将 ( b ) 右移一位,处理下一个二进制位。
  4. 返回最终结果。

3. 快速幂的代码实现

以下是 C++ 实现快速幂算法的代码:

#include <iostream>
using namespace std;

// 快速幂函数,计算 a^b mod p
long long fast_pow(long long a, long long b, long long p) {
    long long result = 1; // 初始化结果为 1
    a = a % p; // 先对 a 取模,防止 a 过大

    while (b > 0) {
        // 如果当前最低位为 1,将 a 乘入结果
        if (b & 1) {
            result = (result * a) % p;
        }
        // 将 a 平方,准备处理下一位
        a = (a * a) % p;
        // 右移一位,处理下一个二进制位
        b = b >> 1;
    }

    return result;
}

int main() {
    long long a, b, p;
    cout << "请输入 a, b, p:";
    cin >> a >> b >> p;

    long long result = fast_pow(a, b, p);
    cout << a << "^" << b << " mod " << p << " = " << result << endl;

    return 0;
}

4. 代码说明

  1. fast_pow 函数

    • 输入:( a )(底数),( b )(指数),( p )(模数)。
    • 输出:( a^b \mod p )。
    • 核心思想:
      • 将指数 ( b ) 分解为二进制形式。
      • 通过平方和乘法逐步计算幂模运算。
      • 时间复杂度:( O(\log b) )。
  2. 主函数

    • 输入 ( a, b, p )。
    • 调用 fast_pow 函数计算结果并输出。

5. 示例运行

输入:
请输入 a, b, p2 10 1000
输出:
2^10 mod 1000 = 24
解释:
  • ( 2^{10} = 1024 )。
  • ( 1024 \mod 1000 = 24 )。

6. 复杂度分析

  1. 时间复杂度

    • 每次循环将指数 ( b ) 右移一位,循环次数为 ( O(\log b) )。
    • 每次循环内的操作(乘法和取模)是常数时间。
    • 总体复杂度:( O(\log b) )。
  2. 空间复杂度

    • 仅使用常数空间,( O(1) )。

7. 注意事项

  1. 模数 ( p ) 的限制

    • 如果 ( p = 1 ),结果恒为 ( 0 )。
    • 如果 ( a = 0 ) 且 ( b = 0 ),结果未定义(通常返回 ( 1 ) 或报错)。
  2. 大数问题

    • 如果 ( a ) 或 ( p ) 很大,确保使用 long long 类型以避免溢出。

! 谢谢观看

本文作者:ccgc718

本文链接:https://www.cnblogs.com/ccgc718/p/18709017

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   ccgc718  阅读(4)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起