辗转相除求最大公约数

辗转相除法求两个数的最大公约数(Greatest common divisor,GCD),在公元前300年前由欧几里得发现,被称为世界上最古老的算法。


What?

什么是辗转相除法,举个例子:求30和18的最大公约数

通常的方法:把两个数分解成素数,找出共同素数的最大公约数。

30=5*3*2

18=3*3*2

GCD=3*2  (共同的素数是一个3和一个2)

然而,用这种方法存在弊端,随着两个数变得越来越大,素数分解变得越来越困难。

用辗转相除法,可以更加有效的得到最大公约数。

  1. 用较大的数和较小的数取模操作,得到余数。
  2. 用上一步中较小的数和余数取模操作。
  3. 重复相同操作。
  4. 直到取模操作得到0,这时的除数就是GCD

30 mod 18 = 12

18 mod 12 = 6

12 mod 6 = 0 

GCD = 6

Why?

为什么辗转相除法可以得到GCD呢。

30------------------|------------

18------------------


18------------|------

12------------


12------------|

6  ------

  1.  把数字30和18想象成两条绳子,一条30米一条18米。30米绳子是n个GCD米,18米的绳子是m个GCD米,n、m都是整数当然它们是不知道的。
  2. 用18米绳子去最大化的截30米绳子,最后剩余了12米。就相当于30米绳子去除了k*n个GCD,还剩下(m-k*n)个GCD,去除了GCD的整数倍,剩下GCD的整数倍。
  3. 用12米去截取18米绳子,剩下6米。
  4. 剩下的6米正好可以完整的截取12米的绳子。6就是GCD的1倍数。
  5. 6米也就正好可以完整的截取30米和18米绳子,这就是GCD。

How?

自己写了个python代码,如下:

def get_GCD(num1,num2):
    _max,_min = (num1,num2) if num1>=num2 else (num2,num1)
    while _max % _min != 0:
        _max,_min = _min,_max % _min
    return _min

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值