% generated by GAPDoc2LaTeX from XML source (Frank Luebeck)
\documentclass[a4paper,11pt]{report}

\usepackage[top=37mm,bottom=37mm,left=27mm,right=27mm]{geometry}
\sloppy
\pagestyle{myheadings}
\usepackage{amssymb}
\usepackage[utf8]{inputenc}
\usepackage{makeidx}
\makeindex
\usepackage{color}
\definecolor{FireBrick}{rgb}{0.5812,0.0074,0.0083}
\definecolor{RoyalBlue}{rgb}{0.0236,0.0894,0.6179}
\definecolor{RoyalGreen}{rgb}{0.0236,0.6179,0.0894}
\definecolor{RoyalRed}{rgb}{0.6179,0.0236,0.0894}
\definecolor{LightBlue}{rgb}{0.8544,0.9511,1.0000}
\definecolor{Black}{rgb}{0.0,0.0,0.0}

\definecolor{linkColor}{rgb}{0.0,0.0,0.554}
\definecolor{citeColor}{rgb}{0.0,0.0,0.554}
\definecolor{fileColor}{rgb}{0.0,0.0,0.554}
\definecolor{urlColor}{rgb}{0.0,0.0,0.554}
\definecolor{promptColor}{rgb}{0.0,0.0,0.589}
\definecolor{brkpromptColor}{rgb}{0.589,0.0,0.0}
\definecolor{gapinputColor}{rgb}{0.589,0.0,0.0}
\definecolor{gapoutputColor}{rgb}{0.0,0.0,0.0}

%%  for a long time these were red and blue by default,
%%  now black, but keep variables to overwrite
\definecolor{FuncColor}{rgb}{0.0,0.0,0.0}
%% strange name because of pdflatex bug:
\definecolor{Chapter }{rgb}{0.0,0.0,0.0}
\definecolor{DarkOlive}{rgb}{0.1047,0.2412,0.0064}


\usepackage{fancyvrb}

\usepackage{mathptmx,helvet}
\usepackage[T1]{fontenc}
\usepackage{textcomp}


\usepackage[
            pdftex=true,
            bookmarks=true,        
            a4paper=true,
            pdftitle={Written with GAPDoc},
            pdfcreator={LaTeX with hyperref package / GAPDoc},
            colorlinks=true,
            backref=page,
            breaklinks=true,
            linkcolor=linkColor,
            citecolor=citeColor,
            filecolor=fileColor,
            urlcolor=urlColor,
            pdfpagemode={UseNone}, 
           ]{hyperref}

\newcommand{\maintitlesize}{\fontsize{50}{55}\selectfont}

