From f73d4fa262d18029d3aa9bb8d2ea6fb550beecc0 Mon Sep 17 00:00:00 2001
From: "Vladimir V. Kisil" <kisilv@maths.leeds.ac.uk>
Date: Sun, 28 Jul 2013 23:25:01 +0100
Subject: [PATCH 1/2] Add the case of c1=-1 and c2>0 to the rewriting rule of 
 exponents: (x^c1)^c2 -> x^(c1 * c2)

Signed-off-by: Vladimir V. Kisil <kisilv@maths.leeds.ac.uk>
---
 check/exam_powerlaws.cpp |    6 +++---
 ginac/power.cpp          |    6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/check/exam_powerlaws.cpp b/check/exam_powerlaws.cpp
index cab16df..beb4dfb 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<power>(e4) &&
 	      is_exactly_a<power>(e4.op(0)) &&
 	      is_exactly_a<symbol>(e4.op(0).op(0)) &&
 	      is_exactly_a<numeric>(e4.op(0).op(1)) &&
 	      is_exactly_a<numeric>(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 9a8f7d5..80ff76f 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<power>(ebasis)) {
 			const power & sub_power = ex_to<power>(ebasis);
@@ -489,7 +489,7 @@ ex power::eval(int level) const
 			if (is_exactly_a<numeric>(sub_exponent)) {
 				const numeric & num_sub_exponent = ex_to<numeric>(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 == _ex_1 && num_exponent->is_positive())) {
 					return power(sub_basis,num_sub_exponent.mul(*num_exponent));
 				}
 			}
-- 
1.7.10.4

