SICP 問題2.92(複数変数の多項式)

問題

変数に順序をつけることで、多項式パッケージを拡張し、異なる変数の多項式に対しても多項式の可算と乗算ができるようにせよ。(易しくはない)

解答

この問題どう考えるんだろう。。一番簡単に考えると、指定した変数で正規化した多項式を生成することだよね。
濃い多項式の正規化(最高次数、最低次数の係数が0の時の消去)についてはやったけど、
変数に対する正規化ってどこに定義するべきなんだろう。。

まずは薄い・濃い多項式での多重変数多項式が、実際にどう表現されるのかを具体的なリストで作成してみるべきか。じゃないと方針が見えないしな。

;変数が一つ(x)のみの、普通の多項式
(make-polynomial-light 'x '((3 2)
			    (2 1)
			    (1 -4)
			    (0 1)
			    (-1 8)))
;変数が二つ(x,y)ある、多重変数多項式
(make-polynomial-light 'x '((3 (make-polynomial-light 'y '((2 1)
							   (1 7)
							   (-1 2))))
			    (2 1)
			    (1 (make-polynomial-light 'y '((3 1 (0 -2)))))
			    (0 1)
			    (-1 8)))
;変数が二つ(x,y)あり、かつ同じ変数が階層の異なる多項式に入れ子になっているる、多重変数多項式
(make-polynomial-light 'x '((3 (make-polynomial-light 'y '((2 1)
							   (1 7)
							   (-1 2))))
			    (2 1)
			    (1 (make-polynomial-light 'y '((3 (make-polynomial-light 'x '((5 2)
											  (2 -4))))
							   (0 2))))
			    (0 1)
			    (-1 8)))

2つ目の多項式はともかく、3つ目の入れ子になってる多項式ってどうやって正規化するんだろう。。
数式化するとこんな感じに再展開される。


\,\,\,\,\,\,(y^2 + 7y + 2y^{-1})x^3 + x^2 + ((2x^5 - 4x^2)y^3 + 2)x + 1 + 8x^{-1}
=(y^2 + 7y + 2y^{-1})x^3 + x^2 + 2x^6y^3 - 4x^3y^3 + 2x + 1 + 8x^{-1}
=2y^3x^6 + (- 4y^3 + y^2 + 7y + 2y^{-1})x^3 + x^2 +  2x + 1 + 8x^{-1}

何となくだけど、全部一度「単項」の多項式にしてから、更に「指定した変数」で正規化(それ以外の変数は定数とみなす)すればいける感じ?
全部単項にするとなるとものすご〜く無駄なプロセスが発生するけど。。他に思いつかないもんなー。

・・・いや、これ違うな。そもそも多項式を演算したときに「展開」した状態にしたいってのが本来の目的なんじゃね?
つまり最終的に (polynomial 表現モード 変数 項リスト) ってリストは、入れ子になってない状態で表現したいんじゃないの?

ってことは、上の数式なら最終的には、


=2y^3x^6 - 4y^3x^3 + y^2x^3 + 7yx^3 + 2y^{-1}x^3 + x^2 + 2x + 1 + 8x^{-1}

って表現になればいいんじゃなかろうか。となるとS式での表現はどうなる?変数二つが一つの項に組み込まれていて、それぞれ次数が異なって、更に定数係数がある。。
薄い多項式ならばこんな感じになればいいか?

;例
(polynomial light '(変数1 変数2 ...) '(((変数1の次数 変数2の次数 ...) 係数)
			  	       ((変数1の次数 変数2の次数 ...) 係数)
				      ...))
;上述の多項式の具体例の場合
(polynomial light '(x y) '(((6 3) 2)
			   ((3 3) -4)
			   ((3 2) 1)
			   ((3 1) 7)
			   ((3 -1) 2)
			   ((2 0) 1)
			   ((1 0) 2)
			   ((0 0) 1)
			   ((-1 0) 8)))

これだ!


で、ここまできて不安になって他の人の解答みたら同じイメージだった。かなりうれしい。
あ。でも濃い多項式だとどう表現すればいいんだ??