#if 0
std::clog << "Symbols:\n";
- it = v.begin(); itend = v.end();
+ auto it = v.begin(), itend = v.end();
while (it != itend) {
- std::clog << " " << it->sym << ": deg_a=" << it->deg_a << ", deg_b=" << it->deg_b << ", ldeg_a=" << it->ldeg_a << ", ldeg_b=" << it->ldeg_b << ", max_deg=" << it->max_deg << ", max_lcnops=" << it->max_lcnops << endl;
- std::clog << " lcoeff_a=" << a.lcoeff(it->sym) << ", lcoeff_b=" << b.lcoeff(it->sym) << endl;
+ std::clog << " " << it->sym << ": deg_a=" << it->deg_a << ", deg_b=" << it->deg_b << ", ldeg_a=" << it->ldeg_a << ", ldeg_b=" << it->ldeg_b << ", max_deg=" << it->max_deg << ", max_lcnops=" << it->max_lcnops << std::endl;
+ std::clog << " lcoeff_a=" << a.lcoeff(it->sym) << ", lcoeff_b=" << b.lcoeff(it->sym) << std::endl;
++it;
}
#endif
}
// Some trivial cases
- ex aex = a.expand(), bex = b.expand();
+ ex aex = a.expand();
if (aex.is_zero()) {
if (ca)
*ca = _ex0;
*cb = _ex1;
return b;
}
+ ex bex = b.expand();
if (bex.is_zero()) {
if (ca)
*ca = _ex1;
*cb = b;
return _ex1;
}
- // move symbols which contained only in one of the polynomials
- // to the end:
+ // move symbol contained only in one of the polynomials to the end:
rotate(sym_stats.begin(), vari, sym_stats.end());
sym_desc_vec::const_iterator var = sym_stats.begin();
if (cb)
*cb = b;
return _ex1;
- // XXX: do I need to check for p_gcd = -1?
}
// there are common factors:
if (p.is_equal(b)) {
// a = p^n, b = p, gcd = p
if (ca)
- *ca = pow(p, a.op(1) - 1);
+ *ca = pow(p, exp_a - 1);
if (cb)
*cb = _ex1;
return p;
- }
+ }
+ if (is_a<symbol>(p)) {
+ // Cancel trivial common factor
+ int ldeg_a = ex_to<numeric>(exp_a).to_int();
+ int ldeg_b = b.ldegree(p);
+ int min_ldeg = std::min(ldeg_a, ldeg_b);
+ if (min_ldeg > 0) {
+ ex common = pow(p, min_ldeg);
+ return gcd(pow(p, ldeg_a - min_ldeg), (b / common).expand(), ca, cb, false) * common;
+ }
+ }
ex p_co, bpart_co;
ex p_gcd = gcd(p, b, &p_co, &bpart_co, false);
- // a(x) = p(x)^n, gcd(p, b) = 1 ==> gcd(a, b) = 1
if (p_gcd.is_equal(_ex1)) {
+ // a(x) = p(x)^n, gcd(p, b) = 1 ==> gcd(a, b) = 1
if (ca)
*ca = a;
if (cb)
do {
w = quo(w, g, x);
if (w.is_zero()) {
- return res;
+ return results;
}
z = quo(z, g, x) - w.diff(x);
exponent = exponent + 1;