I have a function that outputs a large expression containing dot products of vectors. None of the vector components are known, so all dot products are symbolic. For instance, part of the output may look like2(p1.q1)(p3.p2) + (p1.p2)^2.

I know what some of the dot products evaluate to. For example, I know things like:

p1.p1 = m
p1.p2 = 0

I want mathematica to simplify the expression as much as possible, making use of the known dot products and being sure to simplify all possible cancellation.

What is a good way to do this?

The way I am currently doing it is clunky and doesn't always work well. What I did was define a dot product function d[x,y] and then explicitly specified some of the dot products like d[p1,p2] = m and d[p1,p2] = 0. This became cumbersome because I constantly had to explicitly input commutitivity for each dot product (i.e. d[p1,p2] = d[p2,p1] = 0), and even when I did this, mathematica was not fully taking commutitivity into account when simplifying (via FullSimplify) my expression. Is there a better way?

  • 3
    $\begingroup$ To help you with your d function, you could SetAttributes[d,Orderless]. Then all you need to define is d[p1,p2]=m (shouldn't the m be squared?). Then d[p1,p2] and d[p2,p1] will automatically be replaced with m. $\endgroup$
    – QuantumDot
    Nov 29, 2014 at 23:00
  • 1
    $\begingroup$ I also suggest that you investigate the option TransformationFuntions that is given to Simplify to teach it to handle expressions involving your d function. $\endgroup$
    – QuantumDot
    Nov 29, 2014 at 23:02
  • 1
    $\begingroup$ The orderless attribute simplifies the code a lot, and Mathematica seems to have an easier time simplifying expressions after I added that. $\endgroup$
    – user19250
    Nov 30, 2014 at 20:15

2 Answers 2


TensorExpand knows about commutativity of vectors. So, one approach is to define UpValues for your known relations (in canonical order):

p1 /: p1.p1 = m;
p2 /: p1.p2 = 0;

Then, use TensorExpand on your expression with the assumption that your variables are vectors:

    2 (p1.q1) (p3.p2) + (p1.p2)^2,
    Assumptions->(p1|p2|p3|q1) ∈ Vectors[d]

2 p1.q1 p2.p3


You might formulate a list of rules that take into account the existing relations, such as the following. Assume there are 2 known relations p1.p2=mand p1.q1=s. The rules are as follows:

rules = {p1.p2 -> m, p2.p1 -> m, p1.q1 -> s, q1.p1 -> s};

Their application is straightforard:

    2 (p1.q1) (p3.p2) + (p1.p2)^2 /. rules

(*  m^2 + 2 s p3.p2   *)

Have fun!


Your Answer

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