Repository: sympy/sympy

Issue:
Solving an equation containing absolute value, with python 3
I'm trying to solve the following equation, with python 3.6.3 on Windows 7:

||x² - 1| - x| = x

I did

    from sympy import *
    x = Symbol('x', real=True)
    solve(abs((abs(x**2-1)-x))-x)

but I get the following error:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Python36-32\lib\site-packages\sympy\solvers\solvers.py", line 1065, in solve
    solution = _solve(f[0], *symbols, **flags)
      File "C:\Python36-32\lib\site-packages\sympy\solvers\solvers.py", line 1366, in _solve
    candidates = _solve(piecewise_fold(expr), symbol, **flags)
      File "C:\Python36-32\lib\site-packages\sympy\solvers\solvers.py", line 1634, in _solve
    raise NotImplementedError('\n'.join([msg, not_impl_msg % f]))
    NotImplementedError: multiple generators [x, Abs(-x**2 + x + 1)]
    No algorithms are implemented to solve equation -x + Abs(-x**2 + x + 1)

I updated SymPy to the latest version, 1.4, but I get the same error.

But, with python 2.7.14 I get answers, namely [1, -1+sqrt(2), 1+sqrt(2)].
Am I missing something with Python 3?

Many thanks in advance,

-- 
Cesar


Discussion:

Patch:
diff --git a/sympy/solvers/solvers.py b/sympy/solvers/solvers.py
index f5a9d80009..9eb462670e 100644
--- a/sympy/solvers/solvers.py
+++ b/sympy/solvers/solvers.py
@@ -1018,10 +1018,13 @@ def _sympified_list(w):
 
     for i, fi in enumerate(f):
         # Abs
-        fi = fi.replace(Abs, lambda arg:
-            separatevars(Abs(arg)) if arg.has(*symbols) else Abs(arg))
-        fi = fi.replace(Abs, lambda arg:
-            Abs(arg).rewrite(Piecewise) if arg.has(*symbols) else Abs(arg))
+        while True:
+            was = fi
+            fi = fi.replace(Abs, lambda arg:
+                separatevars(Abs(arg)).rewrite(Piecewise) if arg.has(*symbols)
+                else Abs(arg))
+            if was == fi:
+                break
 
         for e in fi.find(Abs):
             if e.has(*symbols):


Test patch:
diff --git a/sympy/solvers/tests/test_solvers.py b/sympy/solvers/tests/test_solvers.py
index 0b98a39428..4afe8c8363 100644
--- a/sympy/solvers/tests/test_solvers.py
+++ b/sympy/solvers/tests/test_solvers.py
@@ -2113,3 +2113,8 @@ def test_issue_17452():
     assert solve((7**x)**x + pi, x) == [-sqrt(log(pi) + I*pi)/sqrt(log(7)),
                                         sqrt(log(pi) + I*pi)/sqrt(log(7))]
     assert solve(x**(x/11) + pi/11, x) == [exp(LambertW(-11*log(11) + 11*log(pi) + 11*I*pi))]
+
+
+def test_issue_17650():
+    x = Symbol('x', real=True)
+    assert solve(abs((abs(x**2 - 1) - x)) - x) == [1, -1 + sqrt(2), 1 + sqrt(2)]