def simplify_lines(ex): """ simplify a product of gamma matrices Examples ======== >>> from sympy.physics.hep.gamma_matrices import GammaMatrix, DiracSpinorIndex >>> from sympy.tensor.tensor import tensor_indices >>> i0,i1,i2,i3,i4,i5 = tensor_indices('i0:6', GammaMatrix.LorentzIndex) >>> s0,s1,s2,s3,s4,s5,s6,s7 = tensor_indices('s0:8', DiracSpinorIndex) >>> G = GammaMatrix >>> t = G(i1,s1,-s2)*G(i4,s7,-s6)*G(i2,s2,-s3)*G(i3,s4,-s5)*G(i5,s6,-s7) >>> G.simplify_lines(t) 4*gamma(i3, s4, -s5)*gamma(i1, s1, -S_0)*gamma(i2, S_0, -s3)*metric(i4, i5) """ lines, traces, rest = get_lines(ex, DiracSpinorIndex) a = ex.split() trest = tensor_mul(*[x for i, x in enumerate(a) if i in rest]) tlines = [] for line in lines: first = a[line[0]] last = a[line[-1]] first = [x[0] for x in first.free if x[1] == 1][0] last = [x[0] for x in last.free if x[1] == 2][0] tx = tensor_mul(*[x for i, x in enumerate(a) if i in line]) tx1 = GammaMatrixHead._simplify_single_line(tx) tlines.append(tx1) traces = [GammaMatrix._trace_single_line(tensor_mul(*[x for i, x in enumerate(a) if i in line])) for line in traces] res = tensor_mul(*([trest] + tlines + traces)) return res
def test_get_lines(): i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13 = \ tensor_indices('i0:14', G.LorentzIndex) s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16 = \ tensor_indices('s0:17', DiracSpinorIndex) t = G(i1,s1,-s2)*G(i2,s3,-s4)*G(i4,s2,-s6)*G(i3,s4,-s3) r = get_lines(t, DiracSpinorIndex) assert r == ([[0, 2]], [[1, 3]], []) t = G(i1,s1,-s2)*G(i2,s2,-s3)*G(i3,s3,-s4)*G(i4,s4,-s5)*\ G(i5,s6,-s7)*G(i6,s7,-s8)*G(i7,s8,-s9)*G(i8,s9,-s6) r = get_lines(t, DiracSpinorIndex) assert r == ([[0, 1, 2, 3]], [[4, 5, 6, 7]], []) t = G(i1,s1,-s2)*G(i0,s0,-s10)*G(i2,s2,-s3)*G(i3,s3,-s4)*\ G(i4,s4,-s5)*G(i5,s6,-s7)*G(i6,s7,-s8)*G(i7,s8,-s9)*\ G(i8,s9,-s6)*G(i9,s10,-s0) r = get_lines(t, DiracSpinorIndex) assert r == ([[0, 2, 3, 4]], [[5, 6, 7, 8], [1, 9]], []) t = G(i1,s1,-s2)*G(i11,s12,-s13)*G(i0,s0,-s10)*G(i2,s2,-s3)*G(i3,s3,-s4)*\ G(i4,s4,-s5)*G(i5,s6,-s7)*G(i10,s11,-s12)*G(i6,s7,-s8)*G(i7,s8,-s9)*\ G(i8,s9,-s6)*G(i9,s10,-s0) r = get_lines(t, DiracSpinorIndex) assert r == ([[0, 3, 4, 5], [7, 1]], [[6, 8, 9, 10], [2, 11]], []) t = G(i4,s4,-s5)*G(i5,s6,-s7)*G(i10,s11,-s12)*G(i6,s7,-s8)*G(i7,s8,-s9)*\ G(i8,s9,-s6)*G(i9,s10,-s0)*\ G(i1,s1,-s2)*G(i11,s12,-s13)*G(i0,s0,-s10)*G(i2,s2,-s3)*G(i3,s3,-s4) r = get_lines(t, DiracSpinorIndex) assert r == ([[2, 8], [7, 10, 11, 0]], [[1, 3, 4, 5], [6, 9]], []) t = G(i8,s9,-s6)*G(i9,s10,-s0)*G(i4,s4,-s5)*G(i13,s14,-s15)*\ G(i10,s11,-s12)*G(i1,s1,-s2)*G(i11,s12,-s13)*\ G(i0,s0,-s10)*G(i6,s7,-s8)*G(i7,s8,-s9)*\ G(i2,s2,-s3)*G(i12,s13,-s14)*G(i3,s3,-s4)*G(i5,s6,-s7) r = get_lines(t, DiracSpinorIndex) assert r == ([[4, 6, 11, 3], [5, 10, 12, 2]], [[1, 7], [0, 13, 8, 9]], [])
def test_get_lines(): i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13 = \ tensor_indices('i0:14', G.LorentzIndex) s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16 = \ tensor_indices('s0:17', DiracSpinorIndex) t = G(i1, s1, -s2) * G(i2, s3, -s4) * G(i4, s2, -s6) * G(i3, s4, -s3) r = get_lines(t, DiracSpinorIndex) assert r == ([[0, 2]], [[1, 3]], []) t = G(i1,s1,-s2)*G(i2,s2,-s3)*G(i3,s3,-s4)*G(i4,s4,-s5)*\ G(i5,s6,-s7)*G(i6,s7,-s8)*G(i7,s8,-s9)*G(i8,s9,-s6) r = get_lines(t, DiracSpinorIndex) assert r == ([[0, 1, 2, 3]], [[4, 5, 6, 7]], []) t = G(i1,s1,-s2)*G(i0,s0,-s10)*G(i2,s2,-s3)*G(i3,s3,-s4)*\ G(i4,s4,-s5)*G(i5,s6,-s7)*G(i6,s7,-s8)*G(i7,s8,-s9)*\ G(i8,s9,-s6)*G(i9,s10,-s0) r = get_lines(t, DiracSpinorIndex) assert r == ([[0, 2, 3, 4]], [[5, 6, 7, 8], [1, 9]], []) t = G(i1,s1,-s2)*G(i11,s12,-s13)*G(i0,s0,-s10)*G(i2,s2,-s3)*G(i3,s3,-s4)*\ G(i4,s4,-s5)*G(i5,s6,-s7)*G(i10,s11,-s12)*G(i6,s7,-s8)*G(i7,s8,-s9)*\ G(i8,s9,-s6)*G(i9,s10,-s0) r = get_lines(t, DiracSpinorIndex) assert r == ([[7, 1], [0, 3, 4, 5]], [[6, 8, 9, 10], [2, 11]], []) t = G(i4,s4,-s5)*G(i5,s6,-s7)*G(i10,s11,-s12)*G(i6,s7,-s8)*G(i7,s8,-s9)*\ G(i8,s9,-s6)*G(i9,s10,-s0)*\ G(i1,s1,-s2)*G(i11,s12,-s13)*G(i0,s0,-s10)*G(i2,s2,-s3)*G(i3,s3,-s4) r = get_lines(t, DiracSpinorIndex) assert r == ([[7, 10, 11, 0], [2, 8]], [[1, 3, 4, 5], [6, 9]], []) t = G(i8,s9,-s6)*G(i9,s10,-s0)*G(i4,s4,-s5)*G(i13,s14,-s15)*\ G(i10,s11,-s12)*G(i1,s1,-s2)*G(i11,s12,-s13)*\ G(i0,s0,-s10)*G(i6,s7,-s8)*G(i7,s8,-s9)*\ G(i2,s2,-s3)*G(i12,s13,-s14)*G(i3,s3,-s4)*G(i5,s6,-s7) r = get_lines(t, DiracSpinorIndex) assert r == ([[5, 10, 12, 2], [4, 6, 11, 3]], [[1, 7], [0, 13, 8, 9]], [])