% 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 0.3}\\[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@epfl.ch}{\texttt{marcus.bishop@epfl.ch}}}\\
\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. 

Thank you also to Laurent Bartholdi for his helpful suggestions regarding the \textsf{GAP} implementation and the user interface. Laurent also tested the program
extensively and uncovered several bugs. }\\[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}, you would do the following. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  
  $ cd /usr/local/gap4r4/pkg
  $ su
  % wget 'http://mad.epfl.ch/~bishop/Crime/crime-0.3.tar.gz'
  % tar xvzvf crime-0.3.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://mad.epfl.ch/~bishop/Crime/crime-0.3.tar.gz'
  $ tar xvzvf crime-0.3.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, k, 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, initially having components the $p$-group $G$, the field $k$ of characteristic $p$, and the \textsf{MeatAxe} $kG$-module $M$. The second invocation creates a cohomology object, initially having
components the $p$-group $G$, the field $\mathbb{F}_p$,  and the trivial \textsf{MeatAxe} $kG$-module. }

 

We emphasize that in the first invocation, \texttt{k} can be any field of characteristic $p$ and that \texttt{M} can be any \textsf{MeatAxe} module over $kG$. However, since the case $k=\mathbb{F}_p$,  and $M=k$ is probabaly the most common, the second invocation is provided for
convenience. 

The cohomology object is used to store, in addition to the group, field, and
module, 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$, the field $k$ of characteristic $p$ and a $kG$-module $M$, the function below computes a minimal projective resolution  
\[ P_n\rightarrow\cdots\rightarrow P_2\rightarrow P_1 \rightarrow P_0\rightarrow
M\rightarrow 0 \]
 where $P_i=\left(kG\right)^{b_i}$   for certain numbers $b_i$, the \emph{Betti numbers} of the resolution. Then the groups  $\mathrm{Ext}^n_{kG}\left(M,N\right)$  are simply  $\mathrm{Hom}_{kG}\left(P_n,N\right)$,  and if $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)^{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 $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 is returned is a $b_n$ -by- $\left|G\right|b_{n-1}$ 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 the generators. }

 The actual cohomology generators are represented by maps $P_n \rightarrow k$ and are stored in \texttt{C} as column vectors. 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 of  $H^\ast\left(G,k\right)$  having multidegree less than or equal to $n$. 

The function returns two lists, the first 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 is a list of polynomials in the variables from the first
list. 

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. 

These two lists should be interpreted as follows. The degree \texttt{n} truncation of the cohomology ring  $H^\ast\left(G,k\right)$  is the polynomial ring in the non-commuting variables from the first list,
having the degrees returned by \texttt{CohomologyGenerators} above, and subject to the relators in the second list. }

 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.$.  }

 
