Message Boards Message Boards

0
|
6088 Views
|
9 Replies
|
6 Total Likes
View groups...
Share
Share this post:

FullSimplify issue in Mathematica 8.0.1

Posted 11 years ago

Input:

FullSimplify[5916 + 5 Sqrt[606] >= Sqrt[6 (5835701 + 9860 Sqrt[606])]]

Output:

{} <= 5916 + 5 Sqrt[606]
POSTED BY: Mario Weitzer
9 Replies

It is generally a good idea to upgrade to the latest bugfix release of whichever version you have ... with Mathematica 8.0.4 I get True with the warning that

N::meprec: "Internal precision limit $MaxExtraPrecision = 50.` reached while evaluating 5916+5\ Sqrt[606]-Sqrt[6\(5835701+9860\Sqrt[606])]."

5916 + 5 Sqrt[606] - Sqrt[6 (5835701 + 9860 Sqrt[606])] // FullSimplify gives 0.

POSTED BY: Szabolcs Horvát
Posted 11 years ago

I get the correct answer (True) in both 9.0.1.0 and 10.0.0.0 (Windows 7) with the same warning as above.

POSTED BY: Jim Baldwin
Posted 11 years ago

That's interesting. I restarted the kernel and now I also get the correct result. I will try to reproduce the error.

POSTED BY: Mario Weitzer
Posted 11 years ago

I was able to reproduce the bug. Just restart your kernel and evaluate the following commands exactly as they are (will take a minute or two). The problem seems to be related to my usage of the protected symbol E as a local variable in a Block because if I replace all ocurrences of E in the definition of fSailIntersection with, say F, I get correct results. FullSimplify seems to have some sort of cache where it stores previous results and this gets corrupted by the evaluation of the code below. Still a serious bug imo.

