Locating common subexpressions

*To*: mathgroup at smc.vnet.net*Subject*: [mg69429] Locating common subexpressions*From*: carlos at colorado.edu*Date*: Tue, 12 Sep 2006 06:52:51 -0400 (EDT)

The strangest thing about the behvior of Simplify in my previous post can be seen at a glance: R = (3 + 3*a^2 + Sqrt[5 + 6*a + 5*a^2] + a*(4 + Sqrt[5 + 6*a + 5*a^2]))/6 R = Simplify[R,a>=0] (3 + 3*a^2 + Sqrt[5 + 6*a + 5*a^2] + a*(4 + Sqrt[5 + 6*a + 5*a^2]))/6 The subexpression Sqrt[5 + 6*a + 5*a^2] is not located. Ideally Simplify should right away replace that by a temp, say t$, and get to work on (3 + 3*a^2 + t$ + a*(4 + t$))/6 where from the assumptions, t$>0 and real. Of course the leaf count of t$ should influence subsequent transformations. This initial pass is useful in complicated expressions that come, eg, from an equation solver since messy subexpressions like the discriminant may appear in several places. I had some of those with leaf counts in the tens of thousands. Locating common subs is of course an key task of optimizing compilers. Simplification and compilation share some objectives, although compilers have to deal with timing and side effects. In fact I wouldnt mind at all if Simplify would return a compound expression: Block [{t$}, t$=Sqrt[5 + 6*a + 5*a^2]; (3 + 4*a + 3*a^2 + (1 + a)*t$)/6 ] since this is perfect for documentation, or conversion to low-level code.

**Follow-Ups**:**Re: Locating common subexpressions***From:*Daniel Lichtblau <danl@wolfram.com>