% generated by GAPDoc2LaTeX from XML source (Frank Luebeck)
\documentclass[11pt]{report}
\usepackage{a4wide}
\sloppy
\pagestyle{myheadings}
\usepackage{amssymb}
\usepackage[latin1]{inputenc}
\usepackage{makeidx}
\makeindex
\usepackage{color}
\definecolor{DarkOlive}{rgb}{0.1047,0.2412,0.0064}
\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{FuncColor}{rgb}{1.0,0.0,0.0}
%% strange name because of pdflatex bug:
\definecolor{Chapter }{rgb}{0.0,0.0,1.0}

\usepackage{fancyvrb}

\usepackage{pslatex}

\usepackage[
        a4paper=true,bookmarks=false,pdftitle={Written with GAPDoc},
        pdfcreator={LaTeX with hyperref package / GAPDoc},
        colorlinks=true,backref=page,breaklinks=true,linkcolor=RoyalBlue,
        citecolor=RoyalGreen,filecolor=RoyalRed,
        urlcolor=RoyalRed,pagecolor=RoyalBlue]{hyperref}

% 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,}}
\newcommand{\Q}{\mathbb{Q}}
\newcommand{\R}{\mathbb{R}}
\newcommand{\C}{\mathbb{C}}
\newcommand{\Z}{\mathbb{Z}}
\newcommand{\N}{\mathbb{N}}
\newcommand{\F}{\mathbb{F}}

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

\newsavebox{\backslashbox}
\sbox{\backslashbox}{\texttt{\symbol{92}}}
\newcommand{\bs}{\usebox{\backslashbox}}

\begin{document}

\logpage{[ 0, 0, 0 ]}
\begin{titlepage}
\begin{center}{\Huge \textbf{The \textsf{Crime} Package}}\\[1cm]
\hypersetup{pdftitle=The \textsf{Crime} Package}
\markright{\scriptsize \mbox{}\hfill The \textsf{Crime} Package \hfill\mbox{}}
{Version 1.1}\\[1cm]
\mbox{}\\[2cm]
{\large \textbf{Marcus Bishop  }}\\
\hypersetup{pdfauthor=Marcus Bishop  }
\end{center}\vfill

