リハビリ

複素数の四則演算なソレを Gauche で。
まず加算。

(define plus (lambda (x y) (list (+ (car x) (car y)) (+ (cadr x) (cadr y)))))

あるいは減算。

(define minus (lambda (x y) (list (- (car x) (car y)) (- (cadr x) (cadr y)))))

で、確認。

gosh> (plus '(1 2) '(1 2))
(2 4)
gosh> (minus '(1 2) '(1 2))
(0 0)

で、良いのかな。積はどうすりゃ良いのかな。

(define mul
  (lambda (x y)
    (list (- (* (car x) (car y)) (* (cadr x) (cadr y)))
          (+ (* (car x) (cadr y)) (* (cadr x) (car y))))))

ええと試験してみます。

gosh> (mul '(1 2) '(1 2))
(-3 4)

一応あってるように見えます。割り算は結構アレ。

(define div
  (lambda (x y)
    (let ((denom (+ (* (car y) (car y)) (* (cadr y) (cadr y)))))
      (list (/ (+ (* (car x) (car y))
                  (* (cadr x) (cadr y)))
               denom)
            (/ (- (* (cadr x) (car y))
                  (* (car x) (cadr y)))
               denom)))))

検算が大変。

gosh> (div '(1 2) '(1 2))
(1 0)

ええと、denom は上だと 5 になるのかな。実数部は確かに 1 になります。虚数部は分子が 0 なので 0 なのか。