【学習ログ】【Ruby】最大公約数を求めるアルゴリズム

※このページは過去に自分がRubyの勉強をしたときの学習ログです。誰かの参考になれば幸いです。

最大公約数を求めるアルゴリズム

いきなり完成コード

def greatest_common_divisor(a,b)
    
  if a < b
    a, b = b, a
  end
  
  while
    c = a % b
    
      if c == 0
      return b
      end

    a, b = b, c
  end
end

puts greatest_common_divisor(66,32)

試行錯誤の上、上記のコードで落ち着いた。
ちなみに引数に’0’とか渡すと、下記のようなエラーになる。

algorithm_exercise1.rb:21:in `%': divided by 0 (ZeroDivisionError)
        from algorithm_exercise1.rb:21:in `greatest_common_divisor'
        from algorithm_exercise1.rb:32:in `<main>'

簡単に用語の説明から

最大公約数とは?

それぞれの数字の共通の約数(公約数)の中で一番大きな数字のこと。最大公約数を求める方法の一つとしてユークリッドの互除法という計算方法がある。

ユークリッドの互除法(ごじょほう)とは?

スミマセン、私数学的なものが大の苦手で・・用語を調べても重要な性質とやら数式とやらで、もうサッパリ。なんとか読み砕いて、だいたいこういうことだろうなということで落ち着いた。

aとbの最大公約数を求める時(a>bであることが前提)
① まずaとbを割った数を求め、その余り(c)を割り出す。
② bの値をaへ、cの値をbへ移動する
③ ①と②を余りが0になるまで繰り返す
⑤ 余りが0になったときにbに入っている値が最大公約数

私なりの解釈

そもそも、最大公約数とかユーグリットの互除法とかかなり無知なレベルだったので、理解に時間がかかったが自分なりに解釈した結果は以下。

a, b = b, c #処理が続く間は、bをaにcをbに代入し続けるのくだりについて
以下のような図を作ってみた。


正確ではないかもしれないが、だいたいこんな感じだろうか・・

本日は以上となります。

最後までお読みくださりありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする