Re: Problem with Mathematica 6

*To*: mathgroup at smc.vnet.net*Subject*: [mg77080] Re: [mg77065] Problem with Mathematica 6*From*: Andrzej Kozlowski <akoz at mimuw.edu.pl>*Date*: Sun, 3 Jun 2007 06:05:27 -0400 (EDT)*References*: <200706020819.EAA29947@smc.vnet.net>

On 2 Jun 2007, at 17:19, Michael Weyrauch wrote: > Hello, > > the following code fragment runs under Mathematica 5.2 but > produces an infinite recursion error in Mathematica 6.0 in certain > cases: > > First I define a number of commands and slightly change the > built-in command "NonCommutativeMultiply": > Grading[_] = 0; > Fermion[a__] := ((Grading[#1] = 1) & ) /@ {a}; > Fermion[a, b]; > GetGradeds[a___] := GetGradeds[a] = Select[{a}, Grading[#1] != 0 & ]; > > Unprotect[NonCommutativeMultiply]; > NonCommutativeMultiply[a___] /; (Length[GetGradeds[a]] <= 1) := > Times[a]; > Protect[NonCommutativeMultiply]; > > If you now e.g. evaluate > > In[22]:= k ** l > Out[22]= k*l > > or > > In[23]:= a ** l > Out[23]= a*l > > BUT in Mathematica 6.0: > > In[24]:= a ** b > > $IterationLimit::"itlim" : "Iteration limit of 4096 exceeded. \ > \!\(\*ButtonBox["\[RightSkeleton]", > BaseStyle->"Link", > ButtonData:>"paclet:ref/message/$IterationLimit/itlim", > ButtonFrame->None, > ButtonNote->"$IterationLimit::itlim"]\)" > Out[24]= Hold[(Times[a]) ** b] > > However in Mathematica 5.2 one gets > > In[10]:= a ** b > Out[10]=a**b > > which is what I expect and I want to have. > > I.e., whenever I NonCommutativeMultiply two variables which are > explicitly declared as fermions by the command Fermion[], I get an > infinite recursion error in Mathematica 6. > > This behaviour of Mathematica 6.0 is rather confusing to me, since > I believe that I just use very basic and elementary assignments > in my code. Why shouldn't it work under Mathematica 6.0 if it > works under 5.2? It appears that the 6.0 kernel behaves differently > than the > 5.2 kernel in such basic situations. Very unpleasant! > > (For anyone who wonders about the purpose of this (strange) code: > It is a small fragment of a package that implements the handling > of Grassmann variables. I just extracted that bit in order to show > the Mathematica 6.0 problem.) > > Furthermore, beyond an explanation of this unexpected behaviour of > Mathematica 6, I would like to find a workaround in Mathematica 6 > such that I get > the same result as in Mathematica 5.2. > > Thanks for any suggestions. > > Michael Weyrauch > On of the most basic principles in Mathematica programming, stated, over the years, a number of times on this list by WRI employees, (particularly by David Withoff) is if you choose to Unprotect and modify any built-in functions you can only blame yourself for any unpleasantness that might occur. The workaround is: don't do it. One think you can do instead is to do essentially the same thing without modifying NonCompputativeMultiply. If you want to use a symbol that looks like multiplication you could choose SmallCircle. You could then do something like this: In[1]:= Grading[_] = 0; In[2]:= Fermion[a__] := ((Grading[#1] = 1) &) /@ {a}; In[3]:= Fermion[a, b] Out[3]= {1, 1} In[4]:= GetGradeds[a___] := GetGradeds[a] = Select[{a}, Grading[#1] ! = 0 &]; In[9]:= SmallCircle[z___] /; (Length[GetGradeds[z]] <= 1) := Times[z]; In[10]:= SmallCircle[z___] := NonCommutativeMultiply[z] In[13]:= SmallCircle[a, l] Out[13]= a l SmallCircle[a,b] In[14]:= SmallCircle[a, b] Out[14]= a ** b In[17]:= SmallCircle[a, l, m] Out[17]= a l m Of course instead of writing SmallCircle[a,l,m] you can use as input a escape sc escape l escape sc escape m . Andrzej Kozlowski

**References**:**Problem with Mathematica 6***From:*"Michael Weyrauch" <michael.weyrauch@gmx.de>