MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Problem with Mathematica 6

  • To: mathgroup at smc.vnet.net
  • Subject: [mg77093] Re: Problem with Mathematica 6
  • From: David Bailey <dave at Remove_Thisdbailey.co.uk>
  • Date: Sun, 3 Jun 2007 06:12:11 -0400 (EDT)
  • References: <f3r9km$25g$1@smc.vnet.net>

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
> 
> 
> 
> 
There does indeed seem to be a difference here between the behaviour in 
the two versions, although the problem (at least on my machine) is 
infinite iteration, not infinite recursion.

You can get the same infinite iteration if you replace 
NonCommutativeMultiply  with an arbitrary function f, provided you give 
it the attribute Flat. By using TracePrint, it would seem that this is 
not unrelated to the following which loops in both versions:

f[a]:=f[Times[a]]

f[a]


The original code is easy to fix and simplify at the same time, by using 
the fact that NonCommutativeMultiply has attributes OneIdentity and 
Flat. This means that it is only necessary to deal explicitly with the 
2-argument case.

Grading[_Symbol]=0;
Fermion[a_,b___]:=((Grading[a]=1);Fermion[b]);
Fermion[a,b];
Unprotect[NonCommutativeMultiply];
NonCommutativeMultiply[x_Symbol,y_/;Grading[y]==0]:=x y;
NonCommutativeMultiply[y_/;Grading[y]==0,x_Symbol]:=x y;
NonCommutativeMultiply[x_,x1_ y_/;Grading[y]==0]:=y(x**x1);
NonCommutativeMultiply[x_ y_/;Grading[y]==0,x1_]:=y(x**x1);
Protect[NonCommutativeMultiply];

David Bailey
http://www.dbaileyconsultancy.co.uk


  • Prev by Date: Re: Problems creating a package file
  • Next by Date: Re: Gradient option for FindMinimum
  • Previous by thread: Re: Re: Re: Problem with Mathematica 6
  • Next by thread: Running the .NET examples in V6