def PolyDecompose_incomplete(f, facts = f.factorize)
# this is wrong algorithm
vars = []
var = "a"
facts.each do |f, n|
dim = f.deg
next if dim <= 1
dim.downto 1 do
vars.unshift var
var = var.succ
end
end
pr = Algebra.MPolynomial(f.ground)
vs = pr.vars(*vars)
i = 0
fs = []
facts.each do |f, n|
dim = f.deg
if dim > 1
sym = symmetric_product(vs[i, dim])
fa = (1..dim).collect{|j| sym[j] - f[dim-j]*(-1)**j}
fs.concat fa
i += dim
end
end
pr.sysvar(:basis, Groebner.basis(fs))
pr.class_eval "
def inverse
qs, bs = Groebner.basis_coeff([self] + @@basis)
unless bs == [1]
raise self.to_s + \" can't be inverted.\"
end
qs[0][0]
end
"
rs = Algebra.ResidueClassRing(pr, pr.basis)
rs.sysvar(:vars, pr.vars.collect{|v| rs[v]})
rs
end
syntax highlighted by Code2HTML, v. 0.9.1