数学的力量是伟大的,也是美丽的。 —— 本人说的
本文算是对中佛罗里达大学提供的对欧几里得算法证明的翻译,想看英文证明的, 这里是链接>英文材料<
欧几里得算法 (Euclid’s Algorithm)
众所周知,大名鼎鼎的欧几里得是为了求两个整数之间的最大公因数,也就是所谓的辗转相除法了,在下面的内容中,我将分别从欧几里得算法证明、欧几里得算法扩展和代码实现来介绍。先作一个约定,若一个数p可以被q整除,也就是说q除以p余数为0,我们记 p | q
最大公因数
我们记gcd(a,b)
为a和b之间的最大公因数,gcd
denotesgreatest common divisor
,如果一个整数c是a和b的最大公因数,那么必然满足以下两条规格:
- c | a 且c | b
- 对于任何a和b的公共因数d,d | c
实际上,规则2保证了规则1中的c就是a和b的最大公因数
形式化描述
欧几里得算法的形式化描述如下,其中所有的字母都代表整数:
a = q 1 b + r 1 , 其 中 0 < r 1 < b a = q_1b + r_1, 其中 0 < r_1< b a=q1b+r1,其中0<r1<b
b = q 2 r 1 + r 2 , 其 中 0 < r 2 < r 1 b = q_2r_1 + r_2, 其中 0 < r_2< r_1 b=q2r1+r2,其中0<r2<r1
r 1 = q 3 r 2 + r 3 , 其 中 0 < r 3 < r 2 r_1 = q_3r_2 + r_3, 其中 0 < r_3 < r_2 r1=q3r2+r3,其中0<r3<r2
. . . ... ...
r i = q i + 2 r i + 1 + r i + 2 , 其 中 0 < r i + 2 < r i + 1 r_i = q_{i+2}r_{i+1} + r_{i+2}, 其中 0 < r_{i+2} < r_{i+1} ri=qi+2ri+1+ri+2,其中0<ri+2<ri+1
. . . ... ...
r k − 1 = q k + 1 r k r_{k-1}=q_{k+1}r_k rk−1=qk+1rk
g c d ( a , b ) = r k gcd(a,b)=r_k gcd(a,b)=rk
也就是说, gcd(a,b)= gcd(b,a%b),一直递归处理到a%b,那时对应的被除数/除数
的商
就是最大公因数c了。
考虑以下这个例子,GCD(125, 87)
125 = 1*87 + 38
87 = 2*38 + 11
38 = 3*11 + 5
11 = 2*5 + 1
5 = 5*1
所以,GCD(125, 87)=1
证明
证明gcd返回的是a和b之间的最大公因数,我们可以分两步来证明:
- 1.首先,我们证明,gcd返回的数确实是a和b之间的公因数
回顾一下上面的公式:
a = q 1 b + r 1 , 其 中 0 < r 1 < b a = q_1b + r_1, 其中 0 < r_1< b a=q1b+r1,其中0<r1<b
b = q 2 r 1 + r 2 , 其 中 0 < r 2 < r 1 b = q_2r_1 + r_2, 其中 0 < r_2< r_1 b=q2r1+r2,其中0<r2<r1
r 1 = q 3 r 2 + r 3 , 其 中 0 < r 3 < r 2 r_1 = q_3r_2 + r_3, 其中 0 < r_3 < r_2 r1