《清明》
杜牧
清明时节雨纷纷,路上行人欲断魂。
借问酒家何处有,牧童遥指杏花村。
今天遇到一个问题就是关于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));
}
三、实现结果: