// one-loop vacuum polarization in QED
e = dirac_gamma(mu) *
- (dirac_slash(l, dim) + dirac_slash(q, dim) + m * dirac_ONE()) *
+ (dirac_slash(l, dim) + dirac_slash(q, 4) + m * dirac_ONE()) *
dirac_gamma(mu.toggle_variance()) *
(dirac_slash(l, dim) + m * dirac_ONE());
e = dirac_trace(e).simplify_indexed(sp);
result += check_equal(e, 4*((2-dim)*l*l + (2-dim)*ldotq + dim*m*m).expand());
- e = dirac_slash(q, dim) *
- (dirac_slash(l, dim) + dirac_slash(q, dim) + m * dirac_ONE()) *
- dirac_slash(q, dim) *
+ e = dirac_slash(q, 4) *
+ (dirac_slash(l, dim) + dirac_slash(q, 4) + m * dirac_ONE()) *
+ dirac_slash(q, 4) *
(dirac_slash(l, dim) + m * dirac_ONE());
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());
const varidx & i1 = ex_to<varidx>(i.op(1));
const varidx & i2 = ex_to<varidx>(i.op(2));
+ // The dimension of the indices must be equal, otherwise we use the minimal
+ // dimension
+ if (!i1.get_dim().is_equal(i2.get_dim())) {
+ ex min_dim = i1.minimal_dim(i2);
+ return i.subs(lst(i1 == i1.replace_dim(min_dim), i2 == i2.replace_dim(min_dim)));
+ }
+
// A metric tensor with one covariant and one contravariant index gets
// replaced by a delta tensor
if (i1.is_covariant() != i2.is_covariant())
{
if (!is_a<varidx>(i1) || !is_a<varidx>(i2))
throw(std::invalid_argument("indices of metric tensor must be of type varidx"));
- ex dim = ex_to<idx>(i1).get_dim();
- if (!dim.is_equal(ex_to<idx>(i2).get_dim()))
- throw(std::invalid_argument("all indices of metric tensor must have the same dimension"));
return indexed(tensmetric(), sy_symm(), i1, i2);
}
{
if (!is_a<varidx>(i1) || !is_a<varidx>(i2))
throw(std::invalid_argument("indices of metric tensor must be of type varidx"));
- ex dim = ex_to<idx>(i1).get_dim();
- if (!dim.is_equal(ex_to<idx>(i2).get_dim()))
- throw(std::invalid_argument("all indices of metric tensor must have the same dimension"));
return indexed(minkmetric(pos_sig), sy_symm(), i1, i2);
}