- implemented nops() and op() for pseries objects
authorChristian Bauer <Christian.Bauer@uni-mainz.de>
Fri, 21 Jan 2000 17:51:26 +0000 (17:51 +0000)
committerChristian Bauer <Christian.Bauer@uni-mainz.de>
Fri, 21 Jan 2000 17:51:26 +0000 (17:51 +0000)
check/series_expansion.cpp
ginac/basic.cpp
ginac/expairseq.cpp
ginac/pseries.cpp
ginac/pseries.h

index 00998fd519b17259696d24e56dd9f9590f14942e..42170c0b1104323621bb357c0c6deb763d623642 100644 (file)
@@ -31,7 +31,7 @@ static symbol x("x");
 static unsigned check_series(const ex &e, const ex &point, const ex &d, int order = 8)
 {
     ex es = e.series(x, point, order);
-    ex ep = static_cast<const pseries &>(*es.bp).convert_to_poly();
+    ex ep = ex_to_pseries(es).convert_to_poly();
     if (!(ep - d).is_zero()) {
         clog << "series expansion of " << e << " at " << point
              << " erroneously returned " << ep << " (instead of " << d
index b632a6e3f08064bf6af3305958b4fa4baa8bd6e3..4f4fdbfb345c42eaf33adcef006d38b0552ecbbb 100644 (file)
@@ -324,7 +324,7 @@ unsigned basic::calchash(void) const
     unsigned v=golden_ratio_hash(tinfo());
     for (unsigned i=0; i<nops(); i++) {
         v=rotate_left_31(v);
-        v ^= (const_cast<basic *>(this))->let_op(i).gethash();
+        v ^= (const_cast<basic *>(this))->op(i).gethash();
     }
 
     v = v & 0x7FFFFFFFU;
index 0d4a01c79a0e175b2b0f4637f1c1be43abced81f..2d83b141f6992c8ebbf5a6791096047165eda470 100644 (file)
@@ -320,7 +320,7 @@ unsigned expairseq::nops() const
     return seq.size()+1;
 }
 
-ex expairseq::op(int const i) const
+ex expairseq::op(int i) const
 {
     if (unsigned(i)<seq.size()) {
         return recombine_pair_to_ex(seq[i]);
index ff39d24fb07a656b20d986c0641150e9ec6d4b00..b12c8297353dbc48323c2bdf409c7690c17d7349 100644 (file)
@@ -21,6 +21,8 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#include <stdexcept>
+
 #include "pseries.h"
 #include "add.h"
 #include "inifcns.h"
@@ -174,6 +176,23 @@ void pseries::printraw(ostream &os) const
        os << ")";
 }
 
+unsigned pseries::nops(void) const
+{
+       return seq.size();
+}
+
+ex pseries::op(int i) const
+{
+       if (i < 0 || i >= seq.size())
+           throw (std::out_of_range("op() out of range"));
+       return seq[i].rest * power(var - point, seq[i].coeff);
+}
+
+ex &pseries::let_op(int i)
+{
+    throw (std::logic_error("let_op not defined for pseries"));
+}
+
 int pseries::degree(symbol const &s) const
 {
     if (var.is_equal(s)) {
index 8f041d38d0ec6f08a0732859b7830f93b952f0d2..6e261d72b7718f158c42b725ad6079341d8277ff 100644 (file)
@@ -57,6 +57,9 @@ public:
     basic *duplicate() const;
     void print(ostream &os, unsigned upper_precedence=0) const;
     void printraw(ostream &os) const;
+    unsigned nops(void) const;
+    ex op(int i) const;
+    ex &let_op(int i);
     int degree(symbol const &s) const;
     int ldegree(symbol const &s) const;
     ex coeff(symbol const &s, int const n=1) const;