MathGroup Archive 2010

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

Search the Archive

Re: Define an antisymmetric function

  • To: mathgroup at smc.vnet.net
  • Subject: [mg107411] Re: [mg107396] Define an antisymmetric function
  • From: Daniel Lichtblau <danl at wolfram.com>
  • Date: Fri, 12 Feb 2010 04:40:12 -0500 (EST)
  • References: <201002111154.GAA01070@smc.vnet.net>

Torsten Schoenfeld wrote:
> I'd like to define an antisymmetric function by giving its value on a 
> set of known objects.  I'm having trouble enforcing antisymmetry.  Say I 
> want to define G[_, _] on the objects {a, b, c}:
> 
>    G[a, b] := f[a, b]
>    G[a, c] := g[a, c]
>    G[b, c] := h[b, c]
> 
> If I now enforce antisymmetry simply by
> 
>    G[x_, y_] := -G[y, x]
> 
> then it mostly works (e.g., G[b, a] evaluates to -f[a, b]).  But if I 
> apply G to something that is not in {a, b, c}, then I run into an 
> infinite loop: G[a, f[b]] yields "$RecursionLimit::reclim: Recursion 
> depth of 256 exceeded."
> 
> Ideally, I would like applications to unknown input to stay unevaluated 
> (e.g., G[a, f[b]] just yields G[a, f[b]]).  How can I achieve that while 
> also enforcing antisymmetry?
> 

One way to do this is to only assign to the ordered set of arguments, 
then impose down values to handle out-of-order argument lists. For the 
case of two arguments this can be done as below.

assignOrdered[G_,a_,b_,f_] :=
   If[a===b, G[a,b] := 0,
     If [OrderedQ[{a,b}], G[a,b] := f[a,b], G[b,a] := -f[a,b]]]

Here I replicate your assignments, plus another which gives the 
arguments in non-OrderedQ form.

assignOrdered[G,a,b,f]
assignOrdered[G,a,c,g]
assignOrdered[G,b,c,h]
assignOrdered[G,d,c,k]

Now we impose antisymmetry.

G[a_,a_] := 0
G[a_,b_] /; !OrderedQ[{a,b}] := -G[b,a]

let's see what we have.

In[61]:= DownValues[G]
Out[61]= {HoldPattern[G[a, b]] :> f[a, b],
   HoldPattern[G[a, c]] :> g[a, c],
   HoldPattern[G[b, c]] :> h[b, c], HoldPattern[G[c, d]] :> -k[d, c],
   HoldPattern[G[a_, a_]] :> 0,
   HoldPattern[G[a_, b_] /; !OrderedQ[{a, b}]] :> -G[b, a]}

Quick test:

In[62]:= {G[x,y], G[y,x], G[c,d],G[d,c],G[x,a]}
Out[62]= {G[x, y], -G[x, y], -k[d, c], k[d, c], -G[a, x]}

Daniel Lichtblau
Wolfram Research


  • Prev by Date: Re: Weird vanishing syntax coloring
  • Next by Date: Re: Translating this algorithm into mathematica code
  • Previous by thread: Define an antisymmetric function
  • Next by thread: Re: Define an antisymmetric function