static unsigned exam_factor1()
{
unsigned result = 0;
- ex e, d;
+ ex e;
symbol x("x");
lst syms;
syms.append(x);
static unsigned exam_factor2()
{
unsigned result = 0;
- ex e, d;
+ ex e;
symbol x("x"), y("y"), z("z");
lst syms;
syms = x, y, z;
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;
+}
+
unsigned exam_factor()
{
unsigned result = 0;
result += exam_factor1(); cout << '.' << flush;
result += exam_factor2(); cout << '.' << flush;
+ result += exam_factor3(); cout << '.' << flush;
return result;
}
}
return o;
}
-ostream& operator<<(ostream& o, const vector<cl_I>& v)
+static ostream& operator<<(ostream& o, const vector<cl_I>& v)
{
vector<cl_I>::const_iterator i = v.begin(), end = v.end();
while ( i != end ) {
}
return o;
}
-ostream& operator<<(ostream& o, const vector<cl_MI>& v)
+static ostream& operator<<(ostream& o, const vector<cl_MI>& v)
{
vector<cl_MI>::const_iterator i = v.begin(), end = v.end();
while ( i != end ) {
const ex& x = *syms.begin();
// make polynomial primitive
- ex p = poly.collect(x);
- ex cont = p.lcoeff(x);
- for ( int i=p.degree(x)-1; i>=p.ldegree(x); --i ) {
- cont = gcd(cont, p.coeff(x,i));
- if ( cont == 1 ) break;
- }
- ex pp = expand(normal(p / cont));
+ ex unit, cont, pp;
+ poly.unitcontprim(x, unit, cont, pp);
if ( !is_a<numeric>(cont) ) {
return factor_sqrfree(cont) * factor_sqrfree(pp);
}
// try Hensel lifting
ex res = hensel_multivar(pp, x, epv, prime, l, modfactors, C);
if ( res != lst() ) {
- ex result = cont;
+ ex result = cont * unit;
for ( size_t i=0; i<res.nops(); ++i ) {
result *= res.op(i).content(x) * res.op(i).unit(x);
result *= res.op(i).primpart(x);