MathGroup Archive 2010

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Re: Why can't Mathematica tell when something is algebraically

  • To: mathgroup at smc.vnet.net
  • Subject: [mg108197] Re: [mg108127] Re: Why can't Mathematica tell when something is algebraically
  • From: Adam Strzebonski <adams at wolfram.com>
  • Date: Wed, 10 Mar 2010 01:46:11 -0500 (EST)
  • References: <hn2ltj$3kt$1@smc.vnet.net> <201003091119.GAA06777@smc.vnet.net> <AF2BE895-2E51-4F9C-9410-8CB5CB418899@mimuw.edu.pl> <0F45FC76-FF73-4401-B3E6-011F8C6AFCDA@mimuw.edu.pl> <C8DFDEB1-423F-44F6-BB5B-991298281E8F@akikoz.net>
  • Reply-to: adams at wolfram.com

Getting a complete description of the solution set of an equation
that contains complex-valued radicals requires taking into account
branch cuts of radicals. We need to introduce a new complex variable
for each radical and add inequalities on real and imaginary parts
of the variables. Hence a univariate equation in one real variable

r^2 Sqrt[(r^3 + r + 2)/r] - Sqrt[r^3 (r^3 + r + 2)] == 0 &&
    Element[r, Reals]

gets transformed into a quantifier elimination problem with
five real variables

Exists[{s1, s2},
s1^2 == (r^3 + r + 2)/r &&
s2^2 == r^3 (r^3 + r + 2) &&
(Re[s1]>0 || Re[s1]==0 && Im[s1]>=0) &&
(Re[s2]>0 || Re[s2]==0 && Im[s1]>=0) &&
r^2 s1 - s2 == 0 &&
Element[r, Reals]]

Since the cylindrical algebraic decomposition algorithm used
to solve such problems is doubly exponential in the number of
variables, the system generated this way is likely to take forever
to solve. However, this particular system is solved rather quickly,
so it turns out this method is not as hopeless as I would imagine.
Reduce will use it automatically in the next version of Mathematica.

In[1]:= Reduce[r^2 Sqrt[(r^3 + r + 2)/r] - Sqrt[r^3 (r^3 + r + 2)] == 0 &&
    Element[r, Reals], r]

Out[1]= r < 0 || r > 0

Best Regards,

Adam Strzebonski
Wolfram Research

