求两个整数模的逆元

#include<iostream.h>
//using namespace std;
int gmod(int a,int b);   //这儿要加声明,大概是因为gomd在main函数后面,所以得在main函数前面声明一个吧
int main()
{
	int x,y;
	cout<<"请输入两个整数:"<<endl;
    cin>>x>>y;
	int su=gmod(x,y);
	if(su==0)
		cout<<x<<"和"<<y<<"不互素!"<<endl;
	else
	    cout<<x<<"和"<<y<<"模的逆元是:"<<su<<endl;
    return 0;


}
int gmod(int a,int b)           //求两个整数模的逆元
{
	int s0=1,s1=0,t0=0,t1=1;        //对s1,s0,t1,t0进行初始化
	int bb=b;                       //保留b的初值
	if(a==1)
		return 1;
	if(a%b==0)
		return 0;                   //若a,b不互素,直接返回0
	int q,r,s,t;                    //声明辗转反除法需要用到的整数
	while(b%a!=0)                   //直到a%b等于1才结束while
	{
		q=b/a;
		r=b%a;

		b=a;
		a=r;

		s=s0-q*s1;
		s0=s1;
		s1=s;

		t=t0-q*t1;
		t0=t1;
		t1=t;
	}
	if(t>0)
		return t;
	else
		return t+bb;
}



### 使用扩展欧几里得算法逆元 对于给定的两个整数 \( a \) 和 \( m \),如果存在一个整数 \( x \),使得: \[ ax ≡ 1 (\text{mod}\ m) \] 那么 \( x \) 就被称为 \( a \) 关于 \( m \) 的乘法逆元。为了找到这样的 \( x \),可以利用扩展欧几里得算法解决这个问题。 #### 理论基础 当且仅当 \( gcd(a,m)=1 \) 即 \( a \) 和 \( m \) 是互质的情况下,\( a \) 对于 \( m \) 存在一个唯一的乘法逆元[^3]。这是因为只有在这种情况下才有可能找到一对整数 \( x \) 和 \( y \),满足如下关系: \[ ax + my = 1 \] 这实际上是一个线性丢番图方程的形式,而寻找该方程的一组特解正是扩展欧几里得算法的核心应用之一[^2]。 #### 实现过程 下面给出一段 Python 代码作为例子展示如何使用扩展欧几里得算法计算逆元: ```python def extended_gcd(a, b): if a == 0 : return b,0,1 gcd,x1,y1 = extended_gcd(b%a, a) x = y1 - (b//a) * x1 y = x1 return gcd,x,y def mod_inverse(a, m): gcd, x, _ = extended_gcd(a, m) if gcd != 1: raise ValueError('Modular inverse does not exist') else: return x % m ``` 这段程序定义了一个 `extended_gcd` 函数用于执行扩展欧几里得算法,并返回最大公因数以及对应的系数;另一个函数 `mod_inverse` 则用来获取指定数值相对于某个数下的乘法逆元[^5]。 #### 应用场景 在密码学领域内,特别是在RSA加密体制中经常需要用到大素数之间的运算及其相应的逆元操作。此外,在处理分数取问题时也常会遇到需要解除法的结果的情况,这时就可以借助乘法逆元来间接完成除法的操作[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值