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