DecomposedMat( mat )
finds if the square matrix mat admits a block decomposition.
Define a graph G with vertices [1..Length(mat)] and with an edge
between i and j if either mat[i][j] or mat[j][i] is non-zero.
DecomposedMat return a list of lists l such that l[1],l[2], etc..
are the vertices in each connected component of G. In other words, the
matrices mat{l[1]}{l[1]},mat{l[2]}{l[2]}, etc... are blocks of
the matrix mat.
gap> m := [ [ 0, 0, 0, 1 ],
> [ 0, 0, 1, 0 ],
> [ 0, 1, 0, 0 ],
> [ 1, 0, 0, 0 ] ];;
gap> DecomposedMat( m );
[ [ 1, 4 ], [ 2, 3 ] ]
gap> PrintArray( m{[ 1, 4 ]}{[ 1, 4 ]});
[ [ 0, 1 ],
[ 1, 0 ] ]
GAP 3.4.4