欧几里得算法是一个十分重要的算法,最近学习了一下,写下来帮助自己记忆。
目的:计算两个数的的最大公约数(通常使用gcd(a,b)表示);
条件:两个数不同时为零,记为a,b;
基本原理:
这是基于一个简单的定理:a=qb+c(或者说c=a%b),那么gcd(a,b)=gcd(b,c);
证明:
设d=gcd(a,b),e=gcd(b,c)
存在k1,k2,k3,k4,使得a=dk1,b=dk2,b=ek3,c=ek4;
1、a=qb+c=qek3+ek4=e(qk3+k4);
所以a%e==0;
因为gcd(a,b)=d,所以e<=d;
2、因为 a=qb+c;
所以 c=-qb+a=-qdk2+dk1=d(-qk2+k1);
所以c%d==0;
因为gcd(b,c)=e,所以e>=d;
综上,e=d;
代码实现:
typedef long long int64; int64 gcd(int64 a, int64 b){ return (b == 0)? a: gcd(b, a % b); }