模幂运算是对给定的整数p 、n 、a,计算,该运算在密码学中应用极为普遍,RSA、ELGamal、DH交换等重要密码方案都涉及模幂运算。
算法原理:
快速实现模幂运算的基本原理是模重复平方计算法,其理论基础是模运算的基本性质,即相乘与求模两个运算是可交换的。
算法步骤:
(1)将 n 表示为二进制, ,用一个数组保存 n 的各个数位,n 共有 r+1 位
(2)循环计算(用数组b保存所有中间结果):先循环计算一系列结果:,
,.... ,再把指数 n 的二进制表示中取值为1的位对应的a 的幂相乘,即可得到最终结果。
c++代码:
#include <iostream>
using namespace std;
int main()
{
int n, a, p;
int nn[30], aa[30], bb[30];
cout << "Please input a and n :";
cin >> a;
cin >> n;
cout << "Input a prime, p = ";
cin >> p;
cout << endl;
int temp, num, r;
int i = 0;
temp = n;
while (temp != 0) {
num = temp % 2;
nn[i] = num;
i++;
temp = temp / 2;
}
r = i - 1;
aa[0] = a;
bb[0] = a;
for (i = 0; i < n; i++) {
aa[i + 1] = (aa[i] * aa[i]) % p;
bb[i + 1] = aa[i + 1];
}
int x;
x = 1;
for (i = 0; i <= r; i++) {
if (nn[i] == 1) x = (x * bb[i]) % p;
}
cout << "the result is :";
cout << x << endl;
return 0;
}
运行结果:
模幂运算的应用
费马定理和欧拉定理是初等数论中非常重要的定理,它们与密码学关系极为密切。
费马定理:若 p 为素数,则对任意不整除 p 的整数a,有
欧拉定理:对任意整数a, n ,当gcd(a, n) = 1时,有