* Implementation of GiNaC's non-commutative products of expressions. */
/*
- * GiNaC Copyright (C) 1999-2004 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 <algorithm>
#include "mul.h"
#include "matrix.h"
#include "archive.h"
+#include "indexed.h"
#include "utils.h"
namespace GiNaC {
intvector k(number_of_adds);
+ /* Rename indices in the static members of the product */
+ exvector expanded_seq_mod;
+ size_t j = 0;
+ exvector va;
+
+ for (size_t i=0; i<expanded_seq.size(); i++) {
+ if (i == positions_of_adds[j]) {
+ expanded_seq_mod.push_back(_ex1);
+ j++;
+ } else {
+ expanded_seq_mod.push_back(rename_dummy_indices_uniquely(va, expanded_seq[i], true));
+ }
+ }
+
while (true) {
- exvector term = expanded_seq;
- for (size_t i=0; i<number_of_adds; i++)
- term[positions_of_adds[i]] = expanded_seq[positions_of_adds[i]].op(k[i]);
+ exvector term = expanded_seq_mod;
+ for (size_t i=0; i<number_of_adds; i++) {
+ term[positions_of_adds[i]] = rename_dummy_indices_uniquely(va, expanded_seq[positions_of_adds[i]].op(k[i]), true);
+ }
+
distrseq.push_back((new ncmul(term, true))->
setflag(status_flags::dynallocated | (options == 0 ? status_flags::expanded : 0)));
int ncmul::degree(const ex & s) const
{
+ if (is_equal(ex_to<basic>(s)))
+ return 1;
+
// Sum up degrees of factors
int deg_sum = 0;
exvector::const_iterator i = seq.begin(), end = seq.end();
int ncmul::ldegree(const ex & s) const
{
+ if (is_equal(ex_to<basic>(s)))
+ return 1;
+
// Sum up degrees of factors
int deg_sum = 0;
exvector::const_iterator i = seq.begin(), end = seq.end();
ex ncmul::coeff(const ex & s, int n) const
{
+ if (is_equal(ex_to<basic>(s)))
+ return n==1 ? _ex1 : _ex0;
+
exvector coeffseq;
coeffseq.reserve(seq.size());
return exprseq::conjugate();
}
- if (return_type_tinfo() & 0xffffff00U != TINFO_clifford) {
+ if ((return_type_tinfo() & 0xffffff00U) != TINFO_clifford) {
return exprseq::conjugate();
}
++i;
}
// all factors checked
- GINAC_ASSERT(!all_commutative); // not all factors should commute, because this is a ncmul();
+ GINAC_ASSERT(!all_commutative); // not all factors should commutate, because this is a ncmul();
return all_commutative ? return_types::commutative : return_types::noncommutative;
}