exgcd小结

扩展欧几里得算法,顾名思义,是求gcd(a,b)的拓展。

对于ax+by=gcd(a,b)

我们通过此算法求出一组满足条件的x,y

那么,对于ax+by=c,若c%gcd(a,b)==0,则有且有无数组解,否则无解。

//性质:对于未知数(x,y),ax+by=k*gcd(a,b) 
int gcd(int a,int b){
	return !b?a:gcd(b,a%b);
}
int exgcd(int a,int b,int &x1,int &y1){
	if(!b)return x1=1,y1=0,a;
	int d=exgcd(b,a%b,x1,y1);
	int x2=x1,y2=y1;
	x1=y2,y1=x2-a/b*y2;
}
/*
ax1+by1=gcd(a,b)
bx2+(a%b)y2=gcd(b,a%b)

ax1+by1=bx2+(a-a/b*b)y2
ax1+by1=ay2+b(x2-a/b*y2)

x1=y2
y1=x2-a/b*y2
*/
/*
1)求解不定方程:
对于:ax+by=c
若c%gcd(a,b)==0,即c为gcd(a,b)的倍数,则存在解,否则不存在整数解

此时通过exgcd(a,b,x,y)仅仅求出了以下解
ax'+by'=gcd(a,b)
真正的解: 
x=x'*c/gcd(a,b),y=y'*c/gcd(a,b)
要求最小正整数x: 
x=(x'%b+b)%b*c/gcd(a,b)
y同理

2)求逆元
gcd(a,p)=1,贝祖等式ax+py=1存在唯一解
显然x为a的逆元
*/

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值