数论(求逆元)

在密码学中我们经常需要用到逆元,尤其在RSA公钥密码体制中。下面简介一下求逆元的通用方法,广义欧几里得除法的逆运算。
如果a,m互素的话,那么根据欧几里得除法,最终会得到余数为1,此时我们可以消去中间变量,最终得到sa+tm=(a,m)=1,两边同时除以m可以得到sa=1(mod m),显而易见可以得到s是a模m的逆元。
求逆元步骤就分为两部:1.判断a,m是否互素;2.根据广义欧几里得除法计算逆元,即s。
引用我们上课的PPT
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过上面的方法逐层迭代,可以求得最后的sa+tm=1,最后我们让左右两边同时模m,得到sa=1(mod m),那么根据乘法逆元的定义,可以得到s即为a模m下的逆元,即上图中a的逆元是193,下面上代码,我用的是递归的思想,自底向上进行递归

#include <iostream>
using namespace std;
int x=0,y=0;
//fun1用来判断两个数是否互素
bool fun1(int a,int m)
{
	int r1,r2,r3;
	if(a>m)
	{
		r1=a;
		r2=m;
	}
	else
	{
		r1=m;
		r2=a;
	}
	r3=-1;
	while(r3!=0)
	{
		r3=r1%r2;
		r1=r2;
		r2=r3;
	//	cout<<r1<<" "<<r2<<" "<<r3<<endl;
	}
	if(r1==1)return false;
	else return true;
}
void fun2(int a,int m)
{
	int r1,r2,r3;
	if(a>m){r1=a;r2=m;}
	else {r1=m;r2=a;}
	if(r1%r2==1)
	{
		x=1;
		y=-(r1/r2);
		return;
	}
	//先求底层的结果,得到底层的x和y值
	fun2(r2,r1%r2);
	//然后迭代本层次的x和y系数值
	int temp=x;
	x=y;
	y=temp-y*(r1/r2);
}
int main()
{
	int a,m;
	while(cin>>a>>m&&a!=0)
	{
	if(!fun1(a,m))
	{
		fun2(a,m);
	}
	else
	{
		cout<<"不互素"<<endl;
		continue;
	}
	if(a>m)cout<<x<<endl;else cout<<y<<endl; 
	}
	return 0;
}

--------------------需要详细解释的私信1124397151@qq.com---------------------------

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值