倍增法求幂运算:让乘法飞起来!-野牛程序员讲少儿编程
作者:野牛程序员:2025-05-06 16:56:03算法阅读 2006
倍增法求幂运算:让乘法飞起来!-野牛程序员讲少儿编程
🔥 倍增法求幂运算:让乘法飞起来!
咱们先来个问题热身:
有一个变量
a = 2
,想算a^13
(也就是 2 的 13 次方),咋算最快?
如果一步步乘:2 × 2 × 2 × ...
得连乘 13 次,效率低得像乌龟爬树🐢。
有没有办法像光速战士⚡一样直接飙起来?
当然有!倍增法(又叫快速幂算法)来啦!
🧠 核心思想:用“二进制”分解指数
举个例子:
13 = 1101(二进制) 也就是 2^3 + 2^2 + 2^0
换句话说:
a^13 = a^(8 + 4 + 1) = a^8 × a^4 × a^1
每次都把底数平方,然后只在“1”的位上乘一下,是不是快得飞起!🚀
👣 算法步骤
把指数
b
拆成二进制位从低位开始看
如果这一位是
1
,就乘当前的a
每轮让
a = a * a
(底数平方)每轮让
b = b >> 1
(指数右移)
💻 C++ 实现:快速幂函数
#include <iostream> using namespace std; typedef long long ll; // 计算 a^b % mod ll quick_pow(ll a, ll b, ll mod) { ll result = 1; // 初始答案是1,相当于乘法的单位元 a = a % mod; // 先对 a 取模,防止溢出 while (b > 0) { if (b & 1) // 如果当前位是1 result = (result * a) % mod; a = (a * a) % mod; // 底数平方 b >>= 1; // 指数右移 } return result; }
🧪 小试牛刀
int main() { ll a = 2; ll b = 13; ll mod = 1000000007; cout << a << "^" << b << " mod " << mod << " = " << quick_pow(a, b, mod) << endl; return 0; }
输出:
2^13 mod 1000000007 = 8192
是不是飞快地得出了结果?💨
🤖 为什么效率高?
算法 | 时间复杂度 |
---|---|
普通乘法 | O(b) |
快速幂(倍增) | O(log b) |
当 b
是 10 亿时,普通方法要乘 10 亿次,而倍增法只用乘 30 次左右。速度简直像踩了风火轮🛞!
🔧 模板拓展:递归写法也可以
ll quick_pow_recursive(ll a, ll b, ll mod) { if (b == 0) return 1; ll half = quick_pow_recursive(a, b / 2, mod); ll res = (half * half) % mod; if (b % 2 == 1) res = (res * a) % mod; return res; }
💡 小彩蛋:可以用它做什么?
密码学中的RSA加密
大数取模计算
快速求
a^b mod p
这样的表达式(在信息学竞赛、CSP、NOIP等场景非常常见)
📦 小结(不是总结😎)
🌟 倍增法 = 让幂运算变身光速战士
🌟 基于二进制思想,把乘法折叠压缩
🌟 从 O(b) 变成 O(log b),效率飙升!
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