fOmega[d_] := If[MemberQ[{1, 2}, d], {0, Sqrt[d]}, {1/2, Sqrt[d]/2}];
fSailTestLessEqual[d_,S_,T_,{x_,y_}]:=Block[{},Off[N::meprec];Return[FullSimplify[(x((S[[1]]+S[[2]]fOmega[d][[1]])^2+(S[[2]]fOmega[d][[2]])^2)+(S[[1]]+S[[2]]fOmega[d][[1]])(T[[1]]+T[[2]]fOmega[d][[1]])+S[[2]]T[[2]]fOmega[d][[2]]^2)^2+(y((S[[1]]+S[[2]]fOmega[d][[1]])^2+(S[[2]]fOmega[d][[2]])^2)+(S[[1]]+S[[2]]fOmega[d][[1]])T[[2]]fOmega[d][[2]]-(T[[1]]+T[[2]]fOmega[d][[1]])S[[2]]fOmega[d][[2]])^2<=(S[[1]]+S[[2]]fOmega[d][[1]])^2+(S[[2]]fOmega[d][[2]])^2<=(x((S[[1]]+S[[2]]fOmega[d][[1]])^2+(S[[2]]fOmega[d][[2]])^2)+(S[[1]]+S[[2]]fOmega[d][[1]])(T[[1]]+T[[2]]fOmega[d][[1]]+1)+S[[2]]T[[2]]fOmega[d][[2]]^2)^2+(y((S[[1]]+S[[2]]fOmega[d][[1]])^2+(S[[2]]fOmega[d][[2]])^2)+(S[[1]]+S[[2]]fOmega[d][[1]])T[[2]]fOmega[d][[2]]-(T[[1]]+T[[2]]fOmega[d][[1]]+1)S[[2]]fOmega[d][[2]])^2&&-fOmega[d][[2]]/2<=S[[2]]fOmega[d][[2]]x+(S[[1]]+S[[2]]fOmega[d][[1]])y+T[[2]]fOmega[d][[2]]<=fOmega[d][[2]]/2]];On[N::meprec];];
fSailEdges[d_,S_,T_]:={(x-(-(S[[1]]+S[[2]]fOmega[d][[1]])(T[[1]]+T[[2]]fOmega[d][[1]])-S[[2]]T[[2]]fOmega[d][[2]]^2)/((S[[1]]+S[[2]]fOmega[d][[1]])^2+(S[[2]]fOmega[d][[2]])^2))^2+(y-(-(S[[1]]+S[[2]]fOmega[d][[1]])T[[2]]fOmega[d][[2]]+(T[[1]]+T[[2]]fOmega[d][[1]])S[[2]]fOmega[d][[2]])/((S[[1]]+S[[2]]fOmega[d][[1]])^2+(S[[2]]fOmega[d][[2]])^2))^2==1/((S[[1]]+S[[2]]fOmega[d][[1]])^2+(S[[2]]fOmega[d][[2]])^2),(x-(-(S[[1]]+S[[2]]fOmega[d][[1]])(T[[1]]+T[[2]]fOmega[d][[1]]+1)-S[[2]]T[[2]]fOmega[d][[2]]^2)/((S[[1]]+S[[2]]fOmega[d][[1]])^2+(S[[2]]fOmega[d][[2]])^2))^2+(y-(-(S[[1]]+S[[2]]fOmega[d][[1]])T[[2]]fOmega[d][[2]]+(T[[1]]+T[[2]]fOmega[d][[1]]+1)S[[2]]fOmega[d][[2]])/((S[[1]]+S[[2]]fOmega[d][[1]])^2+(S[[2]]fOmega[d][[2]])^2))^2==1/((S[[1]]+S[[2]]fOmega[d][[1]])^2+(S[[2]]fOmega[d][[2]])^2),-S[[2]]fOmega[d][[2]]x-(S[[1]]+S[[2]]fOmega[d][[1]])y-T[[2]]fOmega[d][[2]]==fOmega[d][[2]]/2,S[[2]]fOmega[d][[2]]x+(S[[1]]+S[[2]]fOmega[d][[1]])y+T[[2]]fOmega[d][[2]]==fOmega[d][[2]]/2};
fEqualities[d_,C_]:=Flatten[Table[Map[{{#[[1]],#[[1]]/.{Equal->Less}},{#[[2]],#[[2]]/.{Equal->GreaterEqual}},{#[[3]],#[[3]]/.{Equal->LessEqual}},{#[[4]],#[[4]]/.{Equal->Less}}}&,{fSailEdges[d,C[[i]],C[[Mod[i,Length[C]]+1]]]}][[1]],{i,1,Length[C]}],1];
fVerticesSelected[d_,C_]:=Block[{V,VT,VS,a,b},V=Select[fVertices[fEqualities[d,C]],Apply[And,Table[fSailTestLessEqual[d,C[[i]],C[[Mod[i,Length[C]]+1]],#[[1]]],{i,1,Length[C]}]]&];VT=DeleteDuplicates[Union[Map[#[[1]]&,V]],FullSimplify[#1==#2]&];VS=Table[{},{a,1,Length[VT]}];For[a=1,a<=Length[VT],{For[b=1,b<=Length[V],{If[FullSimplify[VT[[a]]==V[[b]][[1]]],VS[[a]]=Union[VS[[a]],V[[b]][[2;;3]]]],b++}],VS[[a]]=Sort[VS[[a]],MemberQ[{Less,Greater},Head[#1[[2]]]]&&MemberQ[{LessEqual,GreaterEqual},Head[#2[[2]]]]&],VS[[a]]=DeleteDuplicates[VS[[a]],FindInstance[Not[Implies[#1[[2]],#2[[2]]]],{x,y},Reals]==={}||FindInstance[Not[Implies[#2[[2]],#1[[2]]]],{x,y},Reals]==={}&],VS[[a]]={VT[[a]],VS[[a]]},a++}];Return[VS];];
fSailIntersection[d_,C_]:=Block[{a=0,V={},E={},P={},PF={},A={},S={},T=0,S2={},R={}},V=fVerticesSelected[d,C];E=Table[If[i!=j,Intersection[V[[i]][[2]],V[[j]][[2]]],{}],{i,1,Length[V]},{j,1,Length[V]}];If[Complement[Union[Flatten[Map[Length[#]&,E,{2}]]],{1,0}]==={},{P=Select[Position[Map[Length[#]==1&,E,{2}],True],#[[1]]<#[[2]]&];R=Table[{V[[P[[i]][[1]]]][[1]],V[[P[[i]][[2]]]][[1]],E[[P[[i]][[1]]]][[P[[i]][[2]]]][[1]][[2]]},{i,1,Length[P]}];}];Return[R];];

Z={{-5,0},{4,2},{-1,-3},{-2,3},{5,-1},{-4,-2},{1,3},{2,-3},{-4,1},{4,1},{-2,-3},{-1,3},{4,-2}};
ZI = fSailIntersection[2, Z]
ZI = fSailIntersection[2, Z]

fSailTestLessEqual[2,{-4,-2},{1,3},{5065/6232-(17 Sqrt[101/6])/1558,(12 Sqrt[2])/19-1/19 Sqrt[-206+570 (5065/6232-(17 Sqrt[101/6])/1558)-361 (5065/6232-(17 Sqrt[101/6])/1558)^2]}]

FullSimplify[24<=(-20+24 (5065/6232-(17 Sqrt[101/6])/1558))^2+(-8 Sqrt[2]+24 ((12 Sqrt[2])/19-1/19 Sqrt[-206+570 (5065/6232-(17 Sqrt[101/6])/1558)-361 (5065/6232-(17 Sqrt[101/6])/1558)^2]))^2]

Simplify[24<=(-20+24 (5065/6232-(17 Sqrt[101/6])/1558))^2+(-8 Sqrt[2]+24 ((12 Sqrt[2])/19-1/19 Sqrt[-206+570 (5065/6232-(17 Sqrt[101/6])/1558)-361 (5065/6232-(17 Sqrt[101/6])/1558)^2]))^2]

FullSimplify[5916+5 Sqrt[606]>=Sqrt[6 (5835701+9860 Sqrt[606])]]
Attachments:
POSTED BY: Mario Weitzer

It looks like you are running several symbolic processing functions, such as FullSimplify and FindInstance, within Block[{E = ...}, ...]. These functions could easily use E internally. They also cache partial symbolic results.

So ultimately it is not surprising that doing this breaks the system.

Just don't try to use builtins such as E or C as Block variables. Also, use Module unless you know you need Block.

I would not call this a bug.

POSTED BY: Szabolcs Horvát

I thought Block was recommended unless you need Module.

POSTED BY: Frank Kampas

Nope. The opposite. Though in most cases there is no practical difference.

POSTED BY: David Reiss

Isn't Block faster because it doesn't create a lot of new variables?

POSTED BY: Frank Kampas

Consider

In[4]:= f[x_] := D[x a, a]

In[5]:= f[b]
Out[5]= b

In[6]:= f[a]
Out[6]= 2 a

which is just one simple example of why Block doesn't localize the "usual way" (it uses dynamic scoping).

Block does have its uses. If we were to implement something similar to Table and localize the iterator, Block would be the choice.

Choose between Module and Block depending on what they do, not performance. They are quite different.

Reading: What are the use cases for different scoping constructs?

POSTED BY: Szabolcs Horvát
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard

Group Abstract Group Abstract