Factor out the scalar multiplier for the dot product of 2x2 matrices

If yy and zz are 2x2 Hermitian matrices, is there a way that I can mark them (with a property?) as Hermitian so that Mathematica can assume that it can factor out and simplify scalar multipliers from a dot product expression? In this example, we have -1 * -1 as the multiplier:

ClearAll[a, yy, zz]
a = -(-yy.zz).zz
FullForm[a]


This gives:

-(-yy.zz).zz
Times[-1,Dot[Times[-1,Dot[yy,zz]],zz]]


Can it be made to simplify to just:

yy.zz.zz

• Dave, just a gentle reminder that, if one of the answers provided below solve your problem, you might want to accept it by clicking on the gray check mark next to it. Jul 27, 2015 at 19:44

To factor out numeric factors in any argument of Dot:

(2 yy.(3 zz)).(4 zz) //. Dot[a___, d_?NumericQ b_, c___] :> d Dot[a, b, c]


24 yy.zz.zz

Edit: If you want this to happen automatically, you can add the rule as a new definition for Dot:

Unprotect[Dot];
Dot[a___, d_?NumericQ b_, c___] := d Dot[a, b, c]
Protect[Dot];


Now the factoring happens by itself:

(2 yy.(3 zz)).(4 zz)


24 yy.zz.zz

• Thanks; this is a nice and straightforward replacement that will do the job. I must say, though, that I was hoping that Mathematica could just "figure it out". Jul 27, 2015 at 20:28
• @daveboden You can make it automatic, if you like -- see the edit. Jul 27, 2015 at 21:21

Is the following sufficiently general?

t[e_] := e /. Dot[Times[z1_ /;!ArrayQ[z1], Dot[z2__]], z3__] :> z1 Dot[z2, z3]
Simplify[a, TransformationFunctions -> {Automatic, t}]
(* yy.zz.zz *)


Easier and more generally applicable is to use TensorExpand:

In[]: -(-yy.zz).zz//TensorExpand
Out[]: yy.zz.zz