The function power::is_polynomial(x) sometimes returned false,
even if x did not occur in the power object.
Thanks to Rubel Zilibowitz for reporting this bug.
Similarly, mul::is_polynomial(x) sometimes returned true, even
if x occurred only in the denominator of a rational function.
The function mul::is_polynomial(x) does a simpler version of
power::is_polynomial(x) on its factors. (It's simpler because the
exponents cannot be functions of x.)
return 0;
}
-// Bug in expairseq::is_polynomial (fixed 2011-05-20).
+// Bugs in is_polynomial (fixed 2011-05-20 and 2014-07-26).
static unsigned exam_paranoia20()
{
unsigned result = 0;
- symbol x("x");
+ symbol x("x"), y("y");
ex e1 = sqrt(x*x+1)*sqrt(x+1);
if (e1.is_polynomial(x)) {
clog << "sqrt(x*x+1)*sqrt(x+1) is wrongly reported to be a polynomial in x\n";
clog << "sqrt(Pi)*x is wrongly reported to be no polynomial in x\n";
++result;
}
+ ex e3 = sqrt(x);
+ if (!e3.is_polynomial(y)) {
+ clog << "sqrt(x) is wrongly reported to be no polynomial in y\n";
+ ++result;
+ }
+ ex e4 = (1+y)/(2+x);
+ if (e4.is_polynomial(x)) {
+ clog << "(1+y)/(2+x) is wrongly reported to be a polynomial in x\n";
+ ++result;
+ }
return result;
}
{
for (epvector::const_iterator i=seq.begin(); i!=seq.end(); ++i) {
if (!i->rest.is_polynomial(var) ||
- (i->rest.has(var) && !i->coeff.info(info_flags::integer))) {
+ (i->rest.has(var) && !i->coeff.info(info_flags::nonnegint))) {
return false;
}
}
bool power::is_polynomial(const ex & var) const
{
- if (exponent.has(var))
- return false;
- if (!exponent.info(info_flags::nonnegint))
- return false;
- return basis.is_polynomial(var);
+ if (basis.is_polynomial(var)) {
+ if (basis.has(var))
+ // basis is non-constant polynomial in var
+ return exponent.info(info_flags::nonnegint);
+ else
+ // basis is constant in var
+ return !exponent.has(var);
+ }
+ // basis is a non-polynomial function of var
+ return false;
}
int power::degree(const ex & s) const