最小公倍数・最大公約数を求める(その2)

前回の続き。

615の最小公倍数・最大公約数を求めます。

考えたアルゴリズム

要素の数が2つなら、最大公約数と最小公倍数の関係*1から、どちらかを求めればもう一方は算出できます。

が、今回は、2つ以上としているのでそうはいきません。

プログラミングでの実装しやすさも踏まえて、以下の手順としました。

  1. 各要素の値ごとに、素因数分解
  2. 素数リストの各値について、素因数分解した結果から指数を並べる
  3. 最小公倍数・最大公約数の計算

各要素の値ごとに、素因数分解

6を素因数分解

6 = 2^{1} \times 3^{1}

15を素因数分解

15 = 3^{1} \times 5^{1}

素数を覚えていれば楽だけど、プログラミングの時には先に何が素数かを求めるべきか否か?

また、素因数分解もどういう手順で考える必要あり。

次の手順で指数を並べるので、通常は指数が1の時は1を省略するけれど、敢えて省略せずに記載しました。

素数リストの各値について、素因数分解した結果から指数を並べる

なので、615を1つの表とする時には、2,3,5素数リストとなります。

で、指数を並べると以下の通り。

素数
6を展開
15を展開
2 1 0
3 1 1
5 0 1

最小公倍数・最大公約数の計算

素数ごとの指数の最大値、最小値を計算。

615の場合だと、指数は01しかないですが。

素数
6を展開
15を展開
指数の最大値
指数の最小値
2 1 0 1 0
3 1 1 1 1
5 0 1 1 0
  • 最小公倍数→(素数×指数の最大値)の積
  • 最大公約数→(素数×指数の最小値)の積

なので、以下の通り求められます。

最小公倍数

2^{1} \times 3^{1} \times 5^{1} = 60

最大公約数

2^{0} \times 3^{1} \times 5^{0} = 3

次回、実装編。

*1:正の整数 a,bに対して,それらの最大公約数をg,最小公倍数をlとおくと a \times b = g  \times l