% write page numbers to a .pnr log file for online help
\newwrite\pagenrlog
\immediate\openout\pagenrlog =\jobname.pnr
\immediate\write\pagenrlog{PAGENRS := [}
\newcommand{\logpage}[1]{\protect\write\pagenrlog{#1, \thepage,}}
%% were never documented, give conflicts with some additional packages

\newcommand{\GAP}{\textsf{GAP}}

%% nicer description environments, allows long labels
\usepackage{enumitem}
\setdescription{style=nextline}

%% depth of toc
\setcounter{tocdepth}{1}





%% command for ColorPrompt style examples
\newcommand{\gapprompt}[1]{\color{promptColor}{\bfseries #1}}
\newcommand{\gapbrkprompt}[1]{\color{brkpromptColor}{\bfseries #1}}
\newcommand{\gapinput}[1]{\color{gapinputColor}{#1}}


\begin{document}

\logpage{[ 0, 0, 0 ]}
\begin{titlepage}
\mbox{}\vfill

\begin{center}{\maintitlesize \textbf{ SmallGrp \\
\mbox{}}}\\
\vfill

\hypersetup{pdftitle={ SmallGrp }}
\markright{\scriptsize \mbox{}\hfill  SmallGrp  \hfill\mbox{}}
{\Huge \textbf{ The \textsf{GAP} Small Groups Library \\
\mbox{}}}\\
\vfill

{\Huge  1.7.0 \mbox{}}\\[1cm]
{ 18 August 2026 \mbox{}}\\[1cm]
\mbox{}\\[2cm]
{\Large \textbf{\strut  Hans Ulrich Besche  \strut\mbox{}}}\\
{\Large \textbf{\strut  Bettina Eick     \strut\mbox{}}}\\
{\Large \textbf{\strut  Eamonn O'Brien     \strut\mbox{}}}\\
\hypersetup{pdfauthor={ Hans Ulrich Besche ;  Bettina Eick    ;  Eamonn O'Brien    }}
\end{center}\vfill

\mbox{}\\
{\mbox{}\\
\small \noindent \textbf{ Bettina Eick    }  Email: \href{mailto://beick@tu-bs.de} {\texttt{beick@tu\texttt{\symbol{45}}bs.de}}\\
  Homepage: \href{http://www.iaa.tu-bs.de/beick} {\texttt{http://www.iaa.tu\texttt{\symbol{45}}bs.de/beick}}\\
  Address: \begin{minipage}[t]{8cm}\noindent
 Institut Analysis und Algebra\\
 TU Braunschweig\\
 Universit{\"a}tsplatz 2\\
 D\texttt{\symbol{45}}38106 Braunschweig\\
 Germany\\
 \end{minipage}
}\\
{\mbox{}\\
\small \noindent \textbf{ Eamonn O'Brien    }  Email: \href{mailto://obrien@math.auckland.ac.nz} {\texttt{obrien@math.auckland.ac.nz}}\\
  Homepage: \href{https://www.math.auckland.ac.nz/~obrien} {\texttt{https://www.math.auckland.ac.nz/\texttt{\symbol{126}}obrien}}\\
  Address: \begin{minipage}[t]{8cm}\noindent
 Department of Mathematics\\
 University of Auckland\\
 Private Bag 92019\\
 Auckland\\
 New Zealand\\
 \end{minipage}
}\\
\end{titlepage}

\newpage\setcounter{page}{2}
\newpage

\def\contentsname{Contents\logpage{[ 0, 0, 1 ]}}

\tableofcontents
\newpage

  
\chapter{\textcolor{Chapter }{The Small Groups Library}}\label{Small Groups}
\logpage{[ 1, 0, 0 ]}
\hyperdef{L}{X7C16EA1580AC7586}{}
{
   
\section{\textcolor{Chapter }{Overview}}\label{Overview}
\logpage{[ 1, 1, 0 ]}
\hyperdef{L}{X8389AD927B74BA4A}{}
{
  The Small Groups library gives access to all groups of certain ``small'' orders. The groups are sorted by their orders and they are listed up to
isomorphism; that is, for each of the available orders a complete and
irredundant list of isomorphism type representatives of groups is given.
Currently, the library contains the following groups: 

 
\begin{itemize}
\item  those of order at most 2000 except 1024 {\nobreakspace} ($423\;164\;062$ groups); 
\item  those of cubefree order at most 50 000 {\nobreakspace} ($395 \; 703$ groups); 
\item  those of order $p^7$ for the primes $p = 3,5,7,11$ {\nobreakspace} ($907 \; 489$ groups); 
\item  those of order $p^n$ for $n \leq 6$ and all primes $p$; 
\item  those of order $q^n \cdot p$ for $q^n$ dividing $2^8$, $3^6$, $5^5$ or $7^4$ and all primes $p$ with $p \neq q$; 
\item  those of squarefree order; 
\item  those whose order factorises into at most 3 primes. 
\end{itemize}
 

 The first three items in this list cover an explicit range of orders; the last
four provide access to infinite families of groups having orders of certain
types. 

 The library also has an identification function: it returns the library number
of a given group. This function determines library numbers using invariants of
groups. The function is available for all orders in the library except for the
orders 512 and 1536 and except for the orders $p^5$, $p^6$ and $p^7$ above 2000. 

 The library is organised in 11 layers. Each layer contains the groups of
certain orders and their corresponding group identification routines. It is
possible to install the first $n$ layers of the group library and the first $m$ layers of the group identification for each $1 \leq m \leq n \leq 11$. This might be useful to save disk space. Which orders belong to which layer
is described in Chapter \ref{Organisation}, along with detailed information on how the groups were determined, how they
are stored, and how they are identified. 

 The data in this library has been carefully checked and
cross\texttt{\symbol{45}}checked. It is believed to be reliable. However, no
absolute guarantees are given and users should, as always, make their own
checks in critical cases. 

 This library has been constructed by Hans Ulrich Besche, Bettina Eick and
E.{\nobreakspace}A.{\nobreakspace}O'Brien. A survey on this topic and an
account of the history of group constructions can be found in \cite{BEO01}. Further detailed information on the construction of this library is
available in \cite{New77}, \cite{OBr90}, \cite{OBr91}, \cite{BescheEick98}, \cite{BescheEick1000}, \cite{BescheEick768}, \cite{BEO00}, \cite{EOB99}, \cite{EOB98}, \cite{NOV04}, \cite{Gir03}, \cite{DEi05}, \cite{OV05}. \index{TwoGroup library@\texttt{TwoGroup} library} \index{ThreeGroup library@\texttt{ThreeGroup} library} The Small Groups library incorporates the \textsf{GAP}{\nobreakspace}3 libraries \texttt{TwoGroup} and \texttt{ThreeGroup}. The data from these libraries was directly included into the Small Groups
library, and the ordering there was preserved. The Small Groups library
replaces the \textsf{GAP}{\nobreakspace}3 library of solvable groups of order at most 100. However,
both the organisation and the data descriptions of these groups have changed
in the Small Groups library. 

 As of version 1.4 of this library, the arrangement of groups is the same as in
Magma, version 2.23. In earlier releases of this library, the arrangement in
orders $p^7$, $p=3,5,7,11$ disagreed. An attempt to fix this was made in version 1.1 of this library, but
a wrong permutation was used. If you would like to refer to index numbers for
these orders in older versions of the library, see \texttt{SMALL{\textunderscore}GROUPS{\textunderscore}OLD{\textunderscore}ORDER} (\ref{SMALLuScoreGROUPSuScoreOLDuScoreORDER}). The arrangement of all other orders has always agreed and has remained
stable. 

 In version 1.5, the number of groups of order 1024 was corrected. For more
information, refer to \cite{Burrell2021}. }

  
\section{\textcolor{Chapter }{Related packages}}\label{Related packages}
\logpage{[ 1, 2, 0 ]}
\hyperdef{L}{X798A00DF83317752}{}
{
  Several other \textsf{GAP} packages give access to groups of orders which are not covered by this
library, or which are covered only in part. A package can make its groups
available through the functions of this chapter by calling \texttt{SmallGroupsAddLayer} (\ref{SmallGroupsAddLayer}). 

 \index{SglPPow package@\textsf{SglPPow} package} The \textsf{SglPPow} package provides the groups of order $p^7$ for primes $p > 11$ and the groups of order $3^8$. It extends this library: once it is loaded, its groups are available through
the usual functions \texttt{SmallGroup} (\ref{SmallGroup:for group order and index}), \texttt{NumberSmallGroups} (\ref{NumberSmallGroups}) and so on, and \texttt{SmallGroupsAvailable} (\ref{SmallGroupsAvailable}) takes them into account. See \href{https://gap-packages.github.io/sglppow/} {\texttt{https://gap\texttt{\symbol{45}}packages.github.io/sglppow/}}. 

 \index{SOTGrps package@\textsf{SOTGrps} package} The \textsf{SOTGrps} package constructs and identifies the groups whose order factorises into at
most 4 primes, as well as those of order $p^4 q$ for distinct primes $p$ and $q$. It extends this library for those of its orders this one does not cover, and
comes with its own functions \texttt{SOTGroup}, \texttt{AllSOTGroups} and \texttt{IdSOTGroup} for all of them. Be aware that where the orders covered by both overlap, the
numbering used by \textsf{SOTGrps} in general differs from the one used here. See \href{https://gap-packages.github.io/sotgrps/} {\texttt{https://gap\texttt{\symbol{45}}packages.github.io/sotgrps/}}. }

 
\section{\textcolor{Chapter }{Function Reference}}\label{Reference}
\logpage{[ 1, 3, 0 ]}
\hyperdef{L}{X7ECCCA82839EA283}{}
{
  

\subsection{\textcolor{Chapter }{SmallGroup (for group order and index)}}
\logpage{[ 1, 3, 1 ]}\nobreak
\hyperdef{L}{X8398F2577B719D99}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{SmallGroup({\mdseries\slshape order, i})\index{SmallGroup@\texttt{SmallGroup}!for group order and index}
\label{SmallGroup:for group order and index}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{SmallGroup({\mdseries\slshape pair})\index{SmallGroup@\texttt{SmallGroup}!for a pair [ order, index ]}
\label{SmallGroup:for a pair [ order, index ]}
}\hfill{\scriptsize (function)}}\\


 returns the \mbox{\texttt{\mdseries\slshape i}}\texttt{\symbol{45}}th group of order \mbox{\texttt{\mdseries\slshape order}} in the catalogue. If the group is solvable, it will be given as a PcGroup;
otherwise it will be given as a permutation group. If the groups of order \mbox{\texttt{\mdseries\slshape order}} are not installed, the function reports an error and enters a break loop. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@G := SmallGroup( 60, 4 );|
  <pc group of size 60 with 4 generators>
  !gapprompt@gap>| !gapinput@StructureDescription( G );|
  "C60"
  !gapprompt@gap>| !gapinput@G := SmallGroup( 60, 5 );|
  Group([ (1,2,3,4,5), (1,2,3) ])
  !gapprompt@gap>| !gapinput@StructureDescription( G );|
  "A5"
  !gapprompt@gap>| !gapinput@G := SmallGroup( 768, 1000000 );|
  <pc group of size 768 with 9 generators>
  !gapprompt@gap>| !gapinput@G := SmallGroup( [768, 1000000] );|
  <pc group of size 768 with 9 generators>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{SmallGroupsAvailable}}
\logpage{[ 1, 3, 2 ]}\nobreak
\hyperdef{L}{X781EA70A7902B22C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{SmallGroupsAvailable({\mdseries\slshape order})\index{SmallGroupsAvailable@\texttt{SmallGroupsAvailable}}
\label{SmallGroupsAvailable}
}\hfill{\scriptsize (function)}}\\


 returns \texttt{true} if the library of groups of order \mbox{\texttt{\mdseries\slshape order}} is installed, and \texttt{false} otherwise. }

 

\subsection{\textcolor{Chapter }{AllSmallGroups}}
\logpage{[ 1, 3, 3 ]}\nobreak
\hyperdef{L}{X7BB133CB7AA8F465}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{AllSmallGroups({\mdseries\slshape arg})\index{AllSmallGroups@\texttt{AllSmallGroups}}
\label{AllSmallGroups}
}\hfill{\scriptsize (function)}}\\


 returns all groups with certain properties as specified by \mbox{\texttt{\mdseries\slshape arg}}. If \mbox{\texttt{\mdseries\slshape arg}} is a number $n$, then this function returns all groups of order $n$. However, the function can also take several arguments which then must be
organised in pairs \texttt{function} and \texttt{value}. In this case the first function must be \texttt{Size} (\textbf{Reference: Size}) and the first value an order or a range of orders. If a value is a list then
it is considered a list of possible function values to include. The function
returns those groups of the specified orders having those properties specified
by the remaining functions and their values. 

 Some selection criteria are \emph{indexed}: their value follows from the position a group has in the library, so a
selection using only such criteria constructs no group at all. Any other
criterion is checked group by group, at a cost proportional to the number of
groups of the given orders. 

 For the orders whose factorisation has more than three prime factors, \texttt{IsNilpotentGroup} (\textbf{Reference: IsNilpotentGroup}), \texttt{IsSupersolvableGroup} (\textbf{Reference: IsSupersolvableGroup}) and \texttt{IsSolvableGroup} (\textbf{Reference: IsSolvableGroup}) are indexed, except \texttt{IsSupersolvableGroup} (\textbf{Reference: IsSupersolvableGroup}) for the cubefree orders above $2000$ which are not squarefree, and so is \texttt{IsAbelian} (\textbf{Reference: IsAbelian}), except for $p^5$ with $p \geq 7$. For the prime powers $p^n$ with $n \geq 4$, \texttt{RankPGroup} (\textbf{Reference: RankPGroup}) is indexed except for $p^6$ with $p \geq 11$ and for $7^7$ and $11^7$, and \texttt{PClassPGroup} (\textbf{Reference: PClassPGroup}) except for those and for $p^4$ with $p \geq 11$ and $p^5$ with $p \geq 7$. \texttt{LGLength} (\textbf{Reference: LGLength}), \texttt{FrattinifactorSize} and \texttt{FrattinifactorId} are indexed for the orders of at most $2000$ with more than three prime factors, except $512$, $768$, $1024$, $1152$, $1536$, $1920$ and $p^n \cdot q > 1000$ with $n > 2$. 

 Orders with at most three prime factors are not indexed; no such order below $50000$ has more than 13 groups. 

 \texttt{SmallGroupsInformation} (\ref{SmallGroupsInformation}) reports which criteria are indexed for a given order. 

 \texttt{IdsOfAllSmallGroups} (\ref{IdsOfAllSmallGroups}) returns the ids of these groups instead of the groups themselves, and \texttt{NumberSmallGroups} (\ref{NumberSmallGroups}) just their number. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@AllSmallGroups( 6 );|
  [ <pc group of size 6 with 2 generators>, 
    <pc group of size 6 with 2 generators> ]
  !gapprompt@gap>| !gapinput@AllSmallGroups( 60, IsNilpotentGroup );|
  [ <pc group of size 60 with 4 generators>, 
    <pc group of size 60 with 4 generators> ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{OneSmallGroup}}
\logpage{[ 1, 3, 4 ]}\nobreak
\hyperdef{L}{X875EB1167FF6BA82}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{OneSmallGroup({\mdseries\slshape arg})\index{OneSmallGroup@\texttt{OneSmallGroup}}
\label{OneSmallGroup}
}\hfill{\scriptsize (function)}}\\


 returns one group with certain properties as specified by \mbox{\texttt{\mdseries\slshape arg}}. The permitted arguments are those supported by \texttt{AllSmallGroups} (\ref{AllSmallGroups}). 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@G := OneSmallGroup( 6, IsAbelian );|
  <pc group of size 6 with 2 generators>
  !gapprompt@gap>| !gapinput@StructureDescription( G );|
  "C6"
  !gapprompt@gap>| !gapinput@G := OneSmallGroup( 6, IsAbelian, false );|
  <pc group of size 6 with 2 generators>
  !gapprompt@gap>| !gapinput@StructureDescription( G );|
  "S3"
  !gapprompt@gap>| !gapinput@G := OneSmallGroup( Size, [1..1000], IsSolvableGroup, false );|
  Group([ (1,2,3,4,5), (1,2,3) ])
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{NumberSmallGroups}}
\logpage{[ 1, 3, 5 ]}\nobreak
\hyperdef{L}{X7C587F2A82BEAD19}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{NumberSmallGroups({\mdseries\slshape order[, func1, val1, ...]})\index{NumberSmallGroups@\texttt{NumberSmallGroups}}
\label{NumberSmallGroups}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{NrSmallGroups({\mdseries\slshape order[, func1, val1, ...]})\index{NrSmallGroups@\texttt{NrSmallGroups}}
\label{NrSmallGroups}
}\hfill{\scriptsize (function)}}\\


 returns the number of groups of order \mbox{\texttt{\mdseries\slshape order}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@NumberSmallGroups( 512 );|
  10494213
  !gapprompt@gap>| !gapinput@NumberSmallGroups( 2^8 * 23 );|
  1083472
  !gapprompt@gap>| !gapinput@NumberSmallGroups( 4096 );|
  Error, the library of groups of size 4096 is not available
\end{Verbatim}
 

 The function also accepts the arguments of \texttt{AllSmallGroups} (\ref{AllSmallGroups}) and counts the groups that function would return. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@NumberSmallGroups( [ 1 .. 100 ] );|
  1048
  !gapprompt@gap>| !gapinput@NumberSmallGroups( 96, IsAbelian );|
  7
\end{Verbatim}
 

 Orders alone are answered from the numbers of groups. Otherwise the cost is
that of \texttt{IdsOfAllSmallGroups} (\ref{IdsOfAllSmallGroups}): the indexed criteria are applied first, whatever order the criteria are
given in, and only the groups a remaining criterion must be tested on are
constructed. }

 

\subsection{\textcolor{Chapter }{NumberSmallGroupsAvailable}}
\logpage{[ 1, 3, 6 ]}\nobreak
\hyperdef{L}{X872991747D5CFD35}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{NumberSmallGroupsAvailable({\mdseries\slshape order})\index{NumberSmallGroupsAvailable@\texttt{NumberSmallGroupsAvailable}}
\label{NumberSmallGroupsAvailable}
}\hfill{\scriptsize (function)}}\\


 returns \texttt{true} if the number of groups of order \mbox{\texttt{\mdseries\slshape order}} is known, and \texttt{false} otherwise. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@NumberSmallGroupsAvailable( 100 );|
  true
  !gapprompt@gap>| !gapinput@NumberSmallGroups( 100 );|
  16
  !gapprompt@gap>| !gapinput@NumberSmallGroupsAvailable( 4096 );|
  false
  !gapprompt@gap>| !gapinput@NumberSmallGroups( 4096 );|
  Error, the library of groups of size 4096 is not available
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{SelectSmallGroups}}
\logpage{[ 1, 3, 7 ]}\nobreak
\hyperdef{L}{X7B5A1FD47C722EB2}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{SelectSmallGroups({\mdseries\slshape argl, all, id})\index{SelectSmallGroups@\texttt{SelectSmallGroups}}
\label{SelectSmallGroups}
}\hfill{\scriptsize (function)}}\\


 universal function for \texttt{AllSmallGroups}, \texttt{OneSmallGroup} and \texttt{IdsOfAllSmallGroups}. }

 

\subsection{\textcolor{Chapter }{IdSmallGroup}}
\logpage{[ 1, 3, 8 ]}\nobreak
\hyperdef{L}{X83044B9D7E3BDF35}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IdSmallGroup({\mdseries\slshape G})\index{IdSmallGroup@\texttt{IdSmallGroup}}
\label{IdSmallGroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IdGroup({\mdseries\slshape G})\index{IdGroup@\texttt{IdGroup}}
\label{IdGroup}
}\hfill{\scriptsize (attribute)}}\\


 returns the library number of \mbox{\texttt{\mdseries\slshape G}}; that is, the function returns a pair \texttt{[\mbox{\texttt{\mdseries\slshape order}}, \mbox{\texttt{\mdseries\slshape i}}]} where \mbox{\texttt{\mdseries\slshape G}} is isomorphic to \texttt{SmallGroup( \mbox{\texttt{\mdseries\slshape order}}, \mbox{\texttt{\mdseries\slshape i}} )}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@IdSmallGroup( GL( 2,3 ) );|
  [ 48, 29 ]
  !gapprompt@gap>| !gapinput@IdSmallGroup( Group( (1,2,3,4),(4,5) ) );|
  [ 120, 34 ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IdGroupsAvailable}}
\logpage{[ 1, 3, 9 ]}\nobreak
\hyperdef{L}{X7C0C616180DE5875}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IdGroupsAvailable({\mdseries\slshape order})\index{IdGroupsAvailable@\texttt{IdGroupsAvailable}}
\label{IdGroupsAvailable}
}\hfill{\scriptsize (function)}}\\


 returns \texttt{true} if the identification routines for groups of order \mbox{\texttt{\mdseries\slshape order}} are installed, and \texttt{false} otherwise. }

 

\subsection{\textcolor{Chapter }{IdsOfAllSmallGroups}}
\logpage{[ 1, 3, 10 ]}\nobreak
\hyperdef{L}{X85352440869327EC}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IdsOfAllSmallGroups({\mdseries\slshape arg})\index{IdsOfAllSmallGroups@\texttt{IdsOfAllSmallGroups}}
\label{IdsOfAllSmallGroups}
}\hfill{\scriptsize (function)}}\\


 similar to \texttt{AllSmallGroups} but returns ids instead of groups. This may prevent workspace overflows if a
large number of groups are expected in the output. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@IdsOfAllSmallGroups( 60, IsNilpotentGroup );|
  [ [ 60, 4 ], [ 60, 13 ] ]
  !gapprompt@gap>| !gapinput@IdsOfAllSmallGroups( 60, IsNilpotentGroup, false );|
  [ [ 60, 1 ], [ 60, 2 ], [ 60, 3 ], [ 60, 5 ], [ 60, 6 ], [ 60, 7 ], 
    [ 60, 8 ], [ 60, 9 ], [ 60, 10 ], [ 60, 11 ], [ 60, 12 ] ]
  !gapprompt@gap>| !gapinput@IdsOfAllSmallGroups( Size, 60, IsSupersolvableGroup, true );|
  [ [ 60, 1 ], [ 60, 2 ], [ 60, 3 ], [ 60, 4 ], [ 60, 6 ], [ 60, 7 ], 
    [ 60, 8 ], [ 60, 10 ], [ 60, 11 ], [ 60, 12 ], [ 60, 13 ] ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IdGap3SolvableGroup}}
\logpage{[ 1, 3, 11 ]}\nobreak
\hyperdef{L}{X8162304487D0C3E2}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IdGap3SolvableGroup({\mdseries\slshape G})\index{IdGap3SolvableGroup@\texttt{IdGap3SolvableGroup}}
\label{IdGap3SolvableGroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Gap3CatalogueIdGroup({\mdseries\slshape G})\index{Gap3CatalogueIdGroup@\texttt{Gap3CatalogueIdGroup}}
\label{Gap3CatalogueIdGroup}
}\hfill{\scriptsize (attribute)}}\\


 returns the catalogue number of \mbox{\texttt{\mdseries\slshape G}} in the \textsf{GAP}{\nobreakspace}3 catalogue of solvable groups; that is, the function returns a
pair \texttt{[\mbox{\texttt{\mdseries\slshape order}}, \mbox{\texttt{\mdseries\slshape i}}]} meaning that \mbox{\texttt{\mdseries\slshape G}} is isomorphic to the group \texttt{SolvableGroup( \mbox{\texttt{\mdseries\slshape order}}, \mbox{\texttt{\mdseries\slshape i}} )} in \textsf{GAP}{\nobreakspace}3. }

 

\subsection{\textcolor{Chapter }{SmallGroupsInformation}}
\logpage{[ 1, 3, 12 ]}\nobreak
\hyperdef{L}{X833DB8AB80B76D26}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{SmallGroupsInformation({\mdseries\slshape order})\index{SmallGroupsInformation@\texttt{SmallGroupsInformation}}
\label{SmallGroupsInformation}
}\hfill{\scriptsize (function)}}\\


 prints information on the groups of the specified order. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@SmallGroupsInformation( 32 );|
  
    There are 51 groups of order 32.
    They are sorted by their ranks. 
       1 is cyclic. 
       2 - 20 have rank 2.
       21 - 44 have rank 3.
       45 - 50 have rank 4.
       51 is elementary abelian. 
  
    The following selection criteria are indexed for this size:
       IsAbelian, IsNilpotentGroup, IsSupersolvableGroup, IsSolvableGroup,
       PClassPGroup, RankPGroup, FrattinifactorSize and FrattinifactorId.
  
    This size belongs to layer 2 of the SmallGroups library. 
    IdSmallGroup is available for this size. 
   
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{SmallGroupsAddLayer}}
\logpage{[ 1, 3, 13 ]}\nobreak
\hyperdef{L}{X8691B7D27832FA22}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{SmallGroupsAddLayer({\mdseries\slshape desc})\index{SmallGroupsAddLayer@\texttt{SmallGroupsAddLayer}}
\label{SmallGroupsAddLayer}
}\hfill{\scriptsize (function)}}\\


 adds a further layer to the library, described by the record \mbox{\texttt{\mdseries\slshape desc}}. Its groups then become available through \texttt{SmallGroup} (\ref{SmallGroup:for group order and index}), \texttt{NumberSmallGroups} (\ref{NumberSmallGroups}), \texttt{AllSmallGroups} (\ref{AllSmallGroups}) and the other functions of this chapter. The components of \mbox{\texttt{\mdseries\slshape desc}} are: 
\begin{description}
\item[{\texttt{name}}]  a string naming the layer. Must be unique. Can be used by other layers to
refer to this one. 
\item[{\texttt{available}}]  a function taking an order and either returning \texttt{fail}, to indicate this layer does not handle the given order; or else a record
which is handed to the functions below as \mbox{\texttt{\mdseries\slshape inforec}}. The component \texttt{number} of the returned record, if present, is the number of groups of that order. 
\item[{\texttt{group}}]  a function \texttt{( \mbox{\texttt{\mdseries\slshape order}}, \mbox{\texttt{\mdseries\slshape i}}, \mbox{\texttt{\mdseries\slshape inforec}} )} returning the \mbox{\texttt{\mdseries\slshape i}}\texttt{\symbol{45}}th group of that order. 
\item[{\texttt{idAvailable}}]  optional, a function taking an order and either returning \texttt{fail}, to indicate this layer does not handle identification of groups of the given
order; or else a record which is handed to the function \texttt{id} below as \mbox{\texttt{\mdseries\slshape idrec}}. Defaults to \texttt{available}, so it is only needed where the identification covers other orders than the
construction, or wants a record of its own. If \texttt{idAvailable} is defined then \texttt{id} must also be provided. 
\item[{\texttt{id}}]  optional, a function \texttt{( \mbox{\texttt{\mdseries\slshape G}}, \mbox{\texttt{\mdseries\slshape idrec}} )} returning the index of \mbox{\texttt{\mdseries\slshape G}} among the groups of its order. Without it \texttt{IdSmallGroup} (\ref{IdSmallGroup}) stays unavailable for these orders. 
\item[{\texttt{number}}]  optional, a function \texttt{( \mbox{\texttt{\mdseries\slshape order}}, \mbox{\texttt{\mdseries\slshape inforec}} )} returning the number of groups of that order. Only needed if \texttt{available} does not report this count. 
\item[{\texttt{information}}]  optional, a function \texttt{( \mbox{\texttt{\mdseries\slshape order}}, \mbox{\texttt{\mdseries\slshape inforec}}, \mbox{\texttt{\mdseries\slshape number}} )} printing what \texttt{SmallGroupsInformation} (\ref{SmallGroupsInformation}) should say about that order beyond the number of groups. 
\item[{\texttt{properties}}]  optional, a function \texttt{( \mbox{\texttt{\mdseries\slshape order}}, \mbox{\texttt{\mdseries\slshape inforec}} )} reporting which selection criteria the \texttt{select} and \texttt{count} functions of this layer can deduce from the position of the groups alone, so
that \texttt{SelectSmallGroups} (\ref{SelectSmallGroups}) and \texttt{NumberSmallGroups} (\ref{NumberSmallGroups}) need not construct the groups to decide these criteria. 
\item[{\texttt{select}, \texttt{count}}]  optional, how \texttt{SelectSmallGroups} (\ref{SelectSmallGroups}) and \texttt{NumberSmallGroups} (\ref{NumberSmallGroups}) are to work through this layer. By default the groups of the order are
constructed one by one and tested. 
\item[{\texttt{before}, \texttt{after}}]  optional lists of names of other layers, to be consulted after respectively
before this one. A name that is not registered is ignored, so wishing about a
package that is not loaded does no harm. The layers of this package are
themselves one layer, named \texttt{"SmallGrp"}, which without a wish to the contrary comes first. 
\end{description}
 Where two layers cover an order, the one consulted first wins. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  SmallGroupsAddLayer( rec(
      name := "SOTGrps",
      available := function( order )
          if not IsSOTAvailable( order ) then
              return fail;
          fi;
          return rec( number := NumberOfSOTGroups( order ) );
      end,
      group := { order, i, inforec } -> SOTGroup( order, i ),
      id := { G, inforec } -> IdSOTGroup( G )[2] ) );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{UnloadSmallGroupsData}}
