理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

問題 3-60 (3.5.2 Infinite Streams)

無限ストリームとして表されたべき級数同士をかけ合わせる,mul-series を作成する問題.気付くまで,考え方が難しかった...

乗算に用いるべき級数A=\sum a_i x^iB=\sum b_i x^i とする.このとき,A\times B をどう考えるかってことなんだけど,こう考えると失敗する.ていうか失敗した.は,これ,どう書き下せばいいの?バカなの?死ぬの?みたいな感じ.
A\times B=\sum_{i=0}^{\infty} \{ \left(\sum_{j=0}^{i} a_jb_{i-j}\right) x^i\}

むしろ自然に,以下のように考えるべきだった.
A\times B=a_0b_0 + a_0\sum_{i=1}^{\infty}b_ix^i + \left( \sum_{i=1}^{\infty}a_ix^i\right)\left(\sum_{i=0}^{\infty}b_ix^i\right)
これを Scheme として書き下せばいい.

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

これで,\sin^2 x + \cos^2 x = 1 をテストする.

(define s (add-streams (mul-series cosine-series cosine-series)
                       (mul-series sine-series sine-series)))
(dump-stream s 10) ; 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, done

たしかに 1 になってるなー.