【世界一わかりやすい】ユークリッドの互除法で最大公約数を求める仕組み。Pythonコードも。

未分類

こんにちは、かぐーです!

今回のテーマは、高校数学で学ぶ「ユークリッドの互除法」です。

ユークリッドの互除法を使って最大公約数を求めるやり方を、図を使ってわかりやすく解説していきます。

また、最後にはプログラミング言語pythonを使って、ユークリッドの互除法を再現するプログラムを作ってみます。

学生の方も、プログラミングを勉強している方も、どちらの方にも有益な内容となっておりますので、ぜひ最後までお付き合いくださいませ。

ユークリッドの互除法とは?

2つの自然数a,bに対して、
a=bq+rであるならば、aとbの最大公約数は、bとrの最大公約数と同じである。

a=bq+rの部分を言い換えると、「aをbで割った商がq、余りがr」ということになります。

図であらわしてみましょう。

aはxで割り切れて、bもxで割り切れるとします。であれば、余りrも、xで割り切れるはずです。
もし、rがxで綺麗に割り切れないならば、aもxで割り切れなくなってしまうはずなのですから。

例えば、 a=22,b=6 のとき。
22=6×3 + 4 になります。22と6の最大公約数は「2」になり、6と4の最大公約数も「2」になります。

数学的な証明は割愛しますが、状況をイメージしやすくなったのではないでしょうか。

2つの整数の最大公約数を求める

ユークリッドの互除法を使うと、2つの整数の最大公約数を計算で求めることができます。

「a = bq + r」では、aをbで割ったときの商がq, 余りがrという関係になります。
このとき、割った数bと余りrの最大公約数が、aとbの最大公約数と同じであることを利用した方法になります。

その方法は以下の通りです。

  • 大きい数を小さい数で割って、商と余りを求める。
  • 小さい数を余りで割って、その商と余りを求める。
  • 同様に「割った数」を「余り」で割る作業を繰り返す。
  • 余りが0になったら、その時に「割った数」が最大公約数になる。

bをrで割って0になるということは、その時「割った数」がbとrの最大公約数ということになり、結局aとbの最大公約数でもあるという寸法です。

具体的に、24と9でやってみましょう。

  1. 24÷9=2あまり6 (24と9の最大公約数は、9と6の最大公約数)
  2. 9÷6=1あまり3 (9と6の最大公約数は、6と3の最大公約数)
  3. 6÷3=2あまり0 (6と3の最大公約数は、3)

「3」は6と3の最大公約数であり、つまり、24と9の最大公約数。

さて、一体何が起きているのか、ここからは図を使ってみていきましょう。

① 24と9の最大公約数、第一候補は「9」

大きい数と小さい数があれば、小さい数が最大公約数の第一候補になります。(厳密には絶対数の小さい数字)24と9の場合は「9」です。

24÷9=2…6

6余ってしまうので、「9」は最大公約数ではないようです。

例えば、24と8だったら、24÷8=3 で割り切れるから、

「8」が最大公約数になるんだね。

② 24と9の最大公約数、第二候補は「6」

先ほど、6が余ってしまったので、次に24と9の最大公約数になる候補は、この「6」になります。

もし、24と9がどちらも6で割り切れるなら、次の図のような状態になります。

24は「6」だけで構成することができるし、9も「6」だけで構成できる。これが公約数というものです。

しかし、9÷6=1…3
と3余ってしまうので、これも違います。

余ってしまうということは、6は9の約数ではありません。当然、24と9の最大公約数ではないということになります。

③ 24と9の最大公約数、第三候補は「3」

今度は、余った3が、24と9の最大公約数の次の候補となります。

6÷3=2

今度は余りが出ません! つまり、次の図のようになります。

余りが出ないということは、ここで初めて、全て同じ値(3)で分割できるということになります。
図を見ると、24も9も「3」で分割されているのがわかります。

この段階で初めて、24と9の公約数が登場しました。つまり、24と9の最大公約数は3であるということになるのです。

最大公約数を求めるプログラムをPythonで実装してみる

ユークリッドの互除法を使って、最大公約数を求める方法をPythonで表現してみました。

やり方のポイントをおさらいしましょう。

  • 大きい数を小さい数で割って、商と余りを求める。
  • 小さい数を余りで割って、その商と余りを求める。
  • 同様に「割った数」を「余り」で割る作業を繰り返す。
  • 余りが0になったら、その時に「割った数」が最大公約数になる。

割る数と割られる数を変化させながら、割り切れるまで作業を繰り返すので、while文でループする必要が出てきますね。また、割り切れたらループを抜け出すコードも書かないといけません。
一例ですが、次のようなコードになります。

a = 24
b = 9

while True:
	# 割り切れたら終了。割った数bが最大公約数
	if a%b == 0:
		break

	# 割り切れなかったら、「割る数」「割られる数」を変更。
	a, b = b, a%b

print('最大公約数は', b, 'です。')

コメント

タイトルとURLをコピーしました