\mbox{}\\
{\mbox{}\\
\small \noindent \textbf{Marcus Bishop  } --- Email: \href{mailto://marcus.bishop@gmail.com}{\texttt{marcus.bishop@gmail.com}}}\\
\end{titlepage}

\newpage\setcounter{page}{2}
{\small 
\section*{Copyright}
\logpage{[ 0, 0, 1 ]}
 {\copyright} 2006 Marcus Bishop 

 We adopt the copyright regulations of \textsf{GAP} as detailed in the copyright notice in the \textsf{GAP} manual. }\\[1cm]
{\small 
\section*{Acknowledgements}
\logpage{[ 0, 0, 2 ]}
 This project would not have been possible without Jon Carlson. Jon devised the
algorithms used by \texttt{ProjectiveResolution}, \texttt{CohomologyGenerators}, and \texttt{CohomologyRelators}, having already implemented them in \textsf{Magma} and sharing these programs with me. }\\[1cm]
\newpage

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

\tableofcontents
\newpage

 
\chapter{\textcolor{Chapter }{Installation and Loading}}\logpage{[ 1, 0, 0 ]}
{
  Like other \textsf{GAP} packages, you download and unpack this package into \textsf{GAP}'s \texttt{pkg} directory. For example, if you were using some Unix derivative and \textsf{GAP} were installed in the directory \texttt{/usr/local/gap4r4}, then you would do the following. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  
  $ cd /usr/local/gap4r4/pkg
  $ su
  % wget 'http://math.uic.edu/~marcus/Crime/crime-1.1.tar.gz'
  % tar xvzvf crime-1.1.tar.gz 
  
\end{Verbatim}
 In this situation, users would then load the package with the \texttt{LoadPackage} command. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  
  $ gap
  gap> LoadPackage("crime");
  
\end{Verbatim}
 Users not having root access, using someone else's computer, or having bad
relationships with their network administrators, could install the package
into their home directories or into some other writable directory such as \texttt{/tmp} as follows. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  
  $ mkdir /tmp/pkg
  $ cd /tmp/pkg
  $ wget 'http://math.uic.edu/~marcus/Crime/crime-1.1.tar.gz'
  $ tar xvzvf crime-1.1.tar.gz 
  $ gap -l ';/tmp'
  gap> LoadPackage("crime");
\end{Verbatim}
 Finally, it would be a good idea to run the test file to confirm that all the
functions work. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  
  gap> ReadPackage("crime","tst/test.g");
\end{Verbatim}
 You can count yourself lucky if \textsf{GAP} doesn't complain about anything. There is also a longer running test file for
those having ample free time described in Chapter \ref{test}. }

 
\chapter{\textcolor{Chapter }{Usage}}\logpage{[ 2, 0, 0 ]}
{
  All the functions described below taking an argument \texttt{n} except \texttt{CohomologyRing}, \texttt{CohomologyRelators} and \texttt{InducedHomomorphismOnCohomology} do whatever the manual says they do until some stage \texttt{n}, where \texttt{n} is normally the homological degree. These functions are idempotent in the
sense that called a second time with the same argument \texttt{n}, they do nothing, but called with a bigger \texttt{n}, they continue computing from where the previous calculations left off. 
\section{\textcolor{Chapter }{Cohomology Objects}}\logpage{[ 2, 1, 0 ]}
{
  The computation of group cohomology involves several calculations, the results
of which are reused in later calculations, and are thus collected in an object
of type \texttt{CObject}, which is created with the following command. 

\subsection{\textcolor{Chapter }{CohomologyObject}}
\logpage{[ 2, 1, 1 ]}\nobreak
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CohomologyObject( G, M )\index{CohomologyObject@\texttt{CohomologyObject}}
\label{CohomologyObject}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CohomologyObject( G )\index{CohomologyObject@\texttt{CohomologyObject}}
\label{CohomologyObject}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a cohomology object.



 This function creates a cohomology object having components the $p$-group $G$ and the \textsf{MeatAxe} $kG$-module $M$. The second invocation creates a cohomology object having components the $p$-group $G$ and the trivial \textsf{MeatAxe} $kG$-module where $k$ is the field $\mathbb{F}_p$.  }

 

We emphasize that in the first invocation, \texttt{M} can be any \textsf{MeatAxe} module over $kG$ where $k$ is any field of characteristic $p$. But since the case $k=\mathbb{F}_p$,  and $M=k$ is probably the most common, the second invocation is provided for
convenience. At the present, \texttt{ProjectiveResolution} works when \texttt{M} is an arbitrary \textsf{MeatAxe} module, but all the functions dealing with the ring-structure of $H^\ast\left(G,k\right)$  require that \texttt{M} be the trivial module. 

The cohomology object is used to store, in addition to the items mentioned
above, the boundary maps, the Betti numbers, the multiplication table, etc. }

 
\section{\textcolor{Chapter }{Minimal Projective Resolutions}}\logpage{[ 2, 2, 0 ]}
{
 Given a $p$-group $G$, a field $k$ of characteristic $p$ and a $kG$-module $M$, the function below computes the first few terms of the minimal projective
resolution of $M$  
\[ P_n\rightarrow\cdots\rightarrow P_2\rightarrow P_1 \rightarrow P_0\rightarrow
M\rightarrow 0 \]
 where $P_i=\left(kG\right)^{\oplus b_i}$   for certain numbers $b_i$, the \emph{Betti numbers} of the resolution. The minimal $kG$-projective resolution of $M$ is unique up to chain isomorphism. Then the groups  $\mathrm{Ext}^n_{kG}\left(M,N\right)$  are simply  $\mathrm{Hom}_{kG}\left(P_n,N\right)$,  and if $M=N=k$ is the trivial $kG$-module, then  $H^n\left(G,k\right)=\mathrm{Ext}^n_{kG} \left(k,k\right)=k^{b_n}$.  

\subsection{\textcolor{Chapter }{ProjectiveResolution}}
\logpage{[ 2, 2, 1 ]}\nobreak
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ProjectiveResolution( C, n )\index{ProjectiveResolution@\texttt{ProjectiveResolution}}
\label{ProjectiveResolution}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a list containing the Betti numbers $b_0, b_1,\ldots, b_n$.



 Given a cohomology object \texttt{C} having components $G$, $k$, and $M$, this function computes the first \texttt{n}$+1$ terms of the minimal projective resolution $P_\ast$ of $M$ of the form  $P_i=\left(kG\right)^{\oplus b_i}$ for $0\leq i\leq n$,  and returns the numbers $b_i$ as a list. }

 

\subsection{\textcolor{Chapter }{BoundaryMap}}
\logpage{[ 2, 2, 2 ]}\nobreak
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{BoundaryMap( C, n )\index{BoundaryMap@\texttt{BoundaryMap}}
\label{BoundaryMap}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
the \texttt{n}th boundary map.



 Given the cohomology object \texttt{C}, this function computes a projective resolution to degree \texttt{n} if it hasn't been computed already, and returns the \texttt{n}th boundary map. 

The map returned is a  $b_n\times\left(b_{n-1}\left|G\right|\right)$  matrix, having in the $i$th row the image of the element $1_G$ from the $i$th direct summand of $P_n$. 

See the file \texttt{doc/example.*} for an example of the usage and interpretation of the result of this function. }

 }

 
\section{\textcolor{Chapter }{Cohomology Generators and Relators}}\logpage{[ 2, 3, 0 ]}
{
 

\subsection{\textcolor{Chapter }{CohomologyGenerators}}
\logpage{[ 2, 3, 1 ]}\nobreak
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CohomologyGenerators( C, n )\index{CohomologyGenerators@\texttt{CohomologyGenerators}}
\label{CohomologyGenerators}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a list containing the degrees of the generators of the cohomology ring.



 Given a cohomology object \texttt{C} having components $G$, $k$, and $M$, this function computes the generators of  $H^\ast\left(G,k\right)$  of degree less than or equal to \texttt{n}, and stores them in \texttt{C}. The function returns a list of the degrees of these generators. }

 The actual cohomology generators are represented by maps $P_n \rightarrow k$ and are stored in \texttt{C} as matrices. Only their degrees are returned. 

\subsection{\textcolor{Chapter }{CohomologyRelators}}
\logpage{[ 2, 3, 2 ]}\nobreak
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CohomologyRelators( C, n )\index{CohomologyRelators@\texttt{CohomologyRelators}}
\label{CohomologyRelators}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a list of generators and a list of relators.



 Given a cohomology object \texttt{C} having components $G$, $k$, and $M$, this function computes a set of generators of the ideal of relators in  $H^\ast\left(G,k\right),$  all having multidegree less than or equal to $n$. Read on for what this means exactly. 

The function returns two lists, the first list containing the variables \texttt{z}, \texttt{y}, \texttt{x}, $\ldots$ corresponding to the generators of  $H^\ast\left(G,k\right)$  if there are fewer than 12 generators and containing the variables \texttt{x{\textunderscore}1}, \texttt{x{\textunderscore}2}, \texttt{x{\textunderscore}3}, $\ldots$ otherwise. The second list is a list of polynomials in the variables from the
first list. 

These two lists should be interpreted as follows. A degree-\texttt{n} approximation of the cohomology ring  $H^\ast\left(G,k\right)$  is given by the polynomial ring over $k$ in the non-commuting variables from the first list, (having degrees given by
the list returned by \texttt{CohomologyGenerators} above) and subject to the relators in the second list. See \ref{whathappens} for more details still. }

 For example, the following commands 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  
  gap> C:=CohomologyObject(DihedralGroup(8));
  <object>
  gap> CohomologyGenerators(C,10);
  [ 1, 1, 2 ]
  gap> CohomologyRelators(C,10);
  [ [ z, y, x ], [ z*y+y^2 ] ]
  
