目次(まとめ)
◾️ ユークリッド互除法は、最大公約数を見つけるための最古のアルゴリズム
◾️ Rubyをつかったユークリッド互除法
こんにちは、みっちゃんです。
今回の記事では、2つの自然数について、最大公約数を発見するためのアルゴリズムである「ユークリッド互除法」を紹介します。
ユークリッド互除法は、最大公約数を見つけるための最古のアルゴリズム
みなさんは「最大公約数」と聞いて、何か覚えていますか?
例えば、"12" と "26" の最大公約数は、以下のように考えてきたと思います。
12 : 1, 2, 3, 4, 6, 12
26 : 1, 2, 13, 26
となるので、最大公約数は "2" になる。
このように、比較的小さい2つの自然数について、最大公約数を求めることは比較的簡単ですが、例えば、"1346" と "5439" の最大公約数は?と言われたときに、上のように計算するのは大変な作業になります。
そこで「ユークリッド互除法」と呼ばれるアルゴリズムが提案されました。
このアルゴリズムでは、名前で示されているように「互いに割り算(除法)をする」ということになります。
26 ÷ 12 = 2 あまり 2
12 ÷ 2 = 6 あまり 0
となるので、最大公約数は "2" になる。
5439 ÷ 1346 = 4 あまり 55
1346 ÷ 55 = 24 あまり 26
55 ÷ 26 = 2 あまり 3
26 ÷ 3 = 8 あまり 2
3 ÷ 2 = 1 あまり 1
2 ÷ 1 = 2
となるので、最大公約数は "1" になる
このように、割り算における「割られる値(分数でいう分子)」と「割る値(分数でいう分母)」を考えるとき、「割る値」を「あまり」で割り続けて、最大公約数を見つけます。
Wikipediaによると、この「ユークリッド互除法」は、最古のアルゴリズムとして知られています。
Rubyをつかったユークリッド互除法
ユークリッド互除法は、上で示したように、同じ処理を繰り返す手法は、再帰のアプローチを使ってプログラミングすることが可能です。
以下は、Rubyを使ったプログラム例です。
1: def euclidean(a, b)
2: if b == 0
3: return a
4: else
5: euclidean(b, a % b)
6: end
7: end
8:
9: p euclidean(5439, 1346)
9行目において、最大公約数を求めたい2つの自然数 "5439" と "1346" を "euclidean" という関数の引数に与えています。
"euclidean" という関数は、1行目から7行目にかけて定義しています。
この定義の中で、"euclidean" という関数を呼び出しているということで、「b = 0」という条件を満たすまで、繰り返し計算が行われるような仕組みになっています。