在看密码学的书时遇到的问题,求阶为p的有限域的乘法逆元。
GF(p)的概念就不讲了。乘法逆元么可以这样说,a关于m的乘法逆元就是使等式:a·b = 1 (mod m) ,成立的b。
开始我想要么就强搜,也用不了一次遍历。后来看了书上更简单的方法,运用的是辗转相除的思想,巧妙的进行方程的转化,过程是这样的。
1(A1, A2, A3) <- (10, M); (B1, B2, B3)<-(01, B)
2if B3 = 0 return A3 = gcd(m, b); no inverse
3if B3 = 1 return B3 = gcd(m, b); B2 = b` mod m
4= A3 / B3
5(T1, T2, T3) <- (A1-QB1, A2-QB2, A3-QB3)
6(A1, A2, A3) <- (B1, B2, B3)
7(B1, B2, B3) <- (T1, T2, T3)
8goto 2
其中A3和B3是gcd进行操作的主要参数。注意到求乘法逆元,那么m和b肯定互质。那么最后有gcd(m, b)=1,即B3=0,并且A3=1。因此在上一步有B3=1,那么:
mB1 + bB2 = B3
mB1 + bB2 =1
   bB2 = 1 - mB1
   bB2 = 1 (mod m)
所以此时的B2就为b的乘法逆元,全部过程利用辗转相除自然简化了不少。
推广一下可以求出b`,使bb` = k (mod m),其中k为小余m的任意数。很简单,只要继续沿着此方法,算出bB2 = 1 (mod m)中的B2之后再乘以一个k (mod m)就是b`了。