\end{Verbatim}
 tell us that for $G=D_8$, the cohomology ring  $H^\ast\left(G,k\right)$  is the graded-commutative polynomial ring in the variables $z$, $y$, and $x$ of degrees 1, 1, and 2, subject to the relation $zy+y^2$. But since  $H^\ast\left(G,k\right)$  \emph{is} commutative, $k$ being of characteristic 2, we have  $H^\ast\left(G,k\right)=k\left[z,y,x\right] \left/\left(zy+y^2\right)\right.$.  This result can be further improved by taking $z=z+y$, giving  $H^\ast\left(G,k\right)=k\left[z,y,x\right] \left/\left(zy\right)\right.$.  

Observe that in this case, we knew in advance that there was a set of
generators for $H^\ast\left(G,k\right)$  all having degree less than 10, and that there was a set of generators of the
ideal of relators all having multidegree less than 10. See see \ref{whathappens} for details. 

While this isn't likely to occur, we point out that if there are 12 or more
generators and some of the indeterminates \texttt{x{\textunderscore}1}, \texttt{x{\textunderscore}2}, \texttt{x{\textunderscore}3}, $\ldots$ have already been named, say by a previous call to \texttt{CohomologyRelators}, then these variables will retain their old names. If this is confusing,
restart \textsf{GAP} and do it again. }

 
\section{\textcolor{Chapter }{Tests for Completion}}\label{completion}
\logpage{[ 2, 4, 0 ]}
{
 A test or series of tests for completion of the calculation will hopefully be
implemented soon. See \cite{carlson} for the details. }

 
\section{\textcolor{Chapter }{Cohomology Rings}}\label{ring}
\logpage{[ 2, 5, 0 ]}
{
 See \cite{carlson} for the details of the calculation of cohomology products using composition of
chain maps. See also the file \texttt{doc/explanation.*} for an explanation of the implementation. 

\subsection{\textcolor{Chapter }{CohomologyRing}}
\logpage{[ 2, 5, 1 ]}\nobreak
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CohomologyRing( C, n )\index{CohomologyRing@\texttt{CohomologyRing}}
\label{CohomologyRing}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CohomologyRing( G, n )\index{CohomologyRing@\texttt{CohomologyRing}}
\label{CohomologyRing}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
the cohomology ring of $G$.



 Given a cohomology object \texttt{C} having module component the trivial $kG$-module and possibly having a projective resolution already computed, this
function returns the degree-\texttt{n} truncation of the cohomology ring $H^\ast\left(G,k\right).$  See \ref{whathappens} for what this means exactly. The object returned is a structure constant
algebra. 

Users interested only in working with the cohomology ring of a group as a \textsf{GAP} object, and not in calculating generators, relators, induced maps, etc, can
use the second invocation of this function, which returns the cohomology ring
of the group \texttt{G} immediately, throwing away all intermediate calculations. 

Observe that the object returned is a degree \texttt{n} truncation of the infinite-dimensional cohomology ring. A consequence of this
is that multiplying two elements whose product has degree greater than \texttt{n} results in zero, whether or not the product is really zero. 

Observe also that calling \texttt{CohomologyRing} a second time with a bigger \texttt{n} does \emph{not} extend the previous ring, but rather, recalculates the entire ring from the
beginning. Extending the previous ring appears not to be worth the effort for
technical reasons, since almost everything would need to be recalculated again
anyway. }

 

