From: Christian Bauer Date: Tue, 16 Dec 2003 17:52:06 +0000 (+0000) Subject: 1/1/e expanded e but shouldn't X-Git-Tag: release_1-2-0~42 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=9ab7bfaebfbec22d775bcb2f725a74fd5e560251;ds=sidebyside 1/1/e expanded e but shouldn't --- diff --git a/check/exam_paranoia.cpp b/check/exam_paranoia.cpp index 21d40c9a..cbab84df 100644 --- a/check/exam_paranoia.cpp +++ b/check/exam_paranoia.cpp @@ -426,6 +426,14 @@ static unsigned exam_paranoia16() ++result; } + e1 = a*(a+b); + e2 = pow(pow(e1, -1), -1); + + if (e2.has(a*b)) { + clog << "double reciprocal expanded where it should not\n"; + ++result; + } + return result; } diff --git a/ginac/power.cpp b/ginac/power.cpp index 2cff577e..fe18097b 100644 --- a/ginac/power.cpp +++ b/ginac/power.cpp @@ -656,7 +656,7 @@ ex power::expand(unsigned options) const // (x*y)^n -> x^n * y^n if (is_exactly_a(expanded_basis)) - return expand_mul(ex_to(expanded_basis), num_exponent, options); + return expand_mul(ex_to(expanded_basis), num_exponent, options, true); // cannot expand further if (are_ex_trivially_equal(basis,expanded_basis) && are_ex_trivially_equal(exponent,expanded_exponent)) @@ -713,7 +713,7 @@ ex power::expand_add(const add & a, int n, unsigned options) 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]), options)); + term.push_back(expand_mul(ex_to(b), numeric(k[l]), options, true)); else term.push_back(power(b,k[l])); } @@ -727,7 +727,7 @@ ex power::expand_add(const add & a, int n, unsigned options) 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]), options)); + term.push_back(expand_mul(ex_to(b), numeric(n-k_cum[m-2]), options, true)); else term.push_back(power(b,n-k_cum[m-2])); @@ -787,7 +787,7 @@ ex power::expand_add_2(const add & a, unsigned options) const if (c.is_equal(_ex1)) { if (is_exactly_a(r)) { - sum.push_back(expair(expand_mul(ex_to(r), _num2, options), + sum.push_back(expair(expand_mul(ex_to(r), _num2, options, true), _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, unsigned options) const } } else { if (is_exactly_a(r)) { - sum.push_back(a.combine_ex_with_coeff_to_pair(expand_mul(ex_to(r), _num2, options), + sum.push_back(a.combine_ex_with_coeff_to_pair(expand_mul(ex_to(r), _num2, options, true), 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, unsigned options) 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, unsigned options) const +ex power::expand_mul(const mul & m, const numeric & n, unsigned options, bool from_expand) const { GINAC_ASSERT(n.is_integer()); @@ -850,7 +850,7 @@ ex power::expand_mul(const mul & m, const numeric & n, unsigned options) const // it is safe not to call mul::combine_pair_with_coeff_to_pair() // since n is an integer numeric new_coeff = ex_to(cit->coeff).mul(n); - if (is_exactly_a(cit->rest) && new_coeff.is_pos_integer()) { + if (from_expand && is_exactly_a(cit->rest) && new_coeff.is_pos_integer()) { // this happens when e.g. (a+b)^(1/2) gets squared and // the resulting product needs to be reexpanded need_reexpand = true; @@ -863,8 +863,9 @@ ex power::expand_mul(const mul & m, const numeric & n, unsigned options) 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(options); - else + if (from_expand) return result.setflag(status_flags::expanded); + return result; } } // namespace GiNaC diff --git a/ginac/power.h b/ginac/power.h index ff547e30..eddcf2f8 100644 --- a/ginac/power.h +++ b/ginac/power.h @@ -86,7 +86,7 @@ protected: 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; + ex expand_mul(const mul & m, const numeric & n, unsigned options, bool from_expand = false) const; // member variables