信息安全试验课遇到的一个问题

最近在学习信息安全试验,偷懒的我,就直接按照书上的算法来写了,根本没有理解算法,但是接连遇到了错误,我开始一直以为是书上算法错了(so arrogant),结果今天单步跟踪了下才发现问题所在,而这个问题其实也是十分典型的。

题目是要求用扩展欧几里得算法求乘法逆元。

首先看下出错地方的算法t1=(u-q*v1)mod m,因为一开始老师要求所有的数据都是unsigned int,所以我压根就没考虑的将所有变量都声明成unsined int,但是书上这里却出现了t1=-13,所以我当机立断改了所有的变量,改成了int,但是结果依然是错的,继续跟踪,还是这个点出错,我这才想起m还是unsigned int的,在求mod的运算的时候前面的-13会被转换成unsigned int类型,也就是INT_MAX-13,用这个数字去求余当然是错的,所以只需要将m改成int类型就可以了,但是调用的时候最好要强制类型转换一下。

下面给出源代码

int Euclid_inv(int a, int m)
{
	// step 1
	int u = 1, g = a, v1 = 0, v3 = m;
	int t3;
	do 
	{
		// step 2
		int q = g / v3;
		t3 = g % v3;
		// step 3
		if (t3 != 0) {
			int t1 = (u - q*v1) % m;
			u = v1;
			g = v3;
			v1 = t1;
			v3 = t3;
		}
		// step 4
	} while (t3 != 0);
	g = v3;
	// step 5
	if (g != 1)
		return 0; // inverse element did not existed
	if (g == 1)
	{
		if (v1 > 0)
			return v1;
		else
			return m + v1;
	}
}

另外这种学习方法很不可取。

你可能感兴趣的:(备忘)