原です。

来年度の授業に多項式の話をするので、グレブナ基底を求めるライブラリを書い
てみました。

http://blade.nagaokaut.ac.jp/~sinara/ruby/math/polynomial-1.0.tar.gz

です。まだ出来たてなのでアルゴリズムは最も素朴なものです。

すでに児玉さんのライブラリが

http://www.math.s.kobe-u.ac.jp/~kodama/tips-RubyPoly.html

があるのですがこれよりだいぶ遅いです。


書いてみて、やっぱり Ruby は数学の役に立つか?というとわからないけど、
数学教育の役に立つか?というとこれは確実に YES だということはわかり
ました。


以下 READEME
--------------------------------------------------------------------------
多項式計算パッケージ(m-polynomial) 2001.03.20

原 信一郎 (sinara / blade.nagaokaut.ac.jp)

これは1変数あるいは多変数の多項式を計算するためのライブラリです。

<パッケージ内容>
m-polynomial.rb        任意の環上の多変数多項式環のクラス
groebner-basis.rb      グレブナ基底の計算モジュール
polynomial.rb          任意の環上の1変数多項式環のクラス
alg-parse.rb           任意の環上の多元環の式の文字列表現を評価するモジュール
euclidian-ring.rb      ユークリッド環ユティリティー(G.C.D.のみ)
residue-class-ring.rb  剰余環 Z/n のクラス
cast.rb                型キャストライブラリ
polynomial-cast.rb     型キャストライブラリ
m-index.rb             m-polynomial.rb の下請け
test-groebner-basis.rb グレブナ基底の計算チェックテスト

<簡単な紹介>

1.多項式を複数の多項式で割った余りを求める

   require "m-polynomial"
   require "mathn"
   x, y, z = MPolynomial.var("xyz")
   f = x**2*y + x*y**2 + y*2 + z**3
   g = x*y-z**3
   h = y*2-6*z

   MPolynomial.set_ord(:lex) # lex, grlex, grevlex
   puts "(#{f}).divmod([#{g}, #{h}]) =>", "#{f.divmod(g, h).inspect}"
   #=> (x^2y + xy^2 + 2y + z^3).divmod([xy - z^3, 2y - 6z]) =>
   #   [[x + y, 1/2z^3 + 1], xz^3 + 3z^4 + z^3 + 6z]
 #   = [[商1, 商2], 余り]

2.多項式のグレブナ基底を求める

   require "groebner-basis"
   x, y, z = MPolynomial.var "xyz"
   f1 = x**2 + y**2 + z**2 -1
   f2 = x**2 + z**2 - y
   f3 = x - z

   require "mathn"
   p Groebner.basis([f1, f2, f3])
   #=> [x - z, y - 2z^2, z^4 + 1/2z^2 - 1/4]


3.一般の体上の多項式のグレブナー基底を求める

   require "groebner-basis"
   x, y, z = MPolynomial.var "xyz"
   f1 = x**2 + y**2 + z**2 -1
   f2 = x**2 + z**2 - y
   f3 = x - z

 # 有理数体上
   require "rational"
   e1 = Rational.new(1,1)
   p Groebner.basis([e1*f1, e1*f2, e1*f3])
   #=> [x - z, y - 2z^2, z^4 + 1/2z^2 - 1/4]

   # 標数 5 の素体上
   require "residue-class-ring"
   F5 = ResidueClassRing(5)
   e1 = F5.unit
   p Groebner.basis([e1*f1, e1*f2, e1*f3])
   #=> [x - z, y + 3z^2, z^4 + 3z^2 + 1]