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>
- Problem with Mathematica 6