“人类的历史就是贪心的历史。|

GXYZY

园龄:2年4个月粉丝:0关注:1

深度理解GCD

深度理解欧几里得算法

欧几里得算法弱者的福音!!!

作为一个从来没有真正理解gcd的人,我今天终于搞明白了!!!

一般来说,gcd都是递归求解的,下面解释一下原理。

结论

首先我相信大家都记得到结论吧:gcd(a,b)=gcd(b,a%b)(保证a大于b

递归出口就是:if(a==1||b==0) return a;

如果不是很明白可以先看下面。

证明

a%b的约数一定含有ab的最大公约数d

首先,我们设d=gcd(a,b),即设dab的最大公约数。那么我们可以将原式改写为gcd(ka×d,kb×d)(保证a大于b,下同)。因为这时候d已经是最大公约数了,所以此时kakb一定是互质的。接下来我们将gcd(b,a%b)a%b转换一下,变为(ka×d)%(kb×d)

我们再把取余换做减法(ka×d)tmax×(kb×d),这里的tmax表示最大的t使得t×(kb×d)小于等于(ka×d)成立。化简一下就会变成(katmax×kb)×d。很明显,a%b也含有ab的最大公约数d。并且a%b<ba,这样就缩小了范围。

公式gcd(a,b)=gcd(b,a%b)

接下来,我一直有一个疑惑,为什么公式是gcd(a,b)=gcd(b,a%b),而不是gcd(a,b)=gcd(a,a%b)

首先我们将a%b=(katmax×kb)×d中的(katmax×kb)替换为kr,那么a%b=kr×d,方便理解。

那么公式变为gcd(ka×d,kb×d)=gcd(kb×d,kr×d)。如果说kb不和kr互质,那么就不能成立了,因为此前我们已经设d为最大公约数了,那么如果不互质,那么d显然有更大的值。那究竟kbkr互质吗?

kbkr互质

反证法。首先我们有式子kr=katmax×kb,设kr不与kb互质,那么设他们的公因数为p

将原式转化为x×p=katmax×y×p,移项得到(x+tmax×y)×p=ka,观察式子发现此时ka包含因子p,然而我们上面假设的kb也含有因子p,这样kakb就不互质了,很明显违背了最开始的设定,故krkb不互质的假设不成立。

kakr不一定互质

此时我们反过来看gcd(a,b)=gcd(a,a%b),同样把他转换一下变为gcd(ka×d,kb×d)=gcd(ka×d,kr×d)。我们可以很容易够造出一组反例(还是保证a大于b)。

ka=5×7kb=2×3,带入原式得到gcd(5×7×d,2×3×d)=gcd(5×7×d,5×d),这很明显ka不与kr互质。

模拟过程

就拿上面的例子来解释一下。

gcd(2×3×d,5×7×d)=gcd(5×7×d,2×3×d)gcd(5×7×d,2×3×d)=gcd(2×3×d,5×d)gcd(2×3×d,5×d)=gcd(5×d,d)gcd(5×d,d)=gcd(d,0)return d;

第一步是保证a大于b,接下来一直取余,直到b0,然后return

posted @   GXYZY  阅读(395)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起