辗转相除法(欧几里得)原理

本文详细介绍了欧几里得算法的最大公约数(GCD)求解原理,通过数论的角度阐述了算法的奇妙之处,并用递推法展示了其工作过程。最后,给出了C语言实现该算法的简洁代码,强调了在不考虑数值大小的情况下,算法依然有效。
摘要由CSDN通过智能技术生成

很早就学过欧几里得算法,但是一直不知道它的原理。几乎每本算法书都会提到它,但是貌似只有数学书上才会见到它的原理。。。

前段时间粗粗看了点数论(《什么是数学》),惊讶于这个原理的奇妙。现在把它通俗地写下来,以免自己忘记。

欧几里得算法是求两个数的最大公约数(Greatest Common Divisor (GCD))的算法,我们首先假设有两个数 a 和 b,其中 a 是不小于 b 的数,

 

记 a 被 b 除的余数为 r,那么 a 可以写成这样的形式:


其中 q 是整数(我们不需要去管 q 到底是多少,这和我们的目标无关)。

现在假设 a 和 b 的一个约数为 u,那么 a 和 b 都能被 u 整除,即

s 和 t 都是整数(同样的,我们只需要知道存在这样的整数 s 和 t 就行)。

这样可以得出

 

所以 r 也能被 u 整除,一般规律如下

a 和 b 的约数也整除它们的余数 r,所以 a 和 b 的任一约数同时也是 b 和 r 的约数。  —— 条件一

反过来可以得出

b 和 r 的任一约数同时也是 a 和 b 的约数。  ——条件二

这是因为对 b 和 r 每一个约数 v,有

于是有

由条件一和条件二可知

 a 和 b 的约数的集合,全等于 b 和 r 的约数的集合。

于是

a 和 b 的最大公约数,就是 b 和 r 的最大公约数。

接下来用递推法,

a ÷ b 余 r,现在设

b ÷ r 余 r1

r ÷ r1 余 r2

……

r(n-3) ÷ r(n-2) 余 r(n-1)

r(n-2) ÷ r(n-1) 余 r(n)=0

因为 a>=b,可以看出余数 r(n) 会越来越小,最终变成 0.
当 r(n-1)≠0 且 r(n) = 0 时,可知 r(n-2) 可被 r(n-1) 整除(余数为0嘛)

此时 r(n-2) 和 r(n-1) 的约数就只有:r(n-1) 和 r(n-1) 的因数,所以他们的最大公约数就是 r(n-1)!

所以 r(n-1) 就是 a 和 b 的最大公约数。(若 r = 0,则 b 为最大公约数)

 

这个递推法写成c语言函数是这样的(比推导更简洁...):

unsigned int Gcd(unsigned int M,unsigned int N){
    unsigned int Rem;
    while(N){
        Rem = M % N;
        M = N;
        N = Rem;
    }
    return Rem;
}

可以发现这里没有要求 M>=N,这是因为如果那样,循环会自动交换它们的值。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值