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

\usepackage{a4wide}
\sloppy
\pagestyle{myheadings}
\usepackage{amssymb}
\usepackage[latin1]{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{\textsf{XMod}\mbox{}}}\\
\vfill

\hypersetup{pdftitle=\textsf{XMod}}
\markright{\scriptsize \mbox{}\hfill \textsf{XMod} \hfill\mbox{}}
{\Huge \textbf{Crossed modules and cat1-groups in \textsf{GAP}\mbox{}}}\\
\vfill

{\Huge Version 2.56\mbox{}}\\[1cm]
{08/03/2016\mbox{}}\\[1cm]
\mbox{}\\[2cm]
{\Large \textbf{ Murat Alp   \mbox{}}}\\
{\Large \textbf{ Alper Odaba{\c s}    \mbox{}}}\\
{\Large \textbf{ Enver {\"O}nder Uslu    \mbox{}}}\\
{\Large \textbf{ Chris Wensley    \mbox{}}}\\
\hypersetup{pdfauthor= Murat Alp   ;  Alper Odaba{\c s}    ;  Enver {\"O}nder Uslu    ;  Chris Wensley    }
\end{center}\vfill

\mbox{}\\
{\mbox{}\\
\small \noindent \textbf{ Murat Alp   }  Email: \href{mailto://muratalp@nigde.edu.tr} {\texttt{muratalp@nigde.edu.tr}}\\
  Address: \begin{minipage}[t]{8cm}\noindent
 Nigde {\"U}niversitesi,\\
 Fen Edebiyat Fak{\"u}ltesi, Matematik B{\"o}l{\"u}m{\"u}\\
 Nigde, Turkey. \end{minipage}
}\\
{\mbox{}\\
\small \noindent \textbf{ Alper Odaba{\c s}    }  Email: \href{mailto://aodabas@ogu.edu.tr} {\texttt{aodabas@ogu.edu.tr}}\\
  Homepage: \href{http://fef.ogu.edu.tr/matbil/aodabas/} {\texttt{http://fef.ogu.edu.tr/matbil/aodabas/}}\\
  Address: \begin{minipage}[t]{8cm}\noindent
 Department of Mathematics and Computer Science,\\
 Osmangazi University, Eski{\c s}ehir, Turkey \end{minipage}
}\\
{\mbox{}\\
\small \noindent \textbf{ Enver {\"O}nder Uslu    }  Email: \href{mailto://enveruslu@ogu.edu.tr} {\texttt{enveruslu@ogu.edu.tr}}\\
  Homepage: \href{http://fef.ogu.edu.tr/matbil/enveruslu/} {\texttt{http://fef.ogu.edu.tr/matbil/enveruslu/}}\\
  Address: \begin{minipage}[t]{8cm}\noindent
 Department of Mathematics and Computer Science,\\
 Osmangazi University, Eski{\c s}ehir, Turkey \end{minipage}
}\\
{\mbox{}\\
\small \noindent \textbf{ Chris Wensley    }  Email: \href{mailto://c.d.wensley@bangor.ac.uk} {\texttt{c.d.wensley@bangor.ac.uk}}\\
  Homepage: \href{http://pages.bangor.ac.uk/~mas023/} {\texttt{http://pages.bangor.ac.uk/\texttt{\symbol{126}}mas023/}}\\
  Address: \begin{minipage}[t]{8cm}\noindent
 School of Computer Science, Bangor University,\\
 Dean Street, Bangor, Gwynedd, LL57 1UT, U.K. \end{minipage}
}\\
\end{titlepage}

\newpage\setcounter{page}{2}
{\small 
\section*{Abstract}
\logpage{[ 0, 0, 1 ]}
 The \textsf{XMod} package provides functions for computation with 
\begin{itemize}
\item  finite crossed modules of groups and cat1-groups, and morphisms of these
structures; 
\item  finite pre-crossed modules, pre-cat1-groups, and their Peiffer quotients; 
\item  isoclinism classes of groups and crossed modules; 
\item  derivations of crossed modules and sections of cat1-groups; 
\item  crossed squares and their morphisms, including the actor crossed square of a
crossed module; 
\item  crossed modules of finite groupoids (experimental version). 
\end{itemize}
 

 \textsf{XMod} was originally implemented in 1997 using the \textsf{GAP}3 language, when the first author was studying for a Ph.D. \cite{A1} in Bangor. 

 In April 2002 the first and third parts were converted to \textsf{GAP}4, the pre-structures were added, and version 2.001 was released. The final
two parts, covering derivations, sections and actors, were included in the
January 2004 release 2.002 for \textsf{GAP} 4.4. 

 In October 2015 functions for computing isoclinism classes of crossed modules,
written by Alper Odaba{\c s} and Enver Uslu, were added. These are contained
in Chapter \ref{chap-isclnc}, and are described in detail in the paper \cite{IOU1}. 

 The current version is 2.56, released 8th March 2016 for \textsf{GAP} 4.8. 

 Bug reports, suggestions and comments are, of course, welcome. Please contact
the last author at \href{mailto://c.d.wensley@bangor.ac.uk} {\texttt{c.d.wensley@bangor.ac.uk}} or submit an issue at \href{http://github.com/gap-packages/xmod/issues/} {\texttt{http://github.com/gap-packages/xmod/issues/}}. \mbox{}}\\[1cm]
{\small 
\section*{Copyright}
\logpage{[ 0, 0, 2 ]}
 \index{License} {\copyright} 1997-2016 Chris Wensley et al. \textsf{XMod} is free software; you can redistribute it and/or modify it under the terms of
the \href{http://www.fsf.org/licenses/gpl.html} {GNU General Public License} as published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version. \mbox{}}\\[1cm]
{\small 
\section*{Acknowledgements}
\logpage{[ 0, 0, 3 ]}
 This documentation was prepared with the \textsf{GAPDoc} package of Frank L{\"u}beck and Max Neunh{\"o}ffer. 

 The first author wishes to acknowledge support from Dumlupinar University and
the Turkish government. \mbox{}}\\[1cm]
\newpage

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

\tableofcontents
\newpage

            
\chapter{\textcolor{Chapter }{Introduction}}\label{Intro}
\logpage{[ 1, 0, 0 ]}
\hyperdef{L}{X7DFB63A97E67C0A1}{}
{
  The \textsf{XMod} package provides functions for computation with 
\begin{itemize}
\item  finite crossed modules of groups and cat1-groups, and morphisms of these
structures; 
\item  finite pre-crossed modules, pre-cat1-groups, and their Peiffer quotients; 
\item  derivations of crossed modules and sections of cat1-groups; 
\item  isoclinism of groups and crossed modules; 
\item  the actor crossed square of a crossed module; 
\item  crossed squares and their morphisms (experimental version); 
\item  crossed modules of groupoids (experimental version). 
\end{itemize}
 It is loaded with the command 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@LoadPackage( "xmod" ); |
  
\end{Verbatim}
 

 The term crossed module was introduced by J. H. C. Whitehead in \cite{W2}, \cite{W1}. Loday, in \cite{L1}, reformulated the notion of a crossed module as a cat1-group. Norrie \cite{N1}, \cite{N2} and Gilbert \cite{G1} have studied derivations, automorphisms of crossed modules and the actor of a
crossed module, while Ellis \cite{E1} has investigated higher dimensional analogues. Properties of induced crossed
modules have been determined by Brown, Higgins and Wensley in \cite{BH1}, \cite{BW1} and \cite{BW2}. For further references see \cite{AW1}, where we discuss some of the data structures and algorithms used in this
package, and also tabulate isomorphism classes of cat1-groups up to size $30$. 

 \textsf{XMod} was originally implemented in 1997 using the \textsf{GAP} 3 language. In April 2002 the first and third parts were converted to \textsf{GAP} 4, the pre-structures were added, and version 2.001 was released. The final
two parts, covering derivations, sections and actors, were included in the
January 2004 release 2.002 for \textsf{GAP} 4.4. Many of the function names have been changed during the conversion, for
example \texttt{ConjugationXMod} has become \texttt{XModByNormalSubgroup}. For a list of name changes see the file \texttt{names.pdf} in the \texttt{doc} directory. 

 In October 2015 Alper Odaba{\c s} and Enver Uslu were added to the list of
package authors. Their functions for computing isoclinism classes of groups
and crossed modules are contained in Chapter \ref{chap-isclnc}, and are described in detail in their paper \cite{IOU1}. 

 The current version is 2.56 for \textsf{GAP} 4.8, released on 8th March 2016. 

 The package may be obtained as a compressed tar file \texttt{xmod-2.56.tar.gz} by ftp from one of the following sites: 
\begin{itemize}
\item  any \textsf{GAP} archive, e.g. \href{http://www.gap-system.org/Packages/packages.html} {\texttt{http://www.gap-system.org/Packages/packages.html}}; 
\item  the Bangor site: \href{http://www.maths.bangor.ac.uk/chda/gap4/xmod/xmod.html} {\texttt{http://www.maths.bangor.ac.uk/chda/gap4/xmod/xmod.html}}; 
\item  the package GitHub repository: \href{https://github.com/gap-packages/xmod} {\texttt{https://github.com/gap-packages/xmod}}. 
\end{itemize}
 

 Crossed modules and cat1-groups are special types of \emph{2-dimensional groups} \cite{B82}, \cite{brow:hig:siv}, and are implemented as \texttt{2dDomains} and \texttt{2dGroups} having a \texttt{Source} and a \texttt{Range}.   

 The package divides into eight parts. The first part is concerned with the
standard constructions for pre-crossed modules and crossed modules; together
with direct products; normal sub-crossed modules; and quotients. Operations
for constructing pre-cat1-groups and cat1-groups, and for converting between
cat1-groups and crossed modules, are also included. 

 The second part is concerned with \emph{morphisms} of (pre-)crossed modules and (pre-)cat1-groups, together with standard
operations for morphisms, such as composition, image and kernel. 

 The third part is the most recent part of the package, introduced in October
2015. Additional operations and properties for crossed modules are included in
Section \ref{sect-more-xmod-ops}. Then, in \ref{sect-isoclinic-groups} and \ref{sect-isoclinic-xmods} there are functions for isoclinism of groups and crossed modules. 

 The fourth part is concerned with the equivalent notions of \emph{derivation} for a crossed module and \emph{section} for a cat1-group, and the monoids which they form under the Whitehead
multiplication. 

 The fifth part deals with actor crossed modules and actor cat1-groups. For the
actor crossed module ${\rm Act}(\mathcal{X})$ of a crossed module $\mathcal{X}$ we require representations for the Whitehead group of regular derivations of $\mathcal{X}$ and for the group of automorphisms of $\mathcal{X}$. The construction also provides an inner morphism from $\mathcal{X}$ to ${\rm Act}(\mathcal{X})$ whose kernel is the centre of $\mathcal{X}$. 

 The sixth part, which remains under development, contains functions to compute
induced crossed modules. 

 Since version 2.007 there are experimental functions for \emph{crossed squares} and their morphisms, structures which arise as $3$-dimensional groups. Examples of these are inclusions of normal sub-crossed
modules, and the inner morphism from a crossed module to its actor. 

 The eighth part has some experimental functions for crossed modules of
groupoids, interacting with the package \textsf{Gpd}. Much more work on this is needed. 

 Future plans include the implementation of \emph{group-graphs} which will provide examples of pre-crossed modules (their implementation will
require interaction with graph-theoretic functions in \textsf{GAP} 4). There are also plans to implement cat2-groups, and conversion betwen these
and crossed squares. 

 The equivalent categories \texttt{XMod} (crossed modules) and \texttt{Cat1} (cat1-groups) are also equivalent to \texttt{GpGpd}, the subcategory of group objects in the category \texttt{Gpd} of groupoids. Finite groupoids have been implemented in Emma Moore's package \textsf{Gpd} \cite{M1} for groupoids and crossed resolutions. 

 \index{InfoXMod@\texttt{InfoXMod}} In order that the user has some control of the verbosity of the \textsf{XMod} package's functions, an \texttt{InfoClass} \texttt{InfoXMod} is provided (see Chapter \texttt{ref:Info Functions} in the \textsf{GAP} Reference Manual for a description of the \texttt{Info} mechanism). By default, the \texttt{InfoLevel} of \texttt{InfoXMod} is \texttt{0}; progressively more information is supplied by raising the \texttt{InfoLevel} to \texttt{1}, \texttt{2} and \texttt{3}. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@SetInfoLevel( InfoXMod, 1); #sets the InfoXMod level to 1|
  
\end{Verbatim}
 

 Once the package is loaded, the manual \texttt{doc/manual.pdf} can be found in the documentation folder. The \texttt{html} versions, with or without MathJax, should be rebuilt as follows: 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@ReadPackage( "xmod, "makedocrel.g" ); |
  
\end{Verbatim}
 

 It is possible to check that the package has been installed correctly by
running the test files: 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@ReadPackage( "xmod", "tst/testall.g" );|
  #I  Testing .../pkg/xmod/tst/gp2obj.tst 
  ... 
  
\end{Verbatim}
 

 Additional information can be found on the \emph{Computational Higher-dimensional Discrete Algebra} website at \href{http://pages.bangor.ac.uk/~mas023/chda/} {\texttt{http://pages.bangor.ac.uk/\texttt{\symbol{126}}mas023/chda/}}. }

          
\chapter{\textcolor{Chapter }{2d-groups : crossed modules and cat1-groups}}\label{chap-gp2obj}
\logpage{[ 2, 0, 0 ]}
\hyperdef{L}{X87474A3F785F9E38}{}
{
  
\section{\textcolor{Chapter }{Constructions for crossed modules}}\label{sect-constructions}
\logpage{[ 2, 1, 0 ]}
\hyperdef{L}{X7BAD9A7F7AFEEC89}{}
{
  \index{crossed module} \index{2d-domain} \index{2d-group} A crossed module (of groups) $\mathcal{X} = (\partial : S \to R )$ consists of a group homomorphism $\partial $, called the \emph{boundary} of $\mathcal{X}$, with \emph{source} $S$ and \emph{range} $R$. The group $R$ acts on itself by conjugation, and on $S$ by an action $\alpha : R \to {\rm Aut}(S)$ such that, for all $s,s_1,s_2 \in S$ and $r \in R$, 
\[ {\bf XMod\ 1} : \partial(s^r) = r^{-1} (\partial s) r = (\partial s)^r, \qquad
{\bf XMod\ 2} : s_1^{\partial s_2} = s_2^{-1}s_1 s_2 = {s_1}^{s_2}. \]
 When only the first of these axioms is satisfied, the resulting structure is a \emph{pre-crossed module} (see section \ref{sect-precrossed-modules}). (Much of the literature on crossed modules uses left actions, but we have
chosen to use right actions in this package since that is the standard choice
for group actions in \textsf{GAP}.) 

 The kernel of $\partial$ is abelian. 

 There are a variety of constructors for crossed modules: 

\subsection{\textcolor{Chapter }{XMod}}
\logpage{[ 2, 1, 1 ]}\nobreak
\hyperdef{L}{X7C8175AE7F76B586}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{XMod({\mdseries\slshape args})\index{XMod@\texttt{XMod}}
\label{XMod}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{XModByBoundaryAndAction({\mdseries\slshape bdy, act})\index{XModByBoundaryAndAction@\texttt{XModByBoundaryAndAction}}
\label{XModByBoundaryAndAction}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{XModByTrivialAction({\mdseries\slshape bdy})\index{XModByTrivialAction@\texttt{XModByTrivialAction}}
\label{XModByTrivialAction}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{XModByNormalSubgroup({\mdseries\slshape G, N})\index{XModByNormalSubgroup@\texttt{XModByNormalSubgroup}}
\label{XModByNormalSubgroup}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{XModByCentralExtension({\mdseries\slshape bdy})\index{XModByCentralExtension@\texttt{XModByCentralExtension}}
\label{XModByCentralExtension}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{XModByAutomorphismGroup({\mdseries\slshape grp})\index{XModByAutomorphismGroup@\texttt{XModByAutomorphismGroup}}
\label{XModByAutomorphismGroup}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{XModByInnerAutomorphismGroup({\mdseries\slshape grp})\index{XModByInnerAutomorphismGroup@\texttt{XModByInnerAutomorphismGroup}}
\label{XModByInnerAutomorphismGroup}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{XModByGroupOfAutomorphisms({\mdseries\slshape G, A})\index{XModByGroupOfAutomorphisms@\texttt{XModByGroupOfAutomorphisms}}
\label{XModByGroupOfAutomorphisms}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{XModByAbelianModule({\mdseries\slshape abmod})\index{XModByAbelianModule@\texttt{XModByAbelianModule}}
\label{XModByAbelianModule}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DirectProduct({\mdseries\slshape X1, X2})\index{DirectProduct@\texttt{DirectProduct}}
\label{DirectProduct}
}\hfill{\scriptsize (operation)}}\\


 The global function \texttt{XMod} implements one of the following standard constructions: 
\begin{itemize}
\item  A \emph{trivial action crossed module} $(\partial : S \to R)$ has $s^r = s$ for all $s \in S, \; r \in R$, the source is abelian and the image lies in the centre of the range. 
\item  A \emph{conjugation crossed module} is the inclusion of a normal subgroup $S \unlhd R$, where $R$ acts on $S$ by conjugation. 
\item  A \emph{central extension crossed module} has as boundary a surjection $\partial : S \to R$, with central kernel, where $r \in R$ acts on $S$ by conjugation with $\partial^{-1}r$. 
\item  An \emph{automorphism crossed module} has as range a subgroup $R$ of the automorphism group Aut$(S)$ of $S$ which contains the inner automorphism group of $S$. The boundary maps $s \in S$ to the inner automorphism of $S$ by $s$. 
\item  A \emph{crossed abelian module} has an abelian module as source and the zero map as boundary. 
\item  The direct product $\mathcal{X}_{1} \times \mathcal{X}_{2}$ of two crossed modules has source $S_1 \times S_2$, range $R_1 \times R_2$ and boundary $\partial_1 \times \partial_2$, with $R_1,\ R_2$ acting trivially on $S_2,\ S_1$ respectively. 
\end{itemize}
 }

 

\subsection{\textcolor{Chapter }{Source}}
\logpage{[ 2, 1, 2 ]}\nobreak
\hyperdef{L}{X7DE8173F80E07AB1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Source({\mdseries\slshape X0})\index{Source@\texttt{Source}}
\label{Source}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Range({\mdseries\slshape X0})\index{Range@\texttt{Range}}
\label{Range}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Boundary({\mdseries\slshape X0})\index{Boundary@\texttt{Boundary}}
\label{Boundary}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AutoGroup({\mdseries\slshape X0})\index{AutoGroup@\texttt{AutoGroup}}
\label{AutoGroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{XModAction({\mdseries\slshape X0})\index{XModAction@\texttt{XModAction}}
\label{XModAction}
}\hfill{\scriptsize (attribute)}}\\


 The following attributes are used in the construction of a crossed module \texttt{X0}. 
\begin{itemize}
\item  \texttt{Source(X0)} and \texttt{Range(X0)} are the source $S$ and range $R$ of $\partial$, the boundary \texttt{Boundary(X0)}; 
\item  \texttt{AutoGroup(X0)} is a group of automorphisms of $S$; 
\item  \texttt{XModAction(X0)} is a homomorphism from $R$ to \texttt{AutoGroup(X0)}. 
\end{itemize}
 }

 

\subsection{\textcolor{Chapter }{Size}}
\logpage{[ 2, 1, 3 ]}\nobreak
\hyperdef{L}{X858ADA3B7A684421}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Size({\mdseries\slshape X0})\index{Size@\texttt{Size}}
\label{Size}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Name({\mdseries\slshape X0})\index{Name@\texttt{Name}}
\label{Name}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IdGroup({\mdseries\slshape X0})\index{IdGroup@\texttt{IdGroup}}
\label{IdGroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ExternalSetXMod({\mdseries\slshape X0})\index{ExternalSetXMod@\texttt{ExternalSetXMod}}
\label{ExternalSetXMod}
}\hfill{\scriptsize (attribute)}}\\


 More familiar attributes are \texttt{Name}, \texttt{Size} and \texttt{IdGroup}. The name is formed by concatenating the names of the source and range (if
these exist). \texttt{Size} and \texttt{IdGroup} return two-element lists. 

 The \texttt{ExternalSetXMod"} for a crossed module is the source group considered as a G-set of the range
group using the crossed module action. 

 \index{display a 2d-group} The \texttt{Display} function is used to print details of 2d-groups. }

 In the simple example below, \texttt{X1} is an automorphism crossed module, using a cyclic group of size five. The \texttt{Print} statements at the end list the \textsf{GAP} representations, properties and attributes of \texttt{X1}. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@c5 := Group( (5,6,7,8,9) );;|
  !gapprompt@gap>| !gapinput@SetName( c5, "c5" );|
  !gapprompt@gap>| !gapinput@X1 := XModByAutomorphismGroup( c5 );|
  [c5 -> PAut(c5)] 
  !gapprompt@gap>| !gapinput@Display( X1 );|
  Crossed module [c5 -> PAut(c5)] :-
  : Source group c5 has generators:
    [ (5,6,7,8,9) ]
  : Range group PAut(c5) has generators:
    [ (1,2,3,4) ]
  : Boundary homomorphism maps source generators to:
    [ () ]
  : Action homomorphism maps range generators to automorphisms:
    (1,2,3,4) --> { source gens --> [ (5,7,9,6,8) ] }
    This automorphism generates the group of automorphisms.
  !gapprompt@gap>| !gapinput@Size( X1 );  IdGroup( X1 ); |
  [ 5, 4 ]
  [ [ 5, 1 ], [ 4, 1 ] ]
  !gapprompt@gap>| !gapinput@ext := ExternalSetXMod( X1 ); |
  <xset:[ (), (5,6,7,8,9), (5,7,9,6,8), (5,8,6,9,7), (5,9,8,7,6) ]>
  !gapprompt@gap>| !gapinput@Orbits( ext );|
  [ [ () ], [ (5,6,7,8,9), (5,7,9,6,8), (5,9,8,7,6), (5,8,6,9,7) ] ]
  !gapprompt@gap>| !gapinput@RepresentationsOfObject( X1 );|
  [ "IsComponentObjectRep", "IsAttributeStoringRep", "IsPreXModObj" ]
  !gapprompt@gap>| !gapinput@KnownPropertiesOfObject( X1 );|
  [ "IsEmpty", "IsTrivial", "IsNonTrivial", "IsFinite", 
    "CanEasilyCompareElements", "CanEasilySortElements", "IsDuplicateFree", 
    "IsGeneratorsOfSemigroup", "IsPreXModDomain", "IsPerm2dGroup", "IsPreXMod", 
    "IsXMod", "IsAutomorphismGroup2dGroup" ]
  !gapprompt@gap>| !gapinput@KnownAttributesOfObject( X1);|
  [ "Name", "Size", "Range", "Source", "IdGroup", "Boundary", "AutoGroup", 
    "XModAction", "ExternalSetXMod" ]
  
\end{Verbatim}
 \index{IsTrivialAction2dGroup} \index{IsNormalSubgroup2dGroup} \index{IsCentralExtension2dGroup} \index{IsAutomorphismGroup2dGroup} \index{IsAbelianModule2dGroup} 

\subsection{\textcolor{Chapter }{IsXMod}}
\logpage{[ 2, 1, 4 ]}\nobreak
\hyperdef{L}{X7E77E6B881B1CE50}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsXMod({\mdseries\slshape X0})\index{IsXMod@\texttt{IsXMod}}
\label{IsXMod}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsPreXMod({\mdseries\slshape X0})\index{IsPreXMod@\texttt{IsPreXMod}}
\label{IsPreXMod}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsPerm2dGroup({\mdseries\slshape X0})\index{IsPerm2dGroup@\texttt{IsPerm2dGroup}}
\label{IsPerm2dGroup}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsPc2dGroup({\mdseries\slshape X0})\index{IsPc2dGroup@\texttt{IsPc2dGroup}}
\label{IsPc2dGroup}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsFp2dGroup({\mdseries\slshape X0})\index{IsFp2dGroup@\texttt{IsFp2dGroup}}
\label{IsFp2dGroup}
}\hfill{\scriptsize (property)}}\\


 The underlying category structures for the objects constructed in this chapter
follow the sequence \texttt{Is2dDomain}; \texttt{Is2dMagma}; \texttt{Is2dMagmaWithOne}; \texttt{Is2dMagmaWithInverses}, mirroring the situation for (one-dimensional) groups. From these we
construct \texttt{Is2dSemigroup}, \texttt{Is2dMonoid} and \texttt{Is2dGroup}. 

 A structure which has \texttt{IsPerm2dGroup} is a precrossed module or a pre-cat1-group (see section \ref{sect-cat1}) whose source and range are both permutation groups. The properties \texttt{IsPc2dGroup}, \texttt{IsFp2dGroup} are defined similarly. We see in the previous example that \texttt{X1} has \texttt{IsPreXMod}, \texttt{IsXMod} and \texttt{IsPerm2dGroup}. There are also properties corresponding to the various construction methods
listed in section \ref{sect-constructions}: \texttt{IsTrivialAction2dGroup}; \texttt{IsNormalSubgroup2dGroup}; \texttt{IsCentralExtension2dGroup}; \texttt{IsAutomorphismGroup2dGroup}; \texttt{IsAbelianModule2dGroup}. }

 \index{IsNormal for crossed modules} 

\subsection{\textcolor{Chapter }{SubXMod}}
\logpage{[ 2, 1, 5 ]}\nobreak
\hyperdef{L}{X7884284383284A87}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SubXMod({\mdseries\slshape X0, src, rng})\index{SubXMod@\texttt{SubXMod}}
\label{SubXMod}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{TrivialSubXMod({\mdseries\slshape X0})\index{TrivialSubXMod@\texttt{TrivialSubXMod}}
\label{TrivialSubXMod}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NormalSubXMods({\mdseries\slshape X0})\index{NormalSubXMods@\texttt{NormalSubXMods}}
\label{NormalSubXMods}
}\hfill{\scriptsize (attribute)}}\\


 With the standard crossed module constructors listed above as building blocks,
sub-crossed modules, normal sub-crossed modules $\mathcal{N} \lhd \mathcal{X}$, and also quotients $\mathcal{X}/\mathcal{N}$ may be constructed. A sub-crossed module $\mathcal{S} = (\delta : N \to M)$ is \emph{normal} in $\mathcal{X} = (\partial : S \to R)$ if 
\begin{itemize}
\item  $N,M$ are normal subgroups of $S,R$ respectively, 
\item  $\delta$ is the restriction of $\partial$, 
\item  $n^r \in N$ for all $n \in N,~r \in R$, 
\item  $(s^{-1})^ms \in N$ for all $m \in M,~s \in S$. 
\end{itemize}
 These conditions ensure that $M \ltimes N$ is normal in the semidirect product $R \ltimes S$. (Note that $\langle s,m \rangle = (s^{-1})^ms$ is a displacement: see \texttt{Displacement} (\ref{Displacement}).) 

 A method for \texttt{IsNormal} for crossed modules is provided. See section \ref{sect-more-xmod-ops} for quotient crossed modules and natural homomorphisms. 

 The five normal subcrossed modules of \texttt{X4} found in the following example are \texttt{[id,id], [k4,k4], [k4,a4], [a4,a4]} and \texttt{X4} itself. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@s4 := Group( (1,2), (2,3), (3,4) );; |
  !gapprompt@gap>| !gapinput@a4 := Subgroup( s4, [ (1,2,3), (2,3,4) ] );; |
  !gapprompt@gap>| !gapinput@k4 := Subgroup( a4, [ (1,2)(3,4), (1,3)(2,4) ] );; |
  !gapprompt@gap>| !gapinput@SetName(s4,"s4");  SetName(a4,"a4");  SetName(k4,"k4"); |
  !gapprompt@gap>| !gapinput@X4 := XModByNormalSubgroup( s4, a4 );|
  [a4->s4]
  !gapprompt@gap>| !gapinput@Y4 := SubXMod( X4, k4, a4 ); |
  [k4->a4]
  !gapprompt@gap>| !gapinput@IsNormal(X4,Y4);|
  true
  !gapprompt@gap>| !gapinput@NX4 := NormalSubXMods( X4 );;|
  !gapprompt@gap>| !gapinput@Length( NX4 ); |
  5
  
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{Pre-crossed modules}}\label{sect-precrossed-modules}
\logpage{[ 2, 2, 0 ]}
\hyperdef{L}{X7D435B6279032D4D}{}
{
  \index{pre-crossed module} 

\subsection{\textcolor{Chapter }{PreXModByBoundaryAndAction}}
\logpage{[ 2, 2, 1 ]}\nobreak
\hyperdef{L}{X8487BE427858C5C9}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PreXModByBoundaryAndAction({\mdseries\slshape bdy, act})\index{PreXModByBoundaryAndAction@\texttt{PreXModByBoundaryAndAction}}
\label{PreXModByBoundaryAndAction}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SubPreXMod({\mdseries\slshape X0, src, rng})\index{SubPreXMod@\texttt{SubPreXMod}}
\label{SubPreXMod}
}\hfill{\scriptsize (operation)}}\\


 If axiom ${\bf XMod\ 2}$ is \emph{not} satisfied, the corresponding structure is known as a \emph{pre-crossed module}. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@b1 := (11,12,13,14,15,16,17,18);;  b2 := (12,18)(13,17)(14,16);;|
  !gapprompt@gap>| !gapinput@d16 := Group( b1, b2 );;|
  !gapprompt@gap>| !gapinput@sk4 := Subgroup( d16, [ b1^4, b2 ] );;|
  !gapprompt@gap>| !gapinput@SetName( d16, "d16" );  SetName( sk4, "sk4" );|
  !gapprompt@gap>| !gapinput@bdy16 := GroupHomomorphismByImages( d16, sk4, [b1,b2], [b1^4,b2] );;|
  !gapprompt@gap>| !gapinput@aut1 := GroupHomomorphismByImages( d16, d16, [b1,b2], [b1^5,b2] );;|
  !gapprompt@gap>| !gapinput@aut2 := GroupHomomorphismByImages( d16, d16, [b1,b2], [b1,b2^4*b2] );;|
  !gapprompt@gap>| !gapinput@aut16 := Group( [ aut1, aut2 ] );;|
  !gapprompt@gap>| !gapinput@act16 := GroupHomomorphismByImages( sk4, aut16, [b1^4,b2], [aut1,aut2] );;|
  !gapprompt@gap>| !gapinput@P16 := PreXModByBoundaryAndAction( bdy16, act16 );|
  [d16->sk4]
  !gapprompt@gap>| !gapinput@IsXMod(P16);|
  false
  
\end{Verbatim}
 \index{Peiffer subgroup} 

\subsection{\textcolor{Chapter }{PeifferSubgroup}}
\logpage{[ 2, 2, 2 ]}\nobreak
\hyperdef{L}{X8527F4C07A8F359E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PeifferSubgroup({\mdseries\slshape X0})\index{PeifferSubgroup@\texttt{PeifferSubgroup}}
\label{PeifferSubgroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{XModByPeifferQuotient({\mdseries\slshape prexmod})\index{XModByPeifferQuotient@\texttt{XModByPeifferQuotient}}
\label{XModByPeifferQuotient}
}\hfill{\scriptsize (attribute)}}\\


 The \emph{Peiffer subgroup} of a pre-crossed module $P$ of $S$ is the subgroup of ${\rm ker}(\partial)$ generated by \emph{Peiffer commutators} 
\[ \lfloor s_1,s_2 \rfloor ~=~ (s_1^{-1})^{\partial s_2}~s_2^{-1}~s_1~s_2 ~=~
\langle \partial s_2, s_1 \rangle\ [s_1,s_2]~. \]
 Then $\mathcal{P} = (0 : P \to \{1_R\})$ is a normal sub-pre-crossed module of $\mathcal{X}$ and $\mathcal{X}/\mathcal{P} = (\partial : S/P \to R)$ is a crossed module. 

 In the following example the Peiffer subgroup is cyclic of size $4$. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@P := PeifferSubgroup( P16 );|
  Group( [ (11,15)(12,16)(13,17)(14,18), (11,17,15,13)(12,18,16,14) ] )
  !gapprompt@gap>| !gapinput@X16 := XModByPeifferQuotient( P16 );|
  [D16/P->sk4]
  !gapprompt@gap>| !gapinput@Display( X16 );|
  Crossed module [D16/P->sk4] :-
  : Source group has generators:
    [ f1, f2 ]
  : Range group has generators:
    [ (11,15)(12,16)(13,17)(14,18), (12,18)(13,17)(14,16) ]
  : Boundary homomorphism maps source generators to:
    [ (12,18)(13,17)(14,16), (11,15)(12,16)(13,17)(14,18) ]
    The automorphism group is trivial
  !gapprompt@gap>| !gapinput@iso16 := IsomorphismPermGroup( Source( X16 ) );;|
  !gapprompt@gap>| !gapinput@S16 := Image( iso16 );|
  Group([ (1,2), (3,4) ])   
  
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{Cat1-groups and pre-cat1-groups}}\label{sect-cat1}
\logpage{[ 2, 3, 0 ]}
\hyperdef{L}{X7F868C2181018D0C}{}
{
  \index{cat1-group} 

\subsection{\textcolor{Chapter }{Source}}
\logpage{[ 2, 3, 1 ]}\nobreak
\hyperdef{L}{X7DE8173F80E07AB1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Source({\mdseries\slshape C})\index{Source@\texttt{Source}}
\label{Source}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Range({\mdseries\slshape C})\index{Range@\texttt{Range}}
\label{Range}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{TailMap({\mdseries\slshape C})\index{TailMap@\texttt{TailMap}}
\label{TailMap}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HeadMap({\mdseries\slshape C})\index{HeadMap@\texttt{HeadMap}}
\label{HeadMap}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RangeEmbedding({\mdseries\slshape C})\index{RangeEmbedding@\texttt{RangeEmbedding}}
\label{RangeEmbedding}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{KernelEmbedding({\mdseries\slshape C})\index{KernelEmbedding@\texttt{KernelEmbedding}}
\label{KernelEmbedding}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Boundary({\mdseries\slshape C})\index{Boundary@\texttt{Boundary}}
\label{Boundary}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Name({\mdseries\slshape C})\index{Name@\texttt{Name}}
\label{Name}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Size({\mdseries\slshape C})\index{Size@\texttt{Size}}
\label{Size}
}\hfill{\scriptsize (attribute)}}\\


 These are the attributes of a cat1-group $\mathcal{C}$ in this implementation. 

 In \cite{L1}, Loday reformulated the notion of a crossed module as a cat1-group, namely a
group $G$ with a pair of homomorphisms $t,h : G \to G$ having a common image $R$ and satisfying certain axioms. We find it convenient to define a cat1-group $\mathcal{C} = (e;t,h : G \to R )$ as having source group $G$, range group $R$, and three homomorphisms: two surjections $t,h : G \to R$ and an embedding $e : R \to G$ satisfying: 
\[ {\bf Cat\ 1} : ~t \circ e ~=~ h \circ e = {\rm id}_R, \qquad {\bf Cat\ 2} :
~[\ker t, \ker h] ~=~ \{ 1_G \}. \]
 It follows that $~t \circ e \circ h = h$,\texttt{\symbol{126}} $h \circ e \circ t = t$, $~t \circ e \circ t = t$,\texttt{\symbol{126}} $h \circ e \circ h = h$. 

 The maps $t,h$ are often referred to as the \emph{source} and \emph{target}, but we choose to call them the \emph{tail} and \emph{head} of $\mathcal{C}$, because \emph{source} is the \textsf{GAP} term for the domain of a function. The \texttt{RangeEmbedding} is the embedding of \texttt{R} in \texttt{G}, the \texttt{KernelEmbedding} is the inclusion of the kernel of \texttt{t} in \texttt{G}, and the \texttt{Boundary} is the restriction of \texttt{h} to the kernel of \texttt{t}. }

 

\subsection{\textcolor{Chapter }{Cat1}}
\logpage{[ 2, 3, 2 ]}\nobreak
\hyperdef{L}{X7F4221DF83D1B6D8}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Cat1({\mdseries\slshape args})\index{Cat1@\texttt{Cat1}}
\label{Cat1}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PreCat1ByTailHeadEmbedding({\mdseries\slshape t, h, e})\index{PreCat1ByTailHeadEmbedding@\texttt{PreCat1ByTailHeadEmbedding}}
\label{PreCat1ByTailHeadEmbedding}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PreCat1ByEndomorphisms({\mdseries\slshape t, h})\index{PreCat1ByEndomorphisms@\texttt{PreCat1ByEndomorphisms}}
\label{PreCat1ByEndomorphisms}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PreCat1ByNormalSubgroup({\mdseries\slshape G, N})\index{PreCat1ByNormalSubgroup@\texttt{PreCat1ByNormalSubgroup}}
\label{PreCat1ByNormalSubgroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Cat1ByPeifferQuotient({\mdseries\slshape P})\index{Cat1ByPeifferQuotient@\texttt{Cat1ByPeifferQuotient}}
\label{Cat1ByPeifferQuotient}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Reverse({\mdseries\slshape C0})\index{Reverse@\texttt{Reverse}}
\label{Reverse}
}\hfill{\scriptsize (attribute)}}\\


 These are some of the constructors for pre-cat1-groups and cat1-groups. The
following listing shows an example of a cat1-group of pc-groups of size $[28,12]$. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@G2 := SmallGroup( 288, 956 );  SetName( G2, "G2" );|
  <pc group of size 288 with 7 generators>
  !gapprompt@gap>| !gapinput@d12 := DihedralGroup( 12 );  SetName( d12, "d12" );|
  <pc group of size 12 with 3 generators>
  !gapprompt@gap>| !gapinput@a1 := d12.1;;  a2 := d12.2;;  a3 := d12.3;;  a0 := One( d12 );;|
  !gapprompt@gap>| !gapinput@gensG2 := GeneratorsOfGroup( G2 );;|
  !gapprompt@gap>| !gapinput@t2 := GroupHomomorphismByImages( G2, d12, gensG2,|
  !gapprompt@>| !gapinput@          [ a0, a1*a3, a2*a3, a0, a0, a3, a0 ] );;|
  !gapprompt@gap>| !gapinput@h2 := GroupHomomorphismByImages( G2, d12, gensG2,|
  !gapprompt@>| !gapinput@          [ a1*a2*a3, a0, a0, a2*a3, a0, a0, a3^2 ] );;                   |
  !gapprompt@gap>| !gapinput@e2 := GroupHomomorphismByImages( d12, G2, [a1,a2,a3],|
  !gapprompt@>| !gapinput@       [ G2.1*G2.2*G2.4*G2.6^2, G2.3*G2.4*G2.6^2*G2.7, G2.6*G2.7^2 ] );|
  [ f1, f2, f3 ] -> [ f1*f2*f4*f6^2, f3*f4*f6^2*f7, f6*f7^2 ]
  !gapprompt@gap>| !gapinput@C2 := PreCat1ByTailHeadEmbedding( t2, h2, e2 );|
  [G2=>d12]
  !gapprompt@gap>| !gapinput@IsCat1( C2 );|
  true
  !gapprompt@gap>| !gapinput@Display(C2);|
  
  Cat1-group [G2=>d12] :- 
  : Source group G2 has generators:
    [ f1, f2, f3, f4, f5, f6, f7 ]
  : Range group d12 has generators:
    [ f1, f2, f3 ]
  : tail homomorphism maps source generators to:
    [ <identity> of ..., f1*f3, f2*f3, <identity> of ..., <identity> of ..., 
    f3, <identity> of ... ]
  : head homomorphism maps source generators to:
    [ f1*f2*f3, <identity> of ..., <identity> of ..., f2*f3, <identity> of ..., 
    <identity> of ..., f3^2 ]
  : range embedding maps range generators to:
    [ f1*f2*f4*f6^2, f3*f4*f6^2*f7, f6*f7^2 ]
  : kernel has generators:
    [ f1, f4, f5, f7 ]
  : boundary homomorphism maps generators of kernel to:
    [ f1*f2*f3, f2*f3, <identity> of ..., f3^2 ]
  : kernel embedding maps generators of kernel to:
    [ f1, f4, f5, f7 ]
  
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{Cat1OfXMod}}
\logpage{[ 2, 3, 3 ]}\nobreak
\hyperdef{L}{X7EB380BA7AC52D53}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Cat1OfXMod({\mdseries\slshape X0})\index{Cat1OfXMod@\texttt{Cat1OfXMod}}
\label{Cat1OfXMod}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{XModOfCat1({\mdseries\slshape C0})\index{XModOfCat1@\texttt{XModOfCat1}}
\label{XModOfCat1}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PreCat1OfPreXMod({\mdseries\slshape P0})\index{PreCat1OfPreXMod@\texttt{PreCat1OfPreXMod}}
\label{PreCat1OfPreXMod}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PreXModOfPreCat1({\mdseries\slshape P0})\index{PreXModOfPreCat1@\texttt{PreXModOfPreCat1}}
\label{PreXModOfPreCat1}
}\hfill{\scriptsize (attribute)}}\\


 The category of crossed modules is equivalent to the category of cat1-groups,
and the functors between these two categories may be described as follows.
Starting with the crossed module $\mathcal{X} = (\partial : S \to R)$ the group $G$ is defined as the semidirect product $G = R \ltimes S$ using the action from $\mathcal{X}$, with multiplication rule 
\[ (r_1,s_1)(r_2,s_2) ~=~ (r_1r_2,{s_1}^{r_2}s_2). \]
 The structural morphisms are given by 
\[ t(r,s) = r, \quad h(r,s) = r (\partial s), \quad er = (r,1). \]
 On the other hand, starting with a cat1-group $ \mathcal{C} = (e;t,h : G \to R)$, we define $ S = \ker t$, the range $R$ is unchanged, and $ \partial = h\!\mid_S $. The action of $R$ on $S$ is conjugation in $G$ via the embedding of $R$ in $G$. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@X2 := XModOfCat1( C2 );;|
  !gapprompt@gap>| !gapinput@Display( X2 );|
  
  Crossed module X([G2=>d12]) :- 
  : Source group has generators:
    [ f1, f4, f5, f7 ]
  : Range group d12 has generators:
    [ f1, f2, f3 ]
  : Boundary homomorphism maps source generators to:
    [ f1*f2*f3, f2*f3, <identity> of ..., f3^2 ]
  : Action homomorphism maps range generators to automorphisms:
    f1 --> { source gens --> [ f1*f5, f4*f5, f5, f7^2 ] }
    f2 --> { source gens --> [ f1*f5*f7^2, f4, f5, f7 ] }
    f3 --> { source gens --> [ f1*f7, f4, f5, f7 ] }
    These 3 automorphisms generate the group of automorphisms.
  : associated cat1-group is [G2=>d12]
  
  !gapprompt@gap>| !gapinput@StructureDescription(X2);|
  [ "D24", "D12" ]
  
  
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{Selection of a small cat1-group}}\logpage{[ 2, 4, 0 ]}
\hyperdef{L}{X7B38B960782937EB}{}
{
 \index{selection of a small cat1-group} The \texttt{Cat1} function may also be used to select a cat1-group from a data file. All
cat1-structures on groups of size up to $70$ (ordered according to the \textsf{GAP} 4 numbering of small groups) are stored in a list in file \texttt{cat1data.g}. Global variables \texttt{CAT1{\textunderscore}LIST{\textunderscore}MAX{\textunderscore}SIZE := 70} and \texttt{CAT1{\textunderscore}LIST{\textunderscore}CLASS{\textunderscore}SIZES} are also stored. The data is read into the list \texttt{CAT1{\textunderscore}LIST} only when this function is called. 

\subsection{\textcolor{Chapter }{Cat1Select}}
\logpage{[ 2, 4, 1 ]}\nobreak
\hyperdef{L}{X7B8E67D880E380C8}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Cat1Select({\mdseries\slshape size, gpnum, num})\index{Cat1Select@\texttt{Cat1Select}}
\label{Cat1Select}
}\hfill{\scriptsize (attribute)}}\\


 The function \texttt{Cat1Select} may be used in three ways. \texttt{Cat1Select( size )} returns the names of the groups with this size, while \texttt{Cat1Select( size, gpnum )} prints a list of cat1-structures for this chosen group. \texttt{Cat1Select( size, gpnum, num )} returns the chosen cat1-group. 

 The example below is the first case in which $t \neq h$ and the associated conjugation crossed module is given by the normal subgroup \texttt{c3} of \texttt{s3}. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@## check the number of groups of size 18|
  !gapprompt@gap>| !gapinput@L18 := Cat1Select( 18 ); |
  Usage:  Cat1Select( size, gpnum, num );
  [ "D18", "C18", "C3 x S3", "(C3 x C3) : C2", "C6 x C3" ]
  !gapprompt@gap>| !gapinput@## check the number of cat1-structrues on the fourth of these|
  !gapprompt@gap>| !gapinput@Cat1Select( 18, 4 );|
  Usage:  Cat1Select( size, gpnum, num );
  There are 4 cat1-structures for the group (C3 x C3) : C2.
  Using small generating set [ f1, f2, f2*f3 ] for source of homs.
  [ [range gens], [tail genimages], [head genimages] ] :-
  (1)  [ [ f1 ], [ f1, <identity> of ..., <identity> of ... ], 
    [ f1, <identity> of ..., <identity> of ... ] ]
  (2)  [ [ f1, f3 ], [ f1, <identity> of ..., f3 ], 
    [ f1, <identity> of ..., f3 ] ]
  (3)  [ [ f1, f3 ], [ f1, <identity> of ..., f3 ], 
    [ f1, f3^2, <identity> of ... ] ]
  (4)  [ [ f1, f2, f2*f3 ],  tail = head = identity mapping ]
  4
  !gapprompt@gap>| !gapinput@## select the third of these cat1-structures |
  !gapprompt@gap>| !gapinput@C18 := Cat1( 18, 4, 3 );|
  [(C3 x C3) : C2=>Group( [ f1, <identity> of ..., f3 ] )]
  !gapprompt@gap>| !gapinput@## convert from a pc-cat1-group to a permutation cat1-group|
  !gapprompt@gap>| !gapinput@iso18 := IsomorphismPermObject( C18 );;|
  !gapprompt@gap>| !gapinput@PC18 := Image( iso18 );;|
  !gapprompt@gap>| !gapinput@Display( PC18 );                     |
  Cat1-group :- 
  : Source group has generators:
    [ (2,3)(5,6), (4,5,6), (1,2,3) ]
  : Range group has generators:
    [ (2,3), (), (1,2,3) ]
  : tail homomorphism maps source generators to:
    [ (2,3), (), (1,2,3) ]
  : head homomorphism maps source generators to:
    [ (2,3), (1,3,2), (1,2,3) ]
  : range embedding maps range generators to:
    [ (2,3)(5,6), (), (1,2,3) ]
  : kernel has generators:
    [ (4,5,6) ]
  : boundary homomorphism maps generators of kernel to:
    [ (1,3,2) ]
  : kernel embedding maps generators of kernel to:
    [ (4,5,6) ]
  !gapprompt@gap>| !gapinput@convert the result to the associated permutation crossed module |
  !gapprompt@gap>| !gapinput@X18 := XModByCat1( PC18 );; |
  !gapprompt@gap>| !gapinput@Display( X18 ); |
  Crossed module:- 
  : Source group has generators:
    [ (4,5,6) ]
  : Range group has generators:
    [ (2,3), (), (1,2,3) ]
  : Boundary homomorphism maps source generators to:
    [ (1,3,2) ]
  : Action homomorphism maps range generators to automorphisms:
    (2,3) --> { source gens --> [ (4,6,5) ] }
    () --> { source gens --> [ (4,5,6) ] }
    (1,2,3) --> { source gens --> [ (4,5,6) ] }
    These 3 automorphisms generate the group of automorphisms.
  : associated cat1-group is [..=>..]
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{AllCat1sBasic}}
\logpage{[ 2, 4, 2 ]}\nobreak
\hyperdef{L}{X7A081F9D826621DA}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AllCat1sBasic({\mdseries\slshape gp})\index{AllCat1sBasic@\texttt{AllCat1sBasic}}
\label{AllCat1sBasic}
}\hfill{\scriptsize (operation)}}\\


 For a group $G$ of size greater than $70$ which is reasonably straightforward this function may be used to construct a
list of all cat1-group structures on $G$. The operation also attempts to write output to a file in the folder \texttt{xmod/lib}. (Other operations in the file \texttt{cat1data.gi} have been used to deal with the more complicated groups of size up to $70$, but these are not described here.) 

 Van Luyen Le has a more efficient algorithm, extending the data up to groups
of size 171, which is expected to appear in a future release of \textsf{HAP}. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@gp := SmallGroup( 102, 2 ); |
  <pc group of size 102 with 3 generators>
  !gapprompt@gap>| !gapinput@StructureDescription( gp ); |
  "C3 x D34"
  !gapprompt@gap>| !gapinput@all := AllCat1sBasic( gp );|
  #I Edit last line of .../xmod/lib/nn.kk.out to end with ] ] ] ] ]
  [ [Group( [ f1, f2, f3 ] )=>Group( [ f1, <identity> of ..., <identity> of ... 
       ] )], [Group( [ f1, f2, f3 ] )=>Group( [ f1, f2, <identity> of ... ] )], 
    [Group( [ f1, f2, f3 ] )=>Group( [ f1, <identity> of ..., f3 ] )], 
    [Group( [ f1, f2, f3 ] )=>Group( [ f1, f2, f3 ] )] ]
  
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{More functions for crossed modules and cat1-groups}}\label{sect-extra-fns}
\logpage{[ 2, 5, 0 ]}
\hyperdef{L}{X7DFE950E7DBA9A37}{}
{
  Chapter \ref{chap-isclnc} contains functions for quotient crossed modules; centre of a crossed module;
commutator and derived subcrossed modules; etc. 

 Here we mention two functions for groups which have been extended to the
two-dimensional case. 

\subsection{\textcolor{Chapter }{IdGroup}}
\logpage{[ 2, 5, 1 ]}\nobreak
\hyperdef{L}{X78D480357BE559AD}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IdGroup({\mdseries\slshape 2dgroup})\index{IdGroup@\texttt{IdGroup}}
\label{IdGroup}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{StructureDescription({\mdseries\slshape 2dgroup})\index{StructureDescription@\texttt{StructureDescription}}
\label{StructureDescription}
}\hfill{\scriptsize (operation)}}\\


 These functions return two-element lists formed by applying the function to
the source and range of the 2d-group. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@IdGroup( X16 );|
  [ [ 8, 3 ], [ 16, 7 ] ]
  !gapprompt@gap>| !gapinput@StructureDescription( C2 );|
  [ "(S3 x d24) : C2", "d12" ]
  
\end{Verbatim}
 }

 }

          
\chapter{\textcolor{Chapter }{2d-mappings}}\label{chap-gpmap2}
\logpage{[ 3, 0, 0 ]}
\hyperdef{L}{X815144D67C1D1AE3}{}
{
  \index{2d-mapping} 
\section{\textcolor{Chapter }{Morphisms of 2d-groups}}\logpage{[ 3, 1, 0 ]}
\hyperdef{L}{X7B3E7D3F831453BF}{}
{
 \index{morphism of 2d-group} \index{crossed module morphism} This chapter describes morphisms of (pre-)crossed modules and
(pre-)cat1-groups. 

\subsection{\textcolor{Chapter }{Source}}
\logpage{[ 3, 1, 1 ]}\nobreak
\hyperdef{L}{X7DE8173F80E07AB1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Source({\mdseries\slshape map})\index{Source@\texttt{Source}}
\label{Source}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Range({\mdseries\slshape map})\index{Range@\texttt{Range}}
\label{Range}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SourceHom({\mdseries\slshape map})\index{SourceHom@\texttt{SourceHom}}
\label{SourceHom}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RangeHom({\mdseries\slshape map})\index{RangeHom@\texttt{RangeHom}}
\label{RangeHom}
}\hfill{\scriptsize (attribute)}}\\


 Morphisms of \emph{2d-groups} are implemented as \emph{2d-mappings}. These have a pair of 2d-groups as source and range, together with two group
homomorphisms mapping between corresponding source and range groups. These
functions return \texttt{fail} when invalid data is supplied. }

 }

 
\section{\textcolor{Chapter }{Morphisms of pre-crossed modules}}\logpage{[ 3, 2, 0 ]}
\hyperdef{L}{X78CADE4D7EB1EA44}{}
{
 \index{morphism} 

\subsection{\textcolor{Chapter }{IsXModMorphism}}
\logpage{[ 3, 2, 1 ]}\nobreak
\hyperdef{L}{X82B912B18127A42A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsXModMorphism({\mdseries\slshape map})\index{IsXModMorphism@\texttt{IsXModMorphism}}
\label{IsXModMorphism}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsPreXModMorphism({\mdseries\slshape map})\index{IsPreXModMorphism@\texttt{IsPreXModMorphism}}
\label{IsPreXModMorphism}
}\hfill{\scriptsize (property)}}\\


 A morphism between two pre-crossed modules $\mathcal{X}_{1} = (\partial_1 : S_1 \to R_1)$ and $\mathcal{X}_{2} = (\partial_2 : S_2 \to R_2)$ is a pair $(\sigma, \rho)$, where $\sigma : S_1 \to S_2$ and $\rho : R_1 \to R_2$ commute with the two boundary maps and are morphisms for the two actions: 
\[ \partial_2 \circ \sigma ~=~ \rho \circ \partial_1, \qquad \sigma(s^r) ~=~
(\sigma s)^{\rho r}. \]
 Thus $\sigma$ is the \texttt{SourceHom} and $\rho$ is the \texttt{RangeHom}. When $\mathcal{X}_{1} = \mathcal{X}_{2}$ and $\sigma, \rho$ are automorphisms then $(\sigma, \rho)$ is an automorphism of $\mathcal{X}_1$. The group of automorphisms is denoted by ${\rm Aut}(\mathcal{X}_1 )$. }

 

\subsection{\textcolor{Chapter }{IsInjective}}
\logpage{[ 3, 2, 2 ]}\nobreak
\hyperdef{L}{X7F065FD7822C0A12}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsInjective({\mdseries\slshape map})\index{IsInjective@\texttt{IsInjective}}
\label{IsInjective}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsSurjective({\mdseries\slshape map})\index{IsSurjective@\texttt{IsSurjective}}
\label{IsSurjective}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsSingleValued({\mdseries\slshape map})\index{IsSingleValued@\texttt{IsSingleValued}}
\label{IsSingleValued}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsTotal({\mdseries\slshape map})\index{IsTotal@\texttt{IsTotal}}
\label{IsTotal}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsBijective({\mdseries\slshape map})\index{IsBijective@\texttt{IsBijective}}
\label{IsBijective}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsEndo2dMapping({\mdseries\slshape map})\index{IsEndo2dMapping@\texttt{IsEndo2dMapping}}
\label{IsEndo2dMapping}
}\hfill{\scriptsize (property)}}\\


 The usual properties of mappings are easily checked. It is usually sufficient
to verify that both the \texttt{SourceHom} and the \texttt{RangeHom} have the required property. }

 

\subsection{\textcolor{Chapter }{XModMorphism}}
\logpage{[ 3, 2, 3 ]}\nobreak
\hyperdef{L}{X7CEABD6487CF2A38}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{XModMorphism({\mdseries\slshape args})\index{XModMorphism@\texttt{XModMorphism}}
\label{XModMorphism}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{XModMorphismByHoms({\mdseries\slshape X1, X2, sigma, rho})\index{XModMorphismByHoms@\texttt{XModMorphismByHoms}}
\label{XModMorphismByHoms}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PreXModMorphism({\mdseries\slshape args})\index{PreXModMorphism@\texttt{PreXModMorphism}}
\label{PreXModMorphism}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PreXModMorphismByHoms({\mdseries\slshape P1, P2, sigma, rho})\index{PreXModMorphismByHoms@\texttt{PreXModMorphismByHoms}}
\label{PreXModMorphismByHoms}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{InclusionMorphism2dDomains({\mdseries\slshape X1, S1})\index{InclusionMorphism2dDomains@\texttt{InclusionMorphism2dDomains}}
\label{InclusionMorphism2dDomains}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{InnerAutomorphismXMod({\mdseries\slshape X1, r})\index{InnerAutomorphismXMod@\texttt{InnerAutomorphismXMod}}
\label{InnerAutomorphismXMod}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IdentityMapping({\mdseries\slshape X1})\index{IdentityMapping@\texttt{IdentityMapping}}
\label{IdentityMapping}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsomorphismPerm2dGroup({\mdseries\slshape obj})\index{IsomorphismPerm2dGroup@\texttt{IsomorphismPerm2dGroup}}
\label{IsomorphismPerm2dGroup}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsomorphismPc2dGroup({\mdseries\slshape obj})\index{IsomorphismPc2dGroup@\texttt{IsomorphismPc2dGroup}}
\label{IsomorphismPc2dGroup}
}\hfill{\scriptsize (function)}}\\


 These are the constructors for morphisms of pre-crossed and crossed modules. 

 In the following example we construct a simple automorphism of the crossed
module \texttt{X1} constructed in the previous chapter. }

 

 \index{display a 2d-mapping} \index{order of a 2d-automorphism} 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@sigma1 := GroupHomomorphismByImages( c5, c5, [ (5,6,7,8,9) ]|
          [ (5,9,8,7,6) ] );;
  !gapprompt@gap>| !gapinput@rho1 := IdentityMapping( Range( X1 ) );|
  IdentityMapping( PAut(c5) )
  !gapprompt@gap>| !gapinput@mor1 := XModMorphism( X1, X1, sigma1, rho1 );|
  [[c5->PAut(c5))] => [c5->PAut(c5))]] 
  !gapprompt@gap>| !gapinput@Display( mor1 );|
  Morphism of crossed modules :-
  : Source = [c5->PAut(c5))] with generating sets:
    [ (5,6,7,8,9) ]
    [ (1,2,3,4) ]
  : Range = Source
  : Source Homomorphism maps source generators to:
    [ (5,9,8,7,6) ]
  : Range Homomorphism maps range generators to:
    [ (1,2,3,4) ]
  !gapprompt@gap>| !gapinput@IsAutomorphism2dDomain( mor1 );|
  true 
  !gapprompt@gap>| !gapinput@Order( mor1 );|
  2
  !gapprompt@gap>| !gapinput@RepresentationsOfObject( mor1 );|
  [ "IsComponentObjectRep", "IsAttributeStoringRep", "Is2dMappingRep" ]
  !gapprompt@gap>| !gapinput@KnownPropertiesOfObject( mor1 );|
  [ "CanEasilyCompareElements", "CanEasilySortElements", "IsTotal", 
    "IsSingleValued", "IsInjective", "IsSurjective", "RespectsMultiplication", 
    "IsPreXModMorphism", "IsXModMorphism", "IsEndomorphism2dDomain", 
    "IsAutomorphism2dDomain" ]
  !gapprompt@gap>| !gapinput@KnownAttributesOfObject( mor1 );|
  [ "Name", "Order", "Range", "Source", "SourceHom", "RangeHom" ]
  
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{Morphisms of pre-cat1-groups}}\label{sect-mor-pre-cat1}
\logpage{[ 3, 3, 0 ]}
\hyperdef{L}{X84DDF8247FC4982B}{}
{
  A morphism of pre-cat1-groups from $\mathcal{C}_1 = (e_1;t_1,h_1 : G_1 \to R_1)$ to $\mathcal{C}_2 = (e_2;t_2,h_2 : G_2 \to R_2)$ is a pair $(\gamma, \rho)$ where $\gamma : G_1 \to G_2$ and $\rho : R_1 \to R_2$ are homomorphisms satisfying 
\[ h_2 \circ \gamma ~=~ \rho \circ h_1, \qquad t_2 \circ \gamma ~=~ \rho \circ
t_1, \qquad e_2 \circ \rho ~=~ \gamma \circ e_1. \]
 

\subsection{\textcolor{Chapter }{IsCat1Morphism}}
\logpage{[ 3, 3, 1 ]}\nobreak
\hyperdef{L}{X7BB8A8E0803AC8E5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsCat1Morphism({\mdseries\slshape map})\index{IsCat1Morphism@\texttt{IsCat1Morphism}}
\label{IsCat1Morphism}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsPreCat1Morphism({\mdseries\slshape map})\index{IsPreCat1Morphism@\texttt{IsPreCat1Morphism}}
\label{IsPreCat1Morphism}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Cat1Morphism({\mdseries\slshape args})\index{Cat1Morphism@\texttt{Cat1Morphism}}
\label{Cat1Morphism}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Cat1MorphismByHoms({\mdseries\slshape C1, C2, gamma, rho})\index{Cat1MorphismByHoms@\texttt{Cat1MorphismByHoms}}
\label{Cat1MorphismByHoms}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PreCat1Morphism({\mdseries\slshape args})\index{PreCat1Morphism@\texttt{PreCat1Morphism}}
\label{PreCat1Morphism}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PreCat1MorphismByHoms({\mdseries\slshape P1, P2, gamma, rho})\index{PreCat1MorphismByHoms@\texttt{PreCat1MorphismByHoms}}
\label{PreCat1MorphismByHoms}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{InclusionMorphism2dDomains({\mdseries\slshape C1, S1})\index{InclusionMorphism2dDomains@\texttt{InclusionMorphism2dDomains}}
\label{InclusionMorphism2dDomains}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{InnerAutomorphismCat1({\mdseries\slshape C1, r})\index{InnerAutomorphismCat1@\texttt{InnerAutomorphismCat1}}
\label{InnerAutomorphismCat1}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IdentityMapping({\mdseries\slshape C1})\index{IdentityMapping@\texttt{IdentityMapping}}
\label{IdentityMapping}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SmallerDegreePerm2dDomain({\mdseries\slshape obj})\index{SmallerDegreePerm2dDomain@\texttt{SmallerDegreePerm2dDomain}}
\label{SmallerDegreePerm2dDomain}
}\hfill{\scriptsize (function)}}\\


 The global function \texttt{IsomorphismPermObject} calls \texttt{IsomorphismPerm2dGroup}, which constructs a morphism whose \texttt{SourceHom} and \texttt{RangeHom} are calculated using \texttt{IsomorphismPermGroup} on the source and range. Similarly \texttt{SmallerDegreePermutationRepresentation} is used on the two groups to obtain \texttt{SmallerDegreePerm2dDomain}. Names are assigned automatically. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@iso2 := IsomorphismPerm2dGroup( C2 );|
  [[G2=>d12] => [..]]
  !gapprompt@gap>| !gapinput@Display( iso2 );|
  Morphism of cat1-groups :- 
  : Source = [G2=>d12] with generating sets:
    [ f1, f2, f3, f4, f5, f6, f7 ]
    [ f1, f2, f3 ]
  :  Range = P[G2=>d12] with generating sets:
    [ ( 6,12)( 8,15)( 9,16)(11,19)(13,26)(14,22)(17,27)(18,25)(20,21)(23,24), 
    ( 2, 3)( 5,10)( 9,16)(11,18)(17,23)(19,25)(24,27), 
    ( 4, 5, 7,10)( 6, 9,12,16)( 8,11,14,18)(13,17,20,23)(15,19,22,25)
      (21,24,26,27), ( 4, 6, 7,12)( 5, 9,10,16)( 8,13,14,20)(11,17,18,23)
      (15,21,22,26)(19,24,25,27), ( 4, 7)( 5,10)( 6,12)( 8,14)( 9,16)(11,18)
      (13,20)(15,22)(17,23)(19,25)(21,26)(24,27), ( 1, 2, 3), 
    ( 4, 8,15)( 5,11,19)( 6,13,21)( 7,14,22)( 9,17,24)(10,18,25)(12,20,26)
      (16,23,27) ]
    [ (2,6)(3,5), (1,2,3,4,5,6), (1,3,5)(2,4,6) ]
  : Source Homomorphism maps source generators to:
    [ ( 6,12)( 8,15)( 9,16)(11,19)(13,26)(14,22)(17,27)(18,25)(20,21)(23,24), 
    ( 2, 3)( 5,10)( 9,16)(11,18)(17,23)(19,25)(24,27), 
    ( 4, 5, 7,10)( 6, 9,12,16)( 8,11,14,18)(13,17,20,23)(15,19,22,25)
      (21,24,26,27), ( 4, 6, 7,12)( 5, 9,10,16)( 8,13,14,20)(11,17,18,23)
      (15,21,22,26)(19,24,25,27), ( 4, 7)( 5,10)( 6,12)( 8,14)( 9,16)(11,18)
      (13,20)(15,22)(17,23)(19,25)(21,26)(24,27), ( 1, 2, 3), 
    ( 4, 8,15)( 5,11,19)( 6,13,21)( 7,14,22)( 9,17,24)(10,18,25)(12,20,26)
      (16,23,27) ]
  : Range Homomorphism maps range generators to:
    [ (2,6)(3,5), (1,2,3,4,5,6), (1,3,5)(2,4,6) ]
  
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{Operations on morphisms}}\label{sect-oper-mor}
\logpage{[ 3, 4, 0 ]}
\hyperdef{L}{X7B09A28579707CAF}{}
{
  \index{operations on morphisms} 

\subsection{\textcolor{Chapter }{CompositionMorphism}}
\logpage{[ 3, 4, 1 ]}\nobreak
\hyperdef{L}{X811F886081AAB95F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CompositionMorphism({\mdseries\slshape map2, map1})\index{CompositionMorphism@\texttt{CompositionMorphism}}
\label{CompositionMorphism}
}\hfill{\scriptsize (operation)}}\\


 Composition of morphisms (written \texttt{({\textless}map1{\textgreater} * {\textless}map2{\textgreater})} when maps act on the right) calls the \texttt{CompositionMorphism} function for maps (acting on the left), applied to the appropriate type of
2d-mapping. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@H2 := Subgroup(G2,[G2.3,G2.4,G2.6,G2.7]);  SetName( H2, "H2" );|
  Group([ f3, f4, f6, f7 ])
  !gapprompt@gap>| !gapinput@c6 := Subgroup( d12, [b,c] );  SetName( c6, "c6" );|
  Group([ f2, f3 ])
  !gapprompt@gap>| !gapinput@SC2 := Sub2dGroup( C2, H2, c6 );|
  [H2=>c6]
  !gapprompt@gap>| !gapinput@IsCat1( SC2 );|
  true
  !gapprompt@gap>| !gapinput@inc2 := InclusionMorphism2dDomains( C2, SC2 );|
  [[H2=>c6] => [G2=>d12]]
  !gapprompt@gap>| !gapinput@CompositionMorphism( iso2, inc );                  |
  [[H2=>c6] => P[G2=>d12]]
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{Kernel}}
\logpage{[ 3, 4, 2 ]}\nobreak
\hyperdef{L}{X7DCD99628504B810}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Kernel({\mdseries\slshape map})\index{Kernel@\texttt{Kernel}}
\label{Kernel}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Kernel2dMapping({\mdseries\slshape map})\index{Kernel2dMapping@\texttt{Kernel2dMapping}}
\label{Kernel2dMapping}
}\hfill{\scriptsize (attribute)}}\\


 The kernel of a morphism of crossed modules is a normal subcrossed module
whose groups are the kernels of the source and target homomorphisms. The
inclusion of the kernel is a standard example of a crossed square, but these
have not yet been implemented. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@c2 := Group( (19,20) );                                    |
  Group([ (19,20) ])
  !gapprompt@gap>| !gapinput@X0 := XModByNormalSubgroup( c2, c2 );  SetName( X0, "X0" );|
  [Group( [ (19,20) ] )->Group( [ (19,20) ] )]
  !gapprompt@gap>| !gapinput@ SX2 := Source( X2 );;|
  !gapprompt@gap>| !gapinput@genSX2 := GeneratorsOfGroup( SX2 ); |
  [ f1, f4, f5, f7 ]
  !gapprompt@gap>| !gapinput@sigma0 := GroupHomomorphismByImages(SX2,c2,genSX2,[(19,20),(),(),()]);|
  [ f1, f4, f5, f7 ] -> [ (19,20), (), (), () ]
  !gapprompt@gap>| !gapinput@rho0 := GroupHomomorphismByImages(d12,c2,[a1,a2,a3],[(19,20),(),()]);|
  [ f1, f2, f3 ] -> [ (19,20), (), () ]
  !gapprompt@gap>| !gapinput@mor0 := XModMorphism( X2, X0, sigma0, rho0 );;           |
  !gapprompt@gap>| !gapinput@K0 := Kernel( mor0 );|
  [Group( [ <identity> of ..., f4, f5, f7 ] )->Group( 
  [ <identity> of ..., f2, f3 ] )]
   ] )]
\end{Verbatim}
 }

 }

         
\chapter{\textcolor{Chapter }{Isoclinism of groups and crossed modules}}\label{chap-isclnc}
\logpage{[ 4, 0, 0 ]}
\hyperdef{L}{X802AFE8E7EDB435E}{}
{
  This chapter describes some functions written by Alper Odaba{\c s} and Enver
Uslu, and reported in their paper \cite{IOU1}. Section \ref{sect-more-xmod-ops} contains some additional basic functions for crossed modules, constructing
quotients, centres, centralizers and normalizers. In Sections \ref{sect-isoclinic-groups} and \ref{sect-isoclinic-xmods} there are functions dealing specifically with isoclinism for groups and for
crossed modules. Since these functions represent a recent addition to the
package (as of November 2015), the function names are liable to change in
future versions. The notion of isoclinism has been crucial to the enumeration
of groups of prime power order, see for example James, Newman and O'Brien, \cite{JNO}. 
\section{\textcolor{Chapter }{More operations for crossed modules}}\label{sect-more-xmod-ops}
\logpage{[ 4, 1, 0 ]}
\hyperdef{L}{X7E373BF3836B3A9C}{}
{
  

\subsection{\textcolor{Chapter }{FactorXMod}}
\logpage{[ 4, 1, 1 ]}\nobreak
\hyperdef{L}{X7F83C9347F1DC7CC}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{FactorXMod({\mdseries\slshape X1, X2})\index{FactorXMod@\texttt{FactorXMod}}
\label{FactorXMod}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NaturalMorphismByNormalSubXMod({\mdseries\slshape X1, X2})\index{NaturalMorphismByNormalSubXMod@\texttt{NaturalMorphismByNormalSubXMod}}
\label{NaturalMorphismByNormalSubXMod}
}\hfill{\scriptsize (operation)}}\\


 When $\mathcal{X}_2 = (\partial_2 : S_2 \to R_2)$ is a normal subcrossed module of $\mathcal{X}_1 = (\partial_1 : S_1 \to R_1)$, then the quotient crossed module is $(\partial : S_2/S_1 \to R_2/R_1)$ with the induced boundary and action maps. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@d24 := DihedralGroup(24);;  SetName( d24, "d24" );|
  !gapprompt@gap>| !gapinput@X24 := XModByAutomorphismGroup( d24 );;  Size(X24);|
  [ 24, 48 ]
  !gapprompt@gap>| !gapinput@nsx := NormalSubXMods( X24 );; |
  !gapprompt@gap>| !gapinput@ids := List( nsx, n -> IdGroup(n) );; |
  !gapprompt@gap>| !gapinput@pos1 := Position( ids, [ [4,1], [8,3] ] );;|
  !gapprompt@gap>| !gapinput@Xn1 := nsx[pos1]; |
  [Group( [ f2*f4^2, f3*f4 ] )->Group( [ f3, f4, f5 ] )]
  !gapprompt@gap>| !gapinput@Size( Xn1 );|
  [ 4, 8 ]
  !gapprompt@gap>| !gapinput@nat1 := NaturalMorphismByNormalSubXMod( X24, Xn1 ); |
  [[d24->PAut(d24)] => [..]]
  !gapprompt@gap>| !gapinput@Qn1 := FactorXMod( X24, Xn1 );; |
  !gapprompt@gap>| !gapinput@Size( Qn1 );|
  [ 6, 6 ]
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{IntersectionSubXMods}}
\logpage{[ 4, 1, 2 ]}\nobreak
\hyperdef{L}{X8591E25680C5C575}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IntersectionSubXMods({\mdseries\slshape X0, X1, X2})\index{IntersectionSubXMods@\texttt{IntersectionSubXMods}}
\label{IntersectionSubXMods}
}\hfill{\scriptsize (operation)}}\\


 When \texttt{X1,X2} are subcrossed modules of \texttt{X0}, then the source and range of their intersection are the intersections of the
