这里有另一种方法。记住,当我们在模 m
下找到 a
的 模乘法逆元
时。
a 和 m 必须互质。
我们可以使用 gcd 扩展算法
来计算 模乘法逆元
。
当 a
和 b
可以有超过 105 位数时,计算 ab mod m 的结果会比较棘手。
下面的代码将完成计算部分:
#include <iostream>
#include <string>
using namespace std;
long pow(string,string,long long);
long pow(long long ,long long ,long long);
int main() {
string _num,_pow;
long long _mod;
cin>>_num>>_pow>>_mod;
cout<<pow(_num,_pow,_mod)<<endl;
return 0;
}
long pow(string n,string p,long long mod){
long long num=0,_pow=0;
for(char c: n){
num=(num*10+c-48)%mod;
}
for(char c: p){
_pow=(_pow*10+c-48)%(mod-1);
}
return pow(num,_pow,mod);
}
long pow(long long a,long long p,long long mod){
long res=1;
if(a==0)return 0;
while(p>0){
if((p&1)==0){
p/=2;
a=(a*a)%mod;
}
else{
p--;
res=(res*a)%mod;
}
}
return res;
}
这段代码之所以有效,是因为 ab mod m 可以写成 (a mod m)b mod m-1 mod m。
希望它有帮助 { :)
if
语句中需要使用% 2
而不是% n
。 - Lol4t0int
溢出了,但是 64 位类型已经足够了。然而,如果你真的要使用 RSA,你需要大整数,gmp
是一个选择(并且具有模幂)。 - Daniel Fischer