-#ifdef DEBUGFACTOR
-ostream& operator<<(ostream& o, const vector<EvalPoint>& v)
-{
- for ( size_t i=0; i<v.size(); ++i ) {
- o << "(" << v[i].x << "==" << v[i].evalpoint << ") ";
- }
- return o;
-}
-#endif // def DEBUGFACTOR
-
-static ex hensel_multivar(const ex& a, const ex& x, const vector<EvalPoint>& I, unsigned int p, const cl_I& l, const upvec& u, const vector<ex>& lcU)
+/** Multivariate Hensel lifting.
+ * The implementation follows the algorithm in chapter 6 of [GCL].
+ * Since we don't have a data type for modular multivariate polynomials, the
+ * respective operations are done in a GiNaC::ex and the function
+ * make_modular() is then called to make the coefficient modular p^l.
+ *
+ * @param a multivariate polynomial primitive in x
+ * @param x symbol (equiv. x_1 in [GCL])
+ * @param I vector of evaluation points (x_2==a_2,x_3==a_3,...)
+ * @param p prime number (should not divide lcoeff(a mod I))
+ * @param l p^l is the modulus of the lifted univariate field
+ * @param u vector of modular (mod p^l) factors of a mod I
+ * @param lcU correct leading coefficient of the univariate factors of a mod I
+ * @return list GiNaC::lst with lifted factors (multivariate factors of a),
+ * empty if Hensel lifting did not succeed
+ */
+static ex hensel_multivar(const ex& a, const ex& x, const vector<EvalPoint>& I,
+ unsigned int p, const cl_I& l, const upvec& u, const vector<ex>& lcU)