sources and ranges of \texttt{X1} and \texttt{X2} respectively. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@pos2 := Position( ids, [ [24,6], [12,4] ] );;|
  !gapprompt@gap>| !gapinput@Xn2 := nsx[pos2]; |
  [d24->Group( [ f1*f3, f2, f5 ] )]
  !gapprompt@gap>| !gapinput@pos3 := Position( ids, [ [12,2], [24,5] ] );;|
  !gapprompt@gap>| !gapinput@Xn3 := nsx[pos3]; |
  [Group( [ f2, f3, f4 ] )->Group( [ f1, f2, f4, f5 ] )]
  !gapprompt@gap>| !gapinput@Xn23 := IntersectionSubXMods( X24, Xn2, Xn3 );|
  [Group( [ f2, f3, f4 ] )->Group( [ f2, f5, f2^2, f2*f5, f2^2*f5 ] )]
  !gapprompt@gap>| !gapinput@[ Size(Xn2), Size(Xn3), Size(Xn23) ];|
  [ [ 24, 12 ], [ 12, 24 ], [ 12, 6 ] ]
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{Displacement}}
\logpage{[ 4, 1, 3 ]}\nobreak
\hyperdef{L}{X7E20208279038BB8}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Displacement({\mdseries\slshape alpha, r, s})\index{Displacement@\texttt{Displacement}}
\label{Displacement}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DisplacementSubgroup({\mdseries\slshape X0})\index{DisplacementSubgroup@\texttt{DisplacementSubgroup}}
\label{DisplacementSubgroup}
}\hfill{\scriptsize (attribute)}}\\


 Commutators may be written $[r,q] = r^{-1}q^{-1}rq = (q^{-1})^rq = r^{-1}r^q$, and satisfy identities 