\section{\textcolor{Chapter }{Cohomology Rings}}\label{ring}
\logpage{[ 2, 4, 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, 4, 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).$  The object returned is an 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, 4, 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, 4, 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$  with $A_i$ 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, 4, 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 }{Induced Maps}}\logpage{[ 2, 5, 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, 5, 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, 5, 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, 6, 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, 6, 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:04.209
  Generators in degrees: [ 1, 2 ]
  Time:  0:00:00.037
  Relators: [ [ z, y ], [ z^2 ] ]
  Time:  0:00:00.101
  
  SmallGroup(16,2)
  Betti Numbers: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
  Time:  0:00:03.055
  Generators in degrees: [ 1, 1, 2, 2 ]
  Time:  0:00:09.322
  Relators: [ [ z, y, x, w ], [ z^2, y^2 ] ]
  Time:  0:00:23.386
  
  SmallGroup(16,3)
  Betti Numbers: [ 1, 2, 4, 6, 9, 12, 16, 20, 25, 30, 36 ]
  Time:  0:00:54.653
  Generators in degrees: [ 1, 1, 2, 2, 2 ]
  Time:  0:03:29.691
  Relators: [ [ z, y, x, w, v ], [ z^2, z*y, z*x, y^2*v+x^2 ] ]
  Time:  0:06:33.189
  
  SmallGroup(16,4)
  Betti Numbers: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
  Time:  0:00:03.163
  Generators in degrees: [ 1, 1, 2, 2 ]
  Time:  0:00:09.873
  Relators: [ [ z, y, x, w ], [ z^2, z*y+y^2, y^3 ] ]
  Time:  0:00:25.149
  
  SmallGroup(16,5)
  Betti Numbers: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
  Time:  0:00:03.080
  Generators in degrees: [ 1, 1, 2 ]
  Time:  0:00:07.356
  Relators: [ [ z, y, x ], [ z^2 ] ]
  Time:  0:00:22.859
  
  SmallGroup(16,6)
  Betti Numbers: [ 1, 2, 2, 2, 3, 4, 4, 4, 5, 6, 6 ]
  Time:  0:00:00.674
  Generators in degrees: [ 1, 1, 3, 4 ]
  Time:  0:00:02.575
  Relators: [ [ z, y, x, w ], [ z^2, z*y^2, z*x, x^2 ] ]
  Time:  0:00:03.675
  
  SmallGroup(16,7)
  Betti Numbers: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
  Time:  0:00:03.071
  Generators in degrees: [ 1, 1, 2 ]
  Time:  0:00:07.282
  Relators: [ [ z, y, x ], [ z*y ] ]
  Time:  0:00:22.786
  
  SmallGroup(16,8)
  Betti Numbers: [ 1, 2, 2, 2, 3, 4, 4, 4, 5, 6, 6 ]
  Time:  0:00:00.676
  Generators in degrees: [ 1, 1, 3, 4 ]
  Time:  0:00:02.584
  Relators: [ [ z, y, x, w ], [ z*y, z^3, z*x, y^2*w+x^2 ] ]
  Time:  0:00:03.825
  
  SmallGroup(16,9)
  Betti Numbers: [ 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2 ]
  Time:  0:00:00.087
  Generators in degrees: [ 1, 1, 4 ]
  Time:  0:00:00.139
  Relators: [ [ z, y, x ], [ z*y, z^3+y^3, y^4 ] ]
  Time:  0:00:00.374
  
  SmallGroup(16,10)
  Betti Numbers: [ 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66 ]
  Time:  0:05:37.603
  Generators in degrees: [ 1, 1, 1, 2 ]
  Time:  0:16:52.067
  Relators: [ [ z, y, x, w ], [ z^2 ] ]
  Time:  0:52:54.579
  
  SmallGroup(16,11)
  Betti Numbers: [ 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66 ]
  Time:  0:05:30.506
  Generators in degrees: [ 1, 1, 1, 2 ]
  Time:  0:16:29.940
  Relators: [ [ z, y, x, w ], [ z*y ] ]
  Time:  0:52:04.624
  
  SmallGroup(16,12)
  Betti Numbers: [ 1, 3, 5, 6, 7, 9, 11, 12, 13, 15, 17 ]
  Time:  0:00:10.051
  Generators in degrees: [ 1, 1, 1, 4 ]
  Time:  0:00:43.703
  Relators: [ [ z, y, x, w ], [ z^2+z*y+y^2, y^3 ] ]
  Time:  0:02:02.128
  
  SmallGroup(16,13)
  Betti Numbers: [ 1, 3, 5, 6, 7, 9, 11, 12, 13, 15, 17 ]
  Time:  0:00:09.991
  Generators in degrees: [ 1, 1, 1, 4 ]
  Time:  0:00:43.443
  Relators: [ [ z, y, x, w ], [ z*y+x^2, z*x^2+y*x^2, y^2*x^2+x^4 ] ]
  Time:  0:01:59.953
  
  SmallGroup(16,14)
  Betti Numbers: [ 1, 4, 10, 20, 35, 56, 84, 120, 165, 220, 286 ]
  Time:  5:03:44.290
  Generators in degrees: [ 1, 1, 1, 1 ]
  Time:  8:14:32.187
  
\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}