\subsection{\textcolor{Chapter }{IsHomogeneous}}
\logpage{[ 2, 5, 2 ]}\nobreak
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomogeneous( e )\index{IsHomogeneous@\texttt{IsHomogeneous}}
\label{IsHomogeneous}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}.



 Given an element \texttt{e} of some cohomology ring $A$, this operation determines whether or not \texttt{e} is homogeneous, that is, whether or not \texttt{e} is contained in some \texttt{hom{\textunderscore}component} of $A$. }

 

\subsection{\textcolor{Chapter }{Degree}}
\logpage{[ 2, 5, 3 ]}\nobreak
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Degree( e )\index{Degree@\texttt{Degree}}
\label{Degree}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
the degree of \texttt{e}.



 This function is intended to return the degree of the possibly non-homogeneous
element \texttt{e} of some cohomology ring $A$, but in principle, works for any element of any graded \texttt{SCAlgebra}. Specifically, if  $A=A_0\oplus A_1\oplus A_2\oplus\cdots$  where $A_i$ are the \texttt{hom{\textunderscore}components} of $A$, then this function returns the minimum $n$ such that \texttt{e} is in  $A_0\oplus A_1\oplus\cdots\oplus A_n$.  }

 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> A:=CohomologyRing(DihedralGroup(8),10);
  <algebra of dimension 66 over GF(2)>
  gap> b:=Basis(A);
  CanonicalBasis( <algebra of dimension 66 over GF(2)> )
  gap> x:=b[2]+b[4];
  v.2+v.4
  gap> IsHomogeneous(x);
  false
  gap> Degree(x);
  2 
