2011-11-29 2 views
8

목록의 파티션으로, 나는 목록 집합의 부분 집합의 집합을 의미합니다. 즉, 집합의 서로 다른 쌍의 집합이 비어 있고 모든 부분 집합의 합집합이 원래 목록과 같습니다. 내 입력 목록 {1,π,x} 그때 내가Mathematica에서리스트의 모든 파티션을 얻으려면 어떻게해야합니까?

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

@yoda : 영업 이익은 용어와 혼동 될 수 있습니다. 이들은 파티션이 아니라고 동의합니다. – Blender

+0

@Blender 그래, 나는 그가 뭔가 다른 것을 얻고 있을지도 모른다는 것을 깨달았다. – abcd

+1

@Blender, yoda : 이들은 Mathematica 명령어 [Partition] (http : // reference)의 의미가 아닌 [세트 감각의 파티션] (http://en.wikipedia.org/wiki/Partition_of_a_set)입니다. .wolfram.com/mathematica/ref/Partition.html). – Simon

답변

12

는 당연히는 Combinatorica 패키지가 이미이 기능 (SetPartitions)가, 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]] 

에서 코드를 적용 또는 사용!

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
나는 세트의 Powerset로 시작하는 것

를 반환하는 기능을 원하는 경우

예를 들어, 사람을 필터링 한 후 (Subsets[x] 사용) 어디 Union[x] 세트의 원래 세트가 아닙니다.

조금 느리지 만 직관적이라고 생각합니다.

+0

'{{1, x}, {π}} '의 조합은 원래 집합이 아닙니다. 그러나 OP는 그것을 요구했다. –

+3

@BillyONeal 왜 조합 {1, x}와 {π}가 {1, π, x}와 같지 않다고합니까? 집합의 요소 순서는 집합의 정의와 상관이 없습니다. – Michael

+0

@Blender : 나는 정정합니다. :) –

관련 문제