return 0;
}
+// Bug in expairseq::is_polynomial (fixed 2011-05-20).
+static unsigned exam_paranoia20()
+{
+ symbol x("x");
+ ex e = sqrt(x*x+1)*sqrt(x+1);
+ if (e.is_polynomial(x)) {
+ clog << "sqrt(x*x+1)*sqrt(x+1) is wrongly reported to be a polynomial in x\n";
+ return 1;
+ }
+ return 0;
+}
+
unsigned exam_paranoia()
{
unsigned result = 0;
result += exam_paranoia17(); cout << '.' << flush;
result += exam_paranoia18(); cout << '.' << flush;
result += exam_paranoia19(); cout << '.' << flush;
+ result += exam_paranoia20(); cout << '.' << flush;
return result;
}
bool expairseq::is_polynomial(const ex & var) const
{
- if (!is_exactly_a<add>(*this) && !is_exactly_a<mul>(*this))
+ if (is_exactly_a<add>(*this)) {
+ for (epvector::const_iterator i=seq.begin(); i!=seq.end(); ++i) {
+ if (!(i->rest).is_polynomial(var)) {
+ return false;
+ }
+ }
+ }
+ else if (is_exactly_a<mul>(*this)) {
+ for (epvector::const_iterator i=seq.begin(); i!=seq.end(); ++i) {
+ if (!(i->rest).is_polynomial(var) || !(i->coeff.info(info_flags::integer))) {
+ return false;
+ }
+ }
+ }
+ else {
return basic::is_polynomial(var);
- for (epvector::const_iterator i=seq.begin(); i!=seq.end(); ++i) {
- if (!(i->rest).is_polynomial(var))
- return false;
}
return true;
}