关于最大公约数和最小公倍数的两个思考

300 阅读1分钟

前言

文章标题的灵感——伽利略的「关于托勒密和哥白尼两大世界体系的思考」。hh,强行拉关系。

最大公约数

greatest common divisor(gcd)

如何找到两个数的最大公倍数

ma、b的最大公约数,则有

a=xma = x*m

b=ymb = y*m

其中x、y是整数。

c = a - b,那么 c=ab=(xy)mc = a - b = (x-y)*m

其中x-y也是整数,综上我们有 gcd(a,b)=gcd(b,c)gcd(a,b) = gcd(b,c) 为了尽快结束递归的过程,我们可以加快这一进程,具体在下面的python实现的算法中。

python实现

# 最大公约数 greatest common divisor
def gcd(a,b):
    if a < b:
        a,b = b,a
    q,c = divmod(a,b)
    if c == 0:
        return b 
    else:
        return gcd(b, c) # c = a - b*q

之所以减去q倍的b,那是因为想要这个相减的过程尽可量的快速。

最小公倍数

least common multiple(lcm) 求最小公倍数,就是求最大公约数。因为给两个数a、b,存在如下等式关系

a * b = gcd(a,b) * lcm(a,b)

举个例子,求 60 与 110 对两个数进行质因数分解

60 = 2*2*3*5 
110 = 2*5*11 
60 * 110 = (2*2*3*5 ) * (2*5*11 ) = (2*2*3*5*11) *(2*5) = lcm(110,60) * gcd(110,60)

资料来源

《美丽的数学》