# Why doesn't FullSimplify drop the Re function from an expression known to be real?

For some reason Mathematica does not properly simplify this expression:

In:= FullSimplify[ArcTan[-Re[x + z], y], (x | y | z) \[Element] Reals]
Out= ArcTan[-Re[x + z], y]


Obviously, if x and z are real, then so is x+z, so Re[x + z] should be replaced by x + z. Strangely enough, dropping any small part of the input fixes the problem, here are some examples.
No minus sign:

In:= FullSimplify[ ArcTan[Re[x + z], y], (x | y | z) \[Element] Reals]
Out= ArcTan[x + z, y]


No z:

In:= FullSimplify[ArcTan[-Re[x], y], (x | y | z) \[Element] Reals]
Out= ArcTan[-x, y]


No y:

In:= FullSimplify[ArcTan[-Re[x + z]], (x | y | z) \[Element] Reals]
Out= -ArcTan[x + z]


Of course I can just drop the Re function manually, but this is just a small fragment of the actual expression I'm trying to simplify, and I would like to avoid going though the whole expression looking for this specific pattern.
Anyone knows how to fix this? Is this a bug or what? (I'm using version 8.0.4.0)

• It also doesn't work with FullSimplify[{-Re[x + z], 0}, (x|z) \[Element] Reals]. – celtschk Apr 11 '12 at 14:27
• Simplify[Re[x + z], Assumptions -> {x \[Element] Reals, y \[Element] Reals, z \[Element] Reals}] does give x+z so it has to do with ArcTan – b.gates.you.know.what Apr 11 '12 at 14:27
• ComplexExpand doesn't drop it either. – Szabolcs Apr 11 '12 at 14:37
• FullSimplify[ArcTan[-(y/Re[x + z])], Assumptions -> {x + z > 0, y [Element] Reals}] also works. – b.gates.you.know.what Apr 11 '12 at 14:37
• @celtschk - you're right, the ArcTan is redundant – Joe Apr 11 '12 at 14:44

The problem is due to Mathematica thinking that the version with the Re[] is actually simpler. This is because the default complexity function is more or less LeafCount[], and

In:= ArcTan[-Re[x+z],y]//FullForm
Out//FullForm= ArcTan[Times[-1,Re[Plus[x,z]]],y]


whereas

In:= ArcTan[-x-z,y]//FullForm
Out//FullForm= ArcTan[Plus[Times[-1,x],Times[-1,z]],y]


Here is a function that counts leaves without penalizing negation:

In:= f3[e_]:=(LeafCount[e]-2Count[e,Times[-1,_],{0,Infinity}])
{LeafCount[x],LeafCount[-x],f3[x],f3[-x]}
Out= {1,3,1,1}


If you tell mathematica to simplify using this complexity function then you get the expected result:

FullSimplify[ArcTan[-Re[x+z],y],(x|y|z)\[Element]Reals,ComplexityFunction->f3]


Out= ArcTan[-x-z,y]

• This is exactly the answer I got from Wolfram support. It's pretty amazing that this quirky behavior actually has an explanation. I think that in the root of this is the fact the Mathematica can't have an expression of the form -(x+y) without automatically expanding it. Having some function in the middle like -Re[x+y] allows multiplying by -1 only once. – Joe Apr 13 '12 at 11:12
• It is a nice example showing that the concept of simplifying something is actually pretty complicated. – bill s Mar 21 '18 at 15:30

I think this is a bug.

Close enough expressions yield better results, e.g.

FullSimplify[
ArcTan[ -# Re[x + z], y], (x | y | z) \[Element] Reals
] ===
ArcTan[ -# (x + z), y] & /@
{ 1.0,   1, Sqrt[1.], Exp[0.], 1 - 0., 2, a}

{True, False, True, True, True, True, True}


The problem seems to be specific for a factor -1 before Re[x + z], other factors appear to give what we would expect. If there is ArcTan[-a Re[x + z], y] in the expression it works well. It should be noted that the same issue comes with Simplify and that the problem has nothing to do with ArcTan, because :

(FullSimplify[-# Re[x + z], (x | y | z) \[Element] Reals]
===  -# (x + z)) & /@
{ 1.0,  1, Sqrt[1.], Exp[0.], 1 - 0., 2, a}

{True, False, True, True, True, True, True}


To fix the problem you could use e.g. Refine instead of FullSimplify,

Refine[ ArcTan[ -Re[x + z], y], (x | y | z) \[Element] Reals]

ArcTan[-x - z, y]


Edit

Another way to deal with similar expressions wolud be hiding a minus sign into Re, e.g.

Re[-(x + z)] instead of -Re[x + z].

Sometimes a more flexible way would be some kind of replacement, i.e. setting ArcTan[-a Re[x + z], y]] wherever in expr one finds ArcTan[- Re[x + z], y]] and then expr /. a->1

FullSimplify[ ArcTan[ -a Re[x + z], y], (x | y | z) \[Element] Reals] /. a -> 1
FullSimplify[ArcTan[ Re[-(x + z)], y], (x | y | z) \[Element] Reals]

ArcTan[-x - z, y]
ArcTan[-x - z, y]

• I submitted a bug report with Wolfram support, I will update here if there are news. – Joe Apr 12 '12 at 7:10
• I got a response - see @Lev-Bishop's answer – Joe Apr 13 '12 at 11:14