Name: Rolf Mertig Date: 08/12/05-09:05:20 PM Z


>Does anyone have a quick answer or a reference to how the >tensor reduction formulae given by the TIDL function are >derived?
Basically it is just projection.
See page 26 of http://xxx.lanl.gov/pdf/hep-ph/9506451
where it is roughly explained.

The actual program I used (I think) is tdec (it is quite
straightforward tensor decomposition with a small trick to
“fix” the metric tensors (gfix) ):
(I am sure one could do this simpler, but it works).
BTW: It can take ages to try to get a decomposition of
higher order rank or with more external momenta!

$VeryVerbose = 1;
SetOptions[Contract, EpsContract -> False];
cc[a__] := 0 /; OddQ[Count[{a}, 0]]; Clear[gfix];
gfix[ w_Times] := 0 /; OddQ[Count[w, pe[0,_]]];
gfix[ff_] := ff /; FreeQ[ff, pe[0,_]];
gfix[pe[0,mu_LorentzIndex] pe[0,nu_LorentzIndex]] := Pair[mu,nu];
Literal[gfix[pe[0,mu_] f_Times]] :=
 Sum[gfix[pe[0,mu] f[[i]]] gfix[Drop[f,{i,i}]], {i, Length[f]}];
(* li = {{q1,mu}, {q2,nu}, …} pli = {p1,p2, …} *)
Clear[tdec];
Options[tdec] = {Dimension -> D};
tdec[li_List, pli_List, opt___Rule] := Block[
{tt, dim, pe, proj, proli, ccli},
dim = Dimension /. {opt} /. Options[tdec];
SetOptions[FourVector, Dimension -> dim];
pe[j_ /; j>0, muu_] := Pair[Momentum[pli[[j]], dim],muu];
tt = Product[FeynCalcInternal[FourVector@@li[[i]]],
             {i,Length[li]}
            ] ==
     (Sum @@ Join[
            {gfixx[ Product[pe[j[ij], LorentzIndex[li[[ij,2]], dim]],
                           {ij,Length[li]}]] *
             Apply[cc, Array[j, Length[li]]]
            }, Array[{j[#],0,Length[pli]}&, Length[li]]
                 ]
     ) /. gfixx -> gfix;
(* build in later maybe more symmetries among the cc’s *)
ccli = Cases2[tt, cc];
proj[jj__] := gfix[ Product[pe[{jj}[[ij]], LorentzIndex[li[[ij,2]], dim]],
                            {ij,Length[{jj}]}]];
proli = ccli /. cc -> proj;
Print[“contracting”];
eqli = Table[Map[Contract[# proli[[il]]]&, tt], {il, Length[proli]}];
solu = Solve3[eqli, Cases2[eqli, cc]];
tt = tt[[2]] /. solu;
qli = Map[First,li];
plq[yy__] := If[FreeQ2[{yy}, qli], Plus[yy], Collect2[Plus[yy],qli]];
tt = Map[#/.Plus->plq&, tt];
tt];
(*
Example:

q123 = tdec[{{qi,mu}, {qj,nu}, {qk, rho}}, {OPEDelta,p}];
Print[“q123 = “,q123//FCF];
Write2[“q123.s”,qqq == q123];
*)