0x00 最大公因数

两数 $$a, b$$ 的最大公因数指的是:能被$$a,b$$同时整除的因子中最大的一个

令$$g$$为 $$a,b$$的最大公因数,记作$$g=\gcd(a,b$$)

0x01 有用的性质

$$g=\gcd(a,b)$$, $$a$$ 和 $$b$$ 可以写作 $$a=gm, b=gn$$

其中$$m,n$$互质 (若mn有公因子,提出来后和g相乘,g就不是最大公因数)

$$a-b=gm-gn=g(m-n)$$

对于a,b两数的最大公因数g,也一定是a-b的因子

那么,g是不是b, a-b的最大公因子呢?

0x02 证明g是a-b与b的最大公因子

已知mn互质 $$b=g*n, a-b=g(m-n)$$,只要证明(m-n)与n互质,就可证明g是a-b与b的最大公因子

用反证法:假设(m-n)与n不互质,则(m-n)与n必有一个因子t

$$n=tx, (m-n)=ty$$, 把$$n=t*x$$代入

$$m-tx=ty \ m = ty+tx, \ m=t(x+y) \ n=t$$x

此时我们发现m与n有公因子t,与已知其互质相矛盾。

则(m-n)与n必定互质

g必定是a-b与b的最大公因数

0x03 怎么用?

要求简单数字的最大公因数很简单,可能一眼就能看出来

但对于超级大的数字来说,就没那么简单了。

根据上述性质,我们知道,对于a,b的gcd,同样是b与a-b的gcd

那么我们就可以把复杂问题简化,对于两个超级大的数字a和b,(假设a>b)

我们只需找 b和a-b的最大公因数即可…就这么递归减下去,减到b与a-b相等即可

两个相等的数的gcd,就是自身喽

0x04 例子

假设,要求 20 与 15 的gcd

=>只求 15 与 5的gcd即可

=>只求 5 与 10的gcd即可

=>只求 5 与 5的gcd即可

则,20 与 15的最大公因数是 5

0x05 更进一步

上述方法,叫作the subtraction-based version

目前最常见的形式,是把减法用求余代替

gcd(a, b) = gcd(b, a mod b)

证明方法类似,此处略

function gcd(a, b)
    while b  0
        t := b
        b := a mod b
        a := t
    return a