有限域中的乘法逆元

在密码学和安全领域有限域的应用很广。包括大家熟知的欧几里得算法求最大公因子。

本文介绍在有限域中求乘法逆元。包括对于整数和多项式的。利用了扩展的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

你可能感兴趣的:(算法,存储,扩展)