Expr Div(Expr num, Expr den) { if(Equals(num, Expr.Zero)) return Expr.Zero; if(Equals(den, Expr.One)) return num; var numDiv = num.ExprOrDivToDiv(); var denDiv = den.ExprOrDivToDiv(); var numWithCoeff = Mult(MakeExprList(numDiv.Num, denDiv.Den)).ExprOrMultToKoeffMultInfo(builder); var denWithCoeff = Mult(MakeExprList(numDiv.Den, denDiv.Num)).ExprOrMultToKoeffMultInfo(builder); var gcd = Gcd(numWithCoeff.Mult, denWithCoeff.Mult); var finalNum = Mult(Const(numWithCoeff.Koeff / denWithCoeff.Koeff).Yield().Concat(Divide(numWithCoeff.Mult, gcd)).ToExprList()); var finalDen = Mult(Divide(denWithCoeff.Mult, gcd)); if(Equals(finalDen, Expr.One)) return finalNum; return builder.Divide(finalNum, finalDen); }