--- title: 車輪の再発名だけど、ユークリッドの互除法 author: kazu634 date: 2008-09-21 wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4287;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - gauche - Lisp ---

Gaucheでユークリッドの互除法を考える。とりあえずアルゴリズムはwikipediaに載っているから、それを再帰的になるように書き直す。自分は、ユークリッドの互除法を実現するために必要なことは全部知っているはずだから、できるはず。がんばる。

  1. 入力を m, n (m ≧ n) とする。
  2. n = 0 なら、 m を出力してアルゴリズムを終了する。
  3. n が m を割り切るなら、 n を出力してアルゴリズムを終了する。
  4. m を n で割った余りを新たに m とし、更に m と n を取り替えて 3. に戻る。

ユークリッドの互除法 – Wikipedia

がんばった結果:

(define (euclid m n)
(cond [(= n ) m]
[(= (remainder m n) ) n]
[else (euclid n (remainder m n))]))
gosh> (euclid 6 2)
2
gosh> (euclid 5 2)
1
gosh> (euclid 100 3)
1