扩展欧几里得算法与其应用

扩展欧几里得的证明及其算法

定理:对于任意一对整数a,b,一定存在x,y使得ax+by=gcd(a,b)

证明:假设a>b。

1.若b=0,一定存在x=1,y=0,使得ax+by=gcd(a,b)

2.若b>0,假设存在bx+(a%b)y=gcd(b,a%b),那么也存在bx+(a%b)y=gcd(a,b)

又因为bx+(a-b*(a/b))y=gcd(a,b)=ax+by,所以整理得到:ay+b*(x-(a/b)y)=gcd(a,b)

所以令x'=y,y'=x-(a/b)y,就可以得到ax'+by'=gcd(a,b)

那么在知道a,b的情况下,我们就可以用递归的方式得到x,y

当然这是一组特解。通解是:x=x0+k*(b/d),y=y0+k*(a/d) (其中d=gcd(a,b),x0 y0 是一组特解)

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

推广一下:如何解一个不定方程。

首先,所有的不定方程ax+by=c若是有解,一定满足gcd(a,b)|c。(小学生都知道吧。。。)

通解就是:我们可以把2边都除以d=gcd(a,b),得到等价方程(a/d)x+(b/d)y=(c/d),然后用扩展欧几里得到(a/d)x+(b/d)y=1的解。(因为gcd(a/d,b/d)=1)x1,y1,那么通解就是c*(x1+k*(b/d)),c*(y1-k*(a/d))。

当然也可以写成这样:x=(c/d)x0+k*(b/d),y=(c/d)y0-k*(a/d),其中x0,y0是ax+by=gcd(a,b)的一组特解。

解线性同余方程

给定a,b,m,求x满足a*x%m=b%m。因为未知数的系数是1,所以称之为线性同余方程。

a*x-b一定是m的倍数,不妨设为-y倍。得到:a*x+m*y=b。有扩展欧几里得得到:gcd(a,m)|b。

若是有解,那么就先解决:a*x+m*y=gcd(a,m),得到一组特解x0,y0,因为我们并不关心y是啥,所以只需要x0正确即可。

那对于原方程的解就是:x=x0/gcd(a,m)*b

通解:x+k*(m/d),d=gcd(a,m)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值