\[ [r,q]^p = [r^p,q^p], \qquad [pr,q] = [p,q]^r[r,q], \qquad [r,pq] =
[r,q][r,p]^q, \qquad [r,q]^{-1} = [q,r]. \]
 In a similar way, when a group $R$ acts on a group $S$, the \emph{displacement} of $s \in S$ by $r \in R$ is defined to be $\langle r,s \rangle := (s^{-1})^rs \in S$. When $\mathcal{X} = (\partial : S \to R)$ is a pre-crossed module, the first crossed module axiom requires $\partial\langle r,s \rangle = [r,\partial s]$. For a given action $\alpha$ the \texttt{Displacement} function may be used to calculate $\langle r,s \rangle$. Displacements satisfy the following identities, where $s,t \in S,~ p,q,r \in R$: 
\[ \langle r,s \rangle^p = \langle r^p,s^p \rangle, \qquad \langle qr,s \rangle =
\langle q,s \rangle^r \langle r,s \rangle, \qquad \langle r,st \rangle =
\langle r,t \rangle \langle r,s \rangle^t, \qquad \langle r,s \rangle^{-1} =
\langle r^{-1},s^r \rangle. \]
 The \texttt{DisplacementSubgroup} of $\mathcal{X}$ is the subgroup $\mathop{\textrm{Disp}\rm}(\mathcal{X})$ of $S$ generated by these displacements. The identities imply $\langle r,s \rangle^t = \langle r,st^{r^{-1}} \rangle \langle r^{-1},t \rangle$, so $\mathop{\textrm{Disp}\rm}(\mathcal{X})$ is normal in $S$. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@pos4 := Position( ids, [ [6,2], [24,14] ] );;|
  !gapprompt@gap>| !gapinput@Xn4 := nsx[pos4];; |
  !gapprompt@gap>| !gapinput@Sn4 := Source(Xn4);; |
  !gapprompt@gap>| !gapinput@Rn4 := Range(Xn4);; |
  !gapprompt@gap>| !gapinput@r := Rn4.1;;  s := Sn4.1;; |
  !gapprompt@gap>| !gapinput@d := Displacement( XModAction(Xn4), r, s );|
  f4
  !gapprompt@gap>| !gapinput@bn4 := Boundary( Xn4 );;|
  !gapprompt@gap>| !gapinput@Image( bn4, d ) = Comm( r, Image( bn4, s ) );  |
  true
  !gapprompt@gap>| !gapinput@DisplacementSubgroup( Xn4 );|
  Group([ f4 ])
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{CommutatorSubXMod}}
\logpage{[ 4, 1, 4 ]}\nobreak
\hyperdef{L}{X86ACB83E7D70C625}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CommutatorSubXMod({\mdseries\slshape X, X1, X2})\index{CommutatorSubXMod@\texttt{CommutatorSubXMod}}
\label{CommutatorSubXMod}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CrossActionSubgroup({\mdseries\slshape X, X1, X2})\index{CrossActionSubgroup@\texttt{CrossActionSubgroup}}
\label{CrossActionSubgroup}
}\hfill{\scriptsize (operation)}}\\


 When $\mathcal{X}_1 = (N \to Q), \mathcal{X}_2 = (M \to P)$ are two normal subcrossed modules of $\mathcal{X} = (\partial : S \to R)$, the displacements $\langle p,n \rangle$ and $\langle q,m \rangle$ all map by $\partial$ into $[Q,P]$. These displacements form a normal subgroup of $S$, called the \texttt{CrossActionSubgroup}. The \texttt{CommutatorSubXMod} $[\mathcal{X}_1,\mathcal{X}_2]$ has this subgroup as source and $[P,Q]$ as range, and is normal in $\mathcal{X}$. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@CrossActionSubgroup( X24, Xn2, Xn3 );|
  Group([ f2 ])
  !gapprompt@gap>| !gapinput@Cn23 := CommutatorSubXMod( X24, Xn2, Xn3 );|
  [Group( [ f2 ] )->Group( [ f2, f5 ] )]
  !gapprompt@gap>| !gapinput@Size(Cn23);|
  [ 12, 6 ]
  !gapprompt@gap>| !gapinput@Xn23 = Cn23;|
  true
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{DerivedSubXMod}}
\logpage{[ 4, 1, 5 ]}\nobreak
\hyperdef{L}{X86E0804B780A7FD6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DerivedSubXMod({\mdseries\slshape X0})\index{DerivedSubXMod@\texttt{DerivedSubXMod}}
\label{DerivedSubXMod}
}\hfill{\scriptsize (attribute)}}\\


 The \texttt{DerivedSubXMod} of $\mathcal{X}$ is the normal subcrossed module $[\mathcal{X},\mathcal{X}] = (\partial' :
\mathop{\textrm{Disp}\rm}(\mathcal{X}) \to [R,R])$ where $\partial'$ is the restriction of $\partial$ (see page 66 of Norrie's thesis \cite{N2}). }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@DXn4 := DerivedSubXMod( Xn4 );  |
  [Group( [ f4 ] )->Group( [ f2 ] )]
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{FixedPointSubgroupXMod}}
\logpage{[ 4, 1, 6 ]}\nobreak
\hyperdef{L}{X85640DD17F5A2949}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{FixedPointSubgroupXMod({\mdseries\slshape X0, T, Q})\index{FixedPointSubgroupXMod@\texttt{FixedPointSubgroupXMod}}
\label{FixedPointSubgroupXMod}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{StabilizerSubgroupXMod({\mdseries\slshape X0, T, Q})\index{StabilizerSubgroupXMod@\texttt{StabilizerSubgroupXMod}}
\label{StabilizerSubgroupXMod}
}\hfill{\scriptsize (operation)}}\\


 The \texttt{FixedPointSubgroupXMod(X,T,Q)} for $\mathcal{X}=(\partial : S \to R)$ is the subgroup $\mathop{\textrm{Fix}\rm}(\mathcal{X},T,Q)$ of elements $t \in T \leqslant S$ individually fixed under the action of $Q \leqslant R$. 

 The \texttt{StabilizerSubgroupXMod(X,T,Q)} for $\mathcal{X}$ is the subgroup $\mathop{\textrm{Stab}\rm}(\mathcal{X},T,Q)$ of $Q \leqslant R$ whose elements act trivially on the whole of $T \leqslant S$ (see page 19 of Norrie's thesis \cite{N2}). }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@fix := FixedPointSubgroupXMod( Xn4, Sn4, Rn4 );|
  Group([ f3*f4 ])
  !gapprompt@gap>| !gapinput@stab := StabilizerSubgroupXMod( Xn4, Sn4, Rn4 );|
  Group([ f5, f2*f3 ])
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{CentreXMod}}
\logpage{[ 4, 1, 7 ]}\nobreak
\label{CentreXMod}
\hyperdef{L}{X7B57446086BA1BF0}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CentreXMod({\mdseries\slshape X0})\index{CentreXMod@\texttt{CentreXMod}}
\label{CentreXMod}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Centralizer({\mdseries\slshape X, Y})\index{Centralizer@\texttt{Centralizer}}
\label{Centralizer}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Normalizer({\mdseries\slshape X, Y})\index{Normalizer@\texttt{Normalizer}}
\label{Normalizer}
}\hfill{\scriptsize (operation)}}\\


 The \emph{centre} $Z(\mathcal{X})$ of $\mathcal{X} = (\partial : S \to R)$ has as source the fixed point subgroup $\mathop{\textrm{Fix}\rm}(\mathcal{X},S,R)$. The range is the intersection of the centre $Z(R)$ with the stabilizer subgroup. 

 When $\mathcal{Y} = (T \to Q)$ is a subcrossed module of $\mathcal{X} = (\partial : S \to R)$, the \emph{centralizer} $C_{\mathcal{X}}(\mathcal{Y})$ of $\mathcal{Y}$ has as source the fixed point subgroup $\mathop{\textrm{Fix}\rm}(\mathcal{X},S,Q)$. The range is the intersection of the centralizer $C_R(Q)$ with $\mathop{\textrm{Stab}\rm}(\mathcal{X},T,R)$. 

 The \emph{normalizer} $N_{\mathcal{X}}(\mathcal{Y})$ of $\mathcal{Y}$ has as source the subgroup of $S$ consisting of the displacements $\langle s,q \rangle$ which lie in $S$. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@ZXn4 := CentreXMod( Xn4 );      |
  [Group( [ f3*f4 ] )->Group( [ f3, f5 ] )]
  !gapprompt@gap>| !gapinput@IdGroup( ZXn4 );|
  [ [ 2, 1 ], [ 4, 2 ] ]
  !gapprompt@gap>| !gapinput@CDXn4 := Centralizer( Xn4, DXn4 );|
  [Group( [ f3*f4 ] )->Group( [ f2 ] )]
  !gapprompt@gap>| !gapinput@IdGroup( CDXn4 );    |
  [ [ 2, 1 ], [ 3, 1 ] ]
  !gapprompt@gap>| !gapinput@NDXn4 := Normalizer( Xn4, DXn4 ); |
  [Group( <identity> of ... )->Group( [ f5, f2*f3 ] )]
  !gapprompt@gap>| !gapinput@IdGroup( NDXn4 );|
  [ [ 1, 1 ], [ 12, 5 ] ]
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{CentralQuotient}}
\logpage{[ 4, 1, 8 ]}\nobreak
\hyperdef{L}{X814D9E1E78EEE665}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CentralQuotient({\mdseries\slshape G})\index{CentralQuotient@\texttt{CentralQuotient}}
\label{CentralQuotient}
}\hfill{\scriptsize (attribute)}}\\


 The \texttt{CentralQuotient} of a group $G$ is the crossed module $(G \to G/Z(G))$ with the natural homomorphism as the boundary map. This is a special case of \texttt{XModByCentralExtension} (see \ref{sect-constructions}). 

 Similarly, the central quotient of a crossed module $\mathcal{X}$ is the crossed square $(\mathcal{X} \Rightarrow \mathcal{X}/Z(\mathcal{X})$ (see section \ref{sect-xsq-constructions}). }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@Q24 := CentralQuotient( d24 );  Size( Q24 );                     |
  [d24->Group( [ f1, f2, f3 ] )]
  [ 24, 12 ]
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{IsAbelian2dGroup}}
\logpage{[ 4, 1, 9 ]}\nobreak
\hyperdef{L}{X7A49EABB80CC67AD}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsAbelian2dGroup({\mdseries\slshape X0})\index{IsAbelian2dGroup@\texttt{IsAbelian2dGroup}}
\label{IsAbelian2dGroup}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsAspherical2dGroup({\mdseries\slshape X0})\index{IsAspherical2dGroup@\texttt{IsAspherical2dGroup}}
\label{IsAspherical2dGroup}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsSimplyConnected2dGroup({\mdseries\slshape X0})\index{IsSimplyConnected2dGroup@\texttt{IsSimplyConnected2dGroup}}
\label{IsSimplyConnected2dGroup}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsFaithful2dGroup({\mdseries\slshape X0})\index{IsFaithful2dGroup@\texttt{IsFaithful2dGroup}}
\label{IsFaithful2dGroup}
}\hfill{\scriptsize (property)}}\\


 A crossed module is \emph{abelian} if it equal to its centre. This is the case when the range group is abelian
