TensorReduce - Maple Help
For the best experience, we recommend viewing online help using Google Chrome or Microsoft Edge.

Online Help

All Products    Maple    MapleSim

Physics[FeynmanIntegral][TensorReduce] - reduce a tensor Feynman integral to a linear combination of scalar Feynman integrals

Calling Sequence

TensorReduce(expression, outputstep = N)




any expression, equation, set, list or matrix of them, typically involving Feynman tensor integrals

outputstep = N


optional, the left-hand side is outputstep and the right-hand side N is a number from 1 to 7 indicating the step at which the tensor reduction is interrupted and the intermediate result returned



When computing the scattering matrix S for a particle process (momentum representation, see FeynmanDiagrams) the result, at one or more loops, contains Feynman integrals. Depending on the fields entering the interaction Lagrangian, the numerator of the integrand of such an integral may involve the loop momentum integration variable (one or a product of them) with free spacetime indices. That is the case of a tensor Feynman integral. Generally speaking, tensor integrals are computed by first reducing them to scalar integrals, for which there exist different approaches. In this context, TensorReduce reduces to scalar integrals the tensor integrals found in expression, using the Passarino-Veltman reduction approach.


There are two key observations in the Passarino-Veltman scheme. One is that a 1-loop tensor Feynman integral can always be expressed as a linear combination of tensorial expressions constructed with the external momenta Pnμ and the metric gμ,ν, That is, as a finite sum of the form n=1NCntnμ,ν,.... The tnμ,ν,... have the free indices of (possibly a product of) the loop momentum in the numerator of the integrand. These tensorial structures are constructed by taking products of the external momenta Pjμ entering the Feynman integral between themselves and the metric gμ,ν. The Maple command that constructs such a tensor basis of N structures tnμ,ν,... is FeynmanIntegral:-TensorBasis.


The other idea behind this algorithm is that the scalar product of the loop momentum pμ found in the numerator of the integrand with tensor structures constructed with the external momentum Pμ can be expressed as a linear combination of inverse propagators.


Combining both ideas, the coefficients Cn entering n=1NCntnμ,ν,... are computed by first, constructing an equation with the Feynman integral on the left-hand side and that expansion with the Cn as unknown coefficients on the right-hand side. Then contracting this equation with the tensorial structures that, on the left-hand side, introduce inverse propagators, a system of equations is constructed and solved for the C[n].


Two relevant computational tools for performing the reduction and other manipulations of Feynman integrals are the commands ToAbstractRepresentation and FromAbstractRepresentation. These commands map, back and forth, a given Feynman integral into and from an abstract representation that contains all the information regarding the propagators present, external momenta and corresponding masses, the loop momentum integration, and the free indices.


The Passarino-Veltman algorithm has several steps, each of which can be of interest on its own, or simply to follow the computation step-by-step. For this purpose, you can use the optional argument outputstep = n, where n is any positive integer up to 7. The result of each step is as follows:


outputstep = 1:  an equation, with the Feynman tensor integral in the left-hand side and the linear combination of tensor structures constructed with the external momentum Pμ and the metric on the right-hand side.


outputstep equal to 2, 3 or 4: a Vector of equations, each of which is constructed by contracting the output of step 1 with tensor structures that, when contracted with the loop momentum in the numerator of the integrand, results in inverse propagators. These scalar products are first represented (step 2) then the contractions are expressed in a more convenient form on the right-hand sides (step 3), finally the actual reduction - the core of the process - that happens when performing the contraction on the left-hand sides that results in inverse propagators (step 4). In these three steps, the integrals are represented in abstract form. These results can be manipulated further using ToAbstractRepresentation and FromAbstractRepresentation.


outputstep = 5: an equation with the output of the step 1 and the a set of equations containing the solution for the coefficients Cn


outputstep = 6: an equation with the left-hand side equal to the given Feynman tensor integral and the right hand side already as a linear combination of scalar Feynman integrals written in the abstract representation used in the FeynmanIntegral package (see the commands ToAbstractRepresentation, FromAbstractRepresentation).


outputstep = 7: the same as omitting outputstep = ... entirely, the result is the full reduction of the tensor integral to a linear combination of scalar Feynman integrals.






