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関数 (自作関数)
引数に指定した数値が奇数かどうかを調べます。奇数ならばTrue、それ以外の数値はFalse、文字列はエラー値を返します。
radToDeg関数 (自作関数)
弧度法(Radian)を度数法(Degree)に変換します。度数法を弧度法に変換するにはDegToRad関数を使います。
ARCSIN関数 (スクリプト関数)
引数の逆正弦を求めます。
EXP関数 (スクリプト関数)
自然指数関数を求めます。