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 ですね。