原です。

新しい polynomial ライブラリを

   http://blade.nagaokaut.ac.jp/~sinara/ruby/math/

に置きました。まだマニュアルがありません。(^^;

そこでは、(READEME に色んな例がありますが)代数系についてちょっと
新しい処理方法を使っています。

手っ取り早く言うと、例えば、多項式環で

   x + y + z

というのを見たとき x の多項式だと思えば y + z は定数だし、y の多項式
と思うと x + z が定数、z の多項式と思うと x + y が定数です。つまり、
「どう思うか?」というのを、今までの coerce アーキテクチャ内でどう
表現するか?という事が問題なわけです。

そこで、次のようにしました。

   Py = Polynomial(Integer, "y")
   y = Py.var
   Pyx = Polynomial(Py, "x")
   x = Pyx.var
   Pyxz = Polynomial(Pyx, "z")
   z = Pyxz.var

と定義すれば、x + y + z の定数は x + y であり、x + y の定数は y です。
ここで、Polynomial() が返しているのは(無名の)クラスで、パラメータを
クラス変数として格納させています。つまりおのおのクラスは「自分にとって
の係数環」とは何かを知っているわけです。自分に取って不明なオブジェクト
がオペランドに来た場合、すぐに coerce に頼むのではなく、自分の係数環
あるいはその係数環あるいはそのまた係数環、、、と探して、定数ではないか
を判断し、ほんとに定数でないと判断したときに coerce にお願いする、とい
うのがこのシステムです。

これと、この前話題になった、「自分にとっての zero」、「自分にとっての 
unity」を知っているとかなり数学的な表現が Ruby の上に乗るようです。

#ちなみに、乗法の単位元の名前ですけど、unit だと環の乗法群を意味して
#しまいそうなので、unity の方がいいかなと思っています。

今まで、無名クラスって何かやばいような、根拠の無い不安をもってたのです
が、無名クラスも普通のクラスとほとんど全く同じように扱える様なので、思
い切ってパラメトライズド・クラスを作るのに多用してみました。

試しにケーレー・ハミルトンの定理の証明をしてみましょう。

   n = 5
   require "matrix-algebra"
   require "m-polynomial"
   require "polynomial"

   R = MPolynomial(Integer)    # 整数係数多変数多項式環
   MR = SquareMatrix(R, n)     # 整数係数多変数多項式環上のn次正方行列
   m = MR.matrix{|i, j| R.var("x#{i}#{j}")} #各要素が変数の行列インスタンス
   Rx = Polynomial(R, "x")     # 整数係数多変数多項式環上のn次正方行列上の多項式環
   ch = m.char_polynomial(Rx ) # 固有多項式
   p ch.evaluate(m)            # 固有多項式をその行列で評価すると=0

これ、n = 6 だと計算するのに十分以上かかります。(^^;

かなりイケテルと思うのですが、他のオブジェクト指向言語上では、どんな
風に代数的対象を表現しているのでしょうか、興味があります。