模幂算法

Posted xcb-1024day

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模幂算法相关的知识,希望对你有一定的参考价值。

//
//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;

 

以上是关于模幂算法的主要内容,如果未能解决你的问题,请参考以下文章

模幂运算问题,使用朴素算法和重复-平方算法(快速幂+C#计算程序运行时间)

欧几里得算法解决 RR' - NN' = 1. 使用蒙哥马利算法进行模幂运算以在 python 或 Petite Chez 方案中实现费马检验

模幂运算

C++ 中高数的模幂运算

C++ 中高数的模幂运算

《夜深人静写算法》数论篇 - (13) 二分快速幂