From c7299e51d5ecf61b5d85bdfeb9a2db536abf18bb Mon Sep 17 00:00:00 2001 From: Richard Kreckel Date: Sun, 11 Oct 2009 23:19:21 +0200 Subject: [PATCH] Add mul::info() and add::info() support for numeric info_flags. This way, GiNaC knows that the sum or product of a number of positive expressions is again a positive expression. [by Vladimir Kisil] --- ginac/add.cpp | 12 ++++++++++++ ginac/flags.h | 2 +- ginac/mul.cpp | 12 ++++++++++++ ginac/power.cpp | 2 ++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/ginac/add.cpp b/ginac/add.cpp index 4c857044..5f714fef 100644 --- a/ginac/add.cpp +++ b/ginac/add.cpp @@ -224,6 +224,16 @@ bool add::info(unsigned inf) const case info_flags::integer_polynomial: case info_flags::cinteger_polynomial: case info_flags::rational_polynomial: + case info_flags::real: + case info_flags::rational: + case info_flags::integer: + case info_flags::crational: + case info_flags::cinteger: + case info_flags::positive: + case info_flags::nonnegative: + case info_flags::posint: + case info_flags::nonnegint: + case info_flags::even: case info_flags::crational_polynomial: case info_flags::rational_function: { epvector::const_iterator i = seq.begin(), end = seq.end(); @@ -232,6 +242,8 @@ bool add::info(unsigned inf) const return false; ++i; } + if (overall_coeff.is_zero() && (inf == info_flags::positive || inf == info_flags::posint)) + return true; return overall_coeff.info(inf); } case info_flags::algebraic: { diff --git a/ginac/flags.h b/ginac/flags.h index c4593dc4..547cc594 100644 --- a/ginac/flags.h +++ b/ginac/flags.h @@ -204,7 +204,7 @@ public: class info_flags { public: enum { - // answered by class numeric and symbols/constants in particular domains + // answered by class numeric, add, mul and symbols/constants in particular domains numeric, real, rational, diff --git a/ginac/mul.cpp b/ginac/mul.cpp index 35ba88e4..bc38159d 100644 --- a/ginac/mul.cpp +++ b/ginac/mul.cpp @@ -278,6 +278,16 @@ bool mul::info(unsigned inf) const case info_flags::integer_polynomial: case info_flags::cinteger_polynomial: case info_flags::rational_polynomial: + case info_flags::real: + case info_flags::rational: + case info_flags::integer: + case info_flags::crational: + case info_flags::cinteger: + case info_flags::positive: + case info_flags::nonnegative: + case info_flags::posint: + case info_flags::nonnegint: + case info_flags::even: case info_flags::crational_polynomial: case info_flags::rational_function: { epvector::const_iterator i = seq.begin(), end = seq.end(); @@ -286,6 +296,8 @@ bool mul::info(unsigned inf) const return false; ++i; } + if (overall_coeff.is_equal(*_num1_p) && inf == info_flags::even) + return true; return overall_coeff.info(inf); } case info_flags::algebraic: { diff --git a/ginac/power.cpp b/ginac/power.cpp index 999d9b14..7ae0f04d 100644 --- a/ginac/power.cpp +++ b/ginac/power.cpp @@ -240,6 +240,8 @@ bool power::info(unsigned inf) const basis.info(inf); case info_flags::expanded: return (flags & status_flags::expanded); + case info_flags::positive: + return basis.info(info_flags::positive) && exponent.info(info_flags::real); case info_flags::has_indices: { if (flags & status_flags::has_indices) return true; -- 2.44.0