可公度线段与欧几里得(Euclid)算法

通过本文,我们将发现欧几里得算法(求两个数的最大公约数,也称作辗转相除),根本不需要死记硬背,仅仅通过数论中的一个小小的结论(有关可公度线段,commensurable),即可轻易推导出来。

既然算法来自欧几里得两千年前的几何原本一书,我们也回归代数与几何在书中含义上的统一,继续沿用书中的说法。假如我们要求线段 a 和线段 b 的最大公度单位(也即最大公约数),不妨设 a b 更长。

  • 如果 b 正好能度量 a b 能度量 a 的含义是 a b 的整数倍), b 自然也能度量它自身,因此 b 就是 a b 的一个公度单位;

  • 如果 b 不能被 a 整除,这说明 a 的长度等于 b 的某个整数倍,再加上一个零头(余数),不妨把该零头记为 c ,也即此时 a=kb+c。如果此时某条线段能同时度量 b c,那么它显然也能度量 a 。也即,此时为了找到 a b 的共度单位,我们只需寻找 b c 的公度单位即可。此时便构成了递归

def euclid(a, b):
    if a < b:
        a, b = b, a
    return b if a % b == 0 else euclid(b, a%b)

证明

我们不妨把 Euclid 算法对 a b 进行这番折腾后得到的结果记做 x x a b 的公度单位。不过,它一定是最大的公度单位吗?证明 x 为最大公度单位,也即证明 a b 的任意一个公度单位,记为 y ,一定能够度量 x,从而不会超过 x

y 能同时度量 a b a=k1b+c ),它能度量 b 就意味着它能同时度量 b 的任意正数倍( k1b ),要想让它也能同时度量 a 的话,只需而且必须让它能够度量 c。于是 y 也能同时度量 b c ,又 b=k2c+d,根据同样的道理,又可推出 y 一定能度量 d,…., 最后发现, y 一定能度量 x

效率

欧几里得算法(辗转相除法)的效率其实非常高。实际上,我们可大致估计出辗转相除的效率。第一次做除法时,我们 amodb=c

  • 如果 b 的值不超过 a 的一半,那么 c 更不会超过 a 的一半(因为余数小于除数)。

  • 如果 b 的值超过了 a 的一半,那么 c 直接就等于 ab a=kb+c ,此时 k 只能为1),同样小于 a 的一半;

也即辗转相除法的运算次数是对数级别的;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值