Sure. https://github.com/sympy/sympy/issues/27582
On Sunday, January 26, 2025 at 5:24:47 PM UTC+2 Oscar wrote: > Hi Paul, > > This is a bug. I assume that the result is mathematically correct but > it is not a good transformation of the expression. > > Can you open a GitHub issue for this and link back to this mailing > list thread (and send the link to the issue back here as well)? > > The problem is with Pow.conjugate > > In [1]: class CustomExpr(Expr): pass > > In [2]: e = sqrt(1+2*CustomExpr(x)) > > In [3]: print(e) > sqrt(1 + 2*CustomExpr(x)) > > In [4]: print(e.conjugate()) > -I*((2*re(CustomExpr(re(x) + I*im(x))) + 1)**2 + 4*im(CustomExpr(re(x) > + I*im(x)))**2)**(1/4)*sin(atan2(2*im(CustomExpr(re(x) + I*im(x))), > 2*re(CustomExpr(re(x) + I*im(x))) + 1)/2) + ((2*re(CustomExpr(re(x) + > I*im(x))) + 1)**2 + 4*im(CustomExpr(re(x) + > I*im(x)))**2)**(1/4)*cos(atan2(2*im(CustomExpr(re(x) + I*im(x))), > 2*re(CustomExpr(re(x) + I*im(x))) + 1)/2) > > This is because Pow.conjugate calls expand_complex which it should > not. Actually though the call to expand_complex is gated on the base > being not a positive number which exposes a bug here: > > In [5]: (1 + 2*CustomExpr(x)).is_positive > Out[5]: False > > That should return None rather than False so there is a bug in the > assumptions system. > > The cause of this is that is_commutative is part of the assumptions > system (which it really shouldn't be) and CustomExpr has > is_commutative = None. A workaround is to define CustomExpr like this: > > class CustomExpr(Expr): > is_commutative = True > > -- > Oscar > > On Sun, 26 Jan 2025 at 14:11, Paul Royik <[email protected]> wrote: > > > > from sympy import Expr, log, Abs, sqrt > > from sympy.abc import x, u > > > > class CustomExpr(Expr): > > pass > > > > expr = log(Abs(sqrt(1+2/x)-1)) > > > > print(expr.subs(x, u)) > > print(expr.subs(x, CustomExpr(u))) > > > > The first one prints, as expected, log(|sqrt(1 + 2/u) - 1|) > > > > But the second prints something different: > > log(sqrt(i*sin(atan2(-2*im(CustomExpr(re(u) + > i*im(u)))/(re(CustomExpr(re(u) + i*im(u)))**2 + im(CustomExpr(re(u) + > i*im(u)))**2), 1 + 2*re(CustomExpr(re(u) + i*im(u)))/(re(CustomExpr(re(u) + > i*im(u)))**2 + im(CustomExpr(re(u) + i*im(u)))**2))/2)*conjugate(((1 + > 2*re(CustomExpr(re(u) + i*im(u)))/(re(CustomExpr(re(u) + i*im(u)))**2 + > im(CustomExpr(re(u) + i*im(u)))**2))**2 + 4*im(CustomExpr(re(u) + > i*im(u)))**2/(re(CustomExpr(re(u) + i*im(u)))**2 + im(CustomExpr(re(u) + > i*im(u)))**2)**2)**(1/4)) - i*sin(atan2(-2*im(CustomExpr(re(u) + > i*im(u)))/(re(CustomExpr(re(u) + i*im(u)))**2 + im(CustomExpr(re(u) + > i*im(u)))**2), 1 + 2*re(CustomExpr(re(u) + i*im(u)))/(re(CustomExpr(re(u) + > i*im(u)))**2 + im(CustomExpr(re(u) + i*im(u)))**2))/2)*conjugate(((1 + > 2*re(CustomExpr(re(u) + i*im(u)))/(re(CustomExpr(re(u) + i*im(u)))**2 + > im(CustomExpr(re(u) + i*im(u)))**2))**2 + 4*im(CustomExpr(re(u) + > i*im(u)))**2/(re(CustomExpr(re(u) + i*im(u)))**2 + im(CustomExpr(re(u) + > i*im(u)))**2)**2)**(1/4))*sqrt(1 + 2*CustomExpr(u)**(-1)) - > cos(atan2(-2*im(CustomExpr(re(u) + i*im(u)))/(re(CustomExpr(re(u) + > i*im(u)))**2 + im(CustomExpr(re(u) + i*im(u)))**2), 1 + > 2*re(CustomExpr(re(u) + i*im(u)))/(re(CustomExpr(re(u) + i*im(u)))**2 + > im(CustomExpr(re(u) + i*im(u)))**2))/2)*conjugate(((1 + > 2*re(CustomExpr(re(u) + i*im(u)))/(re(CustomExpr(re(u) + i*im(u)))**2 + > im(CustomExpr(re(u) + i*im(u)))**2))**2 + 4*im(CustomExpr(re(u) + > i*im(u)))**2/(re(CustomExpr(re(u) + i*im(u)))**2 + im(CustomExpr(re(u) + > i*im(u)))**2)**2)**(1/4)) + cos(atan2(-2*im(CustomExpr(re(u) + > i*im(u)))/(re(CustomExpr(re(u) + i*im(u)))**2 + im(CustomExpr(re(u) + > i*im(u)))**2), 1 + 2*re(CustomExpr(re(u) + i*im(u)))/(re(CustomExpr(re(u) + > i*im(u)))**2 + im(CustomExpr(re(u) + i*im(u)))**2))/2)*conjugate(((1 + > 2*re(CustomExpr(re(u) + i*im(u)))/(re(CustomExpr(re(u) + i*im(u)))**2 + > im(CustomExpr(re(u) + i*im(u)))**2))**2 + 4*im(CustomExpr(re(u) + > i*im(u)))**2/(re(CustomExpr(re(u) + i*im(u)))**2 + im(CustomExpr(re(u) + > i*im(u)))**2)**2)**(1/4))*sqrt(1 + 2*CustomExpr(u)**(-1)) + 1 - sqrt(1 + > 2*CustomExpr(u)**(-1)))) > > > > Is this a bug or it works as expected? > > > > How to make print(expr.subs(x, CustomExpr(u))) output log(|sqrt(1 + 2/u) > - 1|)? > > > > Thank you. > > > > -- > > You received this message because you are subscribed to the Google > Groups "sympy" group. > > To unsubscribe from this group and stop receiving emails from it, send > an email to [email protected]. > > To view this discussion visit > https://groups.google.com/d/msgid/sympy/a93b9e4e-a9e5-4233-8417-c68121430c33n%40googlegroups.com > . > -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion visit https://groups.google.com/d/msgid/sympy/dadc54f8-af9a-4e97-973f-1a02578e12b3n%40googlegroups.com.
