       Re: Zero testing

• To: mathgroup at smc.vnet.net
• Subject: [mg53135] Re: [mg53106] Zero testing
• From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
• Date: Fri, 24 Dec 2004 05:59:43 -0500 (EST)
• References: <200412231259.HAA21206@smc.vnet.net> <42577F00-556A-11D9-8E89-000A95B4967A@mimuw.edu.pl>
• Sender: owner-wri-mathgroup at wolfram.com

```A correction. The failure of

FullSimplify[ComplexExpand[Unevaluated[
((1 + I*(-167594143/78256779 + Pi))^4)^(1/2)]]]

-(((167594143 + 78256779*I) - 78256779*Pi)^2/
6124123459454841)

to give the right answer was due to my thoughtless placing of
Unevaluated. With correct placing we get the right answer:

FullSimplify[ComplexExpand[
((1 + I*Unevaluated[-167594143/78256779 + Pi])^4)^
(1/2)]]

((167594143 + 78256779*I) - 78256779*Pi)^2/
6124123459454841

Andrzej

On 24 Dec 2004, at 14:11, Andrzej Kozlowski wrote:

>
> On 23 Dec 2004, at 21:59, Maxim wrote:
>
>> By 'zero testing' I mean the problem of deciding whether a given
>> numerical
>> quantity is exactly equal to zero. Often Mathematica doesn't make
>> necessary checks at all:
>>
>> In:=
>> a = Pi/4; b = I*Log[-(-1)^(3/4)];
>> Limit[(a - b)/x, x -> 0]
>> Integrate[1/((x - a)*(x - b)), x]
>> Integrate[1/(x - b), {x, 0, 1}]
>>
>> Out=
>> DirectedInfinity[Pi - (4*I)*Log[-(-1)^(3/4)]]
>>
>> Out=
>> (-4*((-2*I)*ArcTan[Log[-(-1)^(3/4)]/x] - 2*Log[Pi - 4*x] + Log[16*(x^2
>> + Log[-(-1)^(3/4)]^2)]))/(2*Pi - (8*I)*Log[-(-1)^(3/4)])
>>
>> Out=
>> ((-I)*Pi - (2*I)*ArcTan[Log[-(-1)^(3/4)]] - Log[Log[-(-1)^(3/4)]^2]
>> + Log[1 + Log[-(-1)^(3/4)]^2])/2
>>
>> The constants a and b are equal to each other. We can see that Out
>> is
>> incorrect because it is equal to ComplexInfinity and the limit of 0/x
>> is
>> 0; Out is also equal to ComplexInfinity (the denominator is zero)
>> and
>> therefore wrong as well; finally, Out is incorrect because the
>> integral
>> doesn't converge.
>
> This problem amounts to the difference between Simplify and
> FullSimplify. FullSimplify is needed to determine that a and b are
> equal, just Simplify cannot achieve this:
>
> In:=
> a = Pi/4; b = I*Log[-(-1)^(3/4)];
>
> In:=
> Simplify[a - b]
>
> Out=
> (1/4)*(Pi - 4*I*Log[-(-1)^(3/4)])
>
> In:=
> FullSimplify[a - b]
>
> Out=
> 0
>
> Functions like integrate use Simplify automatically but not
> FullSimplify. Why not? The answer you provided yourself (well, almost)
> in an earlier posting: FullSimplify generally takes far too long to be
> used automatically. Even using Simplify leads to problems, as you have
> noted. Are you then arguing that FullSimplify ought to be used
> automatically? I know it ould b enice if one were able to eat the cake
> and still have it ...
>
> If you apply FullSimplify to the argument in the above examples you
> will get the answer you stated as correct. In all cases, that is,
> except in one when it is you and not Mathematica that blundered. The
> case in question is:
>
>
>> Integrate[1/((x - a)*(x - b)), x]
>
>
> Are you seriously claiming that
>
> Integrate[1/((x - Pi/4)^2), x]
>
> is ComplexInfinity? At least Mathematica knows better than that:
>
>
> Integrate[FullSimplify[1/((x - a)*(x - b))], x]
>
> 4/(Pi - 4*x)
>
>>
>> A variation of the same problem is when we're numerically evaluating a
>> discontinuous function for an argument close to a discontinuity
>> point. In
>> those cases Mathematica does perform necessary checks but handles more
>> complicated cases incorrectly, especially when the branch cuts are
>> concerned:
>>
>> In:=
>> Sign[Im[Sqrt[-1 - 10^-18*I]]]
>>
>> Out=
>> 1
>
>
> The problem here is that Mathematica has great difficulty in
> determining Im[Sqrt[-1 - 10^-18*I] is -1. Algebraically. You ned ot
> use
>
>
> Sign[FullSimplify[ComplexExpand[Im[Sqrt[-1-10^-18*I]]]]]
>
> -1
>
>
> This I agree to be a problem that ought to be fixed. It seems to me
> that numerical methods should be used since:
>
>
> Sign[N[Im[Sqrt[-1-10^-18*I]]]]
>
> -1
>
> works easily and reliably. On the other hand it could be argued that
> this sort of thing should be approached numerically anyway.
>>
>> In:=
>> ((1 + I*(-167594143/78256779 + Pi))^4)^(1/2)
>>
>> Out=
>> (1 + I*(-167594143/78256779 + Pi))^2
>>
>> In fact In is equal to -1 and In is equal to -(1
>> + I*(-167594143/78256779 + Pi))^2. In the last case we do not even
>> apply
>> any functions, the error is in the automatic simplifications.
>> Sometimes
>> setting a high value for \$MinPrecision helps, but here it doesn't
>> have any
>> effect either.
>>
>
> This one is indeed a problem. Even this
>
> FullSimplify[ComplexExpand[
>     (1 + I*(-167594143/
>          78256779 + Pi))^4]]^
>   (1/2)
>
>
> -(((167594143 + 78256779*I) -
>      78256779*Pi)^2/
>    6124123459454841)
>
> gives the wrong answer ( the sign is wrong). To get the right one you
> need to use high precision arithmetic and Unevaluated:
>
>
> N[Unevaluated[
>    ((1 + I*(-167594143/
>          78256779 + Pi))^4)^
>     (1/2)], 20]
>
>
> 1.5635873239815087691232`4.043\
> 607143112669*^-16 -
>   2.00000000000000015635873239\
> 81508708003`20.15051499783199*I
>
> The only way that I have found of getting the correct exact answer is:
>
>
> FullSimplify[ComplexExpand[((1 + I*(-u + Pi))^4)^
>      (1/2)] /. u -> 167594143/78256779]
>
> ((167594143 + 78256779*I) - 78256779*Pi)^2/
>   6124123459454841
>
> In:=
> N[%, 20]
>
> Out=
> 1.5635873239815087691362`4.043607143112669*^-16 -
>   2.00000000000000015635873239815087005589`20.15051499783\
> 1987*I
>
> It is curious that this method works while the one using Unevaluated
> does not:
>
>
> FullSimplify[ComplexExpand[((1 + I*(-u + Pi))^4)^
>      (1/2)] /. u -> 167594143/78256779]
> FullSimplify[ComplexExpand[Unevaluated[
>     ((1 + I*(-167594143/78256779 + Pi))^4)^(1/2)]]]
>
>
> ((167594143 + 78256779*I) - 78256779*Pi)^2/
>   6124123459454841
>
>
> -(((167594143 + 78256779*I) - 78256779*Pi)^2/
>    6124123459454841)
>
>
>
> While I think this Mathematica's dealing wiht this situation could be
> improved (particularly the last example) I find it  difficult to see
> how such problems could be avoided in general. The problem seems to be
> very subtle. On the one hand, one can't expect the Mathematica
> evaluator to automatically apply powerful transformation s such as
> ComplexExpand or FullSimplify. On the other hand, certain
> transformations have to be automatically performed by the evaluator
> otherwise Mathematica would become unbearably tedious to use (one
> could leave every expression unevaluated until Simplify or
> FullSimplify or possibly a weaker function were applied to it but it
> would still require the user to judge when to apply which).
>
> As far as I can tell all this means that the user has to remain
> vigilant at all times and always think carefully about the answers
> returned by the program.
>
>
> Andrzej Kozlowski
> Chiba, Japan
> http://www.akikoz.net/~andrzej/
> http://www.mimuw.edu.pl/~akoz/
>

```

• References:
• Prev by Date: Re: Re: Re: Mathematica language issues
• Next by Date: Re: Intersection Problem With Version 5.1
• Previous by thread: Re: Zero testing
• Next by thread: Re: Zero testing