To remain closer to textbook notation, display the imaginary unit with a lowercase i

interface(imaginaryunit = i):

The simplest case of a massive φ field, the integral containing two propagators and one external momentum P1μ to which corresponds the mass m1.

%FeynmanIntegral(p__1[~mu]/((p__1^2 - m__phi^2 + i * epsilon)*((p__1 - P__1)^2 - m__1^2 + i * epsilon)), p__1);

p__1μμp__12m__φ2+εp__1P__12m__12+εⅆp__1 4


The reduction of this tensor integral to a linear combination of scalar Feynman integrals all in one go:

(2) = TensorReduce((2));

p__1μμp__12m__φ2+εp__1P__12m__12+εⅆp__1 4=m__12m__φ2P__1·P__11p__12m__φ2+εp__1P__12m__12+εⅆp__1 4+1p__12m__φ2+εⅆp__1 41p__1P__12m__12+εⅆp__1 4P__1μμ2P__1·P__1


Note that, by design, the reduction process does not evaluate the integrals so that one can follow the reduction process clearly. The evaluation can be performed next by passing this result to Evaluate

(2) = Evaluate(rhs((3)));


Note also that Evaluate automatically calls TensorReduce to perform the reduction of tensor integrals when that is the case. So, passing the Feynman integral directly to Evaluate, skipping the interactive TensorReduce step, results in the same




Back to the reduction process, this is how the integral is processed one step at a time. First, check the abstract representation that will be used in the output step by step:




In this output we see the integral has 2 propagators, the first one has 0 external momentum (i.e. none) and mass mφ2. The second propagator has external momentum P1 to which corresponds the mass m1. Finally the loop momentum integration variable is p1 and the last operand, in this example equal to 0 means there are no contracted powers of p1, the loop integration variable, in the numerator of the integrand. To retrieve the non-abstract form from the abstract one you can use


p__1μμp__12m__φ2+εp__1P__12m__12+εⅆp__1 4


The first step of the Passarino-Veltman reduction, the main equation

TensorReduce((2), step = 1);

* Partial match of 'step' against keyword 'outputstep'

p__1μμp__12m__φ2+εp__1P__12m__12+εⅆp__1 4=C1P__1μμ


The right-hand side contains only one element. That is so because the tensor basis for this problem, where there is only one free spacetime index in the numerator of the integral and only one external momentum P1 is given by just

TensorBasis([P__1], [~mu]);



The second step

TensorReduce((2), step = 2);

* Partial match of 'step' against keyword 'outputstep'



The third step only represents the scalar products in the right-hand side in a more convenient form

TensorReduce((2), step = 3);

* Partial match of 'step' against keyword 'outputstep'



The fourth step is the most important one, where the actual reduction to scalar integrals, represented in abstract form, is performed

TensorReduce((2), step = 4);

* Partial match of 'step' against keyword 'outputstep'



To see this result in standard representation you can use


1p__12m__φ2+εⅆp__1 42+1p__1P__12m__12+εⅆp__1 42+P__1·P__1m__12+m__φ21p__12m__φ2+εp__1P__12m__12+εⅆp__1 42=C1P__1·P__1


The fifth step processes this output by solving for the Cn coefficients, expressing them in terms of the scalar integrals of step 4.

TensorReduce((2), step = 5);

* Partial match of 'step' against keyword 'outputstep'

p__1μμp__12m__φ2+εp__1P__12m__12+εⅆp__1 4=C1P__1μμwhereC1=𝕋2,0,m__φ2,P__1,m__12,p__1,0m__12+𝕋2,0,m__φ2,P__1,m__12,p__1,0m__φ2+P__1·P__1𝕋2,0,m__φ2,P__1,m__12,p__1,0𝕋1,0,m__φ2,p__1,0+𝕋1,P__1,m__12,p__1,02P__1·P__1


The sixth step combines this result inserting, in the output of step 1, the values of the Cn

TensorReduce((2), step = 6);

* Partial match of 'step' against keyword 'outputstep'

