# Computing the equivalence classes of the symmetric transitive closure of a relation

## ConnectedComponents

Using Daniel Lichtblau's answer to a related question

```
ConnectedComponents[pairs] //Sort /@ # & //Sort (* thanks: CarlWoll *)
```

{{3, 5, 9},

{11, 21, 22, 35},

{12, 14, 16, 23},

{1, 6, 10, 13, 36},

{17, 20, 24, 25, 28, 32},

{2, 8, 15, 18, 27, 29, 31},

{4, 7, 19, 26, 30, 33, 34}}

In versions prior to 10.3 use

```
ConnectedComponents[Graph[UndirectedEdge @@@ pairs]] //Sort /@ # & //Sort
```

## MatrixPower

Implementing transitive closure using `MatrixPower`

:

```
m = [email protected];
(*the adjacency matrix of atomic elements in pairs:*)
SparseArray[pairs ~Append~ {i_, i_} -> 1, {m, m}];
(*symmetrize the adjacency matrix:*)
% + %\[Transpose] // Sign;
(*find the transitive closure:*)
Sign @ MatrixPower[N@%, m];
(*eliminate duplicate rows,and extract the atomic elements of pairs in each row:*)
Select[DeleteDuplicates @ Normal @ %, Tr@# > 1 &];
Join @@ Position[#, 1] & /@ %;
(*organize:*)
Sort[Sort /@ %]
```

{{3, 5, 9},

{11, 21, 22, 35},

{12, 14, 16, 23},

{1, 6, 10, 13, 36},

{17, 20, 24, 25, 28, 32},

{2, 8, 15, 18, 27, 29, 31},

{4, 7, 19, 26, 30, 33, 34}}

Adapting Heike's fine answer from the prior question:

```
pairs //. x_ :> Union @@@ Gather[x, # ⋂ #2 =!= {} &]
```

`{{1, 6, 10, 13, 36}, {12, 14, 16, 23}, {11, 21, 22, 35}, {3, 5, 9}, {17, 20, 24, 25, 28, 32}, {4, 7, 19, 26, 30, 33, 34}, {2, 8, 15, 18, 27, 29, 31}}`

Here's code for version 7:

```
Needs["Combinatorica`"]
gr = FromUnorderedPairs @ pairs;
ConnectedComponents @ gr
```

`{{1, 6, 10, 13, 36}, {2, 8, 15, 18, 27, 29, 31}, {3, 5, 9}, {4, 7, 19, 26, 30, 33, 34}, {11, 21, 22, 35}, {12, 14, 16, 23}, {17, 20, 24, 25, 28, 32}}`

```
GraphPlot[gr, VertexLabeling -> True]
```