I am doing some calculation with summation and the Kronecker symbol. Here are my steps :

$Assumptions = 
  k1 ∈ Reals &&  k2 ∈ Reals &&  k3 ∈ Reals &&  p1 ∈ Reals &&  p2 ∈ Reals &&  p3 ∈ Reals
k = {k1, k2, k3};
p = {p1, p2, p3};
d[i_, j_] := KroneckerDelta[i, j]
proj[i_, j_, k1_, k2_, k3_] := 
  d[i, j] - 
   (d[i, 1]*k1 + d[i, 2]*k2 + d[i, 3]*k3)*
   (d[j, 1]*k1 + d[j, 2]*k2 + d[j, 3]*k3)/
   (k1^2 + k2^2 + k3^2)
test1 = proj[i, j, k1, k2, k3]*proj[i, j, p1, p2, p3];
test2 = Sum[Sum[test1, {i, 1, 3}], {j, 1, 3}]
test2 // Expand

To explain the steps:

1) I define $\vec{k}$ and $\vec{p}$ with real components.
2) I define a projector $P_{ij} \left( \vec{k} \right) = \delta_{ij} - \frac{k_i k_j}{k^2}$.
3) I compute a summation on the repeated subscript.

After the last step, I have a relatively big expression, the product of k and p components. It looks like $$3-\frac{a}{a+b+c} - \frac{b}{a+b+c} - \frac{c}{a+b+c} +...-...$$ The a, b and c stands for k1, k2 and k3 (or p1, 2, 3).

Now the question: why doesn't Mathematica make the simplification because, as anyone can see, the preceding expression can be simplified to $2 +...-...$

Is the problem linked to the Expand operation? How can I make the simplification I want?. I thought of using /. to do it, but that doesn't work either.

I hope someone will understand my question!

  • $\begingroup$ You can try using Simplify and related, but what you think it's a simpler expression will not necessarily match Mathematica's. $\endgroup$ Commented Feb 15, 2013 at 10:23
  • $\begingroup$ +1 just for formatting your code:) Simplify@test2 works nicely and returns (2 k2 k3 p2 p3 + 2 k1 p1 (k2 p2 + k3 p3) + k1^2 (2 p1^2 + p2^2 + p3^2) + k2^2 (p1^2 + 2 p2^2 + p3^2) + k3^2 (p1^2 + p2^2 + 2 p3^2))/((k1^2 + k2^2 + k3^2) (p1^2 + p2^2 + p3^2)) $\endgroup$
    – Ajasja
    Commented Feb 15, 2013 at 10:34

4 Answers 4


You have to explicitly tell Mathematica to simplify expressions. You can do this using Simplify or FullSimplify


