# How to find the most compact form of an equation

I would like to know whether there is any general approach to obtain the most compact form of an equation with Mathematica.

I used to believe that the FullSimplify command would do that for me, but I recently found out that it will not necessarily give the most compact form. I found out with the following equation, which has been FullSimplified:

$$\left[\sec (\alpha ) \left(\coth \left(L \sqrt{\text{Bo} \cos (\alpha )}\right)+\text{csch}\left(L \sqrt{\text{Bo} \cos (\alpha )}\right) (\text{Bo} L R \sin (\alpha )-1)-R \sin (\alpha ) \sqrt{\text{Bo} \sec (\alpha )}\right)\right]\left(R \sqrt{\text{Bo} \sec (\alpha )}\right)^{-1}$$

Or, in inputform for your convenience:

eq1 = (Sec[α] (Coth[L Sqrt[Bo Cos[α]]] - R Sqrt[Bo Sec[α]] Sin[α] +
Csch[L Sqrt[Bo Cos[α]]] (-1 + Bo L R Sin[α])))/(R Sqrt[Bo Sec[α]])


However, if I now run the following:

Collect[eq1,Bo] //FullSimplify


I get a much more compact form, namely: $$-\tan (\alpha )+L \sin (\alpha ) \sqrt{\text{Bo} \sec (\alpha )} \text{csch}\left(L \sqrt{\text{Bo} \cos (\alpha )}\right)+\frac{\tanh \left(\frac{1}{2} L \sqrt{\text{Bo} \cos (\alpha )}\right)}{R \sqrt{\text{Bo} \cos (\alpha )}}$$

Can someone explain why I get a more compact solution when I first collect the equation for a certain parameter and then run FullSimplify and whether there is a general 'recipe' to get the most compact form of an equation?

P.S. sorry for the long equation, but it seems that most of the smaller equations do not have this behaviour which makes sort of intuitive sense

• I don't think there is a general recipe. Simplification requires a certain amount of black magic, Fingerspitzengefühl and luck. FullSimplify uses a ComplexityFunction to see if it is getting anywhere, with the general goal to get the value of that function as low as possible. Sometimes it may be necessary to increase the complexity of an expression in order to open up new paths to lower complexity. Those steps may put the achievable reduction too much beyond 'FullSimplify's horizon to see... – Sjoerd C. de Vries Jan 15 '14 at 12:16
• ...Sometimes it may be useful to provide a ComplexityFunction of your own, to 'punish' certain terms, in the hope that they may then be beaten out of your expression by FullSimplify. – Sjoerd C. de Vries Jan 15 '14 at 12:16
• Often, it helps if you indicate using Assumptions whether certain variables are real, or positive or have some relationship to each other. – Sjoerd C. de Vries Jan 15 '14 at 12:37
• @SjoerdC.deVries I did indeed specify assumptions on variables being both real and positive. Without that the original equation would have been several lines longer. The ComplexityFunction seems to be what I am looking for. – Michiel Jan 15 '14 at 17:08

There are at least two aspects to this. The first is the fact that FullSimplify will not try all possible transformations, even those it is aware of. See: Why does Simplify ignore an assumption? The second is that Mathematica does not see "compact" and "simple" as the same thing; if you give it a different ComplexityFunction it will do much better in this case. Compare:

eq1 = (Sec[α] (Coth[L Sqrt[Bo Cos[α]]] - R Sqrt[Bo Sec[α]] Sin[α] +
Csch[L Sqrt[Bo Cos[α]]] (-1 + Bo L R Sin[α])))/(R Sqrt[Bo Sec[α]])

short1 = Collect[eq1, Bo] // FullSimplify

-Tan[α] + (
Sec[α] (Bo L R Csch[L Sqrt[Bo Cos[α]]] Sin[α] +
Tanh[1/2 L Sqrt[Bo Cos[α]]]))/(R Sqrt[Bo Sec[α]])

short2 = FullSimplify[eq1, ComplexityFunction -> Composition[StringLength, ToString]]

(Csch[
L Sqrt[Bo Cos[α]]] Sec[α] (-1 + Cosh[L Sqrt[Bo Cos[α]]] +
Bo L R Sin[α]))/(R Sqrt[Bo Sec[α]]) - Tan[α]


The three expressions measured by both LeafCount and my ComplexityFunction:

LeafCount /@ {eq1, short1, short2}
Composition[StringLength, ToString] /@ {eq1, short1, short2}

{59, 51, 49}

{275, 374, 212}


Note that though short1 and short2 appear to be roughly the same length my ComplexityFunction sees short1 as being much longer. That is because it is not a very good metric, and it is using the OutputForm of the expression rendering "2D" text like this:

ToString[short1]

                                                               L Sqrt[Bo Cos[α]]
Sec[α] (Bo L R Csch[L Sqrt[Bo Cos[α]]] Sin[α] + Tanh[-----------------])
2
-Tan[α] + ------------------------------------------------------------------------
R Sqrt[Bo Sec[α]]


The point of all of this is that you need to be quite specific with ComplexityFunction if you want the expression simplified in the way you see as simple or compact.

• So if I understand correctly I can in theory give any ComplexityFunction I like?! Do you know what happens when I give a very simple ComplexityFunction e.g. the number of times a certain variable appears in the equation, and there are multiple equal solutions. Does it then use its default ComplexityFunction` to distinguish between those or is one of the options 'randomly' given as best solution? – Michiel Jan 15 '14 at 17:12
• @Michiel Sorry, I read your comment but forgot to reply. No, I don't know, but I think that's a very good question. Why don't you post that? (As a proper question.) – Mr.Wizard Jan 17 '14 at 21:35