在看密码学的书时遇到的问题,求阶为p的有限域的乘法逆元。 GF(p)的概念就不讲了。乘法逆元么可以这样说,a关于m的乘法逆元就是使等式:a·b = 1 (mod m) ,成立的b。 开始我想要么就强搜,也用不了一次遍历。后来看了书上更简单的方法,运用的是辗转相除的思想,巧妙的进行方程的转化,过程是这样的。
1(A1, A2, A3) <- (1, 0, M); (B1, B2, B3)<-(0, 1, B) 2if B3 = 0 return A3 = gcd(m, b); no inverse 3if B3 = 1 return B3 = gcd(m, b); B2 = b` mod m 4Q = 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`了。
|