#############################################
#                                           #
#  This is test script for 'polynomial.rb'  #
#                                           #
#############################################
require "algebra/polynomial.rb"
require "algebra/residue-class-ring"
require "mathn"
require 'assert'

Fx = Algebra::Polynomial.create(Integer, "x")
x = Fx.var

f = x**6 - 1
g = (x^4) -1

d, t, u = f.gcd_coeff(g)
#puts "(#{t})(#{f}) + (#{u})(#{g}) = #{t * f + u * g} = #{d}"
assert t*f + u*g, d

Fy = Algebra::Polynomial.create(Rational, "y")
y = Fy.var

f = y**3 - 3*y + 2
g = y**6 - 1
h = y**4 - 1

assert f.gcd_all(g, h), -14/9*y + 14/9

d, a, b, c =  f.gcd_coeff_all(g, h)

assert a*f+b*g+c*h, d

# Polynimial is a commutative multi-variable ring
Fxy = Algebra::Polynomial.create(Fx, "y")
x = Fx.var
y = Fxy.var
assert x**2 * y**2 - y**2 * x**2, 0

require "algebra/algebraic-parser"
assert AlgebraicParser.eval("(x + y)**10 - (y**2 + 2*x*y + x**2)**5)", Fxy), 0

require "algebra/rational"
#  A = Algebra::Polynomial.create(Rational, "x")
#  x = A.var
#  B = Algebra::Polynomial.create(A, "y")
#  y = B.var
#  C = Algebra::Polynomial.create(B, "z")
#  z = C.var
#  D = Algebra::Polynomial.create(C, "w")
#  w = D.var
#  p( (x+y+z+w)**4 )

K = Algebra::Polynomial.create(Integer, "x", "y", "z", "w")
x, y, z, w = K.vars
assert (x+y+z+w)**4, (x+y+z+w)**2 * (x+y+z+w)**2

L = Algebra::Polynomial.create(Integer, 'x', 'y', 'z')
x, y, z = L.vars
f = x * y * z
assert f.sub(y, y-1), x*(y-1)*z
f = (x - y)*(y - z - 1)
assert f.sub(y, z+1), 0


syntax highlighted by Code2HTML, v. 0.9.1