概念
在数学中,展转相除法,又称欧几里得算法(英语:Euclidean algorithm),是求最大公约数的算法。算法
证实
首先假设有两个数a和b,其中a是不小于b的数,记a被b除的余数为r,那么a能够写成这样的形式:
a = b*q + r
假设a和b的一个约数为u,那么a和b都能被u整除,即:数组
a = su
b = tu
带入原式可得ide
su = (tu)q + r
r = su - (tu)q
r = u*(s-tq)
因此 u 也是r 的公约数,即idea
a和b的约数也整除它们的余数r,因此a和b的任一约数同时也是b和r的约数。数学
同理可证实b和r的任一公约数也是a的公约数。
假设b和r的任一公约数为 v,则有:it
b = mv
r = nv
带入原式可得io
a = (mv)q + nv
a = v(mq+n)
因此a和b的约数组成的集合与b和r的约数集合是相等的,那么a和b的最大约数和b和r的最大约数也相等。function
实现
用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)
}
}
简化版本以下:cli
function gcd(a,b){ return b===0?a:gcd(b,a%b); } 参考 展转相除法[维基百科] 欧几里得算法求最大公约数的数学原理 js实现欧几里得算法/展转相除法