数论—欧几里德算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CQBZLYTina/article/details/79232936

What(是什么——定义)

欧几里德算法(Euclidean algorithm)是求两个正整数之最大公因子的算法。
设两数为a、b(a>b),求(a,b)的步骤如下:
①用a除以b,得a=bq+r1(0≤r1)。
②若r1=0,则(a,b)=b;
③若r1≠0,则再用b除以r1,得b=r1q+r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r1除以r2,如此下去,直到能整除为止。其最后一个为被除数的余数的除数即为(a, b)。

例如:a=25,b=15,a/b=10,b/10=15,10/5=20,最后一个为被除数余数的除数就是5,5就是所求最大公约数。

Why(为什么——证明)

定理:设a,b,c是不全为0的整数,若存在q∈Z,使得a=bq+c,则(a,b)=(b,c)
证明:由(b,c)|b,(b,c)|c及a=bq+c,知(b,c)|a,因此(b,c)是a和b的公因数,但(a,b)是a和b的最大公因数,所以(b,c)<=(a,b),同理可得(b,c)>=(a,b),则(b,c)==(a,b)

利用此定理证明辗转相除法
设a>0,b>0,令r0=1,r1=b,设:
r0=r1 * q1 + r2
r1=r2 * q2 + r3
.
.
.
rn-2=rn-1 * qn-1 + rn
rn-1=rn * qn
则:(a,b)=(r0,r1)=(r1,r2)=(r2,r3)=…=(rn-1,rn)=(rn,0)=rn

复杂度



——《挑战程序设计竞赛》

代码实现

int gcd(int a,int b)
{
	return b?gcd(b,a%b):a;
}

Updata 另外的证明 2019.2.17

感觉看着要舒服一点

总结

总结一下 欧几里得定理比较有意思的一点 就是这样一个结论


猜你喜欢

转载自blog.csdn.net/CQBZLYTina/article/details/79232936