and the action is trivial. 

 A crossed module is \emph{aspherical} if the boundary has trivial kernel. 

 A crossed module is \emph{simply connected} if the boundary has trivial cokernel. 

 A crossed module is \emph{faithful} if the action is faithful. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@[ IsAbelian2dGroup(Xn4), IsAbelian2dGroup(X24) ];
|
  [ false, false ]
  !gapprompt@gap>| !gapinput@pos7 := Position( ids, [ [3,1], [6,1] ] );;
|
  !gapprompt@gap>| !gapinput@[ IsAspherical2dGroup(nsx[pos7]), IsAspherical2dGroup(X24) ];
|
  [ true, false ]
  !gapprompt@gap>| !gapinput@[ IsSimplyConnected2dGroup(Xn4), IsSimplyConnected2dGroup(X24) ];|
  [ true, true ]
  !gapprompt@gap>| !gapinput@[ IsFaithful2dGroup(Xn4), IsFaithful2dGroup(X24) ];              |
  [ false, true ] 
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{LowerCentralSeriesOfXMod}}
\logpage{[ 4, 1, 10 ]}\nobreak
\hyperdef{L}{X87C524C08588AAC0}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LowerCentralSeriesOfXMod({\mdseries\slshape X0})\index{LowerCentralSeriesOfXMod@\texttt{LowerCentralSeriesOfXMod}}
\label{LowerCentralSeriesOfXMod}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsNilpotent2dGroup({\mdseries\slshape X0})\index{IsNilpotent2dGroup@\texttt{IsNilpotent2dGroup}}
\label{IsNilpotent2dGroup}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NilpotencyClass2dGroup({\mdseries\slshape X0})\index{NilpotencyClass2dGroup@\texttt{NilpotencyClass2dGroup}}
\label{NilpotencyClass2dGroup}
}\hfill{\scriptsize (attribute)}}\\


 Let $\mathcal{Y}$ be a subcrossed module of $\mathcal{X}$. A \emph{ series of length} $n$ from $\mathcal{X}$ to $\mathcal{Y}$ has the form 
\[ \mathcal{X} ~=~ \mathcal{X}_0 ~\unrhd~ \mathcal{X}_1 ~\unrhd~ \cdots ~\unrhd~
\mathcal{X}_i ~\unrhd~ \cdots ~\unrhd~ \mathcal{X}_n ~=~ \mathcal{Y} \quad (1
\leqslant i \leqslant n). \]
 The quotients $\mathcal{F}_i = \mathcal{X}_i / \mathcal{X}_{i-1}$ are the \emph{factors} of the series. 

 A factor $\mathcal{F}_i$ is \emph{central} if $\mathcal{X}_{i-1} \unlhd \mathcal{X}$ and $\mathcal{F}_i$ is a subcrossed module of the centre of $\mathcal{X} / \mathcal{X}_{i-1}$. 

 A series is \emph{central} if all its factors are central. 

 $\mathcal{X}$ is \emph{soluble} if it has a series all of whose factors are abelian. 

 $\mathcal{X}$ is \emph{nilpotent} is it has a series all of whose factors are central factors of $\mathcal{X}$. 

 The \emph{lower central series} of $\mathcal{X}$ is the sequence (see \cite{N2}, p.77): 
\[ \mathcal{X} ~=~ \Gamma_1(\mathcal{X}) ~\unrhd~ \Gamma_2(\mathcal{X}) ~\unrhd~
\cdots \qquad \mbox{where} \qquad \Gamma_j(\mathcal{X}) ~=~ [
\Gamma_{j-1}(\mathcal{X}), \mathcal{X}]. \]
 If $\mathcal{X}$ is nilpotent, then its lower central series is its most rapidly descending
central series. 

 The least integer $c$ such that $\Gamma_{c+1}(\mathcal{X})$ is the trivial crossed module is the \emph{nilpotency class} of $\mathcal{X}$. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@LowerCentralSeries(X24);      |
  [ [d24->PAut(d24)], [Group( [ f2 ] )->Group( [ f2, f5 ] )], 
    [Group( [ f3*f4^2 ] )->Group( [ f2 ] )], [Group( [ f4 ] )->Group( [ f2 ] )] 
   ]
  !gapprompt@gap>| !gapinput@IsNilpotent2dGroup(X24);      |
  false
  !gapprompt@gap>| !gapinput@NilpotencyClassOf2dGroup(X24);|
  0
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{AllXMods}}
\logpage{[ 4, 1, 11 ]}\nobreak
\hyperdef{L}{X81EE2188863E6E85}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AllXMods({\mdseries\slshape args})\index{AllXMods@\texttt{AllXMods}}
\label{AllXMods}
}\hfill{\scriptsize (function)}}\\


 The global function \texttt{AllXMods} may be called in three ways: as \texttt{AllXMods(S,R)} to compute all crossed modules with chosen source and range groups; as \texttt{AllXMods([n,m])} to compute all crossed modules with a given size; or as \texttt{AllXMods(ord)} to compute all crossed modules whose associated cat1-groups have a given size \texttt{ord}. 

 In the example we see that there are $4$ crossed modules $(C_6 \to S_3)$; forming a subset of the $17$ crossed modules with size \texttt{[6,6]}; and that these form a subset of the $205$ crossed modules whose cat1-group has size $36$. There are $40$ precrossed modules with size \texttt{[6,6]}. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@xc6s3 := AllXMods( SmallGroup(6,2), SmallGroup(6,1) );;   |
  !gapprompt@gap>| !gapinput@Length( xc6s3 );           |
  4
  !gapprompt@gap>| !gapinput@x66 := AllXMods( [6,6] );;   |
  !gapprompt@gap>| !gapinput@Length( x66 );|
  17
  !gapprompt@gap>| !gapinput@x36 := AllXMods( 36 );; |
  !gapprompt@gap>| !gapinput@Length( x36 ); |
  205
  !gapprompt@gap>| !gapinput@size36 := List( x36, x -> [ Size(Source(x)), Size(Range(x)) ] );;|
  !gapprompt@gap>| !gapinput@Collected( size36 );|
  [ [ [ 1, 36 ], 14 ], [ [ 2, 18 ], 7 ], [ [ 3, 12 ], 21 ], [ [ 4, 9 ], 14 ], 
    [ [ 6, 6 ], 17 ], [ [ 9, 4 ], 102 ], [ [ 12, 3 ], 8 ], [ [ 18, 2 ], 18 ], 
    [ [ 36, 1 ], 4 ] ]
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{IsomorphismXMods}}
\logpage{[ 4, 1, 12 ]}\nobreak
\hyperdef{L}{X7C67623F797A0301}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsomorphismXMods({\mdseries\slshape X1, X2})\index{IsomorphismXMods@\texttt{IsomorphismXMods}}
\label{IsomorphismXMods}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AllXModsUpToIsomorphism({\mdseries\slshape list})\index{AllXModsUpToIsomorphism@\texttt{AllXModsUpToIsomorphism}}
\label{AllXModsUpToIsomorphism}
}\hfill{\scriptsize (operation)}}\\


 The function \texttt{IsomorphismXMods} computes an isomorphism $\mu : \mathcal{X}_1 \to \mathcal{X}_2$, provided one exists, or else returns \texttt{fail}. In the example below we see that the $17$ crossed modules of size \texttt{[6,6]} in \texttt{x66} (see the previous subsection) fall into $9$ isomorphism classes. 

 The function \texttt{AllXModsUpToIsomorphism} takes a list of crossed modules and partitions them into isomorphism classes. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@IsomorphismXMods( x66[1], x66[2] );|
  [[Group( [ f1, f2 ] )->Group( [ f1, f2 ] )] => [Group( [ f1, f2 ] )->Group( 
  [ f1, f2 ] )]]
  !gapprompt@gap>| !gapinput@iso66 := AllXModsUpToIsomorphism( x66 );;  Length( iso66 ); |
  9 
  
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{Isoclinism for groups}}\label{sect-isoclinic-groups}
\logpage{[ 4, 2, 0 ]}
\hyperdef{L}{X7B0D511A82FD945E}{}
{
  

\subsection{\textcolor{Chapter }{Isoclinism}}
\logpage{[ 4, 2, 1 ]}\nobreak
\hyperdef{L}{X802A38467C55732E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Isoclinism({\mdseries\slshape G, H})\index{Isoclinism@\texttt{Isoclinism}}
\label{Isoclinism}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AreIsoclinicDomains({\mdseries\slshape G, H})\index{AreIsoclinicDomains@\texttt{AreIsoclinicDomains}}
\label{AreIsoclinicDomains}
}\hfill{\scriptsize (operation)}}\\


 Let $G,H$ be groups with central quotients $Q(G)$ and $Q(H)$ and derived subgroups $[G,G]$ and $[H,H]$ respectively. Let $c_G : G/Z(G) \times G/Z(G) \to [G,G]$ and $c_H : H/Z(H) \times H/Z(H) \to [H,H]$ be the two commutator maps. An \emph{isoclinism} $G \sim H$ is a pair of isomorphisms $(\eta,\xi)$ where $\eta : G/Z(G) \to H/Z(H)$ and $\xi : [G,G] \to [H,H]$ such that $c_G * \xi = (\eta \times \eta) * c_H$. Isoclinism is an equivalence relation, and all abelian groups are isoclinic
