]> www.ginac.de Git - ginac.git/blobdiff - ginac/ncmul.cpp
Allow for general expressions as index dimensions.
[ginac.git] / ginac / ncmul.cpp
index 3bc8b2145766e2755e6cc8060e10a9c892d2f4d2..c72b608ae3756f19119849098cba08f82e01564b 100644 (file)
@@ -3,7 +3,7 @@
  *  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
@@ -17,7 +17,7 @@
  *
  *  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>
@@ -30,6 +30,7 @@
 #include "mul.h"
 #include "matrix.h"
 #include "archive.h"
+#include "indexed.h"
 #include "utils.h"
 
 namespace GiNaC {
@@ -167,10 +168,26 @@ ex ncmul::expand(unsigned options) const
 
        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)));
 
@@ -190,6 +207,9 @@ ex ncmul::expand(unsigned options) const
 
 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();
@@ -202,6 +222,9 @@ int ncmul::degree(const ex & s) const
 
 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();
@@ -214,6 +237,9 @@ int ncmul::ldegree(const ex & s) const
 
 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());
 
@@ -467,7 +493,7 @@ ex ncmul::conjugate() const
                return exprseq::conjugate();
        }
 
-       if (return_type_tinfo() & 0xffffff00U != TINFO_clifford) {
+       if ((return_type_tinfo() & 0xffffff00U) != TINFO_clifford) {
                return exprseq::conjugate();
        }
 
@@ -535,7 +561,7 @@ unsigned ncmul::return_type() const
                ++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;
 }