\end{Verbatim}
 

\subsection{\textcolor{Chapter }{LocateGeneratorsInCohomologyRing}}
\logpage{[ 2, 5, 4 ]}\nobreak
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{LocateGeneratorsInCohomologyRing( C )\index{LocateGeneratorsInCohomologyRing@\texttt{LocateGeneratorsInCohomologyRing}}
\label{LocateGeneratorsInCohomologyRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a list containing the cohomology generators.



 Having already called \texttt{CohomologyRing} (see \ref{CohomologyRing}), this function returns a list of elements of the cohomology ring which
together with the identity element generate the cohomology ring. 

This function is a wrapper for \texttt{CohomologyGenerators} (see \ref{CohomologyGenerators}), indicating which elements of the cohomology ring correspond with the
generators found by \texttt{CohomologyGenerators}. }

 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> C:=CohomologyObject(SmallGroup(8,4));
  <object>
  gap> A:=CohomologyRing(C,10);
  <algebra of dimension 17 over GF(2)>
  gap> L:=LocateGeneratorsInCohomologyRing(C);
  [ v.2, v.3, v.7 ]
  gap> A=Subalgebra(A,Concatenation(L,[One(A)]));
  true
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{What Happens if \texttt{n} Isn't Big Enough?}}\label{whathappens}
\logpage{[ 2, 6, 0 ]}
{
  Since $P_\ast$ is a \emph{minimal} resolution, the cohomology group $H^i\left(G,k\right)$ is the dual of $P_n$, so that $H^i\left(G,k\right)$ has a natural basis consisting of the maps sending the element $1_G$ of the $j$th direct summand of $P_i$ to $1_k$ and all other direct summands to $0_k$ for  $1\le j\le b_i$.  

The command \texttt{CohomologyRing(C,n)} concatenates these bases for  $1\le i\le n$  and computes all products of basis elements $x$ and $y$ for which $\deg x+\deg y \leq n$. Thinking of $H^\ast\left(G,k\right)$  in terms of it's multiplication table, then this means that the function
computes the upper left-hand corner of the multiplication table. If $\deg x + \deg y > n$ then the product $xy$ is taken to be zero. Therefore, the ring returned by \texttt{CohomologyGenerators} is  $H^\ast\left(G,k\right)\left/J_{{\textgreater}n}\right.$  where $J_{>n}$  is the ideal of all elements of degree $>n$. 

The ring determined by \texttt{CohomologyGenerators} and \texttt{CohomologyRelators} is somewhat different. \texttt{CohomologyGenerators} proceeds inductively, taking all standard basis elements of $H^1\left(G,k\right)$ as generators, and for  $1{\textless}i\le n$,  taking all standard basis elements of $H^i\left(G,k\right)$ which are \emph{not} products of lower-degree elements as generators. Therefore, unless you have
some reason to believe that there exists a generating set for  $H^\ast\left(G,k\right)$  consisting of elements of degree $\leq n$, then you are \emph{not} guaranteed that the elements returned by the \texttt{CohomologyGenerators} generate  $H^\ast\left(G,k\right)$  as a ring. 

Similarly, \texttt{CohomologyRelators} proceeds inductively until degree $n$, returning a list of polynomials of multidegree $\leq n$. 

The impact of the preceeding information is that there is a homomorphism  $f:k\left.\left\langle x_1,x_2,\dots x_m \right\rangle\right./I \to
H^\ast\left(G,k\right)$  where $x_1,x_2,\ldots,x_m$ represent the elements returned by \texttt{CohomologyGenerators(C,n)}, $k\left\langle x_1,x_2,\ldots x_m \right\rangle$ is the polynomial ring over $k$ in the non-commuting variables $x_1,x_2,\ldots,x_m$, and $I$ is the ideal in $k\left\langle x_1,x_2,\ldots, x_m \right\rangle$ generated by the elements returned by \texttt{CohomologyRelators(C,n)}. 

Therefore, if there is a generator of degree $>n$, then $f$ won't be surjective. If there is a relator of multidegree $>n$ which is not a consequence of lower degree relators, then $f$ won't be injective. See \ref{completion} for how big $n$ needs to be to ensure that $f$ be an isomorphism. }

 
\section{\textcolor{Chapter }{Induced Maps}}\logpage{[ 2, 7, 0 ]}
{
 Let $f: H \rightarrow G$ be a group homomorphism. Then $f$ induces a homomorphism on cohomology  $H^\ast\left(G,k\right) \to H^\ast\left(H,k\right)$  which is returned by the following function. 

\subsection{\textcolor{Chapter }{InducedHomomorphismOnCohomology}}
\logpage{[ 2, 7, 1 ]}\nobreak
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{InducedHomomorphismOnCohomology( C, D, f, n )\index{InducedHomomorphismOnCohomology@\texttt{InducedHomomorphismOnCohomology}}
\label{InducedHomomorphismOnCohomology}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the induced homomorphism on cohomology rings.



 This function returns the induced homomorphism on cohomology  $H^\ast\left(G,k\right) \to H^\ast\left(H,k\right)$  where the groups $H$ and $G$ are the components of the cohomology objects \texttt{C} and \texttt{D} and $f: H \rightarrow G$ is a group homomorphism. If the cohomology rings have not yet been calculated,
they will be computed to degree $n$, and in this case, they can then be accessed by calling \texttt{CohomologyRing} (see \ref{CohomologyRing}). }

 

\subsection{\textcolor{Chapter }{Inclusion}}
\logpage{[ 2, 7, 2 ]}\nobreak
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Inclusion( H, G )\index{Inclusion@\texttt{Inclusion}}
\label{Inclusion}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the inclusion $H\rightarrow G$



This function returns the group homomorphism $H\rightarrow G$ when $H$ is a subgroup of $G$. The returned map can be used as the \texttt{f} argument of \texttt{InducedHomomorphismOnCohomology}, in which case the induced homomorphism is the restriction map  $\mathrm{Res}^G_H:H^\ast\left(G,k\right) \to H^\ast\left(H,k\right)$.  }

 The following example calculates the homomorphism on cohomology induced by the
inclusion of the cyclic group of size 4 into the dihedral group of size 8. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  
  gap> G:=DihedralGroup(8);H:=Subgroup(G,[G.2]);
  <pc group of size 8 with 3 generators>
  Group([ f2 ])
  gap> C:=CohomologyObject(H);D:=CohomologyObject(G);
  <object>
  <object>
  gap> i:=Inclusion(H,G);
  [ f2 ] -> [ f2 ]
  gap> Res:=InducedHomomorphismOnCohomology(C,D,i,10);;
  gap> A:=CohomologyRing(D,10);
  <algebra of dimension 66 over GF(2)>
  gap> LocateGeneratorsInCohomologyRing(D);
  [ v.2, v.3, v.6 ]
  gap> A.1^Res; A.2^Res; A.3^Res; A.6^Res;
  v.1
  0*v.1
  v.2
  v.3
  
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{Massey Products}}\logpage{[ 2, 8, 0 ]}
{
 See \cite{kraines} for the definitions and \cite{borge} for the details of the calculation using the Yoneda cocomplex. See also the
file \texttt{doc/explanation.*} for an explanation of the implementation. 

\subsection{\textcolor{Chapter }{MasseyProduct}}
\logpage{[ 2, 8, 1 ]}\nobreak
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{MasseyProduct( x1, x2, ..., xn )\index{MasseyProduct@\texttt{MasseyProduct}}
\label{MasseyProduct}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the Massey product  $\left\langle x_1,x_2,\dots,x_n\right\rangle$.  



 Given elements  $x_1,x_2,\dots,x_n$  of a cohomology ring returned by \texttt{CohomologyRing} (see \ref{ring}), this function computes the $n$-fold Massey product  $\left\langle x_1,x_2,\ldots,x_n\right\rangle$  provided that the lower-degree Massey products $\left\langle~x_i ,x_{{i+1}}, \ldots , x_j~\right\rangle$ vanish for all $1 \leq i < j \leq n$, and returns \texttt{fail} otherwise. }

 As an example, recall that the cohomology rings of the cyclic groups $C_3$ and $C_9$ of size 3 and 9 over $k=\mathbb{F}_3$  are both given by  $k\left\langle z, y\right\rangle\left/\left(z^2\right)\right.$,  that is, they are isomorphic as rings. However, the following example shows
that $\left\langle~z, z, z~\right\rangle$ is non-zero in $H^\ast\left(C_3,k\right)$  but is zero in $H^\ast\left(C_9,k\right)$.  
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  
  gap> A:=CohomologyRing(CyclicGroup(3),10);
  <algebra of dimension 11 over GF(3)>
  gap> z:=Basis(A)[2];
  v.2
  gap> MasseyProduct(z,z);
  0*v.1
  gap> MasseyProduct(z,z,z);
  v.3
  gap> A:=CohomologyRing(CyclicGroup(9),10);
  <algebra of dimension 11 over GF(3)>
  gap> z:=Basis(A)[2];
  v.2
  gap> MasseyProduct(z,z);
  0*v.1
  gap> MasseyProduct(z,z,z);
  0*v.1
  gap> MasseyProduct(z,z,z,z,z,z,z,z,z);
  v.3
  
\end{Verbatim}
 }

 }

 
