Fixed a bug introduced in last commit.
authorRichard Kreckel <kreckel@ginac.de>
Fri, 20 May 2011 20:20:57 +0000 (22:20 +0200)
committerRichard Kreckel <kreckel@ginac.de>
Fri, 20 May 2011 20:20:57 +0000 (22:20 +0200)
Before, sqrt(2)*x used to be a polynomial in x.
Now, it is a polynomial in x again.

check/exam_paranoia.cpp
ginac/add.cpp
ginac/add.h
ginac/expairseq.cpp
ginac/expairseq.h
ginac/mul.cpp
ginac/mul.h

index 972270f..52d261c 100644 (file)
@@ -497,13 +497,19 @@ static unsigned exam_paranoia19()
 // Bug in expairseq::is_polynomial (fixed 2011-05-20).
 static unsigned exam_paranoia20()
 {
+       unsigned result = 0;
        symbol x("x");
-       ex e = sqrt(x*x+1)*sqrt(x+1);
-       if (e.is_polynomial(x)) {
+       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";
-               return 1;
+               ++result;
        }
-       return 0;
+       ex e2 = sqrt(Pi)*x;
+       if (!e2.is_polynomial(x)) {
+               clog << "sqrt(Pi)*x is wrongly reported to be no polynomial in x\n";
+               ++result;
+       }
+       return result;
 }
 
 unsigned exam_paranoia()
index 553c2d3..42364c0 100644 (file)
@@ -260,6 +260,16 @@ bool add::info(unsigned inf) const
        return inherited::info(inf);
 }
 
+bool add::is_polynomial(const ex & var) const
+{
+       for (epvector::const_iterator i=seq.begin(); i!=seq.end(); ++i) {
+               if (!(i->rest).is_polynomial(var)) {
+                       return false;
+               }
+       }
+       return true;
+}
+
 int add::degree(const ex & s) const
 {
        int deg = std::numeric_limits<int>::min();
index 7d96c8c..4d5bd0a 100644 (file)
@@ -47,6 +47,7 @@ public:
 public:
        unsigned precedence() const {return 40;}
        bool info(unsigned inf) const;
+       bool is_polynomial(const ex & var) const;
        int degree(const ex & s) const;
        int ldegree(const ex & s) const;
        ex coeff(const ex & s, int n=1) const;
index 88d986e..2649b4b 100644 (file)
@@ -375,28 +375,6 @@ ex expairseq::conjugate() const
        return result;
 }
 
-bool expairseq::is_polynomial(const ex & var) const
-{
-       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);
-       }
-       return true;
-}
-
 bool expairseq::match(const ex & pattern, exmap & repl_lst) const
 {
        // This differs from basic::match() because we want "a+b+c+d" to
index 7e8d551..44d6e26 100644 (file)
@@ -87,7 +87,6 @@ public:
        bool match(const ex & pattern, exmap& repl_lst) const;
        ex subs(const exmap & m, unsigned options = 0) const;
        ex conjugate() const;
-       bool is_polynomial(const ex & var) const;
 
        void archive(archive_node& n) const;
        void read_archive(const archive_node& n, lst& syms);
index 6810cb8..27add93 100644 (file)
@@ -347,6 +347,17 @@ bool mul::info(unsigned inf) const
        return inherited::info(inf);
 }
 
+bool mul::is_polynomial(const ex & var) const
+{
+       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))) {
+                       return false;
+               }
+       }
+       return true;
+}
+
 int mul::degree(const ex & s) const
 {
        // Sum up degrees of factors
index 65f59bd..d28b627 100644 (file)
@@ -49,6 +49,7 @@ public:
 public:
        unsigned precedence() const {return 50;}
        bool info(unsigned inf) const;
+       bool is_polynomial(const ex & var) const;
        int degree(const ex & s) const;
        int ldegree(const ex & s) const;
        ex coeff(const ex & s, int n = 1) const;