From: Christian Bauer Date: Sat, 13 Dec 2003 19:03:02 +0000 (+0000) Subject: fixed omission in power::expand() X-Git-Tag: release_1-2-0~44 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=be376425f421903c387720307036bbd1ab07afb5 fixed omission in power::expand() --- diff --git a/ginac/power.cpp b/ginac/power.cpp index a45bf6af..2cff577e 100644 --- a/ginac/power.cpp +++ b/ginac/power.cpp @@ -446,7 +446,7 @@ ex power::eval(int level) const // ^(*(x,y,z),c1) -> *(x^c1,y^c1,z^c1) (c1 integer) if (num_exponent->is_integer() && is_exactly_a(ebasis)) { - return expand_mul(ex_to(ebasis), *num_exponent); + return expand_mul(ex_to(ebasis), *num_exponent, 0); } // ^(*(...,x;c1),c2) -> *(^(*(...,x;1),c2),c1^c2) (c1, c2 numeric(), c1>0) @@ -626,7 +626,7 @@ ex power::expand(unsigned options) const const numeric &num_exponent = ex_to(a.overall_coeff); int int_exponent = num_exponent.to_int(); if (int_exponent > 0 && is_exactly_a(expanded_basis)) - distrseq.push_back(expand_add(ex_to(expanded_basis), int_exponent)); + distrseq.push_back(expand_add(ex_to(expanded_basis), int_exponent, options)); else distrseq.push_back(power(expanded_basis, a.overall_coeff)); } else @@ -634,7 +634,7 @@ ex power::expand(unsigned options) const // Make sure that e.g. (x+y)^(1+a) -> x*(x+y)^a + y*(x+y)^a ex r = (new mul(distrseq))->setflag(status_flags::dynallocated); - return r.expand(); + return r.expand(options); } if (!is_exactly_a(expanded_exponent) || @@ -652,11 +652,11 @@ ex power::expand(unsigned options) const // (x+y)^n, n>0 if (int_exponent > 0 && is_exactly_a(expanded_basis)) - return expand_add(ex_to(expanded_basis), int_exponent); + return expand_add(ex_to(expanded_basis), int_exponent, options); // (x*y)^n -> x^n * y^n if (is_exactly_a(expanded_basis)) - return expand_mul(ex_to(expanded_basis), num_exponent); + return expand_mul(ex_to(expanded_basis), num_exponent, options); // cannot expand further if (are_ex_trivially_equal(basis,expanded_basis) && are_ex_trivially_equal(exponent,expanded_exponent)) @@ -677,10 +677,10 @@ ex power::expand(unsigned options) const /** expand a^n where a is an add and n is a positive integer. * @see power::expand */ -ex power::expand_add(const add & a, int n) const +ex power::expand_add(const add & a, int n, unsigned options) const { if (n==2) - return expand_add_2(a); + return expand_add_2(a, options); const size_t m = a.nops(); exvector result; @@ -713,7 +713,7 @@ ex power::expand_add(const add & a, int n) const !is_exactly_a(ex_to(b).basis) || !is_exactly_a(ex_to(b).basis)); if (is_exactly_a(b)) - term.push_back(expand_mul(ex_to(b),numeric(k[l]))); + term.push_back(expand_mul(ex_to(b), numeric(k[l]), options)); else term.push_back(power(b,k[l])); } @@ -727,7 +727,7 @@ ex power::expand_add(const add & a, int n) const !is_exactly_a(ex_to(b).basis) || !is_exactly_a(ex_to(b).basis)); if (is_exactly_a(b)) - term.push_back(expand_mul(ex_to(b),numeric(n-k_cum[m-2]))); + term.push_back(expand_mul(ex_to(b), numeric(n-k_cum[m-2]), options)); else term.push_back(power(b,n-k_cum[m-2])); @@ -737,7 +737,7 @@ ex power::expand_add(const add & a, int n) const term.push_back(f); - result.push_back((new mul(term))->setflag(status_flags::dynallocated)); + result.push_back(ex((new mul(term))->setflag(status_flags::dynallocated)).expand(options)); // increment k[] l = m-2; @@ -764,7 +764,7 @@ ex power::expand_add(const add & a, int n) const /** Special case of power::expand_add. Expands a^2 where a is an add. * @see power::expand_add */ -ex power::expand_add_2(const add & a) const +ex power::expand_add_2(const add & a, unsigned options) const { epvector sum; size_t a_nops = a.nops(); @@ -787,7 +787,7 @@ ex power::expand_add_2(const add & a) const if (c.is_equal(_ex1)) { if (is_exactly_a(r)) { - sum.push_back(expair(expand_mul(ex_to(r),_num2), + sum.push_back(expair(expand_mul(ex_to(r), _num2, options), _ex1)); } else { sum.push_back(expair((new power(r,_ex2))->setflag(status_flags::dynallocated), @@ -795,7 +795,7 @@ ex power::expand_add_2(const add & a) const } } else { if (is_exactly_a(r)) { - sum.push_back(a.combine_ex_with_coeff_to_pair(expand_mul(ex_to(r),_num2), + sum.push_back(a.combine_ex_with_coeff_to_pair(expand_mul(ex_to(r), _num2, options), ex_to(c).power_dyn(_num2))); } else { sum.push_back(a.combine_ex_with_coeff_to_pair((new power(r,_ex2))->setflag(status_flags::dynallocated), @@ -830,7 +830,7 @@ ex power::expand_add_2(const add & a) const /** Expand factors of m in m^n where m is a mul and n is and integer. * @see power::expand */ -ex power::expand_mul(const mul & m, const numeric & n) const +ex power::expand_mul(const mul & m, const numeric & n, unsigned options) const { GINAC_ASSERT(n.is_integer()); @@ -862,7 +862,7 @@ ex power::expand_mul(const mul & m, const numeric & n) const const mul & result = static_cast((new mul(distrseq, ex_to(m.overall_coeff).power_dyn(n)))->setflag(status_flags::dynallocated)); if (need_reexpand) - return ex(result).expand(); + return ex(result).expand(options); else return result.setflag(status_flags::expanded); } diff --git a/ginac/power.h b/ginac/power.h index c60ad4e6..ff547e30 100644 --- a/ginac/power.h +++ b/ginac/power.h @@ -84,9 +84,9 @@ protected: void do_print_python(const print_python & c, unsigned level) const; void do_print_python_repr(const print_python_repr & c, unsigned level) const; - ex expand_add(const add & a, int n) const; - ex expand_add_2(const add & a) const; - ex expand_mul(const mul & m, const numeric & n) const; + ex expand_add(const add & a, int n, unsigned options) const; + ex expand_add_2(const add & a, unsigned options) const; + ex expand_mul(const mul & m, const numeric & n, unsigned options) const; // member variables