数学背景:
整除的定义:
任给两个整数a,b,其中b≠0,如果存在一个整数q使得等式
a = bq
成立,我们就说是b整除a,记做b|a.
性质1:如果c|a,c|b,且对于任意的整数m,n,则有c|ma + nb
证明: 利用上述定义进行证明
因为c|a ,c|b,所以有a = c*q,b = c*q,
对于任意m,n有,ma+nb = m(c*q) + n(c*q) = c(m*q + n*q),
因为m*q +n*q为整数,很显然有 c|ma + nb .
带余除法: 设a,b 是两个整数,其中b > 0 ,则存在两个唯一的整数q和r,使得
a = b*q + r, 0≤ r < b
成立.
公因数和最大公因数的定义:
设a,a,a,......,a是n个不全为0的整数,若整数d是它们之中每一个数的因数,那么d就叫做a,a,a,......,a的一个公因数.这时它们的公因数只有有限个,整数a,a,a,......,a的公因数中最大的一个叫做最大公因数,记做(a,a,a,......,a),若(a,a,a,......,a)=1,我们说a,a,a,......,a互素.
定理1:设a,b,c是任意三个不全为零的整数,且 a = bq + c,其中q是整数,则(a,b) = (b,c).也就是说,a和b的最大公因数等于b和c的最大公因数.
证明: 因为(a,b)是a和b的最大公因数,所以(a,b)|a,且(a,b)|b,由于c = a - bq,所以由性质1可以知道(a,b)|c,所以可以看到,(a,b)是b,c的一个公因数,而由公因数的定义可以知道 (b,c)是b,c的最大公因数,任何公因数都是小于最大公因数的,所以(a,b) ≤ (b,c).
同样的道理可以证明 (b,c) ≤(a,b).
因此有(a,b) = (b,c)
辗转相除法:给任意整数 a > 0,b >0, 由带余除法,有以下等式
a = b*q + r, 0 < r < b,
b = r*q + r, 0 < r < r,
r = r*q + r, 0 < r < r,
......
r = r*q+ r , 0< r<r
r= r*q+ r ,r= 0
因为 b> r > r > r >....,故经过有限次带余除法以后,总可以得到一个余数为0,上面r= 0
由上面的定理1可以知道,(a,b) = (b,r) = (r,r) = ....= (r,r) = (r,r) = (r,0) = r
所以要想求a,b得最大公因数,就需要不断的使用带余除法,直到余数为0,就可以得到a,b的最大公因数.
举例:
使用辗转相除法求 288 和 158 的最大公因数
288 = 158 * 1 + 130
158 = 130 * 1 + 28
130 = 28 * 4 + 18
28 =18 * 1 + 10
18 = 10 * 1 + 8
10 = 8 * 1 + 2
8 = 2 * 4
所以(288,158) = (158,130) = (130,28) = (28,18)=(18,10)=(10,8)=(8,2)=(2,0)=2
python 实现:
递归
def gcd(a,b):
if b == 0 : return a
return gcd(b,a % b)
迭代
def gcd(a,b):
while b != 0:
a,b = b,a%b
return a