本文实现使用快速幂算法求模幂
定义有限域 G F ( p ) GF(p) GF(p), 要求域内元素的幂,即计算 c = a b m o d p c=a^b\ mod\ p c=ab mod p。
快速幂算法
要求
c
=
a
b
m
o
d
p
c=a^b\ mod\ p
c=ab mod p,首先我们将
b
b
b 用二进制表示
b
=
(
b
n
.
.
.
b
1
b
0
)
2
b=(b_n...b_1b_0)_2
b=(bn...b1b0)2。
那么,
b
=
b
n
2
n
+
.
.
.
+
b
1
2
1
+
b
0
2
0
b=b_n2^n+...+b_12^1+b_02^0
b=bn2n+...+b121+b020。
c
=
a
b
m
o
d
p
=
a
b
n
2
n
+
.
.
.
+
b
1
2
1
+
b
0
2
0
m
o
d
p
c=a^b\ mod\ p=a^{b_n2^n+...+b_12^1+b_02^0}\ mod\ p
c=ab mod p=abn2n+...+b121+b020 mod p
当
b
i
=
0
b_i=0
bi=0时,
a
b
i
2
i
a^{b_i2^i}
abi2i项为无效项。
当
b
i
=
1
b_i=1
bi=1时,
a
b
i
2
i
a^{b_i2^i}
abi2i项才为有效项。
因此,只要判断b的二进制位的每一位是否为有效位即可求出幂。
实现代码
int power(int a, int b, int p)
{
int c = 1;
a = a % p;
while(b > 0){
if(b%2 == 1)
c = (c*a) % p;
b = b / 2;
a = (a*a) % p;
}
return c;
}