diff --git a/diofant/solvers/polysys.py b/diofant/solvers/polysys.py index 704ee1a7a23..752fdafbb90 100644 --- a/diofant/solvers/polysys.py +++ b/diofant/solvers/polysys.py @@ -1,8 +1,10 @@ """Solvers of systems of polynomial equations. """ +import collections + from diofant.core import S from diofant.matrices import Matrix -from diofant.polys import Poly, groebner, roots, sring +from diofant.polys import Poly, groebner, sring from diofant.polys.polytools import parallel_poly_from_expr from diofant.polys.polyerrors import (ComputationFailed, PolificationFailed, CoercionFailed) @@ -18,6 +20,13 @@ class SolveFailed(Exception): """Raised when solver's conditions weren't met. """ +def roots(p): + r = collections.defaultdict(int) + for v in p.all_roots(): + r[v] += 1 + return r + + def solve_linear_system(system, *symbols, **flags): r"""Solve system of linear equations. @@ -189,11 +198,6 @@ def solve_generic(polys, opt): polynomial system is generated. Applying the above procedure recursively, a finite number of solutions can be found. - The ability of finding all solutions by this procedure depends - on the root finding algorithms. If no solutions were found, it - means only that roots() failed, but the system is solvable. To - overcome this difficulty use numerical algorithms instead. - References ========== diff --git a/diofant/solvers/tests/test_polysys.py b/diofant/solvers/tests/test_polysys.py index 4f609f00f99..5ce47acf538 100644 --- a/diofant/solvers/tests/test_polysys.py +++ b/diofant/solvers/tests/test_polysys.py @@ -3,7 +3,7 @@ import pytest from diofant import flatten, I, Integer, Poly, QQ, Rational, S, sqrt, symbols -from diofant.polys import PolynomialError, ComputationFailed +from diofant.polys import PolynomialError, ComputationFailed, RootOf from diofant.solvers.polysys import solve_poly_system from diofant.abc import x, y, z @@ -55,6 +55,11 @@ def test_solve_poly_system(): lambda: solve_poly_system([x**3 - y**3], x, y)) pytest.raises(PolynomialError, lambda: solve_poly_system([1/x], x)) + assert (solve_poly_system([x**6 + x - 1], x) == + [{x: RootOf(x**6 + x - 1, 0)}, {x: RootOf(x**6 + x - 1, 1)}, + {x: RootOf(x**6 + x - 1, 2)}, {x: RootOf(x**6 + x - 1, 3)}, + {x: RootOf(x**6 + x - 1, 4)}, {x: RootOf(x**6 + x - 1, 5)}]) + def test_solve_biquadratic(): x0, y0, x1, y1, r = symbols('x0 y0 x1 y1 r') diff --git a/diofant/solvers/tests/test_solvers.py b/diofant/solvers/tests/test_solvers.py index 5468eb09c0b..2d71e465945 100644 --- a/diofant/solvers/tests/test_solvers.py +++ b/diofant/solvers/tests/test_solvers.py @@ -378,7 +378,10 @@ def test_solve_transcendental(): assert solve(x**y - 1) == [{x: 1}, {y: 0}] assert solve([x**y - 1]) == [{x: 1}, {y: 0}] assert solve(x*y*(x**2 - y**2)) == [{x: 0}, {x: -y}, {x: y}, {y: 0}] - assert solve([x*y*(x**2 - y**2)]) == [{x: 0}, {x: -y}, {x: y}, {y: 0}] + assert (solve([x*y*(x**2 - y**2)], check=False) == + [{x: RootOf(x**3 - x*y**2, x, 0)}, + {x: RootOf(x**3 - x*y**2, x, 1)}, + {x: RootOf(x**3 - x*y**2, x, 2)}]) # issue sympy/sympy#4739 assert solve(exp(log(5)*x) - 2**x, x) == [0] @@ -1352,9 +1355,11 @@ def test_sympyissue_8587(): def test_high_order_multivariate(): assert len(solve(a*x**3 - x + 1, x)) == 3 assert len(solve(a*x**4 - x + 1, x)) == 4 - assert solve(a*x**5 - x + 1, x) == [] # incomplete solution allowed - pytest.raises(NotImplementedError, lambda: - solve(a*x**5 - x + 1, x, incomplete=False)) + assert solve(a*x**5 - x + 1, x) == [RootOf(a*x**5 - x + 1, x, 0), + RootOf(a*x**5 - x + 1, x, 1), + RootOf(a*x**5 - x + 1, x, 2), + RootOf(a*x**5 - x + 1, x, 3), + RootOf(a*x**5 - x + 1, x, 4)] # result checking must always consider the denominator and RootOf # must be checked, too diff --git a/diofant/tests/test_wester.py b/diofant/tests/test_wester.py index 34316c4dfe2..98e3c48af9a 100644 --- a/diofant/tests/test_wester.py +++ b/diofant/tests/test_wester.py @@ -26,7 +26,7 @@ continued_fraction_periodic as cf_p, continued_fraction_convergents as cf_c, continued_fraction_reduce as cf_r, FiniteSet, elliptic_e, elliptic_f, powsimp, hessian, wronskian, fibonacci, sign, Lambda, Piecewise, Subs, - residue, Derivative, logcombine, Symbol, Integer, Complement) + residue, Derivative, logcombine, Symbol, Integer, Complement, RootOf) from diofant.functions.combinatorial.numbers import stirling from diofant.functions.special.zeta_functions import zeta from diofant.integrals.deltafunctions import deltaintegrate @@ -1097,12 +1097,244 @@ def test_M38(): def test_M39(): x, y, z = symbols('x y z', complex=True) - assert solve([x**2*y + 3*y*z - 4, -3*x**2*z + 2*y**2 + 1, 2*y*z**2 - z**2 - 1 ]) ==\ - [{y: 1, z: 1, x: -1}, {y: 1, z: 1, x: 1}, - {y: sqrt(2)*I, z: R(1, 3) - sqrt(2)*I/3, x: -sqrt(-1 - sqrt(2)*I)}, - {y: sqrt(2)*I, z: R(1, 3) - sqrt(2)*I/3, x: sqrt(-1 - sqrt(2)*I)}, - {y: -sqrt(2)*I, z: R(1, 3) + sqrt(2)*I/3, x: -sqrt(-1 + sqrt(2)*I)}, - {y: -sqrt(2)*I, z: R(1, 3) + sqrt(2)*I/3, x: sqrt(-1 + sqrt(2)*I)}] + assert (solve((x**2*y + 3*y*z - 4, + -3*x**2*z + 2*y**2 + 1, + 2*y*z**2 - z**2 - 1), check=False, dict=True) == + [{x: -1, y: 1, z: 1}, {x: 1, y: 1, z: 1}, + {x: -sqrt(6)*sqrt((-19 + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 1) - + 2*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 1)**2 + + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 1)**5 - + 3*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 1)**4 - + 18*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 1)**6 - + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 1)**3) * + RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 1))/6, + y: -1 - 5*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 1)**2/2 - 21*RootOf(6*z**5 - 6*z**4 - + 9*z**3 - 7*z**2 - + 3*z - 1, 1)**4/2 + + 24*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - 3*z - 1, 1)**5 - + 9*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - 3*z - 1, 1)**6, + z: RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - 3*z - 1, 1)}, + {x: sqrt(6)*sqrt((-19 + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 1) - + 2*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 1)**2 + + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 1)**5 - + 3*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 1)**4 - + 18*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 1)**6 - + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 1)**3) * + RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 1))/6, + y: -1 - 5*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 1)**2/2 - 21*RootOf(6*z**5 - 6*z**4 - + 9*z**3 - 7*z**2 - + 3*z - 1, 1)**4/2 + + 24*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - 3*z - 1, 1)**5 - + 9*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - 3*z - 1, 1)**6, + z: RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - 3*z - 1, 1)}, + {x: -sqrt(6)*sqrt((-19 - 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 2)**3 - + 18*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 2)**6 - + 3*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 2)**4 + + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 2)**5 - + 2*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 2)**2 + + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 2)) * + RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 2))/6, + y: -1 - 9*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 2)**6 + 24*RootOf(6*z**5 - 6*z**4 - + 9*z**3 - 7*z**2 - + 3*z - 1, 2)**5 - + 21*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 2)**4/2 - 5*RootOf(6*z**5 - 6*z**4 - + 9*z**3 - 7*z**2 - + 3*z - 1, 2)**2/2, + z: RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - 3*z - 1, 2)}, + {x: sqrt(6)*sqrt((-19 - 48*RootOf(6*z**5 - 6*z**4 - + 9*z**3 - 7*z**2 - + 3*z - 1, 2)**3 - + 18*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 2)**6 - + 3*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 2)**4 + + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 2)**5 - + 2*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 2)**2 + + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 2)) * + RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 2))/6, + y: -1 - 9*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 2)**6 + 24*RootOf(6*z**5 - 6*z**4 - + 9*z**3 - 7*z**2 - + 3*z - 1, 2)**5 - + 21*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 2)**4/2 - 5*RootOf(6*z**5 - 6*z**4 - + 9*z**3 - 7*z**2 - + 3*z - 1, 2)**2/2, + z: RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - 3*z - 1, 2)}, + {x: -sqrt(6)*sqrt((-19 + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 3) - + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 3)**3 + + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 3)**5 - + 18*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 3)**6 - + 2*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 3)**2 - + 3*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 3)**4) * + RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 3))/6, + y: -1 + 24*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 3)**5 - + 5*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 3)**2/2 - 9*RootOf(6*z**5 - 6*z**4 - + 9*z**3 - 7*z**2 - + 3*z - 1, 3)**6 - + 21*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 3)**4/2, + z: RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - 3*z - 1, 3)}, + {x: sqrt(6)*sqrt((-19 + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 3) - + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 3)**3 + 48 * + RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 3)**5 - + 18*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 3)**6 - + 2*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 3)**2 - + 3*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 3)**4) * + RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 3))/6, + y: -1 + 24*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 3)**5 - 5*RootOf(6*z**5 - 6*z**4 - + 9*z**3 - 7*z**2 - + 3*z - 1, 3)**2/2 - + 9*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 3)**6 - 21*RootOf(6*z**5 - 6*z**4 - + 9*z**3 - 7*z**2 - + 3*z - 1, 3)**4/2, + z: RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - 3*z - 1, 3)}, + {x: -sqrt(6)*sqrt((-19 - 3*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 4)**4 - + 2*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 4)**2 - + 18*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 4)**6 + + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 4)**5 - + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 4)**3 + + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 4)) * + RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 4))/6, + y: -1 - 21*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 4)**4/2 - 9*RootOf(6*z**5 - 6*z**4 - + 9*z**3 - 7*z**2 - + 3*z - 1, 4)**6 - + 5*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 4)**2/2 + 24*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 4)**5, + z: RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - 3*z - 1, 4)}, + {x: sqrt(6)*sqrt((-19 - 3*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 4)**4 - + 2*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 4)**2 - + 18*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 4)**6 + + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 4)**5 - + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 4)**3 + + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 4)) * + RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 4))/6, + y: -1 - 21*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 4)**4/2 - 9*RootOf(6*z**5 - 6*z**4 - + 9*z**3 - 7*z**2 - + 3*z - 1, 4)**6 - + 5*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 4)**2/2 + 24*RootOf(6*z**5 - 6*z**4 - + 9*z**3 - 7*z**2 - + 3*z - 1, 4)**5, + z: RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - 3*z - 1, 4)}, + {x: -sqrt(6)*sqrt(-18*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 0)**6 - + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 0)**3 - + 3*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 0)**4 - 19 - + 2*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 0)**2 + + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 0) + + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 0)**5) * + sqrt(RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 0))/6, + y: -9*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 0)**6 - 21*RootOf(6*z**5 - 6*z**4 - + 9*z**3 - 7*z**2 - + 3*z - 1, 0)**4/2 - + 5*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 0)**2/2 - 1 + 24*RootOf(6*z**5 - 6*z**4 - + 9*z**3 - 7*z**2 - + 3*z - 1, 0)**5, + z: RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - 3*z - 1, 0)}, + {x: sqrt(6)*sqrt(-18*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 0)**6 - + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 0)**3 - + 3*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 0)**4 - 19 - + 2*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 0)**2 + + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 0) + + 48*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 0)**5) * + sqrt(RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 0))/6, + y: -9*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 0)**6 - 21*RootOf(6*z**5 - 6*z**4 - + 9*z**3 - 7*z**2 - + 3*z - 1, 0)**4/2 - + 5*RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - + 3*z - 1, 0)**2/2 - 1 + + 24*RootOf(6*z**5 - 6*z**4 - 9*z**3 - + 7*z**2 - 3*z - 1, 0)**5, + z: RootOf(6*z**5 - 6*z**4 - 9*z**3 - 7*z**2 - 3*z - 1, 0)}, + {x: -sqrt(-1 - sqrt(2)*I), y: sqrt(2)*I, + z: Rational(1, 3) - sqrt(2)*I/3}, + {x: sqrt(-1 - sqrt(2)*I), y: sqrt(2)*I, + z: Rational(1, 3) - sqrt(2)*I/3}, + {x: -sqrt(-1 + sqrt(2)*I), y: -sqrt(2)*I, + z: Rational(1, 3) + sqrt(2)*I/3}, + {x: sqrt(-1 + sqrt(2)*I), y: -sqrt(2)*I, + z: Rational(1, 3) + sqrt(2)*I/3}]) # N. Inequalities diff --git a/docs/release/notes-0.9.rst b/docs/release/notes-0.9.rst index 8eac4562498..8b6d19c4442 100644 --- a/docs/release/notes-0.9.rst +++ b/docs/release/notes-0.9.rst @@ -7,6 +7,8 @@ Not Released Yet New features ============ +* Polynomial solvers now express all available solutions with :class:`~diofant.polys.rootoftools.RootOf`, see `#400 `_. Only zero-dimentional systems are supported, however. + Major changes ============= @@ -31,6 +33,7 @@ Minor changes ============= * New integration heuristics for integrals with :class:`~diofant.functions.elementary.complexes.Abs`, see `#321 `_. +* Support unevaluated :class:`~diofant.polys.rootoftools.RootOf`, see `#400 `_. Developer changes ================= @@ -56,8 +59,9 @@ Issues closed * `sympy/sympy#11538 `_ Bug in solve maybe * `sympy/sympy#12081 `_ integrate(x**(-S(3)/2)*exp(-x), (x, 0, oo)) encounters Runtime Error * `sympy/sympy#7214 `_ Move old assumptions from Basic to Expr +* `sympy/sympy#4678 `_ Have solve() return RootOf when it can't solve equations -.. last pr: #311 +.. last pr: #400 See also full `list of closed issues `_