模幂算法

//
//712的n次方,结果后三位为696,满足这个条件的n的个数为多少?(0  < n < 24767)
//这是一个典型的模幂算法问题,下面证明 : (a * b) % n = [(a % n) * (b % n)] % n  (把*换成 + 也成立)
// 设 a = k1*n + r1, b = k2*n + r2,
// 于是有 :
//(a * b) % n = (k1*k2*n*n + k1 * r2 * n + k2 * r1 * n + r1 * r2) % n = (r1 * r2) % n = [(a % n) * (b % n)] % n.
//根据上面证明有(a^b) % n = ((a%n) * (a ^ (b - 1)) % n) % n          ==696;
//下面给出模幂运算的递归和非递归代码:
#include<iostream>
using namespace std;

int getMod1(int a, int b, int n) //712*712*712*712*712*712*712*712。。。。。 a^b%n
{
if (0 == b)
return 1;
return (a % n * getMod1(a, b - 1, n)) % n;
}

int getMod2(int a, int b, int n) // a:712 b:712的次方数 n:1000,模n后剩余后三位数字
{
int i, r = 1;
for (i = 1; i <= b; i++)
{
r = ((r % n) * (a % n)) % n;
}
return r;
}

int main()
{
int a = 3;
int b = 4;
int n = 5;
cout << getMod1(a, b, n) << endl; //81%5=1
cout << getMod2(a, b, n) << endl;

int i, r, sum = 0;
a = 712;
n = 1000;
r = 696;
for (i = 1; i < 24767; i++)
if (r == getMod2(a, i, n))
sum++;
cout << sum << endl;

return 0;
}

原文地址:https://www.cnblogs.com/xcb-1024day/p/11334804.html