Re: generating submultisets with repeated elements
- To: mathgroup at smc.vnet.net
- Subject: [mg103681] Re: generating submultisets with repeated elements
- From: David Bevan <david.bevan at pb.com>
- Date: Fri, 2 Oct 2009 08:23:57 -0400 (EDT)
- References: <DE9DE45304B6FA4EBE8252CD4EBDA2418286B95F41@PBI-NAMSG-02.MGDPBI.global.pvt>
I've now tried the following, which avoids generating the extra multisets: coinSets[s_,k_]:=Flatten[Table[subMultiSets[s,i],{i,k}],1] subMultiSets[s_,k_]:=smsLoop[{},s,k] smsLoop[{ts___},{x_},1]:={{ts,x}} smsLoop[t:{ts___},{x_,xs___},1]:=Prepend[smsLoop[t,{xs},1],{ts,x}] smsLoop[{ts___},s:{x_},k_]:=smsLoop[{ts,x},s,k-1] smsLoop[t:{ts___},s:{x_,xs___},k_]:=Join[smsLoop[{ts,x},s,k-1],smsLoop[t,{xs},k]] Any suggestions for a better approach? David %^> ________________________________ From: David Bevan Sent: 01 October 2009 18:57 To: mathgroup at smc.vnet.net Subject: [mg103681] generating submultisets with repeated elements I'm new to Mathematica, so if I've missed something obvious, my apologies. I want a function to generate a list of "submultisets" with up to k elements of a set s, allowing elements from s to be repeated. The following works, but is very inefficient since each multiset is generated multiple times and then sorted and then repeats deleted: coinSets[s_,k_]:=DeleteDuplicates[Sort/@Flatten[Tuples[s,#]&/@Range[k],1]] coinSets[{1,3,4},3] {{1},{3},{4},{1,1},{1,3},{1,4},{3,3},{3,4},{4,4},{1,1,1},{1,1,3},{1,1,4},{1,3,3},{1,3,4},{1,4,4},{3,3,3},{3,3,4},{3,4,4},{4,4,4}} I assumed there would be a suitable function in the Combinatorica package, but I can't see anything -- which would be a bit odd for a combinatorial package. What have I missed? Do I need to write my own (perhaps by looking at how KSubsets is implemented) or is there some easy way of generating these multisets? Thanks. David %^>