X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fpower.cpp;h=64dd1fdca9e6305d866446b329b7a4114df69771;hp=f0b5c5adb8c566b0b965ac649badcd95b040e510;hb=afdd7fa8c6c0a587f7c80789198551383e8beb7b;hpb=6b3768e8c544739ae53321539cb4d1e3112ded1b diff --git a/ginac/power.cpp b/ginac/power.cpp index f0b5c5ad..64dd1fdc 100644 --- a/ginac/power.cpp +++ b/ginac/power.cpp @@ -2,11 +2,40 @@ * * Implementation of GiNaC's symbolic exponentiation (basis^exponent). */ +/* + * GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + #include #include #include -#include "ginac.h" +#include "power.h" +#include "expairseq.h" +#include "add.h" +#include "mul.h" +#include "numeric.h" +#include "relational.h" +#include "symbol.h" +#include "debugmsg.h" + +#ifndef NO_GINAC_NAMESPACE +namespace GiNaC { +#endif // ndef NO_GINAC_NAMESPACE typedef vector intvector; @@ -16,7 +45,7 @@ typedef vector intvector; // public -power::power() : basic(TINFO_POWER) +power::power() : basic(TINFO_power) { debugmsg("power default constructor",LOGLEVEL_CONSTRUCT); } @@ -63,16 +92,16 @@ void power::destroy(bool call_parent) // public -power::power(ex const & lh, ex const & rh) : basic(TINFO_POWER), basis(lh), exponent(rh) +power::power(ex const & lh, ex const & rh) : basic(TINFO_power), basis(lh), exponent(rh) { debugmsg("power constructor from ex,ex",LOGLEVEL_CONSTRUCT); - ASSERT(basis.return_type()==return_types::commutative); + GINAC_ASSERT(basis.return_type()==return_types::commutative); } -power::power(ex const & lh, numeric const & rh) : basic(TINFO_POWER), basis(lh), exponent(rh) +power::power(ex const & lh, numeric const & rh) : basic(TINFO_power), basis(lh), exponent(rh) { debugmsg("power constructor from ex,numeric",LOGLEVEL_CONSTRUCT); - ASSERT(basis.return_type()==return_types::commutative); + GINAC_ASSERT(basis.return_type()==return_types::commutative); } ////////// @@ -105,8 +134,8 @@ int power::nops() const ex & power::let_op(int const i) { - ASSERT(i>=0); - ASSERT(i<2); + GINAC_ASSERT(i>=0); + GINAC_ASSERT(i<2); return i==0 ? basis : exponent; } @@ -218,7 +247,7 @@ ex power::eval(int level) const || res.is_rational()) { return res; } - ASSERT(!num_exponent->is_integer()); // has been handled by now + GINAC_ASSERT(!num_exponent->is_integer()); // has been handled by now // ^(c1,n/m) -> *(c1^q,c1^(n/m-q)), 0<(n/m-h)<1, q integer if (basis_is_rational && exponent_is_rational && num_exponent->is_real() @@ -257,7 +286,7 @@ ex power::eval(int level) const ex const & sub_exponent=sub_power.exponent; if (is_ex_exactly_of_type(sub_exponent,numeric)) { numeric const & num_sub_exponent=ex_to_numeric(sub_exponent); - ASSERT(num_sub_exponent!=numeric(1)); + GINAC_ASSERT(num_sub_exponent!=numeric(1)); if (num_exponent->is_integer() || abs(num_sub_exponent)<1) { return power(sub_basis,num_sub_exponent.mul(*num_exponent)); } @@ -273,7 +302,7 @@ ex power::eval(int level) const // ^(*(...,x;c1),c2) -> ^(*(...,x;1),c2)*c1^c2 (c1, c2 numeric(), c1>0) // ^(*(...,x,c1),c2) -> ^(*(...,x;-1),c2)*(-c1)^c2 (c1, c2 numeric(), c1<0) if (exponent_is_numerical && is_ex_exactly_of_type(ebasis,mul)) { - ASSERT(!num_exponent->is_integer()); // should have been handled above + GINAC_ASSERT(!num_exponent->is_integer()); // should have been handled above mul const & mulref=ex_to_mul(ebasis); if (!mulref.overall_coeff.is_equal(exONE())) { numeric const & num_coeff=ex_to_numeric(mulref.overall_coeff); @@ -287,7 +316,7 @@ ex power::eval(int level) const power(num_coeff,*num_exponent)))-> setflag(status_flags::dynallocated); } else { - ASSERT(num_coeff.compare(numZERO())<0); + GINAC_ASSERT(num_coeff.compare(numZERO())<0); if (num_coeff.compare(numMINUSONE())!=0) { mul * mulp=new mul(mulref); mulp->overall_coeff=exMINUSONE(); @@ -352,7 +381,7 @@ ex power::simplify_ncmul(exvector const & v) const int power::compare_same_type(basic const & other) const { - ASSERT(is_exactly_of_type(other, power)); + GINAC_ASSERT(is_exactly_of_type(other, power)); power const & o=static_cast(const_cast(other)); int cmpval; @@ -445,8 +474,8 @@ ex power::expand_add(add const & a, int const n) const term.reserve(m+1); for (l=0; lsetflag(status_flags::dynallocated)); // increment k[] @@ -525,8 +554,8 @@ ex power::expand_add_2(add const & a) const for (epvector::const_iterator cit0=a.seq.begin(); cit0!=last; ++cit0) { ex const & b=a.recombine_pair_to_ex(*cit0); - ASSERT(!is_ex_exactly_of_type(b,add)); - ASSERT(!is_ex_exactly_of_type(b,power)|| + GINAC_ASSERT(!is_ex_exactly_of_type(b,add)); + GINAC_ASSERT(!is_ex_exactly_of_type(b,power)|| !is_ex_exactly_of_type(ex_to_power(b).exponent,numeric)|| !ex_to_numeric(ex_to_power(b).exponent).is_pos_integer()); if (is_ex_exactly_of_type(b,mul)) { @@ -543,7 +572,7 @@ ex power::expand_add_2(add const & a) const } } - ASSERT(sum.size()==(a.seq.size()*(a.seq.size()+1))/2); + GINAC_ASSERT(sum.size()==(a.seq.size()*(a.seq.size()+1))/2); return (new add(sum))->setflag(status_flags::dynallocated); } @@ -564,8 +593,8 @@ ex power::expand_add_2(add const & a) const ex const & r=(*cit0).rest; ex const & c=(*cit0).coeff; - ASSERT(!is_ex_exactly_of_type(r,add)); - ASSERT(!is_ex_exactly_of_type(r,power)|| + GINAC_ASSERT(!is_ex_exactly_of_type(r,add)); + GINAC_ASSERT(!is_ex_exactly_of_type(r,power)|| !is_ex_exactly_of_type(ex_to_power(r).exponent,numeric)|| !ex_to_numeric(ex_to_power(r).exponent).is_pos_integer()|| !is_ex_exactly_of_type(ex_to_power(r).basis,add)|| @@ -597,7 +626,7 @@ ex power::expand_add_2(add const & a) const } } - ASSERT(sum.size()==(a.seq.size()*(a.seq.size()+1))/2); + GINAC_ASSERT(sum.size()==(a.seq.size()*(a.seq.size()+1))/2); // second part: add terms coming from overall_factor (if != 0) if (!a.overall_coeff.is_equal(exZERO())) { @@ -607,7 +636,7 @@ ex power::expand_add_2(add const & a) const sum.push_back(expair(ex_to_numeric(a.overall_coeff).power_dyn(numTWO()),exONE())); } - ASSERT(sum.size()==(a_nops*(a_nops+1))/2); + GINAC_ASSERT(sum.size()==(a_nops*(a_nops+1))/2); return (new add(sum))->setflag(status_flags::dynallocated); } @@ -693,3 +722,7 @@ unsigned power::precedence=60; const power some_power; type_info const & typeid_power=typeid(some_power); + +#ifndef NO_GINAC_NAMESPACE +} // namespace GiNaC +#endif // ndef NO_GINAC_NAMESPACE