]> www.ginac.de Git - ginac.git/blobdiff - ginac/expairseq.cpp
Added complex conjugation methods and GiNaC function "conjugate".
[ginac.git] / ginac / expairseq.cpp
index 88f195c8b04d25b48343e3d1b25ca14b0798b700..676011a319c2417d40f408ddf43c7cd8a0e1004c 100644 (file)
@@ -3,7 +3,7 @@
  *  Implementation of sequences of expression pairs. */
 
 /*
- *  GiNaC Copyright (C) 1999-2003 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2004 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
@@ -310,6 +310,42 @@ ex expairseq::eval(int level) const
        return (new expairseq(vp, overall_coeff))->setflag(status_flags::dynallocated | status_flags::evaluated);
 }
 
+epvector* conjugateepvector(const epvector&epv)
+{
+       epvector *newepv = 0;
+       for (epvector::const_iterator i=epv.begin(); i!=epv.end(); ++i) {
+               if(newepv) {
+                       newepv->push_back(i->conjugate());
+                       continue;
+               }
+               expair x = i->conjugate();
+               if (x.is_equal(*i)) {
+                       continue;
+               }
+               newepv = new epvector;
+               newepv->reserve(epv.size());
+               for (epvector::const_iterator j=epv.begin(); j!=i; ++j) {
+                       newepv->push_back(*j);
+               }
+               newepv->push_back(x);
+       }
+       return newepv;
+}
+
+ex expairseq::conjugate() const
+{
+       epvector* newepv = conjugateepvector(seq);
+       ex x = overall_coeff.conjugate();
+       if (!newepv && are_ex_trivially_equal(x, overall_coeff)) {
+               return *this;
+       }
+       ex result = thisexpairseq(newepv ? *newepv : seq, x);
+       if (newepv) {
+               delete newepv;
+       }
+       return result;
+}
+
 bool expairseq::match(const ex & pattern, lst & repl_lst) const
 {
        // This differs from basic::match() because we want "a+b+c+d" to