一.实验目的
熟悉求解乘法逆元的算法。在此基础上,选择一种算法,通过运用高级程序设计语言,设计并实现一个计算乘法逆元运算器。
二.实验原理
【定义】对于整数a,m,如果存在整数b,满足ab mod m =1,则称b为a模m的乘法逆元,记为a-1。
【定理】a存在模m的乘法逆元的充要条件是a和m的最大公约数为1,记为gcd(a,m)=1。
由定理可知,当a与m互素时,a模m的乘法逆元有唯一解。如果a与m不互素,则a模m 的乘法逆元a不存在。显然,如果a为素数,则1~a-1的任意整数都与a互素,即1~a-1的任意整数都有模m的乘法逆元存在。
扩展欧几里得(Extended Euclid)算法是求解乘法逆元的常用方法。欧几里得(Euclid)算法用于计算两个整数的最大公约数,其原理是反复利用带余除法,直至余数为0时为止。两个整数的最大公约数可以用这两个整数的整系数线性组合的方式表示,扩展欧几里得算法就是计算整数线性组合当中的系数,即计算gcd (a, m)- sNa+lNm中的整数sN
lN。扩展欧几里得算法除了可用于求解两个整数的最大公约数外,还可以用于求解乘法逆元a-1。
三.实验步骤
Matlab实现如下:
u = 1;%%u=1,g=a,v1=0,v3=m
a=input("输入a:\n");
g = a;
v1 = 0;
m=input("输入m:\n");
v3 = m;
q = int16(g / v3);%%计算q=g/v3,t3=g%v3
t3 = mod(g, v3);
if(t3 == 0 )%%如果t3等于0则直接执行以下判断
g = v3;
if(g == 1)
if(v1 > 0)
fprintf(a+"mod"+m+"的乘法逆元为fir:"+v1);
else
fprintf(a+"mod"+m+"的乘法逆元为sed:"+(m+v1));
end
else
fprintf(a+"mod"+m+"的乘法逆元不存在");
end
else
while (true)%%如果t3不等于0,则进行循环计算直至t3等于0
t1 = rem(u -( q * v1),m);%%计算t1=(u-q*v1)modm,u=v1,g=v3,v1=t1,v3=t3
u = v1;
g = v3;
v1 = t1;
v3 = t3;
q =floor( g / v3);
t3 = rem(g , v3);
if(t3 == 0 )
g = v3;
if(g == 1)%%如果g=1,
if(v1 > 0)%%当v1>0时返回v1,否则返回m+v1
fprintf(a+"mod"+m+"的乘法逆元为th:"+v1+"\n");
break;
else
fprintf(a+"mod"+m+"的乘法逆元为fo:"+(m+v1)+"\n");
break;
end
else%%g不等于1时返回乘法逆元不存在
fprintf(a+"mod"+m+"的乘法逆元不存在\n");
break;
end
end
end
end
运行结果
四.实验总结
求解乘法逆元的问题在现代密码学中有着充分的应用,尤其是现代公钥密码体制(例加RSA算法)的加密和解密过程通常会涉及求解乘法逆元的问题。因此,掌握求解乘法逆元的算法对于学习现代密码学有着重要的现实意义。