to the trivial group. 

 }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@G := SmallGroup( 64, 6 );;  StructureDescription( G ); |
  "(C8 x C4) : C2"
  !gapprompt@gap>| !gapinput@QG := CentralQuotient( G );;  IdGroup( QG );|
  [ [ 64, 6 ], [ 8, 3 ] ]
  !gapprompt@gap>| !gapinput@H := SmallGroup( 32, 41 );;  StructureDescription( H );|
  "C2 x Q16"
  !gapprompt@gap>| !gapinput@QH := CentralQuotient( H );;  IdGroup( QH );|
  [ [ 32, 41 ], [ 8, 3 ] ]
  !gapprompt@gap>| !gapinput@Isoclinism( G, H );|
  [ [ f1, f2, f3 ] -> [ f1, f2*f3, f3 ], [ f3, f5 ] -> [ f4*f5, f5 ] ]
  !gapprompt@gap>| !gapinput@K := SmallGroup( 32, 43 );;  StructureDescription( K );|
  "(C2 x D8) : C2"
  !gapprompt@gap>| !gapinput@QK := CentralQuotient( K );;  IdGroup( QK );                       |
  [ [ 32, 43 ], [ 16, 11 ] ]
  !gapprompt@gap>| !gapinput@AreIsoclinicDomains( G, K );|
  false
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{IsStemDomain}}
\logpage{[ 4, 2, 2 ]}\nobreak
\hyperdef{L}{X857685AA8398C9A9}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsStemDomain({\mdseries\slshape G})\index{IsStemDomain@\texttt{IsStemDomain}}
\label{IsStemDomain}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsoclinicStemDomain({\mdseries\slshape G})\index{IsoclinicStemDomain@\texttt{IsoclinicStemDomain}}
\label{IsoclinicStemDomain}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AllStemGroupIds({\mdseries\slshape n})\index{AllStemGroupIds@\texttt{AllStemGroupIds}}
\label{AllStemGroupIds}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AllStemGroupFamilies({\mdseries\slshape n})\index{AllStemGroupFamilies@\texttt{AllStemGroupFamilies}}
\label{AllStemGroupFamilies}
}\hfill{\scriptsize (operation)}}\\


 A group $G$ is a \emph{stem group} if $Z(G) \leq [G,G]$. Every group is isoclinic to a stem group, but distinct stem groups may be
isoclinic. For example, groups $D_8, Q_8$ are two isoclinic stem groups. 

 The function \texttt{IsoclinicStemDomain } returns a stem group isoclinic to $G$. 

 The function \texttt{AllStemGroupIds} returns the \texttt{IdGroup} list of the stem groups of a specified size, while \texttt{AllStemGroupFamilies} splits this list into isoclinism classes. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@DerivedSubgroup(G);     |
  Group([ f3, f5 ])
  !gapprompt@gap>| !gapinput@IsStemDomain( G );|
  false
  !gapprompt@gap>| !gapinput@IsoclinicStemDomain( G );|
  <pc group of size 16 with 4 generators>
  !gapprompt@gap>| !gapinput@AllStemGroupIds( 32 );|
  [ [ 32, 6 ], [ 32, 7 ], [ 32, 8 ], [ 32, 18 ], [ 32, 19 ], [ 32, 20 ], 
    [ 32, 27 ], [ 32, 28 ], [ 32, 29 ], [ 32, 30 ], [ 32, 31 ], [ 32, 32 ], 
    [ 32, 33 ], [ 32, 34 ], [ 32, 35 ], [ 32, 43 ], [ 32, 44 ], [ 32, 49 ], 
    [ 32, 50 ] ]
  !gapprompt@gap>| !gapinput@AllStemGroupFamilies( 32 );|
  [ [ [ 32, 6 ], [ 32, 7 ], [ 32, 8 ] ], [ [ 32, 18 ], [ 32, 19 ], [ 32, 20 ] ],
    [ [ 32, 27 ], [ 32, 28 ], [ 32, 29 ], [ 32, 30 ], [ 32, 31 ], [ 32, 32 ], 
        [ 32, 33 ], [ 32, 34 ], [ 32, 35 ] ], [ [ 32, 43 ], [ 32, 44 ] ], 
    [ [ 32, 49 ], [ 32, 50 ] ] ]
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{IsoclinicRank}}
\logpage{[ 4, 2, 3 ]}\nobreak
\label{group-rank}
\hyperdef{L}{X85D39FD179B782D5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsoclinicRank({\mdseries\slshape G})\index{IsoclinicRank@\texttt{IsoclinicRank}}
\label{IsoclinicRank}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsoclinicMiddleLength({\mdseries\slshape G})\index{IsoclinicMiddleLength@\texttt{IsoclinicMiddleLength}}
\label{IsoclinicMiddleLength}
}\hfill{\scriptsize (attribute)}}\\


 Let $G$ be a finite $p$-group. Then $\log_p |[G,G] / (Z(G) \cap [G,G])|$ is called the \emph{middle length} of $G$. Also $\log_p |Z(G) \cap [G,G]| + \log_p |G/Z(G)|$ is called the \emph{rank} of $G$. These invariants appear in the tables of isoclinism families of groups of
order 128 in \cite{JNO}. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@IsoclinicMiddleLength(G);|
  1
  !gapprompt@gap>| !gapinput@IsoclinicRank(G);|
  4
  
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{Isoclinism for crossed modules}}\label{sect-isoclinic-xmods}
\logpage{[ 4, 3, 0 ]}
\hyperdef{L}{X81338C977972AD83}{}
{
  

\subsection{\textcolor{Chapter }{Isoclinism}}
\logpage{[ 4, 3, 1 ]}\nobreak
\hyperdef{L}{X802A38467C55732E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Isoclinism({\mdseries\slshape X0, Y0})\index{Isoclinism@\texttt{Isoclinism}}
\label{Isoclinism}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AreIsoclinicDomains({\mdseries\slshape X0, Y0})\index{AreIsoclinicDomains@\texttt{AreIsoclinicDomains}}
\label{AreIsoclinicDomains}
}\hfill{\scriptsize (operation)}}\\


 Let $\mathcal{X},\mathcal{Y}$ be crossed modules with central quotients $Q(\mathcal{X})$ and $ Q(\mathcal{Y})$, and derived subcrossed modules $[\mathcal{X},\mathcal{X}]$ and $[\mathcal{Y},\mathcal{Y}]$ respectively. Let $c_\mathcal{X} : Q(\mathcal{X}) \times Q(\mathcal{X}) \to
[\mathcal{X},\mathcal{X}]$ and $c_\mathcal{Y} : Q(\mathcal{Y}) \times Q(\mathcal{Y}) \to
[\mathcal{Y},\mathcal{Y}]$ be the two commutator maps. An \emph{isoclinism} $\mathcal{X} \sim \mathcal{Y}$ is a pair of bijective morphisms $(\eta,\xi)$ where $\eta : Q(\mathcal{X}) \to Q(\mathcal{Y})$ and $\xi : [\mathcal{X},\mathcal{X}] \to [\mathcal{Y},\mathcal{Y}]$ such that $c_\mathcal{X} * \xi = (\eta \times \eta) * c_\mathcal{Y}$. Isoclinism is an equivalence relation, and all abelian crossed modules are
isoclinic to the trivial crossed module. 

 }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@C8 := Cat1(16,8,1);;|
  !gapprompt@gap>| !gapinput@X8 := XMod(C8);  IdGroup( X8 );|
  [Group( [ f1*f2*f3, f3, f4 ] )->Group( [ f2, f2 ] )]
  [ [ 8, 1 ], [ 2, 1 ] ]
  !gapprompt@gap>| !gapinput@C9 := Cat1(32,9,1);|
  [(C8 x C2) : C2=>Group( [ f2, f2 ] )]
  !gapprompt@gap>| !gapinput@X9 := XMod( C9 );  IdGroup( X9 );|
  [Group( [ f1*f2*f3, f3, f4, f5 ] )->Group( [ f2, f2 ] )]
  [ [ 16, 5 ], [ 2, 1 ] ]
  !gapprompt@gap>| !gapinput@AreIsoclinicDomains( X8, X9 );|
  true
  !gapprompt@gap>| !gapinput@ism89 := Isoclinism( X8, X9 );;|
  !gapprompt@gap>| !gapinput@Display( ism89 );|
  [ [[Group( [ f1 ] )->Group( [ f2 ] )] => [Group( [ f1 ] )->Group( [ f2 ] )]], 
    [[Group( [ f3 ] )->Group( <identity> of ... )] => [Group( 
      [ f3 ] )->Group( <identity> of ... )]] ]
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{IsStemDomain}}
\logpage{[ 4, 3, 2 ]}\nobreak
\hyperdef{L}{X857685AA8398C9A9}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsStemDomain({\mdseries\slshape X0})\index{IsStemDomain@\texttt{IsStemDomain}}
\label{IsStemDomain}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsoclinicStemDomain({\mdseries\slshape X0})\index{IsoclinicStemDomain@\texttt{IsoclinicStemDomain}}
\label{IsoclinicStemDomain}
}\hfill{\scriptsize (property)}}\\


 A crossed module $\mathcal{X}$ is a \emph{stem crossed module} if $Z(\mathcal{X}) \leq [\mathcal{X},\mathcal{X}]$. Every crossed module is isoclinic to a stem crossed module, but distinct
stem crossed modules may be isoclinic. 

 A method for \texttt{IsoclinicStemDomain} has yet to be implemented. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@IsStemDomain(X8);|
  true
  !gapprompt@gap>| !gapinput@IsStemDomain(X9);|
  false
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{IsoclinicRank}}
\logpage{[ 4, 3, 3 ]}\nobreak
\hyperdef{L}{X85D39FD179B782D5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsoclinicRank({\mdseries\slshape X0})\index{IsoclinicRank@\texttt{IsoclinicRank}}
\label{IsoclinicRank}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsoclinicMiddleLength({\mdseries\slshape X0})\index{IsoclinicMiddleLength@\texttt{IsoclinicMiddleLength}}
\label{IsoclinicMiddleLength}
}\hfill{\scriptsize (attribute)}}\\


 The formulae in subsection \ref{group-rank} are applied to the crossed module. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@IsoclinicMiddleLength(X8);|
  [ 1, 0 ]
  !gapprompt@gap>| !gapinput@IsoclinicRank(X8);        |
  [ 3, 1 ]
  
\end{Verbatim}
 }

 }

          
\chapter{\textcolor{Chapter }{Derivations and Sections}}\label{chap-gp2up}
\logpage{[ 5, 0, 0 ]}
\hyperdef{L}{X7C01AE7783898705}{}
{
  \index{up 2d-mapping of 2d-group} 
\section{\textcolor{Chapter }{Whitehead Multiplication}}\label{sect-whitehead-mult}
\logpage{[ 5, 1, 0 ]}
\hyperdef{L}{X78790B7D87D9FD73}{}
{
  \index{Whitehead multiplication} 

\subsection{\textcolor{Chapter }{IsDerivation}}
\logpage{[ 5, 1, 1 ]}\nobreak
\hyperdef{L}{X82FE679F79FDBF75}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsDerivation({\mdseries\slshape map})\index{IsDerivation@\texttt{IsDerivation}}
\label{IsDerivation}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsSection({\mdseries\slshape map})\index{IsSection@\texttt{IsSection}}
\label{IsSection}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsUp2dMapping({\mdseries\slshape map})\index{IsUp2dMapping@\texttt{IsUp2dMapping}}
\label{IsUp2dMapping}
}\hfill{\scriptsize (property)}}\\


 \index{derivation, of crossed module} \index{Whitehead monoid} The Whitehead monoid ${\rm Der}(\mathcal{X})$ of $\mathcal{X}$ was defined in \cite{W2} to be the monoid of all \emph{derivations} from $R$ to $S$, that is the set of all maps $\chi : R \to S$, with \emph{Whitehead multiplication} $\star$ (on the \emph{right}) satisfying: 
\[ {\bf Der\ 1}: \chi(qr) ~=~ (\chi q)^{r} \; (\chi r), \qquad {\bf Der\ 2}:
(\chi_1 \star \chi_2)(r) ~=~ (\chi_2 r)(\chi_1 r)(\chi_2 \partial \chi_1 r). \]
 The zero map is the identity for this composition. \index{regular derivation} Invertible elements in the monoid are called \emph{regular}. \index{Whitehead group} The Whitehead group of $\mathcal{X}$ is the group of regular derivations in ${\rm Der}(\mathcal{X} )$. In the next chapter the \emph{actor} of $\mathcal{X}$ is defined as a crossed module whose source and range are permutation
representations of the Whitehead group and the automorphism group of $\mathcal{X}$. 

 \index{section, of cat1-group} The construction for cat1-groups equivalent to the derivation of a crossed
module is the \emph{section}. \index{Whitehead multiplication} The monoid of sections of $\mathcal{C} = (e;t,h : G \to R)$ is the set of group homomorphisms $\xi : R \to G$, with Whitehead multiplication $\star$ (on the \emph{right}) satisfying: 
\[ {\bf Sect\ 1}: t \circ \xi ~=~ {\rm id}_R, \quad {\bf Sect\ 2}: (\xi_1 \star
\xi_2)(r) ~=~ (\xi_1 r)(e h \xi_1 r)^{-1}(\xi_2 h \xi_1 r) ~=~ (\xi_2 h \xi_1
r)(e h \xi_1 r)^{-1}(\xi_1 r). \]
 The embedding $e$ is the identity for this composition, and $h(\xi_1 \star \xi_2) = (h \xi_1)(h \xi_2)$. A section is \emph{regular} when $h \xi$ is an automorphism, and the group of regular sections is isomorphic to the
Whitehead group. 

 If $\epsilon$ denotes the inclusion of $S = {\rm ker} t$ in $G$ then $\partial = h \epsilon : S \to R$ and 
\[ \xi r ~=~ (e r)(e \chi r), \quad\mbox{which equals}\quad (r, \chi r) ~\in~ R
\ltimes S, \]
 determines a section $\xi$ of $\mathcal{C}$ in terms of the corresponding derivation $\chi$ of $\mathcal{X}$, and conversely. }

 

\subsection{\textcolor{Chapter }{DerivationByImages}}
\logpage{[ 5, 1, 2 ]}\nobreak
\hyperdef{L}{X83EC6F7780F5636E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DerivationByImages({\mdseries\slshape X0, ims})\index{DerivationByImages@\texttt{DerivationByImages}}
\label{DerivationByImages}
}\hfill{\scriptsize (operation)}}\\


 Derivations are stored like group homomorphisms by specifying the images of a
generating set. Images of the remaining elements may then be obtained using
axiom ${\bf Der\ 1}$. The function \texttt{IsDerivation} is automatically called to check that this procedure is well-defined. 

 In the following example a cat1-group \texttt{C3} and the associated crossed module \texttt{X3} are constructed, where \texttt{X3} is isomorphic to the inclusion of the normal cyclic group \texttt{c3} in the symmetric group \texttt{s3}. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@g18 := Group( (1,2,3), (4,5,6), (2,3)(5,6) );;|
  !gapprompt@gap>| !gapinput@SetName( g18, "g18" );|
  !gapprompt@gap>| !gapinput@gen18 := GeneratorsOfGroup( g18 );;|
  !gapprompt@gap>| !gapinput@g1 := gen18[1];;  g2 := gen18[2];;  g3 := gen18[3];;|
  !gapprompt@gap>| !gapinput@s3 := Subgroup( g18, gen18{[2..3]} );;|
  !gapprompt@gap>| !gapinput@SetName( s3, "s3" );;|
  !gapprompt@gap>| !gapinput@t := GroupHomomorphismByImages( g18, s3, gen18, [g2,g2,g3] );;|
  !gapprompt@gap>| !gapinput@h := GroupHomomorphismByImages( g18, s3, gen18, [(),g2,g3] );;|
  !gapprompt@gap>| !gapinput@e := GroupHomomorphismByImages( s3, g18, [g2,g3], [g2,g3] );;|
  !gapprompt@gap>| !gapinput@C3 := Cat1( t, h, e );|
  [g18=>s3]
  !gapprompt@gap>| !gapinput@SetName( Kernel(t), "c3" );;|
  !gapprompt@gap>| !gapinput@X3 := XModOfCat1( C3 );;|
  !gapprompt@gap>| !gapinput@Display( X3 );|
  Crossed module [c3->s3] :- 
  : Source group has generators:
    [ (1,2,3)(4,6,5) ]
  : Range group has generators:
    [ (4,5,6), (2,3)(5,6) ]
  : Boundary homomorphism maps source generators to:
    [ (4,6,5) ]
  : Action homomorphism maps range generators to automorphisms:
    (4,5,6) --> { source gens --> [ (1,2,3)(4,6,5) ] }
    (2,3)(5,6) --> { source gens --> [ (1,3,2)(4,5,6) ] }
    These 2 automorphisms generate the group of automorphisms.
  : associated cat1-group is [g18=>s3]
  
  !gapprompt@gap>| !gapinput@imchi := [ (1,2,3)(4,6,5), (1,2,3)(4,6,5) ];;|
  !gapprompt@gap>| !gapinput@chi := DerivationByImages( X3, imchi );|
  DerivationByImages( s3, c3, [ (4,5,6), (2,3)(5,6) ],
  [ (1,2,3)(4,6,5), (1,2,3)(4,6,5) ] )
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{SectionByImages}}
\logpage{[ 5, 1, 3 ]}\nobreak
\hyperdef{L}{X79FE2BFD85FE88B3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SectionByImages({\mdseries\slshape C, ims})\index{SectionByImages@\texttt{SectionByImages}}
\label{SectionByImages}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SectionByDerivation({\mdseries\slshape chi})\index{SectionByDerivation@\texttt{SectionByDerivation}}
\label{SectionByDerivation}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DerivationBySection({\mdseries\slshape xi})\index{DerivationBySection@\texttt{DerivationBySection}}
\label{DerivationBySection}
}\hfill{\scriptsize (operation)}}\\


 Sections \emph{are} group homomorphisms, so do not need a special representation. Operations \texttt{SectionByDerivation} and \texttt{DerivationBySection} convert derivations to sections, and vice-versa, calling \texttt{Cat1OfXMod} and \texttt{XModOfCat1} automatically. 

 Two strategies for calculating derivations and sections are implemented, see \cite{AW1}. The default method for \texttt{AllDerivations} is to search for all possible sets of images using a backtracking procedure,
and when all the derivations are found it is not known which are regular. In
early versions of this package, the default method for \texttt{AllSections( {\textless}C{\textgreater} )} was to compute all endomorphisms on the range group \texttt{R} of \texttt{C} as possibilities for the composite $h \xi$. A backtrack method then found possible images for such a section. In the
current version the derivations of the associated crossed module are
calculated, and these are all converted to sections using \texttt{SectionByDerivation}. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@xi := SectionByDerivation( chi );|
  SectionByImages( s3, g18, [ (4,5,6), (2,3)(5,6) ], [ (1,2,3), (1,2)(4,6) ] )
  
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{Whitehead Groups and Monoids}}\logpage{[ 5, 2, 0 ]}
\hyperdef{L}{X83886F9484B44B03}{}
{
 

\subsection{\textcolor{Chapter }{RegularDerivations}}
\logpage{[ 5, 2, 1 ]}\nobreak
\hyperdef{L}{X84CD856C84BDB019}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RegularDerivations({\mdseries\slshape X0})\index{RegularDerivations@\texttt{RegularDerivations}}
\label{RegularDerivations}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AllDerivations({\mdseries\slshape X0})\index{AllDerivations@\texttt{AllDerivations}}
\label{AllDerivations}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RegularSections({\mdseries\slshape C0})\index{RegularSections@\texttt{RegularSections}}
\label{RegularSections}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AllSections({\mdseries\slshape C0})\index{AllSections@\texttt{AllSections}}
\label{AllSections}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ImagesList({\mdseries\slshape obj})\index{ImagesList@\texttt{ImagesList}}
\label{ImagesList}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ImagesTable({\mdseries\slshape obj})\index{ImagesTable@\texttt{ImagesTable}}
\label{ImagesTable}
}\hfill{\scriptsize (attribute)}}\\


 There are two functions to determine the elements of the Whitehead group and
