From ca11a8c1471ae650f0124db5e9bf48cc04f9d8f0 Mon Sep 17 00:00:00 2001 From: "Vladimir V. Kisil" Date: Sun, 28 Jul 2013 23:25:01 +0100 Subject: [PATCH] Add the case of c1=-1 and c2>0 to the rewriting rule of exponents: (x^c1)^c2 -> x^(c1 * c2) --- check/exam_powerlaws.cpp | 6 +++--- ginac/power.cpp | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/check/exam_powerlaws.cpp b/check/exam_powerlaws.cpp index cab16dfb..beb4dfb2 100644 --- a/check/exam_powerlaws.cpp +++ b/check/exam_powerlaws.cpp @@ -69,14 +69,14 @@ static unsigned exam_powerlaws1() return 1; } - ex e4 = e1.subs(lst(a==-1, b==2.5)); + ex e4 = e1.subs(lst(a==-1, b==-2.5)); if (!(is_exactly_a(e4) && is_exactly_a(e4.op(0)) && is_exactly_a(e4.op(0).op(0)) && is_exactly_a(e4.op(0).op(1)) && is_exactly_a(e4.op(1)) && - e4.is_equal(power(power(x,-1),2.5)) )) { - clog << "(x^a)^b, x symbolic, a==-1, b==2.5 wrong" << endl; + e4.is_equal(power(power(x,-1),-2.5)) )) { + clog << "(x^a)^b, x symbolic, a==-1, b==-2.5 wrong" << endl; clog << "returned: " << e4 << endl; return 1; } diff --git a/ginac/power.cpp b/ginac/power.cpp index 9a8f7d56..b815d17a 100644 --- a/ginac/power.cpp +++ b/ginac/power.cpp @@ -362,7 +362,7 @@ ex power::coeff(const ex & s, int n) const * - ^(1,x) -> 1 * - ^(c1,c2) -> *(c1^n,c1^(c2-n)) (so that 0<(c2-n)<1, try to evaluate roots, possibly in numerator and denominator of c1) * - ^(^(x,c1),c2) -> ^(x,c1*c2) if x is positive and c1 is real. - * - ^(^(x,c1),c2) -> ^(x,c1*c2) (c2 integer or -1 < c1 <= 1, case c1=1 should not happen, see below!) + * - ^(^(x,c1),c2) -> ^(x,c1*c2) (c2 integer or -1 < c1 <= 1 or (c1=-1 and c2>0), case c1=1 should not happen, see below!) * - ^(*(x,y,z),c) -> *(x^c,y^c,z^c) (if c integer) * - ^(*(x,c1),c2) -> ^(x,c2)*c1^c2 (c1>0) * - ^(*(x,c1),c2) -> ^(-x,c2)*c1^c2 (c1<0) @@ -480,7 +480,7 @@ ex power::eval(int level) const } // ^(^(x,c1),c2) -> ^(x,c1*c2) - // (c1, c2 numeric(), c2 integer or -1 < c1 <= 1, + // (c1, c2 numeric(), c2 integer or -1 < c1 <= 1 or (c1=-1 and c2>0), // case c1==1 should not happen, see below!) if (is_exactly_a(ebasis)) { const power & sub_power = ex_to(ebasis); @@ -489,7 +489,8 @@ ex power::eval(int level) const if (is_exactly_a(sub_exponent)) { const numeric & num_sub_exponent = ex_to(sub_exponent); GINAC_ASSERT(num_sub_exponent!=numeric(1)); - if (num_exponent->is_integer() || (abs(num_sub_exponent) - (*_num1_p)).is_negative()) { + if (num_exponent->is_integer() || (abs(num_sub_exponent) - (*_num1_p)).is_negative() + || (num_sub_exponent == *_num_1_p && num_exponent->is_positive())) { return power(sub_basis,num_sub_exponent.mul(*num_exponent)); } } -- 2.44.0