最大公約数

最大公約数を求める手続き gcd 。ユークリッドの互除法 - Wikipediaを見て思い出しつつ実装。
Bignum に関しては GMP に gcd を求める関数があるのだけどまあいいか。

(define (gcd2 m n)
  (if (zero? n)
      (abs m)
      (gcd2 n (mod m n))))

(define (gcd . n*)
  (unless (for-all integer-valued? n*)
    (assertion-violation 'gcd "integer valued numbers required"))
  (case (length n*)
    [(0) 0]
    [(1) (abs (first n*))]
    [(2) (gcd2 (first n*) (second n*))]
    [else
     (apply gcd (gcd2 (first n*) (second n*)) (cddr n*))]))


全然関係ないけど、n* のような命名規則でリストを表現するのも意図が明確で良いと思うようになった。論文や psytax のコードでよく見られる。env のリストが env* のような規則。