\logpage{[ 1, 3, 14 ]}\nobreak
\hyperdef{L}{X850CC04E7855FF68}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{UnloadSmallGroupsData({\mdseries\slshape })\index{UnloadSmallGroupsData@\texttt{UnloadSmallGroupsData}}
\label{UnloadSmallGroupsData}
}\hfill{\scriptsize (function)}}\\


 \textsf{GAP} loads all necessary data from the library automatically, but it does not
delete the data from the workspace again. Usually, this will not be necessary,
since the data is stored in a compressed format. However, if a large number of
groups from the library have been loaded, then the user might wish to remove
the data from the workspace and this can be done by the above function call. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@UnloadSmallGroupsData();|
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{SMALL{\textunderscore}GROUPS{\textunderscore}OLD{\textunderscore}ORDER}}
\logpage{[ 1, 3, 15 ]}\nobreak
\hyperdef{L}{X7CE8AEAF8133285D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{SMALL{\textunderscore}GROUPS{\textunderscore}OLD{\textunderscore}ORDER\index{SMALL{\textunderscore}GROUPS{\textunderscore}OLD{\textunderscore}ORDER@\texttt{SMA}\-\texttt{L}\-\texttt{L{\textunderscore}}\-\texttt{G}\-\texttt{R}\-\texttt{O}\-\texttt{U}\-\texttt{P}\-\texttt{S{\textunderscore}}\-\texttt{O}\-\texttt{L}\-\texttt{D{\textunderscore}}\-\texttt{O}\-\texttt{RDER}}
\label{SMALLuScoreGROUPSuScoreOLDuScoreORDER}
}\hfill{\scriptsize (global variable)}}\\


 If set to \texttt{true}, then groups of order $3^7$, $5^7$, $7^7$, and $11^7$ are ordered in the way they were ordered up to version 1.0 of the package. If
