算法--快速幂(a^b mod n)

本文介绍了一种高效计算大数幂取模的方法——快速幂算法。通过不断分解指数并利用模运算的性质,有效避免了数据溢出的问题。文章提供了详细的算法原理及C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                    《清明》

                                                                        杜牧

                                                    清明时节雨纷纷,路上行人欲断魂。

                                                   借问酒家何处有,牧童遥指杏花村。

今天遇到一个问题就是关于A^B mod n。一开始想那就直接for循环然后取模不就可以了,但是如果A,B,n是很大的数呢。那样的话就会造成数据的溢出。所以就用到了快速幂

一、原理

首先用到公式  a^b mod c=(a mod c)^b mod c  这样一来就降低了a的规模

                                               证明

 

然后就是降低指数b的规模。根据指数的性质我们可以试着将b分解:

当b为偶数的时候    a^b mod c=(a*a)^(b/2)mod c

当b为奇数的时候  a^b modc=((a*a)^(b/2)*a)mod c

那么就相当于(k)^b/2  mod c或者((k)^(b/2)*a)  mod c ,就实现了不断降低指数B 的规模

二、代码实现

#include<iostream>
#include<string>
#include<cmath>
#include<cstdio>
#include<stdio.h>
using namespace std;
int mod(long  long a,long long b,long long c)
{
    int sum=1;
    a=a%c;
    while(b)
    {

        if(b & 1)//如果b为奇数,那么结果就应该乘上一个a
            sum=(sum*a)%c;
        a=(a*a)%c;//这里就是相当于把指数b不断分解,进而降低规模
        b=b>>1;//就是除2
    }
    return sum;
}
int main(int argc,char *argv)
{
    long long  a,b,c;//大整数2^64位数
    cout<<"please input like A^Bmod N 's A B N"<<endl;
    while(scanf("%lld%lld%lld",&a,&b,&c)!=EOF)
        printf("This lase result is  %d\n",mod(a,b,c));
}

三、实现结果:

 

 

    

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值