Oka Laboratory

Euclid!

ユークリッドの互除法 (Euclidean Algorithm) は記録に残る最古(紀元前300年頃)のアルゴリズムです。これを用いて2つ以上の自然数 (natural number) の最大公約数 (GCD) と最小公倍数 (LCM) を計算します。

GCDとLCMの計算


項目 結果
GCD
LCM
互いに素

使用方法

利用上の注意

アルゴリズム

2つの自然数a, b(≠0)について、abで除したときの商 (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);
};

アルゴリズム上では ab の必要がありますが、a<b であっても1周目のループで abが交換され、条件を満たすようになります。

最大公約数gcd(a,b)と最小公倍数lcm(a,b)の間にはgcd(a,b)×lcm(a,b)=a×bの関係があります。これを利用して最小公倍数はlcm(a,b)=a÷gcd(a,bbで求めることができます。このとき、先にgcd(a,b)で割るのは、a×bで桁あふれ (arithmetic overflow) が起こる可能性があるためです。

3つの自然数a, b, c(≠0)の最大公約数はgcd(a,b,c)=gcd(gcd(a,b),c)で求められます。即ち、abの最大公約数を求め、更にその結果と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;
}

参考文献


正当なCSSです!