Re: Simplify 0/0 to 1?
- To: mathgroup at smc.vnet.net
- Subject: [mg77514] Re: Simplify 0/0 to 1?
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Mon, 11 Jun 2007 04:24:55 -0400 (EDT)
- References: <934147.40360.qm@web43135.mail.sp1.yahoo.com> <2DFED10A-AAB0-4649-A747-93E238C30B75@mimuw.edu.pl>
- Reply-to: Andrzej Kozlowski <akoz at mimuw.edu.pl>
In fact, if you are really concerned with this, you could do something like: $Pre = (If[Simplify[Denominator[#]] == 0, Print["Zero denominator!"], #] &); You will then get: o = (Log[2]*Cos[Pi/12] - Log[2]*Sin[Pi/12] - 2*Cos[Pi/12] + 2*Sin[Pi/ 12] + Sqrt[2] + 2*Log[Cos[Pi/12] - Sin[Pi/12]]*Cos[Pi/12] - 2*Log[Cos[Pi/12] - Sin[Pi/12]]*Sin[Pi/12])/(Log[2]*Cos[Pi/12] - Log[2]*Sin[Pi/12] + 2*Log[Cos[Pi/12] - Sin[Pi/12]]*Cos[Pi/12] - 2*Log[Cos[Pi/12] - Sin[Pi/12]]*Sin[Pi/12]) "Zero denominator!" before you even apply Simplify. Similarly: (1 - Cos[Pi/23]^2 - Sin[Pi/23]^2)^2/(1 - 2*Cos[Pi/23]^2 + Cos[Pi/23]^4 - 2*Sin[Pi/23]^2 + 2*Cos[Pi/23]^2*Sin[Pi/23]^2 + Sin[Pi/23]^4) "Zero denominator!" Unfortunately this will produce dramatic slowdowns in any slighlty complex algebraic computations (I haven't tried it but I am pretty sure). It might be better to replace this with a numerical check, but you will have to use extended precision arithemtic, since machine precision will often fail to detect zeros. So you could instead use: $Pre =. $Pre = If[N[Denominator[#1], 20] == 0, Print["Probably zero denominator!"], #1] & ; o N::meprec:Internal precision limit $MaxExtraPrecision = 50. reached while evaluating -((-1+) log(2))/(2 )+((1+) log(2))/(2 )-((-1+) log((1 +)/(2 )-<<1>>/(2 <<1>>)))/+((1+) log((1+)/(2 )-(-1+)/(2 )))/. >> "Probably zero denominator!" Peronally I think it is much better to leave thigs as they are, keep this in mind and be a little careful. Andrzej Kozlowski On 10 Jun 2007, at 22:20, Andrzej Kozlowski wrote: > *This message was transferred with a trial version of CommuniGate > (tm) Pro* > I would not call this bad performance. In fact this is inevitable, > not only in Mathematica but in every CAS that exists today > (although not necssarily in the same example). ALl you need to do > is to choose numerator and denominator equal to zero but > sufficiently complicated and such that the CAS will see that they > are equal before it can check that they are both 0. Every CAS will > then simplify the expression to 1, because for reason of > performance they cancel common factors as soon as they see them. > Here is a very trivial example: > > (1 - Cos[Pi/23]^2 - Sin[Pi/23]^2)/(1 - Cos[Pi/23]^2 - Sin[Pi/23]^2) > 1 > > This was turned into 1 by the evaluator withot any Simplify even > though both, the numerator and the denominator are clearly zero. > You can avoid this by mapping Sinmplify on the numerator and the > denominator but you have to use Unevaluated first: > > Simplify /@ > Unevaluated[(1 - Cos[Pi/23]^2 - Sin[Pi/23]^2)/(1 - Cos[Pi/23]^2 - > Sin[Pi/23]^2)] > The same approach will work in your example: > > Simplify/@o > > I am convinced that this phenomenon is general will be observed in > every CAS, although not necessarily in the same examples. But in > every CAS you can construct expressions equal to zero that will be > sufficiently complicated for the CAS not to be able to see that > they are zero before seeing that they are equal. Here is another > example, which is just again based on the Sin^2[a]+Cos^2[a]==1 > identity, but just made a bit more complicated, so that ti doe not > reduce to 1 immediately: > > > Simplify[(1 - Cos[Pi/23]^2 - Sin[Pi/23]^2)^2/(1 - 2*Cos[Pi/23]^2 + > Cos[Pi/23]^4 - > 2*Sin[Pi/23]^2 + 2*Cos[Pi/23]^2*Sin[Pi/23]^2 + Sin[Pi/23]^4)] > > 1 > > As you can see again, the numerator and the denominator are both > zero but Simplify sees that they are equal before it can see that > they are both zero and at that point the Evaluator performs the > cancelation. I think for reason of performance all CAS have to work > like this in principle. > > Andrzej Kozlowski > > > > > > On 10 Jun 2007, at 20:57, dimitris anagnostou wrote: > >> >> Hi. >> This appeared in another forum as part of a question >> what another CAS does. >> Just of curiosity I check Mathematica's performance (5.2). >> The result was poor! >> >> Here is the expression >> >> >> In[16]:= >> o = (Log[2]*Cos[Pi/12] - Log[2]*Sin[Pi/12] - 2*Cos[Pi/12] + 2*Sin[Pi/ >> 12] + Sqrt[2] + >> 2*Log[Cos[Pi/12] - Sin[Pi/12]]*Cos[Pi/12] - 2*Log[Cos[Pi/12] - >> Sin[Pi/12]]*Sin[Pi/12])/ >> (Log[2]*Cos[Pi/12] - Log[2]*Sin[Pi/12] + 2*Log[Cos[Pi/12] - >> Sin[Pi/ >> 12]]*Cos[Pi/12] - >> 2*Log[Cos[Pi/12] - Sin[Pi/12]]*Sin[Pi/12]) >> >> >> Out[16]= >> (Sqrt[2] + (-1 + Sqrt[3])/Sqrt[2] - (1 + Sqrt[3])/Sqrt[2] - ((-1 + >> Sqrt[3])*Log[2])/(2*Sqrt[2]) + >> ((1 + Sqrt[3])*Log[2])/(2*Sqrt[2]) - ((-1 + Sqrt[3])*Log[-((-1 + >> Sqrt[3])/(2*Sqrt[2])) + (1 + Sqrt[3])/(2*Sqrt[2])])/ >> Sqrt[2] + ((1 + Sqrt[3])*Log[-((-1 + Sqrt[3])/(2*Sqrt[2])) + (1 + >> Sqrt[3])/(2*Sqrt[2])])/Sqrt[2])/ >> (-(((-1 + Sqrt[3])*Log[2])/(2*Sqrt[2])) + ((1 + Sqrt[3])*Log[2])/ >> (2*Sqrt[2]) - >> ((-1 + Sqrt[3])*Log[-((-1 + Sqrt[3])/(2*Sqrt[2])) + (1 + Sqrt[3])/ >> (2*Sqrt[2])])/Sqrt[2] + >> ((1 + Sqrt[3])*Log[-((-1 + Sqrt[3])/(2*Sqrt[2])) + (1 + Sqrt[3])/ >> (2*Sqrt[2])])/Sqrt[2]) >> >> Watch now a really bad performance! >> >> In[17]:= >> (Simplify[#1[o]] & ) /@ {Numerator, Denominator} >> >> Out[17]= >> {0, 0} >> >> That is Mathematica simplifies succesfully both the numerator >> and denominator to zero. So, you wonder what goes wrong? >> >> Try now to simplify the whole expression! >> >> In[19]:= >> Simplify[o] >> >> Out[19]= >> 1 >> >> A very weird result to my opinion! >> Simplification of 0/0 to 1? >> I think no simplification or some >> warning messages would be much better >> than 1! >> >> Note also that >> >> In[20]:= >> RootReduce[o] >> >> Out[20]= >> 1 >> >> Dimitris >> >> Take the Internet to Go: Yahoo!Go puts the Internet in your >> pocket: mail, news, photos & more. >