From: Jens Vollinga Date: Fri, 20 May 2011 11:55:35 +0000 (+0200) Subject: Fixed a bug in is_polynomial() that caused expressions like X-Git-Tag: release_1-6-0~9 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=293ff6f6fe89c3e5413c8da57feedf3bd2016cd7 Fixed a bug in is_polynomial() that caused expressions like sqrt(x*x+1)*sqrt(x+1) to be wrongly identified as polynomials in x. Thanks to Florent Hivert for reporting. --- diff --git a/check/exam_paranoia.cpp b/check/exam_paranoia.cpp index 5fdfb350..972270f8 100644 --- a/check/exam_paranoia.cpp +++ b/check/exam_paranoia.cpp @@ -494,6 +494,18 @@ static unsigned exam_paranoia19() 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; @@ -519,6 +531,7 @@ unsigned exam_paranoia() result += exam_paranoia17(); cout << '.' << flush; result += exam_paranoia18(); cout << '.' << flush; result += exam_paranoia19(); cout << '.' << flush; + result += exam_paranoia20(); cout << '.' << flush; return result; } diff --git a/ginac/expairseq.cpp b/ginac/expairseq.cpp index 90ec7635..88d986ea 100644 --- a/ginac/expairseq.cpp +++ b/ginac/expairseq.cpp @@ -377,11 +377,22 @@ ex expairseq::conjugate() const bool expairseq::is_polynomial(const ex & var) const { - if (!is_exactly_a(*this) && !is_exactly_a(*this)) + if (is_exactly_a(*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(*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; }