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