Re: Working with ppatterns
- To: mathgroup at smc.vnet.net
- Subject: [mg113245] Re: Working with ppatterns
- From: Leonid Shifrin <lshifr at gmail.com>
- Date: Wed, 20 Oct 2010 04:08:43 -0400 (EDT)
Hi Themis, You will need something like this: In[10]:= AB=Cases[data,(X:_:1) a[i1_]^(j1:_:1) a[i2_]^(j2:_:1)]; ABindices=Cases[data,(X:_:1) a[i1_]^(j1:_:1) a[i2_]^(j2:_:1)->{{i1,j1},{i2,j2}}]; Column[Transpose[{AB,ABindices}]] Out[12]= {4 a[1]^3 a[2],{{1,3},{2,1}}} {6 a[1]^2 a[2]^2,{{1,2},{2,2}}} {4 a[1] a[2]^3,{{1,1},{2,3}}} {4 a[1]^3 a[3],{{1,3},{3,1}}} {12 a[1]^2 a[2] a[3],{{1,2},{2,1}}} {12 a[1] a[2]^2 a[3],{{1,1},{2,2}}} {4 a[2]^3 a[3],{{2,3},{3,1}}} {6 a[1]^2 a[3]^2,{{1,2},{3,2}}} {12 a[1] a[2] a[3]^2,{{1,1},{2,1}}} {6 a[2]^2 a[3]^2,{{2,2},{3,2}}} {4 a[1] a[3]^3,{{1,1},{3,3}}} {4 a[2] a[3]^3,{{2,1},{3,3}}} {4 a[1]^3 a[4],{{1,3},{4,1}}} {12 a[1]^2 a[2] a[4],{{1,2},{2,1}}} {12 a[1] a[2]^2 a[4],{{1,1},{2,2}}} {4 a[2]^3 a[4],{{2,3},{4,1}}} {12 a[1]^2 a[3] a[4],{{1,2},{3,1}}} {24 a[1] a[2] a[3] a[4],{{1,1},{2,1}}} {12 a[2]^2 a[3] a[4],{{2,2},{3,1}}} {12 a[1] a[3]^2 a[4],{{1,1},{3,2}}} {12 a[2] a[3]^2 a[4],{{2,1},{3,2}}} {4 a[3]^3 a[4],{{3,3},{4,1}}} {6 a[1]^2 a[4]^2,{{1,2},{4,2}}} {12 a[1] a[2] a[4]^2,{{1,1},{2,1}}} {6 a[2]^2 a[4]^2,{{2,2},{4,2}}} {12 a[1] a[3] a[4]^2,{{1,1},{3,1}}} {12 a[2] a[3] a[4]^2,{{2,1},{3,1}}} {6 a[3]^2 a[4]^2,{{3,2},{4,2}}} {4 a[1] a[4]^3,{{1,1},{4,3}}} {4 a[2] a[4]^3,{{2,1},{4,3}}} {4 a[3] a[4]^3,{{3,1},{4,3}}} Regards, Leonid On Tue, Oct 19, 2010 at 2:56 AM, Themis Matsoukas <tmatsoukas at me.com> wrote: > I would like to create a pattern that recognizes multinomial terms of the > form > > A (a[2]^x2) (a[5]^x5) (a[6]^x6)... > > Ultimately, I want to identify all the indices i (as in a[i]) and exponents > xi that appear in a given term so that the above term would produce a list > {{2, x2}, {5, x5}, {6, x6}, etc}. > > I have hard time writing a rule that is general enough to work with any > number of terms in the products and also one that will work whether the > prefactor or any of the exponents of the multinomial is 1. I explain all > this with the example below: > > data=Apply[List,Expand[(a[1]+a[2]+a[3]+a[4])^4]]; > Column[data]; > > AB=Cases[data,X_ a[i1_]^j1_ a[i2_]^j2_]; > ABindices=Cases[data,X_ a[i1_]^j1_ a[i2_]^j2_->{{i1,j1}, {i2, j2}}]; > Column[Transpose[{AB, ABindices}]] > > {6 a[1]^2 a[2]^2,{{1,2},{2,2}}} > {6 a[1]^2 a[3]^2,{{1,2},{3,2}}} > {6 a[2]^2 a[3]^2,{{2,2},{3,2}}} > {6 a[1]^2 a[4]^2,{{1,2},{4,2}}} > {6 a[2]^2 a[4]^2,{{2,2},{4,2}}} > {6 a[3]^2 a[4]^2,{{3,2},{4,2}}} > > Here, data is a made up list of multinomials, AB uses a rule to extract > double products, and ABindices produces a list of indices and exponents, as > I wanted. However: > > 1. my rule does misses terms like "4 a[1] a[3]^3" because the exponent of > a[1] is 1; a separate rule would have to be written. > > 2. If the prefactor of a term is 1, the term will not be selected unless X_ > is removed from the rule. > > In summary, I would have to write separate rules depending on the number of > terms in the product, and also depending on whether X or any of the > exponents is 1 or not. > > Is there a way to write the rule so that ABindices would contain the > indices and exponents of *all* terms in the original data? > > Themis > >