原です。

早速ですが小さいバグを直しました。

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

です。また、最初から係数体を指定できるようにしました。

   require "rational"
   require "groebner-basis"
   x, y, z = MPolynomial.var("xyz", Rational)
   f1 = x**2 + y**2 + z**2 -1
   f2 = x**2 + z**2 - y
   f3 = x - z
   p Groebner.basis([f1, f2, f3])
     #=> [x - z, y - 2z^2, z^4 + 1/2z^2 - 1/4]

とできます。ついでに、Groebner.basis_coeff と divmod_s を追加しました。

----------------------------------------------------------------
4.グレブナー基底をもとの基底で表現する(Groebner.basis_coeff)

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

   coeff, basis = Groebner.basis_coeff([f1, f2, f3])
   basis.each_with_index do |b, i|
     p coeff[i].inner_product([f1, f2, f3]) == b #=> true
   end

5.任意の基底で割った強い意味の商と余りを求める(divmod_s)

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

   q, r = (x**2 + y**2).divmod_s(f1, f2, f3)
   p q #=> [1, x^2 - z^2, -x^3 - x^2z + xy - xz^2 + yz - z^3]
   p r #=> -z^2 + 1
   p x**2 + y**2 == q.inner_product([f1, f2, f3]) + r #=> true
----------------------------------------------------------------


えーと、何をやってんだか分からないかもしれないので (^^;、少し例を。

例えば「ルート2足す1の逆数」を求めたいとしますね。これは、ふつう「分母
の有理化」という事をします。つまり、aをルート2とすると

   1/(a+1) = (a-1)/((a-1)(a+1)) = (a-1)/(a**2 - 1) = a - 1

と。でもこれを多項式を使うと次のようにできます。

   require "polynomial"
   require "rational"
   a, = Polynomial.var("a", Rational)
   q, x, y =  (a+1).gcd_coeff(a**2-2) #=> -1, -a + 1, 1

このとき

   q == x*(a+1) + y*(a**2-2)

がなりたつので、a にルート2を代入すると q == x*(a+1) であり、
今、q は -1 なので、a+1の逆数は -x つまり a-1 です。q はこの
ようなケースでは必ず1か-1になります。

ではaをルート2、bを3の3乗根としたとき、a+bの逆数はどうするか
というと、これの多変数バージョンをするわけです。

   require "groebner-basis"
   require "rational"

   a, b, c = MPolynomial.var("abc", Rational)
   coeff, basis = Groebner.basis_coeff([a+b, a**2-2, b**3-3])

このとき例えば次のような等式は常に成り立ちます。  

  coeff[0][0]*(a+b) + coeff[0][1]*(a**2-2) + coeff[0][2]*(b**3-3) ==
    basis[0]

ところが、今 basis[0] の値は1です。(これは偶然ではなく、その様にしてく
れるのがグレブナ基底云々のよいところなのだけど。)よって、a+bの逆数は
coeff[0][0]つまり、

  -2a^3 + 2a^2b + 3a^2 - 2ab^2 - 3ab + 3b^2

です。便利でしょう?(ほんまか?)まあ、このケースなら分母の有理化はま
だ手で出来るけど

   a**2 - 2 = 0
   b**3 - 3 - 3*a = 0

なんてケースだと

   1/(a+b) = -5/41a^2b + 5/41ab^2 + 3/41ab + 10/41a - 3/41b^2 - 6/41

なんてなるから、まあ手でする気にはならないですよね。

これらはほんの小さな応用であって、もっとおもしろい事がいっぱいありそう。