Mathematica 9 is now available
Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2006
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2006

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

Search the Archive

Re: Grouping similar indices together in an expression

  • To: mathgroup at smc.vnet.net
  • Subject: [mg65258] Re: Grouping similar indices together in an expression
  • From: Paul Abbott <paul at physics.uwa.edu.au>
  • Date: Wed, 22 Mar 2006 06:13:49 -0500 (EST)
  • Organization: The University of Western Australia
  • References: <dvosko$j5k$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

In article <dvosko$j5k$1 at smc.vnet.net>,
 "David Sanders" <dpsanders at gmail.com> wrote:

> I am a newbie in Mathematica, and am trying to do the following.
> 
> I have terms which look like
> a[i] a[j] b[i] b[j]
> 
> I need to apply a function F, for which I need to group the different
> indices (by which I mean i, j) together as follows:
> 
> F(a[i] a[j] b[i] b[j]) = F(a[i] b[i]) F(a[j] b[j])

What is the application? Knowing this might help construct the "best" 
solution.
 
> I do not in general know how many different indices there might be in a
> term.  E.g. I might have
> a[i] a[j] a[k] b[j]
> 
> Could somebody please give me a hint as to how to do this?

Essentially, you want to sort the expression by its index. You could use 
pattern-matching to do this. Alternatively, Sort can be used for this 
with a suitable ordering function. However, Times is Orderless so you 
need to change the head of the expression to, say, List:

 Sort[List @@ (a[i] a[j] a[k] b[j]), OrderedQ[{First[#1], First[#2]}] &]

Now you can use Split to split up the expression whenever the index 
changes:

 Split[%, First[#1] === First[#2] &]

Putting these together, the function IndexCollect applies f to each 
grouping of indices:

  IndexCollect[f_, x_] :=  Head[x] @@ f /@ Head[x] @@@
    Split[Sort[List @@ x, OrderedQ[{First[#1], First[#2]}] &],           
      First[#1] === First[#2] &]

For example,

  IndexCollect[f, a[i] a[j] b[i] b[j]]

  f[a[i] b[i]] f[a[j] b[j]]

  IndexCollect[f, a[i] a[j] a[k] b[j]]

  f[a[i]] f[a[k]] f[a[j] b[j]]

Also, if you have addition instead of multiplication, this operation is 
preserved (via Head[x] in the definition of IndexCollect):

  IndexCollect[f, a[i]+a[j]+a[k]+b[j]]

  f[a[i]] + f[a[k]] + f[a[j] + b[j]]

Cheers,
Paul

_______________________________________________________________________
Paul Abbott                                      Phone:  61 8 6488 2734
School of Physics, M013                            Fax: +61 8 6488 1014
The University of Western Australia         (CRICOS Provider No 00126G)    
AUSTRALIA                               http://physics.uwa.edu.au/~paul


  • Prev by Date: Re: Grouping similar indices together in an expression
  • Next by Date: Re: Grouping similar indices together in an expression
  • Previous by thread: Re: Grouping similar indices together in an expression
  • Next by thread: Re: Grouping similar indices together in an expression