快速幂算法

快速幂算法在求解大数乘法时显著提高效率,通过二进制分解B并利用指数运算的性质,实现从O(n)到O(logn)的时间复杂度。在处理可能溢出的情况时,可以通过模运算避免。文章还提到了处理更大规模问题的两种方法:欧拉定理的快速幂和n进制快速幂。
摘要由CSDN通过智能技术生成

快速幂算法通常用在求  A^B%C 的时候,因为当B足够大的时候 n与logn 的差距就非常巨大了。并且B十分巨大的时候通常我们已经存不下这个数值了。所以一般要对一个C 取模。

普通n个a相乘复杂度为O(n),快速幂由于是用二进制分开计算并且每次的值在下次计算的时候都会重复利用 所以复杂度为O(logn)。

 

  1.  首先假设 B 化为2进制为 a1 + b2 + c4 + d8 + E16 ……………………  所以 A^B = A^(a1)*A^(b2)*………    这里我们先拿小点的数字做个假设吧。  B=13 A=13; 那么  13^13 = 13 + 13^4 + 13^8  那么这些abcd是怎么确定的呢?
  2. 我们可以用到与运算来计算b在某位是否存在。如果存在的话即   b&1 ==1  并且每次操作 将b右移一位。这个时候再将a*a 得到a^2  ,重复该操作将会得到a^4 8次方。如果某位存在的话,将其与当前的a相乘,得到值。
  3. 既然B十分大,那么有可能会产生a的2^n次方时比 long long 还大。这时就会溢出。所以这个时候可以用加法来模拟乘法。并且每次相加都对C取模,这样就不会溢出了。

 

 

 

      

#include<iostream>
using namespace std;
typedef long long ll;
ll quickadd(ll a,ll b ,ll mod)//模拟加法
{
    ll res=0;
    while(b>0)
    {
  
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值