the Whitehead monoid of a crossed module, namely \texttt{RegularDerivations} and \texttt{AllDerivations}. (The functions \texttt{RegularSections} and \texttt{AllSections} perform corresponding tasks for a cat1-group.) 

 Using our example \texttt{X3} we find that there are just nine derivations. (In fact, six of them regular,
as we shall see in the next section. The associated group is isomorphic to the
symmetric group \texttt{s3}.) }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@all3 := AllDerivations( X3 );;|
  !gapprompt@gap>| !gapinput@imall3 := ImagesList( all3 );; |
  !gapprompt@gap>| !gapinput@PrintListOneItemPerLine( imall3 );|
  [ [ (), () ],
    [ (), (1,3,2)(4,5,6) ],
    [ (), (1,2,3)(4,6,5) ],
    [ (1,3,2)(4,5,6), () ],
    [ (1,3,2)(4,5,6), (1,3,2)(4,5,6) ],
    [ (1,3,2)(4,5,6), (1,2,3)(4,6,5) ],
    [ (1,2,3)(4,6,5), () ],
    [ (1,2,3)(4,6,5), (1,3,2)(4,5,6) ],
    [ (1,2,3)(4,6,5), (1,2,3)(4,6,5) ]
    ]
  !gapprompt@gap>| !gapinput@KnownAttributesOfObject( all3 );|
  [ "Object2d", "ImagesList", "AllOrRegular", "ImagesTable" ]
  !gapprompt@gap>| !gapinput@PrintListOneItemPerLine( ImagesTable( all3 ) );|
  [ [ 1, 1, 1, 1, 1, 1 ],
    [ 1, 1, 1, 3, 3, 3 ],
    [ 1, 1, 1, 2, 2, 2 ],
    [ 1, 3, 2, 1, 3, 2 ],
    [ 1, 3, 2, 3, 2, 1 ],
    [ 1, 3, 2, 2, 1, 3 ],
    [ 1, 2, 3, 1, 2, 3 ],
    [ 1, 2, 3, 3, 1, 2 ],
    [ 1, 2, 3, 2, 3, 1 ]
    ]
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{CompositeDerivation}}
\logpage{[ 5, 2, 2 ]}\nobreak
\hyperdef{L}{X804BC7FB7CD0B325}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CompositeDerivation({\mdseries\slshape chi1, chi2})\index{CompositeDerivation@\texttt{CompositeDerivation}}
\label{CompositeDerivation}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{UpImagePositions({\mdseries\slshape chi})\index{UpImagePositions@\texttt{UpImagePositions}}
\label{UpImagePositions}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{UpGeneratorImages({\mdseries\slshape chi})\index{UpGeneratorImages@\texttt{UpGeneratorImages}}
\label{UpGeneratorImages}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CompositeSection({\mdseries\slshape xi1, xi2})\index{CompositeSection@\texttt{CompositeSection}}
\label{CompositeSection}
}\hfill{\scriptsize (operation)}}\\


 The Whitehead product $\chi_1 \star \chi_2$ is implemented as \texttt{CompositeDerivation({\textless}chi1{\textgreater},{\textless}chi2{\textgreater})}. The composite of two sections is just the composite of homomorphisms. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@reg3 := RegularDerivations( X3 );;|
  !gapprompt@gap>| !gapinput@imder3 := ImagesList( reg3 );;  Length( imder3 );|
  6
  !gapprompt@gap>| !gapinput@chi4 := DerivationByImages( X3, imder3[4] );|
  DerivationByImages( s3, c3, [ (4,5,6), (2,3)(5,6) ], [ (1,3,2)(4,5,6), () ] )
  !gapprompt@gap>| !gapinput@chi5 := DerivationByImages( X3, imder3[5] );|
  DerivationByImages( s3, c3, [ (4,5,6), (2,3)(5,6) ], 
  [ (1,3,2)(4,5,6), (1,3,2)(4,5,6) ] )
  !gapprompt@gap>| !gapinput@im4 := UpImagePositions( chi4 );|
  [ 1, 3, 2, 1, 3, 2 ]
  !gapprompt@gap>| !gapinput@im5 := UpImagePositions( chi5 );|
  [ 1, 3, 2, 3, 2, 1 ]
  !gapprompt@gap>| !gapinput@chi45 := chi4 * chi5;|
  DerivationByImages( s3, c3, [ (4,5,6), (2,3)(5,6) ], [ (), (1,3,2)(4,5,6) ] )
  !gapprompt@gap>| !gapinput@im45 := UpImagePositions( chi45 );|
  [ 1, 1, 1, 3, 3, 3 ]
  !gapprompt@gap>| !gapinput@Position( imder3, UpGeneratorImages( chi45 ) );|
  2
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{WhiteheadGroupTable}}
\logpage{[ 5, 2, 3 ]}\nobreak
\hyperdef{L}{X7F4E9D127E188A63}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{WhiteheadGroupTable({\mdseries\slshape X0})\index{WhiteheadGroupTable@\texttt{WhiteheadGroupTable}}
\label{WhiteheadGroupTable}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{WhiteheadMonoidTable({\mdseries\slshape X0})\index{WhiteheadMonoidTable@\texttt{WhiteheadMonoidTable}}
\label{WhiteheadMonoidTable}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{WhiteheadPermGroup({\mdseries\slshape X0})\index{WhiteheadPermGroup@\texttt{WhiteheadPermGroup}}
\label{WhiteheadPermGroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{WhiteheadTransMonoid({\mdseries\slshape X0})\index{WhiteheadTransMonoid@\texttt{WhiteheadTransMonoid}}
\label{WhiteheadTransMonoid}
}\hfill{\scriptsize (attribute)}}\\


 Multiplication tables for the Whitehead group or monoid enable the
construction of permutation or transformation representations. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@wgt3 := WhiteheadGroupTable( X3 );; |
  !gapprompt@gap>| !gapinput@PrintListOneItemPerLine( wgt3 );|
  [ [ 1, 2, 3, 4, 5, 6 ],
    [ 2, 3, 1, 5, 6, 4 ],
    [ 3, 1, 2, 6, 4, 5 ],
    [ 4, 6, 5, 1, 3, 2 ],
    [ 5, 4, 6, 2, 1, 3 ],
    [ 6, 5, 4, 3, 2, 1 ]
    ]
  !gapprompt@gap>| !gapinput@wpg3 := WhiteheadPermGroup( X3 );|
  Group([ (1,2,3)(4,5,6), (1,4)(2,6)(3,5) ])
  !gapprompt@gap>| !gapinput@wmt3 := WhiteheadMonoidTable( X3 );; |
  !gapprompt@gap>| !gapinput@PrintListOneItemPerLine( wmt3 );|
  [ [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ],
    [ 2, 3, 1, 5, 6, 4, 8, 9, 7 ],
    [ 3, 1, 2, 6, 4, 5, 9, 7, 8 ],
    [ 4, 6, 5, 1, 3, 2, 7, 9, 8 ],
    [ 5, 4, 6, 2, 1, 3, 8, 7, 9 ],
    [ 6, 5, 4, 3, 2, 1, 9, 8, 7 ],
    [ 7, 7, 7, 7, 7, 7, 7, 7, 7 ],
    [ 8, 8, 8, 8, 8, 8, 8, 8, 8 ],
    [ 9, 9, 9, 9, 9, 9, 9, 9, 9 ]
    ]
  !gapprompt@gap>| !gapinput@wtm3 := WhiteheadTransMonoid( X3 );|
  <transformation monoid on 9 pts with 3 generators>
  !gapprompt@gap>| !gapinput@GeneratorsOfMonoid( wtm3 ); |
  [ Transformation( [ 2, 3, 1, 5, 6, 4, 8, 9, 7 ] ), 
    Transformation( [ 4, 6, 5, 1, 3, 2, 7, 9, 8 ] ), 
    Transformation( [ 7, 7, 7, 7, 7, 7, 7, 7, 7 ] ) ]
  
\end{Verbatim}
 }

 }

          
\chapter{\textcolor{Chapter }{Actors of 2d-groups}}\label{chap-gp2act}
\logpage{[ 6, 0, 0 ]}
\hyperdef{L}{X84C872BB7F1E5F25}{}
{
  
\section{\textcolor{Chapter }{Actor of a crossed module}}\logpage{[ 6, 1, 0 ]}
\hyperdef{L}{X7B853602873FC7AB}{}
{
 \index{actor} The \emph{actor} of $\mathcal{X}$ is a crossed module $(\Delta : \mathcal{W}(\mathcal{X}) \to \mathop{\textrm{Aut}\rm}(\mathcal{X}))$ which was shown by Lue and Norrie, in \cite{N2} and \cite{N1} to give the automorphism object of a crossed module $\mathcal{X}$. In this implementation, the source of the actor is a permutation
representation $W$ of the Whitehead group of regular derivations, and the range of the actor is a
permutation representation $A$ of the automorphism group $\mathop{\textrm{Aut}\rm}(\mathcal{X})$ of $\mathcal{X}$. 

\subsection{\textcolor{Chapter }{AutomorphismPermGroup}}
\logpage{[ 6, 1, 1 ]}\nobreak
\hyperdef{L}{X80F121357F06E72D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AutomorphismPermGroup({\mdseries\slshape xmod})\index{AutomorphismPermGroup@\texttt{AutomorphismPermGroup}}
\label{AutomorphismPermGroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{GeneratingAutomorphisms({\mdseries\slshape xmod})\index{GeneratingAutomorphisms@\texttt{GeneratingAutomorphisms}}
\label{GeneratingAutomorphisms}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PermAutomorphismAsXModMorphism({\mdseries\slshape xmod, perm})\index{PermAutomorphismAsXModMorphism@\texttt{PermAutomorphismAsXModMorphism}}
\label{PermAutomorphismAsXModMorphism}
}\hfill{\scriptsize (attribute)}}\\


 The automorphisms $( \sigma, \rho )$ of $\mathcal{X}$ form a group $\mathop{\textrm{Aut}\rm}(\mathcal{X})$ of crossed module isomorphisms. The function \texttt{AutomorphismPermGroup} finds a set of \texttt{GeneratingAutomorphisms} for $\mathop{\textrm{Aut}\rm}(\mathcal{X})$, and then constructs a permutation representation of this group, which is
used as the range of the actor crossed module of $\mathcal{X}$. The individual automorphisms can be constructed from the permutation group
using the function \texttt{PermAutomorphismAsXModMorphism}. The example below uses the crossed module \texttt{X3=[c3-{\textgreater}s3]} constructed in section \ref{sect-whitehead-mult}. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@APX3 := AutomorphismPermGroup( X3 );|
  Group([ (5,7,6), (1,2)(3,4)(6,7) ])
  !gapprompt@gap>| !gapinput@Size( APX3 );|
  6
  !gapprompt@gap>| !gapinput@genX3 := GeneratingAutomorphisms( X3 );    |
  [ [[c3->s3] => [c3->s3]], [[c3->s3] => [c3->s3]] ]
  !gapprompt@gap>| !gapinput@e6 := Elements( APX3 )[6];|
  (1,2)(3,4)(5,7)
  !gapprompt@gap>| !gapinput@m6 := PermAutomorphismAsXModMorphism( X3, e6 );;|
  !gapprompt@gap>| !gapinput@Display( m6 );|
  Morphism of crossed modules :- 
  : Source = [c3->s3] with generating sets:
    [ (1,2,3)(4,6,5) ]
    [ (4,5,6), (2,3)(5,6) ]
  : Range = Source
  : Source Homomorphism maps source generators to:
    [ (1,3,2)(4,5,6) ]
  : Range Homomorphism maps range generators to:
    [ (4,6,5), (2,3)(4,5) ]
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{WhiteheadXMod}}
\logpage{[ 6, 1, 2 ]}\nobreak
\hyperdef{L}{X790EBC7C7D320C03}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{WhiteheadXMod({\mdseries\slshape xmod})\index{WhiteheadXMod@\texttt{WhiteheadXMod}}
\label{WhiteheadXMod}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LueXMod({\mdseries\slshape xmod})\index{LueXMod@\texttt{LueXMod}}
\label{LueXMod}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NorrieXMod({\mdseries\slshape xmod})\index{NorrieXMod@\texttt{NorrieXMod}}
\label{NorrieXMod}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ActorXMod({\mdseries\slshape xmod})\index{ActorXMod@\texttt{ActorXMod}}
\label{ActorXMod}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AutomorphismPermGroup({\mdseries\slshape xmod})\index{AutomorphismPermGroup@\texttt{AutomorphismPermGroup}}
\label{AutomorphismPermGroup}
}\hfill{\scriptsize (attribute)}}\\


 An automorphism $( \sigma, \rho )$ of \texttt{X} acts on the Whitehead monoid by $\chi^{(\sigma,\rho)} = \sigma \circ \chi \circ \rho^{-1}$, and this determines the action for the actor. In fact the four groups $R, S, W, A$, the homomorphisms between them, and the various actions, give five crossed
modules forming a \emph{crossed square}: \index{crossed square} 
\begin{itemize}
\item  $\mathcal{X} = (\partial : S \to R),~$ the initial crossed module, on the left, 
\item  $\mathcal{W}(\mathcal{X}) = (\eta : S \to W),~$ the Whitehead crossed module of $\mathcal{X}$, at the top, 
\item  $\mathcal{N}(X) = (\alpha : R \to A),~$ the Norrie crossed module of $\mathcal{X}$, at the bottom, 
\item  $\mathop{\textrm{Act}\rm}(\mathcal{X}) = ( \Delta : W \to A),~$ the actor crossed module of $\mathcal{X}$, on the right, and 
\item  $\mathcal{L}(\mathcal{X}) = (\Delta\circ\eta = \alpha\circ\partial : S \to A),~$ the Lue crossed module of $\mathcal{X}$, along the top-left to bottom-right diagonal. 
\end{itemize}
 }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@WGX3 := WhiteheadPermGroup( X3 );|
  Group([ (1,2,3)(4,5,6), (1,4)(2,6)(3,5) ])
  !gapprompt@gap>| !gapinput@WX3 := WhiteheadXMod( X3 );; |
  !gapprompt@gap>| !gapinput@Display( WX3 );|
  Crossed module Whitehead[c3->s3] :- 
  : Source group has generators:
    [ (1,2,3)(4,6,5) ]
  : Range group has generators:
    [ (1,2,3)(4,5,6), (1,4)(2,6)(3,5) ]
  : Boundary homomorphism maps source generators to:
    [ (1,2,3)(4,5,6) ]
  : Action homomorphism maps range generators to automorphisms:
    (1,2,3)(4,5,6) --> { source gens --> [ (1,2,3)(4,6,5) ] }
    (1,4)(2,6)(3,5) --> { source gens --> [ (1,3,2)(4,5,6) ] }
    These 2 automorphisms generate the group of automorphisms.
  !gapprompt@gap>| !gapinput@LX3 := LueXMod( X3 );;|
  !gapprompt@gap>| !gapinput@Display( LX3 );|
  Crossed module Lue[c3->s3] :- 
  : Source group has generators:
    [ (1,2,3)(4,6,5) ]
  : Range group has generators:
    [ (5,7,6), (1,2)(3,4)(6,7) ]
  : Boundary homomorphism maps source generators to:
    [ (5,7,6) ]
  : Action homomorphism maps range generators to automorphisms:
    (5,7,6) --> { source gens --> [ (1,2,3)(4,6,5) ] }
    (1,2)(3,4)(6,7) --> { source gens --> [ (1,3,2)(4,5,6) ] }
    These 2 automorphisms generate the group of automorphisms.
  !gapprompt@gap>| !gapinput@NX3 := NorrieXMod( X3 );; |
  !gapprompt@gap>| !gapinput@Display( NX3 );|
  Crossed module Norrie[c3->s3] :- 
  : Source group has generators:
    [ (4,5,6), (2,3)(5,6) ]
  : Range group has generators:
    [ (5,7,6), (1,2)(3,4)(6,7) ]
  : Boundary homomorphism maps source generators to:
    [ (5,6,7), (1,2)(3,4)(6,7) ]
  : Action homomorphism maps range generators to automorphisms:
    (5,7,6) --> { source gens --> [ (4,5,6), (2,3)(4,5) ] }
    (1,2)(3,4)(6,7) --> { source gens --> [ (4,6,5), (2,3)(5,6) ] }
    These 2 automorphisms generate the group of automorphisms.
  !gapprompt@gap>| !gapinput@AX3 := ActorXMod( X3 );; |
  !gapprompt@gap>| !gapinput@Display( AX3);|
  Crossed module Actor[c3->s3] :- 
  : Source group has generators:
    [ (1,2,3)(4,5,6), (1,4)(2,6)(3,5) ]
  : Range group has generators:
    [ (5,7,6), (1,2)(3,4)(6,7) ]
  : Boundary homomorphism maps source generators to:
    [ (5,7,6), (1,2)(3,4)(6,7) ]
  : Action homomorphism maps range generators to automorphisms:
    (5,7,6) --> { source gens --> [ (1,2,3)(4,5,6), (1,6)(2,5)(3,4) ] }
    (1,2)(3,4)(6,7) --> { source gens --> [ (1,3,2)(4,6,5), (1,4)(2,6)(3,5) ] }
    These 2 automorphisms generate the group of automorphisms.
  
  !gapprompt@gap>| !gapinput@IAX3 := InnerActorXMod( X3 );;  |
  !gapprompt@gap>| !gapinput@Display( IAX3 );|
  Crossed module InnerActor[c3->s3] :- 
  : Source group has generators:
    [ (1,2,3)(4,5,6) ]
  : Range group has generators:
    [ (5,6,7), (1,2)(3,4)(6,7) ]
  : Boundary homomorphism maps source generators to:
    [ (5,7,6) ]
  : Action homomorphism maps range generators to automorphisms:
    (5,6,7) --> { source gens --> [ (1,2,3)(4,5,6) ] }
    (1,2)(3,4)(6,7) --> { source gens --> [ (1,3,2)(4,6,5) ] }
    These 2 automorphisms generate the group of automorphisms.
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{XModCentre}}
\logpage{[ 6, 1, 3 ]}\nobreak
\hyperdef{L}{X85CF21F57F0F1329}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{XModCentre({\mdseries\slshape xmod})\index{XModCentre@\texttt{XModCentre}}
\label{XModCentre}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{InnerActorXMod({\mdseries\slshape xmod})\index{InnerActorXMod@\texttt{InnerActorXMod}}
\label{InnerActorXMod}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{InnerMorphism({\mdseries\slshape xmod})\index{InnerMorphism@\texttt{InnerMorphism}}
\label{InnerMorphism}
}\hfill{\scriptsize (attribute)}}\\


 Pairs of boundaries or identity mappings provide six morphisms of crossed
modules. In particular, the boundaries of $\mathcal{W}(\mathcal{X})$ and $\mathcal{N}(\mathcal{X})$ form the \emph{inner morphism} of $\mathcal{X}$, mapping source elements to principal derivations and range elements to inner
automorphisms. The image of $\mathcal{X}$ under this morphism is the \emph{inner actor} of $\mathcal{X}$, while the kernel is the \emph{centre} of $\mathcal{X}$. In the example which follows, the inner morphism of \texttt{X3=(c3-{\textgreater}s3)}, from Chapter \ref{chap-gp2up}, is an inclusion of crossed modules. 

 Note that we appear to have defined \emph{two} sorts of \emph{centre} for a crossed module: \texttt{XModCentre} here, and \texttt{CentreXMod} (\ref{CentreXMod}) in the chapter on isoclinism. We suspect that these two definitions give the
same answer, but this remains to be resolved. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@IMX3 := InnerMorphism( X3 );; |
  !gapprompt@gap>| !gapinput@Display( IMX3 );|
  Morphism of crossed modules :- 
  : Source = [c3->s3] with generating sets:
    [ (1,2,3)(4,6,5) ]
    [ (4,5,6), (2,3)(5,6) ]
  :  Range = Actor[c3->s3] with generating sets:
    [ (1,2,3)(4,5,6), (1,4)(2,6)(3,5) ]
    [ (5,7,6), (1,2)(3,4)(6,7) ]
  : Source Homomorphism maps source generators to:
    [ (1,2,3)(4,5,6) ]
  : Range Homomorphism maps range generators to:
    [ (5,6,7), (1,2)(3,4)(6,7) ]
  !gapprompt@gap>| !gapinput@IsInjective( IMX3 );|
  true
  !gapprompt@gap>| !gapinput@ZX3 := XModCentre( X3 ); |
  [Group( () )->Group( () )]
  
\end{Verbatim}
 }

 }

          
\chapter{\textcolor{Chapter }{Induced constructions}}\label{chap-gp2ind}
\logpage{[ 7, 0, 0 ]}
\hyperdef{L}{X8339DF98872D2E1C}{}
{
  
\section{\textcolor{Chapter }{Induced crossed modules}}\logpage{[ 7, 1, 0 ]}
\hyperdef{L}{X7966FF497C36C465}{}
{
 \index{induced crossed module} 

\subsection{\textcolor{Chapter }{InducedXMod}}
\logpage{[ 7, 1, 1 ]}\nobreak
\hyperdef{L}{X874CB2A278AADE3A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{InducedXMod({\mdseries\slshape args})\index{InducedXMod@\texttt{InducedXMod}}
\label{InducedXMod}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{InducedCat1({\mdseries\slshape args})\index{InducedCat1@\texttt{InducedCat1}}
\label{InducedCat1}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsInducedXMod({\mdseries\slshape xmod})\index{IsInducedXMod@\texttt{IsInducedXMod}}
\label{IsInducedXMod}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{MorphismOfInducedXMod({\mdseries\slshape xmod})\index{MorphismOfInducedXMod@\texttt{MorphismOfInducedXMod}}
\label{MorphismOfInducedXMod}
}\hfill{\scriptsize (attribute)}}\\


 A morphism of crossed modules $(\sigma, \rho) : {\cal X}_1 \to {\cal X}_2$ factors uniquely through an induced crossed module $\rho_{\ast} {\cal X}_1 = (\delta : \rho_{\ast} S_1 \to R_2)$. Similarly, a morphism of cat1-groups factors through an induced cat1-group.
Calculation of induced crossed modules of ${\cal X}$ also provides an algebraic means of determining the homotopy $2$-type of homotopy pushouts of the classifying space of ${\cal X}$. For more background from algebraic topology see references in \cite{BH1}, \cite{BW1}, \cite{BW2}. Induced crossed modules and induced cat1-groups also provide the building
blocks for constructing pushouts in the categories \emph{XMod} and \emph{Cat1}. 

 Data for the cases of algebraic interest is provided by a conjugation crossed
module ${\cal X} = (\partial : S \to R)$ and a homomorphism $\iota$ from $R$ to a third group $Q$. The output from the calculation is a crossed module $\iota_{\ast}{\cal X} = (\delta : \iota_{\ast}S \to Q)$ together with a morphism of crossed modules ${\cal X} \to \iota_{\ast}{\cal X}$. When $\iota$ is a surjection with kernel $K$ then $\iota_{\ast}S = [S,K]$ (see \cite{BH1}). When $\iota$ is an inclusion the induced crossed module may be calculated using a copower
construction \cite{BW1} or, in the case when $R$ is normal in $Q$, as a coproduct of crossed modules (\cite{BW2}, but not yet implemented). When $\iota$ is neither a surjection nor an inclusion, $\iota$ is factored as the composite of the surjection onto the image and the
inclusion of the image in $Q$, and then the composite induced crossed module is constructed. These
constructions use Tietze transformation routines in the library file \texttt{tietze.gi}. 

 As a first, surjective example, we take for ${\cal X}$ the normal inclusion crossed module of \texttt{a4} in \texttt{s4}, and for $\iota$ the surjection from \texttt{s4} to \texttt{s3} with kernel \texttt{k4}. The induced crossed module is isomorphic to \texttt{X3}. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@s4gens := GeneratorsOfGroup( s4 );|
  [ (1,2), (2,3), (3,4) ]
  !gapprompt@gap>| !gapinput@a4gens := GeneratorsOfGroup( a4 );|
  [ (1,2,3), (2,3,4) ]
  !gapprompt@gap>| !gapinput@s3b := Group( (5,6),(6,7) );;  SetName( s3b, "s3b" );|
  !gapprompt@gap>| !gapinput@epi := GroupHomomorphismByImages( s4, s3b, s4gens, [(5,6),(6,7),(5,6)] );;|
  !gapprompt@gap>| !gapinput@X4 := XModByNormalSubgroup( s4, a4 );;|
  !gapprompt@gap>| !gapinput@indX4 := SurjectiveInducedXMod( X4, epi );|
  [a4/ker->s3b]
  !gapprompt@gap>| !gapinput@Display( indX4 );|
  
  Crossed module [a4/ker->s3b] :- 
  : Source group a4/ker has generators:
    [ (1,3,2), (1,2,3) ]
  : Range group s3b has generators:
    [ (5,6), (6,7) ]
  : Boundary homomorphism maps source generators to:
    [ (5,6,7), (5,7,6) ]
  : Action homomorphism maps range generators to automorphisms:
    (5,6) --> { source gens --> [ (1,2,3), (1,3,2) ] }
    (6,7) --> { source gens --> [ (1,2,3), (1,3,2) ] }
    These 2 automorphisms generate the group of automorphisms.
  
  !gapprompt@gap>| !gapinput@morX4 := MorphismOfInducedXMod( indX4 );|
  [[a4->s4] => [a4/ker->s3b]]
  
\end{Verbatim}
 For a second, injective example we take for ${\cal X}$ a conjugation crossed module. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@d8 := Subgroup( d16, [ b1^2, b2 ] );  SetName( d8, "d8" ); |
  Group([ (11,13,15,17)(12,14,16,18), (12,18)(13,17)(14,16) ])
  !gapprompt@gap>| !gapinput@c4 := Subgroup( d8, [ b1^2 ] );  SetName( c4, "c4" ); |
  Group([ (11,13,15,17)(12,14,16,18) ])
  !gapprompt@gap>| !gapinput@Y16 := XModByNormalSubgroup( d16, d8 );                   |
  [d8->d16]
  !gapprompt@gap>| !gapinput@Y8 := SubXMod( Y16, c4, d8 );            |
  [c4->d8]
  !gapprompt@gap>| !gapinput@inc8 := InclusionMorphism2dDomains( Y16, Y8 ); |
  [[c4->d8] => [d8->d16]]
  !gapprompt@gap>| !gapinput@incd8 := RangeHom( inc8 );;|
  !gapprompt@gap>| !gapinput@indY8 := InducedXMod( Y8, incd8 );|
  #I induced group has Size: 16
  #I factor 2 is abelian  with invariants: [ 4, 4 ]
  i*([c4->d8])
  !gapprompt@gap>| !gapinput@morY8 := MorphismOfInducedXMod( indY8 );|
  [[c4->d8] => i*([c4->d8])]
  
\end{Verbatim}
 For a third example we take the identity mapping on \texttt{s3c} as boundary, and the inclusion of \texttt{s3c} in \texttt{s4} as $\iota$. The induced group is a general linear group \texttt{GL(2,3)}. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@s3c := Subgroup( s4, [ (2,3), (3,4) ] );;  |
  !gapprompt@gap>| !gapinput@SetName( s3c, "s3c" );|
  !gapprompt@gap>| !gapinput@indXs3c := InducedXMod( s4, s3c, s3c );|
  #I induced group has Size: 48
  i*([s3c->s3c])
  !gapprompt@gap>| !gapinput@StructureDescription( indXs3c );|
  [ "GL(2,3)", "S4" ]
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{AllInducedXMods}}
\logpage{[ 7, 1, 2 ]}\nobreak
\hyperdef{L}{X7B24D47F8078540F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AllInducedXMods({\mdseries\slshape Q})\index{AllInducedXMods@\texttt{AllInducedXMods}}
\label{AllInducedXMods}
}\hfill{\scriptsize (operation)}}\\


 This function calculates all the induced crossed modules \texttt{InducedXMod( Q, P, M )}, where \texttt{P} runs over all conjugacy classes of subgroups of \texttt{Q} and \texttt{M} runs over all non-trivial subgroups of \texttt{P}. }

 }

 }

          
