%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%A  autiso.tex              DESIGN documentation              Leonard Soicher
%
%
%
\def\DESIGN{\sf DESIGN}
\def\GRAPE{\sf GRAPE}
\def\nauty{\it nauty}
\def\bliss{\it bliss}
\def\Aut{{\rm Aut}\,}

\Chapter{Automorphism groups and isomorphism testing for block designs}

The functions in this chapter depend on {\nauty} \cite{Nau90}, \cite{MP14}
or {\bliss} \cite{JK07} via the {\GRAPE} package, which must be fully
installed in order for these functions to work.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Computing automorphism groups}

\>AutGroupBlockDesign( <D> )

This function returns the automorphism group of the block design <D>.
The *automorphism group* $\Aut(<D>)$ of <D> is the group consisting of
all the permutations of the points $\{1,\ldots,`<D>\.v'\}$ which preserve
the block-multiset of <D>.

This function is not yet implemented for non-binary block designs.

This function can also be called via `AutomorphismGroup(<D>)'.

\beginexample
gap> D:=PGPointFlatBlockDesign(2,3,1);; # projective plane of order 3
gap> Size(AutGroupBlockDesign(D));                            
5616
\endexample

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Testing isomorphism}

\>IsIsomorphicBlockDesign( <D1>, <D2> )

This boolean function returns `true' if and only if block designs
<D1> and <D2> are *isomorphic*, that is, there is a bijection from the
point-set of <D1> to that of <D2> which maps the block-multiset of <D1>
to that of <D2>.

This function is not yet implemented for non-binary block designs.

For pairwise isomorphism testing for three or more binary block designs,
see "BlockDesignIsomorphismClassRepresentatives".

\beginexample
gap> D1:=BlockDesign(3,[[1],[1,2,3],[2]]);;
gap> D2:=BlockDesign(3,[[1],[1,2,3],[3]]);;
gap> IsIsomorphicBlockDesign(D1,D2);
true
gap> D3:=BlockDesign(4,[[1],[1,2,3],[3]]);;
gap> IsIsomorphicBlockDesign(D2,D3);        
false
gap> # block designs with different numbers of points are not isomorphic
\endexample

\>BlockDesignIsomorphismClassRepresentatives( <L> )

Given a list <L> of binary block designs, this function returns a list
consisting of pairwise non-isomorphic elements of <L>, representing all
the isomorphism classes of elements of <L>. The order of the elements
in the returned list may differ from their order in <L>.

\beginexample 
gap> D1:=BlockDesign(3,[[1],[1,2,3],[2]]);;
gap> D2:=BlockDesign(3,[[1],[1,2,3],[3]]);;
gap> D3:=BlockDesign(4,[[1],[1,2,3],[3]]);; 
gap> BlockDesignIsomorphismClassRepresentatives([D1,D2,D3]);
[ rec( isBlockDesign := true, v := 4, blocks := [ [ 1 ], [ 1, 2, 3 ], [ 3 ] ],
      isBinary := true ), 
  rec( isBlockDesign := true, v := 3, blocks := [ [ 1 ], [ 1, 2, 3 ], [ 2 ] ],
      isBinary := true ) ]
\endexample
