辗转相除法求两个数的最大公约数(Greatest common divisor,GCD),在公元前300年前由欧几里得发现,被称为世界上最古老的算法。
What?
什么是辗转相除法,举个例子:求30和18的最大公约数
通常的方法:把两个数分解成素数,找出共同素数的最大公约数。
30=5*3*2
18=3*3*2
GCD=3*2 (共同的素数是一个3和一个2)
然而,用这种方法存在弊端,随着两个数变得越来越大,素数分解变得越来越困难。
用辗转相除法,可以更加有效的得到最大公约数。
- 用较大的数和较小的数取模操作,得到余数。
- 用上一步中较小的数和余数取模操作。
- 重复相同操作。
- 直到取模操作得到0,这时的除数就是GCD
30 mod 18 = 12
18 mod 12 = 6
12 mod 6 = 0
GCD = 6
Why?
为什么辗转相除法可以得到GCD呢。
30------------------|------------
18------------------
18------------|------
12------------
12------------|
6 ------
- 把数字30和18想象成两条绳子,一条30米一条18米。30米绳子是n个GCD米,18米的绳子是m个GCD米,n、m都是整数当然它们是不知道的。
- 用18米绳子去最大化的截30米绳子,最后剩余了12米。就相当于30米绳子去除了k*n个GCD,还剩下(m-k*n)个GCD,去除了GCD的整数倍,剩下GCD的整数倍。
- 用12米去截取18米绳子,剩下6米。
- 剩下的6米正好可以完整的截取12米的绳子。6就是GCD的1倍数。
- 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