X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fclifford.cpp;h=e62def5047707a969d313bafd0759b37e071112c;hp=d520822d6d8d3e38aed5699321434ef021c8e559;hb=2700b3fa9c3a81236e8ceccb6aa9d5ea5848a1a0;hpb=1c9720626245312534c8311b47a8749dd2e18526 diff --git a/ginac/clifford.cpp b/ginac/clifford.cpp index d520822d..e62def50 100644 --- a/ginac/clifford.cpp +++ b/ginac/clifford.cpp @@ -26,6 +26,8 @@ #include "ncmul.h" #include "symbol.h" #include "numeric.h" // for I +#include "lst.h" +#include "relational.h" #include "print.h" #include "archive.h" #include "debugmsg.h" @@ -336,6 +338,49 @@ static bool is_clifford_tinfo(unsigned ti, unsigned char rl) return ti == (TINFO_clifford + rl); } +/** Check whether a given tinfo key (as returned by return_type_tinfo() + * is that of a clifford object (with an arbitrary representation label). */ +static bool is_clifford_tinfo(unsigned ti) +{ + return (ti & ~0xff) == TINFO_clifford; +} + +/** Take trace of a string of an even number of Dirac gammas given a vector + * of indices. */ +static ex trace_string(exvector::const_iterator ix, unsigned num) +{ + // Tr gamma.mu gamma.nu = 4 g.mu.nu + if (num == 2) + return lorentz_g(ix[0], ix[1]); + + // Tr gamma.mu gamma.nu gamma.rho gamma.sig = 4 (g.mu.nu g.rho.sig + g.nu.rho g.mu.sig - g.mu.rho g.nu.sig + else if (num == 4) + return lorentz_g(ix[0], ix[1]) * lorentz_g(ix[2], ix[3]) + + lorentz_g(ix[1], ix[2]) * lorentz_g(ix[0], ix[3]) + - lorentz_g(ix[0], ix[2]) * lorentz_g(ix[1], ix[3]); + + // Traces of 6 or more gammas are computed recursively: + // Tr gamma.mu1 gamma.mu2 ... gamma.mun = + // + g.mu1.mu2 * Tr gamma.mu3 ... gamma.mun + // - g.mu1.mu3 * Tr gamma.mu2 gamma.mu4 ... gamma.mun + // + g.mu1.mu4 * Tr gamma.mu3 gamma.mu3 gamma.mu5 ... gamma.mun + // - ... + // + g.mu1.mun * Tr gamma.mu2 ... gamma.mu(n-1) + exvector v(num - 2); + int sign = 1; + ex result; + for (int i=1; i iv; - iv.reserve(num-1); + ex idx4 = ix[l]; + iv[0] = i; iv[1] = j; iv[2] = k; iv[3] = l; exvector v; - v.reserve(num-1); - iv.push_back(i); iv.push_back(j); iv.push_back(k); iv.push_back(l); - for (int n=1; nop(0), diracgamma5)) - it++; - while (it != next_to_last) { - if (it[0].op(1).compare(it[1].op(1)) > 0) { - ex save0 = it[0], save1 = it[1]; - it[0] = lorentz_g(it[0].op(1), it[1].op(1)); - it[1] = _ex2(); - ex sum = ncmul(v); - it[0] = save1; - it[1] = save0; - sum -= ncmul(v); - return canonicalize_clifford(sum); + // Scan for any ncmul objects + lst srl; + ex aux = e.to_rational(srl); + for (unsigned i=0; iop(0), diracgamma5)) + it++; + while (it != next_to_last) { + if (it[0].op(1).compare(it[1].op(1)) > 0) { + ex save0 = it[0], save1 = it[1]; + it[0] = lorentz_g(it[0].op(1), it[1].op(1)); + it[1] = _ex2(); + ex sum = ncmul(v); + it[0] = save1; + it[1] = save0; + sum -= ncmul(v, true); + srl.let_op(i) = (lhs == canonicalize_clifford(sum)); + goto next_sym; + } + it++; } - it++; +next_sym: ; } - return ncmul(v); } - - return e; + return aux.subs(srl); } } // namespace GiNaC