0830-扩展欧几里得算法+例题

博客内容介绍了扩展欧几里得算法的简单理解和代码实现,通过递归过程找到方程ax - by = 1的解,并提供了例题分析及代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

phew~终于看懂了,以前一直以为很高深很高深的算法,结果还是很简单嘛

-->参考资料<--

证明什么的大家都写的很好啊,蒟蒻就不再bibi了,在这里解释一下代码吧,我看了好多博客都只讲了思路和证明,像宝宝这种代码能力不强的就只好自己想想想想想

void exgcd(int a,int b,int &x,int &y)
{
	if(b==0)
	{
		x=1;
		y=0;
		return;
	}
	exgcd(b,a%b,y,x);
	y-=a/b*x;
}

由于推导出来:

若 b\neq 0 ,那么那么 gcd(a,b)=gcd(b,a \; mod\; b)

我们可以找出一组 

### 使用扩展欧几里得算法求解逆元 当给定两个整数 \(a\) 和 \(m\) 并希望找到满足条件 \( ax \equiv 1 (\text{mod}\ m)\) 的 \(x\) 值时,可以利用扩展欧几里得算法来解决这个问题。该算法不仅能够计算最大公约数 (gcd),还能找出一对整数 \(x\) 和 \(y\) 使得 \(ax + by = gcd(a, b)\)[^1]。 对于求解模 \(m\) 下的乘法逆元而言,如果 \(gcd(a,m)=1\) 成立,则存在唯一的 \(x\) 满足上述同余关系;此时 \(x\) 即为所需求的逆元[^2]。 #### 示例题目解释 假设现在要找的是在模 \(8\) 条件下的 \(3\) 的逆元: 由于 \(gcd(3,8)=1\), 故可应用扩展欧几里得算法得到如下过程: 通过执行辗转相除法直到余数为零为止,并记录每一步的结果用于回代求解系数\(x,y\) : \[ \begin{align*} &8=3\times2+2\\ &3=2\times1+1\\ &2=1\times2+0 \\ \end{align*} \] 接着从最后一行开始向上逐步替换表达式中的被除项直至最上面一行完成整个方程式的转换工作: \[ \begin{align*} &1=3-(2\times1)\\ &=3-[8-(3\times2)]\times1\\ &=(3\times3)-(8\times1) \end{align*} \] 因此,在此情况下我们找到了一组特解 \(x_0=3,\ y_0=-1\) ,即有 \(3\times3-8\times(-1)=1\) 。所以在这个例子中,\(3\) 关于模 \(8\) 的逆元就是 \(3\) 自身[^3]。 ```cpp // C++ code to demonstrate Extended Euclidean Algorithm for finding modular inverse. #include <iostream> using namespace std; int extendedEuclid(int a, int b, int *x, int *y){ if(b==0){ *x = 1; *y = 0; return a; // returns GCD of 'a' and 'b' }else{ int r = extendedEuclid(b,a%b,x,y); int t=*x; *x=*y; *y=t-a/b**y; return r; } } void findModInverse(int A,int M){ int x,y,gcd; gcd=extendedEuclid(A,M,&x,&y); if(gcd!=1){cout<<"No solution exists";return;} cout<<(M+x%M)%M<<endl;// Ensure the result is positive } int main(){ int a=3,m=8; findModInverse(a,m); return 0; } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值