From 95fb2220c1371b0b63d2cc96f3b96fe2f0ac354a Mon Sep 17 00:00:00 2001
From: "Vladimir V. Kisil" <kisilv@maths.leeds.ac.uk>
Date: Tue, 5 Nov 2013 11:08:57 +0000
Subject: [PATCH 3/4] Even powers of modulus are rationalized.

The patch introduces the power evaluation
abs(z)^(2n) -> z^n * conjugate(z)^n

Signed-off-by: Vladimir V. Kisil <kisilv@maths.leeds.ac.uk>
---
 ginac/inifcns.cpp | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/ginac/inifcns.cpp b/ginac/inifcns.cpp
index 8ec0746..580a124 100644
--- a/ginac/inifcns.cpp
+++ b/ginac/inifcns.cpp
@@ -320,10 +320,12 @@ static ex abs_imag_part(const ex& arg)
 
 static ex abs_power(const ex & arg, const ex & exp)
 {
-	if (arg.is_equal(arg.conjugate()) && ((is_a<numeric>(exp) && ex_to<numeric>(exp).is_even())
-						|| exp.info(info_flags::even)))
-		return power(arg, exp);
-	else
+	if ((is_a<numeric>(exp) && ex_to<numeric>(exp).is_even()) || exp.info(info_flags::even)) {
+		if (arg.info(info_flags::real) || arg.is_equal(arg.conjugate()))
+			return power(arg, exp);
+		else
+			return power(arg, exp/2)*power(arg.conjugate(), exp/2);
+	} else
 		return power(abs(arg), exp).hold();
 }
 
-- 
2.1.0

