From ad51b1d1be1d78d4895aa140037f2d3be578d3fe Mon Sep 17 00:00:00 2001 From: Christian Bauer Date: Fri, 21 Jan 2000 17:51:26 +0000 Subject: [PATCH] - implemented nops() and op() for pseries objects --- check/series_expansion.cpp | 2 +- ginac/basic.cpp | 2 +- ginac/expairseq.cpp | 2 +- ginac/pseries.cpp | 19 +++++++++++++++++++ ginac/pseries.h | 3 +++ 5 files changed, 25 insertions(+), 3 deletions(-) diff --git a/check/series_expansion.cpp b/check/series_expansion.cpp index 00998fd5..42170c0b 100644 --- a/check/series_expansion.cpp +++ b/check/series_expansion.cpp @@ -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(*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 diff --git a/ginac/basic.cpp b/ginac/basic.cpp index b632a6e3..4f4fdbfb 100644 --- a/ginac/basic.cpp +++ b/ginac/basic.cpp @@ -324,7 +324,7 @@ unsigned basic::calchash(void) const unsigned v=golden_ratio_hash(tinfo()); for (unsigned i=0; i(this))->let_op(i).gethash(); + v ^= (const_cast(this))->op(i).gethash(); } v = v & 0x7FFFFFFFU; diff --git a/ginac/expairseq.cpp b/ginac/expairseq.cpp index 0d4a01c7..2d83b141 100644 --- a/ginac/expairseq.cpp +++ b/ginac/expairseq.cpp @@ -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) + #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)) { diff --git a/ginac/pseries.h b/ginac/pseries.h index 8f041d38..6e261d72 100644 --- a/ginac/pseries.h +++ b/ginac/pseries.h @@ -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; -- 2.46.2