欧几里德算法描述:
E1.[求余数]
以n除m并令r为所得余数。(我们将有0 ≤ r ≤ n。)
E2[余数为0?]
若r=0,算法结束,n即为答案。
E3[减少]
置m←n, n←r,并返回步骤E1.
其原理依赖于下面的定理:
gcd(a, b) = gcd(b, a mod b)
证明:
a可以表示成a = kb + r,则r = a mod b
假设d是a, b的一个公约数,则有
d | a, d | b,而r = a - kb,因此d | r
因此d是(b, a mod b)的公约数
假设d 是(b,a mod b)的公约数,则
d | b , d |r ,但是a = kb +r
因此d也是(a,b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
欧几里得算法的C语言表达:
int gcd(int a, int b) { if(a == 0) reutn b; if(b == 0) return a; if(a < b) swap(a, b); int c; while(c = a % b) { b = c; a = b; } return b; }欧几里得算法的改进(避免a、b之间的交换):
F1.[余数m / n]
以n除m并令m是余数。
F2[它为0?]
如果m = 0,则此算法以n为答案而终止。
F3[余数n / m]
以m除n并令n为余数。
F4[它为0?]
如果n = 0, 则算法以答案m为终止;否则返回步骤F1。
实际上是通过提前完成下一次的取余来弥补交换的过程。
欧几里得改进算法的C语言表达:
int gcd(int a, int b) { if(a == 0) reutn b; if(b == 0) return a; if(a < b) swap(a, b); while(a = a % b) { b = b % a; } return b; }
另外:
GCD (greatest common divisor 或者 highest common factor )