@@ -251,7 +251,7 @@ function simplify_div(d::Div)
251251 if all (_isone, ds)
252252 return isempty (ns) ? 1 : simplify_fractions (_mul (ns))
253253 else
254- return Div (simplify_fractions (_mul (ns)), simplify_fractions (_mul (ds)), true )
254+ Div (simplify_fractions (_mul (ns)), simplify_fractions (_mul (ds)), true )
255255 end
256256end
257257
@@ -269,19 +269,24 @@ Find `Div` nodes and simplify them by cancelling a set of factors of numerators
269269and denominators. It may leave some expressions in `PolyForm` format.
270270"""
271271function simplify_fractions (x)
272- x = quick_cancel (x)
272+ x = Postwalk ( quick_cancel) (x)
273273
274- ! has_div (x) && return x
274+ ! needs_div_rules (x) && return x
275275
276276 isdiv (x) = x isa Div
277277
278- rules = [@rule ~ x:: isdiv => quick_cancel (~ x)
279- @rule ~ x:: isdiv => simplify_div (~ x)
278+ rules = [@rule ~ x:: isdiv => simplify_div (~ x)
280279 @acrule ~ a:: isdiv + ~ b:: isdiv => add_divs (~ a,~ b)]
281280
282281 Fixpoint (Postwalk (Chain (rules)))(x)
283282end
284283
284+ function needs_div_rules (x)
285+ (x isa Div && ! (x. num isa Number) && ! (x. den isa Number)) ||
286+ (istree (x) && operation (x) === (+ ) && count (has_div, unsorted_arguments (x)) > 1 ) ||
287+ (istree (x) && any (needs_div_rules, unsorted_arguments (x)))
288+ end
289+
285290function has_div (x)
286291 return x isa Div || (istree (x) && any (has_div, unsorted_arguments (x)))
287292end
0 commit comments