《清明》

                                                                        杜牧

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

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

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

一、原理

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

                                               证明

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

 

然后就是降低指数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));
}

三、实现结果:

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

 

 

    

 

 

相关文章:

  • 2021-09-27
  • 2021-12-03
  • 2021-09-17
  • 2019-08-14
  • 2020-04-14
  • 2022-01-18
  • 2019-08-01
猜你喜欢
  • 2021-12-03
  • 2021-10-06
  • 2021-10-06
  • 2021-12-03
  • 2021-11-23
  • 2018-06-08
  • 2021-12-03
  • 2021-12-03
相关资源
相似解决方案