% 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{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[pdftex=true,
        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,}}
%% were never documented, give conflicts with some additional packages


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

\begin{document}

\logpage{[ 0, 0, 0 ]}
\begin{titlepage}
\begin{center}{\Huge \textbf{ \textsf{HAPprime} \mbox{}}}\\[1cm]
\hypersetup{pdftitle= \textsf{HAPprime} }
\markright{\scriptsize \mbox{}\hfill  \textsf{HAPprime}  \hfill\mbox{}}
{\Large \textbf{ More homological algebra with prime power groups {\nobreakspace} \mbox{}}}\\[1cm]
{Version 0.3\mbox{}}\\[1cm]
{10 December 2008\mbox{}}\\[1cm]
\mbox{}\\[2cm]
{\large \textbf{ Paul Smith\\
    \mbox{}}}\\
\hypersetup{pdfauthor= Paul Smith\\
    }
\end{center}\vfill

\mbox{}\\
{\mbox{}\\
\small \noindent \textbf{ Paul Smith\\
    } --- Email: \href{mailto://paul.smith@nuigalway.ie} {\texttt{paul.smith@nuigalway.ie}}\\
 --- Homepage: \href{http://www.maths.nuigalway.ie/~pas} {\texttt{http://www.maths.nuigalway.ie/\texttt{\symbol{126}}pas}}\\
 --- Address: \begin{minipage}[t]{8cm}\noindent
 Department of Mathematics,\\
 National University of Ireland, Galway\\
 Galway,\\
 Ireland. \end{minipage}
}\\
\end{titlepage}

\newpage\setcounter{page}{2}
{\small 
\section*{Copyright}
\logpage{[ 0, 0, 1 ]}
  {\copyright} 2006-2008 Paul Smith 

 \textsf{HAPprime} is released under the GNU General Public License (GPL). This file is part of \textsf{HAPprime}, though as documentation it is released under the GNU Free Documentation
License (see \href{http://www.gnu.org/licenses/licenses.html#FDL} {\texttt{http://www.gnu.org/licenses/licenses.html\#FDL}}). 

 \textsf{HAPprime} is free software; you can redistribute it and/or modify it under the terms of
the GNU General Public License as published by the Free Software Foundation;
either version 2 of the License, or (at your option) any later version. 

 \textsf{HAPprime} is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details. 

 You should have received a copy of the GNU General Public License along with \textsf{HAPprime}; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite
330, Boston, MA 02111-1307 USA 

 For more details, see \href{http://www.fsf.org/licenses/gpl.html} {\texttt{http://www.fsf.org/licenses/gpl.html}}. 

 \mbox{}}\\[1cm]
{\small 
\section*{Acknowledgements}
\logpage{[ 0, 0, 2 ]}
 \textsf{HAPprime} is supported by a Marie Curie Transfer of Knowledge grant based at the
Department of Mathematics, NUI Galway (MTKD-CT-2006-042685) \mbox{}}\\[1cm]
\newpage

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

\tableofcontents
\newpage

   
\chapter{\textcolor{Chapter }{Introduction}}\logpage{[ 1, 0, 0 ]}
\hyperdef{L}{X7DFB63A97E67C0A1}{}
{
  
\section{\textcolor{Chapter }{Introduction to the \textsf{HAPprime} package}}\logpage{[ 1, 1, 0 ]}
\hyperdef{L}{X7EC1C3E779AE8717}{}
{
  \textsf{HAPprime} is a package for the \textsf{GAP} computer algebra system (\href{http://www.gap-system.org/} {\texttt{http://www.gap-system.org/}}), and which extends the \textsf{HAP} `Homological Algebra Progamming' package written by Graham Ellis (\href{http://hamilton.nuigalway.ie/Hap/www/} {\texttt{http://hamilton.nuigalway.ie/Hap/www/}}). It provides algorithms and data structures for calculating cohomology ring
presentations and resolutions of small prime-power groups. As well as new
functions, \textsf{HAPprime} also provides some equivalents for some existing \textsf{HAP} functions that are much more memory-efficient and occasionally faster. 

 In particular, the main reasons you may want to use \textsf{HAPprime} are 
\begin{itemize}
\item the calculation of resolutions of prime-power groups in \textsf{HAPprime} uses significantly less memory than the equivalent function in \textsf{HAP}, allowing resolutions (and cohomology ring presentations) of larger groups to
be calculated (see Section \ref{ExResolution});
\item \textsf{HAPprime} can compute polynomial ring presentations for cohomology rings calculated
using either \textsf{HAP} or \textsf{HAPprime} (see Section \ref{ExPresentation});
\item we provide a method which ensures that complete and correct cohomology rings
are computed. This is a an implementation of Len Evens' original proof of the
finite presentation of the cohomology rings (see Section \ref{ExPresentationLHS}).
\end{itemize}
 }

 
\section{\textcolor{Chapter }{Required software}}\logpage{[ 1, 2, 0 ]}
\hyperdef{L}{X7D20BAAF862B41E9}{}
{
  The \textsf{HAPprime} package requires \textsf{GAP} version 4.4 or greater and \textsf{HAP} version 1.8.9 or greater. For calculating provably-correct cohomology rings,
the \textsf{Singular} commutative algebra system (\href{http://www.singular.uni-kl.de/} {\texttt{http://www.singular.uni-kl.de/}}) and the \textsf{singular} \textsf{GAP} package are also required. }

 
\section{\textcolor{Chapter }{Installing \textsf{HAPprime}}}\logpage{[ 1, 3, 0 ]}
\hyperdef{L}{X7CFA390D7DE91268}{}
{
  To install the \textsf{HAPprime} Package, unpack the archive file into your \textsf{GAP} packages directory (either usually the \texttt{pkg} directory of your \textsf{GAP} 4 installation if you have access to it, or some local \texttt{pkg} directory that \textsf{GAP} can find). The \textsf{HAPprime} files will all be installed in a subdirectory called \texttt{happrime-0.3}. }

 
\section{\textcolor{Chapter }{Loading and testing \textsf{HAPprime}}}\label{LoadingAndTesting}
\logpage{[ 1, 4, 0 ]}
\hyperdef{L}{X84983C5A84213019}{}
{
  The \textsf{HAPprime} package is not loaded by default when \textsf{GAP} is started. To load the package, type the following at the \textsf{GAP} prompt: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> LoadPackage( "HAPprime");
\end{Verbatim}
 If \textsf{HAPprime} isn't already in memory, it is loaded and the author information is displayed.
If you are a frequent user of \textsf{HAPprime}, you might consider putting this line in your \texttt{.gaprc} file. 

 The correct installation of \textsf{HAPprime} can be tested by using the test routine \texttt{tst/testall.g}: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ReadPackage("HAPprime", "tst/testall.g");
  + HAPprime version 0.3 general tests
  + GAP4stones: 371057
  + HAPprime version 0.3 userguide examples
  + GAP4stones: 387662
  + HAPprime version 0.3 datatypes reference manual examples
  + GAP4stones: 382653
  true
\end{Verbatim}
 The number of \texttt{GAP4stones} will vary depending on your machine, but any additional lines of messages
indicate problems with your installation. 

 The test routine calls a set of test files  (\textbf{Reference: Test Files}) which can be found in the \texttt{tst} directory of the \textsf{HAPprime} installation. All of the routines listed in this user guide are tested, as are
many of those in the datatype reference manual. }

 
\section{\textcolor{Chapter }{Documentation}}\logpage{[ 1, 5, 0 ]}
\hyperdef{L}{X7F4F8D6F7CD6B765}{}
{
  The documentation for \textsf{HAPprime} is in two parts. This document is the user guide, which covers the main
functions provided by \textsf{HAPprime} and examples of their use. There is also a more technical \textsf{HAPprime} datatypes reference manual which gives details of the new \textsf{GAP} datatypes defined and used internally by \textsf{HAPprime}, as well as outlining the algorithms used by the package. 

\subsection{\textcolor{Chapter }{MakeHAPprimeDoc}}
\logpage{[ 1, 5, 1 ]}\nobreak
\hyperdef{L}{X80F4100D783E407A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{MakeHAPprimeDoc({\slshape [manual-name]})\index{MakeHAPprimeDoc@\texttt{MakeHAPprimeDoc}}
\label{MakeHAPprimeDoc}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
 nothing 



 The two manuals supplied with \textsf{HAPprime} - this user guide and the datatypes reference manual - are written using the \textsf{GAPDoc} package and are available in PDF, HTML and text format. It should not be
necessary to rebuild these files, but should you wish to do so then this can
be done using the function \texttt{MakeHAPprimeDoc}. 

 The optional argument \mbox{\texttt{\slshape manual-name}} is a string specifying which manuals to build. It may be one of the following 
\begin{itemize}
\item \texttt{"all"} builds both manuals. This is the default
\item \texttt{"userguide"} builds just the user guide
\item \texttt{"datatypes"} builds just the datatypes reference manual
\item \texttt{"internal"} builds both manuals, including the otherwise undocumented internal functions
\item \texttt{"testexamples"} builds neither manual, but tests all of the examples using \texttt{TestManualExamples} (\textbf{GAPDoc: TestManualExamples})
\end{itemize}
 

 As well as building the manuals, this function at the same time builds \textsf{GAP} test files  (\textbf{Reference: Test Files}) which means that all of the testable examples in the manuals are added to the \textsf{HAPprime} test routines described in Section \ref{LoadingAndTesting}. }

 }

 
\section{\textcolor{Chapter }{Displaying progress and calculation information}}\logpage{[ 1, 6, 0 ]}
\hyperdef{L}{X845E795E8537ABBA}{}
{
  By default, the functions in \textsf{HAPprime} display no output (except for returning the result). The \texttt{InfoHAPprime} info class can be used to enable the printing of progress and calculation
information during processing. Since some computations with \textsf{HAPprime} can take several hours, setting this to a higher level can be particularly
useful for monitoring the progress of computations. 

\subsection{\textcolor{Chapter }{InfoHAPprime}}
\logpage{[ 1, 6, 1 ]}\nobreak
\hyperdef{L}{X80E9D70E843A8C2C}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{InfoHAPprime\index{InfoHAPprime@\texttt{InfoHAPprime}}
\label{InfoHAPprime}
}\hfill{\scriptsize (info class)}}\\


 The \texttt{InfoHAPprime} info class is used throughout the \textsf{HAPprime} package. Use \texttt{SetInfoLevel(InfoHAPprime, }\mbox{\texttt{\slshape level}}\texttt{)} to change the amount of information displayed about the progress of the
computation (see \texttt{SetInfoLevel} (\textbf{Reference: SetInfoLevel}) in the \textsf{GAP} reference manual). The different distinct levels are: 
\begin{itemize}
\item \texttt{0} print nothing (this is the default)
\item \texttt{1} print some information, mainly progress information during computations that
may take some time
\item \texttt{2} print more detailed information, incluing details of internal calculations
\end{itemize}
 }

 }

 }

   
\chapter{\textcolor{Chapter }{Examples}}\label{Examples}
\logpage{[ 2, 0, 0 ]}
\hyperdef{L}{X7A489A5D79DA9E5C}{}
{
  
\section{\textcolor{Chapter }{Computing the mod $p$ group cohomology}}\logpage{[ 2, 1, 0 ]}
\hyperdef{L}{X81FB934A87FCAA22}{}
{
  Let $G$ be a group and $\mathbb{F}$ be a field, and let $\mathbb{F}G$ be the group ring of $G$ over $\mathbb{F}$. A free $\mathbb{F}G$-resolution of the ground ring is an exact sequence of module homomorphisms  
\[ \ldots \rightarrow M_{n+1} \rightarrow M_n \rightarrow M_{n-1} \rightarrow
\ldots \rightarrow M_1 \rightarrow \mathbb{F}G \twoheadrightarrow \mathbb{F} \]
   Where each $M_n$ is a free $\mathbb{F}G$-module and the image of $d_{n+1}: M_{n+1} \rightarrow M_{n}$ equals the kernel of $d_n: M_n \rightarrow M_{n-1}$ for all $n > 0$. The maps $d_n$ are called boundary homomorphisms. In \textsf{HAPprime} we consider the case where $G$ is a $p$-group and $\mathbb{F}$ is the prime field $GF(p)$, and this is assumed from now on. 

 If we now define the Abelian group $D_n$ to be $Hom(M_n, \mathbb{F})$, the set of all homomorphisms $M_n \to \mathbb{F}$, we can obtain the dual of this sequence, which will be a cochain complex of
Abelian group homomorphisms  
\[ \ldots \leftarrow D_{n+1} \leftarrow D_n \leftarrow D_{n-1} \leftarrow \ldots
\leftarrow D_1 \leftarrow \mathbb{F} \leftarrow \mathbb{F} \]
   Each group $D_n$ will be isomorphic to $\mathbb{F}^{|M_n|}$ where $|M_n|$ is the rank of the module $M_n$. Unlike the resolution, this sequence will generally not be exact, but one
can define the mod-$p$ cohomology group of $G$ at degree $n$ to be  
\[ H^n(G, \mathbb{F}) = \frac{ker(D_n \to D_{n+1})}{im(D_{n-1} \to D_n)} \]
   for all $n > 0 $. As with the $D_n$, the mod-$p$ cohomology groups will also be isomorphic to vector spaces over $\mathbb{F}$. In the case where the resolution $R$ is minimal (where each module $M_n$ has the minimal number of generators), the dimensions of the (co)homology
groups $H^n(G, \mathbb{F})$ are identical to the dimensions of the resolution modules $M_n$. The group cohomology (and the similar group homology) is an invariant of $G$, and does not depend on a particular free $\mathbb{F}G$-resolution. 

 In the general case, there are thus two stages to computing the group
cohomology of $G$ up to the $n$th cohomology group: 
\begin{enumerate}
\item Compute $R$, a free $\mathbb{F}G$-resolution for $\mathbb{F}G$, with at least $n+1$ terms.
\item Construct the cochain complex $C$ from $R$ and compute the $n$ homology groups of $C$
\end{enumerate}
 For example, to calculate the 9th mod-$p$ cohomology group of the 134th order 64 in the \textsf{GAP} small groups library (which is the Sylow 2-subgroup of the Mathieu group $M_{12}$), we can use the \textsf{HAPprime} function \texttt{ResolutionPrimePowerGroupRadical} (\ref{ResolutionPrimePowerGroupRadical:for group}) to compute 10 terms of a free $\mathbb{F}G$-resolution for $G$ and then use \textsf{HAP} functions to find the rank $b_9$ of the cohomology group, which will be isomorphic to $\mathbb{F}^{b_9}$. Alternatively, since \texttt{ResolutionPrimePowerGroupRadical} (\ref{ResolutionPrimePowerGroupRadical:for group}) always returns a minimal resolution, the cohomology group dimensions can be
read directly from the resolution.  
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> G := SmallGroup(64, 134);;
  gap> # First construct a FG-resolution for the group G
  gap> R := ResolutionPrimePowerGroupRadical(G, 10);
  Resolution of length 10 in characteristic 2 for <pc group of size 64 with
  6 generators> .
  No contracting homotopy available.
  A partial contracting homotopy is available.
  
  gap> # Convert this into a cochain complex (over the prime field with p=2)
  gap> C := HomToIntegersModP(R, 2);
  Cochain complex of length 10 in characteristic 2 .
  
  gap> # And get the rank of the 9th cohomology group
  gap> b9 := Cohomology(C, 9);
  55
  gap> 
  gap> # Since R is a free resolution, the ranks of the cohomology groups
  gap> # are the same as the module ranks in R
  gap> ResolutionModuleRanks(R);
  [ 3, 6, 10, 15, 21, 28, 36, 45, 55, 66 ]
\end{Verbatim}
 }

  
\section{\textcolor{Chapter }{Computing mod-$p$ cohomology rings and their Poincar{\a'e} series}}\label{ExCohomology}
\logpage{[ 2, 2, 0 ]}
\hyperdef{L}{X78EE4D0386321E3B}{}
{
  The mod-$p$ group cohomology of a $p$-group $G$, given a field $\mathbb{F} = GF(p)$, has a multiplicative structure, and so the group  
\[ H^*(G, \mathbb{F}) = \bigoplus_{i=0}^\infty H^i(G, \mathbb{F}) \]
   is a ring. Since $H^*(G, \mathbb{F})$ is isomorphic to a vector space over $\mathbb{F}$, it is also an algebra, in fact a graded algebra: for elements $e \in H^n(G, \mathbb{F})$ and $f \in H^m(G, \mathbb{F})$, the product $ef$ is an element of $H^{m+n}(G, \mathbb{F})$. 

 Some functions for investigating the ring structure of $H^*(G, \mathbb{F})$ using \textsf{GAP} are already provided by \textsf{HAP}, and also by Marcus Bishop's \textsf{Crime} package \href{http://www.math.uic.edu/~marcus/Crime/} {\texttt{http://www.math.uic.edu/\texttt{\symbol{126}}marcus/Crime/}}. There have also been implementations using other systems, in particular, Jon
Carlson has computed the cohomology rings for all 2-groups of order 64 and
fewer using MAGMA (see \href{http://www.math.uga.edu/~lvalero/cohointro.html} {\texttt{http://www.math.uga.edu/\texttt{\symbol{126}}lvalero/cohointro.html}} for results) and David Green has calculated the same, and some of order 128,
using C (see \href{http://www.math.uni-wuppertal.de/~green/Coho_v2/index.html} {\texttt{http://www.math.uni-wuppertal.de/\texttt{\symbol{126}}green/Coho{\textunderscore}v2/index.html}} for results).  
\subsection{\textcolor{Chapter }{A ring presentation for the mod $p$ cohomology (up to degree $n$)}}\label{ExPresentation}
\logpage{[ 2, 2, 1 ]}
\hyperdef{L}{X81BCBAA18423E1C8}{}
{
  The cohomology ring $H^*(G, \mathbb{F})$ is an infinite vector space, but if all elements of degree higher than some
degree $n$ are ignored, a related finite algebra can be considered. Multiplication in
this finite algebra can be represented by a multiplication table giving the
product of each basis element in the vector space (up to products of degree $n$). The \textsf{HAP} function \texttt{ModPCohomologyRing} (\textbf{HAP: ModPCohomologyRing}) computes such a finite algebra representation for the mod-$p$ cohomology ring of a $p$-group $G$ for a given value of $n$. 

 The full infinite-dimensional cohomology ring has a finite presentation as a
quotient ring  
\[ H^*(G, \mathbb{F}) = \frac{\mathbb{F}[x_1, x_2, \ldots, x_n]}{\langle I_1,
I_2, \ldots, I_m \rangle} \]
   where the polynomial ring indeterminates $x_i$ each have an associated degree $d_i$ and the $I_j$ are relations which together generate an ideal in the ring. Given a finite
algebra $A$, the \textsf{HAPprime} function \texttt{Mod2CohomologyRingPresentation} (\ref{Mod2CohomologyRingPresentation:for algebra}) calculates a presentation for the ring, modulo any generating elements of
degree higher than $n$. If $H^*(G, \mathbb{F})$ has no generators or relations in degrees higher than $n$, then a ring presentation for an algebra computed via \texttt{ModPCohomologyRing} (\textbf{HAP: ModPCohomologyRing}) followed by \texttt{Mod2CohomologyRingPresentation} (\ref{Mod2CohomologyRingPresentation:for algebra}) will be the same as a ring presentation for $H^*(G, \mathbb{F})$. 

 We shall calculate a ring presentation for the group \texttt{G := SmallGroup(16, 3)}:  
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> G := SmallGroup(16, 3);;
  gap> A := ModPCohomologyRing(G, 5);
  <algebra of dimension 34 over GF(2)>
  gap> Mod2CohomologyRingPresentation(A);
  Graded algebra GF(2)[ x_1, x_2, x_3, x_4, x_5 ] /
  [ x_1*x_2, x_1^2, x_1*x_5, x_2^2*x_3+x_5^2 ] with indeterminate degrees
  [ 1, 1, 2, 2, 2 ]
\end{Verbatim}
 The object returned by \texttt{Mod2CohomologyRingPresentation} (\ref{Mod2CohomologyRingPresentation:for algebra}) tells us that  
\[ H^*(G, \mathbb{F}) = \frac{\mathbb{F}[x_1,x_2,x_3,x_4,x_5]} {\langle x_1^2, \;
x_1x_2, \; x_1x_5, \; x_2^2x_3+x_5^2 \rangle} \]
 where the indeterminates $x_1$ and $x_2$   are in degree one and the rest are in degree two. This assumes, however, that
there are no generating elements in any degree higher than five. See Section \ref{ExPresentationLHS} below for a method that also computes the maximum degree necessary to present
the cohomology ring, and so avoids this limitation. 

 As well as taking the algebra as an argument, the function \texttt{Mod2CohomologyRingPresentation} (\ref{Mod2CohomologyRingPresentation:for group}) can also take a group or a free $\mathbb{F}G$-resolution, and a value for $n$, in which case it performs the calculation of the algebra as well. }

  
\subsection{\textcolor{Chapter }{Calculating a provably-correct mod-$p$ cohomology}}\label{ExPresentationLHS}
\logpage{[ 2, 2, 2 ]}
\hyperdef{L}{X825971A27C00C1B6}{}
{
  Using the \textsf{HAP} function \texttt{ModPCohomologyRing} (\textbf{HAP: ModPCohomologyRing}), \textsf{HAPprime} can calculate a presentation for the cohomology ring $H^*(G, \mathbb{F})$ as described in Section \ref{ExPresentation}) It is known (Evens 1961) that mod-$p$ cohomology rings are finitely-generated, and hence given a sufficiently-large $n$ the presentation calculated in the above manner will be the complete ring. \textsf{HAPprime} can compute a sufficient value for $n$ (in fact, it will be near, and usually at, the minimum). \textsf{HAPprime} uses the original Evens proof constructively. For a group $G$, a Lyndon-Hochschild-Serre spectral sequence can be computed. This will
converge, and the limiting sheet of the sequence will be a ring which is an
associated graded ring of the mod-$p$ cohomology ring $H^*(G, \mathbb{F})$. This means that, while it will not necessarily be isomorphic to $H^*(G, \mathbb{F})$, it will have the same additive structure, and the generators and relations
will lie in the same degrees. Thus the maximum degree in the presentation for
the last sheet of the spectral sequence is a sufficient value for $n$. The spectral sequence computation requires minimal resolutions and correct
cohomology rings for two smaller groups (a central subgroup $N$ and the quotient group $G/N$), but these rings can be in turn computed by the same process (and the
cohomology rings for some small groups can simply be stated). The cohomology
ring for $G$ will thus be proved correct by induction. 

 When called with just a group (i.e. no value for $n$), \texttt{Mod2CohomologyRingPresentation} (\ref{Mod2CohomologyRingPresentation:for group}) performs this spectral sequence calculation to find $n$ and then calculates the cohomology ring using this value for $n$. In the example below we use this function, and by setting the value of \texttt{InfoHAPprime} (\ref{InfoHAPprime}) to 1, we can see the details of the spectral sequence calculation.  
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> SetInfoLevel(InfoHAPprime, 1);
  gap> G := SmallGroup(16, 3);;
  gap> A := Mod2CohomologyRingPresentation(G);
  #I  E_2 = GF(2)[ x_1, x_2 ] x GF(2)[ x_3, x_4 ]
  #I    with generator degrees [ 1, 1 ] and [ 1, 1 ] respectively
  #I    d_2(x_1) = zero
  #I    d_2(x_2) = zero
  #I    d_2(x_3) = x_1*x_2
  #I    d_2(x_4) = x_1^2
  #I  E_3 = GF(2)[ x_5, x_6, x_7, x_8, x_9 ]/[ x_6*x_9, x_6^2, x_5*x_6, x_5^2*x_\
  7+x_9^2 ]
  #I  E_3 = GF(2)[ x_2, x_1, x_4^2, x_3^2, x_1*x_3+x_2*x_4 ]/[ x_1^2*x_3+x_1*x_2\
  *x_4, x_1^2, x_1*x_2, x_1^2*x_3^2 ]
  #I    d_3(x_2) = zero
  #I    d_3(x_1) = zero
  #I    d_3(x_4^2) = zero
  #I    d_3(x_3^2) = x_1^2*x_2+x_1*x_2^2 = 0*Z(2)
  #I    d_3(x_1*x_3+x_2*x_4) = zero
  #I  E_4 = GF(2)[ x_10, x_11, x_12, x_13, x_14 ]/[ x_11*x_14, x_11^2, x_10*x_11\
  , x_10^2*x_12+x_14^2 ]
  #I  E_4 = GF(2)[ x_2, x_1, x_4^2, x_3^2, x_1*x_3+x_2*x_4 ]/[ x_1^2*x_3+x_1*x_2\
  *x_4, x_1^2, x_1*x_2, x_1^2*x_3^2 ]
  #I    d_4(x_2) = zero
  #I    d_4(x_1) = zero
  #I    d_4(x_4^2) = zero
  #I    d_4(x_3^2) = zero
  #I    d_4(x_1*x_3+x_2*x_4) = zero
  #I  E_inf = GF(2)[ x_10, x_11, x_12, x_13, x_14 ]/[ x_11*x_14, x_11^2, x_10*x_\
  11, x_10^2*x_12+x_14^2 ]
  #I  E_inf = GF(2)[ x_2, x_1, x_4^2, x_3^2, x_1*x_3+x_2*x_4 ]/[ x_1^2*x_3+x_1*x\
  _2*x_4, x_1^2, x_1*x_2, x_1^2*x_3^2 ]
  #I  Renaming indeterminates and sorting into increasing degree
  Graded algebra GF(2)[ x_1, x_2, x_3, x_4, x_5 ] /
  [ x_1*x_2, x_1^2, x_1*x_5, x_2^2*x_3+x_5^2 ] with indeterminate degrees
  [ 1, 1, 2, 2, 2 ]
  gap> # Now extract data about the presentation
  gap> BaseRing(A);
  GF(2)[x_1,x_2,x_3,x_4,x_5]
  gap> GeneratorsOfPresentationIdeal(A);
  [ x_1*x_2, x_1^2, x_1*x_5, x_2^2*x_3+x_5^2 ]
  gap> IndeterminateDegrees(A);
  [ 1, 1, 2, 2, 2 ]
  gap> MaximumDegreeForPresentation(A);
  4
\end{Verbatim}
 This (the correct cohomology ring) is in fact the same as the presentation
computed in Section \ref{ExPresentation} using $n=5$ since there are no generators or relations of degree greater than four. }

 
\subsection{\textcolor{Chapter }{Computing Poincar{\a'e} series}}\label{ExPoincare}
\logpage{[ 2, 2, 3 ]}
\hyperdef{L}{X78F3639083A7DE62}{}
{
  The Poincar{\a'e} series for the mod-$p$ cohomology ring $H^*(G, \mathbb{F})$ is the infinite series 
\[ a_0 + a_1x + a_2x^2 + a_3x^3 + ... \]
 where $a_k$ is the dimension of the vector space $H^k(G, \mathbb{F})$. The Poincar{\a'e} function is a rational function $P(x)/Q(x)$ which is equal to the Poincar{\a'e} series. 

 The ranks of the modules in a minimal resolution for a group $G$ are identical to the dimensions $a_k$, so a minimal resolution can be used to calculate the Poincar{\a'e} series
without first calculating the cohomology ring. This is the method used by the \textsf{HAP} function \texttt{PoincareSeries} (\textbf{HAP: PoincareSeries}), but will only give the correct answer for a sufficiently-long resolution. \textsf{HAP} has a method for calculating a resolution that is likely to be long enough,
but cannot prove that this is sufficient. 

 \textsf{HAPprime} can instead calculate a provably-correct Poincar{\a'e} series for a mod-$p$ cohomology ring, and without first calculating the ring itself. The final
sheet of a Lyndon-Hochschild-Serre spectral sequence for a group $G$ will be a ring with the same additive structure as the cohomology ring for $G$. This will thus have the same Poincar{\a'e} series, and can be used to
provide the Poincar{\a'e} series for the cohomology ring without having to
also compute the cohomology ring. This is implemented in the \textsf{HAPprime} function \texttt{PoincareSeriesLHS} (\ref{PoincareSeriesLHS}). 

 As well as being provably correct, \texttt{PoincareSeriesLHS} (\ref{PoincareSeriesLHS}) is also often faster than the related \textsf{HAP} function, as demonstrated in this example:  
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> G := SmallGroup(64, 210);;
  gap> # Compute the Poincare series using HAP
  gap> P1 := PoincareSeries(G);time;
  (x_1^4+x_1^2+x_1+1)/(-x_1^7+3*x_1^6-5*x_1^5+7*x_1^4-7*x_1^3+5*x_1^2-3*x_1+1)
  46434
  gap> # Compute the Poincare series using HAPprime
  gap> P2 := PoincareSeriesLHS(G);time;
  (x_1^4+x_1^2+x_1+1)/(-x_1^7+3*x_1^6-5*x_1^5+7*x_1^4-7*x_1^3+5*x_1^2-3*x_1+1)
  1889
  gap> P1 = P2;
  true
\end{Verbatim}
 In this case, \textsf{HAP} needs to compute 14 terms of a resolution for this group of order 64 before it
is confident that it has a stable Poincar{\a'e} series. By contrast \textsf{HAPprime}, in calculating the spectral sequence, needs to compute 5 terms of two
resolutions of groups of order 8 and then construct a (non-minimal) resolution
for $G$ (also of length 5) from these two. Both methods give the same answer, but only \textsf{HAPprime}'s is guaranteed to be correct. }

 }

  
\section{\textcolor{Chapter }{Comparing the memory usage and speed of \textsf{HAPprime} and \textsf{HAP}'s \texttt{ResolutionPrimePowerGroup} functions}}\label{ExResolution}
\logpage{[ 2, 3, 0 ]}
\hyperdef{L}{X87AD96A584D60140}{}
{
  For small $p$-groups, the group ring $\mathbb{F}G$ can be considered as a vector space of rank $|G|$ with the elements of $G$ as its basis elements. Each module $M_n$ in a $\mathbb{F}G$-resolution is also a vector space (of dimension $|M_n||G|$) and the boundary maps $d_n$ can be represented as vector space homomorphisms. As a result, standard linear
algebra techniques can be used to compute a minimal resolution by constructing
a sequence of module homomorphisms where the kernel of one map is the image of
the next, and where the modules have minimal generating sets. See Chapter  (\textbf{HAPprime Datatypes: Resolutions}) in the datatypes manual for further details. 

 As the groups get larger, this approach becomes less feasible due to the
amount of time and memory needed to store and compute the null space of large
matrices. The \textsf{HAP} function \texttt{ResolutionPrimePowerGroup} (\textbf{HAP: ResolutionPrimePowerGroup}) and the \textsf{HAPprime} functions \texttt{ResolutionPrimePowerGroupRadical} (\ref{ResolutionPrimePowerGroupRadical:for group}) and \texttt{ResolutionPrimePowerGroupGF} (\ref{ResolutionPrimePowerGroupGF:for group}) all use this linear algebra approach, but the \textsf{HAPprime} functions are optimised to save memory, allowing the computation of
resolutions which are longer, or are of larger groups, than are possible using \textsf{HAP} alone. 
\subsection{\textcolor{Chapter }{\textsf{HAPprime} takes less memory to store resolutions}}\logpage{[ 2, 3, 1 ]}
\hyperdef{L}{X85FFD31A7B362DFF}{}
{
  Consider computing a resolution of a group of an arbitrary group of order 128, \texttt{G = SmallGroup(128, 844)} using \textsf{HAP}. Computation is performed on a dual-core Intel Core2Duo running at 2.66MHz,
and the memory available to \textsf{GAP} is the standard initial allocation of 256Mb.  
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> G := SmallGroup(128, 844);;
  gap> R := ResolutionPrimePowerGroup(G, 9);
  Resolution of length 9 in characteristic 2 for <pc group of size 128 with
  7 generators> .
  
  gap> time;
  27685
  gap> # Can we construct a resolution of length ten?
  gap> R := ResolutionPrimePowerGroup(G, 10);
  exceeded the permitted memory (`-o' command line option) at
  res := SemiEchelonMatDestructive( List( mat, ShallowCopy ) );
   called from
  SemiEchelonMat( NullspaceMat( BndMat ) ) called from
  ZGbasisOfKernel( i - 1 ) called from
  <function>( <arguments> ) called from read-eval-loop
  Entering break read-eval-print loop ...
  you can 'quit;' to quit to outer loop, or
  you can 'return;' to continue
\end{Verbatim}
 The \textsf{HAPprime} function \texttt{ResolutionPrimePowerGroupRadical} (\ref{ResolutionPrimePowerGroupRadical:for group}) uses an almost identical algorithm, but stores its boundary maps more
efficiently. As a result, with the same memory allowance:  
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> G := SmallGroup(128, 844);;
  gap> R := ResolutionPrimePowerGroupRadical(G, 9);
  Resolution of length 9 in characteristic 2 for <pc group of size 128 with
  7 generators> .
  No contracting homotopy available.
  A partial contracting homotopy is available.
  
  gap> time;
  25321
  gap> # Can we construct a resolution of length ten?
  gap> R := ExtendResolutionPrimePowerGroupRadical(R);;
  gap> # Yes! How about eleven?
  gap> R := ExtendResolutionPrimePowerGroupRadical(R);
  Resolution of length 11 in characteristic 2 for <pc group of size 128 with
  7 generators> .
  No contracting homotopy available.
  A partial contracting homotopy is available.
  
  gap> ResolutionModuleRanks(R);
  [ 3, 6, 11, 19, 30, 44, 62, 85, 113, 146, 185 ]
  gap> 
  gap> # But it will run out of memory if we try to go to twelve terms
  gap> R := ExtendResolutionPrimePowerGroupRadical(R);
  exceeded the permitted memory (`-o' command line option) at
  ...
\end{Verbatim}
 The \textsf{HAPprime} version can compute two further terms of the resolution, which given the sizes
of the additional modules represents a considerable improvement. Just
representing the homomorphism $d_{10}: (\mathbb{F}G)^{146} \to (\mathbb{F}G)^{113}$ as vectors requires nearly as much memory again as representing the first nine
homomorphisms. To compute and store the same resolution of length 11 using \texttt{ResolutionPrimePowerGroup} (\textbf{HAP: ResolutionPrimePowerGroup}) would need a little over three times the memory used here by \textsf{HAPprime}. The time taken by both versions is very similar. 

 In the example above, note also the use of the \textsf{HAPprime} function \texttt{ExtendResolutionPrimePowerGroupRadical} (\ref{ExtendResolutionPrimePowerGroupRadical}), which makes it much easier to add terms to an existing resolution. In
standard \textsf{HAP}, if one decides that a resolution is too short and that more terms are
required, then the entire resolution must be computed again from scratch. }

 
\subsection{\textcolor{Chapter }{\textsf{HAPprime} takes less memory to compute resolutions}}\logpage{[ 2, 3, 2 ]}
\hyperdef{L}{X848CF4C483C3F6E4}{}
{
  The function \texttt{ResolutionPrimePowerGroupGF} (\ref{ResolutionPrimePowerGroupGF:for group}) uses a new algorithm to compute the kernel of $\mathbb{F}G$-module homomorphisms when $\mathbb{F}G$-modules are represented using a set of $G$-generating vectors (see  (\textbf{HAPprime Datatypes: FG-module homomorphisms}) in the datatypes reference manual). This provides a further memory saving over \texttt{ResolutionPrimePowerGroupRadical} (\ref{ResolutionPrimePowerGroupRadical:for group}), although at the cost of a much slower computation time:  
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> G := SmallGroup(128, 844);;
  gap> R := ResolutionPrimePowerGroupGF(G, 9);
  Resolution of length 9 in characteristic 2 for <pc group of size 128 with
  7 generators> .
  No contracting homotopy available.
  A partial contracting homotopy is available.
  
  gap> time;
  422742
  gap> R := ExtendResolutionPrimePowerGroupGF(R);;
  gap> R := ExtendResolutionPrimePowerGroupGF(R);;
  gap> R := ExtendResolutionPrimePowerGroupGF(R);;
  gap> R := ExtendResolutionPrimePowerGroupGF(R);;
  gap> R := ExtendResolutionPrimePowerGroupGF(R);;
  gap> R := ExtendResolutionPrimePowerGroupGF(R);;
  Resolution of length 15 in characteristic 2 for <pc group of size 128 with
  7 generators> .
  No contracting homotopy available.
  A partial contracting homotopy is available.
  
  gap> ResolutionModuleRanks(R);
  [ 3, 6, 11, 19, 30, 44, 62, 85, 113, 146, 185, 231, 284, 344, 412 ]
  gap> # But it will run out of (the inital 256Mb) of memory at sixteen terms
\end{Verbatim}
 Using \texttt{ResolutionPrimePowerGroupGF} (\ref{ResolutionPrimePowerGroupGF:for group}) we can get a further four terms of the resolution. For this resolution, this
represents a memory saving of a factor of five over \texttt{ResolutionPrimePowerGroupRadical} (\ref{ResolutionPrimePowerGroupRadical:for group}) and fifteen over \texttt{ResolutionPrimePowerGroup} (\textbf{HAP: ResolutionPrimePowerGroup}), although it does take fifteen times as long as either of those just to
compute the first nine terms, and scales less well with size. }

 
\subsection{\textcolor{Chapter }{Automatic selection of the best method}}\logpage{[ 2, 3, 3 ]}
\hyperdef{L}{X7CA386948072CFF4}{}
{
  The two functions \texttt{ResolutionPrimePowerGroupRadical} (\ref{ResolutionPrimePowerGroupRadical:for group}) and \texttt{ResolutionPrimePowerGroupGF} (\ref{ResolutionPrimePowerGroupGF:for group}) offer a trade-off between time and memory. The function \texttt{ResolutionPrimePowerGroupAutoMem} (\ref{ResolutionPrimePowerGroupAutoMem:for group}) automates the decision of which version to use, switching from the \texttt{Radical} to the \texttt{GF} version when it estimates that it is about to run out of available memory for
the faster version. In this example, we have also increase the \texttt{InfoHAPprime} (\ref{InfoHAPprime}) info level to display progress information. At level two, the rank of each
module in the resolution is displayed as it is calculated, giving an
indication of progress. With this setting, the user is also notified when the \texttt{AutoMem} function switches, and the \texttt{GF} function displays a rolling estimate of its completion time (which is not
shown since that output is overwritten when completed)  
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> G := SmallGroup(128, 844);;
  gap> SetInfoLevel(InfoHAPprime, 2);
  gap> R := ResolutionPrimePowerGroupAutoMem(G, 15);
  #I  Dimension 2: rank 6
  #I  Dimension 3: rank 11
  #I  Dimension 4: rank 19
  #I  Dimension 5: rank 30
  #I  Dimension 6: rank 44
  #I  Dimension 7: rank 62
  #I  Dimension 8: rank 85
  #I  Dimension 9: rank 113
  #I  Finding kernel of homomorphism by splitting:
  #I   - Finding kernel of U
  #I   - Finding kernel of V
  #I   - Finding intersection of U and V
  #I   - Finding intersection preimages
  #I  Dimension 10: rank 146
  #I  Finding kernel of homomorphism by splitting:
  #I   - Finding kernel of U
  #I   - Finding kernel of V
  #I   - Finding intersection of U and V
  #I   - Finding intersection preimages
  #I  Dimension 11: rank 185
  #I  Finding kernel of homomorphism by splitting:
  #I   - Finding kernel of U
  #I   - Finding kernel of V
  #I   - Finding intersection of U and V
  #I   - Finding intersection preimages
  #I  Dimension 12: rank 231
  #I  Finding kernel of homomorphism by splitting:
  #I   - Finding kernel of U
  #I   - Finding kernel of V
  #I   - Finding intersection of U and V
  #I   - Finding intersection preimages
  #I  Dimension 13: rank 284
  #I  Finding kernel of homomorphism by splitting:
  #I   - Finding kernel of U
  #I   - Finding kernel of V
  #I   - Finding intersection of U and V
  #I   - Finding intersection preimages
  #I  Dimension 14: rank 344
  #I  Finding kernel of homomorphism by splitting:
  #I   - Finding kernel of U
  #I   - Finding kernel of V
  #I   - Finding intersection of U and V
  #I   - Finding intersection preimages
  #I  Dimension 15: rank 412
  Resolution of length 15 in characteristic 2 for <pc group of size 128 with
  7 generators> .
  No contracting homotopy available.
  A partial contracting homotopy is available.
  
  gap> StringTime(time);
  " 5:45:53.613"
\end{Verbatim}
 }

 }

 }

   
\chapter{\textcolor{Chapter }{Functions for Homological Algebra}}\logpage{[ 3, 0, 0 ]}
\hyperdef{L}{X7EE4339B83BFDA2D}{}
{
  
\section{\textcolor{Chapter }{Resolutions}}\logpage{[ 3, 1, 0 ]}
\hyperdef{L}{X7C0B125E7D5415B4}{}
{
  
\subsection{\textcolor{Chapter }{ResolutionPrimePowerGroup}}\label{ResolutionPrimePowerGroup}
\logpage{[ 3, 1, 1 ]}
\hyperdef{L}{X86934BE9858F7199}{}
{
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ResolutionPrimePowerGroupRadical({\slshape G, n})\index{ResolutionPrimePowerGroupRadical@\texttt{ResolutionPrimePowerGroupRadical}!for group}
\label{ResolutionPrimePowerGroupRadical:for group}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ResolutionPrimePowerGroupGF({\slshape G, n})\index{ResolutionPrimePowerGroupGF@\texttt{ResolutionPrimePowerGroupGF}!for group}
\label{ResolutionPrimePowerGroupGF:for group}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ResolutionPrimePowerGroupAutoMem({\slshape G, n})\index{ResolutionPrimePowerGroupAutoMem@\texttt{ResolutionPrimePowerGroupAutoMem}!for group}
\label{ResolutionPrimePowerGroupAutoMem:for group}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ResolutionPrimePowerGroupGF2({\slshape G, n})\index{ResolutionPrimePowerGroupGF2@\texttt{ResolutionPrimePowerGroupGF2}!for group}
\label{ResolutionPrimePowerGroupGF2:for group}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ResolutionPrimePowerGroupRadical({\slshape M, n})\index{ResolutionPrimePowerGroupRadical@\texttt{ResolutionPrimePowerGroupRadical}!for module}
\label{ResolutionPrimePowerGroupRadical:for module}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ResolutionPrimePowerGroupGF({\slshape M, n})\index{ResolutionPrimePowerGroupGF@\texttt{ResolutionPrimePowerGroupGF}!for module}
\label{ResolutionPrimePowerGroupGF:for module}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ResolutionPrimePowerGroupAutoMem({\slshape M, n})\index{ResolutionPrimePowerGroupAutoMem@\texttt{ResolutionPrimePowerGroupAutoMem}!for module}
\label{ResolutionPrimePowerGroupAutoMem:for module}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ResolutionPrimePowerGroupGF2({\slshape M, n})\index{ResolutionPrimePowerGroupGF2@\texttt{ResolutionPrimePowerGroupGF2}!for module}
\label{ResolutionPrimePowerGroupGF2:for module}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
 \texttt{HAPResolution} 



 Returns \mbox{\texttt{\slshape n}} terms of a minimal free $\mathbb{F}G$-resolution for either the ground ring of a prime power group \mbox{\texttt{\slshape G}} or of a module \mbox{\texttt{\slshape M}}. For the module version, \mbox{\texttt{\slshape M}} must be passed as an \texttt{FpGModuleGF} object - see  (\textbf{HAPprime Datatypes: FG-modules}) in the \textsf{HAPprime} datatypes reference manual. 

 Three versions of this function are provided: 
\begin{description}
\item[{\texttt{ResolutionPrimePowerGroupRadical}}] uses the same resolution-building method as the \textsf{HAP} function \texttt{ResolutionPrimePowerGroup} (\textbf{HAP: ResolutionPrimePowerGroup}), but stores the resolution in a different format that takes only about half
the memory of the \textsf{HAP} version.
\item[{\texttt{ResolutionPrimePowerGroupGF}}] calculates the resolution using \textsf{HAPprime}'s $G$-generator form of modules, which reduces memory use by around a factor of two
over \texttt{ResolutionPrimePowerGroupRadical}, but is slower by an order of magnitude.
\item[{\texttt{ResolutionPrimePowerGroupAutoMem}}]  automatically switches between the two previous versions based on the
available memory. It uses the \texttt{Radical} version until it gets close to the limit of the available memory, and then
switches to the \texttt{GF} version.
\item[{\texttt{ResolutionPrimePowerGroupGF2}}] calculates the resolution by $\mathbb{F}G$-matrix partitioning. The amount of partitioning is governed by the  (\textbf{Reference: Options Stack}) option \texttt{MaxFGExpansionSize}. The default value means that until the boundary map takes about 128Mb, the
method is equivalent to \texttt{ResolutionPrimePowerGroupRadical}, and then it tends towards \texttt{ResolutionPrimePowerGroupGF} in terms of time, but saves less memory.
\end{description}
 See the \textsf{HAPprime} datatypes reference manual for details of the different algorithms, in
particular the chapters on the $G$-generator form of $\mathbb{F}G$-modules  (\textbf{HAPprime Datatypes: FG-modules}) and $\mathbb{F}G$-module homomorphisms  (\textbf{HAPprime Datatypes: FG-module homomorphisms}) and on resolutions  (\textbf{HAPprime Datatypes: Resolutions}). }

 
\subsection{\textcolor{Chapter }{ExtendResolutionPrimePowerGroup}}\label{ExtendResolutionPrimePowerGroup}
\logpage{[ 3, 1, 2 ]}
\hyperdef{L}{X7B435C307F28D44F}{}
{
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ExtendResolutionPrimePowerGroupRadical({\slshape R})\index{ExtendResolutionPrimePowerGroupRadical@\texttt{ExtendResolutionPrimePowerGroupRadical}}
\label{ExtendResolutionPrimePowerGroupRadical}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ExtendResolutionPrimePowerGroupGF({\slshape R})\index{ExtendResolutionPrimePowerGroupGF@\texttt{ExtendResolutionPrimePowerGroupGF}}
\label{ExtendResolutionPrimePowerGroupGF}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ExtendResolutionPrimePowerGroupAutoMem({\slshape R})\index{ExtendResolutionPrimePowerGroupAutoMem@\texttt{ExtendResolutionPrimePowerGroupAutoMem}}
\label{ExtendResolutionPrimePowerGroupAutoMem}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ExtendResolutionPrimePowerGroupGF2({\slshape R})\index{ExtendResolutionPrimePowerGroupGF2@\texttt{ExtendResolutionPrimePowerGroupGF2}}
\label{ExtendResolutionPrimePowerGroupGF2}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
 \texttt{HAPResolution} 



 Returns the resolution \mbox{\texttt{\slshape R}} extended by one term. The three variants offer a choice between memory and
speed, and correspond to the different versions of \texttt{ResolutionPrimePowerGroup} in \textsf{HAPprime}. See the documentation (\ref{ResolutionPrimePowerGroup}) for those functions for a description of the different variants. }

 }

 
\section{\textcolor{Chapter }{Poincar{\a'e} Series}}\logpage{[ 3, 2, 0 ]}
\hyperdef{L}{X7FF2605B79D7B5F8}{}
{
  

\subsection{\textcolor{Chapter }{PoincareSeriesLHS}}
\logpage{[ 3, 2, 1 ]}\nobreak
\hyperdef{L}{X7E1A4C8781A02CD0}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{PoincareSeriesLHS({\slshape G})\index{PoincareSeriesLHS@\texttt{PoincareSeriesLHS}}
\label{PoincareSeriesLHS}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
 Rational function 



 For a finite p-group \mbox{\texttt{\slshape G}}, this function calculates and returns a quotient of polynomials $f(x) = P(x)/Q(x)$ (i.e. the Poincar{\a'e} series) whose coefficient of $x^k$ equals the rank of the vector space $H_k(G, \mathbb{F}_p)$ for all $k$ in the range $k=1$ to $k=n$. 

 This function computes a Lyndon-Hoschild-Serre spectral sequence for the $p$-group $G$. The last sheet of this sequence will have the same additive structure as the
mod-$p$ group cohomology ring of $G$, and thus the same Poincar{\a'e} series, which is returned by this function. 

 See Section \ref{ExPoincare} for an example and more description. }

 }

 
\section{\textcolor{Chapter }{Cohomology Ring structure}}\logpage{[ 3, 3, 0 ]}
\hyperdef{L}{X7A9561E47A4994F5}{}
{
  

\subsection{\textcolor{Chapter }{Mod2CohomologyRingPresentation (for group)}}
\logpage{[ 3, 3, 1 ]}\nobreak
\hyperdef{L}{X7D5EE767796B40D9}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Mod2CohomologyRingPresentation({\slshape G})\index{Mod2CohomologyRingPresentation@\texttt{Mod2CohomologyRingPresentation}!for group}
\label{Mod2CohomologyRingPresentation:for group}
}\hfill{\scriptsize (attribute)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Mod2CohomologyRingPresentation({\slshape G, n})\index{Mod2CohomologyRingPresentation@\texttt{Mod2CohomologyRingPresentation}!for group and degree}
\label{Mod2CohomologyRingPresentation:for group and degree}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Mod2CohomologyRingPresentation({\slshape R})\index{Mod2CohomologyRingPresentation@\texttt{Mod2CohomologyRingPresentation}!for resolution}
\label{Mod2CohomologyRingPresentation:for resolution}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Mod2CohomologyRingPresentation({\slshape A})\index{Mod2CohomologyRingPresentation@\texttt{Mod2CohomologyRingPresentation}!for algebra}
\label{Mod2CohomologyRingPresentation:for algebra}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
 \texttt{GradedAlgebraPresentation} 



 Calculates and returns a cohomology ring presentation for the group $G$. See  (\textbf{HAPprime Datatypes: Presentations of graded algebras}) in the datatypes reference manual for details of the \texttt{GradedAlgebraPresentation} type. 

 If the only argument is a $p$-group \mbox{\texttt{\slshape G}} then this function computes and returns the provably-correct cohomology ring
presentation. This version first computes the Lyndon-Hoschild-Serre Spectral
Sequence until convergence to find the additive structure of the cohomology
ring, and then computes the cohomology ring up to and including the maximum
necessary generator or relation, using the \texttt{(G, n)} method described below. For certain groups, the cohomology ring is returned
without computation: the known mod-$p$ cohomology ring presentation for cyclic groups is returned without
calculation, and for groups which can be expressed as a direct product, the
cohomology ring is computed as a tensor product of its direct factors (thus
the cohomology ring of all Abelian groups are also returned with minimal
computation.) 

 When given a $p$-group \mbox{\texttt{\slshape G}} and integer \mbox{\texttt{\slshape n}}, this function computes the presentation modulo all elements of degree
greater \mbox{\texttt{\slshape n}}. Alternatively, a minimal resolution \mbox{\texttt{\slshape R}} (with \mbox{\texttt{\slshape n}} terms) can be input, or a structure constant algebra \mbox{\texttt{\slshape A}} with embedded degrees (from \texttt{ModPCohomologyRing} (\textbf{HAP: ModPCohomologyRing})). 

 See Section \ref{ExPresentation} and \ref{ExPresentationLHS} for examples and more description. See also \texttt{LHSSpectralSequence} (\textbf{HAPprime Datatypes: LHSSpectralSequence}) for details of options that can be used to guide the spectral sequence
computation. }

 }

 }

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


\printindex

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