方法一:
利用模等式
(a×b)mod p = (a mod p × b mod p)mod p
2k mod p = (2k-1 mod p) × 2 mod p
2k-1 mod p = (2k-2 mod p) × 2 mod p
2k-2 mod p = (2k-3 mod p) × 2 mod p
2k-3 mod p = (2k-4 mod p) × 2 mod p
…
22 mod p = (21 mod p) × 2 mod p
int P_Mod(int a, int b, int p)
{
int result = 1;
for (int i = 0; i < b; i++){
result = result * a % p;
}
return result;
}
方法二:
逐次平方法(计算次数较多时)
利用二进制展开指数,同理:
(a×b)mod p = (a mod p × b mod p)mod p
7327 (mod 853) = 7256 × 764 × 74 × 72 × 71 (mod 853)
= 298 × 123 × 695 × 49 × 7 (mod 853)
int P_Mod(int a, int b, int p)
{
int result = 1;
while (b) {
if (b & 1){
result = result * a % p;
}
a = a * a % p;
b >>= 1;
}
return result;
}