p__1μμp__12m__φ2+εp__1P__12m__12+εⅆp__1 4=𝕋2,0,m__φ2,P__1,m__12,p__1,0m__12+𝕋2,0,m__φ2,P__1,m__12,p__1,0m__φ2+P__1·P__1𝕋2,0,m__φ2,P__1,m__12,p__1,0𝕋1,0,m__φ2,p__1,0+𝕋1,P__1,m__12,p__1,0P__1μμ2P__1·P__1


Finally, either passing step = 7 or omitting the step = ... altogether, the whole reduction is performed as done at the beginning (see equation (3)).

An example with two free indices

%FeynmanIntegral(p__1[~mu]*p__1[~nu]/((p__1^2 - m__1^2 + I*epsilon)*((p__1 - P__1)^2 - m__1^2 + i*epsilon)), p__1);

p__1μμp__1ννIεm__12+p__12p__1P__12m__12+εⅆp__1 4


The reduction of this tensor integral to scalar integrals is given by

(16) = TensorReduce((16));

p__1μμp__1ννIεm__12+p__12p__1P__12m__12+εⅆp__1 4=4P__1·P__1gμ,νμ,νP__1·P__124+P__1νν2+ϵP__1μμ2m__12gμ,νμ,νP__1·P__1+m__12P__1μμP__1νν1p__12m__12+εp__1P__12m__12+εⅆp__1 4+2gμ,νμ,νP__1·P__12+4P__1νν1+ϵP__1μμm__12gμ,νμ,νP__1·P__12m__12P__1μμP__1νν2+ϵ1p__1P__12m__12+εⅆp__1 4+21p__12m__12+εⅆp__1 4P__12+m__12P__1·P__1gμ,νμ,νP__1·P__12+P__1νν2+ϵP__1μμ12+8ϵP__1·P__12


To understand this result, start checking the tensor basis, which in this case involves two objects

TensorBasis([P__1], [~mu, ~nu]);



The key steps are 1, 2 and 4. Step 1 gives the expansion of the integral onto the tensor basis

TensorReduce((16), step = 1);

* Partial match of 'step' against keyword 'outputstep'

p__1μμp__1ννIεm__12+p__12p__1P__12m__12+εⅆp__1 4=C2P__1μμP__1νν+C1gμ,νμ,ν


Step 2 shows the system of equations; in each left-hand side, performing the contraction results in an inverse propagator that cancels with an existing one in the given integral

TensorReduce((16), step = 2);

* Partial match of 'step' against keyword 'outputstep'



Note the occurrence of a factor of the form 42ϵ on the right-hand side of the first equation. Such factors arise from the contraction of the metric in dimension d=42ϵ where 4 is the value of the dimension currently set, as shown by Setupdimension.

Step 4 performs the contraction resulting in the system of equations for the Cn involving only scalar Feynman integrals

TensorReduce((16), step = 4);

* Partial match of 'step' against keyword 'outputstep'



To see, for instance, the second equation in standard integral notation you can use


P__1·P__121p__12m__12+εp__1P__12m__12+εⅆp__1 44+m__12+2P__1·P__11p__1P__12m__12+εⅆp__1 44+1p__12m__12+εⅆp__1 4P__12+m__12P__1·P__14=P__1·P__1C2P__1·P__1+C1


Naturally, the reduction for more complicated integrals involves larger expressions, mainly in connection with the enlargement of the tensor basis. For example, the basis in the presence of two external momenta P1 and P2 and a product of three loop momentum p1 with spacetime free indices is given by

TensorBasis([P__1, P__2], [~mu, ~nu, ~rho], symmetrize = false);



and has 6 elements instead of the 2 of the previous example




See Also

Dgamma, Evaluate, FeynmanDiagrams, FeynmanIntegral[Overview], FromAbstractRepresentation, Parametrize, Physics, Physics conventions, Physics examples, Physics Updates, Tensors - a complete guide, Mini-Course Computer Algebra for Physicists, Setup, TensorBasis, ToAbstractRepresentation



[1] Smirnov, V.A., Feynman Integral Calculus. Springer, 2006.


[2] Weinberg, S., The Quantum Theory Of Fields. Cambridge University Press, 2005.


[3] Bogoliubov, N.N., and Shirkov, D.V. Quantum Fields. Benjamin Cummings, 1982.