@@ -257,12 +257,10 @@ function simplify_div(d::Div)
257257 end
258258end
259259
260- function add_divs (x, y)
261- x_num, x_den = polyform_factors (x, get_pvar2sym (), get_sym2term ())
262- y_num, y_den = polyform_factors (y, get_pvar2sym (), get_sym2term ())
263-
264- (_mul (x_num, y_den) + _mul (x_den, y_num)) / (_mul (x_den, y_den))
265- end
260+ add_divs (x:: Div , y:: Div ) = (x. num * y. den + y. num * x. den) / (x. den * y. den)
261+ add_divs (x:: Div , y) = (x. num + y * x. den) / x. den
262+ add_divs (x, y:: Div ) = (x * y. den + y. num) / y. den
263+ add_divs (x, y) = x + y
266264
267265"""
268266 simplify_fractions(x)
@@ -275,14 +273,22 @@ function simplify_fractions(x)
275273
276274 ! needs_div_rules (x) && return x
277275
278- isdiv (x) = x isa Div
279-
280- rules = [@rule ~ x:: isdiv => simplify_div (~ x)
281- @acrule ~ a:: isdiv + ~ b:: isdiv => add_divs (~ a,~ b)]
276+ sdiv (a) = a isa Div ? simplify_div (a) : a
282277
283- Fixpoint ( Postwalk (RestartedChain (rules)))(x )
278+ Postwalk (sdiv ∘ quick_cancel)( Postwalk (add_with_div)(x) )
284279end
285280
281+ function add_with_div (x, flatten= true )
282+ (! istree (x) || operation (x) != (+ )) && return x
283+ aa = unsorted_arguments (x)
284+ ! any (a-> a isa Div, aa) && return x # no rewrite necessary
285+
286+ divs = filter (a-> a isa Div, aa)
287+ nondivs = filter (a-> ! (a isa Div), aa)
288+ nds = isempty (nondivs) ? 0 : + (nondivs... )
289+ d = reduce (quick_cancel∘ add_divs, divs)
290+ flatten ? quick_cancel (add_divs (d, nds)) : d + nds
291+ end
286292"""
287293 flatten_fractions(x)
288294
@@ -294,17 +300,15 @@ julia> flatten_fractions((1+(1+1/a)/a)/a)
294300```
295301"""
296302function flatten_fractions (x)
297- rules = [@acrule ~ a:: (x->x isa Div) + ~ b => add_divs (~ a,~ b)
298- @rule * (~~ x, ~ a / ~ b, ~~ y) / ~ c => * ((~~ x). .. , ~ a, (~~ y). .. ) / (~ b * ~ c)
299- @rule ~ c / * (~~ x, ~ a / ~ b, ~~ y) => (~ b * ~ c) / * ((~~ x). .. , ~ a, (~~ y). .. )]
300- Fixpoint (Postwalk (Chain (rules)))(x)
303+ Fixpoint (Postwalk (add_with_div))(x)
301304end
302305
303306function fraction_iszero (x)
304307 ! istree (x) && return _iszero (x)
308+ ff = flatten_fractions (x)
305309 # fast path and then slow path
306- any (_iszero, numerators (flatten_fractions (x) )) ||
307- any (_iszero∘ expand, numerators (flatten_fractions (x) ))
310+ any (_iszero, numerators (ff )) ||
311+ any (_iszero∘ expand, numerators (ff ))
308312end
309313
310314function fraction_isone (x)
0 commit comments