js实现欧几里得算法

时间:2021-12-26 21:24:10

概念
在数学中,辗转相除法,又称欧几里得算法(英语:Euclidean algorithm),是求最大公约数的算法。

证明
首先假设有两个数a和b,其中a是不小于b的数,记a被b除的余数为r,那么a可以写成这样的形式:
a = b*q + r
假设a和b的一个约数为u,那么a和b都能被u整除,即:

a = su
b = tu
带入原式可得

su = (tu)q + r
r = su - (tu)
q
r = u*(s-tq)
所以 u 也是r 的公约数,即

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

同理可证明b和r的任一公约数也是a的公约数。
假设b和r的任一公约数为 v,则有:

b = mv
r = nv
带入原式可得

a = (mv)q + nv
a = v
(mq+n)
所以a和b的约数组成的集合与b和r的约数集合是相等的,那么a和b的最大约数和b和r的最大约数也相等。

实现
用js实现代码如下:

function gcd(a,b){
let max = a>b?a:b;
let min = a>b?b:a;
let r = max%min;
if(r==0){
return min;
}else{
return gcd(min,r)
}
}
简化版本如下:

function gcd(a,b){
return b===0?a:gcd(b,a%b);
}
参考
辗转相除法[*]
欧几里得算法求最大公约数的数学原理
js实现欧几里得算法/辗转相除法