+static unsigned exam_factor2()
+{
+ unsigned result = 0;
+ ex e;
+ symbol x("x"), y("y"), z("z");
+ lst syms;
+ syms = x, y, z;
+
+ e = ex("x+y", syms);
+ result += check_factor(e);
+
+ e = ex("(x^2-y+1)*(x+y)", syms);
+ result += check_factor(e);
+
+ e = ex("-2*(x+y)*(x-y)", syms);
+ result += check_factor(e);
+
+ e = ex("(16+x^2*z^3)*(-17+3*x-5*z)*(2*x+3*z)*(x-y^2-z^3)", syms);
+ result += check_factor(e);
+
+ e = ex("(x-y*z)*(x-y^2-z^3)*(x+y+z)", syms);
+ result += check_factor(e);
+
+ e = ex("-(y^2-x+z^3)*x*(x+y+z)", syms);
+ result += check_factor(e);
+
+ e = ex("-316*(3*x-4*z)*(2*x+3*z)*(x+y)*(-1+x)", syms);
+ result += check_factor(e);
+
+ e = ex("(x+x^3+z^2)*(3*x-4*z)", syms);
+ result += check_factor(e);
+
+ e = ex("250*(-3+x)*(4*z-3*x)*(x^3+z^2+x)*x", syms);
+ result += check_factor(e);
+
+ e = ex("327*(x+z^2+x^3)*(3*x-4*z)*(-7+5*x-x^3)*(1+x+x^2)", syms);
+ result += check_factor(e);
+
+ e = ex("x-y^2-z^3", syms);
+ result += check_factor(e);
+
+ e = ex("-390*(7+3*x^4)*(2+x^2)*(x-z^3-y^2)", syms);
+ result += check_factor(e);
+
+ e = ex("55*(1+x)^2*(3*x-4*z)*(1+x+x^2)*(x+x^3+z^2)", syms);
+ result += check_factor(e);
+
+ e = ex("x+y*x-1", syms);
+ result += check_factor(e);
+
+ e = ex("390*(-1+x^6-x)*(7+3*x^4)*(2+x^2)*(y+x)*(-1+y-x^2)*(1+x^2+x)^2", syms);
+ result += check_factor(e);
+
+ e = ex("310*(y+x)*(-1+y-x^2)", syms);
+ result += check_factor(e);
+
+ return result;
+}
+
+static unsigned exam_factor3()
+{
+ unsigned result = 0;
+ ex e;
+ symbol k("k"), n("n");
+ lst syms;
+ syms = k, n;
+
+ e = ex("1/2*(-3+3*k-n)*(-2+3*k-n)*(-1+3*k-n)", syms);
+ result += check_factor(e);
+
+ e = ex("1/4*(2*k-n)*(-1+2*k-n)", syms);
+ result += check_factor(e);
+
+ return result;
+}
+
+static unsigned check_factorization(const exvector& factors)
+{
+ ex e = (new mul(factors))->setflag(status_flags::dynallocated);
+ ex ef = factor(e.expand());
+ if (ef.nops() != factors.size()) {
+ clog << "wrong number of factors, expected " << factors.size() <<
+ ", got " << ef.nops();
+ return 1;
+ }
+ for (size_t i = 0; i < ef.nops(); ++i) {
+ if (find(factors.begin(), factors.end(), ef.op(i)) == factors.end()) {
+ clog << "wrong factorization: term not found: " << ef.op(i);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static unsigned factor_integer_content_bug()
+{
+ parser reader;
+ exvector factors;
+ factors.push_back(reader("x+y+x*y"));
+ factors.push_back(reader("3*x+2*y"));
+ return check_factorization(factors);
+}
+