lshifr
2/9/2014 - 3:42 PM

CommonSubexpressionEliminator.m

ClearAll[csub];
csub[expr_Hold, rules_List, limitCount_] := 
  With[{newrule = 
     Replace[If[# =!= {} && #[[-1, -1]] > 1, #[[-1, 1]], {}] &@
       SortBy[Tally[
         Cases[expr, 
          x_ /; Depth[Unevaluated[x]] > 2 && 
             LeafCount[Unevaluated[x]] > limitCount :> Hold[x], 
          Infinity]], Last], 
      Hold[x_] :> (HoldPattern[x] -> Unique[])]}, 
   csub[expr /. newrule, Append[rules, newrule], limitCount] /; 
    newrule =!= {}];
    
csub[Hold[expr_], rules_, _] :=
 Append[
   Replace[
    Thread[(rules /. (Verbatim[HoldPattern][x_] -> var_) :> 
        Hold[var :> x]), Hold], {} -> Hold[]
    ],
   Unevaluated[expr]
   ] /. Hold[defs_, exp_] :> {Hold[defs], Hold[exp]}