From: "K.Kodama" <kdm / kobe-kosen.ac.jp>
Subject: [ruby-list:20239] Re: class Polynomial
Date: Mon, 17 Jan 2000 13:31:32 +0900
Message-ID: <20000117133147U.kdm / kobe-kosen.ac.jp>
> >  p1 = Polynomial.new([1,2,3,4])
> >  # または p1 = Polynomial.new(1,2,3,4)
> > 
> > みたいな書き方ができた方が直観的で個人的に好きです.
> 
> 確かにそうですね.  new はこの形式を採用.
> to_poly は廃止した方が良いですか?

一旦作っておきながら, Array と Numeric の to_poly に分解して
廃止した Polynomial() を回復しました.
p1 = Polynomial([1,2,3,4])
p2 = Polynomial(1,2,3,4)
p3 = Polynomial("1+2x+3x^2+4x^3")
p4 = Polynomial("1+2*x+3*x**2+4*x**3")
p5 = Polynomial("(x+1)^10(x-1)^(10)")
とか書けます.
# new は無し

initialize は Polynomial class では書かずに
Array に任せる事にしました.

[質問]
p1=Polynomial([5,6,7]) のような Array から
Polynomial への "関数" としての記述と,
[5,6,7].to_poly のような, 
"右からの作用" としての記述で Ruby 的にはどちらが自然なんでしょうか?
complex.rb でも def Complex(a,b)とかしてますよね?

> >  p1 = Polynomial.new(3,2)
> > 
> > とかは
> 
> これは, 単項式 cx^n を生成したい場合ですが,
> Polynmial.term(n,c) とかでどうでしょうか?


new で代用とかいう邪悪なことは止め.
これも実は一旦作って廃止していた term を回復して
p1=Polynmial.term(3,4)
で 3*x^4 を表すことにしました. term(c,n) の順.


> > class Polynomial
> >   def initialize(arg)
> >     case arg
> >     when Array
> >       @array = arg
...

実装は相変わらず, Array の継承です.
っていうか, ちょっと決心がつきかねている点が....

[質問1]
p1 を Polynomial, @coefficients をインスタンス変数として
(上でいう @array ね.)
class の外からこのインスタンス変数を
p1.coefficients[5] = p1.coefficients[6] みたいに
Array として直接参照する自然な方法は?
attr :coefficients
で良いのかな?


上のように, インスタンス変数で実装した場合,
Array からの継承と比較して,
係数へのアクセスは 20--30% 程度遅くなるようです.
これは ちょっと嫌.
整数係数1変数多項式系の
グレブナベ−スの計算とかもやりたいので
速い方が望ましい.


インスタンス変数として実装すると
array + poly の 多項式の和としての coerce がうまく行く点は
明確な改善です.
Array の継承だと
array + poly が Array としての連結になってしまうので.


[質問2]
記述上の気分の問題ですが,
p1 が Polynomial のとき, 係数を扱いたい場合,
Array の継承で p1[5]=p1[6] のような表記と
@coefficients をインスタンス変数として
p1.coefficients[5]=p1.coefficients[6] のような表記で
どれだけ違うのか.

Array としての構造を完全に隠蔽するつもりはもともと無いので,
数列(配列)と 母関数(多項式) を直接同一視しちゃうっていう
怠け者がどれだけ居るかって事かな?

-- 
K.Kodama(kodama / kobe-kosen.ac.jp)