写在前面: 本着弄懂每一个小知识点的学习原则, 打算彻底理清一下辗转相除法
1 什么是辗转相除法?
辗转相除法, 又称欧几里得算法
2 为什么辗转相除可以求解最大公约数?
可能我们会凭记忆使用这个简单的算法, 但是如果我们多问自己一个为什么? 思路就有点模糊了, 可能会想: 是啊, 为什么呢? 难道又是玄学? 下面就给出一系列疑问的证明:
首先我们给定两个数 并且约定
如果 , 则
如果 , 则设
根据辗转相除法, 我们可以得出
疑问就在这里, 等式为什么成立? 我们拆分为两个子问题:
Q1: 是 的一个公约数, 其中
因为:
所以:
由于 是正整数, 所以 是 的一个公约数
Q2: 如何证明 就是 , 换就话说如何证明是最大公约数?
我们来重新审视一下条件:
要想证明 是 , 也就是说证明 互质, 即
由于 是正整数, 不好直接证明, 那么我们取特殊的当 时到底是否成立? 即 如果你对数论有点了解可能立马就知道
, 又因为 所以得证; 如果你不知道也没关系, 我们可以证明, 毕竟我们就是来搞懂一个个细节的
因为:
所以:
在 互质的情况下, 不可能含有数值为 或 因子 否则
所以结论 得证 继续使用这个结论可以得出:
所以有:
然后一直迭代就可以啦!
如果里面有什么错误欢迎指出来, 可以一起探讨
3 如何高效实现?
请参考漫画算法: 辗转相除法是什么鬼?
4 参考
wiki: 辗转相除法
zhihu: 漫画算法: 辗转相除法是什么鬼?
来源: https://juejin.im/post/5ab1d2ddf265da23870eb5a2