Exercise 3.60.

Exercise 3.60.

べき級数ストリームの乗算を行う mul-series を考える問題。

まずは

書いて考えてみる。

(a0+a1*x1+a2*x2+a3*x3+...)*(b0+b1*x1+b2*x2+b3*x3+...)
 = {a0+(a1*x1+a2*x2+a3*x3+...)}*{b0+(b1*x1+b2*x2+b3*x3+...)} ---(1)

ここで、 A1 = a1*x1+a2*x2+a3*x3+..., B1 = b1*x1+b2*x2+b3*x3+... とすると、(1) は

 = a0*b0 + a0*B1 + b0*A1 + A1B1
 = a0*b0 + (a0+A1)*B1 + b0*A1
 = a0*b0 + A0*B1 + b0*A1

となる。
このとき a0*b0 は定数項で、 A0*B1 と b0*A1 は最低次数が 1 なので、a0*b0 は mul-series で作られるストリームの car になり、A0*B1 + b0*A1 が cdr に相当すると考えることができる。これをそのまま scheme にすると

(define (mul-series s1 s2)
  (stream-cons (* (stream-car s1) (stream-car s2))
               (add-streams (mul-series s1 (stream-cdr s2))
                            (scale-streams (stream-cdr s1) (stream-car s2)))))

となる。

多項式の計算はとりあえずこねくり回してみるに限ります。そこから何かが見えてくる(時もある)。今回はうまく見えました。

実際に確かめてみる

sin^2+con^2 = 1 を確かめてみます。

(define s (add-streams (mul-series sine-series sine-series)
                       (mul-series cosine-series cosine-series)))
(define i 0)
(until (= i 10)
        (format #t "~s " (stream-ref s i ))
        (inc! i))
(format #t "\n")

を実行すると

1 0 0 0 0 0 0 0 0 0

となりました。OK ですね。