this variable is set to \texttt{false}, which is the default as of version 1.4, then a different ordering, that
agrees with the one in Magma version 2.23, is used. The functions \texttt{SMALLGP{\textunderscore}PERM}$x$, with $x=3,5,7,11$, give the old index position corresponding to a new index position. In
releases 1.1\texttt{\symbol{45}}1.3 a misunderstood ordering, based on the old
ordering and the permutations $(2,30083)(3,30084)(4,30085)(5,30086)$, $(2,104599)(3,104600)(4,104601)(5,104602)$, and $(2,721053)(3,721054)(4,721055)(5,721056)$ respectively, was used. }

 }

 }

  
\chapter{\textcolor{Chapter }{The Organisation of the Small Groups Library}}\label{Organisation}
\logpage{[ 2, 0, 0 ]}
\hyperdef{L}{X7E67567E7C9FEED0}{}
{
  This chapter describes how the Small Groups library is organised. It includes
information on the determination of the groups, on the encoding used to store
them, and on the algorithms used by the identification routines. It is aimed
at readers interested in the internals of the library; it is not needed in
order to use it.  
\section{\textcolor{Chapter }{Layers}}\label{Layers}
\logpage{[ 2, 1, 0 ]}
\hyperdef{L}{X86783E1D85157429}{}
{
  The Small Groups library is organised in 11 layers. Each layer contains the
groups of certain orders: 
\begin{description}
\item[{Layer 1}]  the orders with at most 3 prime factors; that is, the orders of type $p$, $p^2$, $pq$, $p^3$, $pq^2$ and $pqr$. 
\item[{Layer 2}]  all remaining orders at most 1000 except 512 and 768. 
\item[{Layer 3}]  all remaining orders of type $2^n \cdot p$ with $n \leq 8$ and $p$ an arbitrary odd prime. 
\item[{Layer 4}]  the orders $7^4$ and $5^5$ and all remaining orders of type $q^n \cdot p$ with $q^n$ dividing $3^6$, $5^5$ or $7^4$ and $p$ a prime different from $q$. 
\item[{Layer 5}]  all remaining orders at most 2000 except 512, 1024, 1152, 1536 and 1920. 
\item[{Layer 6}]  the orders 1152 and 1920. 
\item[{Layer 7}]  the order 512. 
\item[{Layer 8}]  the order 1536. 
\item[{Layer 9}]  the remaining groups of order $p^4$, $p^5$ and $p^6$. 
\item[{Layer 10}]  the remaining groups of squarefree order and of cubefree order at most 50 000. 
\item[{Layer 11}]  the orders $p^7$ with $p = 3,5,7,11$. 
\end{description}
 

 This setup has been chosen for two reasons. First, the organisation in layers
permits adding new layers (and thus new group orders) without changes to the
existing catalogue. Secondly, it is possible to install a part of the layers
only. This might be interesting for computer systems with little hard disk
space available. 

 For each layer $i$ there are two internal functions \texttt{SMALL{\textunderscore}AVAILABLE{\textunderscore}FUNCS[i]( order )} and \texttt{ID{\textunderscore}AVAILABLE{\textunderscore}FUNCS[i]( order )}. Both functions return \texttt{fail} if the given order is not contained in this layer. Otherwise the functions
return an information record on the layer and the order. This record contains
the information needed to handle the groups of the specified order internally.
If the layer $i$ is not installed, then the entries \texttt{SMALL{\textunderscore}AVAILABLE{\textunderscore}FUNCS[i]} and \texttt{ID{\textunderscore}AVAILABLE{\textunderscore}FUNCS[i]} are unbound. 

 Moreover, there are two internal header functions \texttt{SMALL{\textunderscore}AVAILABLE( order )} and \texttt{ID{\textunderscore}AVAILABLE( order )}. These two functions are used to loop over the layer functions and find the
first layer containing the given order. If this layer is found, then an
information record on the order is returned. If there is no installed layer
containing the groups of this order, then the functions return \texttt{fail}. }

  
\section{\textcolor{Chapter }{Files and Directories}}\label{Files and Directories}
\logpage{[ 2, 2, 0 ]}
\hyperdef{L}{X7C65251A7ADF1053}{}
{
  For each layer $x$ there are either one or two directories in the package directory: \texttt{smallx}, or \texttt{smallx} and \texttt{idx}. The directory \texttt{smallx} contains the groups of layer $x$ and the directory \texttt{idx} contains the corresponding identification routine, if available. An exception
to this rule is the first layer; here all the code for the groups is contained
in the files \texttt{gap/smlgp1.g} and \texttt{gap/idgrp1.g}. For the layers 7, 8 and 11 there is no identification routine available at
the moment and thus there are no directories \texttt{id7}, \texttt{id8} and \texttt{id11}. 

 The other relevant files of the package are: 
\begin{description}
\item[{\texttt{read.g}}]  for loading the small groups catalogue into \textsf{GAP}. 
\item[{\texttt{gap/small.gd}, \texttt{gap/small.gi}}]  these are the files where the main functions for the small groups catalogue
are defined. 
\item[{\texttt{gap/gap3cat.g}}]  identification of a small group in the \textsf{GAP}{\nobreakspace}3 \texttt{SolvableGroup} catalogue. 
\item[{\texttt{gap/smlinfo.gi}}]  the code for the function \texttt{SmallGroupsInformation} (\ref{SmallGroupsInformation}). 
\end{description}
 }

  
\section{\textcolor{Chapter }{Layer 1}}\label{Layer 1}
\logpage{[ 2, 3, 0 ]}
\hyperdef{L}{X84F4A13B84E71CFF}{}
{
  The groups whose order factorises into at most 3 primes have been classified
by H{\"o}lder, see \cite{Hoelder1893}. An algorithm to find the isomorphism type of such groups was first
implemented in \textsf{GAP}{\nobreakspace}3 by Frank Celler and Hans\texttt{\symbol{45}}Georg Esser. 

 H{\"o}lder's classification distinguishes the groups of the following order
types. Let $p$, $q$ and $r$ be different primes with $p < q < r$. 
\begin{description}
\item[{$p$}]  1 cyclic group. 
\item[{$p^2$}]  1 cyclic and 1 elementary abelian group. 
\item[{$p^3$}]  3 abelian groups and 2 extraspecial groups. 
\item[{$pq$}]  1 cyclic group; 1 group of type $q:p$ if $q \equiv 1 \bmod p$. 
\item[{$p^2q$}]  2 abelian groups; 1 group of type $q:p \times p$ if $q \equiv 1 \bmod p$; 1 group of type $A_4$ if $p = 2$ and $q = 3$; 1 group of type $(p \times q).p$ if $q \equiv 1 \bmod p$; 1 group of type $q:C_{p^2}$ if $q \equiv 1 \bmod p^2$. 
\item[{$pq^2$}]  2 abelian groups; 1 group of type $q:p \times q$ if $q \equiv 1 \bmod p$; 1 group of type $C_{q^2}:p$ if $q \equiv 1 \bmod p$; 1 group of type $(q \times q):p$ if $p > 2$ and $q + 1 \equiv 0 \bmod p$; groups of type $q:p + q:p$ (1 group for $p = 2$ and $(p+1)/2$ groups otherwise). 
\item[{$pqr$}]  1 cyclic group; 1 group of type $q:p \times r$ if $q \equiv 1 \bmod p$; 1 group of type $r:p \times q$ if $r \equiv 1 \bmod p$; 1 group of type $r:q \times p$ if $r \equiv 1 \bmod q$; 1 group of type $r:(p \times q)$ if $r \equiv 1 \bmod pq$; $p-1$ groups of type $q:p + r:p$. 
\end{description}
 

 The groups in this layer are stored ``generically''; that is, using functions instead of explicit presentations. The
identification routine follows the classification as well. }

  
\section{\textcolor{Chapter }{Layer 2}}\label{Layer 2}
\logpage{[ 2, 4, 0 ]}
\hyperdef{L}{X7D64342087F99D56}{}
{
  
\subsection{\textcolor{Chapter }{Determination}}\logpage{[ 2, 4, 1 ]}
\hyperdef{L}{X879DAE75858CBEDE}{}
{
 The nilpotent groups of this layer have been constructed using $p$\texttt{\symbol{45}}group generation, see \cite{OBr90} and the \textsf{ANUPQ} package. The 2\texttt{\symbol{45}} and 3\texttt{\symbol{45}}groups of this
layer have also been available in the \texttt{TwoGroup} and \texttt{ThreeGroup} libraries of \textsf{GAP}{\nobreakspace}3, see \cite{JNO90} and \cite{OBr91}. The non\texttt{\symbol{45}}nilpotent groups in this layer have been
determined using the Frattini extension method, the cyclic split extension
method and cyclic extension for the non\texttt{\symbol{45}}solvable groups,
see \cite{BescheEick98}, \cite{BescheEick1000} and \cite{BescheEick768}. }

 
\subsection{\textcolor{Chapter }{Storing}}\logpage{[ 2, 4, 2 ]}
\hyperdef{L}{X85328BB6843CE85F}{}
{
 The solvable groups in this layer are stored by a single long integer
describing a pc presentation of the group (see \texttt{PcGroupCode} (\textbf{Reference: PcGroupCode}) or \cite{BescheEick98}). For $p$\texttt{\symbol{45}}groups the encoded pc presentations are standard
presentations and they are equal to the presentations known in the
2\texttt{\symbol{45}} and 3\texttt{\symbol{45}}groups libraries of \textsf{GAP}{\nobreakspace}3. The non\texttt{\symbol{45}}solvable groups are stored by
generating permutations. }

 
\subsection{\textcolor{Chapter }{Selection arguments}}\logpage{[ 2, 4, 3 ]}
\hyperdef{L}{X79E0CF7784C1D6AE}{}
{
 For the selection functions the values of the following attributes are
precomputed and stored: 
\begin{description}
\item[{for $p$\texttt{\symbol{45}}groups}]  \texttt{IsAbelian} (\textbf{Reference: IsAbelian}), \texttt{PClassPGroup} (\textbf{Reference: PClassPGroup}), \texttt{RankPGroup} (\textbf{Reference: RankPGroup}), \texttt{FrattinifactorSize} and \texttt{FrattinifactorId}. 
\item[{for non\texttt{\symbol{45}}$p$\texttt{\symbol{45}}groups}]  \texttt{IsAbelian} (\textbf{Reference: IsAbelian}), \texttt{IsNilpotentGroup} (\textbf{Reference: IsNilpotentGroup}), \texttt{IsSupersolvableGroup} (\textbf{Reference: IsSupersolvableGroup}), \texttt{IsSolvableGroup} (\textbf{Reference: IsSolvableGroup}), \texttt{LGLength}, \texttt{FrattinifactorSize} and \texttt{FrattinifactorId}. 
\end{description}
 }

 
\subsection{\textcolor{Chapter }{Identification}}\logpage{[ 2, 4, 4 ]}
\hyperdef{L}{X809B03E67FB9361D}{}
{
 The identification routine uses invariants of groups to identify a given
group. The invariants are organised as a tree and stored in \texttt{ID{\textunderscore}GROUP{\textunderscore}TREE}, which contains a leaf for every group. In some cases this invariants tree is
not sufficient to distinguish all groups. In this case the tree is used to
reduce to a small number of possible groups and then a special random
isomorphism test finds the correct group among the possible ones. }

 }

  
\section{\textcolor{Chapter }{Layer 3}}\label{Layer 3}
\logpage{[ 2, 5, 0 ]}
\hyperdef{L}{X7A1447297D9EEDED}{}
{
  
\subsection{\textcolor{Chapter }{Determination}}\logpage{[ 2, 5, 1 ]}
\hyperdef{L}{X879DAE75858CBEDE}{}
{
 These groups have been determined using the generic variation of the cyclic
split extension method and the Frattini extension method, see \cite{BescheEick768}. }

 
\subsection{\textcolor{Chapter }{Storing: nilpotent groups}}\logpage{[ 2, 5, 2 ]}
\hyperdef{L}{X7AFBB2A681C2D4EB}{}
{
 For each order in this layer we first list the nilpotent groups $P \times Q$ where $P$ is the cyclic group of order $p$ and $Q$ is a group of order $2^n$. These groups are sorted by the catalogue number of $Q$ and the group $Q$ is stored in layer 2. }

 
\subsection{\textcolor{Chapter }{Storing: groups with normal Sylow $p$\texttt{\symbol{45}}subgroup}}\logpage{[ 2, 5, 3 ]}
\hyperdef{L}{X8437DA838375A235}{}
{
 Then we consider the remaining groups with normal Sylow $p$\texttt{\symbol{45}}subgroup. These are split extensions of type $P : Q$. The isomorphism type of these groups depends on the isomorphism type of $Q$ and the action homomorphism $Q \to \mathrm{Aut}(P)$. Let $K$ be the kernel of this homomorphism with $[Q : K] = 2^i$ for some $i$. We encode the homomorphisms for fixed $Q$ and fixed $i$ as follows. 

 Consider a generator $g$ of $P$ and let $g_1, \ldots, g_r$ be a generating set of $Q$ (we choose the first $r$ pc generators of $Q$ for $r$ the rank of $Q$). Consider a homomorphism $a : Q \to \mathrm{Aut}(P)$ and let $a_i$ be the image of $g_i$. Clearly, $a_i$ is of the form $a_i : g \to g^{l_i}$ with $0 \leq l_i \leq 2^i-1$. Thus we describe the homomorphism $a$ by the sequence $l_1, \ldots, l_r$. We encode this sequence as a $2^i$\texttt{\symbol{45}}adic number of length $r$; that is, we encode this sequence as $l_1 q^{r-1} + l_2 q^{r-2} + \ldots + l_r q^0$ where $q = 2^i$. Hence each homomorphism $a$ is encoded as an integer and for fixed $Q$ and $i$ we write all these integers into a list. 

 A special case occurs if there are two homomorphisms $a$ and $b$ such that $a_i = b_i^j$ for some integer $j$; that is, the images of $a$ are powers of the images of $b$. In this case $a$ is stored directly after $b$ and we only store the integer $-j$ instead of the encoding for the sequence $l_1, \ldots, l_r$ for $a$. 

 Now we consider the case that for certain $Q$ and $i$ we have a list $L$ consisting of non\texttt{\symbol{45}}negative integers only; that is, the
special power\texttt{\symbol{45}}case did not occur for this group $Q$ and index $i$. In some cases we encode such a list $L$ further. Recall that the integers in $L$ correspond to different homomorphisms. Thus the integers are all different and
we may sort them in increasing order. Then we can store this sorted list as a
binary number; that is, the list $c_1, \ldots, c_s$ is encoded as $2^{c_1-1} + \ldots + 2^{c_s-1}$. This is only useful if the list $L$ does not contain large numbers. 

 Thus for $Q$ and $i$ we have either a list or an integer stored to encode the corresponding
homomorphisms. For each index $i$ we write all lists or integers into a list such that at position $\mathrm{Id}(Q)$ the corresponding list or integer to $Q$ and $i$ is found. 

 For $i = 1$ this list has no holes, since there exists at least one group $P : Q$ with $K$ of index 2 for each group $Q$. Often the entry at position $j$ in this list is equal to the entry at position $j-1$. In this case we delete the entry at position $j$ and thus create a hole in the list. 

 For $i > 1$ there might be holes in the list if there is no group $P : Q$ with $K$ of index $2^i$. Hence the previous idea cannot be applied for $i > 1$. However, in all the lists we have equal entries in various places. If this
is the case, then we substitute an entry in a list by a negative integer $-j$ meaning that the entry at this position is equal to the entry at position $j$. 

 Finally, if the list for some index $i$ has only few entries left, then we substitute the list by a record containing
two lists: first the non\texttt{\symbol{45}}empty positions and secondly their
entries. }

 
\subsection{\textcolor{Chapter }{Storing: groups with normal Sylow 2\texttt{\symbol{45}}subgroup}}\logpage{[ 2, 5, 4 ]}
\hyperdef{L}{X7D9327FA7978F1DE}{}
{
 Next we consider the remaining groups of type $Q : P$. These exist for a few primes $p$ only. These groups are described by operation homomorphisms of the type $P \to \mathrm{Aut}(Q)$. Here we store the catalogue number of $Q$ and a long integer for each such homomorphism $a : P \to \mathrm{Aut}(Q)$. Consider a generator $g$ of $P$. Clearly, we just need to store the image of $g$ for each homomorphism $a$. The image $g^a$ is an automorphism of $Q$ and thus we store the images under $g^a$ of a fixed generating set of $Q$. For this purpose we consider a canonical numbering of the elements of $Q$ and store the generator images by storing their number in the element list.
The sequence of these numbers is encoded as a $(|Q|+1)$\texttt{\symbol{45}}adic number; that is, the sequence $e_1, \ldots, e_r$ is stored as $e_1 q^{r-1} + e_2 q^{r-2} + \ldots + e_r$ where $q = |Q| + 1$. }

 
\subsection{\textcolor{Chapter }{Storing: groups without normal Sylow subgroup}}\logpage{[ 2, 5, 5 ]}
\hyperdef{L}{X80227BB07EB892F4}{}
{
 Now there are the groups of order $2^n \cdot p$ without any normal Sylow subgroup left. These exist for very few primes $p$ only. They have been computed as in layer 2 using the Frattini extension
method. They are stored as described in layer 2 using one long integer for
each group. }

 
\subsection{\textcolor{Chapter }{Identification}}\logpage{[ 2, 5, 6 ]}
\hyperdef{L}{X809B03E67FB9361D}{}
{
 The identification of nilpotent groups $P \times Q$ relies on the identification of $Q$ only and this is done as in layer 2. Similarly, the groups without normal
Sylow subgroup are identified as described in layer 2. 

 For the groups $Q : P$ with normal Sylow 2\texttt{\symbol{45}}subgroup we first determine the prime $p$ and the isomorphism type of $Q$. If this is not sufficient, then we use the methods as described in layer 2.
(Recall that there are only finitely many primes $p$ possible here.) 

 For the groups $P : Q$ with normal Sylow $p$\texttt{\symbol{45}}subgroup we first determine the prime $p$ and the isomorphism type of $Q$ as well. Moreover, we compute the centralizer $K$ of $P$ in $Q$ and consider its index $[Q : K] = 2^i$. 

 In a large number of cases the catalogue numbers $\mathrm{Id}(Q)$ and $\mathrm{Id}(K)$ are sufficient to determine the group $P:Q$ uniquely. Moreover, this feature is independent of $p$. We can recognise these cases using the tree of invariants: if we can
determine $P:Q$ uniquely with $\mathrm{Id}(Q)$ and $\mathrm{Id}(K)$ only, then there is no node corresponding to this case in the tree. 

 If there is a node in the tree, then $\mathrm{Id}(Q)$ and $\mathrm{Id}(K)$ are not sufficient to determine the group uniquely. In this case we apply
methods similar to layer 2; that is, we use invariants. Since there are
infinitely many primes $p$ which might turn up here, we need an additional idea to use the invariant tree
for this purpose. In the invariant tree we have invariants stored for groups
of type $R : Q$ of order $2^n \cdot r$ for the primes $r = 3, 5, 17$ and $97$. Now we first choose the smallest prime $r$ such that $r$ is congruent to 1 modulo $[Q : K]$. The cases that $[Q : K] = 2^i$ for $i = 6, 7$ or 8 cannot occur here, because in these cases $\mathrm{Id}(Q)$ and $\mathrm{Id}(K)$ are always sufficient to determine the group. 

 Then we use that the groups $P : Q$ behave essentially similarly to the groups $R : Q$ for the chosen $r$. Thus we can construct a group $R : Q$ corresponding to $P : Q$ and identify $R : Q$ instead of $P : Q$. }

 }

  
\section{\textcolor{Chapter }{Layer 4}}\label{Layer 4}
\logpage{[ 2, 6, 0 ]}
\hyperdef{L}{X83F20E7381C49E05}{}
{
  
\subsection{\textcolor{Chapter }{Determination}}\logpage{[ 2, 6, 1 ]}
\hyperdef{L}{X879DAE75858CBEDE}{}
{
 The groups of order $2401 = 7^4$ and $3125 = 5^5$ have been computed using $p$\texttt{\symbol{45}}group generation as described in layer 2 and they are
stored and handled similarly. The other groups in this layer have been
determined as outlined in layer 3 and, again, they are organised similarly. }

 
\subsection{\textcolor{Chapter }{Storing}}\logpage{[ 2, 6, 2 ]}
\hyperdef{L}{X85328BB6843CE85F}{}
{
 There is a difference from layer 3 in the compression of the group data; that
is, the groups in this layer are not compressed as efficiently as the groups
in layer 3. We consider the groups of type $P : Q$ for $P$ the cyclic group of order $p$ and $Q$ a group of order $q^n$. These groups are determined by $Q$ and an operation homomorphism $Q \to \mathrm{Aut}(P)$. As in layer 3 we first compute one integer for each operation homomorphism
and then proceed to compress the lists of integers for each $Q$ and each $i$ where $q^i$ is the index of the centralizer of $P$ in $Q$. Unlike in layer 3, we do not compress the lists of
non\texttt{\symbol{45}}negative integers to a single integer and we do not
reduce the list for $i = 1$ further, since in both cases the obtained compression is very small. }

 
\subsection{\textcolor{Chapter }{Identification}}\logpage{[ 2, 6, 3 ]}
\hyperdef{L}{X809B03E67FB9361D}{}
{
 The group identification is essentially similar to the procedure described in
layer 3. However, for the groups with normal Sylow $p$\texttt{\symbol{45}}subgroup we additionally use a special random isomorphism
test to identify groups. It is a ``special'' version of the general algorithm: in the general algorithm we use certain sets
to choose generating sets from. In this special version we restrict these sets
suitably. (We use non\texttt{\symbol{45}}trivial elements of $P$ and certain elements of $Q$.) This is necessary, since the groups which appear here can be too large to
compute explicitly the elements sorted in conjugacy classes. }

 }

  
\section{\textcolor{Chapter }{Layer 5}}\label{Layer 5}
\logpage{[ 2, 7, 0 ]}
\hyperdef{L}{X84827D7A7BA3EEBE}{}
{
  This layer is similar to layer 2. }

  
\section{\textcolor{Chapter }{Layer 6}}\label{Layer 6}
\logpage{[ 2, 8, 0 ]}
\hyperdef{L}{X7D12E86178BD6F17}{}
{
  
\subsection{\textcolor{Chapter }{Determination}}\logpage{[ 2, 8, 1 ]}
\hyperdef{L}{X879DAE75858CBEDE}{}
{
 The nilpotent groups in this layer are determined as direct products of $p$\texttt{\symbol{45}}groups. Most of the groups of orders 1152 and 1920 have a
normal Sylow 3\texttt{\symbol{45}}subgroup or Hall $\{3,5\}$\texttt{\symbol{45}}subgroup, respectively. They are constructed using the
coprime split extension method, see \cite{BEO01}. The remaining groups of these orders (without normal
2\texttt{\symbol{45}}complement) have been determined using the Frattini
extension method and the cyclic split extension method, see also \cite{BescheEick98}. }

 
\subsection{\textcolor{Chapter }{Storing}}\logpage{[ 2, 8, 2 ]}
\hyperdef{L}{X85328BB6843CE85F}{}
{
 Only the non\texttt{\symbol{45}}nilpotent groups with normal Sylow
3\texttt{\symbol{45}}subgroup or Hall $\{3,5\}$\texttt{\symbol{45}}subgroup are stored in a special way. The remaining groups
are organised similarly to layer 2. 

 For the groups of type $P : Q$ where $P$ is the normal Sylow 3\texttt{\symbol{45}}subgroup or the Hall $\{3,5\}$\texttt{\symbol{45}}subgroup and $Q$ is a group of order $2^7$ we split a pc presentation in two parts. The first part are the relators of $Q$. These are stored within the groups of order $2^7$ and thus can be considered as known. The second part of the relators determine $P$ and the operation of $Q$ on $P$. These second parts are stored as long integers. If we consider these second
parts for all the groups, then we find that they are highly redundant. There
are only 921 (1722) different long integers for the groups of order 1152 and
1920, respectively. Thus we store these two sets of long integers only. 

 Then for each group $Q$ of order $2^7$ we store for each extension $P : Q$ the position of the corresponding long integer. Hence we obtain a list of
integers for $Q$. Again we note that the lists of integers obtained for all the groups $Q$ of order $2^7$ are highly redundant. There are only 1298 (722) different lists for the groups
of order 1152 (1920). Thus we can compress the lists using the same idea
again. }

 
\subsection{\textcolor{Chapter }{Identification}}\logpage{[ 2, 8, 3 ]}
\hyperdef{L}{X809B03E67FB9361D}{}
{
 The identification of groups of these orders is similar to layer 2. }

 }

  
\section{\textcolor{Chapter }{Layer 7}}\label{Layer 7}
\logpage{[ 2, 9, 0 ]}
\hyperdef{L}{X7A629B6882DA1FAC}{}
{
  
\subsection{\textcolor{Chapter }{Determination}}\logpage{[ 2, 9, 1 ]}
\hyperdef{L}{X879DAE75858CBEDE}{}
{
 The groups of order 512 have first been enumerated, see \cite{EOB98} and \cite{EOB99}. Later they have been determined explicitly using $p$\texttt{\symbol{45}}group generation, see \cite{OBr90} and \cite{BEO01}. There are 10 494 213 groups of this order. }

 
\subsection{\textcolor{Chapter }{Storing}}\logpage{[ 2, 9, 2 ]}
\hyperdef{L}{X85328BB6843CE85F}{}
{
 We introduce a special method to store such groups. Consider a pc presentation
of a given group of order 512. If we concatenate the exponent vectors of the
right hand sides of such a presentation, then we obtain a bit vector of length
120. This can be used as encoding of a group of order 512. We compress the
list of such encodings further using the following method. 

 First we split the list of all groups of order 512 in sublists containing 1000
groups each. Let $L$ be such a sublist. We suppose that $L$ consists of 1000 bitlists of length 120 and we describe a method to encode
this list of bitlists in a single vector $V$ using an alphabet of 83 symbols (81 symbols for the encoding and 2 special
symbols as signs). 

 First we find those indices $i$ in the range 1 to 120 such that for all lists in $L$ the entries at position $i$ are fixed. Thus we note for each of the 120 entries whether the entries are
all 0, all 1 or variable in $L$. There are $3^{120}$ combinations possible, which we store in a vector of length 30 using 81
symbols. This vector of length 30 is the initial segment of $V$. Now we can reduce to consider the variable positions only and thus work with
bitlists of shorter length. 

 We split the shorter bitlists in blocks such that the bitlists in each block
have at most 6 variable entries. For this purpose we start at the beginning of $L$ and add bitlists to the current block until the next bitlist would lead to
more than 6 variable entries for this block. Each block can contain from 1 up
to 64 bitlists. Now we determine a ``headcode'' and a ``tailcode'' to describe the block. The head and tail codes are then concatenated to $V$. The head contains an encoding of the variable bits for this block as above.
The tail then describes the vectors in the variable bits. Since there are at
most 64 possible combinations arising here, we need only one letter in the
81\texttt{\symbol{45}}alphabet to describe a single vector of variable bits. 

 Finally, we note that some of the tailcodes arise for many blocks. These
tailcodes are stored in a special list. If such a tailcode is occurring in $V$, then only the reference to the special list is stored instead of the full
tailcode. This special list contains 1890 different tailcodes, so 2 letters in
the alphabet are sufficient to refer to a tailcode. 

 To distinguish references and actual tailcodes we use a special sign. Each new
head begins with a special symbol in $V$. There are two special symbols available for this purpose. One is used if the
corresponding tailcode is referenced, and the other if it is an ordinary
tailcode. 

 This compression allows the groups of order 512 to be stored in 4.4 MB. }

 }

  
\section{\textcolor{Chapter }{Layer 8}}\label{Layer 8}
\logpage{[ 2, 10, 0 ]}
\hyperdef{L}{X83696AB17DBE98A2}{}
{
  
\subsection{\textcolor{Chapter }{Determination}}\logpage{[ 2, 10, 1 ]}
\hyperdef{L}{X879DAE75858CBEDE}{}
{
 The 408 641 062 groups of order 1536 have been determined using the cyclic
split extension method and the improved version of the Frattini extension
method, see \cite{BescheEick98} and \cite{BescheEick768}. }

 
\subsection{\textcolor{Chapter }{Storing}}\logpage{[ 2, 10, 2 ]}
\hyperdef{L}{X85328BB6843CE85F}{}
{
 We store these groups in a special way as well and we obtain a compression to
6.1 MB. The groups are stored using references to the groups of order 512 of
layer 7. 

 The nilpotent groups $C_3 \times Q$ for $Q$ a group of order 512 are based on the groups of order 512. 

 The major part of the groups are the 398 032 384
non\texttt{\symbol{45}}nilpotent groups with normal Sylow
3\texttt{\symbol{45}}subgroup. The compression of these groups follows the one
outlined in layer 3. As described there, for each group $Q$ of order 512 we compute an integer which determines all groups of type $C_3 : Q$. There are only 15 249 different integers of this type. In a first
compression we create a list of references to the different integers. 

 Now we note that a group often has the same reference as the previous one.
Thus we split the groups of order 512 in sets of 100 000 groups and create a
record for each set. The record contains two lists which are used to recall
the blocks in a set having the same reference. Thus the first list contains
the length of the blocks and the second list contains the corresponding
references. 

 Again, in both lists certain patterns occur often. In the first list the
length $1$ appears often. Thus the $1$ is not stored explicitly, but a blank in this list has to be considered as $1$. In the second list often an entry is the same as the one 2 places before.
Thus these entries are deleted as well and blanks can be reconstructed by this
rule. 

 Additionally we store the number of resulting groups for each integer to speed
up the method to find the group with a given catalogue number. 

 The 18 028 groups with normal Sylow 2\texttt{\symbol{45}}subgroup are stored
similarly to layer 3. As described for layer 3 we determine a long integer for
each homomorphism $Q \to \mathrm{Aut}(P)$ for $Q$ of order 512 and $P$ the cyclic group of order 3. The occurring integers are highly redundant
{\textendash} there are 6774 different ones. Thus we use a list of references
again. 

 The 96 437 groups without normal Sylow subgroup are determined using the
Frattini extension method. As described in layer 2 they can be stored by
encoding the relators of a pc presentation as long integer. However, the
relators corresponding to the Frattini factors of the groups are known. Thus
it is sufficient to store the relators of the Frattini factors once for all
groups with this factor and encode the remaining relators only. Note that
there are only 16 different Frattini factors and only 12 of them have order
less than 1536. The groups are stored in lists corresponding to the 12
Frattini factors. }

 }

  
\section{\textcolor{Chapter }{Layer 9}}\label{Layer 9}
\logpage{[ 2, 11, 0 ]}
\hyperdef{L}{X841919B887D9E819}{}
{
  This layer contains the generic construction of the groups of order $p^4$, $p^5$ and $p^6$ greater than 3125 (those of order up to 3125 are contained in the lower layers
of the Small Groups library). 
\subsection{\textcolor{Chapter }{Determination}}\logpage{[ 2, 11, 1 ]}
\hyperdef{L}{X879DAE75858CBEDE}{}
{
 The groups of order $p^4$ were first determined by H{\"o}lder (1893), see \cite{Hoelder1893}. The groups of order $p^5$ were first determined by Bagnera (1898), see \cite{Bagnera1898}. The groups of order $p^6$ were first (correctly) determined by Newman, O'Brien and
Vaughan\texttt{\symbol{45}}Lee (2004), see \cite{NOV04}. }

 
\subsection{\textcolor{Chapter }{Storing}}\logpage{[ 2, 11, 2 ]}
\hyperdef{L}{X85328BB6843CE85F}{}
{
 The groups of order $p^4$ ($p \geq 11$) are given by pc presentations which are produced at
run\texttt{\symbol{45}}time by a function \texttt{SMALL{\textunderscore}GROUP{\textunderscore}FUNCS[19]} provided by Newman. 

 The groups of order $p^5$ ($p \geq 7$) are given by pc presentations which are produced at
run\texttt{\symbol{45}}time by a function \texttt{SMALL{\textunderscore}GROUP{\textunderscore}FUNCS[20]} provided by Girnat, see \cite{Gir03}. 

 The groups of order $p^6$ ($p \geq 5$) are given by pc presentations which are produced at
run\texttt{\symbol{45}}time by a function \texttt{SMALL{\textunderscore}GROUP{\textunderscore}FUNCS[21]} provided by Newman, O'Brien and Vaughan\texttt{\symbol{45}}Lee, see \cite{NOV04}. 

 The groups of order $p^6$ are given as a list of partially repetitive structures. These are compressed
into the file \texttt{sml1.z}. At run\texttt{\symbol{45}}time, this compressed structure will be expanded,
but restricted to those parts of the structure relevant for the given $p$ when needed. It is cached into \texttt{SMALL{\textunderscore}GROUP{\textunderscore}LIB[1]}. As parts of this structure contain long ($O(p^2)$) lists of groups which are classified by additional parameters and these
lists are not dense, it might be necessary to set up the complete list of
indices to find the presentation of a single group. }

 
\subsection{\textcolor{Chapter }{Identification}}\logpage{[ 2, 11, 3 ]}
\hyperdef{L}{X809B03E67FB9361D}{}
{
 A group of order $p^4$ can be identified and its catalogue number found by the function \texttt{ID{\textunderscore}GROUP{\textunderscore}FUNCS[19]} based on a function provided by Newman and modified by Besche. 

 There is no identification available for the groups of order $p^5$ and $p^6$ at present. }

 }

  
\section{\textcolor{Chapter }{Layer 10}}\label{Layer 10}
\logpage{[ 2, 12, 0 ]}
\hyperdef{L}{X874FE9887DA26BF8}{}
{
  
\subsection{\textcolor{Chapter }{Groups of squarefree order}}\logpage{[ 2, 12, 1 ]}
\hyperdef{L}{X7E9CB4368032E322}{}
{
 These groups have first been determined by H{\"o}lder (1895), see \cite{Hoelder1895}. The implemented construction is based on the determination given in \cite{DEi05}. The key invariants are the socle and socle factor. 

 The groups of squarefree order which are not contained in lower layers are
given by pc presentations which are produced at run\texttt{\symbol{45}}time by
a function \texttt{SMALL{\textunderscore}GROUP{\textunderscore}FUNCS[24]} written specially for this library. Such a group can be identified and its
catalogue number found by the function \texttt{ID{\textunderscore}GROUP{\textunderscore}FUNCS[24]}. }

 
\subsection{\textcolor{Chapter }{Groups of cubefree but not squarefree order}}\logpage{[ 2, 12, 2 ]}
\hyperdef{L}{X780C51027F1E1EFB}{}
{
 These groups were first determined in \cite{DEi05}. Every group with cubefree order is either solvable or has a direct
decomposition into a solvable group and $PSL(2,p)$ for a suitable prime. 

 The groups of cubefree order at most 50 000 which are not contained in lower
layers and are not squarefree are given by pc presentations which are produced
at run\texttt{\symbol{45}}time by a function \texttt{SMALL{\textunderscore}GROUP{\textunderscore}FUNCS[25]} written specially for this library. Such a group can be identified and its
catalogue number found by the function \texttt{ID{\textunderscore}GROUP{\textunderscore}FUNCS[25]}. }

 }

  
\section{\textcolor{Chapter }{Layer 11}}\label{Layer 11}
\logpage{[ 2, 13, 0 ]}
\hyperdef{L}{X803F9A818168CBF1}{}
{
  
\subsection{\textcolor{Chapter }{Determination}}\logpage{[ 2, 13, 1 ]}
\hyperdef{L}{X879DAE75858CBEDE}{}
{
 The groups of order $p^7$ have been determined by O'Brien and Vaughan\texttt{\symbol{45}}Lee, see \cite{OV05}. This layer contains these groups for some small primes: $p = 3,5,7,11$. }

 
\subsection{\textcolor{Chapter }{Storing}}\logpage{[ 2, 13, 2 ]}
\hyperdef{L}{X85328BB6843CE85F}{}
{
 The groups are encoded by \texttt{PcGroupCode} (\textbf{Reference: PcGroupCode}) and then the various codes are stored in compressed form. See the groups of
order 512 for details. Pc presentations for the groups are produced at
run\texttt{\symbol{45}}time for these groups. }

 
\subsection{\textcolor{Chapter }{Identification}}\logpage{[ 2, 13, 3 ]}
\hyperdef{L}{X809B03E67FB9361D}{}
{
 There is no identification function available for the groups in this layer. }

 }

  
\section{\textcolor{Chapter }{Concluding remarks}}\label{Concluding remarks}
\logpage{[ 2, 14, 0 ]}
\hyperdef{L}{X7DE9FB52797AD3B9}{}
{
  The compression of group data for layer 2 has been developed long ago. A first
version has been used in the $p$\texttt{\symbol{45}}group generation algorithm and thus to encode the
2\texttt{\symbol{45}} and 3\texttt{\symbol{45}}groups library of \textsf{GAP}{\nobreakspace}3. This compression is described in \cite{BescheEick98}. 

 The remaining compression methods for layers 3 {\textendash} 8 have been
introduced by Hans Ulrich Besche specially for this library. They are designed
to store the groups in as little space as possible. For different layers there
are different methods, since certain approaches had been successful for
certain groups but not for others. Moreover, already published layers have not
been changed again and thus useful concepts sometimes have not been applied to
earlier layers. }

 }

   {\nobreakspace} \def\bibname{References\logpage{[ "Bib", 0, 0 ]}
\hyperdef{L}{X7A6F98FD85F02BFE}{}
}

\bibliographystyle{alpha}
\bibliography{manualbib.xml}

\addcontentsline{toc}{chapter}{References}

\def\indexname{Index\logpage{[ "Ind", 0, 0 ]}
\hyperdef{L}{X83A0356F839C696F}{}
}

\cleardoublepage
\phantomsection
\addcontentsline{toc}{chapter}{Index}


\printindex

\immediate\write\pagenrlog{["Ind", 0, 0], \arabic{page},}
\newpage
\immediate\write\pagenrlog{["End"], \arabic{page}];}
\immediate\closeout\pagenrlog
\end{document}
