深入解析与实现:快速幂算法及其模运算优化

文章介绍了如何使用快速幂算法计算大幂运算取模的问题,通过将指数分解为奇偶数部分,利用取模性质简化计算过程,从而降低时间复杂度至O(logN)。详细解释了代码实现步骤和一个具体实例3^100mod100的计算过程。
摘要由CSDN通过智能技术生成

参考动画

0、背景

计算形如3^100次方这种大幂运算,朴素算法要一个一个乘100多遍,时间复杂度为O(n),很低效
但如果我们换个思路,9=3^2
`3100=950=(81)^25
=(8181)^1281…
这样子的时间负责度就是O(logN)了

那如果取模该如何实现呢:
计算3^100%100

1、取模计算原理

(a*b)%p=[(a%p)*(b%p)]%p;

2、代码实现

#include<iostream>

long long quickPow(long long base,long long exponent,long long mod){
    long long result=1;//储存最终答案
    while(exponent>0){
      if(exponent%2==1){//指数为奇数时
        result=(result*base)%result;
      }
      //为偶数时
      base=base*base%mod;
      exponent/=2;
    }
    return result;
}

主要思路:

1、指数为奇数时,就分离个1,再变成偶数:
3^5=3*(3^4); 因为要取模:根据公式(ab)%p=[(a%p)(b%p)]%p; 35%100等价于``[(3%100)*(34%100)]%100`
也就是代码:

if(exponent%2==1){//指数为奇数时
        result=(result*base)%mod;
      }

那result来储存奇数多余的部分(3%100)
并且由于计算机除法是向下取整,所以在后面的偶数部分实现了exponent减1

2、偶数时:
3^4=(3*3)^2=9^2

 //为偶数时
      base=base*base%mod;
      exponent/=2;

3、具体实战:

假设我们要计算 310mod  100310mod100。这里的底数(base)是 3,指数(exponent)是 10,模数(mod)是 100。

运行 `quickPow(3, 10, 100)` 函数的步骤如下:

1. 初始设置 `result = 1`。
    
2. 进入 while 循环,因为 10 > 0:
    
    - 10 是偶数,所以不进入 if 语句。
    - 更新 base:base = (3 * 3) % 100 = 9。
    - 更新 exponent:exponent = 10 / 2 = 5。
3. 再次进入循环,因为 5 > 0:
    
    - 5 是奇数,所以进入 if 语句:result = (1 * 9) % 100 = 9。
    - 更新 base:base = (9 * 9) % 100 = 81。
    - 更新 exponent:exponent = 5 / 2 = 2。
4. 再次进入循环,因为 2 > 0:
    
    - 2 是偶数,所以不进入 if 语句。
    - 更新 base:base = (81 * 81) % 100 = 61。
    - 更新 exponent:exponent = 2 / 2 = 1。
5. 再次进入循环,因为 1 > 0:
    
    - 1 是奇数,所以进入 if 语句:result = (9 * 61) % 100 = 49。
    - 更新 base:base = (61 * 61) % 100 = 21。
    - 更新 exponent:exponent = 1 / 2 = 0。
6. 退出循环,因为 exponent = 0。
    
7. 返回结果 result = 49。
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值