Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

tsolve rewriting as exp #17521

Open
ethankward opened this issue Aug 26, 2019 · 0 comments
Open

tsolve rewriting as exp #17521

ethankward opened this issue Aug 26, 2019 · 0 comments

Comments

@ethankward
Copy link
Contributor

sympy/sympy/solvers/solvers.py

Lines 2768 to 2769 in a29cb79

rewrite = lhs.rewrite(exp)
if rewrite != lhs:

These lines can cause problems if lhs doesn't have an explicit exp rewriting method, for example:

>>> e = zeta(x**pi, 8)
>>> solve(e, x)
Traceback (most recent call last):
  File "test.py", line 46, in <module>
    print(solve(e, x))
  File "/home/eward/se/sympy/solvers/solvers.py", line 1171, in solve
    solution = _solve(f[0], *symbols, **flags)
  File "/home/eward/se/sympy/solvers/solvers.py", line 1686, in _solve
    iv = _solve(u - t, symbol, **flags)
  File "/home/eward/se/sympy/solvers/solvers.py", line 1737, in _solve
    soln = _tsolve(f_num, symbol, **flags)
  File "/home/eward/se/sympy/solvers/solvers.py", line 2770, in _tsolve
    return _solve(rewrite - rhs, sym, **flags)
  File "/home/eward/se/sympy/solvers/solvers.py", line 1686, in _solve
    iv = _solve(u - t, symbol, **flags)
...
    return _solve(rewrite - rhs, sym, **flags)
  File "/home/eward/se/sympy/solvers/solvers.py", line 1508, in _solve
    f_num, sol = solve_linear(f, symbols=symbols)
  File "/home/eward/se/sympy/solvers/solvers.py", line 2124, in solve_linear
    dnewn_dxi = newn.diff(xi)
  File "/home/eward/se/sympy/core/expr.py", line 3424, in diff
    return Derivative(self, *symbols, **assumptions)
  File "/home/eward/se/sympy/core/function.py", line 1416, in __new__
    obj = expr._eval_derivative_n_times(v, count)
  File "/home/eward/se/sympy/core/basic.py", line 1743, in _eval_derivative_n_times
    obj2 = obj._accept_eval_derivative(s)
  File "/home/eward/se/sympy/core/basic.py", line 1719, in _accept_eval_derivative
    return s._visit_eval_derivative_scalar(self)
  File "/home/eward/se/sympy/core/basic.py", line 1724, in _visit_eval_derivative_scalar
    return base._eval_derivative(self)
  File "/home/eward/se/sympy/core/cache.py", line 94, in wrapper
    retval = cfunc(*args, **kwargs)
  File "/home/eward/se/sympy/core/add.py", line 404, in _eval_derivative
    return self.func(*[a.diff(s) for a in self.args])
  File "/home/eward/se/sympy/core/add.py", line 404, in <listcomp>
    return self.func(*[a.diff(s) for a in self.args])
  File "/home/eward/se/sympy/core/expr.py", line 3424, in diff
    return Derivative(self, *symbols, **assumptions)
  File "/home/eward/se/sympy/core/function.py", line 1416, in __new__
    obj = expr._eval_derivative_n_times(v, count)
  File "/home/eward/se/sympy/core/basic.py", line 1743, in _eval_derivative_n_times
    obj2 = obj._accept_eval_derivative(s)
  File "/home/eward/se/sympy/core/basic.py", line 1719, in _accept_eval_derivative
    return s._visit_eval_derivative_scalar(self)
  File "/home/eward/se/sympy/core/basic.py", line 1724, in _visit_eval_derivative_scalar
    return base._eval_derivative(self)
  File "/home/eward/se/sympy/core/function.py", line 607, in _eval_derivative
    l.append(df * da)
  File "/home/eward/se/sympy/core/decorators.py", line 91, in __sympifyit_wrapper
    return func(a, b)
  File "/home/eward/se/sympy/core/decorators.py", line 129, in binary_op_wrapper
    return func(self, other)
  File "/home/eward/se/sympy/core/expr.py", line 196, in __mul__
    return Mul(self, other)
  File "/home/eward/se/sympy/core/cache.py", line 94, in wrapper
    retval = cfunc(*args, **kwargs)
  File "/home/eward/se/sympy/core/function.py", line 2209, in __eq__
    return self._hashable_content() == other._hashable_content()
  File "/home/eward/se/sympy/core/function.py", line 2220, in _hashable_content
    zip(self.variables, self.point) if not self.expr.has(v)]))
  File "/home/eward/se/sympy/core/function.py", line 2220, in <listcomp>
    zip(self.variables, self.point) if not self.expr.has(v)]))
  File "/home/eward/se/sympy/core/cache.py", line 94, in wrapper
    retval = cfunc(*args, **kwargs)
  File "/home/eward/se/sympy/core/expr.py", line 134, in __eq__
    if a != b:
  File "/home/eward/se/sympy/core/containers.py", line 97, in __eq__
    return super(Tuple, self).__eq__(other)
  File "/home/eward/se/sympy/core/basic.py", line 343, in __eq__
    return self._hashable_content() == other._hashable_content()
  File "/home/eward/se/sympy/core/expr.py", line 133, in __eq__
    a, b = self._hashable_content(), other._hashable_content()
  File "/home/eward/se/sympy/core/symbol.py", line 381, in _hashable_content
    return Symbol._hashable_content(self) + (self.dummy_index,)
  File "/home/eward/se/sympy/core/symbol.py", line 274, in _hashable_content
    return (self.name,) + tuple(sorted(self.assumptions0.items()))
  File "/home/eward/se/sympy/core/symbol.py", line 284, in assumptions0
    in self._assumptions.items() if value is not None)
RecursionError: maximum recursion depth exceeded

The inner power gets rewritten as exp(pi*log(x)) but when solve is called it will get changed back again. In some cases like sinc where there is a rewriting it's possible to work around this (#17520), but not for zeta.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants