Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2002
*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 2002

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

Search the Archive

Re: Combination/Permutation questions

  • To: mathgroup at smc.vnet.net
  • Subject: [mg37444] Re: [mg37436] Combination/Permutation questions
  • From: Andrzej Kozlowski <andrzej at platon.c.u-tokyo.ac.jp>
  • Date: Wed, 30 Oct 2002 00:50:43 -0500 (EST)
  • Sender: owner-wri-mathgroup at wolfram.com

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/



  • Prev by Date: Re: Not quite a Swell FLOOP
  • Next by Date: Re: Combination/Permutation questions
  • Previous by thread: Re: Combination/Permutation questions
  • Next by thread: Re: Combination/Permutation questions