扩展欧几里得

GCD
定义
欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数。

结论与证明
对于a,b两个正整数(a>b),gcd(a,b)=gcd(a,a mod b)gcd(a,b)=gcd(a,a mod b)。 
gcd(a,b)gcd(a,b)即为a与b的最大公约数。

下面给出证明:

设a=kb+ra=kb+r,d是a,b的一个公约数。 
∵r=a−kb∵r=a−kb,两边同时除以d得 
r/d=a/d−kb/d=mr/d=a/d−kb/d=m 
易得m为整数。 
∴r=md∴r=md,即d也是r的一个约数。 
所以a,b与b,a%b的公约数是一样的。 
因此gcd(a,b)=gcd(b,a mod b)gcd(a,b)=gcd(b,a mod b)。 
证毕。


接下来是扩展欧几里得的思路:

设a>b≥0。 
当b=0时,显然gcd(a,b)=a。此时x=1,y=0。 

当b>0时, 
设ax1+by1=gcd(a,b)                  bx2+(a mod b)y2=gcd(b,a mod b)
根据gcd(a,b)=gcd(b,a mod b),得 
ax1+by1=bx2+(a mod b)y2

根据a mod b=a−[a/b] ,展开后合并同类项得:

ax1+by1=ay2+b(x2−[a/b]y2)  

x1=y2,y1=x2−[a/b]y2.

即:

int exgcd(int a,int b,int &x,int &y){
	if(b==0){
		x=1;
		y=0;
		return a;//可以顺便求出gcd(a,b),否则不要返回值也行
	}
	int r=exgcd(b,a%b,x,y);
	int k=x;
	x=y;
	y=k-a/b*y;
	return k;
}

大佬博客https://blog.youkuaiyun.com/a1799342217/article/details/78340756

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值