扩展gcd公式推导及其运用

1扩展gcd用于求解方程ax + by = gcd(a,b)的解x0,y0

1.显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;
2.以下式子基于递归性质:
要求ax1+by1=gcd(a,b)的解:
由于gcd(a,b)=gcd(b,a%b)等量代换有:bx2+(a%b)y2=gcd(b,a%b)
而a%b = a- (a/b)*b
所以bx2+(a-(a/b)*b)*y2=gcd(b,a%b)=gcd(a,b)
整理得:ay2+b(x2-(a/b)*y2) = gcd(b,a%b) = gcd(a,b)
而ax1+by1=gcd(a,b)。
所以有x1=y2 , y1=x2-(a/b)*y2。

ll gcd(ll a, ll b){
    return b ? gcd(b, a % b) : a;
}
template<typename T> 
T exgcd(T a,T b,T &x,T &y){//这一层为x1,y1 
	if(b == 0){
		x = 1; y = 0;
		return a;
	}
	T d = exgcd(b, a%b, x, y);//这一层为x2,y2,下面赋值语句后面的都是修改过的值 
	T xt= x;//先存下x2的值,后面会修改 
	x = y;//x1=y2
	y = xt - a / b * y;//y1=x2-a/b*y2
	//此时修改后得到本层的x,y的值 
	return d;
}

2使用扩展欧几里德算法求解不定方程ax + by =  c

结论:对于不定整数方程ax + by = c,若 c mod gcd(a,b) = 0,则该方程存在整数解,否则不存在整数解。 

假设ax +by = gcd(a,b)*c/gcd(a,b)  -> 令c/gcd(a,b)=t   ->  a(x/t) + b(y/t) = gcd(a,b)  -> 

假设,方程ax + by =gcd(a,b) 的解为x0,y0,

那么ax + by = c 的解为 x=tx0,y=ty0

3解同余方程ax \equiv b (mod m)

设余数为r,

ax = k1m+r, 变形得ax-k1m-r=0

b=k2m+r, k2m+r=b

两式子相加得ax+(k2-k1)m=b,从而转换为问题2:ax + by =  c

设ax + my=gcd(a,m)的解为x0,y0,t=b/gcd(a,m)

x = tx0 , y= ty0

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值