\chapter{\textcolor{Chapter }{Leisure and Recreation: Cohomology Rings of all Groups of Size 16}}\label{test}
\logpage{[ 3, 0, 0 ]}
{
 Below is the output of the test file \texttt{tst/batch.g}. The file runs through all groups of size $n$, which is initially set to $16$, and runs \texttt{ProjectiveResolution}, \texttt{CohomologyGenerators} and \texttt{CohomologyRelators} for each group, and prints the results as well as the timings for each
operation to a file. The output below was computed on a 3.06 GHz Intel
processor with 3.71 GB of RAM. The projective resolutions are calculated
initially to degree $10$ and the generators and relators to degree $6$, due to the fact that I already knew all the generators and relators to be of
degree less than 6, see \href{http://www.math.uga.edu/~lvalero/cohointro.html}{\texttt{http://www.math.uga.edu/\~{}lvalero/cohointro.html}}. See also the file \texttt{tst/README} for suggestions on dealing with other users when running long-running batch
processes. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  
  SmallGroup(16,1)
  Betti Numbers: [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
  Time:  0:00:05.864
  Generators in degrees: [ 1, 2 ]
  Time:  0:00:00.086
  Relators: [ [ z, y ], [ z^2 ] ]
  Time:  0:00:00.245
  
  SmallGroup(16,2)
  Betti Numbers: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
  Time:  0:00:00.931
  Generators in degrees: [ 1, 1, 2, 2 ]
  Time:  0:00:02.874
  Relators: [ [ z, y, x, w ], [ z^2, y^2 ] ]
  Time:  0:00:12.227
  
  SmallGroup(16,3)
  Betti Numbers: [ 1, 2, 4, 6, 9, 12, 16, 20, 25, 30, 36 ]
  Time:  0:00:05.292
  Generators in degrees: [ 1, 1, 2, 2, 2 ]
  Time:  0:00:21.770
  Relators: [ [ z, y, x, w, v ], [ z^2, z*y, z*x, y^2*v+x^2 ] ]
  Time:  0:01:26.166
  
  SmallGroup(16,4)
  Betti Numbers: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
  Time:  0:00:01.047
  Generators in degrees: [ 1, 1, 2, 2 ]
  Time:  0:00:03.253
  Relators: [ [ z, y, x, w ], [ z^2, z*y+y^2, y^3 ] ]
  Time:  0:00:14.294
  
  SmallGroup(16,5)
  Betti Numbers: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
  Time:  0:00:01.065
  Generators in degrees: [ 1, 1, 2 ]
  Time:  0:00:02.493
  Relators: [ [ z, y, x ], [ z^2 ] ]
  Time:  0:00:13.573
  
  SmallGroup(16,6)
  Betti Numbers: [ 1, 2, 2, 2, 3, 4, 4, 4, 5, 6, 6 ]
  Time:  0:00:00.446
  Generators in degrees: [ 1, 1, 3, 4 ]
  Time:  0:00:01.566
  Relators: [ [ z, y, x, w ], [ z^2, z*y^2, z*x, x^2 ] ]
  Time:  0:00:04.132
  
  SmallGroup(16,7)
  Betti Numbers: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
  Time:  0:00:01.076
  Generators in degrees: [ 1, 1, 2 ]
  Time:  0:00:02.495
  Relators: [ [ z, y, x ], [ z*y ] ]
  Time:  0:00:13.862
  
  SmallGroup(16,8)
  Betti Numbers: [ 1, 2, 2, 2, 3, 4, 4, 4, 5, 6, 6 ]
  Time:  0:00:00.465
  Generators in degrees: [ 1, 1, 3, 4 ]
  Time:  0:00:01.570
  Relators: [ [ z, y, x, w ], [ z*y, z^3, z*x, y^2*w+x^2 ] ]
  Time:  0:00:04.350
  
  SmallGroup(16,9)
  Betti Numbers: [ 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2 ]
  Time:  0:00:00.140
  Generators in degrees: [ 1, 1, 4 ]
  Time:  0:00:00.255
  Relators: [ [ z, y, x ], [ z*y, z^3+y^3, y^4 ] ]
  Time:  0:00:00.718
  
  SmallGroup(16,10)
  Betti Numbers: [ 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66 ]
  Time:  0:00:20.139
  Generators in degrees: [ 1, 1, 1, 2 ]
  Time:  0:01:04.158
  Relators: [ [ z, y, x, w ], [ z^2 ] ]
  Time:  0:06:27.688
  
  SmallGroup(16,11)
  Betti Numbers: [ 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66 ]
  Time:  0:00:20.428
  Generators in degrees: [ 1, 1, 1, 2 ]
  Time:  0:01:04.678
  Relators: [ [ z, y, x, w ], [ z*y ] ]
  Time:  0:06:33.808
  
  SmallGroup(16,12)
  Betti Numbers: [ 1, 3, 5, 6, 7, 9, 11, 12, 13, 15, 17 ]
  Time:  0:00:02.438
  Generators in degrees: [ 1, 1, 1, 4 ]
  Time:  0:00:08.927
  Relators: [ [ z, y, x, w ], [ z^2+z*y+y^2, y^3 ] ]
  Time:  0:00:44.464
  
  SmallGroup(16,13)
  Betti Numbers: [ 1, 3, 5, 6, 7, 9, 11, 12, 13, 15, 17 ]
  Time:  0:00:02.389
  Generators in degrees: [ 1, 1, 1, 4 ]
  Time:  0:00:09.247
  Relators: [ [ z, y, x, w ], [ z*y+x^2, z*x^2+y*x^2, y^2*x^2+x^4 ] ]
  Time:  0:00:44.323
  
  SmallGroup(16,14)
  Betti Numbers: [ 1, 4, 10, 20, 35, 56, 84, 120, 165, 220, 286 ]
  Time:  0:07:00.973
  Generators in degrees: [ 1, 1, 1, 1 ]
  Time:  0:15:40.874
  Relators: [ [ z, y, x, w ], [  ] ]
  Time:  1:54:28.052
  
  Total time:  2:38:14.841
  
\end{Verbatim}
 }

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

\bibliographystyle{plain}
\bibliography{crime}

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


\printindex

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