Mathematica Stack Exchange is a question and answer site for users of Mathematica. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm trying to verify an identity involving symmetric traceless tensors over the reals. What I tried was:

In[11]:= $Assumptions = d \[Element] Matrices[{3, 3}, Reals, Symmetric[{1, 2}]]
Out[11]= d \[Element] Matrices[{3, 3}, Reals, Symmetric[{1, 2}]]
In[24]:= dd = d - Tr[d] IdentityMatrix[3]/3
Out[24]= {{d - Tr[d]/3, d, d}, {d, d - Tr[d]/3, d}, {d, d,d - Tr[d]/3}}

I think the output in 24 is assuming that d is now a scalar. That gets me into trouble later when I tried to compute outer products of dd and use TensorReduce. For example

lh = TensorReduce[TensorContract[dd\[TensorProduct]dd, {{1, 3}, {2, 4}}]]
TensorDimensions::fscl: Nonscalar expression d encountered as an argument of numeric function Power. >>
TensorDimensions::inhom: Inhomogeneous dimensions in sum d-Tr[d]/3. >>

Why is this not working, and what is the right way to do computations on traceless matrices? Sune

share|improve this question
Related: Inequalities with assumptions and constraints – Jens Apr 11 '14 at 15:10
up vote 5 down vote accepted

Assumptions are not used in normal evaluation, but only in certain functions like Simplify. Another, simpler example:

In[1]:= $Assumptions = x \[Element] Reals

Out[1]= x \[Element] Reals

In[2]:= Conjugate[x]

Out[2]= Conjugate[x]

In[3]:= Simplify[%]

Out[3]= x

You see, during normal evaluation Mathematica doesn't recognize that x is supposed to be real, only during Simplify.

You can identify the functions which take $Assumptions into account by the fact that they also accept an option Assumption. On Mathematica 8, using


I get the following list:

  • ContinuedFractionK
  • Convolve
  • DifferenceDelta
  • DifferenceRootReduce
  • DifferentialRootReduce
  • DirichletTransform
  • DiscreteConvolve
  • DiscreteRatio
  • DiscreteShift
  • Expectation
  • ExpectedValue
  • ExponentialGeneratingFunction
  • FinancialBond
  • FourierCoefficient
  • FourierCosCoefficient
  • FourierCosSeries
  • FourierCosTransform
  • FourierSequenceTransform
  • FourierSeries
  • FourierSinCoefficient
  • FourierSinSeries
  • FourierSinTransform
  • FourierTransform
  • FourierTrigSeries
  • FullSimplify
  • FunctionExpand
  • GeneratingFunction
  • Integrate
  • InverseFourierCosTransform
  • InverseFourierSequenceTransform
  • InverseFourierSinTransform
  • InverseFourierTransform
  • InverseZTransform
  • LaplaceTransform
  • Limit
  • PiecewiseExpand
  • PossibleZeroQ
  • PowerExpand
  • Probability
  • ProbabilityDistribution
  • Product
  • Refine
  • Residue
  • Series
  • SeriesCoefficient
  • Simplify
  • Sum
  • SumConvergence
  • TimeValue
  • ToRadicals
  • TransformedDistribution
  • ZTransform
share|improve this answer
To be more precise, $Assumptions only works on functions with Assumptions option :) – xzczd Apr 11 '14 at 12:24
@xzczd: I already suspected that, but wasn't quite sure, so I didn't include that. But now that you say so, I think it can be safely included. Thank you. – celtschk Apr 11 '14 at 12:26
Thanks - got it. So perhaps the only way of approaching my problem would be to define SymmetrizedArrays with proper symmetries and then subtract the trace explicitly? – Sune Apr 12 '14 at 8:34
I don't have experience with SymmetrizedArray (it's a Mathematica 9 feature, and I only have access to Mathematica 8), so I cannot tell you whether that would be the correct or best approach. The problem here is that Mathematica treats all unbound variables as scalars during evaluation, and there's AFAIK no way to override that behaviour for specific variables. – celtschk Apr 12 '14 at 9:01

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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