辗转相除法求最大公约数

欧几里得的GCD算法也称为辗转相除法,定理是这样子的:

    gcd(a, b) = gcd(b, a mod b) (a > b 且 a mod b 不为0)

两个整数的最大公约数是能够同时整除他们的最大正整数。并且有两个整数

的最大公约数等于其中较小的数和两数的相除余数的最大公约数.

下面是求最大公约数的简单示意图

辗转相除法求最大公约数_第1张图片

我们简单证明一下这个定理:

    我们假设a > b, a可以表示成a = kb + r,则r = a mod b。 也就是a除b等于k,a求模b等于r

假设a,b的一个公约数是d,则a可以整除d,b可以整除d,那么r % d = (a - kb) % d = 0

即d是r和b的公约数。那么(a, b)和(b, a mod b)的公约数是一样的,其最大公约数也必然相等。


下面是Python写的简单求两数最大公约数的函数:

def gcd(a, b):
    while a != 0:
        a, b = b % a, a
    return b

你可能感兴趣的:(算法)