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