拓展欧几里得解线性同余方程(exgcd)

拓展欧几里得解线性同余方程


裴蜀定理:ax+by=gcd(a,b)必有解

下面用g表示gcd(a,b)
证明:首先,两侧同除g,令a’=a/g,b’=b/g;
则有:ax+by=gcd(a,b) <=> a’x+b’y=1;
(1)根据欧几里得算法,bx+(a%b)y=gcd(a,b)成立
与 ax+by=gcd(a,b)成立 互为充要条件
(2)当欧几里得算法进行到最后一步时,
a=1,b=0,此时令x=1,y=0即构造出一
个特解,使得a’x+b’y=1成立,
(3)对递归过程应用数学归纳法,
证得裴蜀定理成立
证毕


拓展欧几里得算法

上述过程已经给出了解ax+by=gcd(a,b)的方式
解ax+by=gcd(a,b)的算法即为拓展欧几里得算法
代码如下:

il 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-(a/b)*y;
	return d;
}

返回值为gcd(a,b)。
事实上就是模拟了上述过程


解方程ax+by=c

一、具体过程
(1)若g|c:
设c’=c/g,先用拓展欧几里得算法解
ax’+by’=gcd(a,b)
两侧同乘c/gcd(a,b)(即c’)
得到a(x’ * c’) + b(y’ * c’)=c’ *g=c
所以x=x’c’,y=y’c’即为ax+by=c的解
(2)若不满足g|c,则无上述过程,此时
该方程无解

LL a=read_ll(),b=read_ll(),c=read_ll();
		LL gg=exgcd(a,b,xx,yy);
		if(c%gg){
   
			//无解
		}
		LL cc=c/gg;
		xx*=cc,yy*=cc;

其中LL表示long long,read表示快读
二、通解
x=x’c’+kb’ , y=y’c’-ka’表示方程通解
(代入ax+by=c,,kab’-ka’b=0)
其中k取遍整数集合
显然,k越大,x越大,y越小
下面给出计算一些特解的方式:

LL aa=a/gg,bb
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值