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

来源:互联网 发布:淘宝超级店长软件 编辑:程序博客网 时间:2024/06/04 23:26

最近在学习信息安全试验,偷懒的我,就直接按照书上的算法来写了,根本没有理解算法,但是接连遇到了错误,我开始一直以为是书上算法错了(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 1int u = 1, g = a, v1 = 0, v3 = m;int t3;do {// step 2int q = g / v3;t3 = g % v3;// step 3if (t3 != 0) {int t1 = (u - q*v1) % m;u = v1;g = v3;v1 = t1;v3 = t3;}// step 4} while (t3 != 0);g = v3;// step 5if (g != 1)return 0; // inverse element did not existedif (g == 1){if (v1 > 0)return v1;elsereturn m + v1;}}

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

0 0
原创粉丝点击