Services & Resources / Wolfram Forums
MathGroup Archive
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 1997

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

Search the Archive

Re: Creating an Attribute AntiSymmetric ?!?!?!

  • To: mathgroup at
  • Subject: [mg6316] Re: [mg6279] Creating an Attribute AntiSymmetric ?!?!?!
  • From: Paul Abbott <paul at>
  • Date: Sat, 8 Mar 1997 00:26:41 -0500 (EST)
  • Organization: University of Western Australia
  • Sender: owner-wri-mathgroup at

Bjoern Hassler wrote:

> is there a way of creating your own Attributes?

Not that I'm aware of -- someone at WRI should answer this.
> In particular I am looking for an attribute which
> work like Orderless (especially in wrt. to pattern
> matching), but makes a function totally anti(skew)-
> symmetric, rather than totally symmetric.

The following ideas have appeared in various issues of the Mathematica
Journal.  It is easy to construct a general antisymmetric function f

	In[1]:= Antisymmetrize[f_] := Module[{perm = Permutations[f]}, 
   			Plus @@ (Signature[f] perm Signature /@ perm)]

For example,

	In[1]:= Antisymmetrize[f[a, b, c]]

	Out[2]= f[a, b, c] - f[a, c, b] - f[b, a, c] + f[b, c, a] + 
			f[c, a, b] - f[c, b, a]

By including Signature[f]in the definition of Antisymmetrize, initially
cyclic and anticyclic permutations are distinguishable:

	In[3]:= Antisymmetrize[f[b, a, c]]

	Out[3]= -f[a, b, c] + f[a, c, b] + f[b, a, c] - f[b, c, a] - 
			f[c, a, b] + f[c, b, a]

The rule

	In[4]:= f[x__ /; !OrderedQ[{x}]] := Signature[{x}] f @@ Sort[{x}]

attached to f, ensures that it is antisymmetric independent of the
number of  its arguments. An example illustrates the utility of the

	In[5]:= Factor[h[a] f[a, b] - h[b] f[b, a]]

	Out[5]= f[a, b] (h[a] + h[b])

Note that this works correctly in combination with Antisymmetrize above:

	In[6]:= Antisymmetrize[f[a, b, c]]

	Out[6]= 0

Alternatively, instead of attaching a rule to a function we can use a 
replacement rule:

	In[7]:= Factor[h[a] g[a, b] - h[b] g[b, a] /. 
			g[x__] :> Signature[{x}] Sort[g[x]]]

	Out[7]= g[a, b] (h[a] + h[b])

This has the advantage that we now have control over when the
transformation is applied and also we don't have to worry about
forgetting that a rule has been attached to a function.


Paul Abbott
Department of Physics                       Phone: +61-9-380-2734 
The University of Western Australia           Fax: +61-9-380-1014
Nedlands WA  6907                         paul at 

          God IS a weakly left-handed dice player

  • Prev by Date: How to use Needs inside While?
  • Next by Date: Re: Re: Windows front end
  • Previous by thread: Re: Creating an Attribute AntiSymmetric ?!?!?!
  • Next by thread: Re: Creating an Attribute AntiSymmetric ?!?!?!