∀a,b∈N,gcd(a,b)=gcd(b,a mod b) 。
若a<b,则gcd(b,a mod b)=gcd(b,a)=gcd(a,b) 成立。
若a≥b,设a=k⋅b+r,其中0≤r<b,则r=a mod b。
对于a,b任意的公约数d ,
因为d∣a,d∣k⋅b 故 a=q1⋅d,k⋅b=q2⋅d ,所以 a−k⋅b=d(q1−q2) ,故 d∣a−k⋅b 即 d∣r。
因此,d也是b,r的公约数。
反之:
对于b,r的任意公约数d。
因为d∣b,d∣r 故 b=q1⋅d,r=q2⋅d ,所以 k⋅b+r=d(k⋅q1−q2) ,故 d∣k⋅b+r 即 d∣a。
因此,d也是a,b的公约数。
综上,a,b的公约数集合与b,r的公约数集合相同。于是它们的最大公约数自然也相等。
证毕。
代码实现
复杂度O(log(a+b))
递归方式
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
迭代更新
int gcd(int a,int b){
while(b){
int r=a%b;
a=b;
b=r;
}
return a;
}