扩展欧几里得算法-复习

求解二元一次方程

问题

希望求出 ax+by=c 形式的二元一次不定方程的一组整数解。

思路点拨

首先,这样的方程不一定有正整数解。比如 6x+12y=5

判定

定义:设 a,b 是不为 0 的整数,那么一定存在整数 x,y ,满足 ax+by=gcd(a,b)

证明:

1.若任何一个等于 0 ,则 (a,b)=a ,这是定理显然成立。

  1. a,b 不等于 0 ,设 a,b>0,ba,(a,b)=d

对于 ax+by=d ,两端同除以 d ,可得 a1x+b1y=d 。并且 (a1,b1)=1 。我们只考虑对于 (a,b)=1 的二元组 (a,b) ,满足裴蜀定理。

我们考虑辗转相除法(本质上是优化的更相减损术的优化,上已证明),就是 (a,b)=(b,amodb) 一直不断推出来的。我们设余数为 r ,有

(a,b)=(b,r1)=(r1,r2)=...=(rn1,rn)

我们算法展开成带余数除法的形式:

a=q1b+r1

b=q2r1+r2

r1=q3r2+r3

...

rn3=qn1rm2+rn1

rn2=qnrn1+rn

rn1=qn+1rn

我们令辗转相除法运行知道互质的时候推出 rn=1 ,所以有:

rn2=qnrn1+1

移项,得:

1=rn2qnrn1

那么我们将 rn1=rn3qn1rn2 带入上式,得:

1=(1+qnqm1)rn2xnrn3

我们可以不断消除 rn2r1 。最终得出 1=ax+by 。得证。

所以 ax+by=c 需要满足 gcd(a,b)|c

求解

我们考虑求解 ax+by=gcd(a,b) ,最后只需要将 x,y 同乘上 cgcd(a,b) 即可。

对于 ax+by=gcd(a,b) ,考虑另一个方程 bx0+(amodb)y0=gcd(a,b) 。这个方程等价于

bx0+(aabb)y0=gcd(a,b)

ay0+b(x0aby0)=gcd(a,b)

ax+by=gcd(a,b) 中,我们令 x=y0,y=x0aby0 ,我们就发现这等价于第二个方程。所以如果我们求出 bx0+(amodb)y0=gcd(a,b), 就可以推出 ax+by=gcd(a,b) 的一组解。

我们考虑在欧几里得算法的过程中,一直如此递归最终可以得出方程 ax=a ,得到 x=1,y=0 。一直往上顺推回去,得到原方程的一组解。

int exgcd(int a,int b,int &x,int &y){
	if(!b){
		x=1,y=0;
		return a;
	}
	int ans=exgcd(b,a%b,y,x);
	y-=(a/b)*x;
	return ans;
}
posted @   Diavolo-Kuang  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示