2011-11-29 13 views
8

リストの区切りとは、リスト要素のサブセットのセットを意味します。つまり、サブセットの別々のペアの共通部分は空であり、すべてのサブセットの和集合は元のリストと等しくなります。例えばMathematicaでリストのすべてのパーティションを取得するにはどうすればよいですか?

私の入力リストが{1,π,x}であれば、その後、私はセットのPowersetで始まる(Subsets[x]を使用)し、その後Union[x]ものを除外するだろう

{ {{1},{π},{x}}, {{1,π},{x}}, {{1,x},{π}}, {{1},{x,π}}, {{1,π,x}} } 
+0

@yoda:OPは専門用語と混同される可能性があります。これらはパーティションではありません。 – Blender

+0

@Blenderええ、私はただ彼が何かに乗っているかもしれないことに気付いた。 – abcd

+1

@Blender、yoda:これはMathematicaコマンド[Partition](http://リファレンス)の意味ではなく、[セットの意味でのパーティション](http://en.wikipedia.org/wiki/Partition_of_a_set)です。 .wolfram.com/mathematica/ref/Partition.html)。 – Simon

答えて

12

は、Combinatoricaパッケージは既にこの機能(SetPartitionsを)持っています!

Needs["Combinatorica`"] 

comb = SetPartitions[{a, b, c, d, e}] 

チェック、どちらも同じ結果を返すこと(ただし、異なる順序で)

Complement[bell, comb] == {} 
[email protected] == [email protected] 
(* Both of the above return True *) 
+0

@ Mr.Wizard、それは精神的に解析するのに少し時間がかかりますが、私はそれが仕事をすることができると言うことができます、ありがとう! – Michael

+0

@Michael、私は標準ライブラリでこの機能をチェックするのを忘れていました。私が行った更新を見てください。 –

+0

@サイモン、編集していただきありがとうございます。 –

2

を返す関数が欲しいですのセットは元のセットではありません。

少し遅いですが、直感的です。 http://mathforum.org/advanced/robertd/bell.html

BellList[1] = {{{1}}}; 
BellList[n_Integer?Positive] := Join @@ 
    (ReplaceList[#, 
    {{b___, {S__}, a___} :> {b, {S, n}, a}, 
    {S__} :> {S, {n}}} 
    ] & /@ BellList[n - 1]) 

s = {a, b, c, d, e}; 

bell = [email protected]@s /. n_Integer :> s[[n]] 

あるいは、当然の適応コードを使用

+0

{{1、x}、{π}}の連合は元のセットではありません。 OPはそれを求めたが。 –

+3

@BillyONealなぜあなたは{1、x}と{π}が{1、π、x}と等しくないとお考えですか?セットの要素の順序は、セットの定義には関係ありません。 – Michael

+0

@Blender:私は訂正します。 :) –

関連する問題