[GiNaC-devel] [PATCH 3/3] power::to_polinomial: improve handling of negative powers

Alexei Sheplyakov varg at theor.jinr.ru
Fri Oct 6 13:40:48 CEST 2006


Now
collect_common_factors((x*y*a+x*y*b)^(-3) + (x*z + x*y)^(-2))
will evaluate to
x^(-2)*(x^(-1)*(a+b)^(-3)*y^(-3)+(z+y)^(-2))
which is actually what I expect.

---
 ginac/normal.cpp |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/ginac/normal.cpp b/ginac/normal.cpp
index fc89710..b2a4e8c 100644
--- a/ginac/normal.cpp
+++ b/ginac/normal.cpp
@@ -2455,7 +2455,16 @@ ex power::to_polynomial(exmap & repl) co
 	if (exponent.info(info_flags::posint))
 		return power(basis.to_rational(repl), exponent);
 	else if (exponent.info(info_flags::negint))
-		return power(replace_with_symbol(power(basis, _ex_1), repl), -exponent);
+	{
+		ex basis_pref = collect_common_factors(basis);
+		if (is_exactly_a<mul>(basis_pref) || is_exactly_a<power>(basis_pref)) {
+			// (A*B)^n will be automagically transformed to A^n*B^n
+			ex t = power(basis_pref, exponent);
+			return t.to_polynomial(repl);
+		}
+		else
+			return power(replace_with_symbol(power(basis, _ex_1), repl), -exponent);
+	} 
 	else
 		return replace_with_symbol(*this, repl);
 }
-- 
All science is either physics or stamp collecting.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 827 bytes
Desc: Digital signature
URL: <http://www.ginac.de/pipermail/ginac-devel/attachments/20061006/7e2a696c/attachment.sig>


More information about the GiNaC-devel mailing list