Andrzej Kozlowski wrote:
> Actually, I have confirmed myself that PowerExpand with Assuming does this correctly. The general result is:
> 
>  PowerExpand[
>  r^2*Sqrt[(r^3 + r + 2)/r] - Sqrt[r^3*(r^3 + r + 2)], 
>    Assumptions -> True]
> 
> r^(3/2)*Sqrt[r^3 + r + 2]*
>      E^(I*Pi*Floor[Arg[r]/(2*Pi) - Arg[r^3 + r + 2]/
>                 (2*Pi) + 1/2]) - r^(3/2)*Sqrt[r^3 + r + 2]*
>      E^(I*Pi*Floor[-((3*Arg[r])/(2*Pi)) - 
>               Arg[r^3 + r + 2]/(2*Pi) + 1/2])
> 
> and inspecting it, it is not surprising that
> 
> In[42]:= PowerExpand[
>  r^2*Sqrt[(r^3 + r + 2)/r] - Sqrt[r^3*(r^3 + r + 2)], 
>    Assumptions -> Arg[r] == 0]
> 
>  0
> 
> PowerExpand[
>  r^2*Sqrt[(r^3 + r + 2)/r] - Sqrt[r^3*(r^3 + r + 2)], 
>    Assumptions -> Arg[r] == Pi]
> 
> 0
> 
> This also works:
> 
> Simplify[
>  PowerExpand[r^2*Sqrt[(r^3 + r + 2)/r] - Sqrt[r^3*(r^3 + r + 2)], 
>     Assumptions -> Element[r, Reals]], Element[r, Reals]]
> 0
> 
> I think I was too hasty to state that the failure of Simplify to get the right answer with the assumption r<0 is a bug. Clearly Simplify and FullSimplify to not use PowerExpand (with Assumptions). Judging by the complicated expression returned by PowerExpand above, this is probably justified on the grounds of performance. On the other hand, it seems to me that Reduce ought to be able to do better in the example below.
> 
> Andrzej Kozlowski 
> 
> 
> On 9 Mar 2010, at 20:31, Andrzej Kozlowski wrote:
> 
>> In fact, I was wrong, and I forgot of something I once new (or assumed that it had been "fixed"). Assuming has no effect on PowerExpand and the answer returned is completely misleading.  For example:
>>
>> Assuming[Im[r] != 0, 
>> PowerExpand[r^2 Sqrt[(r^3 + r + 2)/r] - Sqrt[r^3 (r^3 + r + 2)]]]
>> 0
>>
>> which is of course wrong.
>>
>> PowerExpand only works with Assumptions passed view the Assumptions -> ... method and then the answer is very complicated:
>>
>> PowerExpand[
>> r^2*Sqrt[(r^3 + r + 2)/r] - Sqrt[r^3*(r^3 + r + 2)], 
>>   Assumptions -> Element[r, Reals]]
>>
>> r^(3/2)*Sqrt[r^3 + r + 2]*
>>     E^(I*Pi*Floor[Arg[r]/(2*Pi) - Arg[r^3 + r + 2]/
>>                (2*Pi) + 1/2]) - r^(3/2)*Sqrt[r^3 + r + 2]*
>>     E^(I*Pi*Floor[-((3*Arg[r])/(2*Pi)) - 
>>              Arg[r^3 + r + 2]/(2*Pi) + 1/2])
>>
>> But, what is rather strange, this works:
>>
>> PowerExpand[r^2 Sqrt[(r^3 + r + 2)/r] - Sqrt[r^3 (r^3 + r + 2)], 
>> Assumptions -> r <= 0]
>>
>> even though it does not work with Simplify and Reduce
>>
>> Reduce[r^2 Sqrt[(r^3 + r + 2)/r] - Sqrt[r^3 (r^3 + r + 2)] == 0 && 
>>  r < 0, r]
>> Reduce::cpow: Reduce was unable to prove that a radical of an expression containing only real variables and parameters is real valued. If you are interested only in solutions for which all radicals contained in the input are real valued, use Reduce with domain argument Reals. >>
>>
>> The question is then, does PowerExpand really do that correctly? It would be reassuring if someone from WRI would confirm it. (Getting the right answer with PowerExpand itself is not very reassuring...).
>>
>> I remember a while ago there was already a discussion here concerning the fact that PowerExpand is probably the only function that admits Assumptions only in the form Assumptions ->  and not via Assuming. I though that was going to be changed but it remains as it used to be. If changing this behaviour is really impossible I think there ought to be some sort of warning message that appears when one attempts to use
>> Assuming[something,PowerExpand[expr]], for obvious reasons.
>>
>> Andrzej Kozlowski
>>
>>
>> On 9 Mar 2010, at 14:22, Andrzej Kozlowski wrote:
>>
>>> It seems better to use:
>>>
>>> Assuming[Element[r, Reals], 
>>> PowerExpand[r^2 Sqrt[(r^3 + r + 2)/r] - Sqrt[r^3 (r^3 + r + 2)]]]
>>>
>>> 0
>>>
>>> PowerExpand with Assumptions ought to be as reliable as Simplify (which does not work in this case), whereas if you use it without assumptions it can return answers that will be false for some values of the variables (it makes use of the maximal assumptions that permit the expansion). The fact that Simplify works here with the assumption r>=0 but not r<0 appears to be a bug. 
>>>
>>> Andrzej Kozlowski
>>>
>>>
>>>
>>>
>>> On 9 Mar 2010, at 12:19, dh wrote:
>>>
>>>> Hi,
>>>> Sqrt is a multivalued function. Therefore, your expression is not 
>>>> necessarily zero. If you are sure that all your variables are real and 
>>>> that you only want the main branch of Power, then you can use PowerExpand:
>>>> r^2 Sqrt[(r^3 + r + 2)/r] - Sqrt[r^3 (r^3 + r + 2)] // PowerExpand
>>>> Daniel
>>>>
>>>> On 08.03.2010 12:09, mmdanziger wrote:
>>>>> This isn't the first time that I've encountered something like this in
>>>>> Mathematica but in my calculations I got a term like this:
>>>>>
>>>>> r^2 Sqrt[(r^3 + r + 2)/r] - Sqrt[r^3 (r^3 + r + 2)]
>>>>>
>>>>> Which is obviously identically zero.  For some reason Simplify or even
>>>>> FullSimplify can't figure this out.  Once you get dependent on
>>>>> Mathematica these things are pretty disturbing...you forget about your
>>>>> own knowledge because the program tells you that things are
>>>>> different.  Then you sit there like an idiot checking an algebraic
>>>>> identity that any beginning precalc student should be able to solve no
>>>>> problem.
>>>>>
>>>>> Is there any way to get Mathematica to "wake up" to these things?  It
>>>>> has such a powerful algebraic engine for most things, why can't it see
>>>>> something simple like the above?  Do you really have to manually
>>>>> override and tell the program when things should be zero?
>>>>>
>>>>> For the time being I'll just sift through and test things by hand but
>>>>> I can't believe that there isn't a better way.
>>>>>
>>>>> Best,
>>>>> md
>>>>>
>>>>
>>>> -- 
>>>>
>>>> Daniel Huber
>>>> Metrohm Ltd.
>>>> Oberdorfstr. 68
>>>> CH-9100 Herisau
>>>> Tel. +41 71 353 8585, Fax +41 71 353 8907
>>>> E-Mail:<mailto:dh at metrohm.com>
>>>> Internet:<http://www.metrohm.com>
>>>>
>>>>
> 



  • Prev by Date: Re: Re: Why can't Mathematica tell when something is algebraically zero?
  • Next by Date: Re: Why can't Mathematica tell when something is algebraically
  • Previous by thread: Re: Re: Why can't Mathematica tell when something is algebraically zero?
  • Next by thread: Re: Why can't Mathematica tell when something is algebraically zero?