本文目录

    阅读(1242)  评论(0)      编辑收藏举报

简单易懂的快速幂取模算法


本文是上一篇文章《程序员必学:快速幂算法》的续集,上一篇文章详细地介绍了快速幂算法,提供了递归、非递归的2种实现方案

抛出问题

请设计一个算法求x的y次幂模z的结果:(x ^ y) % z

  • x、y、z都是整数
  • z ≠ 0, y ≥ 0
  • x、y的绝对值可能很大,比如(1234 ^ 4567) % 30

思考

由于x、y的绝对值可能很大,x ^ y的结果可能会溢出。所以先求x ^ y,再对z取模,显然是不现实的。

这里要借助模运算的一条运算规则

(a * b) % p = ((a % p) * (b % p)) % p

根据上面的推导,就可以很容易写出代码实现

递归实现

int powMod(int x, int y, int z) {
if (y == 0) return 1 % z;
int half = powMod(x, y >> 1, z);
half = (half * half) % z;
if ((y & 1) == 0) { // y是偶数
return half;
} else { // y是奇数
return (half * (x % z)) % z;
}
}

非递归实现

int powMod(int x, int y, int z) {
int result = 1 % z;
x %= z;
while (y != 0) {
if ((y & 1) == 1) {
result = (result * x) % z;
}
x = (x * x) % z;
y >>= 1;
}
return result;
}

测试用例

// 4
powMod(1234, 4567, 30);
// 699
powMod(123, 456, 789);

如果你特别希望我写点什么方面的内容,也可以留言建议,谢谢。欢迎关注

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
历史上的今天:
2013-04-15 Core Animation2-CABasicAnimation
2013-04-15 Core Animation1-简介
点击右上角即可分享
微信分享提示
顶部