\chapter{\textcolor{Chapter }{Crossed squares and their morphisms}}\label{chap-obj3}
\logpage{[ 8, 0, 0 ]}
\hyperdef{L}{X8016C9727A692E1A}{}
{
  \index{crossed module} \index{cat2-group} \index{3d-group} Crossed squares were introduced by Guin-Wal{\a'e}ry and Loday (see, for
example, \cite{brow:lod}) as fundamental crossed squares of commutative squares of spaces, but are
also of purely algebraic interest. We denote by $[n]$ the set $\{1,2,\ldots,n\}$. We use the $n=2$ version of the definition of crossed $n$-cube as given by Ellis and Steiner \cite{ell:st}. 

 A \emph{crossed square} $\mathcal{S}$ consists of the following: 
\begin{itemize}
\item  Groups $S_J$ for each of the four subsets $J \subseteq [2]$; 
\item  a commutative diagram of group homomorphisms: 
\[ \ddot{\partial}_1 : S_{[2]} \to S_{\{2\}}, \quad \ddot{\partial}_2 : S_{[2]}
\to S_{\{1\}}, \quad \dot{\partial}_1 : S_{\{1\}} \to S_{\emptyset}, \quad
\dot{\partial}_2 : S_{\{2\}} \to S_{\emptyset}; \]
 
\item  actions of $S_{\emptyset}$ on $S_{\{1\}}, S_{\{2\}}$ and $S_{[2]}$ which determine actions of $S_{\{1\}}$ on $S_{\{2\}}$ and $S_{[2]}$ via $\dot{\partial}_1$ and actions of $S_{\{2\}}$ on $S_{\{1\}}$ and $S_{[2]}$ via $\dot{\partial}_2\;$; 
\item  a function $\boxtimes : S_{\{1\}} \times S_{\{2\}} \to S_{[2]}$. 
\end{itemize}
 The following axioms must be satisfied for all $l \in S_{[2]},\; m,m_1,m_2 \in S_{\{1\}},\; n,n_1,n_2 \in S_{\{2\}},\; p \in
S_{\emptyset}$: 
\begin{itemize}
\item  the homomorphisms $\ddot{\partial}_1, \ddot{\partial}_2$ preserve the action of $S_{\emptyset}\;$; 
\item  each of the upper, left-hand, lower, and right-hand sides of the square, 
\[ \ddot{\mathcal{S}}_1 = (\ddot{\partial}_1 : S_{[2]} \to S_{\{2\}}),
\ddot{\mathcal{S}}_2 = (\ddot{\partial}_2 : S_{[2]} \to S_{\{1\}}),
\dot{\mathcal{S}}_1 = (\dot{\partial}_1 : S_{\{1\}} \to S_{\emptyset}),
\dot{\mathcal{S}}_2 = (\dot{\partial}_2 : S_{\{2\}} \to S_{\emptyset}), \]
 and the diagonal 
\[ \mathcal{S}_{12} = (\partial_{12} := \dot{\partial}_1\ddot{\partial}_2 =
\dot{\partial}_2\ddot{\partial}_1 : S_{[2]} \to S_{\emptyset}) \]
 are crossed modules (with actions via $S_{\emptyset}$); 
\item  \index{crossed pairing} $\boxtimes$ is a \emph{crossed pairing}: 
\begin{itemize}
\item  $(m_1m_2 \boxtimes n)\;=\; {(m_1 \boxtimes n)}^{m_2}\;(m_2 \boxtimes n)$, 
\item  $(m \boxtimes n_1n_2) \;=\; (m \boxtimes n_2)\;{(m \boxtimes n_1)}^{n_2}$, 
\item  $(m \boxtimes n)^{p} \;=\; (m^p \boxtimes n^p)$; 
\end{itemize}
 
\item  $\ddot{\partial}_1 (m \boxtimes n) \;=\; (n^{-1})^{m}\;n \quad \mbox{and} \quad
\ddot{\partial}_2 (m \boxtimes n) \;=\; m^{-1}\;m^{n}$, 
\item  $(m \boxtimes \ddot{\partial}_1 l) \;=\; (l^{-1})^{m}\;l \quad \mbox{and} \quad
(\ddot{\partial}_2 l \boxtimes n) \;=\; l^{-1}\;l^n$. 
\end{itemize}
 Note that the actions of $S_{\{1\}}$ on $S_{\{2\}}$ and $S_{\{2\}}$ on $S_{\{1\}}$ via $S_{\emptyset}$ are compatible since 
\[ {m_1}^{(n^m)} \;=\; {m_1}^{\dot{\partial}_2(n^m)} \;=\;
{m_1}^{m^{-1}(\dot{\partial}_2 n)m} \;=\; (({m_1}^{m^{-1}})^n)^m. \]
 

 (A \emph{precrossed square} is a similar structure which satisfies some subset of these axioms.) 

 [More needed here.] 
\section{\textcolor{Chapter }{Constructions for crossed squares}}\label{sect-xsq-constructions}
\logpage{[ 8, 1, 0 ]}
\hyperdef{L}{X820A7D30847BC828}{}
{
  Analogously to the data structure used for crossed modules, crossed squares
are implemented as \texttt{3d-groups}. When times allows, cat2-groups will also be implemented, with conversion
between the two types of structure. Some standard constructions of crossed
squares are listed below. At present, a limited number of constructions are
implemented. Morphisms of crossed squares have also been implemented, though
there is a lot still to be done. 

\subsection{\textcolor{Chapter }{CrossedSquare}}
\logpage{[ 8, 1, 1 ]}\nobreak
\hyperdef{L}{X87FBE3CE87DC8CD5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CrossedSquare({\mdseries\slshape args})\index{CrossedSquare@\texttt{CrossedSquare}}
\label{CrossedSquare}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CrossedSquareByNormalSubgroups({\mdseries\slshape P, N, M, L})\index{CrossedSquareByNormalSubgroups@\texttt{CrossedSquareByNormalSubgroups}}
\label{CrossedSquareByNormalSubgroups}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ActorCrossedSquare({\mdseries\slshape X0})\index{ActorCrossedSquare@\texttt{ActorCrossedSquare}}
\label{ActorCrossedSquare}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Transpose3dGroup({\mdseries\slshape S0})\index{Transpose3dGroup@\texttt{Transpose3dGroup}}
\label{Transpose3dGroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Name({\mdseries\slshape S0})\index{Name@\texttt{Name}}
\label{Name}
}\hfill{\scriptsize (attribute)}}\\


 Here are some standard examples of crossed squares. 
\begin{itemize}
\item  If $M, N$ are normal subgroups of a group $P$, and $L = M \cap N$, then the four inclusions, $L \to N,~ L \to M,~ M \to P,~ N \to P$, together with the actions of $P$ on $M, N$ and $L$ given by conjugation, form a crossed square with crossed pairing 
\[ \boxtimes \;:\; M \times N \to M\cap N, \quad (m,n) \mapsto [m,n] \,=\,
m^{-1}n^{-1}mn \,=\,(n^{-1})^mn \,=\, m^{-1}m^n\,. \]
 This construction is implemented as \texttt{CrossedSquareByNormalSubgroups(P,N,M,L);}. 
\item  The actor $\mathcal{A}(\mathcal{X}_0)$ of a crossed module $\mathcal{X}_0$ has been described in Chapter 5. The crossed pairing is given by 
\[ \boxtimes \;:\; R \times W \,\to\, S, \quad (r,\chi) \,\mapsto\, \chi r~. \]
 This is implemented as \texttt{ActorCrossedSquare( X0 );}. 
\item  The \emph{transpose} of $\mathcal{S}$ is the crossed square $\tilde{\mathcal{S}}$ obtained by interchanging $S_{\{1\}}$ with $S_{\{2\}}$, $\ddot{\partial}_1$ with $\ddot{\partial}_2$, and $\dot{\partial}_1$ with $\dot{\partial}_2$. The crossed pairing is given by 
\[ \tilde{\boxtimes} \;:\; S_{\{2\}} \times S_{\{1\}} \to S_{[2]}, \quad (n,m)
\;\mapsto\; n\,\tilde{\boxtimes}\,m := (m \boxtimes n)^{-1}~. \]
 
\end{itemize}
 }

 

 
\begin{Verbatim}[commandchars=!@E,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>E !gapinput@d20 := DihedralGroup( IsPermGroup, 20 );;E
  !gapprompt@gap>E !gapinput@gend20 := GeneratorsOfGroup( d20 ); E
  [ (1,2,3,4,5,6,7,8,9,10), (2,10)(3,9)(4,8)(5,7) ]
  !gapprompt@gap>E !gapinput@p1 := gend20[1];;  p2 := gend20[2];;  p12 := p1*p2; E
  (1,10)(2,9)(3,8)(4,7)(5,6)
  !gapprompt@gap>E !gapinput@d10a := Subgroup( d20, [ p1^2, p2 ] );;E
  !gapprompt@gap>E !gapinput@d10b := Subgroup( d20, [ p1^2, p12 ] );;E
  !gapprompt@gap>E !gapinput@c5d := Subgroup( d20, [ p1^2 ] );;E
  !gapprompt@gap>E !gapinput@SetName( d20, "d20" );  SetName( d10a, "d10a" ); E
  !gapprompt@gap>E !gapinput@SetName( d10b, "d10b" );  SetName( c5d, "c5d" ); E
  !gapprompt@gap>E !gapinput@XSconj := CrossedSquareByNormalSubgroups( d20, d10b, d10a, c5d );E
  [  c5d -> d10b ]
  [   |      |   ]
  [ d10a -> d20  ]
  
  !gapprompt@gap>E !gapinput@Name( XSconj );E
  "[c5d->d10b,d10a->d20]"
  !gapprompt@gap>E !gapinput@XStrans := Transpose3dGroup( XSconj ); E
  [  c5d -> d10a ]
  [   |      |   ]
  [ d10b -> d20  ]
  
  !gapprompt@gap>E !gapinput@X20 := XModByNormalSubgroup( d20, d10a );E
  [d10a->d20]
  !gapprompt@gap>E !gapinput@XSact := ActorCrossedSquare( X20 );E
  crossed square with:
        up = Whitehead[d10a->d20]
      left = [d10a->d20]
      down = Norrie[d10a->d20]
     right = Actor[d10a->d20]
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{CentralQuotient}}
\logpage{[ 8, 1, 2 ]}\nobreak
\label{CentralQuotientXMod}
\hyperdef{L}{X814D9E1E78EEE665}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CentralQuotient({\mdseries\slshape X0})\index{CentralQuotient@\texttt{CentralQuotient}}
\label{CentralQuotient}
}\hfill{\scriptsize (attribute)}}\\


 The central quotient of a crossed module $\mathcal{X} = (\partial : S \to R)$ is the crossed square where: 
\begin{itemize}
\item  the left crossed module is $\mathcal{X}$; 
\item  the right crossed module is the quotient $\mathcal{X}/Z(\mathcal{X})$ (see \texttt{CentreXMod} (\ref{CentreXMod})); 
\item  the top and bottom homomorphisms are the natural homomorphisms onto the
quotient groups; 
\item  the crossed pairing $\boxtimes : (R \times F) \to S$, where $F = Fix(\mathcal{X},S,R)$, is the displacement element $\boxtimes(r,Fs) = \langle r,s \rangle = (s^{-1})^rs\quad$ (see \texttt{Displacement} (\ref{Displacement}) and section \ref{sect-isoclinic-xmods}). 
\end{itemize}
 This is the special case of an intended function \texttt{CrossedSquareByCentralExtension} which has not yet been implemented. In the example \texttt{Xn7} $\unlhd$ \texttt{X24}, constructed in section \ref{sect-more-xmod-ops}. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@pos7 := Position( ids, [ [12,2], [24,5] ] );;|
  !gapprompt@gap>| !gapinput@Xn7 := nsx[pos7]; |
  [Group( [ f2, f3, f4 ] )->Group( [ f1, f2, f4, f5 ] )]
  !gapprompt@gap>| !gapinput@IdGroup( CentreXMod(Xn7) );  |
  [ [ 4, 1 ], [ 4, 1 ] ]
  !gapprompt@gap>| !gapinput@CQXn7 := CentralQuotient( Xn7 );|
  crossed square with:
        up = [Group( [ f2, f3, f4 ] )->Group( [ f1 ] )]
      left = [Group( [ f2, f3, f4 ] )->Group( [ f1, f2, f4, f5 ] )]
      down = [Group( [ f1, f2, f4, f5 ] )->Group( [ f1, f2 ] )]
     right = [Group( [ f1 ] )->Group( [ f1, f2 ] )]
  
  !gapprompt@gap>| !gapinput@IdGroup( CQXn7 );|
  [ [ [ 12, 2 ], [ 3, 1 ] ], [ [ 24, 5 ], [ 6, 1 ] ] ]
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{IsCrossedSquare}}
\logpage{[ 8, 1, 3 ]}\nobreak
\hyperdef{L}{X8645AA3686F126D5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsCrossedSquare({\mdseries\slshape obj})\index{IsCrossedSquare@\texttt{IsCrossedSquare}}
\label{IsCrossedSquare}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Is3dObject({\mdseries\slshape obj})\index{Is3dObject@\texttt{Is3dObject}}
\label{Is3dObject}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsPerm3dObject({\mdseries\slshape obj})\index{IsPerm3dObject@\texttt{IsPerm3dObject}}
\label{IsPerm3dObject}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsPc3dObject({\mdseries\slshape obj})\index{IsPc3dObject@\texttt{IsPc3dObject}}
\label{IsPc3dObject}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsFp3dObject({\mdseries\slshape obj})\index{IsFp3dObject@\texttt{IsFp3dObject}}
\label{IsFp3dObject}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsPreCrossedSquare({\mdseries\slshape obj})\index{IsPreCrossedSquare@\texttt{IsPreCrossedSquare}}
\label{IsPreCrossedSquare}
}\hfill{\scriptsize (property)}}\\


 These are the basic properties for 3d-groups, and crossed squares in
particular. }

 

\subsection{\textcolor{Chapter }{Up2dGroup}}
\logpage{[ 8, 1, 4 ]}\nobreak
\hyperdef{L}{X7DB1FE4B852EE730}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Up2dGroup({\mdseries\slshape XS})\index{Up2dGroup@\texttt{Up2dGroup}}
\label{Up2dGroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Left2dGroup({\mdseries\slshape XS})\index{Left2dGroup@\texttt{Left2dGroup}}
\label{Left2dGroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Down2dGroup({\mdseries\slshape XS})\index{Down2dGroup@\texttt{Down2dGroup}}
\label{Down2dGroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Right2dGroup({\mdseries\slshape XS})\index{Right2dGroup@\texttt{Right2dGroup}}
\label{Right2dGroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DiagonalAction({\mdseries\slshape XS})\index{DiagonalAction@\texttt{DiagonalAction}}
\label{DiagonalAction}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{XPairing({\mdseries\slshape XS})\index{XPairing@\texttt{XPairing}}
\label{XPairing}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ImageElmXPairing({\mdseries\slshape XS, pair})\index{ImageElmXPairing@\texttt{ImageElmXPairing}}
\label{ImageElmXPairing}
}\hfill{\scriptsize (operation)}}\\


 In this implementation the attributes used in the construction of a crossed
square \texttt{XS} are the four crossed modules (2d-groups) on the sides of the square; the
diagonal action of $P$ on $L$; and the crossed pairing. 

 The \textsf{GAP} development team have suggested that crossed pairings should be implemented as
a special case of \texttt{BinaryMappings} -- a structure which does not yet exist in \textsf{GAP}. As a temporary measure, crossed pairings have been implemented using \texttt{Mapping2ArgumentsByFunction}. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@Up2dGroup( XSconj );|
  [c5d->d10b]
  !gapprompt@gap>| !gapinput@Right2dGroup( XSact );|
  Actor[d10a->d20]
  !gapprompt@gap>| !gapinput@xpconj := XPairing( XSconj );;|
  !gapprompt@gap>| !gapinput@ImageElmXPairing( xpconj, [ p2, p12 ] );|
  (1,9,7,5,3)(2,10,8,6,4)
  !gapprompt@gap>| !gapinput@diag := DiagonalAction( XSact );|
  [ (1,3,5,2,4)(6,10,14,8,12)(7,11,15,9,13), (1,2,5,4)(6,8,14,12)(7,11,13,9) 
   ] -> 
  [ (1,3,5,2,4)(6,10,14,8,12)(7,11,15,9,13), (1,2,5,4)(6,8,14,12)(7,11,13,9) 
   ] -> [ ^(1,3,5,7,9)(2,4,6,8,10), ^(1,2,5,4)(3,8)(6,7,10,9) ]
  
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{Morphisms of crossed squares}}\logpage{[ 8, 2, 0 ]}
\hyperdef{L}{X78A79A7E85128C7B}{}
{
 \index{morphism of 3d-group} \index{crossed square morphism} \index{3d-mapping} This section describes an initial implementation of morphisms of (pre-)crossed
squares. 

\subsection{\textcolor{Chapter }{Source}}
\logpage{[ 8, 2, 1 ]}\nobreak
\hyperdef{L}{X7DE8173F80E07AB1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Source({\mdseries\slshape map})\index{Source@\texttt{Source}}
\label{Source}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Range({\mdseries\slshape map})\index{Range@\texttt{Range}}
\label{Range}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Up2dMorphism({\mdseries\slshape map})\index{Up2dMorphism@\texttt{Up2dMorphism}}
\label{Up2dMorphism}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Left2dMorphism({\mdseries\slshape map})\index{Left2dMorphism@\texttt{Left2dMorphism}}
\label{Left2dMorphism}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Down2dMorphism({\mdseries\slshape map})\index{Down2dMorphism@\texttt{Down2dMorphism}}
\label{Down2dMorphism}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Right2dMorphism({\mdseries\slshape map})\index{Right2dMorphism@\texttt{Right2dMorphism}}
\label{Right2dMorphism}
}\hfill{\scriptsize (attribute)}}\\


 Morphisms of \texttt{3dObjects} are implemented as \texttt{3dMappings}. These have a pair of 3d-groups as source and range, together with four
2d-morphisms mapping between the four pairs of crossed modules on the four
sides of the squares. These functions return \texttt{fail} when invalid data is supplied. }

 

\subsection{\textcolor{Chapter }{IsCrossedSquareMorphism}}
\logpage{[ 8, 2, 2 ]}\nobreak
\hyperdef{L}{X8284240C7B9BB783}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsCrossedSquareMorphism({\mdseries\slshape map})\index{IsCrossedSquareMorphism@\texttt{IsCrossedSquareMorphism}}
\label{IsCrossedSquareMorphism}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsPreCrossedSquareMorphism({\mdseries\slshape map})\index{IsPreCrossedSquareMorphism@\texttt{IsPreCrossedSquareMorphism}}
\label{IsPreCrossedSquareMorphism}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsBijective({\mdseries\slshape mor})\index{IsBijective@\texttt{IsBijective}}
\label{IsBijective}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsEndomorphism3dObject({\mdseries\slshape mor})\index{IsEndomorphism3dObject@\texttt{IsEndomorphism3dObject}}
\label{IsEndomorphism3dObject}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsAutomorphism3dObject({\mdseries\slshape mor})\index{IsAutomorphism3dObject@\texttt{IsAutomorphism3dObject}}
\label{IsAutomorphism3dObject}
}\hfill{\scriptsize (property)}}\\


 A morphism \texttt{mor} between two pre-crossed squares $\mathcal{S}_{1}$ and $\mathcal{S}_{2}$ consists of four crossed module morphisms \texttt{Up2dMorphism( mor )}, mapping the \texttt{Up2dGroup} of $\mathcal{S}_1$ to that of $\mathcal{S}_2$, \texttt{Left2dMorphism( mor )}, \texttt{Down2dMorphism( mor )} and \texttt{Right2dMorphism( mor )}. These four morphisms are required to commute with the four boundary maps and
