JuliaSymbolics / SymbolicUtils.jl

Symbolic expressions, rewriting and simplification
https://docs.sciml.ai/SymbolicUtils/stable/
Other
527 stars 100 forks source link

Problems with simplifying fractions #433

Closed augustinas1 closed 1 year ago

augustinas1 commented 2 years ago
julia> @syms a b c

julia> simplify( a / (b + c) + a / (b + c)^2 )
ERROR: AssertionError: i1 == i2
Stacktrace:
  [1] deflated_gcd(p1::DynamicPolynomials.Polynomial{true, Int64}, p2::DynamicPolynomials.Polynomial{true, Int64}, algo::MultivariatePolynomials.GeneralizedEuclideanAlgorithm)
    @ MultivariatePolynomials ~/.julia/packages/MultivariatePolynomials/JG6mC/src/gcd.jl:235
  [2] gcd(p1::DynamicPolynomials.Polynomial{true, Int64}, p2::DynamicPolynomials.Polynomial{true, Int64}, algo::MultivariatePolynomials.GeneralizedEuclideanAlgorithm)
    @ MultivariatePolynomials ~/.julia/packages/MultivariatePolynomials/JG6mC/src/gcd.jl:128
  [3] gcd
    @ ~/.julia/packages/MultivariatePolynomials/JG6mC/src/gcd.jl:112 [inlined]
  [4] _gcd(x::DynamicPolynomials.Polynomial{true, Int64}, y::DynamicPolynomials.Polynomial{true, Int64})
    @ SymbolicUtils ~/.julia/packages/SymbolicUtils/v2ZkM/src/polyform.jl:373
  [5] gcd(x::PolyForm{Number, Nothing}, y::PolyForm{Number, Nothing})
    @ SymbolicUtils ~/.julia/packages/SymbolicUtils/v2ZkM/src/polyform.jl:89
  [6] _gcd(x::PolyForm{Number, Nothing}, y::PolyForm{Number, Nothing})
    @ SymbolicUtils ~/.julia/packages/SymbolicUtils/v2ZkM/src/polyform.jl:373
  [7] rm_gcds(ns::Vector{PolyForm{Number, Nothing}}, ds::Vector{SymbolicUtils.Pow{Number, PolyForm{Number, Nothing}, Int64, Nothing}})
    @ SymbolicUtils ~/.julia/packages/SymbolicUtils/v2ZkM/src/polyform.jl:486
  [8] simplify_div(d::SymbolicUtils.Div{Number, SymbolicUtils.Add{Number, Int64, Dict{Any, Number}, Nothing}, SymbolicUtils.Pow{Number, SymbolicUtils.Add{Number, Int64, Dict{Any, Number}, Nothing}, Int64, Nothing}, Nothing})
    @ SymbolicUtils ~/.julia/packages/SymbolicUtils/v2ZkM/src/polyform.jl:266
  [9] (::SymbolicUtils.var"#sdiv#115")(a::SymbolicUtils.Div{Number, SymbolicUtils.Add{Number, Int64, Dict{Any, Number}, Nothing}, SymbolicUtils.Pow{Number, SymbolicUtils.Add{Number, Int64, Dict{Any, Number}, Nothing}, Int64, Nothing}, Nothing})
    @ SymbolicUtils ~/.julia/packages/SymbolicUtils/v2ZkM/src/polyform.jl:307
 [10] (::ComposedFunction{SymbolicUtils.var"#sdiv#115", typeof(quick_cancel)})(x::SymbolicUtils.Div{Number, SymbolicUtils.Add{Number, Int64, Dict{Any, Number}, Nothing}, SymbolicUtils.Pow{Number, SymbolicUtils.Add{Number, Int64, Dict{Any, Number}, Nothing}, Int64, Nothing}, Nothing}; kw::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Base ./operators.jl:1085
 [11] (::ComposedFunction{SymbolicUtils.var"#sdiv#115", typeof(quick_cancel)})(x::SymbolicUtils.Div{Number, SymbolicUtils.Add{Number, Int64, Dict{Any, Number}, Nothing}, SymbolicUtils.Pow{Number, SymbolicUtils.Add{Number, Int64, Dict{Any, Number}, Nothing}, Int64, Nothing}, Nothing})
    @ Base ./operators.jl:1085
 [12] (::Metatheory.Rewriters.Walk{:post, ComposedFunction{SymbolicUtils.var"#sdiv#115", typeof(quick_cancel)}, typeof(SymbolicUtils.frac_similarterm), false})(x::SymbolicUtils.Div{Number, SymbolicUtils.Add{Number, Int64, Dict{Any, Number}, Nothing}, SymbolicUtils.Pow{Number, SymbolicUtils.Add{Number, Int64, Dict{Any, Number}, Nothing}, Int64, Nothing}, Nothing})
    @ Metatheory.Rewriters ~/.julia/packages/Metatheory/XcKKW/src/Rewriters.jl:200
 [13] simplify_fractions(x::SymbolicUtils.Add{Number, Int64, Dict{Any, Number}, Nothing}; polyform::Bool)
    @ SymbolicUtils ~/.julia/packages/SymbolicUtils/v2ZkM/src/polyform.jl:309
 [14] simplify_fractions(x::SymbolicUtils.Add{Number, Int64, Dict{Any, Number}, Nothing})
    @ SymbolicUtils ~/.julia/packages/SymbolicUtils/v2ZkM/src/polyform.jl:303
 [15] simplify(x::SymbolicUtils.Add{Number, Int64, Dict{Any, Number}, Nothing}; expand::Bool, polynorm::Nothing, threaded::Bool, simplify_fractions::Bool, thread_subtree_cutoff::Int64, rewriter::Nothing)
    @ SymbolicUtils ~/.julia/packages/SymbolicUtils/v2ZkM/src/simplify.jl:43
 [16] simplify(x::SymbolicUtils.Add{Number, Int64, Dict{Any, Number}, Nothing})
    @ SymbolicUtils ~/.julia/packages/SymbolicUtils/v2ZkM/src/simplify.jl:24
 [17] top-level scope
    @ REPL[319]:1
ndinsmore commented 1 year ago

@augustinas1 & @shashi I would recommend closing this issue as it seems to be fixed in the latest version.

julia> @syms a b c
(a, b, c)

julia> simplify( a / (b + c) + a / (b + c)^2 )
(a + a*b + a*c) / ((b + c)^2)

I plan on opening a separate issue for the mis-simplification(ie. not pulling a out), as it happens in other simpler cases