For a simple case like assuming that b > -1 you can use a change of variables:

bp1 = Symbol('(b+1)', positive=True)
expr = expr.subs(b, bp1-1)

--
Oscar

On Sat, 27 Jul 2024 at 17:08, Pierre H <pierre.etienne.haes...@gmail.com> wrote:
>
> Actually, thinking a bit more, I can get away with the assumption that x is 
> an integer (in practice numerically it can be any positive real, but that 
> won't matter for the formula's analysis I'm trying to do).
>
> Le samedi 27 juillet 2024 à 18:00:16 UTC+2, Pierre H a écrit :
>>
>> Thanks a lot for your replies. I suspected it was about domain assumptions, 
>> but thanks to Oscar's example of the square root of -1 having two values 
>> it's got clear to me.
>>
>> Now, I can rise the bar to the next question: the example I gave was a 
>> minimal one, but the way I stumbled upon was slightly more elaborate:
>>
>> Let b=symbol('b') and a = 1+b,
>> so that
>> a**x * (1/a)**x
>> is in fact
>> (1+b) * (1/(1+b))**x
>>
>> This means Peter's suggestion (assume a,x positive), which applies to my 
>> case, cannot be applied for a. Indeed, I just reread the "old assumption 
>> mechanism" doc https://docs.sympy.org/latest/guides/assumptions.html and it 
>> seems that the assumption I need (b>-1) cannot be implemented. Indeed the 
>> doc says "At the time of writing (SymPy 1.7)", but I guess it's still valid 
>> in 2024, correct?
>>
>> Pierre
>>
>>
>>
>>
>> Le samedi 27 juillet 2024 à 16:12:34 UTC+2, Oscar a écrit :
>>>
>>> It is a classic question about SymPy. By default SymPy assumes that
>>> all symbols represent arbitrary complex numbers. For the most part
>>> only simplifications that are compatible with any complex numbers will
>>> be applied either automatically or by explicit simplification
>>> functions such as powsimp, simplify etc. I say "for the most part"
>>> because some evaluation/simplification routines ignore degenerate
>>> cases like x/x -> 1 even though x could be zero.
>>>
>>> In this case the question is whether (1/a)^x = 1/(a^x). Suppose that a
>>> = -1 and x = 1/2 then we have:
>>>
>>> (1/(-1))^(1/2) = (-1)^(1/2) = i
>>>
>>> On the other hand
>>>
>>> 1/(-1)^(1/2) = 1/i = -i
>>>
>>> So for a = -1 and x = 1/2 we have (1/a)^x = -1/(a^x).
>>>
>>> Recognising that 1/a = a^-1 the more general question is when will
>>> (a^x)^y be equal to a^(x*y). If all symbols are positive or if y is an
>>> integer then this holds but more generally it does not necessarily
>>> hold. From first principles SymPy defines x^y as being exp(log(x)*y)
>>> where log should be understood as having a branch cut on the negative
>>> reals so that log(x) = log(abs(x)) + I*arg(x) and arg(x) is in
>>> (-pi,pi]. This branch cut determines when identities like (1/a)^x =
>>> 1/a^x will hold.
>>>
>>> --
>>> Oscar
>>>
>>> On Sat, 27 Jul 2024 at 13:49, <peter.st...@gmail.com> wrote:
>>> >
>>> > If you declare a to be positive, it simplifies with me.
>>> >
>>> >
>>> >
>>> > From: sy...@googlegroups.com <sy...@googlegroups.com> On Behalf Of Pierre 
>>> > H
>>> > Sent: Saturday, July 27, 2024 2:38 PM
>>> > To: sympy <sy...@googlegroups.com>
>>> > Subject: [sympy] Simplification of a^x * (1/a)^x: not equal to 1?
>>> >
>>> >
>>> >
>>> > Hello,
>>> >
>>> >
>>> >
>>> > This is perhaps a classical question, but since I'm only using SymPy 
>>> > every now and then...
>>> >
>>> >
>>> >
>>> > I wonder why the expression a^x * (1/a)^x doesn't simplify to 1. See code 
>>> > (with SymPy 1.12)
>>> >
>>> >
>>> >
>>> > a,x = symbols('a x')
>>> > simplify(a**x * (1/a)**x)
>>> >
>>> >
>>> >
>>> > (then of course the variant a**x * (1/(a**x)) does simplify to 1).
>>> >
>>> >
>>> >
>>> > So is a SymPy issue that the power of x isn't propagated inside the 1/(a) 
>>> > expression. Or I'm just missing a mathematical subtlety which requires 
>>> > adding some assertions about x and a?
>>> >
>>> >
>>> >
>>> > Pierre
>>> >
>>> >
>>> >
>>> > --
>>> > 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 sympy+un...@googlegroups.com.
>>> > To view this discussion on the web visit 
>>> > https://groups.google.com/d/msgid/sympy/1b37bc0c-aa69-4e89-99d0-fb5700920dccn%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 sympy+un...@googlegroups.com.
>>> > To view this discussion on the web visit 
>>> > https://groups.google.com/d/msgid/sympy/003401dae023%246da70330%2448f50990%24%40gmail.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 sympy+unsubscr...@googlegroups.com.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/sympy/4c72538d-b230-491c-8f61-c3bced87b44en%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 sympy+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/CAHVvXxRq0VSpKsp3jZJpHx0fLTLs3t9ykWx_wwhjz%2B5L%2BrfREQ%40mail.gmail.com.

Reply via email to