e = dirac_trace(e).simplify_indexed(sp);
result += check_equal(e, 4*(2*ldotq*ldotq + q*q*ldotq - q*q*l*l + q*q*m*m).expand());
+ // stuff that had problems in the past
+ ex prop = dirac_slash(q, dim) - m * dirac_ONE();
+ e = dirac_slash(l, dim) * dirac_gamma5() * dirac_slash(l, dim) * prop;
+ e = dirac_trace(dirac_slash(q, dim) * e) - dirac_trace(m * e)
+ - dirac_trace(prop * e);
+ result += check_equal(e, 0);
+
+ e = (dirac_gamma5() + dirac_ONE()) * dirac_gamma5();
+ e = dirac_trace(e);
+ result += check_equal(e, 4);
+
return result;
}
// Remove superfluous ONEs
exvector::const_iterator cit = v.begin(), citend = v.end();
while (cit != citend) {
- if (!is_a<diracone>(cit->op(0)))
+ if (!is_a<clifford>(*cit) || !is_a<diracone>(cit->op(0)))
s.push_back(*cit);
cit++;
}
exvector::iterator it = next_to_last;
while (true) {
exvector::iterator it2 = it + 1;
- if (!is_a<diracgamma5>(it->op(0)) && is_a<diracgamma5>(it2->op(0))) {
+ if (is_a<clifford>(*it) && is_a<clifford>(*it2) && !is_a<diracgamma5>(it->op(0)) && is_a<diracgamma5>(it2->op(0))) {
it->swap(*it2);
sign = -sign;
something_changed = true;
}
// Remove squares of gamma5
- while (s.size() >= 2 && is_a<diracgamma5>(s[0].op(0)) && is_a<diracgamma5>(s[1].op(0))) {
+ while (s.size() >= 2 && is_a<clifford>(s[0]) && is_a<clifford>(s[1]) && is_a<diracgamma5>(s[0].op(0)) && is_a<diracgamma5>(s[1].op(0))) {
s.erase(s.begin(), s.begin() + 2);
something_changed = true;
}
if (s.size() >= 2) {
exvector::iterator it, itend = s.end() - 1;
for (it = s.begin(); it != itend; ++it) {
- if (!is_a<clifford>(it[0]))
- continue;
ex & a = it[0];
ex & b = it[1];
+ if (!is_a<clifford>(a) || !is_a<clifford>(b))
+ continue;
if (is_a<diracgamma>(a.op(0)) && is_a<diracgamma>(b.op(0))) {
const ex & ia = a.op(1);
const ex & ib = b.op(1);