ユークリッドの互除法 (Euclidean Algorithm) は記録に残る最古(紀元前300年頃)のアルゴリズムです。これを用いて2つ以上の自然数 (natural number) の最大公約数 (GCD) と最小公倍数 (LCM) を計算します。
[ 戻る ]
項目 | 結果 |
---|---|
GCD | |
LCM | |
互いに素 |
[ 戻る ]
[ 戻る ]
[ 戻る ]
2つの自然数a, b(≠0)について、aをbで除したときの商 (quotient) をq、剰余 (remainder) をr (a=qb+r) とすると、gcd(a,b)=gcd(b,r)が成り立ちます。この関係を繰り返し適用し、r=0になったときのbが最大公約数gcd(a,b)になります。
var euclidean = function(a, b) {
/* Euclidean Algorithmによる最大公約数の計算 */
var r;
while (b !== 0) {
r = a % b;
a = b;
b = r;
}
return Math.abs(a);
};
アルゴリズム上では a≥b の必要がありますが、a<b であっても1周目のループで aとbが交換され、条件を満たすようになります。
最大公約数gcd(a,b)と最小公倍数lcm(a,b)の間にはgcd(a,b)×lcm(a,b)=a×bの関係があります。これを利用して最小公倍数はlcm(a,b)=a÷gcd(a,b)×bで求めることができます。このとき、先にgcd(a,b)で割るのは、a×bで桁あふれ (arithmetic overflow) が起こる可能性があるためです。
3つの自然数a, b, c(≠0)の最大公約数はgcd(a,b,c)=gcd(gcd(a,b),c)で求められます。即ち、aとbの最大公約数を求め、更にその結果とcの最大公約数で求めることで得ることができます。同様に最小公倍数もlcm(a,b,c)=lcm(lcm(a,b),c)で求めることができます。これらの操作を繰り返し適用することで、4つ以上の自然数の最大公約数と最小公倍数も得られます。
前述のeucldiean(a,b)
関数を利用して、配列n[]に設定された2つ以上の自然数の最大公約数gcdと最小公倍数lcmを求めるコードを示します。途中gcdが1になった時点でgcdは1に決定されますので、以後のgcd計算を省略することができます。
/* 最大公約数gcdと最小公倍数lcmの計算 */
var imax = n.length;
var gcd = n[0];
var lcm = gcd;
var ni;
for (var i = 1; i < imax; i++) {
ni = n[i];
if (gcd > 1) gcd = euclidean(gcd, ni);
lcm = lcm / euclidean(lcm, ni) * ni;
}
[ 戻る ]
[ 戻る ]