Re: Combination/Permutation questions
- To: mathgroup at smc.vnet.net
- Subject: [mg37462] Re: [mg37436] Combination/Permutation questions
- From: "Michael Chang" <michael_chang86 at hotmail.com>
- Date: Thu, 31 Oct 2002 04:41:36 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Hi Andrzej, Many thanks for your help and solutions! Actually, for completeness, I believe that for In[3], the input should have been In[3]:= Perms[{a,b,c,d,e},2] but I think that this is probably clear from Out[3] anyways. Also, after seeing what *expert* Mathematica programmers do ;), I've found that for In[6], In[6]:= f[l_List,k_]:=Select[Union[Plus@@@Perms[Join[l,-l],k]],Length[#]==k&] seems to produce the expected number of sets when using, for example, In[7]:= f[{a,b,c,d},3] (A slightly larger set tends to result otherwise, due to the inclusion of some sets with Lenth[#]!=k.) Regards, Michael >From: Andrzej Kozlowski <andrzej at platon.c.u-tokyo.ac.jp> To: mathgroup at smc.vnet.net >To: Andrzej Kozlowski <andrzej at tuins.ac.jp> >CC: michael_chang86 at hotmail.com (Michael Chang), mathgroup at smc.vnet.net >Subject: [mg37462] Re: [mg37436] Combination/Permutation questions >Date: Tue, 29 Oct 2002 23:23:21 +0900 > >I guess I did not exactly answer your last question. To select those >expressions that involve just one minus use: > > >l={-a-b,a-b,-a+b,a+b,-a-c,a-c,-b-c,b-c,-a+c,a+c,-b+c,b+c,-a-d,a-d,-b- >d,b-d,-c- > d,c-d,-a+d,a+d,-b+d,b+d,-c+d,c+d}; > > >Select[l,Count[#,-1,2]==1&] > >{a-b,-a+b,a-c,b-c,-a+c,-b+c,a-d,b-d,c-d,-a+d,-b+d,-c+d} > > > >On Tuesday, October 29, 2002, at 05:20 PM, Andrzej Kozlowski wrote: > >> >>On Tuesday, October 29, 2002, at 02:09 PM, Michael Chang wrote: >> >>>First, suppose that I have 4 objects, a, b, c, and d, respectively. >>>How can I generate the permutation set when chosing, say, only *2* >>>elements. >>> >>>In[1]:= Permutations[{a,b,c,d}] >>> >>>gives me the permutation set when choosing *all* 4 objects ... :( >> >> >>In[1]:= >><<DiscreteMath`Combinatorica` >> >>In[2]:= >>Perms[l_List,k_]:=Flatten[Permutations/@KSubsets[l,k],1] >> >>In[3]:= >>Perms[{a,b,c,d},2] >> >>Out[3]= >>{{a,b},{b,a},{a,c},{c,a},{a,d},{d,a},{a,e},{e,a},{b,c},{c,b},{b,d},{d,b >>},{ >> b,e},{e,b},{c,d},{d,c},{c,e},{e,c},{d,e},{e,d}} >> >> >> >> >> >>> >>>Second, for the same four objects (a,b,c,d), to generate the >>>*combination* set (with 2 elements), I use: >>> >>>In[2]:= Needs["DiscreteMath`Combinatorica`"]; >>>In[3]:= cset=KSubsets[{a,b,c,d},2] >>> >>>and this generates the expected 6 combinatorial pairs >>>({{a,b},{a,c},{a,d},{b,c},{b,d},{c,d}}). >>> >>>What I'd like to do next is add each combinatorial set, and I am able >>>to do this correctly via: >>> >>>In[4]:= Plus@@Transpose[cset] >>> >>>to obtain {a+b,a+c,a+d,b+c,b+d,c+d}. >> >>Alternatively: >> >>In[4]:= >>cset=KSubsets[{a,b,c,d},2] >> >> >>Out[4]= >>{{a,b},{a,c},{a,d},{b,c},{b,d},{c,d}} >> >>In[5]:= >>Plus@@@cset >> >>Out[5]= >>{a+b,a+c,a+d,b+c,b+d,c+d} >> >>> >>>My problem lies in the fact that now, I'd like to be able to allow >>>*each* (a,b,c,d) element to be either plus, or minus (in reality, I'm >>>trying to generate combinatorial adds/minuses for *functions* >>>(a,b,c,d)), and to still generate the 'sum' of the cominatorial set. >>>So for instance, in my current example, for the *first* {a,b} >>>combinatorial pair, I'd like to be able to generate >>> >>>In[5]:= >>>Plus@@Transpose[Partition[Flatten[Outer[List,{a,-a},{b,-b}]],2]] >>> >>>(which generates {a+b,a-b,-a+b,-a-b}) ... only I'd like this to be >>>somehow done automatically for *each* combinatorial pair (and, for the >>>more general case when I generate combinatorial sets involving only >>>'k' elements). I've struggled with this for a while, and am only able >>>to generate such a list *manually* for each of my six original >>>combinatorial pairs ... a tedious, and somewhat tiresome procedure! :( >>> Is there a way of 'easily' doing this?!? >> >>For example: >> >>In[6]:= >>f[l_List,k_]:=Rest[Union[Plus@@@Perms[Join[l,-l],k]]] >> >>In[7]:= >>f[{a,b,c,d},2] >> >>Out[7]= >>{-a-b,a-b,-a+b,a+b,-a-c,a-c,-b-c,b-c,-a+c,a+c,-b+c,b+c,-a-d,a-d,-b- >>d,b-d,- >> c-d,c-d,-a+d,a+d,-b+d,b+d,-c+d,c+d} >> >>> >>>With my newly generated list (having 4*6 'elements'), how can I also >>>go about finding which expressions involve/use only, say, 1 Minus? Is >>>there an 'easy' way of doing this too? (For instance, I'd like to >>>then 'filter' for (a-b) and (b-a) ...) (Perhaps the count of 1 Minus >>>is a little contrived for this example here, but for the more general >>>case I'll probably be considering, I might need to filter for, say, >>>(longer) expressions involving 2 Minuses (say).) >> >> >>In cases like the above the following will work: >> >>In[8]:= >>Count[#,-1,2]&/@% >> >>Out[8]= >>{2,1,1,0,2,1,2,1,1,0,1,0,2,1,2,1,2,1,1,0,1,0,1,0} >> >> >> >>Andrzej Kozlowski >>Yokohama, Japan >>http://www.mimuw.edu.pl/~akoz/ >>http://platon.c.u-tokyo.ac.jp/andrzej/ >> >> >Andrzej Kozlowski >Yokohama, Japan >http://www.mimuw.edu.pl/~akoz/ >http://platon.c.u-tokyo.ac.jp/andrzej/ ----------------------------------------------------------------- | Déconfiture | Et vivre est dur | | Des pépins | Toujours un choix | | Mais je veux croire | Mais je jure | | En l'au-delà | Que le monde est à moi | ----------------------------------------------------------------- Extrait de "Dessine-moi un mouton" par Mylène Farmer _________________________________________________________________ Get faster connections -- switch to MSN Internet Access! http://resourcecenter.msn.com/access/plans/default.asp