LCMエルシーエム関数

本ページには広告が含まれています。

引数に指定した配列の最小公倍数(Leastリースト Commonコモン Multipleマルチプル)を求めます。

構文
  1. Double = LCM( array )
引数
array 必須
最小公倍数を求める数値を格納した配列
戻り値
最小公倍数

プログラム

UWSC
//////////////////////////////////////////////////
// 【引数】
//   array : 最小公倍数を求める数値を格納した配列 
// 【戻り値】
//   最小公倍数 
//////////////////////////////////////////////////
FUNCTION LCM(array[])
	DIM c = LENGTH(array)
	DIM array2[] = array[c-1], array[c-2]
	DIM rem = array[c-1] * array[c-2] / GCD(array2)
	IFB c = 2 THEN
		RESULT = rem
		EXIT
	ENDIF
	array[c-2] = rem
	RESIZE(array, c-2)
	RESULT = LCM(array)
FEND

//////////////////////////////////////////////////
// 【引数】
//   array : 最大公約数を求める数値を格納した配列 
// 【戻り値】
//   最大公約数 
//////////////////////////////////////////////////
FUNCTION GCD(array[])
	DIM c = LENGTH(array)
	DIM rem = array[c-1] MOD array[c-2]
	IFB rem = 0 THEN
		IFB LENGTH(array) = 2 THEN
			RESULT = array[c-2]
			EXIT
		ENDIF
		RESIZE(array, c-2)
		RESULT = GCD(array)
		EXIT
	ENDIF
	array[c-1] = array[c-2]
	array[c-2] = rem
	RESULT = GCD(array)
FEND

解説

  1. 2行目
    UWSC
    	DIM c = LENGTH(array)
    arrayの要素数を変数cに代入。
  2. 3行目
    UWSC
    	DIM array2[] = array[c-1], array[c-2]
    配列arrayc-1番目とc-2番目を格納した配列array2を生成。
  3. 4行目
    UWSC
    	DIM rem = array[c-1] * array[c-2] / GCD(array2)
    配列arrayc-1番目とc-2番目の積をarray2の最大公約数で割り、その結果を変数remに代入。
  4. 5-8行目
    UWSC
    	IFB c = 2 THEN
    		RESULT = rem
    		EXIT
    	ENDIF
    c2ならremを戻り値として返し終了する。
  5. 9行目
    UWSC
    	array[c-2] = rem
    配列arrayc-2番目にremを代入。
  6. 10行目
    UWSC
    	RESIZE(array, c-2)
    配列arrayのサイズをc-2に変更する。
  7. 11行目
    UWSC
    	RESULT = LCM(array)
    LCM関数を再帰呼び出し。

最小公倍数

2つ以上の正の整数についてそのどれもが割り切れる整数(倍数)を初めの整数の公倍数といい、公倍数のなかで0ではない最小の数を最小公倍数といいます。

2つの自然数\(a\),\(b\)の最大公約数をGCD、最小公倍数をLCMとすると以下の関係が成り立ちます。

POINT
\[LCM(a, b) = \frac{a \times b}{GCD(a, b)}\]

最大公約数GCDはユークリッドの互除法を使うことで求めることができます。GCD関数 (自作関数)を参照してください。

プログラム実行例

最小公倍数を求めます

3と8の最小公倍数を求めます。

UWSC
DIM array[] = 3, 8
PRINT LCM(array)

//////////////////////////////////////////////////
// 【引数】
//   array : 最大公約数を求める数値を格納した配列 
// 【戻り値】
//   最大公約数 
//////////////////////////////////////////////////
FUNCTION GCD(array[])
	DIM c = LENGTH(array)
	DIM rem = array[c-1] MOD array[c-2]
	IFB rem = 0 THEN
		IFB LENGTH(array) = 2 THEN
			RESULT = array[c-2]
			EXIT
		ENDIF
		RESIZE(array, c-2)
		RESULT = GCD(array)
		EXIT
	ENDIF
	array[c-1] = array[c-2]
	array[c-2] = rem
	RESULT = GCD(array)
FEND

//////////////////////////////////////////////////
// 【引数】
//   array : 最小公倍数を求める数値を格納した配列 
// 【戻り値】
//   最小公倍数 
//////////////////////////////////////////////////
FUNCTION LCM(array[])
	DIM c = LENGTH(array)
	DIM array2[] = array[c-1], array[c-2]
	DIM rem = array[c-1] * array[c-2] / GCD(array2)
	IFB c = 2 THEN
		RESULT = rem
		EXIT
	ENDIF
	array[c-2] = rem
	RESIZE(array, c-2)
	RESULT = LCM(array)
FEND
結果
プレーンテキスト
24
使用関数
解説

関連記事

ABS関数 (スクリプト関数)
引数の絶対値を求めます。
ARCCOS関数 (スクリプト関数)
引数の逆余弦を求めます。
CEIL関数 (スクリプト関数)
正の方向へ切り上げた数値を返します。
LN関数 (スクリプト関数)
自然対数を求めます。
LOGN関数 (スクリプト関数)
常用対数を求めます。
ZCUT関数 (スクリプト関数)
マイナス値を0にして返します。プラス値はそのままの値を返します。
isOdd関数 (自作関数)
奇数かどうか調べます。
radToDeg関数 (自作関数)
弧度法(Radian)を度数法(Degree)に変換します。度数法を弧度法に変換するにはDegToRad関数を使います。
ARCSIN関数 (スクリプト関数)
引数の逆正弦を求めます。
EXP関数 (スクリプト関数)
自然指数関数を求めます。