(2 k2 k3 p2 p3 + 2 k1 p1 (k2 p2 + k3 p3) + 
   k1^2 (2 p1^2 + p2^2 + p3^2) + k2^2 (p1^2 + 2 p2^2 + p3^2) + 
   k3^2 (p1^2 + p2^2 + 2 p3^2))/((k1^2 + k2^2 + k3^2) (p1^2 + p2^2 + 
  • $\begingroup$ Thank you for your answers. The problem when I use Simplify is that the form of the result is not "usable". I mean in the sense I want to use it. Because the calculation must lead to $1 - (\vec{k}.\vec{p})^2/(k^2*p^2)$. And with simplify, Mathematica doesn't do the factorization I want. I think I have to find an other way to do it, I may already have an idea. I thought I forget an assumption to enable Mathematica to do automatically this simplification. But it won't do what I didn't ask ! $\endgroup$
    – Lalylulelo
    Commented Feb 15, 2013 at 10:52

I would use symbolic tensors instead of explicit tensors. First, let's reformulate your question using symbolic tensors:

proj[k_] /; TensorRank[k] == 1 := With[{d = First @ TensorDimensions[k]},
    Inactive[IdentityMatrix][d] - TensorProduct[k, k]/k.k

$Assumptions = (k|p) ∈ Vectors[3];
test = TensorContract[TensorProduct[proj[k], proj[p]], {{1, 3}, {2, 4}}];
test //TeXForm

$\operatorname{TensorContract}\left[\left(\operatorname{IdentityMatrix}[3]-\frac{k\otimes k}{k.k}\right)\otimes \left(\operatorname{IdentityMatrix}[3]-\frac{p\otimes p}{p.p}\right),\left( \begin{array}{cc} 1 & 3 \\ 2 & 4 \\ \end{array} \right)\right]$

Note that TeXForm doesn't yet support Inactive, which is why it doesn't appear above. Also, I've overriden the default TeXForm formatting of \[TensorProduct] so that it looks like \otimes.

Mathematica doesn't (yet) have a symbolic identity tensor, so I use Inactive[IdentityMatrix][3] as a substitute. This means that TensorReduce can't really be used to simplify the output since it doesn't have support for my identity tensor substitute. I've written a package that helps augment TensorReduce to work with these identity tensors, which can be found here:

    "Site" -> "http://raw.githubusercontent.com/carlwoll/TensorSimplify/master"

Once installed, you can load the package with:


Let's see this package in action on the above expression. First we need to use TensorReduce (TensorExpand would also work):

r1 = TensorReduce[test];
r1 //TeXForm

$-\frac{\operatorname{TensorContract}\left[k\otimes k\otimes \operatorname{IdentityMatrix}[3],\left( \begin{array}{cc} 1 & 3 \\ 2 & 4 \\ \end{array} \right)\right]}{k.k}-\frac{\operatorname{TensorContract}\left[p\otimes p\otimes \operatorname{IdentityMatrix}[3],\left( \begin{array}{cc} 1 & 3 \\ 2 & 4 \\ \end{array} \right)\right]}{p.p}+\operatorname{TensorContract}\left[\operatorname{IdentityMatrix}[3]\otimes \operatorname{IdentityMatrix}[3],\left( \begin{array}{cc} 1 & 3 \\ 2 & 4 \\ \end{array} \right)\right]+\frac{\operatorname{TensorContract}\left[k\otimes p,\left( \begin{array}{cc} 1 & 2 \\ \end{array} \right)\right]^2}{k.k p.p}$

Using TensorReduce causes the symbolic identity tensor to be contracted. The package function IdentityReduce can then be used to eliminate these contracted identity tensors:

r2 = IdentityReduce[r1];
r2 //TeXForm

$\frac{\operatorname{TensorContract}\left[k\otimes p,\left( \begin{array}{cc} 1 & 2 \\ \end{array} \right)\right]^2}{k.k p.p}-\frac{\operatorname{TensorContract}\left[k\otimes k,\left( \begin{array}{cc} 1 & 2 \\ \end{array} \right)\right]}{k.k}-\frac{\operatorname{TensorContract}\left[p\otimes p,\left( \begin{array}{cc} 1 & 2 \\ \end{array} \right)\right]}{p.p}+3$

Finally, the above expression is a mix of equivalent Dot and TensorContract objects. Using a common form will enable further simplifications. The less verbose version is obtained using the Dot representation (obtained by using the package function FromTensor):


1 + (k.p)^2/(k.k p.p)

I believe this is the form you're looking for. The package function TensorSimplify does all of the above steps:


1 + (k.p)^2/(k.k p.p)

  • $\begingroup$ Impressive! It was exactly the form I was looking for. I will have to test it. I think I figured out a solution by using replacements but yours is much more elegant. Thanks! $\endgroup$
    – Lalylulelo
    Commented Nov 12, 2017 at 9:04

Not sure precisely what you want, but maybe it's this:

x = test2 // Expand;
x1 = PolynomialReduce[
   Numerator[Together[x]], {Denominator[Together[x]]}, Variables[x]];
x2 = PolynomialReduce[x1[[2]], {k1^2 + k2^2 + k3^2}, Variables[x]];
x3 = PolynomialReduce[x2[[2]], {p1^2 + p2^2 + p3^2}, Variables[x]];
y = x1[[1, 1]] + x2[[1, 1]]/(p1^2 + p2^2 + p3^2) + 
  x3[[1, 1]]/(k1^2 + k2^2 + k3^2) + 
  x3[[2]]/((p1^2 + p2^2 + p3^2) (k1^2 + k2^2 + k3^2))

Here's the output in reverse order; there's an issue with copy/paste:

$\frac{2 \text{k1} \text{k2} \text{p1} \text{p2}+2 \text{k1} \text{k3} \text{p1} \text{p3}+2 \text{k2}^2 \text{p2}^2+\text{k2}^2 \text{p3}^2+2 \text{k2} \text{k3} \text{p2} \text{p3}+\text{k3}^2 \text{p2}^2+2 \text{k3}^2 \text{p3}^2}{\left(\text{k1}^2+\text{k2}^2+\text{k3}^2\right) \left(\text{p1}^2+\text{p2}^2+\text{p3}^2\right)}+\frac{-\text{k2}^2-\text{k3}^2}{\text{k1}^2+\text{k2}^2+\text{k3}^2}+\frac{-\text{p2}^2-\text{p3}^2}{\text{p1}^2+\text{p2}^2+\text{p3}^2}+2$


If you know approximately what denominators are obtained, you coud use command Collect[expression, factor].


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.