to preserve the rest of the structure. The current version of \texttt{IsCrossedSquareMorphism} does not perform all the required checks. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@ad20 := GroupHomomorphismByImages( d20, d20, [p1,p2], [p1,p2^p1] );;|
  !gapprompt@gap>| !gapinput@ad10a := GroupHomomorphismByImages( d10a, d10a, [p1^2,p2], [p1^2,p2^p1] );;|
  !gapprompt@gap>| !gapinput@ad10b := GroupHomomorphismByImages( d10b, d10b, [p1^2,p12], [p1^2,p12^p1] );;|
  !gapprompt@gap>| !gapinput@idc5d := IdentityMapping( c5d );;|
  !gapprompt@gap>| !gapinput@upconj := Up2dGroup( XSconj );;|
  !gapprompt@gap>| !gapinput@leftconj := Left2dGroup( XSconj );; |
  !gapprompt@gap>| !gapinput@downconj := Down2dGroup( XSconj );; |
  !gapprompt@gap>| !gapinput@rightconj := Right2dGroup( XSconj );; |
  !gapprompt@gap>| !gapinput@up := XModMorphismByHoms( upconj, upconj, idc5d, ad10b );|
  [[c5d->d10b] => [c5d->d10b]]
  !gapprompt@gap>| !gapinput@left := XModMorphismByHoms( leftconj, leftconj, idc5d, ad10a );|
  [[c5d->d10a] => [c5d->d10a]]
  !gapprompt@gap>| !gapinput@down := XModMorphismByHoms( downconj, downconj, ad10a, ad20 );|
  [[d10a->d20] => [d10a->d20]]
  !gapprompt@gap>| !gapinput@right := XModMorphismByHoms( rightconj, rightconj, ad10b, ad20 );|
  [[d10b->d20] => [d10b->d20]]
  !gapprompt@gap>| !gapinput@autoconj := CrossedSquareMorphism( XSconj, XSconj, up, left, right, down );; |
  !gapprompt@gap>| !gapinput@ord := Order( autoconj );;|
  !gapprompt@gap>| !gapinput@Display( autoconj );|
  Morphism of crossed squares :- 
  :    Source = [c5d->d10b,d10a->d20]
  :     Range = [c5d->d10b,d10a->d20]
  :     order = 5
  :    up-left: [ [ ( 1, 3, 5, 7, 9)( 2, 4, 6, 8,10) ], 
    [ ( 1, 3, 5, 7, 9)( 2, 4, 6, 8,10) ] ]
  :   up-right: 
  [ [ ( 1, 3, 5, 7, 9)( 2, 4, 6, 8,10), ( 1,10)( 2, 9)( 3, 8)( 4, 7)( 5, 6) ], 
    [ ( 1, 3, 5, 7, 9)( 2, 4, 6, 8,10), ( 1, 2)( 3,10)( 4, 9)( 5, 8)( 6, 7) ] ]
  :  down-left: 
  [ [ ( 1, 3, 5, 7, 9)( 2, 4, 6, 8,10), ( 2,10)( 3, 9)( 4, 8)( 5, 7) ], 
    [ ( 1, 3, 5, 7, 9)( 2, 4, 6, 8,10), ( 1, 3)( 4,10)( 5, 9)( 6, 8) ] ]
  : down-right: 
  [ [ ( 1, 2, 3, 4, 5, 6, 7, 8, 9,10), ( 2,10)( 3, 9)( 4, 8)( 5, 7) ], 
    [ ( 1, 2, 3, 4, 5, 6, 7, 8, 9,10), ( 1, 3)( 4,10)( 5, 9)( 6, 8) ] ]
  !gapprompt@gap>| !gapinput@KnownPropertiesOfObject( autoconj );|
  [ "CanEasilyCompareElements", "CanEasilySortElements", "IsTotal", 
    "IsSingleValued", "IsInjective", "IsSurjective", "IsPreCrossedSquareMorphism", 
    "IsCrossedSquareMorphism", "IsEndomorphism3dDomain" ]
  !gapprompt@gap>| !gapinput@IsAutomorphism3dDomain( autoconj );|
  true
  
\end{Verbatim}
 }

 }

          
\chapter{\textcolor{Chapter }{Crossed modules of groupoids}}\label{chap-gpd2o}
\logpage{[ 9, 0, 0 ]}
\hyperdef{L}{X80B3A81B7E5CA3A9}{}
{
  \index{crossed module of groupoids} 
\section{\textcolor{Chapter }{Constructions for crossed modules of groupoids}}\logpage{[ 9, 1, 0 ]}
\hyperdef{L}{X847F4ED77F50528C}{}
{
  \index{crossed module over a groupoid} \index{2d-domain with objects} A typical example of a crossed module $\mathcal{X}$ over a groupoid has for its range a connected groupoid. This is a direct
product of a group with a complete graph, and we call the vertices of the
graph the \emph{objects} of the crossed module. The source of $\mathcal{X}$ is a totally disconnected groupoid, with the same objects. The boundary
morphism is constant on objects. For details and other references see \cite{AW2}. 

\subsection{\textcolor{Chapter }{DiscreteNormalPreXModWithObjects}}
\logpage{[ 9, 1, 1 ]}\nobreak
\hyperdef{L}{X7A8F33BC7E00A6B8}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DiscreteNormalPreXModWithObjects({\mdseries\slshape gpd, gp})\index{DiscreteNormalPreXModWithObjects@\texttt{DiscreteNormalPreXModWithObjects}}
\label{DiscreteNormalPreXModWithObjects}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PreXModWithObjectsObj({\mdseries\slshape obs, bdy, act})\index{PreXModWithObjectsObj@\texttt{PreXModWithObjectsObj}}
\label{PreXModWithObjectsObj}
}\hfill{\scriptsize (operation)}}\\


 The next stage of development of this package will be to implement
constuctions of crossed modules over groupoids. This will require further
developments in the \textsf{Gpd} package. The following example is all that can be shown at the moment. More
was achieved in an earlier version, but produces errors in \textsf{GAP} 4.7. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@Ga4 := SinglePieceGroupoid( a4, [-9,-8,-7] );;|
  !gapprompt@gap>| !gapinput@Display( Ga4 );|
  single piece groupoid: 
    objects: [ -9, -8, -7 ]
      group: a4 = <[ (1,2,3), (2,3,4) ]>
  !gapprompt@gap>| !gapinput@GeneratorsOfGroup( k4 );|
  [ (1,2)(3,4), (1,3)(2,4) ]
  !gapprompt@gap>| !gapinput@PXO := DiscreteNormalPreXModWithObjects( Ga4, k4 );|
  homogeneous, discrete groupoid with:
    group: k4 = <[ (1,2)(3,4), (1,3)(2,4) ]> >
  objects: [ -9, -8, -7 ]
  #I  now need to be able to test:   ok := IsXMod( PM );
  <semigroup>
  !gapprompt@gap>| !gapinput@Source( PXO ); |
  perm homogeneous, discrete groupoid: < k4, [ -9, -8, -7 ] >
  
\end{Verbatim}
 }

 }

          
\chapter{\textcolor{Chapter }{Utility functions}}\label{chap-util}
\logpage{[ 10, 0, 0 ]}
\hyperdef{L}{X810FFB1C8035C8BE}{}
{
  By a utility function we mean a \textsf{GAP} function which is 
\begin{itemize}
\item  needed by other functions in this package, 
\item  not (as far as we know) provided by the standard \textsf{GAP} library, 
\item  more suitable for inclusion in the main library than in this package. 
\end{itemize}
 Sections on \emph{Printing Lists} and \emph{Distinct and Common Representatives} were moved to the \textsf{Utils} package with version 2.56. 
\section{\textcolor{Chapter }{Inclusion and Restriction Mappings}}\logpage{[ 10, 1, 0 ]}
\hyperdef{L}{X844AFC3A7DD6E190}{}
{
 \index{inclusion mapping} \index{restriction mapping} These functions have been moved to the \textsf{gpd} package, but are still documented here. 

\subsection{\textcolor{Chapter }{InclusionMappingGroups}}
\logpage{[ 10, 1, 1 ]}\nobreak
\hyperdef{L}{X7F8E297F7C84DE51}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{InclusionMappingGroups({\mdseries\slshape G, H})\index{InclusionMappingGroups@\texttt{InclusionMappingGroups}}
\label{InclusionMappingGroups}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{MappingToOne({\mdseries\slshape G, H})\index{MappingToOne@\texttt{MappingToOne}}
\label{MappingToOne}
}\hfill{\scriptsize (operation)}}\\


 This set of utilities concerns mappings. The map \texttt{incd8} is the inclusion of \texttt{d8} in \texttt{d16} used in Section \ref{sect-oper-mor}. \texttt{MappingToOne(G,H)} maps the whole of $G$ to the identity element in $H$. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@Print( incd8, "\n" );|
  [ (11,13,15,17)(12,14,16,18), (11,18)(12,17)(13,16)(14,15) ] ->
  [ (11,13,15,17)(12,14,16,18), (11,18)(12,17)(13,16)(14,15) ]
  !gapprompt@gap>| !gapinput@imd8 := Image( incd8 );;|
  !gapprompt@gap>| !gapinput@MappingToOne( c4, imd8 );|
  [ (11,13,15,17)(12,14,16,18) ] -> [ () ]
  
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{InnerAutomorphismsByNormalSubgroup}}
\logpage{[ 10, 1, 2 ]}\nobreak
\hyperdef{L}{X81D29E737F3D4878}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{InnerAutomorphismsByNormalSubgroup({\mdseries\slshape G, N})\index{InnerAutomorphismsByNormalSubgroup@\texttt{InnerAutomorphismsByNormalSubgroup}}
\label{InnerAutomorphismsByNormalSubgroup}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsGroupOfAutomorphisms({\mdseries\slshape A})\index{IsGroupOfAutomorphisms@\texttt{IsGroupOfAutomorphisms}}
\label{IsGroupOfAutomorphisms}
}\hfill{\scriptsize (property)}}\\


 Inner automorphisms of a group \texttt{G} by the elements of a normal subgroup \texttt{N} are calculated with the first of these functions, usually with \texttt{G} = \texttt{N}. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@autd8 := AutomorphismGroup( d8 );;|
  !gapprompt@gap>| !gapinput@innd8 := InnerAutomorphismsByNormalSubgroup( d8, d8 );;|
  !gapprompt@gap>| !gapinput@GeneratorsOfGroup( innd8 );|
  [ ^(1,2,3,4), ^(1,3) ]
  !gapprompt@gap>| !gapinput@IsGroupOfAutomorphisms( innd8 );|
  true
  
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{Abelian Modules}}\logpage{[ 10, 2, 0 ]}
\hyperdef{L}{X852BD9CA84C2AFF0}{}
{
 \index{abelian module} 

\subsection{\textcolor{Chapter }{AbelianModuleObject}}
\logpage{[ 10, 2, 1 ]}\nobreak
\hyperdef{L}{X806DEFCC859BB4F1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AbelianModuleObject({\mdseries\slshape grp, act})\index{AbelianModuleObject@\texttt{AbelianModuleObject}}
\label{AbelianModuleObject}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsAbelianModule({\mdseries\slshape obj})\index{IsAbelianModule@\texttt{IsAbelianModule}}
\label{IsAbelianModule}
}\hfill{\scriptsize (property)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AbelianModuleGroup({\mdseries\slshape obj})\index{AbelianModuleGroup@\texttt{AbelianModuleGroup}}
\label{AbelianModuleGroup}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AbelianModuleAction({\mdseries\slshape obj})\index{AbelianModuleAction@\texttt{AbelianModuleAction}}
\label{AbelianModuleAction}
}\hfill{\scriptsize (attribute)}}\\


 An abelian module is an abelian group together with a group action. These are
used by the crossed module constructor \texttt{XModByAbelianModule}. 

 The resulting \texttt{Xabmod} is isomorphic to the output from \texttt{XModByAutomorphismGroup( k4 );}. }

 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  
  !gapprompt@gap>| !gapinput@x := (6,7)(8,9);;  y := (6,8)(7,9);;  z := (6,9)(7,8);;|
  !gapprompt@gap>| !gapinput@k4a := Group( x, y );;  SetName( k4a, "k4a" );|
  !gapprompt@gap>| !gapinput@gens3a := [ (1,2), (2,3) ];;|
  !gapprompt@gap>| !gapinput@s3a := Group( gens3a );;  SetName( s3a, "s3a" );|
  !gapprompt@gap>| !gapinput@alpha := GroupHomomorphismByImages( k4a, k4a, [x,y], [y,x] );;|
  !gapprompt@gap>| !gapinput@beta := GroupHomomorphismByImages( k4a, k4a, [x,y], [x,z] );;|
  !gapprompt@gap>| !gapinput@auta := Group( alpha, beta );;|
  !gapprompt@gap>| !gapinput@acta := GroupHomomorphismByImages( s3a, auta, gens3a, [alpha,beta] );;|
  !gapprompt@gap>| !gapinput@abmod := AbelianModuleObject( k4a, acta );;|
  !gapprompt@gap>| !gapinput@Xabmod := XModByAbelianModule( abmod );|
  [k4a->s3a]
  !gapprompt@gap>| !gapinput@Display( Xabmod );|
  
  Crossed module [k4a->s3a] :- 
  : Source group k4a has generators:
    [ (6,7)(8,9), (6,8)(7,9) ]
  : Range group s3a has generators:
    [ (1,2), (2,3) ]
  : Boundary homomorphism maps source generators to:
    [ (), () ]
  : Action homomorphism maps range generators to automorphisms:
    (1,2) --> { source gens --> [ (6,8)(7,9), (6,7)(8,9) ] }
    (2,3) --> { source gens --> [ (6,7)(8,9), (6,9)(7,8) ] }
    These 2 automorphisms generate the group of automorphisms.
  
  
\end{Verbatim}
 }

 }

          
\chapter{\textcolor{Chapter }{Development history}}\label{chap-history}
\logpage{[ 11, 0, 0 ]}
\hyperdef{L}{X810C43BC7F63C4B4}{}
{
  This chapter, which contains details of the major changes to the package as it
develops, was first created in April 2002. Details of the changes from \textsf{XMod} 1 to \textsf{XMod} 2.001 are far from complete. Starting with version 2.009 the file \texttt{CHANGES} lists the minor changes as well as the more fundamental ones. 

 The inspiration for this package was the need, in the mid-1990's, to calculate
induced crossed modules (see \cite{BW1}, \cite{BW2}, \cite{BW3}). \textsf{GAP} was chosen over other computational group theory systems because the code was
freely available, and it was possible to modify the Tietze transformation code
so as to record the images of the original generators of a presentation as
words in the simplified presentation. (These modifications are now a standard
part of the Tietze transformation package in \textsf{GAP}.) 
\section{\textcolor{Chapter }{Changes from version to version}}\logpage{[ 11, 1, 0 ]}
\hyperdef{L}{X7ACE7E8384B73156}{}
{
 
\subsection{\textcolor{Chapter }{Version 1 for \textsf{GAP} 3}}\logpage{[ 11, 1, 1 ]}
\hyperdef{L}{X86E288B17E976C5E}{}
{
 \index{version 1 for \textsf{GAP} 3} The first version of \textsf{XMod} became an accepted package for \textsf{GAP} 3.4.3 in December 1996. }

 
\subsection{\textcolor{Chapter }{Version 2}}\logpage{[ 11, 1, 2 ]}
\hyperdef{L}{X7CF8E72D80AAB54F}{}
{
 Conversion of \textsf{XMod} 1 from \textsf{GAP} 3.4.3 to the new \textsf{GAP} syntax began soon after \textsf{GAP} 4 was released, and had a lengthy gestation. The new \textsf{GAP} syntax encouraged a re-naming of many of the function names. An early decision
was to introduce generic categories \texttt{2dDomain} for (pre-)crossed modules and (pre-)cat1-groups, and \texttt{2dMapping} for the various types of morphism. In 2.009 \texttt{3dDomain} was used for crossed squares and cat2-groups, and \texttt{3dMapping} for their morphisms. A generic name for derivations and sections is also
required, and \texttt{Up2dMapping} is currently used. }

 
\subsection{\textcolor{Chapter }{Version 2.001 for \textsf{GAP} 4}}\logpage{[ 11, 1, 3 ]}
\hyperdef{L}{X7DF294D2787047B1}{}
{
 \index{version 2.001 for \textsf{GAP} 4} This was the first version of \textsf{XMod} for \textsf{GAP} 4, completed in April 2002 in time for the release of \textsf{GAP} 4.3. Functions for actors and induced crossed modules were not included, nor
many of the functions for derivations and sections, for example \texttt{InnerDerivation}. }

 
\subsection{\textcolor{Chapter }{Induced crossed modules}}\logpage{[ 11, 1, 4 ]}
\hyperdef{L}{X7966FF497C36C465}{}
{
 During May 2002 converted the code for induced crossed modules. (Induced
cat1-groups may be converted one day.) }

 
\subsection{\textcolor{Chapter }{Versions 2.002 -- 2.006}}\logpage{[ 11, 1, 5 ]}
\hyperdef{L}{X7E0B70FD82DC5BA8}{}
{
 Version 2.004 of April 14th 2004 added the \texttt{Cat1Select} functionality of version 1 to the \texttt{Cat1} function. 

 A significant addition in Version 2.005 was the conversion of the actor
crossed module functions from the \texttt{3.4.4} version. This included \texttt{AutomorphismPermGroup} for a crossed module, \texttt{WhiteheadXMod}, \texttt{NorrieXMod}, \texttt{LueXMod}, \texttt{ActorXMod}, \texttt{Centre} of a crossed module, \texttt{InnerMorphism} and \texttt{InnerActorXMod}. }

 
\subsection{\textcolor{Chapter }{Versions 2.007 -- 2.010}}\logpage{[ 11, 1, 6 ]}
\hyperdef{L}{X7F6E650E85384C25}{}
{
 These versions contain changes made between September 2004 and October 2007. 
\begin{itemize}
\item  Added basic functions for crossed squares, considered as \texttt{3dObjects} with crossed pairings, and their morphisms. Groups with two normal subgroups,
and the actor of a crossed module, provide standard examples of crossed
squares. (Cat2-groups are not yet implemented.) 
\item  Converted the documentation to the format of the \textsf{GAPDoc} package. 
\item  Improved \texttt{AutomorphismPermGroup} for crossed modules, and introduced a special method for conjugation crossed
modules. 
\item  Substantial revisons made to \texttt{XModByCentralExtension}, \texttt{NorrieXMod}, \texttt{LueXMod}, \texttt{ActorXMod}, and \texttt{InclusionInducedXModByCopower}. 
\item  Version 2.010, of October 2007, was timed to coincide with the release of \textsf{GAP} 4.4.10, and included a change of filenames; and correct file protection codes. 
\end{itemize}
 }

 }

 
\section{\textcolor{Chapter }{Versions for \textsf{GAP} [4.5 .. 4.8]}}\logpage{[ 11, 2, 0 ]}
\hyperdef{L}{X7B7A59E97EBB9F3B}{}
{
 Version 2.19, released on 9th June 2012, included the following changes: 
\begin{itemize}
\item  The file \texttt{makedocrel.g} was copied, with appropriate changes, from \textsf{GAPDoc}, and now provides the correct way to update the documentation. 
\item  The first functions for crossed modules of groupoids were introduced. 
\item  A GNU General Public License declaration was added. 
\end{itemize}
 
\subsection{\textcolor{Chapter }{AllCat1s}}\logpage{[ 11, 2, 1 ]}
\hyperdef{L}{X794BBE42839F2E18}{}
{
 Version 2.21 contained major changes to the \texttt{Cat1Select} operation: the list \texttt{CAT1{\textunderscore}LIST} of cat1-structures in the data file \texttt{cat1data.g} was changed from permutation groups to pc-groups, with the generators of
subgroups; images of the tail map; and images of the head map being given as \texttt{ExtRepOfObj} of words in the generators. 

 The \texttt{AllCat1s} function was reintroduced from the \textsf{GAP}3 version, and renamed as the operation \texttt{AllCat1sBasic}. 

 In version 2.25 the data in \texttt{cat1data.g} was extended from groups of size up to $48$ to groups of size up to $70$. In particular, the $267$ groups of size 64 give rise to a total of $1275$ cat1-groups. The authors are indebted to Van Luyen Le in Galway for pointing
out a number of errors in the version of this list distributed with version
2.24 of this package. }

 
\subsection{\textcolor{Chapter }{Versions 2.43 - 2.56}}\logpage{[ 11, 2, 2 ]}
\hyperdef{L}{X78C26CC27D48B1A8}{}
{
 Version 2.43, released on 11th November 2015, included the following changes: 
\begin{itemize}
\item  The material on isoclinism in Chapter 4 was added. 
\item  The package webpage has moved to \href{http://pages.bangor.ac.uk/~mas023/chda/} {\texttt{http://pages.bangor.ac.uk/\texttt{\symbol{126}}mas023/chda/}}. 
\item  A GitHub repository was started at: \href{https://github.com/gap-packages/xmod} {\texttt{https://github.com/gap-packages/xmod}}. 
\item  The section on \emph{Distinct and Common Representatives} was moved to the \textsf{Utils} package. 
\end{itemize}
 }

 
\subsection{\textcolor{Chapter }{Latest Version}}\logpage{[ 11, 2, 3 ]}
\hyperdef{L}{X789596A2825FBD72}{}
{
 The latest version, 2.56, was released on 8th March 2016. }

 }

 
\section{\textcolor{Chapter }{What needs doing next?}}\logpage{[ 11, 3, 0 ]}
\hyperdef{L}{X83D1530487593182}{}
{
 
\begin{itemize}
\item  Speed up the calculation of Whitehead groups. 
\item  Add more functions for \texttt{3dObjects} and implement \texttt{cat2-groups}. 
\item  Improve interaction with the package \textsf{Gpd} implementing the group groupoid version of a crossed module, and adding more
functions for crossed modules of groupoids. 
\item  Add interaction with \textsf{IdRel} (and possibly \textsf{XRes} and \textsf{natp}) . 
\item  Need \texttt{InverseGeneralMapping} for morphisms and more features for \texttt{FpXMods}, \texttt{PcXMods}, etc. 
\item  Implement actions of a crossed module. 
\item  Implement \texttt{FreeXMods} and an operation \texttt{Isomorphism2dDomains}. 
\item  Allow the construction of a group of morphisms of crossed modules. 
\item  Complete the conversion from Version 1 of the calculation of sections using \texttt{EndoClasses}. 
\item  More crossed square constructions: 
\begin{itemize}
\item  If $M, N$ are ordinary $P$-modules and $A$ is an arbitrary abelian group on which $P$ acts trivially, then there is a crossed square with sides 
\[ 0 : A \to N,\quad 0 : A \to M,\quad 0 : M \to P,\quad 0 : N \to P. \]
 
\item  For a group $L$, the automorphism crossed module ${\rm Act}\ L = (\iota : L \to {\rm Aut}\ L)$ splits to form the square with $(\iota_1 : L \to {\rm Inn}\ L)$ on two sides, and $(\iota_2 : {\rm Inn}\ L \to {\rm Aut}\ L)$ on the other two sides, where $\iota_1$ maps $l \in L$ to the inner automorphism $\beta_l : L \to L,\; l^{\prime} \mapsto l^{-1}l^{\prime}l$, and $\iota_2$ is the inclusion of ${\rm Inn}\ L$ in ${\rm Aut}\ L$. The actions are standard, and the crossed pairing is 
\[ \boxtimes \;:\; {\rm Inn}\ L \times {\rm Inn}\ L \to L, \quad (\beta_l,
\beta_{l^{\prime}}) \;\mapsto\; [l, l^{\prime}]~. \]
 
\end{itemize}
 
\item  Improve the interaction with the \textsf{HAP} package. 
\end{itemize}
 }

 }

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

\bibliographystyle{alpha}
\bibliography{manual}

\addcontentsline{toc}{chapter}{References}

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

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


\printindex

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