「学习笔记」扩展欧几里得定理与线性同余方程

扩展欧几里得算法#

介绍#

扩展欧几里得算法,常用来求像 ax+by=c 这样的不定方程的一组可行解

解法#

在此之前,我们可以确定 c 一定是 gcd(a,b) 的倍数。
为什么?我们把原式分解一下
ax+by 分解后,是gcd(a,b)mx+gcd(a,b)ny
其中
gcd(a,b)m=agcd(a,b)n=b
所以,c 一定是 gcd(a,b) 的倍数
这道题转而可以转化成 ax1+by1=gcd(a,b)
其中
ax1=agcd(a,b)cby1=bgcd(a,b)c
由欧几里得定理可以得知
gcd(a,b)=gcd(b,amodb)
所以 ax1+by1=gcd(a,b) 可以转化为 bx2+(amodb)y2=gcd(b,amodb)
又因为 gcd(a,b)=gcd(b,amodb)
所以 ax1+by1=bx2+(amodb)y2
又因为amodb=a(ab×b)
所以 bx2+(amodb)y2=bx2+(a(ab)×b)y2
合并同类项得 ay2+b(x2aby2)
又因为 a=a,b=b
所以 x1=y2,y1=x2aby2
x2,y2 不断带入递归,直到有返回值后在进行计算

代码#

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

同余方程#

类似于 axc(mody) 这样的方程就是同余方程。
我们可以将同余方程转化为不定方程 ax+by=c,通过扩展欧几里得算法解得特解 x0,y0
则 我们可以得到通解

{x=x0+bgcd(a,b)t;y=y0agcd(a,b)t;

正确性?
你带入看看式子是否成立即可。

作者:yifan0305

出处:https://www.cnblogs.com/yifan0305/p/16684849.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载时还请标明出处哟!

posted @   yi_fan0305  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示