算法-辗转相除法(欧几里得算法)

对于两个数的最大公约数的求解,在我们的笔算过程中,通常是使用一个短除法,本质上其实也就是进行一个质因数分解的过程,但对于一个较大的数来说,将其进行质因数分解是一件非常耗时的过程,这显然不是一个好的做法,因此基于数论基础,我们有了辗转相除法,也叫做欧几里得算法。

GCD递归定理

在叙述该算法之前,先了解辗转相除法的实现前提也就是GCD递归定理:

对任意非负整数$a$和任意正整数$b$,

$$ gcd(a,b) = gcd(b,a \quad mod \quad b) $$

辗转相除法算法概述

基于上面的GCD递归定理,我们便可以知道可以采用递归的方式,对两个整数的最大公约数进行相对较为高效的计算。

算法描述:

  1. 求两个数的余数;
  2. 若余数为0,则较小数即为最大公约数;否则执行3;
  3. 用较小的数替换较大的数,用余数替换较小的数;
  4. 返回1.

算法示例

$$ gcd(30,21) = gcd(21,9) = gcd(9,3) = gcd(3,0) = 3 $$

辗转相除法伪代码表示

下面我们采用递归方式实现辗转相除法。
(以下引用自《算法导论》)

GCD(a, b)

if b == 0
  return a
else
  return GCD(b, a mod b)

辗转相除法实现

C

int gcd(int a, int b)
{
    if (b == 0)
        return a;
    else
        return gcd(b, a % b);
}

pascal

function gcd(a, b : integer) :integer;
begin
    if b = 0 then
        gcd := a
    else
        gcd := gcd(b, a mod b);

参考资料

  • 《算法导论》(第三版)
  • 《Free Pascal 语言与基础算法》
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值