在密码学和安全领域有限域的应用很广。包括大家熟知的欧几里得算法求最大公因子。
本文介绍在有限域中求乘法逆元。包括对于整数和多项式的。利用了扩展的Euclid算法。有伟大的高德纳提出。
1. 乘法逆元w' :任意的w属于Zp, w!=0,存在z属于Zp使得w*z==1 (mod p);
举例如下:求5关于mod 14 的乘法逆元。5*3 == 1 (mod 14);所以5的模14乘法逆元为3;
2. 整数的乘法逆元
扩展的Euclid算法流程:
1. (A1,A2,A3) = (1,0,m); (B1,B2,B3)=(0,1,b)
2. if B3==0 return no inverse;
3. if B3==1 return b2;
4.Q=A2/B3;
5.(T1,T2,T3)=(A1-Q*B1, A2-Q*B2, A3-Q*B3);
6.(A1,A2,A3)=(B1,B2,B3)
7.(B1,B2,B3)=(T1,T2,T3)
8.goto2
代码:
int gcd(int a, int b){ if(a < b){ a ^= b; b ^= a; a ^= b; } while(b != 0){ int temp = a; a = b; b = temp % b; } return a; } //扩展欧几里得求b在GF(m)下的乘法逆元 b和m只有互质才有逆元。 int Euclid(int m, int b){ int A[4]; A[1] = 1; A[2] = 0; A[3] = m; int B[4]; B[1] = 0; B[2] = 1; B[3] = b; while(true){ if(0 == B[3]){ cout << "没有逆元" << endl; return gcd(m, b); } else if(1 == B[3]){ cout << "逆元:" << B[2] << endl;; return B[2]; } int quotient = A[3] / B[3]; int T[4]; T[1] = A[1] - quotient * B[1]; T[2] = A[2] - quotient * B[2]; T[3] = A[3] - quotient * B[3]; A[1] = B[1]; A[2] = B[2]; A[3] = B[3]; B[1] = T[1]; B[2] = T[2]; B[3] = T[3]; } return 0; } int main(){ Euclid(14, 5); Euclid(8, 4); }
3.多项式乘法逆元
多项式的乘法逆元原理和整数乘法逆元求法原理一致,只是此时操作的是多项式而已。
方法一:实现多项式的加减乘除
方法二:利用整数(二进制位)来模拟多项式的加减乘除。此方法也是最巧妙最简单最合适的方法。
比如:x^8+x^4+x^3+x+1 用二进制来描述:100011011 可以当做整数283来存储。
那么大家仔细想想,两个多项式乘法,多项式加法不就是直接对这个整数或乘或加。除法也就是稍复杂一点而已。第一次发现居然可以用整数来模拟多项式的计算。非常长见识!受用。
参考:http://blog.csdn.net/wjh200821/article/details/7570573