* Implementation of GiNaC's products of expressions. */
/*
- * GiNaC Copyright (C) 1999-2003 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2005 Johannes Gutenberg University Mainz, Germany
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <iostream>
#include "power.h"
#include "operators.h"
#include "matrix.h"
+#include "indexed.h"
#include "lst.h"
#include "archive.h"
#include "utils.h"
print_func<print_context>(&mul::do_print).
print_func<print_latex>(&mul::do_print_latex).
print_func<print_csrc>(&mul::do_print_csrc).
- print_func<print_tree>(&inherited::do_print_tree).
+ print_func<print_tree>(&mul::do_print_tree).
print_func<print_python_repr>(&mul::do_print_python_repr))
mul::mul(std::auto_ptr<epvector> vp, const ex & oc)
{
tinfo_key = TINFO_mul;
- GINAC_ASSERT(vp!=0);
+ GINAC_ASSERT(vp.get()!=0);
overall_coeff = oc;
construct_from_epvector(*vp);
GINAC_ASSERT(is_canonical());
const numeric &coeff = ex_to<numeric>(overall_coeff);
if (coeff.csgn() == -1)
c.s << '-';
- if (!coeff.is_equal(_num1) &&
- !coeff.is_equal(_num_1)) {
+ if (!coeff.is_equal(*_num1_p) &&
+ !coeff.is_equal(*_num_1_p)) {
if (coeff.is_rational()) {
if (coeff.is_negative())
(-coeff).print(c);
return recombine_pair_to_ex(*(seq.begin()));
} else if ((seq_size==1) &&
is_exactly_a<add>((*seq.begin()).rest) &&
- ex_to<numeric>((*seq.begin()).coeff).is_equal(_num1)) {
+ ex_to<numeric>((*seq.begin()).coeff).is_equal(*_num1_p)) {
// *(+(x,y,...);c) -> +(*(x,c),*(y,c),...) (c numeric(), no powers of +())
const add & addref = ex_to<add>((*seq.begin()).rest);
std::auto_ptr<epvector> distrseq(new epvector);
unsigned mul::return_type() const
{
if (seq.empty()) {
- // mul without factors: should not happen, but commutes
+ // mul without factors: should not happen, but commutates
return return_types::commutative;
}
ex mul::recombine_pair_to_ex(const expair & p) const
{
- if (ex_to<numeric>(p.coeff).is_equal(_num1))
+ if (ex_to<numeric>(p.coeff).is_equal(*_num1_p))
return p.rest;
else
return (new power(p.rest,p.coeff))->setflag(status_flags::dynallocated);
// this assertion will probably fail somewhere
// it would require a more careful make_flat, obeying the power laws
// probably should return true only if p.coeff is integer
- return ex_to<numeric>(p.coeff).is_equal(_num1);
+ return ex_to<numeric>(p.coeff).is_equal(*_num1_p);
}
bool mul::can_be_further_expanded(const ex & e)
for (epvector::const_iterator i2=add2begin; i2!=add2end; ++i2) {
// Don't push_back expairs which might have a rest that evaluates to a numeric,
// since that would violate an invariant of expairseq:
- const ex rest = (new mul(i1->rest, i2->rest))->setflag(status_flags::dynallocated);
- if (is_exactly_a<numeric>(rest))
+ const ex rest = (new mul(i1->rest, rename_dummy_indices_uniquely(i1->rest, i2->rest)))->setflag(status_flags::dynallocated);
+ if (is_exactly_a<numeric>(rest)) {
oc += ex_to<numeric>(rest).mul(ex_to<numeric>(i1->coeff).mul(ex_to<numeric>(i2->coeff)));
- else
+ } else {
distrseq.push_back(expair(rest, ex_to<numeric>(i1->coeff).mul_dyn(ex_to<numeric>(i2->coeff))));
+ }
}
tmp_accu += (new add(distrseq, oc))->setflag(status_flags::dynallocated);
}
for (size_t i=0; i<n; ++i) {
epvector factors = non_adds;
- factors.push_back(split_ex_to_pair(last_expanded.op(i)));
+ factors.push_back(split_ex_to_pair(rename_dummy_indices_uniquely(mul(non_adds), last_expanded.op(i))));
ex term = (new mul(factors, overall_coeff))->setflag(status_flags::dynallocated);
- if (can_be_further_expanded(term))
+ if (can_be_further_expanded(term)) {
distrseq.push_back(term.expand());
- else {
+ } else {
if (options == 0)
ex_to<basic>(term).setflag(status_flags::expanded);
distrseq.push_back(term);