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

\usepackage{a4wide}
\sloppy
\pagestyle{myheadings}
\usepackage{amssymb}
\usepackage[utf8]{inputenc}
\usepackage{makeidx}
\makeindex
\usepackage{color}
\definecolor{FireBrick}{rgb}{0.5812,0.0074,0.0083}
\definecolor{RoyalBlue}{rgb}{0.0236,0.0894,0.6179}
\definecolor{RoyalGreen}{rgb}{0.0236,0.6179,0.0894}
\definecolor{RoyalRed}{rgb}{0.6179,0.0236,0.0894}
\definecolor{LightBlue}{rgb}{0.8544,0.9511,1.0000}
\definecolor{Black}{rgb}{0.0,0.0,0.0}

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

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


\usepackage{fancyvrb}

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


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

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

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

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

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

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





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


\begin{document}

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

\begin{center}{\maintitlesize \textbf{\textsf{Modules}\mbox{}}}\\
\vfill

\hypersetup{pdftitle=\textsf{Modules}}
\markright{\scriptsize \mbox{}\hfill \textsf{Modules} \hfill\mbox{}}
{\Huge \textbf{A \textsf{homalg} based Package for the Abelian Category of Finitely Presented Modules over
Computable Rings\mbox{}}}\\
\vfill

{\Huge Version 2015.03.19\mbox{}}\\[1cm]
{March 2015\mbox{}}\\[1cm]
\mbox{}\\[2cm]
{\Large \textbf{Mohamed Barakat\\
    \mbox{}}}\\
{\Large \textbf{Markus Lange-Hegermann\\
    \mbox{}}}\\
\hypersetup{pdfauthor=Mohamed Barakat\\
    ; Markus Lange-Hegermann\\
    }
\mbox{}\\[2cm]
\begin{minipage}{12cm}\noindent
(\emph{this manual is still under construction}) \\
\\
 This manual is best viewed as an \textsc{HTML} document. The latest version is available \textsc{online} at: \\
\\
 \href{http://homalg.math.rwth-aachen.de/~barakat/homalg-project/Modules/chap0.html} {\texttt{http://homalg.math.rwth-aachen.de/\texttt{\symbol{126}}barakat/homalg-project/Modules/chap0.html}} \\
\\
 An \textsc{offline} version should be included in the documentation subfolder of the package. This
package is part of the \textsf{homalg}-project: \\
\\
 \href{http://homalg.math.rwth-aachen.de/index.php/core-packages/modules-package} {\texttt{http://homalg.math.rwth-aachen.de/index.php/core-packages/modules-package}} \end{minipage}

\end{center}\vfill

\mbox{}\\
{\mbox{}\\
\small \noindent \textbf{Mohamed Barakat\\
    }  Email: \href{mailto://barakat@mathematik.uni-kl.de} {\texttt{barakat@mathematik.uni-kl.de}}\\
  Homepage: \href{http://www.mathematik.uni-kl.de/~barakat/} {\texttt{http://www.mathematik.uni-kl.de/\texttt{\symbol{126}}barakat/}}\\
  Address: \begin{minipage}[t]{8cm}\noindent
 Department of Mathematics, \\
 University of Kaiserslautern, \\
 67653 Kaiserslautern, \\
 Germany \end{minipage}
}\\
{\mbox{}\\
\small \noindent \textbf{Markus Lange-Hegermann\\
    }  Email: \href{mailto://markus.lange.hegermann@rwth-aachen.de} {\texttt{markus.lange.hegermann@rwth-aachen.de}}\\
  Homepage: \href{http://wwwb.math.rwth-aachen.de/~markus} {\texttt{http://wwwb.math.rwth-aachen.de/\texttt{\symbol{126}}markus}}\\
  Address: \begin{minipage}[t]{8cm}\noindent
 Lehrstuhl B f{\"u}r Mathematik, RWTH Aachen, Templergraben 64, 52056 Aachen,
Germany \end{minipage}
}\\
\end{titlepage}

\newpage\setcounter{page}{2}
{\small 
\section*{Copyright}
\logpage{[ 0, 0, 1 ]}
 {\copyright} 2007-2015 by Mohamed Barakat and Markus Lange-Hegermann

 This package may be distributed under the terms and conditions of the GNU
Public License Version 2. \mbox{}}\\[1cm]
{\small 
\section*{Acknowledgements}
\logpage{[ 0, 0, 2 ]}
 We are very much indebted to Alban Quadrat. \mbox{}}\\[1cm]
\newpage

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

\tableofcontents
\newpage

 \index{\textsf{Modules}}   
\chapter{\textcolor{Chapter }{Introduction}}\label{intro}
\logpage{[ 1, 0, 0 ]}
\hyperdef{L}{X7DFB63A97E67C0A1}{}
{
  
\section{\textcolor{Chapter }{What is the role of the \textsf{Modules} package in the \textsf{homalg} project?}}\label{Modules-role}
\logpage{[ 1, 1, 0 ]}
\hyperdef{L}{X83B9348878B98FCB}{}
{
  
\subsection{\textcolor{Chapter }{\textsf{Modules} provides ...}}\label{Modules-provides}
\logpage{[ 1, 1, 1 ]}
\hyperdef{L}{X7A734C2E8709258F}{}
{
  It provides procedures to construct basic objects in homological algebra: 
\begin{itemize}
\item modules (generators, relations)
\item submodules (as images of maps)
\item maps
\end{itemize}
 Beside these so-called constructors \textsf{Modules} provides  \emph{operations} to perform computations with these objects. The list of operations includes: 
\begin{itemize}
\item resolution of modules
\item images of maps
\item the functors \texttt{Hom} and \texttt{TensorProduct} (\texttt{Ext} and \texttt{Tor} are then provided by \textsf{homalg})
\item test if a module is torsion-free, reflexive, projective, stably free, free,
pure
\item determine the rank, grade, projective dimension, degree of torsion-freeness,
and codegree of purity of a module
\end{itemize}
 Using the philosophy of \textsf{GAP4}, one or more  methods are  \emph{installed} for each operation, depending on  \emph{properties} and  \emph{attributes} of these objects. These properties and attributes can themselves be computed
by methods installed for this purpose. }

 
\subsection{\textcolor{Chapter }{Rings supported in a sufficient way}}\label{SufficientSupport}
\logpage{[ 1, 1, 2 ]}
\hyperdef{L}{X84913827857A1F7B}{}
{
  Through out this manual the following terminology is used. We say that a
computer algebra system ``sufficiently supports'' a ring $R$, if it contains procedures to effectively solve one-sided inhomogeneous
linear systems $XA=B$ and $AX=B$ with coefficients over $R$ ($\to$ \ref{Modules-limitation}). }

 
\subsection{\textcolor{Chapter }{Principal limitation}}\label{Modules-limitation}
\logpage{[ 1, 1, 3 ]}
\hyperdef{L}{X7C31B1FE786E596E}{}
{
  Note that the solution space of the one-sided finite dimensional system $YA=0$ (resp. $AY=0$) over a left (resp. right) noetherian ring $R$ is a finitely generated left (resp. right) $R$-module, even if $R$ is not commutative. The solution space of the linear system $X_1 A_1 + A_2 X_2 + A_3 X_3 A_4=0$ is in general not an $R$-module, and worse, in general not finitely generated over the center of $R$. \textsf{Modules} can only handle homological problems that lead to \emph{one sided} \emph{finite dimensional} homogeneous or inhomogeneous systems over the underlying ring $R$. Such problems are called problems of \emph{finite type} over $R$. Typically, the computation of \texttt{Hom}$(M,N)$ of two (even) finitely generated modules over a \emph{non}commutative ring $R$ is generally \emph{not} of finite type over $R$, unless at least one of the two modules is an $R$-bimodule. Also note that over a commutative ring any linear system can be
easily brought to a one-sided form. For more details see \cite{BR}. 

 }

 
\subsection{\textcolor{Chapter }{Ring dictionaries (technical)}}\label{Modules-dict}
\logpage{[ 1, 1, 4 ]}
\hyperdef{L}{X8583D47D7E570356}{}
{
  \textsf{Modules} uses the so-called \texttt{homalgTable}, which is stored in the ring, to know how to delegate the necessary matrix
operations. I.e. the \texttt{homalgTable} serves as a small dictionary that enables \textsf{Modules} to speak (as much as needed of) the language of the computer algebra system
which hosts the ring and the matrices. The \textsf{GAP} internal ring of integers is the only ring which \textsf{Modules} endows with a \texttt{homalgTable}. Other packages like \textsf{GaussForHomalg} and \textsf{RingsForHomalg} provide dictionaries for further rings. While \textsf{GaussForHomalg} defines internal rings and matrices, the package \textsf{RingsForHomalg} enables defining external rings and matrices in a wide range of (external)
computer algebra systems (\textsf{Singular}, \textsf{Sage}, \textsf{Macaulay2}, \textsf{MAGMA}, \textsf{Maple}) by providing appropriate dictionaries. 

 Since these dictionaries are all what is needed to handle matrix operations, \textsf{Modules} does not distinguish between handling internal and handling external matrices.
Even the physical communication with the external systems is not at all a
concern of \textsf{Modules}. This is the job of the package \textsf{IO{\textunderscore}ForHomalg}, which is based on the powerful \textsf{IO} package of Max Neunh{\"o}ffer. Furthermore, for all structures beyond matrices
(from relations, generators, and modules, to functors and spectral sequences) \textsf{Modules} no longer distinguishes between internal and external. 

 }

 
\subsection{\textcolor{Chapter }{The advantages of the outsourcing concept}}\label{outsource}
\logpage{[ 1, 1, 5 ]}
\hyperdef{L}{X7D7570837C21607A}{}
{
  Linking different systems to achieve one task is a highly attractive idea,
especially if it helps to avoid reinventing wheels over and over again. This
was essential for \textsf{homalg}, since \textsf{Singular} and \textsf{MAGMA} provide the fastest and most advanced Gr{\"o}bner basis algorithms, while \textsf{GAP4} is by far the most convenient programming language to realize complex
mathematical structures ($\to$ Appendix  (\textbf{homalg: Why GAP4?})). Second, the implementation of the homological constructions is
automatically universal, since it is independent of where the matrices reside
and how the several matrix operations are realized. In particular, \textsf{homalg} will always be able to use the system with the fastest Gr{\"o}bner basis
implementation. In this respect is \textsf{homalg} and all packages that build upon it future proof. }

 
\subsection{\textcolor{Chapter }{Does this mean that \textsf{homalg} has only algorithms for the generic case?}}\label{also-special}
\logpage{[ 1, 1, 6 ]}
\hyperdef{L}{X7C9DE9DF7F37B4EB}{}
{
  No, on the contrary. There are a lot of specialized algorithms installed in \textsf{homalg}. These algorithms are based on properties and attributes that -- thanks to \textsf{GAP4} -- \textsf{homalg} objects can carry ($\to$ Appendix  (\textbf{homalg: GAP4 is a mathematical object-oriented programming language})): Not only can \textsf{homalg} take the special nature of the underlying ring into account, it also deals
with modules, complexes, ... depending on their special properties. Still,
these special algorithms, like all algorithms in \textsf{homalg}, are independent of the computer algebra system which hosts the matrices and
which will perform the several matrix operations. }

 
\subsection{\textcolor{Chapter }{The principle of least communication (technical)}}\label{least-communication}
\logpage{[ 1, 1, 7 ]}
\hyperdef{L}{X79DFCAF17BD3DDC6}{}
{
  Linking different systems can also be highly problematic. The following two
points are often among the major sources of difficulties: 
\begin{itemize}
\item Different systems use different languages:\\
 It takes a huge amount of time and effort to teach systems the dialects of
each others. These dialects are also rarely fixed forever, and might very well
be subject to slight modifications. So the larger the dictionary, the more
difficult is its maintenance.
\item Data has to be transferred from one system to another:\\
 Even if there is a unified data format, transferring data between systems can
lead to performance losses, especially when a big amount of data has to be
transferred.
\end{itemize}
 Solving these two difficulties is an important part of \textsf{Modules}'s design. \textsf{Modules} splits homological computations into two parts. The matrices reside in a
system which provides fast matrix operations (addition, multiplication, bases
and normal form computations), while the higher structures (modules, maps,
complexes, chain morphisms, spectral sequences, functors, ...) with their
properties, attributes, and algorithms live in \textsf{GAP4}, as the system where one can easily create such complex structures and handle
all their logical dependencies. With this split there is no need to transfer
each sort of data outside of its system. The remaining communication between \textsf{GAP4} and the system hosting the matrices gets along with a tiny dictionary.
Moreover, \textsf{GAP4}, as it manages and delegates all computations, also manages the whole data
flow, while the other system does not even recognize that it is part of a
bidirectional communication. 

 The existence of such a clear cut is certainly to some extent due to the
special nature of homological computations. }

 
\subsection{\textcolor{Chapter }{Frequently asked questions}}\label{FAQ}
\logpage{[ 1, 1, 8 ]}
\hyperdef{L}{X7D51BC7A80D43EA0}{}
{
  
\begin{itemize}
\item \textsc{Q}: Does outsourcing the matrices mean that \textsf{Modules} is able to compute spectral sequences, for example, without ever seeing the
matrices involved in the computation?\\
\\
 A: Yes.
\item \textsc{Q}: Can \textsf{Modules} profit from the implementation of homological constructions like \texttt{Hom}, \texttt{Ext}, ... in \textsf{Singular}?\\
\\
 A: No. This is for a lot of reasons incompatible with the  idea and design ($\to$ \ref{intro}) of \textsf{Modules}.
\item \textsc{Q}: Are the external systems involved in the higher algorithms?\\
\\
 A: No. They host all the matrices and do all matrix operations delegated to
them without knowing what for. The meaning of the matrices and their logical
interrelation is only known to \textsf{GAP4}.
\item \textsc{Q}: Do developers of packages building upon \textsf{Modules} need to know anything about the communication with the external systems?\\
\\
 A: No, unless they want to use more features of the external systems than
those reflected by \textsf{Modules}. For this purpose, developers can use the unified communication interface
provideb by \textsf{HomalgToCAS}. This is the interface used by \textsf{Modules}.
\end{itemize}
 }

 }

 
\section{\textcolor{Chapter }{This manual}}\label{overview}
\logpage{[ 1, 2, 0 ]}
\hyperdef{L}{X78DD800B83ABC621}{}
{
  Chapter \ref{install} describes the installation of this package, while Chapter \ref{QuickStart} provides a short quick guide to build your first own example, using the
package \textsf{ExamplesForHomalg}. The remaining chapters are each devoted to one of the \textsf{homalg} objects ($\to$ \ref{Modules-provides}) with its constructors, properties, attributes, and operations.  }

  }

    
\chapter{\textcolor{Chapter }{Installation of the \textsf{Modules} Package}}\label{install}
\logpage{[ 2, 0, 0 ]}
\hyperdef{L}{X7BCE61137B4B7575}{}
{
  To install this package just extract the package's archive file to the \textsf{GAP} \texttt{pkg} directory.

 By default the \textsf{Modules} package is not automatically loaded by \textsf{GAP} when it is installed. You must load the package with \\
\\
 \texttt{LoadPackage}( "Modules" ); \\
\\
 before its functions become available.

 Please, send me an e-mail if you have any questions, remarks, suggestions,
etc. concerning this package. Also, I would be pleased to hear about
applications of this package. \\
\\
\\
 Mohamed Barakat and Markus Lange-Hegermann  }

   
\chapter{\textcolor{Chapter }{Quick Start}}\label{QuickStart}
\logpage{[ 3, 0, 0 ]}
\hyperdef{L}{X7EB860EC84DFC71E}{}
{
  This chapter should give you a quick guide to create your first example in \textsf{homalg}. 
\section{\textcolor{Chapter }{Why are all examples in this manual over {\ensuremath{\mathbb Z}} or ${\ensuremath{\mathbb Z}}/m{\ensuremath{\mathbb Z}}$?}}\label{Why ZZ}
\logpage{[ 3, 1, 0 ]}
\hyperdef{L}{X863CD6AA80705231}{}
{
  As the reader might notice, all examples in this manual will be either over
{\ensuremath{\mathbb Z}} or over one of its residue class rings ${\ensuremath{\mathbb Z}}/m{\ensuremath{\mathbb Z}}$. There are two reasons for this. The first reason is that \textsf{GAP} does not natively support rings other than {\ensuremath{\mathbb Z}} in a \emph{sufficient} way ($\to$ \ref{SufficientSupport}). 

 The second and more important reason is to underline the fact the all
effective homological constructions that are relevant for \textsf{Modules} have only as much to do with the Gr{\"o}bnerbasis algorithm as they do with
the Hermite algorithm for the ring {\ensuremath{\mathbb Z}}; both algorithms
are used to effectively solve inhomogeneous linear systems over the respective
ring. And \textsf{Modules} is designed to use rings and matrices over these rings together with all their
operations as a black box. In other words: Because \textsf{Modules} works for ${\ensuremath{\mathbb Z}}$, it works by its design for all other computable rings.  }

 
\section{\textcolor{Chapter }{\texttt{gap{\textgreater} ExamplesForHomalg();}}}\label{gap> ExamplesForHomalg();}
\logpage{[ 3, 2, 0 ]}
\hyperdef{L}{X84B6C7078148720E}{}
{
  To quickly create a ring for use with \textsf{Modules} enter\\
\\
 \texttt{ExamplesForHomalg();}\\
\\
 which will load the package \textsf{ExamplesForHomalg} (if installed) and provide a step by step guide to create the ring. For the
full core functionality you need to install the packages \textsf{homalg}, \textsf{HomalgToCAS}, \textsf{IO{\textunderscore}ForHomalg}, \textsf{RingsForHomalg}, \textsf{Gauss}, and \textsf{GaussForHomalg}. They are part of the \textsf{homalg} project. }

 
\section{\textcolor{Chapter }{A typical example}}\label{Example}
\logpage{[ 3, 3, 0 ]}
\hyperdef{L}{X7BBB3E988435A713}{}
{
  
\subsection{\textcolor{Chapter }{HomHom}}\label{HomHom}
\logpage{[ 3, 3, 1 ]}
\hyperdef{L}{X791E21F47805048A}{}
{
  The following example is taken from Section 2 of \cite{BREACA}. \\
\\
 The computation takes place over the residue class ring $R={\ensuremath{\mathbb Z}}/2^8{\ensuremath{\mathbb Z}}$ using the generic support for residue class rings provided by the subpackage \textsf{ResidueClassRingForHomalg} of the \textsf{MatricesForHomalg} package. For a native support of the rings $R={\ensuremath{\mathbb Z}}/p^n{\ensuremath{\mathbb Z}}$ use the \textsf{GaussForHomalg} package. 

 Here we compute the (infinite) long exact homology sequence of the covariant
functor $Hom(Hom(-,{\ensuremath{\mathbb Z}}/2^7{\ensuremath{\mathbb
Z}}),{\ensuremath{\mathbb Z}}/2^4{\ensuremath{\mathbb Z}})$ (and its left derived functors) applied to the short exact sequence\\
\\
 $0 \longrightarrow M\_={\ensuremath{\mathbb Z}}/2^2{\ensuremath{\mathbb Z}}
\stackrel{\alpha_1}{\longrightarrow} M={\ensuremath{\mathbb
Z}}/2^5{\ensuremath{\mathbb Z}} \stackrel{\alpha_2}{\longrightarrow}
\_M={\ensuremath{\mathbb Z}}/2^3{\ensuremath{\mathbb Z}} \longrightarrow 0$ . 
\begin{Verbatim}[commandchars=!@F,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>F !gapinput@ZZ := HomalgRingOfIntegers( );F
  Z
  !gapprompt@gap>F !gapinput@Display( ZZ );F
  <An internal ring>
  !gapprompt@gap>F !gapinput@R := ZZ / 2^8;F
  Z/( 256 )
  !gapprompt@gap>F !gapinput@Display( R );F
  <A residue class ring>
  !gapprompt@gap>F !gapinput@M := LeftPresentation( [ 2^5 ], R );F
  <A cyclic left module presented by 1 relation for a cyclic generator>
  !gapprompt@gap>F !gapinput@Display( M );F
  Z/( 256 )/< |[ 32 ]| >
  !gapprompt@gap>F !gapinput@_M := LeftPresentation( [ 2^3 ], R );F
  <A cyclic left module presented by 1 relation for a cyclic generator>
  !gapprompt@gap>F !gapinput@Display( _M );F
  Z/( 256 )/< |[ 8 ]| >
  !gapprompt@gap>F !gapinput@alpha2 := HomalgMap( [ 1 ], M, _M );F
  <A "homomorphism" of left modules>
  !gapprompt@gap>F !gapinput@IsMorphism( alpha2 );F
  true
  !gapprompt@gap>F !gapinput@alpha2;F
  <A homomorphism of left modules>
  !gapprompt@gap>F !gapinput@Display( alpha2 );F
  [ [  1 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  !gapprompt@gap>F !gapinput@M_ := Kernel( alpha2 );F
  <A cyclic left module presented by yet unknown relations for a cyclic generato\
  r>
  !gapprompt@gap>F !gapinput@alpha1 := KernelEmb( alpha2 );F
  <A monomorphism of left modules>
  !gapprompt@gap>F !gapinput@seq := HomalgComplex( alpha2 );F
  <An acyclic complex containing a single morphism of left modules at degrees 
  [ 0 .. 1 ]>
  !gapprompt@gap>F !gapinput@Add( seq, alpha1 );F
  !gapprompt@gap>F !gapinput@seq;F
  <A sequence containing 2 morphisms of left modules at degrees [ 0 .. 2 ]>
  !gapprompt@gap>F !gapinput@IsShortExactSequence( seq );F
  true
  !gapprompt@gap>F !gapinput@seq;F
  <A short exact sequence containing 2 morphisms of left modules at degrees 
  [ 0 .. 2 ]>
  !gapprompt@gap>F !gapinput@Display( seq );F
  -------------------------
  at homology degree: 2
  Z/( 256 )/< |[ 4 ]| > 
  -------------------------
  [ [  24 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  ------------v------------
  at homology degree: 1
  Z/( 256 )/< |[ 32 ]| > 
  -------------------------
  [ [  1 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  ------------v------------
  at homology degree: 0
  Z/( 256 )/< |[ 8 ]| > 
  -------------------------
  !gapprompt@gap>F !gapinput@K := LeftPresentation( [ 2^7 ], R );F
  <A cyclic left module presented by 1 relation for a cyclic generator>
  !gapprompt@gap>F !gapinput@L := RightPresentation( [ 2^4 ], R );F
  <A cyclic right module on a cyclic generator satisfying 1 relation>
  !gapprompt@gap>F !gapinput@triangle := LHomHom( 4, seq, K, L, "t" );F
  <An exact triangle containing 3 morphisms of left complexes at degrees 
  [ 1, 2, 3, 1 ]>
  !gapprompt@gap>F !gapinput@lehs := LongSequence( triangle );F
  <A sequence containing 14 morphisms of left modules at degrees [ 0 .. 14 ]>
  !gapprompt@gap>F !gapinput@ByASmallerPresentation( lehs );F
  <A non-zero sequence containing 14 morphisms of left modules at degrees 
  [ 0 .. 14 ]>
  !gapprompt@gap>F !gapinput@IsExactSequence( lehs );F
  false
  !gapprompt@gap>F !gapinput@lehs;F
  <A non-zero left acyclic complex containing 
  14 morphisms of left modules at degrees [ 0 .. 14 ]>
  !gapprompt@gap>F !gapinput@Assert( 0, IsLeftAcyclic( lehs ) );F
  !gapprompt@gap>F !gapinput@Display( lehs );F
  -------------------------
  at homology degree: 14
  Z/( 256 )/< |[ 4 ]| > 
  -------------------------
  [ [  4 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  ------------v------------
  at homology degree: 13
  Z/( 256 )/< |[ 8 ]| > 
  -------------------------
  [ [  2 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  ------------v------------
  at homology degree: 12
  Z/( 256 )/< |[ 8 ]| >
  -------------------------
  [ [  2 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  ------------v------------
  at homology degree: 11
  Z/( 256 )/< |[ 4 ]| >
  -------------------------
  [ [  4 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  ------------v------------
  at homology degree: 10
  Z/( 256 )/< |[ 8 ]| >
  -------------------------
  [ [  2 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  ------------v------------
  at homology degree: 9
  Z/( 256 )/< |[ 8 ]| >
  -------------------------
  [ [  2 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  ------------v------------
  at homology degree: 8
  Z/( 256 )/< |[ 4 ]| >
  -------------------------
  [ [  4 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  ------------v------------
  at homology degree: 7
  Z/( 256 )/< |[ 8 ]| >
  -------------------------
  [ [  2 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  ------------v------------
  at homology degree: 6
  Z/( 256 )/< |[ 8 ]| >
  -------------------------
  [ [  2 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  ------------v------------
  at homology degree: 5
  Z/( 256 )/< |[ 4 ]| >
  -------------------------
  [ [  4 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  ------------v------------
  at homology degree: 4
  Z/( 256 )/< |[ 8 ]| >
  -------------------------
  [ [  2 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  ------------v------------
  at homology degree: 3
  Z/( 256 )/< |[ 8 ]| >
  -------------------------
  [ [  2 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  ------------v------------
  at homology degree: 2
  Z/( 256 )/< |[ 4 ]| >
  -------------------------
  [ [  8 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  ------------v------------
  at homology degree: 1
  Z/( 256 )/< |[ 16 ]| >
  -------------------------
  [ [  1 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  ------------v------------
  at homology degree: 0
  Z/( 256 )/< |[ 8 ]| >
  -------------------------
\end{Verbatim}
 }

 }

  }

   
\chapter{\textcolor{Chapter }{Ring Maps}}\label{RingMaps}
\logpage{[ 4, 0, 0 ]}
\hyperdef{L}{X7B222197819984A6}{}
{
  
\section{\textcolor{Chapter }{Ring Maps: Attributes}}\label{RingMaps:Attributes}
\logpage{[ 4, 1, 0 ]}
\hyperdef{L}{X7EBF1DD67BD0758F}{}
{
  

\subsection{\textcolor{Chapter }{KernelSubobject (for ring maps)}}
\logpage{[ 4, 1, 1 ]}\nobreak
\hyperdef{L}{X7E7A0DE685E23202}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{KernelSubobject({\mdseries\slshape phi})\index{KernelSubobject@\texttt{KernelSubobject}!for ring maps}
\label{KernelSubobject:for ring maps}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} submodule



 The kernel ideal of the ring map \mbox{\texttt{\mdseries\slshape phi}}. }

 

\subsection{\textcolor{Chapter }{KernelEmb (for ring maps)}}
\logpage{[ 4, 1, 2 ]}\nobreak
\hyperdef{L}{X82AE604486F48FC4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{KernelEmb({\mdseries\slshape phi})\index{KernelEmb@\texttt{KernelEmb}!for ring maps}
\label{KernelEmb:for ring maps}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} map



 The embedding of the kernel ideal \texttt{Kernel}$($\mbox{\texttt{\mdseries\slshape phi}}$)$ into the \texttt{Source}$($\mbox{\texttt{\mdseries\slshape phi}}$)$, both viewed as modules over the ring $R := $\texttt{Source}$($\mbox{\texttt{\mdseries\slshape phi}}$)$ (cf. \texttt{Kernel} (\ref{Kernel:for ring maps})). }

 }

 
\section{\textcolor{Chapter }{Ring Maps: Operations and Functions}}\label{RingMaps:Operations and Functions}
\logpage{[ 4, 2, 0 ]}
\hyperdef{L}{X7C7401BA7E2221CB}{}
{
  

\subsection{\textcolor{Chapter }{Kernel (for ring maps)}}
\logpage{[ 4, 2, 1 ]}\nobreak
\hyperdef{L}{X870F43DE7DDD85A3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Kernel({\mdseries\slshape phi})\index{Kernel@\texttt{Kernel}!for ring maps}
\label{Kernel:for ring maps}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} module



 The kernel ideal of the ring map \mbox{\texttt{\mdseries\slshape phi}} as an abstract module. }

 }

  }

   
\chapter{\textcolor{Chapter }{Relations}}\label{Relations}
\logpage{[ 5, 0, 0 ]}
\hyperdef{L}{X838651287FCCEFD8}{}
{
  A finite presentation of a module is given by a finite set of generators and a
finite set of relations among these generators. In \textsf{homalg} a set of relations of a left/right module is given by a matrix \mbox{\texttt{\mdseries\slshape rel}}, the rows/columns of which are interpreted as relations among $n$ generators, $n$ being the number of columns/rows of the matrix \mbox{\texttt{\mdseries\slshape rel}}. 

 The data structure of a module in \textsf{homalg} is designed to contain not only one but several sets of relations (together
with corresponding sets of generators ($\to$ Chapter \ref{Generators})). The different sets of relations are linked with so-called transition
matrices ($\to$ Chapter \ref{Modules}). 

 The relations of a \textsf{homalg} module are evaluated in a lazy way. This avoids unnecessary computations. 
\section{\textcolor{Chapter }{Relations: Categories and Representations}}\label{Relations:Category}
\logpage{[ 5, 1, 0 ]}
\hyperdef{L}{X87DADB7B7CB126DC}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgRelations}}
\logpage{[ 5, 1, 1 ]}\nobreak
\hyperdef{L}{X80AD050F7999B7C0}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgRelations({\mdseries\slshape rel})\index{IsHomalgRelations@\texttt{IsHomalgRelations}}
\label{IsHomalgRelations}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} relations. }

 

\subsection{\textcolor{Chapter }{IsHomalgRelationsOfLeftModule}}
\logpage{[ 5, 1, 2 ]}\nobreak
\hyperdef{L}{X790F68B17A4846DC}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgRelationsOfLeftModule({\mdseries\slshape rel})\index{IsHomalgRelationsOfLeftModule@\texttt{IsHomalgRelationsOfLeftModule}}
\label{IsHomalgRelationsOfLeftModule}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} relations of a left module. 

 (It is a subcategory of the \textsf{GAP} category \texttt{IsHomalgRelations}.) }

 

\subsection{\textcolor{Chapter }{IsHomalgRelationsOfRightModule}}
\logpage{[ 5, 1, 3 ]}\nobreak
\hyperdef{L}{X7FF5A3B180614698}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgRelationsOfRightModule({\mdseries\slshape rel})\index{IsHomalgRelationsOfRightModule@\texttt{IsHomalgRelationsOfRightModule}}
\label{IsHomalgRelationsOfRightModule}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} relations of a right module. 

 (It is a subcategory of the \textsf{GAP} category \texttt{IsHomalgRelations}.) }

 

\subsection{\textcolor{Chapter }{IsRelationsOfFinitelyPresentedModuleRep}}
\logpage{[ 5, 1, 4 ]}\nobreak
\hyperdef{L}{X8322A26C84E80303}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsRelationsOfFinitelyPresentedModuleRep({\mdseries\slshape rel})\index{IsRelationsOfFinitelyPresentedModuleRep@\texttt{IsRelations}\-\texttt{Of}\-\texttt{Finitely}\-\texttt{Presented}\-\texttt{ModuleRep}}
\label{IsRelationsOfFinitelyPresentedModuleRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} representation of a finite set of relations of a finitely presented \textsf{homalg} module. 

 (It is a representation of the \textsf{GAP} category \texttt{IsHomalgRelations} (\ref{IsHomalgRelations})) }

 }

 
\section{\textcolor{Chapter }{Relations: Constructors}}\label{Relations:Constructors}
\logpage{[ 5, 2, 0 ]}
\hyperdef{L}{X7CF74FB785F90889}{}
{
  }

 
\section{\textcolor{Chapter }{Relations: Properties}}\label{Relations:Properties}
\logpage{[ 5, 3, 0 ]}
\hyperdef{L}{X859231317954D702}{}
{
  

\subsection{\textcolor{Chapter }{CanBeUsedToDecideZeroEffectively}}
\logpage{[ 5, 3, 1 ]}\nobreak
\hyperdef{L}{X798D893B7FBFCF07}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CanBeUsedToDecideZeroEffectively({\mdseries\slshape rel})\index{CanBeUsedToDecideZeroEffectively@\texttt{CanBeUsedToDecideZeroEffectively}}
\label{CanBeUsedToDecideZeroEffectively}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} set of relations \mbox{\texttt{\mdseries\slshape rel}} can be used for normal form reductions. \\
 (no method installed) }

 

\subsection{\textcolor{Chapter }{IsInjectivePresentation}}
\logpage{[ 5, 3, 2 ]}\nobreak
\hyperdef{L}{X7B9398827AEEA2E6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsInjectivePresentation({\mdseries\slshape rel})\index{IsInjectivePresentation@\texttt{IsInjectivePresentation}}
\label{IsInjectivePresentation}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} set of relations \mbox{\texttt{\mdseries\slshape rel}} has zero syzygies. }

 }

 
\section{\textcolor{Chapter }{Relations: Attributes}}\label{Relations:Attributes}
\logpage{[ 5, 4, 0 ]}
\hyperdef{L}{X7EF7BBCA85851EF1}{}
{
  }

 
\section{\textcolor{Chapter }{Relations: Operations and Functions}}\label{Relations:Operations}
\logpage{[ 5, 5, 0 ]}
\hyperdef{L}{X7890B5EA80774AB5}{}
{
  }

  }

   
\chapter{\textcolor{Chapter }{Generators}}\label{Generators}
\logpage{[ 6, 0, 0 ]}
\hyperdef{L}{X7BD5B55C802805B4}{}
{
  To present a left/right module it suffices to take a matrix \mbox{\texttt{\mdseries\slshape rel}} and interpret its rows/columns as relations among $n$ \emph{abstract} generators, where $n$ is the number of columns/rows of \mbox{\texttt{\mdseries\slshape rel}}. Only that these abstract generators are useless when it comes to specific
modules like modules of homomorphisms, where one expects the generators to be
maps between modules. For this reason a presentation of a module in \textsf{homalg} is not merely a matrix of relations, but together with a set of generators. 

 In \textsf{homalg} a set of generators of a left/right module is given by a matrix \mbox{\texttt{\mdseries\slshape gen}} with rows/columns being interpreted as the generators. 

 The data structure of a module in \textsf{homalg} is designed to contain not only one but several sets of generators (together
with their sets of relations ($\to$ Chapter \ref{Relations})). The different sets of generators are linked with so-called transition
matrices ($\to$ Chapter \ref{Modules}). 
\section{\textcolor{Chapter }{Generators: Categories and Representations}}\label{Generators:Category}
\logpage{[ 6, 1, 0 ]}
\hyperdef{L}{X827B67D27E3B91FC}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgGenerators}}
\logpage{[ 6, 1, 1 ]}\nobreak
\hyperdef{L}{X79A6BA1280510584}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgGenerators({\mdseries\slshape rel})\index{IsHomalgGenerators@\texttt{IsHomalgGenerators}}
\label{IsHomalgGenerators}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} generators. }

 

\subsection{\textcolor{Chapter }{IsHomalgGeneratorsOfLeftModule}}
\logpage{[ 6, 1, 2 ]}\nobreak
\hyperdef{L}{X83E88425797FFC9C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgGeneratorsOfLeftModule({\mdseries\slshape rel})\index{IsHomalgGeneratorsOfLeftModule@\texttt{IsHomalgGeneratorsOfLeftModule}}
\label{IsHomalgGeneratorsOfLeftModule}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} generators of a left module. 

 (It is a subcategory of the \textsf{GAP} category \texttt{IsHomalgGenerators}.) }

 

\subsection{\textcolor{Chapter }{IsHomalgGeneratorsOfRightModule}}
\logpage{[ 6, 1, 3 ]}\nobreak
\hyperdef{L}{X86E9029487FE58DF}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgGeneratorsOfRightModule({\mdseries\slshape rel})\index{IsHomalgGeneratorsOfRightModule@\texttt{IsHomalgGeneratorsOfRightModule}}
\label{IsHomalgGeneratorsOfRightModule}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} generators of a right module. 

 (It is a subcategory of the \textsf{GAP} category \texttt{IsHomalgGenerators}.) }

 

\subsection{\textcolor{Chapter }{IsGeneratorsOfModuleRep}}
\logpage{[ 6, 1, 4 ]}\nobreak
\hyperdef{L}{X8671AA997D666F04}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsGeneratorsOfModuleRep({\mdseries\slshape rel})\index{IsGeneratorsOfModuleRep@\texttt{IsGeneratorsOfModuleRep}}
\label{IsGeneratorsOfModuleRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} representation of a finite set of generators of a \textsf{homalg} module. 

 (It is a representation of the \textsf{GAP} category \texttt{IsHomalgGenerators} (\ref{IsHomalgGenerators})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  DeclareRepresentation( "IsGeneratorsOfModuleRep",
          IsHomalgGenerators,
          [ "generators" ] );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsGeneratorsOfFinitelyGeneratedModuleRep}}
\logpage{[ 6, 1, 5 ]}\nobreak
\hyperdef{L}{X78512B8A8613FBF1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsGeneratorsOfFinitelyGeneratedModuleRep({\mdseries\slshape rel})\index{IsGeneratorsOfFinitelyGeneratedModuleRep@\texttt{IsGenerators}\-\texttt{Of}\-\texttt{Finitely}\-\texttt{Generated}\-\texttt{ModuleRep}}
\label{IsGeneratorsOfFinitelyGeneratedModuleRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} representation of a finite set of generators of a finitely generated \textsf{homalg} module. 

 (It is a representation of the \textsf{GAP} representation \texttt{IsGeneratorsOfModuleRep} (\ref{IsGeneratorsOfModuleRep})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  DeclareRepresentation( "IsGeneratorsOfFinitelyGeneratedModuleRep",
          IsGeneratorsOfModuleRep,
          [ "generators", "relations_of_hullmodule" ] );
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Generators: Constructors}}\label{Generators:Constructors}
\logpage{[ 6, 2, 0 ]}
\hyperdef{L}{X8289206C81622597}{}
{
  }

 
\section{\textcolor{Chapter }{Generators: Properties}}\label{Generators:Properties}
\logpage{[ 6, 3, 0 ]}
\hyperdef{L}{X8576E1368448066B}{}
{
  

\subsection{\textcolor{Chapter }{IsReduced (for generators)}}
\logpage{[ 6, 3, 1 ]}\nobreak
\hyperdef{L}{X7ED359D87D6B2F79}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsReduced({\mdseries\slshape gen})\index{IsReduced@\texttt{IsReduced}!for generators}
\label{IsReduced:for generators}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} set of generators \mbox{\texttt{\mdseries\slshape gen}} is marked reduced. \\
 (no method installed) }

 }

 
\section{\textcolor{Chapter }{Generators: Attributes}}\label{Generators:Attributes}
\logpage{[ 6, 4, 0 ]}
\hyperdef{L}{X7E136BCD7F22B571}{}
{
  

\subsection{\textcolor{Chapter }{ProcedureToReadjustGenerators}}
\logpage{[ 6, 4, 1 ]}\nobreak
\hyperdef{L}{X7B6F787085536F90}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ProcedureToReadjustGenerators({\mdseries\slshape gen})\index{ProcedureToReadjustGenerators@\texttt{ProcedureToReadjustGenerators}}
\label{ProcedureToReadjustGenerators}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a function



 A function that takes the rows/columns of \mbox{\texttt{\mdseries\slshape gen}} and returns an object (e.g. a matrix) that can be interpreted as a generator
(this is important for modules of homomorphisms). }

 }

 
\section{\textcolor{Chapter }{Generators: Operations and Functions}}\label{Generators:Operations}
\logpage{[ 6, 5, 0 ]}
\hyperdef{L}{X7AC876EC8137AEA4}{}
{
  }

  }

   
\chapter{\textcolor{Chapter }{Modules}}\label{Modules}
\logpage{[ 7, 0, 0 ]}
\hyperdef{L}{X8183A6857B0C3633}{}
{
  A \textsf{homalg} module is a data structure for a finitely presented module. A presentation is
given by a set of generators and a set of relations among these generators.
The data structure for modules in \textsf{homalg} has two novel features: 
\begin{itemize}
\item  The data structure allows several presentations linked with so-called
transition matrices. One of the presentations is marked as the default
presentation, which is usually the last added one. A new presentation can
always be added provided it is linked to the default presentation by a
transition matrix. If needed, the user can reset the default presentation by
choosing one of the other presentations saved in the data structure of the \textsf{homalg} module. Effectively, a module is then given by ``all'' its presentations (as ``coordinates'') together with isomorphisms between them (as ``coordinate changes''). Being able to ``change coordinates'' makes the realization of a module in \textsf{homalg} \emph{intrinsic} (or ``coordinate free''). 
\item  To present a left/right module it suffices to take a matrix \mbox{\texttt{\mdseries\slshape M}} and interpret its rows/columns as relations among $n$ \emph{abstract} generators, where $n$ is the number of columns/rows of \mbox{\texttt{\mdseries\slshape M}}. Only that these abstract generators are useless when it comes to specific
modules like modules of homomorphisms, where one expects the generators to be
maps between modules. For this reason a presentation of a module in \textsf{homalg} is not merely a matrix of relations, but together with a set of generators. 
\end{itemize}
 
\section{\textcolor{Chapter }{Modules: Category and Representations}}\label{Modules:Category}
\logpage{[ 7, 1, 0 ]}
\hyperdef{L}{X7C7EBD2383B99C43}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgModule}}
\logpage{[ 7, 1, 1 ]}\nobreak
\hyperdef{L}{X8429977B7FD30F32}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgModule({\mdseries\slshape M})\index{IsHomalgModule@\texttt{IsHomalgModule}}
\label{IsHomalgModule}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} modules. 

 (It is a subcategory of the \textsf{GAP} categories \texttt{IsHomalgRingOrModule} and \texttt{IsHomalgStaticObject}.) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  DeclareCategory( "IsHomalgModule",
          IsHomalgRingOrModule and
          IsHomalgModuleOrMap and
          IsHomalgStaticObject );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsFinitelyPresentedModuleOrSubmoduleRep}}
\logpage{[ 7, 1, 2 ]}\nobreak
\hyperdef{L}{X7FB182707ADDF903}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsFinitelyPresentedModuleOrSubmoduleRep({\mdseries\slshape M})\index{IsFinitelyPresentedModuleOrSubmoduleRep@\texttt{IsFinitely}\-\texttt{Presented}\-\texttt{Module}\-\texttt{Or}\-\texttt{SubmoduleRep}}
\label{IsFinitelyPresentedModuleOrSubmoduleRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} representation of finitley presented \textsf{homalg} modules or submodules. 

 (It is a representation of the \textsf{GAP} category \texttt{IsHomalgModule} (\ref{IsHomalgModule}), which is a subrepresentation of the \textsf{GAP} representations \texttt{IsStaticFinitelyPresentedObjectOrSubobjectRep}.) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  DeclareRepresentation( "IsFinitelyPresentedModuleOrSubmoduleRep",
          IsHomalgModule and
          IsStaticFinitelyPresentedObjectOrSubobjectRep,
          [ ] );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsFinitelyPresentedModuleRep}}
\logpage{[ 7, 1, 3 ]}\nobreak
\hyperdef{L}{X87D53DCC822C8C92}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsFinitelyPresentedModuleRep({\mdseries\slshape M})\index{IsFinitelyPresentedModuleRep@\texttt{IsFinitelyPresentedModuleRep}}
\label{IsFinitelyPresentedModuleRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} representation of finitley presented \textsf{homalg} modules. 

 (It is a representation of the \textsf{GAP} category \texttt{IsHomalgModule} (\ref{IsHomalgModule}), which is a subrepresentation of the \textsf{GAP} representations \texttt{IsFinitelyPresentedModuleOrSubmoduleRep}, \texttt{IsStaticFinitelyPresentedObjectRep}, and \texttt{IsHomalgRingOrFinitelyPresentedModuleRep}.) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  DeclareRepresentation( "IsFinitelyPresentedModuleRep",
          IsFinitelyPresentedModuleOrSubmoduleRep and
          IsStaticFinitelyPresentedObjectRep and
          IsHomalgRingOrFinitelyPresentedModuleRep,
          [ "SetsOfGenerators", "SetsOfRelations",
            "PresentationMorphisms",
            "Resolutions",
            "TransitionMatrices",
            "PositionOfTheDefaultPresentation" ] );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsFinitelyPresentedSubmoduleRep}}
\logpage{[ 7, 1, 4 ]}\nobreak
\hyperdef{L}{X7BFA03B6820E9E55}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsFinitelyPresentedSubmoduleRep({\mdseries\slshape M})\index{IsFinitelyPresentedSubmoduleRep@\texttt{IsFinitelyPresentedSubmoduleRep}}
\label{IsFinitelyPresentedSubmoduleRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} representation of finitley generated \textsf{homalg} submodules. 

 (It is a representation of the \textsf{GAP} category \texttt{IsHomalgModule} (\ref{IsHomalgModule}), which is a subrepresentation of the \textsf{GAP} representations \texttt{IsFinitelyPresentedModuleOrSubmoduleRep}, \texttt{IsStaticFinitelyPresentedSubobjectRep}, and \texttt{IsHomalgRingOrFinitelyPresentedModuleRep}.) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  DeclareRepresentation( "IsFinitelyPresentedSubmoduleRep",
          IsFinitelyPresentedModuleOrSubmoduleRep and
          IsStaticFinitelyPresentedSubobjectRep and
          IsHomalgRingOrFinitelyPresentedModuleRep,
          [ "map_having_subobject_as_its_image" ] );
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Modules: Constructors}}\label{Modules:Constructors}
\logpage{[ 7, 2, 0 ]}
\hyperdef{L}{X7DB16C4B87DD115F}{}
{
  

\subsection{\textcolor{Chapter }{LeftPresentation (constructor for left modules)}}
\logpage{[ 7, 2, 1 ]}\nobreak
\hyperdef{L}{X7EC09F6B83CA4068}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftPresentation({\mdseries\slshape mat})\index{LeftPresentation@\texttt{LeftPresentation}!constructor for left modules}
\label{LeftPresentation:constructor for left modules}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} module



 This constructor returns the finitely presented left module with relations
given by the rows of the \textsf{homalg} matrix \mbox{\texttt{\mdseries\slshape mat}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );;|
  !gapprompt@gap>| !gapinput@M := HomalgMatrix( "[ \|
  !gapprompt@>| !gapinput@2, 3, 4, \|
  !gapprompt@>| !gapinput@5, 6, 7  \|
  !gapprompt@>| !gapinput@]", 2, 3, ZZ );|
  <A 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@M := LeftPresentation( M );|
  <A non-torsion left module presented by 2 relations for 3 generators>
  !gapprompt@gap>| !gapinput@Display( M );|
  [ [  2,  3,  4 ],
    [  5,  6,  7 ] ]
  
  Cokernel of the map
  
  Z^(1x2) --> Z^(1x3),
  
  currently represented by the above matrix
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( M );|
  <A rank 1 left module presented by 1 relation for 2 generators>
  !gapprompt@gap>| !gapinput@Display( last );|
  Z/< 3 > + Z^(1 x 1)
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{RightPresentation (constructor for right modules)}}
\logpage{[ 7, 2, 2 ]}\nobreak
\hyperdef{L}{X7A0C400A8042C284}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightPresentation({\mdseries\slshape mat})\index{RightPresentation@\texttt{RightPresentation}!constructor for right modules}
\label{RightPresentation:constructor for right modules}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} module



 This constructor returns the finitely presented right module with relations
given by the columns of the \textsf{homalg} matrix \mbox{\texttt{\mdseries\slshape mat}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );;|
  !gapprompt@gap>| !gapinput@M := HomalgMatrix( "[ \|
  !gapprompt@>| !gapinput@2, 3, 4, \|
  !gapprompt@>| !gapinput@5, 6, 7  \|
  !gapprompt@>| !gapinput@]", 2, 3, ZZ );|
  <A 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@M := RightPresentation( M );|
  <A right module on 2 generators satisfying 3 relations>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( M );|
  <A cyclic torsion right module on a cyclic generator satisfying 1 relation>
  !gapprompt@gap>| !gapinput@Display( last );|
  Z/< 3 >
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgFreeLeftModule (constructor for free left modules)}}
\logpage{[ 7, 2, 3 ]}\nobreak
\hyperdef{L}{X8067510285E38110}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgFreeLeftModule({\mdseries\slshape r, R})\index{HomalgFreeLeftModule@\texttt{HomalgFreeLeftModule}!constructor for free left modules}
\label{HomalgFreeLeftModule:constructor for free left modules}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} module



 This constructor returns a free left module of rank \mbox{\texttt{\mdseries\slshape r}} over the \textsf{homalg} ring \mbox{\texttt{\mdseries\slshape R}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );;|
  !gapprompt@gap>| !gapinput@F := HomalgFreeLeftModule( 1, ZZ );|
  <A free left module of rank 1 on a free generator>
  !gapprompt@gap>| !gapinput@1 * ZZ;|
  <The free left module of rank 1 on a free generator>
  !gapprompt@gap>| !gapinput@F := HomalgFreeLeftModule( 2, ZZ );|
  <A free left module of rank 2 on free generators>
  !gapprompt@gap>| !gapinput@2 * ZZ;|
  <A free left module of rank 2 on free generators>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgFreeRightModule (constructor for free right modules)}}
\logpage{[ 7, 2, 4 ]}\nobreak
\hyperdef{L}{X7D9133C6837FDFE7}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgFreeRightModule({\mdseries\slshape r, R})\index{HomalgFreeRightModule@\texttt{HomalgFreeRightModule}!constructor for free right modules}
\label{HomalgFreeRightModule:constructor for free right modules}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} module



 This constructor returns a free right module of rank \mbox{\texttt{\mdseries\slshape r}} over the \textsf{homalg} ring \mbox{\texttt{\mdseries\slshape R}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );;|
  !gapprompt@gap>| !gapinput@F := HomalgFreeRightModule( 1, ZZ );|
  <A free right module of rank 1 on a free generator>
  !gapprompt@gap>| !gapinput@ZZ * 1;|
  <The free right module of rank 1 on a free generator>
  !gapprompt@gap>| !gapinput@F := HomalgFreeRightModule( 2, ZZ );|
  <A free right module of rank 2 on free generators>
  !gapprompt@gap>| !gapinput@ZZ * 2;|
  <A free right module of rank 2 on free generators>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgZeroLeftModule (constructor for zero left modules)}}
\logpage{[ 7, 2, 5 ]}\nobreak
\hyperdef{L}{X86EA38328275C44E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgZeroLeftModule({\mdseries\slshape r, R})\index{HomalgZeroLeftModule@\texttt{HomalgZeroLeftModule}!constructor for zero left modules}
\label{HomalgZeroLeftModule:constructor for zero left modules}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} module



 This constructor returns a zero left module of rank \mbox{\texttt{\mdseries\slshape r}} over the \textsf{homalg} ring \mbox{\texttt{\mdseries\slshape R}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );;|
  !gapprompt@gap>| !gapinput@F := HomalgZeroLeftModule( ZZ );|
  <A zero left module>
  !gapprompt@gap>| !gapinput@0 * ZZ;|
  <The zero left module>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgZeroRightModule (constructor for zero right modules)}}
\logpage{[ 7, 2, 6 ]}\nobreak
\hyperdef{L}{X8796A5957C40155C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgZeroRightModule({\mdseries\slshape r, R})\index{HomalgZeroRightModule@\texttt{HomalgZeroRightModule}!constructor for zero right modules}
\label{HomalgZeroRightModule:constructor for zero right modules}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} module



 This constructor returns a zero right module of rank \mbox{\texttt{\mdseries\slshape r}} over the \textsf{homalg} ring \mbox{\texttt{\mdseries\slshape R}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );;|
  !gapprompt@gap>| !gapinput@F := HomalgZeroRightModule( ZZ );|
  <A zero right module>
  !gapprompt@gap>| !gapinput@ZZ * 0;|
  <The zero right module>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{\texttt{\symbol{92}}* (transfer a module over a different ring)}}
\logpage{[ 7, 2, 7 ]}\nobreak
\hyperdef{L}{X87BE93798001D733}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{\texttt{\symbol{92}}*({\mdseries\slshape R, M})\index{*@\texttt{\texttt{\symbol{92}}*}!transfer a module over a different ring}
\label{*:transfer a module over a different ring}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{\texttt{\symbol{92}}*({\mdseries\slshape M, R})\index{*@\texttt{\texttt{\symbol{92}}*}!transfer a module over a different ring (right)}
\label{*:transfer a module over a different ring (right)}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} module



 Transfers the $S$-module \mbox{\texttt{\mdseries\slshape M}} over the \textsf{homalg} ring \mbox{\texttt{\mdseries\slshape R}}. This works only in three cases: 
\begin{enumerate}
\item $S$ is a subring of \mbox{\texttt{\mdseries\slshape R}}.
\item \mbox{\texttt{\mdseries\slshape R}} is a residue class ring of $S$ constructed using \texttt{/}.
\item \mbox{\texttt{\mdseries\slshape R}} is a subring of $S$ and the entries of the current matrix of $S$-relations of \mbox{\texttt{\mdseries\slshape M}} lie in \mbox{\texttt{\mdseries\slshape R}}.
\end{enumerate}
 CAUTION: So it is not suited for general base change. 
\begin{Verbatim}[commandchars=!@C,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>C !gapinput@ZZ := HomalgRingOfIntegers( );C
  Z
  !gapprompt@gap>C !gapinput@Display( ZZ );C
  <An internal ring>
  !gapprompt@gap>C !gapinput@Z4 := ZZ / 4;C
  Z/( 4 )
  !gapprompt@gap>C !gapinput@Display( Z4 );C
  <A residue class ring>
  !gapprompt@gap>C !gapinput@M := HomalgDiagonalMatrix( [ 2 .. 4 ], ZZ );C
  <An unevaluated diagonal 3 x 3 matrix over an internal ring>
  !gapprompt@gap>C !gapinput@M := LeftPresentation( M );C
  <A left module presented by 3 relations for 3 generators>
  !gapprompt@gap>C !gapinput@Display( M );C
  Z/< 2 > + Z/< 3 > + Z/< 4 >
  !gapprompt@gap>C !gapinput@M;C
  <A torsion left module presented by 3 relations for 3 generators>
  !gapprompt@gap>C !gapinput@N := Z4 * M; ## or N := M * Z4;C
  <A non-torsion left module presented by 2 relations for 3 generators>
  !gapprompt@gap>C !gapinput@ByASmallerPresentation( N );C
  <A non-torsion left module presented by 1 relation for 2 generators>
  !gapprompt@gap>C !gapinput@Display( N );C
  Z/( 4 )/< |[ 2 ]| > + Z/( 4 )^(1 x 1)
  !gapprompt@gap>C !gapinput@N;C
  <A non-torsion left module presented by 1 relation for 2 generators>
\end{Verbatim}
 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@M := HomalgMatrix( "[ \|
  !gapprompt@>| !gapinput@2, 3, 4, \|
  !gapprompt@>| !gapinput@5, 6, 7  \|
  !gapprompt@>| !gapinput@]", 2, 3, ZZ );|
  <A 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@M := LeftPresentation( M );|
  <A non-torsion left module presented by 2 relations for 3 generators>
  !gapprompt@gap>| !gapinput@Z4 := ZZ / 4;|
  Z/( 4 )
  !gapprompt@gap>| !gapinput@Display( Z4 );|
  <A residue class ring>
  !gapprompt@gap>| !gapinput@M4 := Z4 * M;|
  <A non-torsion left module presented by 2 relations for 3 generators>
  !gapprompt@gap>| !gapinput@Display( M4 );|
  [ [  2,  3,  4 ],
    [  5,  6,  7 ] ]
  
  modulo [ 4 ]
  
  Cokernel of the map
  
  Z/( 4 )^(1x2) --> Z/( 4 )^(1x3),
  
  currently represented by the above matrix
  !gapprompt@gap>| !gapinput@d := Resolution( 2, M4 );|
  <A right acyclic complex containing 2 morphisms of left modules at degrees 
  [ 0 .. 2 ]>
  !gapprompt@gap>| !gapinput@dd := Hom( d, Z4 );|
  <A cocomplex containing 2 morphisms of right modules at degrees [ 0 .. 2 ]>
  !gapprompt@gap>| !gapinput@DD := Resolution( 2, dd );|
  <A cocomplex containing 2 morphisms of right complexes at degrees [ 0 .. 2 ]>
  !gapprompt@gap>| !gapinput@D := Hom( DD, Z4 );|
  <A complex containing 2 morphisms of left cocomplexes at degrees [ 0 .. 2 ]>
  !gapprompt@gap>| !gapinput@C := ZZ * D;|
  <A "complex" containing 2 morphisms of left cocomplexes at degrees [ 0 .. 2 ]>
  !gapprompt@gap>| !gapinput@LowestDegreeObject( C );|
  <A "cocomplex" containing 2 morphisms of left modules at degrees [ 0 .. 2 ]>
  !gapprompt@gap>| !gapinput@Display( last );|
  -------------------------
  at cohomology degree: 2
  0
  ------------^------------
  (an empty 1 x 0 matrix)
  
  the map is currently represented by the above 1 x 0 matrix
  -------------------------
  at cohomology degree: 1
  Z/< 4 > 
  ------------^------------
  [ [  0 ],
    [  1 ],
    [  2 ],
    [  1 ] ]
  
  the map is currently represented by the above 4 x 1 matrix
  -------------------------
  at cohomology degree: 0
  Z/< 4 > + Z/< 4 > + Z/< 4 > + Z/< 4 > 
  -------------------------
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Subobject (constructor for submodules using matrices)}}
\logpage{[ 7, 2, 8 ]}\nobreak
\hyperdef{L}{X84C6C8227814E2BC}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Subobject({\mdseries\slshape mat, M})\index{Subobject@\texttt{Subobject}!constructor for submodules using matrices}
\label{Subobject:constructor for submodules using matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} submodule



 This constructor returns the finitely generated left/right submodule of the \textsf{homalg} module \mbox{\texttt{\mdseries\slshape M}} with generators given by the rows/columns of the \textsf{homalg} matrix \mbox{\texttt{\mdseries\slshape mat}}. }

 

\subsection{\textcolor{Chapter }{Subobject (constructor for submodules using a list of ring elements)}}
\logpage{[ 7, 2, 9 ]}\nobreak
\hyperdef{L}{X811E74A98454101E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Subobject({\mdseries\slshape gens, M})\index{Subobject@\texttt{Subobject}!constructor for submodules using a list of ring elements}
\label{Subobject:constructor for submodules using a list of ring elements}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} submodule



 This constructor returns the finitely generated left/right submodule of the \textsf{homalg} cyclic left/right module \mbox{\texttt{\mdseries\slshape M}} with generators given by the entries of the list \mbox{\texttt{\mdseries\slshape gens}}. }

 

\subsection{\textcolor{Chapter }{LeftSubmodule (constructor for left submodules)}}
\logpage{[ 7, 2, 10 ]}\nobreak
\hyperdef{L}{X8498CB457DD55DF2}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftSubmodule({\mdseries\slshape mat})\index{LeftSubmodule@\texttt{LeftSubmodule}!constructor for left submodules}
\label{LeftSubmodule:constructor for left submodules}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} submodule



 This constructor returns the finitely generated left submodule with generators
given by the rows of the \textsf{homalg} matrix \mbox{\texttt{\mdseries\slshape mat}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( LeftSubmodule,
          "constructor for homalg submodules",
          [ IsHomalgMatrix ],
          
    function( gen )
      local R;
      
      R := HomalgRing( gen );
      
      return Subobject( gen, NrColumns( gen ) * R );
      
  end );
\end{Verbatim}
 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@Z4 := HomalgRingOfIntegers( ) / 4;|
  Z/( 4 )
  !gapprompt@gap>| !gapinput@I := HomalgMatrix( "[ 2 ]", 1, 1, Z4 );|
  <A 1 x 1 matrix over a residue class ring>
  !gapprompt@gap>| !gapinput@I := LeftSubmodule( I );|
  <A principal torsion-free (left) ideal given by a cyclic generator>
  !gapprompt@gap>| !gapinput@IsFree( I );|
  false
  !gapprompt@gap>| !gapinput@I;|
  <A principal reflexive non-projective (left) ideal given by a cyclic generator\
  >
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{RightSubmodule (constructor for right submodules)}}
\logpage{[ 7, 2, 11 ]}\nobreak
\hyperdef{L}{X8383318085374771}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightSubmodule({\mdseries\slshape mat})\index{RightSubmodule@\texttt{RightSubmodule}!constructor for right submodules}
\label{RightSubmodule:constructor for right submodules}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} submodule



 This constructor returns the finitely generated right submodule with
generators given by the columns of the \textsf{homalg} matrix \mbox{\texttt{\mdseries\slshape mat}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( RightSubmodule,
          "constructor for homalg submodules",
          [ IsHomalgMatrix ],
          
    function( gen )
      local R;
      
      R := HomalgRing( gen );
      
      return Subobject( gen, R * NrRows( gen ) );
      
  end );
\end{Verbatim}
 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@Z4 := HomalgRingOfIntegers( ) / 4;|
  Z/( 4 )
  !gapprompt@gap>| !gapinput@I := HomalgMatrix( "[ 2 ]", 1, 1, Z4 );|
  <A 1 x 1 matrix over a residue class ring>
  !gapprompt@gap>| !gapinput@I := RightSubmodule( I );|
  <A principal torsion-free (right) ideal given by a cyclic generator>
  !gapprompt@gap>| !gapinput@IsFree( I );|
  false
  !gapprompt@gap>| !gapinput@I;|
  <A principal reflexive non-projective (right) ideal given by a cyclic generato\
  r>
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Modules: Properties}}\label{Modules:Properties}
\logpage{[ 7, 3, 0 ]}
\hyperdef{L}{X83CC1D6079AA2286}{}
{
  

\subsection{\textcolor{Chapter }{IsCyclic}}
\logpage{[ 7, 3, 1 ]}\nobreak
\hyperdef{L}{X7DA27D338374FD28}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsCyclic({\mdseries\slshape M})\index{IsCyclic@\texttt{IsCyclic}}
\label{IsCyclic}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} module \mbox{\texttt{\mdseries\slshape M}} is cyclic. }

 

\subsection{\textcolor{Chapter }{IsHolonomic}}
\logpage{[ 7, 3, 2 ]}\nobreak
\hyperdef{L}{X7B547E8A7969F772}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHolonomic({\mdseries\slshape M})\index{IsHolonomic@\texttt{IsHolonomic}}
\label{IsHolonomic}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} module \mbox{\texttt{\mdseries\slshape M}} is holonomic. }

 

\subsection{\textcolor{Chapter }{IsReduced (for modules)}}
\logpage{[ 7, 3, 3 ]}\nobreak
\hyperdef{L}{X8393BC5779647A88}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsReduced({\mdseries\slshape M})\index{IsReduced@\texttt{IsReduced}!for modules}
\label{IsReduced:for modules}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} module \mbox{\texttt{\mdseries\slshape M}} is reduced. }

 

\subsection{\textcolor{Chapter }{IsPrimeIdeal}}
\logpage{[ 7, 3, 4 ]}\nobreak
\hyperdef{L}{X78020A71848F9FDD}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsPrimeIdeal({\mdseries\slshape J})\index{IsPrimeIdeal@\texttt{IsPrimeIdeal}}
\label{IsPrimeIdeal}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} submodule \mbox{\texttt{\mdseries\slshape J}} is a prime ideal. The ring has to be commutative. \\
 (no method installed) }

 

\subsection{\textcolor{Chapter }{IsPrimeModule (for modules)}}
\logpage{[ 7, 3, 5 ]}\nobreak
\hyperdef{L}{X86160C4E797D12DD}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsPrimeModule({\mdseries\slshape M})\index{IsPrimeModule@\texttt{IsPrimeModule}!for modules}
\label{IsPrimeModule:for modules}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} module \mbox{\texttt{\mdseries\slshape M}} is prime. }

 For more properties see the corresponding section  (\textbf{homalg: Objects: Properties})) in the documentation of the \textsf{homalg} package. }

 
\section{\textcolor{Chapter }{Modules: Attributes}}\label{Modules:Attributes}
\logpage{[ 7, 4, 0 ]}
\hyperdef{L}{X78A9979B862BD51D}{}
{
  

\subsection{\textcolor{Chapter }{ResidueClassRing}}
\logpage{[ 7, 4, 1 ]}\nobreak
\hyperdef{L}{X791F809B8432847F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ResidueClassRing({\mdseries\slshape J})\index{ResidueClassRing@\texttt{ResidueClassRing}}
\label{ResidueClassRing}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring



 In case \mbox{\texttt{\mdseries\slshape J}} was defined as a (left/right) ideal of the ring $R$ the residue class ring $R/$\mbox{\texttt{\mdseries\slshape J}} is returned. }

 

\subsection{\textcolor{Chapter }{PrimaryDecomposition}}
\logpage{[ 7, 4, 2 ]}\nobreak
\hyperdef{L}{X7F30DD127FAC8994}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PrimaryDecomposition({\mdseries\slshape J})\index{PrimaryDecomposition@\texttt{PrimaryDecomposition}}
\label{PrimaryDecomposition}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list



 The primary decomposition of the ideal \mbox{\texttt{\mdseries\slshape J}}. The ring has to be commutative. \\
 (no method installed) }

 

\subsection{\textcolor{Chapter }{RadicalDecomposition}}
\logpage{[ 7, 4, 3 ]}\nobreak
\hyperdef{L}{X839DA707838F72DC}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RadicalDecomposition({\mdseries\slshape J})\index{RadicalDecomposition@\texttt{RadicalDecomposition}}
\label{RadicalDecomposition}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list



 The prime decomposition of the radical of the ideal \mbox{\texttt{\mdseries\slshape J}}. The ring has to be commutative. \\
 (no method installed) }

 

\subsection{\textcolor{Chapter }{ModuleOfKaehlerDifferentials}}
\logpage{[ 7, 4, 4 ]}\nobreak
\hyperdef{L}{X7D1D919186E5E73A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ModuleOfKaehlerDifferentials({\mdseries\slshape R})\index{ModuleOfKaehlerDifferentials@\texttt{ModuleOfKaehlerDifferentials}}
\label{ModuleOfKaehlerDifferentials}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} module



 The module of Kaehler differentials of the (residue class ring) \mbox{\texttt{\mdseries\slshape R}}. \\
 (method installed in package \textsf{GradedModules}) }

 

\subsection{\textcolor{Chapter }{RadicalSubobject}}
\logpage{[ 7, 4, 5 ]}\nobreak
\hyperdef{L}{X7F4B638C7D27C7B2}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RadicalSubobject({\mdseries\slshape M})\index{RadicalSubobject@\texttt{RadicalSubobject}}
\label{RadicalSubobject}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
a function



 \mbox{\texttt{\mdseries\slshape M}} is a \textsf{homalg} module. }

 

\subsection{\textcolor{Chapter }{SymmetricAlgebra}}
\logpage{[ 7, 4, 6 ]}\nobreak
\hyperdef{L}{X829AFC557B7E49AF}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SymmetricAlgebra({\mdseries\slshape M})\index{SymmetricAlgebra@\texttt{SymmetricAlgebra}}
\label{SymmetricAlgebra}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring



 The symmetric algebra of the module \mbox{\texttt{\mdseries\slshape M}}. }

 

\subsection{\textcolor{Chapter }{ExteriorAlgebra}}
\logpage{[ 7, 4, 7 ]}\nobreak
\hyperdef{L}{X7AC2D54385C15EBD}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ExteriorAlgebra({\mdseries\slshape M})\index{ExteriorAlgebra@\texttt{ExteriorAlgebra}}
\label{ExteriorAlgebra}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring



 The exterior algebra of the module \mbox{\texttt{\mdseries\slshape M}}. }

  

\subsection{\textcolor{Chapter }{ElementaryDivisors}}
\logpage{[ 7, 4, 8 ]}\nobreak
\hyperdef{L}{X7EB20A71864D46BF}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ElementaryDivisors({\mdseries\slshape M})\index{ElementaryDivisors@\texttt{ElementaryDivisors}}
\label{ElementaryDivisors}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list of ring elements



 The list of elementary divisors of the \textsf{homalg} module \mbox{\texttt{\mdseries\slshape M}}, in case they exist. \\
 (no method installed) }

 

\subsection{\textcolor{Chapter }{FittingIdeal}}
\logpage{[ 7, 4, 9 ]}\nobreak
\hyperdef{L}{X7B83CC6485B028E1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{FittingIdeal({\mdseries\slshape M})\index{FittingIdeal@\texttt{FittingIdeal}}
\label{FittingIdeal}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list



 The Fitting ideal of \mbox{\texttt{\mdseries\slshape M}}. }

 

\subsection{\textcolor{Chapter }{NonFlatLocus}}
\logpage{[ 7, 4, 10 ]}\nobreak
\hyperdef{L}{X8671FA1F820AA86D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NonFlatLocus({\mdseries\slshape M})\index{NonFlatLocus@\texttt{NonFlatLocus}}
\label{NonFlatLocus}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list



 The non flat locus of \mbox{\texttt{\mdseries\slshape M}}. }

 

\subsection{\textcolor{Chapter }{LargestMinimalNumberOfLocalGenerators}}
\logpage{[ 7, 4, 11 ]}\nobreak
\hyperdef{L}{X84FECA07854053BE}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LargestMinimalNumberOfLocalGenerators({\mdseries\slshape M})\index{LargestMinimalNumberOfLocalGenerators@\texttt{Largest}\-\texttt{Minimal}\-\texttt{Number}\-\texttt{Of}\-\texttt{Local}\-\texttt{Generators}}
\label{LargestMinimalNumberOfLocalGenerators}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a nonnegative integer



 The minimal number of \emph{local} generators of the module \mbox{\texttt{\mdseries\slshape M}}. }

 

\subsection{\textcolor{Chapter }{CoefficientsOfUnreducedNumeratorOfHilbertPoincareSeries}}
\logpage{[ 7, 4, 12 ]}\nobreak
\hyperdef{L}{X7809E0507E882674}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CoefficientsOfUnreducedNumeratorOfHilbertPoincareSeries({\mdseries\slshape M})\index{CoefficientsOfUnreducedNumeratorOfHilbertPoincareSeries@\texttt{Coefficients}\-\texttt{Of}\-\texttt{Unreduced}\-\texttt{Numerator}\-\texttt{Of}\-\texttt{Hilbert}\-\texttt{Poincare}\-\texttt{Series}}
\label{CoefficientsOfUnreducedNumeratorOfHilbertPoincareSeries}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list of integers



 \mbox{\texttt{\mdseries\slshape M}} is a \textsf{homalg} module. }

 

\subsection{\textcolor{Chapter }{CoefficientsOfNumeratorOfHilbertPoincareSeries}}
\logpage{[ 7, 4, 13 ]}\nobreak
\hyperdef{L}{X7938E13A7EF4ADB1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CoefficientsOfNumeratorOfHilbertPoincareSeries({\mdseries\slshape M})\index{CoefficientsOfNumeratorOfHilbertPoincareSeries@\texttt{Coefficients}\-\texttt{Of}\-\texttt{Numerator}\-\texttt{Of}\-\texttt{Hilbert}\-\texttt{Poincare}\-\texttt{Series}}
\label{CoefficientsOfNumeratorOfHilbertPoincareSeries}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list of integers



 \mbox{\texttt{\mdseries\slshape M}} is a \textsf{homalg} module. }

 

\subsection{\textcolor{Chapter }{UnreducedNumeratorOfHilbertPoincareSeries}}
\logpage{[ 7, 4, 14 ]}\nobreak
\hyperdef{L}{X781E2CDB8743B1C6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{UnreducedNumeratorOfHilbertPoincareSeries({\mdseries\slshape M})\index{UnreducedNumeratorOfHilbertPoincareSeries@\texttt{Unreduced}\-\texttt{Numerator}\-\texttt{Of}\-\texttt{Hilbert}\-\texttt{Poincare}\-\texttt{Series}}
\label{UnreducedNumeratorOfHilbertPoincareSeries}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a univariate polynomial with rational coefficients



 \mbox{\texttt{\mdseries\slshape M}} is a \textsf{homalg} module. }

 

\subsection{\textcolor{Chapter }{NumeratorOfHilbertPoincareSeries}}
\logpage{[ 7, 4, 15 ]}\nobreak
\hyperdef{L}{X7C44039382DD5D91}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NumeratorOfHilbertPoincareSeries({\mdseries\slshape M})\index{NumeratorOfHilbertPoincareSeries@\texttt{NumeratorOfHilbertPoincareSeries}}
\label{NumeratorOfHilbertPoincareSeries}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a univariate polynomial with rational coefficients



 \mbox{\texttt{\mdseries\slshape M}} is a \textsf{homalg} module. }

 

\subsection{\textcolor{Chapter }{HilbertPoincareSeries}}
\logpage{[ 7, 4, 16 ]}\nobreak
\hyperdef{L}{X7B93B7D082A50E61}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HilbertPoincareSeries({\mdseries\slshape M})\index{HilbertPoincareSeries@\texttt{HilbertPoincareSeries}}
\label{HilbertPoincareSeries}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a univariate rational function with rational coefficients



 \mbox{\texttt{\mdseries\slshape M}} is a \textsf{homalg} module. }

 

\subsection{\textcolor{Chapter }{AffineDegree}}
\logpage{[ 7, 4, 17 ]}\nobreak
\hyperdef{L}{X87C428A079000336}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AffineDegree({\mdseries\slshape M})\index{AffineDegree@\texttt{AffineDegree}}
\label{AffineDegree}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a nonnegative integer



 \mbox{\texttt{\mdseries\slshape M}} is a \textsf{homalg} module. }

 

\subsection{\textcolor{Chapter }{DataOfHilbertFunction}}
\logpage{[ 7, 4, 18 ]}\nobreak
\hyperdef{L}{X7F8203B47EF626A5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DataOfHilbertFunction({\mdseries\slshape M})\index{DataOfHilbertFunction@\texttt{DataOfHilbertFunction}}
\label{DataOfHilbertFunction}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
a function



 \mbox{\texttt{\mdseries\slshape M}} is a \textsf{homalg} module. }

 

\subsection{\textcolor{Chapter }{HilbertFunction}}
\logpage{[ 7, 4, 19 ]}\nobreak
\hyperdef{L}{X81F1F3EB868D2117}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HilbertFunction({\mdseries\slshape M})\index{HilbertFunction@\texttt{HilbertFunction}}
\label{HilbertFunction}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
a function



 \mbox{\texttt{\mdseries\slshape M}} is a \textsf{homalg} module. }

 

\subsection{\textcolor{Chapter }{IndexOfRegularity}}
\logpage{[ 7, 4, 20 ]}\nobreak
\hyperdef{L}{X7AE7FCEA807D189E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IndexOfRegularity({\mdseries\slshape M})\index{IndexOfRegularity@\texttt{IndexOfRegularity}}
\label{IndexOfRegularity}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
a function



 \mbox{\texttt{\mdseries\slshape M}} is a \textsf{homalg} module. }

 For more attributes see the corresponding section  (\textbf{homalg: Objects: Attributes})) in the documentation of the \textsf{homalg} package. }

 
\section{\textcolor{Chapter }{Modules: Operations and Functions}}\label{Modules:Operations}
\logpage{[ 7, 5, 0 ]}
\hyperdef{L}{X7DDA6B237C17BDBA}{}
{
  

\subsection{\textcolor{Chapter }{HomalgRing (for modules)}}
\logpage{[ 7, 5, 1 ]}\nobreak
\hyperdef{L}{X7DDA4A357F4868A0}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgRing({\mdseries\slshape M})\index{HomalgRing@\texttt{HomalgRing}!for modules}
\label{HomalgRing:for modules}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring



 The \textsf{homalg} ring of the \textsf{homalg} module \mbox{\texttt{\mdseries\slshape M}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@M := ZZ * 4;|
  <A free right module of rank 4 on free generators>
  !gapprompt@gap>| !gapinput@R := HomalgRing( M );|
  Z
  !gapprompt@gap>| !gapinput@IsIdenticalObj( R, ZZ );|
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{ByASmallerPresentation (for modules)}}
\logpage{[ 7, 5, 2 ]}\nobreak
\hyperdef{L}{X840D0B4F8798C370}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ByASmallerPresentation({\mdseries\slshape M})\index{ByASmallerPresentation@\texttt{ByASmallerPresentation}!for modules}
\label{ByASmallerPresentation:for modules}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} module



 Use different strategies to reduce the presentation of the given \textsf{homalg} module \mbox{\texttt{\mdseries\slshape M}}. This method performs side effects on its argument \mbox{\texttt{\mdseries\slshape M}} and returns it. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );;|
  !gapprompt@gap>| !gapinput@M := HomalgMatrix( "[ \|
  !gapprompt@>| !gapinput@2, 3, 4, \|
  !gapprompt@>| !gapinput@5, 6, 7  \|
  !gapprompt@>| !gapinput@]", 2, 3, ZZ );|
  <A 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@M := LeftPresentation( M );|
  <A non-torsion left module presented by 2 relations for 3 generators>
  !gapprompt@gap>| !gapinput@Display( M );|
  [ [  2,  3,  4 ],
    [  5,  6,  7 ] ]
  
  Cokernel of the map
  
  Z^(1x2) --> Z^(1x3),
  
  currently represented by the above matrix
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( M );|
  <A rank 1 left module presented by 1 relation for 2 generators>
  !gapprompt@gap>| !gapinput@Display( last );|
  Z/< 3 > + Z^(1 x 1)
  !gapprompt@gap>| !gapinput@SetsOfGenerators( M );|
  <A set containing 2 sets of generators of a homalg module>
  !gapprompt@gap>| !gapinput@SetsOfRelations( M );|
  <A set containing 2 sets of relations of a homalg module>
  !gapprompt@gap>| !gapinput@M;|
  <A rank 1 left module presented by 1 relation for 2 generators>
  !gapprompt@gap>| !gapinput@SetPositionOfTheDefaultPresentation( M, 1 );|
  !gapprompt@gap>| !gapinput@M;|
  <A rank 1 left module presented by 2 relations for 3 generators>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{\texttt{\symbol{92}}* (constructor for ideal multiples)}}
\logpage{[ 7, 5, 3 ]}\nobreak
\hyperdef{L}{X7AE6575D81856ECB}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{\texttt{\symbol{92}}*({\mdseries\slshape J, M})\index{*@\texttt{\texttt{\symbol{92}}*}!constructor for ideal multiples}
\label{*:constructor for ideal multiples}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} submodule



 Compute the submodule \mbox{\texttt{\mdseries\slshape J}}\mbox{\texttt{\mdseries\slshape M}} (resp. \mbox{\texttt{\mdseries\slshape M}}\mbox{\texttt{\mdseries\slshape J}}) of the given left (resp. right) $R$-module \mbox{\texttt{\mdseries\slshape M}}, where \mbox{\texttt{\mdseries\slshape J}} is a left (resp. right) ideal in $R$. }

 

\subsection{\textcolor{Chapter }{SubobjectQuotient (for submodules)}}
\logpage{[ 7, 5, 4 ]}\nobreak
\hyperdef{L}{X84D89101872CEA2A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SubobjectQuotient({\mdseries\slshape K, J})\index{SubobjectQuotient@\texttt{SubobjectQuotient}!for submodules}
\label{SubobjectQuotient:for submodules}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ideal



 Compute the submodule quotient ideal $\mbox{\texttt{\mdseries\slshape K}}:\mbox{\texttt{\mdseries\slshape J}}$ of the submodules \mbox{\texttt{\mdseries\slshape K}} and \mbox{\texttt{\mdseries\slshape J}} of a common $R$-module $M$. }

 }

  }

   
\chapter{\textcolor{Chapter }{Maps}}\label{Maps}
\logpage{[ 8, 0, 0 ]}
\hyperdef{L}{X7E8438F77ECB778E}{}
{
  A \textsf{homalg} map is a data structures for maps (module homomorphisms) between finitely
generated modules. Each map in \textsf{homalg} knows its source ($\to$ \texttt{Source} (\textbf{homalg: Source})) and its target ($\to$ \texttt{Range} (\textbf{homalg: Range})). A map is represented by a \textsf{homalg} matrix relative to the current set of generators of the source resp. target \textsf{homalg} module. As with modules ($\to$ Chapter \ref{Modules}), maps in \textsf{homalg} are realized in an intrinsic manner: If the presentations of the source or/and
target module are altered after the map was constructed, a new adapted
representation matrix of the map is automatically computed whenever needed.
For this the internal transition matrices of the modules are used. \textsf{homalg} uses the so-called \emph{associative} convention for maps. This means that maps of left modules are applied from the
right, whereas maps of right modules from the left. 
\section{\textcolor{Chapter }{Maps: Categories and Representations}}\label{Maps:Category}
\logpage{[ 8, 1, 0 ]}
\hyperdef{L}{X790FEEBD86F5C143}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgMap}}
\logpage{[ 8, 1, 1 ]}\nobreak
\hyperdef{L}{X7DA293237F14CD74}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgMap({\mdseries\slshape phi})\index{IsHomalgMap@\texttt{IsHomalgMap}}
\label{IsHomalgMap}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} maps. 

 (It is a subcategory of the \textsf{GAP} categories \texttt{IsHomalgModuleOrMap} and \texttt{IsHomalgStaticMorphism}.) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  DeclareCategory( "IsHomalgMap",
          IsHomalgModuleOrMap and
          IsHomalgStaticMorphism );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsHomalgSelfMap}}
\logpage{[ 8, 1, 2 ]}\nobreak
\hyperdef{L}{X7F34D26882D20FF0}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgSelfMap({\mdseries\slshape phi})\index{IsHomalgSelfMap@\texttt{IsHomalgSelfMap}}
\label{IsHomalgSelfMap}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} self-maps. 

 (It is a subcategory of the \textsf{GAP} categories \texttt{IsHomalgMap} and \texttt{IsHomalgEndomorphism}.) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  DeclareCategory( "IsHomalgSelfMap",
          IsHomalgMap and
          IsHomalgEndomorphism );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsMapOfFinitelyGeneratedModulesRep}}
\logpage{[ 8, 1, 3 ]}\nobreak
\hyperdef{L}{X813202447B5C8FB3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsMapOfFinitelyGeneratedModulesRep({\mdseries\slshape phi})\index{IsMapOfFinitelyGeneratedModulesRep@\texttt{IsMapOfFinitelyGeneratedModulesRep}}
\label{IsMapOfFinitelyGeneratedModulesRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} representation of maps between finitley generated \textsf{homalg} modules. 

 (It is a representation of the \textsf{GAP} category \texttt{IsHomalgChainMorphism} (\textbf{homalg: IsHomalgChainMorphism}), which is a subrepresentation of the \textsf{GAP} representation \texttt{IsStaticMorphismOfFinitelyGeneratedObjectsRep}.) }

 }

 
\section{\textcolor{Chapter }{Maps: Constructors}}\label{Maps:Constructors}
\logpage{[ 8, 2, 0 ]}
\hyperdef{L}{X8278F43E8373E4A1}{}
{
  

\subsection{\textcolor{Chapter }{HomalgMap (constructor for maps)}}
\logpage{[ 8, 2, 1 ]}\nobreak
\hyperdef{L}{X790E02137DBA584C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgMap({\mdseries\slshape mat, M, N})\index{HomalgMap@\texttt{HomalgMap}!constructor for maps}
\label{HomalgMap:constructor for maps}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgMap({\mdseries\slshape mat[, string]})\index{HomalgMap@\texttt{HomalgMap}!constructor for maps between free modules}
\label{HomalgMap:constructor for maps between free modules}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} map



 This constructor returns a map (homomorphism) of finitely presented modules.
It is represented by the \textsf{homalg} matrix \mbox{\texttt{\mdseries\slshape mat}} relative to the current set of generators of the source \textsf{homalg} module \mbox{\texttt{\mdseries\slshape M}} and target module \mbox{\texttt{\mdseries\slshape N}} ($\to$ \ref{Modules:Constructors}). Unless the source module is free \emph{and} given on free generators the returned map will cautiously be indicated using
parenthesis: ``homomorphism''. To verify if the result is indeed a well defined map use \texttt{IsMorphism} (\textbf{homalg: IsMorphism}). If the presentations of the source or/and target module are altered after
the map was constructed, a new adapted representation matrix of the map is
automatically computed whenever needed. For this the internal transition
matrices of the modules are used. If source and target are identical objects,
and only then, the map is created as a selfmap (endomorphism). \textsf{homalg} uses the so-called \emph{associative} convention for maps. This means that maps of left modules are applied from the
right, whereas maps of right modules from the left. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );;|
  !gapprompt@gap>| !gapinput@M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );|
  <A 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@M := LeftPresentation( M );|
  <A non-torsion left module presented by 2 relations for 3 generators>
  !gapprompt@gap>| !gapinput@N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );|
  <A 2 x 4 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@N := LeftPresentation( N );|
  <A non-torsion left module presented by 2 relations for 4 generators>
  !gapprompt@gap>| !gapinput@mat := HomalgMatrix( "[ \|
  !gapprompt@>| !gapinput@1, 0, -2, -4, \|
  !gapprompt@>| !gapinput@0, 1,  4,  7, \|
  !gapprompt@>| !gapinput@1, 0, -2, -4  \|
  !gapprompt@>| !gapinput@]", 3, 4, ZZ );|
  <A 3 x 4 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@phi := HomalgMap( mat, M, N );|
  <A "homomorphism" of left modules>
  !gapprompt@gap>| !gapinput@IsMorphism( phi );|
  true
  !gapprompt@gap>| !gapinput@phi;|
  <A homomorphism of left modules>
  !gapprompt@gap>| !gapinput@Display( phi );|
  [ [   1,   0,  -2,  -4 ],
    [   0,   1,   4,   7 ],
    [   1,   0,  -2,  -4 ] ]
  
  the map is currently represented by the above 3 x 4 matrix
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( M );|
  <A rank 1 left module presented by 1 relation for 2 generators>
  !gapprompt@gap>| !gapinput@Display( last );|
  Z/< 3 > + Z^(1 x 1)
  !gapprompt@gap>| !gapinput@Display( phi );|
  [ [   2,   1,   0,  -1 ],
    [   1,   0,  -2,  -4 ] ]
  
  the map is currently represented by the above 2 x 4 matrix
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( N );|
  <A rank 2 left module presented by 1 relation for 3 generators>
  !gapprompt@gap>| !gapinput@Display( N );|
  Z/< 4 > + Z^(1 x 2)
  !gapprompt@gap>| !gapinput@Display( phi );|
  [ [  -8,   0,   0 ],
    [  -3,  -1,  -2 ] ]
  
  the map is currently represented by the above 2 x 3 matrix
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( phi );|
  <A non-zero homomorphism of left modules>
  !gapprompt@gap>| !gapinput@Display( phi );|
  [ [   0,   0,   0 ],
    [   1,  -1,  -2 ] ]
  
  the map is currently represented by the above 2 x 3 matrix
\end{Verbatim}
 To construct a map with source being a not yet specified free module 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@N;|
  <A rank 2 left module presented by 1 relation for 3 generators>
  !gapprompt@gap>| !gapinput@SetPositionOfTheDefaultSetOfGenerators( N, 1 );|
  !gapprompt@gap>| !gapinput@N;|
  <A rank 2 left module presented by 2 relations for 4 generators>
  !gapprompt@gap>| !gapinput@psi := HomalgMap( mat, "free", N );|
  <A homomorphism of left modules>
  !gapprompt@gap>| !gapinput@Source( psi );|
  <A free left module of rank 3 on free generators>
\end{Verbatim}
 To construct a map between not yet specified free left modules 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@chi := HomalgMap( mat );	## or chi := HomalgMap( mat, "l" );|
  <A homomorphism of left modules>
  !gapprompt@gap>| !gapinput@Source( chi );|
  <A free left module of rank 3 on free generators>
  !gapprompt@gap>| !gapinput@Range( chi );|
  <A free left module of rank 4 on free generators>
\end{Verbatim}
 To construct a map between not yet specified free right modules 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@kappa := HomalgMap( mat, "r" );|
  <A homomorphism of right modules>
  !gapprompt@gap>| !gapinput@Source( kappa );|
  <A free right module of rank 4 on free generators>
  !gapprompt@gap>| !gapinput@Range( kappa );|
  <A free right module of rank 3 on free generators>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgZeroMap (constructor for zero maps)}}
\logpage{[ 8, 2, 2 ]}\nobreak
\hyperdef{L}{X81489DAF7B0674F3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgZeroMap({\mdseries\slshape M, N})\index{HomalgZeroMap@\texttt{HomalgZeroMap}!constructor for zero maps}
\label{HomalgZeroMap:constructor for zero maps}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} map



 The constructor returns the zero map between the source \textsf{homalg} module \mbox{\texttt{\mdseries\slshape M}} and the target \textsf{homalg} module \mbox{\texttt{\mdseries\slshape N}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );;|
  !gapprompt@gap>| !gapinput@M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );|
  <A 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@M := LeftPresentation( M );|
  <A non-torsion left module presented by 2 relations for 3 generators>
  !gapprompt@gap>| !gapinput@N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );|
  <A 2 x 4 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@N := LeftPresentation( N );|
  <A non-torsion left module presented by 2 relations for 4 generators>
  !gapprompt@gap>| !gapinput@HomalgZeroMap( M, N );|
  <The zero morphism of left modules>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgIdentityMap (constructor for identity maps)}}
\logpage{[ 8, 2, 3 ]}\nobreak
\hyperdef{L}{X7BF289B882C9DDF4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgIdentityMap({\mdseries\slshape M, N})\index{HomalgIdentityMap@\texttt{HomalgIdentityMap}!constructor for identity maps}
\label{HomalgIdentityMap:constructor for identity maps}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} map



 The constructor returns the identity map of the \textsf{homalg} module \mbox{\texttt{\mdseries\slshape M}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );;|
  !gapprompt@gap>| !gapinput@M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );|
  <A 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@M := LeftPresentation( M );|
  <A non-torsion left module presented by 2 relations for 3 generators>
  !gapprompt@gap>| !gapinput@HomalgIdentityMap( M );|
  <The identity morphism of a non-zero left module>
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Maps: Properties}}\label{Maps:Properties}
\logpage{[ 8, 3, 0 ]}
\hyperdef{L}{X85C633E77A939735}{}
{
  }

 
\section{\textcolor{Chapter }{Maps: Attributes}}\label{Maps:Attributes}
\logpage{[ 8, 4, 0 ]}
\hyperdef{L}{X7EA3B91C78E430BB}{}
{
  }

 
\section{\textcolor{Chapter }{Maps: Operations and Functions}}\label{Maps:Operations and Functions}
\logpage{[ 8, 5, 0 ]}
\hyperdef{L}{X783E9FF8800609EB}{}
{
  

\subsection{\textcolor{Chapter }{HomalgRing}}
\logpage{[ 8, 5, 1 ]}\nobreak
\hyperdef{L}{X7C8699B282D73E1E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgRing({\mdseries\slshape phi})\index{HomalgRing@\texttt{HomalgRing}}
\label{HomalgRing}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring



 The \textsf{homalg} ring of the \textsf{homalg} map \mbox{\texttt{\mdseries\slshape phi}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@phi := HomalgIdentityMap( 2 * ZZ );|
  <The identity morphism of a non-zero left module>
  !gapprompt@gap>| !gapinput@R := HomalgRing( phi );|
  Z
  !gapprompt@gap>| !gapinput@IsIdenticalObj( R, ZZ );|
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{PreInverse}}
\logpage{[ 8, 5, 2 ]}\nobreak
\hyperdef{L}{X79D029B78624C148}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PreInverse({\mdseries\slshape phi})\index{PreInverse@\texttt{PreInverse}}
\label{PreInverse}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} map, \texttt{false}, or \texttt{fail}



 Compute a pre-inverse of the morphism \mbox{\texttt{\mdseries\slshape phi}} in case one exists. For a pre-inverse to exist \mbox{\texttt{\mdseries\slshape phi}} must be an epimorphism. For \emph{commutative} rings \textsf{homalg} has an algorithm installed which decides the existence and returns a
pre-inverse in case one exists. If a pre-inverse does not exist then \texttt{false} is returned. The algorithm finds a particular solution of a two-side
inhomogeneous linear system over $R := $\texttt{HomalgRing}$( \mbox{\texttt{\mdseries\slshape phi}} )$. For \emph{non}commutative rings a heuristic method is installed. If it finds a pre-inverse
it returns it, otherwise it returns \texttt{fail} ($\to$ \ref{Modules-limitation}). The operation \texttt{PreInverse} is used to install a method for the property \texttt{IsSplitEpimorphism} (\textbf{homalg: IsSplitEpimorphism}). 

 \texttt{PreInverse} checks if it can decide the projectivity of \texttt{Range}$( \mbox{\texttt{\mdseries\slshape phi}} )$. }

 }

  }

   
\chapter{\textcolor{Chapter }{Module Elements}}\label{ModuleElements}
\logpage{[ 9, 0, 0 ]}
\hyperdef{L}{X7E9BCB99816348F2}{}
{
  An element of a module $M$ is internally represented by a module map from the (distinguished) rank 1 free
module to the module $M$. In particular, the data structure for module elements automatically profits
from the intrinsic realization of morphisms in the \textsf{homalg} project. 
\section{\textcolor{Chapter }{Module Elements: Category and Representations}}\label{ModuleElements:Category}
\logpage{[ 9, 1, 0 ]}
\hyperdef{L}{X84A51EB87E054D3F}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgElement}}
\logpage{[ 9, 1, 1 ]}\nobreak
\hyperdef{L}{X784BBB2A782DB774}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgElement({\mdseries\slshape M})\index{IsHomalgElement@\texttt{IsHomalgElement}}
\label{IsHomalgElement}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of module elements. }

 

\subsection{\textcolor{Chapter }{IsElementOfAModuleGivenByAMorphismRep}}
\logpage{[ 9, 1, 2 ]}\nobreak
\hyperdef{L}{X7BF482C77B68ED64}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsElementOfAModuleGivenByAMorphismRep({\mdseries\slshape M})\index{IsElementOfAModuleGivenByAMorphismRep@\texttt{IsElement}\-\texttt{Of}\-\texttt{A}\-\texttt{Module}\-\texttt{Given}\-\texttt{By}\-\texttt{A}\-\texttt{MorphismRep}}
\label{IsElementOfAModuleGivenByAMorphismRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} representation of elements of modules. 

 (It is a subrepresentation of \texttt{IsElementOfAnObjectGivenByAMorphismRep} (\textbf{homalg: IsElementOfAnObjectGivenByAMorphismRep}).) }

 }

 
\section{\textcolor{Chapter }{Module Elements: Constructors}}\label{ModuleElements:Constructors}
\logpage{[ 9, 2, 0 ]}
\hyperdef{L}{X7CFD0CF27A3FEB9D}{}
{
  }

 
\section{\textcolor{Chapter }{Module Elements: Properties}}\label{ModuleElements:Properties}
\logpage{[ 9, 3, 0 ]}
\hyperdef{L}{X7BCBA7E780FE2B14}{}
{
  

\subsection{\textcolor{Chapter }{IsElementOfIntegers}}
\logpage{[ 9, 3, 1 ]}\nobreak
\hyperdef{L}{X87FA282579406FC0}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsElementOfIntegers({\mdseries\slshape m})\index{IsElementOfIntegers@\texttt{IsElementOfIntegers}}
\label{IsElementOfIntegers}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \mbox{\texttt{\mdseries\slshape m}} is an element of the integers viewed as a module over itself. 
\begin{Verbatim}[commandchars=!@A,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>A !gapinput@ZZ := HomalgRingOfIntegers( );A
  Z
  !gapprompt@gap>A !gapinput@a := HomalgElement( HomalgMap( "[[2]]", 1 * ZZ, 1 * ZZ ) );A
  2
  !gapprompt@gap>A !gapinput@IsElementOfIntegers( a );A
  true
  !gapprompt@gap>A !gapinput@Z4 := ZZ / 4;A
  Z/( 4 )
  !gapprompt@gap>A !gapinput@b := HomalgElement( HomalgMap( "[[-1]]", 1 * Z4, 1 * Z4 ) );A
  |[ 3 ]|
  !gapprompt@gap>A !gapinput@IsElementOfIntegers( b );A
  false
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Module Elements: Attributes}}\label{ModuleElements:Attributes}
\logpage{[ 9, 4, 0 ]}
\hyperdef{L}{X80AE2D1C82A2059C}{}
{
   }

 
\section{\textcolor{Chapter }{Module Elements: Operations and Functions}}\label{ModuleElements:Operations}
\logpage{[ 9, 5, 0 ]}
\hyperdef{L}{X813DF977812C06B6}{}
{
  

\subsection{\textcolor{Chapter }{HomalgRing (for module elements)}}
\logpage{[ 9, 5, 1 ]}\nobreak
\hyperdef{L}{X8769077379997D89}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgRing({\mdseries\slshape m})\index{HomalgRing@\texttt{HomalgRing}!for module elements}
\label{HomalgRing:for module elements}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring



 The \textsf{homalg} ring of the \textsf{homalg} module element \mbox{\texttt{\mdseries\slshape m}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@a := HomalgElement( HomalgMap( "[[2]]", 1 * ZZ, 1 * ZZ ) );|
  2
  !gapprompt@gap>| !gapinput@IsIdenticalObj( ZZ, HomalgRing( a ) );|
  true
\end{Verbatim}
 }

 }

  }

   
\chapter{\textcolor{Chapter }{Functors}}\label{Functors}
\logpage{[ 10, 0, 0 ]}
\hyperdef{L}{X78D1062D78BE08C1}{}
{
  
\section{\textcolor{Chapter }{Functors: Category and Representations}}\label{Functors:Category}
\logpage{[ 10, 1, 0 ]}
\hyperdef{L}{X7E41BC437F2B76E1}{}
{
  }

 
\section{\textcolor{Chapter }{Functors: Constructors}}\label{Functors:Constructors}
\logpage{[ 10, 2, 0 ]}
\hyperdef{L}{X86EE897086995E47}{}
{
  }

 
\section{\textcolor{Chapter }{Functors: Attributes}}\label{Functors:Attributes}
\logpage{[ 10, 3, 0 ]}
\hyperdef{L}{X7A21845C7C536717}{}
{
  }

 
\section{\textcolor{Chapter }{Basic Functors}}\label{Functors:Basic}
\logpage{[ 10, 4, 0 ]}
\hyperdef{L}{X7D83D0EB87D2D872}{}
{
  

\subsection{\textcolor{Chapter }{functor{\textunderscore}Cokernel}}
\logpage{[ 10, 4, 1 ]}\nobreak
\hyperdef{L}{X7B9FE8BF80D47B6E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{functor{\textunderscore}Cokernel\index{functorCokernel@\texttt{functor{\textunderscore}Cokernel}}
\label{functorCokernel}
}\hfill{\scriptsize (global variable)}}\\


 The functor that associates to a map its cokernel. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallValue( functor_Cokernel_for_fp_modules,
          CreateHomalgFunctor(
                  [ "name", "Cokernel" ],
                  [ "category", HOMALG_MODULES.category ],
                  [ "operation", "Cokernel" ],
                  [ "natural_transformation", "CokernelEpi" ],
                  [ "special", true ],
                  [ "number_of_arguments", 1 ],
                  [ "1", [ [ "covariant" ],
                          [ IsMapOfFinitelyGeneratedModulesRep,
                            [ IsHomalgChainMorphism, IsImageSquare ] ] ] ],
                  [ "OnObjects", _Functor_Cokernel_OnModules ]
                  )
          );
\end{Verbatim}
 }

 

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


 The following example also makes use of the natural transformation \texttt{CokernelEpi}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );;|
  !gapprompt@gap>| !gapinput@M := LeftPresentation( M );|
  <A non-torsion left module presented by 2 relations for 3 generators>
  !gapprompt@gap>| !gapinput@N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );;|
  !gapprompt@gap>| !gapinput@N := LeftPresentation( N );|
  <A non-torsion left module presented by 2 relations for 4 generators>
  !gapprompt@gap>| !gapinput@mat := HomalgMatrix( "[ \|
  !gapprompt@>| !gapinput@1, 0, -3, -6, \|
  !gapprompt@>| !gapinput@0, 1,  6, 11, \|
  !gapprompt@>| !gapinput@1, 0, -3, -6  \|
  !gapprompt@>| !gapinput@]", 3, 4, ZZ );;|
  !gapprompt@gap>| !gapinput@phi := HomalgMap( mat, M, N );;|
  !gapprompt@gap>| !gapinput@IsMorphism( phi );|
  true
  !gapprompt@gap>| !gapinput@phi;|
  <A homomorphism of left modules>
  !gapprompt@gap>| !gapinput@coker := Cokernel( phi );|
  <A left module presented by 5 relations for 4 generators>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( coker );|
  <A rank 1 left module presented by 1 relation for 2 generators>
  !gapprompt@gap>| !gapinput@Display( coker );|
  Z/< 8 > + Z^(1 x 1)
  !gapprompt@gap>| !gapinput@nu := CokernelEpi( phi );|
  <An epimorphism of left modules>
  !gapprompt@gap>| !gapinput@Display( nu );|
  [ [  -5,   0 ],
    [  -6,   1 ],
    [   1,  -2 ],
    [   0,   1 ] ]
  
  the map is currently represented by the above 4 x 2 matrix
  !gapprompt@gap>| !gapinput@DefectOfExactness( phi, nu );|
  <A zero left module>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( nu );|
  <A non-zero epimorphism of left modules>
  !gapprompt@gap>| !gapinput@Display( nu );|
  [ [   2,   0 ],
    [   1,  -2 ],
    [   0,   1 ] ]
  
  the map is currently represented by the above 3 x 2 matrix
  !gapprompt@gap>| !gapinput@PreInverse( nu );|
  false
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{functor{\textunderscore}ImageObject}}
\logpage{[ 10, 4, 3 ]}\nobreak
\hyperdef{L}{X7A5B3B307B334706}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{functor{\textunderscore}ImageObject\index{functorImageObject@\texttt{functor{\textunderscore}ImageObject}}
\label{functorImageObject}
}\hfill{\scriptsize (global variable)}}\\


 The functor that associates to a map its image. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallValue( functor_ImageObject_for_fp_modules,
          CreateHomalgFunctor(
                  [ "name", "ImageObject for modules" ],
                  [ "category", HOMALG_MODULES.category ],
                  [ "operation", "ImageObject" ],
                  [ "natural_transformation", "ImageObjectEmb" ],
                  [ "number_of_arguments", 1 ],
                  [ "1", [ [ "covariant" ],
                          [ IsMapOfFinitelyGeneratedModulesRep ] ] ],
                  [ "OnObjects", _Functor_ImageObject_OnModules ]
                  )
          );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{ImageObject}}
\logpage{[ 10, 4, 4 ]}\nobreak
\hyperdef{L}{X7E3FF900821DCBE6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ImageObject({\mdseries\slshape phi})\index{ImageObject@\texttt{ImageObject}}
\label{ImageObject}
}\hfill{\scriptsize (operation)}}\\


 The following example also makes use of the natural transformations \texttt{ImageObjectEpi} and \texttt{ImageObjectEmb}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );;|
  !gapprompt@gap>| !gapinput@M := LeftPresentation( M );|
  <A non-torsion left module presented by 2 relations for 3 generators>
  !gapprompt@gap>| !gapinput@N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );;|
  !gapprompt@gap>| !gapinput@N := LeftPresentation( N );|
  <A non-torsion left module presented by 2 relations for 4 generators>
  !gapprompt@gap>| !gapinput@mat := HomalgMatrix( "[ \|
  !gapprompt@>| !gapinput@1, 0, -3, -6, \|
  !gapprompt@>| !gapinput@0, 1,  6, 11, \|
  !gapprompt@>| !gapinput@1, 0, -3, -6  \|
  !gapprompt@>| !gapinput@]", 3, 4, ZZ );;|
  !gapprompt@gap>| !gapinput@phi := HomalgMap( mat, M, N );;|
  !gapprompt@gap>| !gapinput@IsMorphism( phi );|
  true
  !gapprompt@gap>| !gapinput@phi;|
  <A homomorphism of left modules>
  !gapprompt@gap>| !gapinput@im := ImageObject( phi );|
  <A left module presented by yet unknown relations for 3 generators>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( im );|
  <A free left module of rank 1 on a free generator>
  !gapprompt@gap>| !gapinput@pi := ImageObjectEpi( phi );|
  <A non-zero split epimorphism of left modules>
  !gapprompt@gap>| !gapinput@epsilon := ImageObjectEmb( phi );|
  <A monomorphism of left modules>
  !gapprompt@gap>| !gapinput@phi = pi * epsilon;|
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Kernel (for maps)}}
\logpage{[ 10, 4, 5 ]}\nobreak
\hyperdef{L}{X85C128B37E76827F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Kernel({\mdseries\slshape phi})\index{Kernel@\texttt{Kernel}!for maps}
\label{Kernel:for maps}
}\hfill{\scriptsize (operation)}}\\


 The following example also makes use of the natural transformation \texttt{KernelEmb}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );;|
  !gapprompt@gap>| !gapinput@M := LeftPresentation( M );|
  <A non-torsion left module presented by 2 relations for 3 generators>
  !gapprompt@gap>| !gapinput@N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );;|
  !gapprompt@gap>| !gapinput@N := LeftPresentation( N );|
  <A non-torsion left module presented by 2 relations for 4 generators>
  !gapprompt@gap>| !gapinput@mat := HomalgMatrix( "[ \|
  !gapprompt@>| !gapinput@1, 0, -3, -6, \|
  !gapprompt@>| !gapinput@0, 1,  6, 11, \|
  !gapprompt@>| !gapinput@1, 0, -3, -6  \|
  !gapprompt@>| !gapinput@]", 3, 4, ZZ );;|
  !gapprompt@gap>| !gapinput@phi := HomalgMap( mat, M, N );;|
  !gapprompt@gap>| !gapinput@IsMorphism( phi );|
  true
  !gapprompt@gap>| !gapinput@phi;|
  <A homomorphism of left modules>
  !gapprompt@gap>| !gapinput@ker := Kernel( phi );|
  <A cyclic left module presented by yet unknown relations for a cyclic generato\
  r>
  !gapprompt@gap>| !gapinput@Display( ker );|
  Z/< -3 >
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( last );|
  <A cyclic torsion left module presented by 1 relation for a cyclic generator>
  !gapprompt@gap>| !gapinput@Display( ker );|
  Z/< 3 >
  !gapprompt@gap>| !gapinput@iota := KernelEmb( phi );|
  <A monomorphism of left modules>
  !gapprompt@gap>| !gapinput@Display( iota );|
  [ [  0,  2,  4 ] ]
  
  the map is currently represented by the above 1 x 3 matrix
  !gapprompt@gap>| !gapinput@DefectOfExactness( iota, phi );|
  <A zero left module>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( iota );|
  <A non-zero monomorphism of left modules>
  !gapprompt@gap>| !gapinput@Display( iota );|
  [ [  2,  0 ] ]
  
  the map is currently represented by the above 1 x 2 matrix
  !gapprompt@gap>| !gapinput@PostInverse( iota );|
  fail
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{DefectOfExactness}}
\logpage{[ 10, 4, 6 ]}\nobreak
\hyperdef{L}{X7E6CDE7E85F09122}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DefectOfExactness({\mdseries\slshape phi, psi})\index{DefectOfExactness@\texttt{DefectOfExactness}}
\label{DefectOfExactness}
}\hfill{\scriptsize (operation)}}\\


 We follow the associative convention for applying maps. For left modules \mbox{\texttt{\mdseries\slshape phi}} is applied first and from the right. For right modules \mbox{\texttt{\mdseries\slshape psi}} is applied first and from the left. 

 The following example also makes use of the natural transformation \texttt{KernelEmb}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@M := HomalgMatrix( "[ 2, 3, 4, 0,   5, 6, 7, 0 ]", 2, 4, ZZ );;|
  !gapprompt@gap>| !gapinput@M := LeftPresentation( M );|
  <A non-torsion left module presented by 2 relations for 4 generators>
  !gapprompt@gap>| !gapinput@N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );;|
  !gapprompt@gap>| !gapinput@N := LeftPresentation( N );|
  <A non-torsion left module presented by 2 relations for 4 generators>
  !gapprompt@gap>| !gapinput@mat := HomalgMatrix( "[ \|
  !gapprompt@>| !gapinput@1, 3,  3,  3, \|
  !gapprompt@>| !gapinput@0, 3, 10, 17, \|
  !gapprompt@>| !gapinput@1, 3,  3,  3, \|
  !gapprompt@>| !gapinput@0, 0,  0,  0  \|
  !gapprompt@>| !gapinput@]", 4, 4, ZZ );;|
  !gapprompt@gap>| !gapinput@phi := HomalgMap( mat, M, N );;|
  !gapprompt@gap>| !gapinput@IsMorphism( phi );|
  true
  !gapprompt@gap>| !gapinput@phi;|
  <A homomorphism of left modules>
  !gapprompt@gap>| !gapinput@iota := KernelEmb( phi );|
  <A monomorphism of left modules>
  !gapprompt@gap>| !gapinput@DefectOfExactness( iota, phi );|
  <A zero left module>
  !gapprompt@gap>| !gapinput@hom_iota := Hom( iota );	## a shorthand for Hom( iota, ZZ );|
  <A homomorphism of right modules>
  !gapprompt@gap>| !gapinput@hom_phi := Hom( phi );	## a shorthand for Hom( phi, ZZ );|
  <A homomorphism of right modules>
  !gapprompt@gap>| !gapinput@DefectOfExactness( hom_iota, hom_phi );|
  <A cyclic right module on a cyclic generator satisfying yet unknown relations>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( last );|
  <A cyclic torsion right module on a cyclic generator satisfying 1 relation>
  !gapprompt@gap>| !gapinput@Display( last );|
  Z/< 2 >
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Functor{\textunderscore}Hom}}
\logpage{[ 10, 4, 7 ]}\nobreak
\hyperdef{L}{X7B93718087EFD69B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Functor{\textunderscore}Hom\index{FunctorHom@\texttt{Functor{\textunderscore}Hom}}
\label{FunctorHom}
}\hfill{\scriptsize (global variable)}}\\


 The bifunctor \texttt{Hom}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallValue( Functor_Hom_for_fp_modules,
          CreateHomalgFunctor(
                  [ "name", "Hom" ],
                  [ "category", HOMALG_MODULES.category ],
                  [ "operation", "Hom" ],
                  [ "number_of_arguments", 2 ],
                  [ "1", [ [ "contravariant", "right adjoint", "distinguished" ] ] ],
                  [ "2", [ [ "covariant", "left exact" ] ] ],
                  [ "OnObjects", _Functor_Hom_OnModules ],
                  [ "OnMorphisms", _Functor_Hom_OnMaps ],
                  [ "MorphismConstructor", HOMALG_MODULES.category.MorphismConstructor ]
                  )
          );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Hom}}
\logpage{[ 10, 4, 8 ]}\nobreak
\hyperdef{L}{X80015C78876B4F1E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Hom({\mdseries\slshape o1, o2})\index{Hom@\texttt{Hom}}
\label{Hom}
}\hfill{\scriptsize (operation)}}\\


 \mbox{\texttt{\mdseries\slshape o1}} resp. \mbox{\texttt{\mdseries\slshape o2}} could be a module, a map, a complex (of modules or of again of complexes), or
a chain morphism. 

 Each generator of a module of homomorphisms is displayed as a matrix of
appropriate dimensions. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );;|
  !gapprompt@gap>| !gapinput@M := LeftPresentation( M );|
  <A non-torsion left module presented by 2 relations for 3 generators>
  !gapprompt@gap>| !gapinput@N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );;|
  !gapprompt@gap>| !gapinput@N := LeftPresentation( N );|
  <A non-torsion left module presented by 2 relations for 4 generators>
  !gapprompt@gap>| !gapinput@mat := HomalgMatrix( "[ \|
  !gapprompt@>| !gapinput@1, 0, -3, -6, \|
  !gapprompt@>| !gapinput@0, 1,  6, 11, \|
  !gapprompt@>| !gapinput@1, 0, -3, -6  \|
  !gapprompt@>| !gapinput@]", 3, 4, ZZ );;|
  !gapprompt@gap>| !gapinput@phi := HomalgMap( mat, M, N );;|
  !gapprompt@gap>| !gapinput@IsMorphism( phi );|
  true
  !gapprompt@gap>| !gapinput@phi;|
  <A homomorphism of left modules>
  !gapprompt@gap>| !gapinput@psi := Hom( phi, M );|
  <A homomorphism of right modules>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( psi );|
  <A non-zero homomorphism of right modules>
  !gapprompt@gap>| !gapinput@Display( psi );|
  [ [   1,   1,   0,   1 ],
    [   2,   2,   0,   0 ],
    [   0,   0,   6,  10 ] ]
  
  the map is currently represented by the above 3 x 4 matrix
  !gapprompt@gap>| !gapinput@homNM := Source( psi );|
  <A non-torsion right module on 4 generators satisfying 2 relations>
  !gapprompt@gap>| !gapinput@IsIdenticalObj( homNM, Hom( N, M ) );	## the caching at work|
  true
  !gapprompt@gap>| !gapinput@homMM := Range( psi );|
  <A non-torsion right module on 3 generators satisfying 2 relations>
  !gapprompt@gap>| !gapinput@IsIdenticalObj( homMM, Hom( M, M ) );	## the caching at work|
  true
  !gapprompt@gap>| !gapinput@Display( homNM );|
  Z/< 3 > + Z/< 3 > + Z^(2 x 1)
  !gapprompt@gap>| !gapinput@Display( homMM );|
  Z/< 3 > + Z/< 3 > + Z^(1 x 1)
  !gapprompt@gap>| !gapinput@IsMonomorphism( psi );|
  false
  !gapprompt@gap>| !gapinput@IsEpimorphism( psi );|
  false
  !gapprompt@gap>| !gapinput@GeneratorsOfModule( homMM );|
  <A set of 3 generators of a homalg right module>
  !gapprompt@gap>| !gapinput@Display( last );|
  [ [  0,  0,  0 ],
    [  0,  1,  2 ],
    [  0,  0,  0 ] ]
  
  the map is currently represented by the above 3 x 3 matrix
  
  [ [  0,  2,  4 ],
    [  0,  0,  0 ],
    [  0,  2,  4 ] ]
  
  the map is currently represented by the above 3 x 3 matrix
  
  [ [   0,   1,   3 ],
    [   0,   0,  -2 ],
    [   0,   1,   3 ] ]
  
  the map is currently represented by the above 3 x 3 matrix
  
  a set of 3 generators given by the the above matrices
  !gapprompt@gap>| !gapinput@GeneratorsOfModule( homNM );|
  <A set of 4 generators of a homalg right module>
  !gapprompt@gap>| !gapinput@Display( last );|
  [ [  0,  1,  2 ],
    [  0,  1,  2 ],
    [  0,  1,  2 ],
    [  0,  0,  0 ] ]
  
  the map is currently represented by the above 4 x 3 matrix
  
  [ [  0,  1,  2 ],
    [  0,  0,  0 ],
    [  0,  0,  0 ],
    [  0,  2,  4 ] ]
  
  the map is currently represented by the above 4 x 3 matrix
  
  [ [   0,   0,  -3 ],
    [   0,   0,   7 ],
    [   0,   0,  -5 ],
    [   0,   0,   1 ] ]
  
  the map is currently represented by the above 4 x 3 matrix
  
  [ [   0,   1,  -3 ],
    [   0,   0,  12 ],
    [   0,   0,  -9 ],
    [   0,   2,   6 ] ]
  
  the map is currently represented by the above 4 x 3 matrix
  
  a set of 4 generators given by the the above matrices
\end{Verbatim}
 If for example the source $N$ gets a new presentation, you will see the effect on the generators: 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( N );|
  <A rank 2 left module presented by 1 relation for 3 generators>
  !gapprompt@gap>| !gapinput@GeneratorsOfModule( homNM );|
  <A set of 4 generators of a homalg right module>
  !gapprompt@gap>| !gapinput@Display( last );|
  [ [  0,  3,  6 ],
    [  0,  1,  2 ],
    [  0,  0,  0 ] ]
  
  the map is currently represented by the above 3 x 3 matrix
  
  [ [   0,   9,  18 ],
    [   0,   0,   0 ],
    [   0,   2,   4 ] ]
  
  the map is currently represented by the above 3 x 3 matrix
  
  [ [   0,   0,   0 ],
    [   0,   0,  -5 ],
    [   0,   0,   1 ] ]
  
  the map is currently represented by the above 3 x 3 matrix
  
  [ [   0,   9,  18 ],
    [   0,   0,  -9 ],
    [   0,   2,   6 ] ]
  
  the map is currently represented by the above 3 x 3 matrix
  
  a set of 4 generators given by the the above matrices
\end{Verbatim}
 Now we compute a certain natural filtration on \texttt{Hom}$(M,M)$: 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@dM := Resolution( M );|
  <A non-zero right acyclic complex containing a single morphism of left modules\
   at degrees [ 0 .. 1 ]>
  !gapprompt@gap>| !gapinput@hMM := Hom( dM, dM );|
  <A non-zero acyclic cocomplex containing a single morphism of right complexes \
  at degrees [ 0 .. 1 ]>
  !gapprompt@gap>| !gapinput@BMM := HomalgBicomplex( hMM );|
  <A non-zero bicocomplex containing right modules at bidegrees [ 0 .. 1 ]x
  [ -1 .. 0 ]>
  !gapprompt@gap>| !gapinput@II_E := SecondSpectralSequenceWithFiltration( BMM );|
  <A stable cohomological spectral sequence with sheets at levels 
  [ 0 .. 2 ] each consisting of right modules at bidegrees [ -1 .. 0 ]x
  [ 0 .. 1 ]>
  !gapprompt@gap>| !gapinput@Display( II_E );|
  The associated transposed spectral sequence:
  
  a cohomological spectral sequence at bidegrees
  [ [ 0 .. 1 ], [ -1 .. 0 ] ]
  ---------
  Level 0:
  
   * *
   * *
  ---------
  Level 1:
  
   * *
   . .
  ---------
  Level 2:
  
   s s
   . .
  
  Now the spectral sequence of the bicomplex:
  
  a cohomological spectral sequence at bidegrees
  [ [ -1 .. 0 ], [ 0 .. 1 ] ]
  ---------
  Level 0:
  
   * *
   * *
  ---------
  Level 1:
  
   * *
   * *
  ---------
  Level 2:
  
   s s
   . s
  !gapprompt@gap>| !gapinput@filt := FiltrationBySpectralSequence( II_E );|
  <A descending filtration with degrees [ -1 .. 0 ] and graded parts:
    
  -1:	<A non-zero cyclic right module on a cyclic generator satisfying yet unkno\
  wn relations>
     0:	<A rank 1 right module on 3 generators satisfying 2 relations>
  of
  <A right module on 4 generators satisfying yet unknown relations>>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( filt );|
  <A descending filtration with degrees [ -1 .. 0 ] and graded parts:
    
  -1:	<A non-zero cyclic torsion right module on a cyclic generator satisfying 1\
   relation>
     0:	<A rank 1 right module on 2 generators satisfying 1 relation>
  of
  <A non-torsion right module on 3 generators satisfying 2 relations>>
  !gapprompt@gap>| !gapinput@Display( filt );|
  Degree -1:
  
  Z/< 3 >
  ----------
  Degree 0:
  
  Z/< 3 > + Z^(1 x 1)
  !gapprompt@gap>| !gapinput@Display( homMM );|
  Z/< 3 > + Z/< 3 > + Z^(1 x 1)
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Functor{\textunderscore}TensorProduct}}
\logpage{[ 10, 4, 9 ]}\nobreak
\hyperdef{L}{X7A1A077D8268FADE}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Functor{\textunderscore}TensorProduct\index{FunctorTensorProduct@\texttt{Functor{\textunderscore}}\-\texttt{Tensor}\-\texttt{Product}}
\label{FunctorTensorProduct}
}\hfill{\scriptsize (global variable)}}\\


 The tensor product bifunctor. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallValue( Functor_TensorProduct_for_fp_modules,
          CreateHomalgFunctor(
                  [ "name", "TensorProduct" ],
                  [ "category", HOMALG_MODULES.category ],
                  [ "operation", "TensorProductOp" ],
                  [ "number_of_arguments", 2 ],
                  [ "1", [ [ "covariant", "left adjoint", "distinguished" ] ] ],
                  [ "2", [ [ "covariant", "left adjoint" ] ] ],
                  [ "OnObjects", _Functor_TensorProduct_OnModules ],
                  [ "OnMorphisms", _Functor_TensorProduct_OnMaps ],
                  [ "MorphismConstructor", HOMALG_MODULES.category.MorphismConstructor ]
                  )
          );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{TensorProduct}}
\logpage{[ 10, 4, 10 ]}\nobreak
\hyperdef{L}{X87EB0B4A852CF4C6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{TensorProduct({\mdseries\slshape o1, o2})\index{TensorProduct@\texttt{TensorProduct}}
\label{TensorProduct}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{\texttt{\symbol{92}}*({\mdseries\slshape o1, o2})\index{*@\texttt{\texttt{\symbol{92}}*}!TensorProduct}
\label{*:TensorProduct}
}\hfill{\scriptsize (operation)}}\\


 \mbox{\texttt{\mdseries\slshape o1}} resp. \mbox{\texttt{\mdseries\slshape o2}} could be a module, a map, a complex (of modules or of again of complexes), or
a chain morphism. 

 The symbol \texttt{*} is a shorthand for several operations associated with the functor \texttt{Functor{\textunderscore}TensorProduct{\textunderscore}for{\textunderscore}fp{\textunderscore}modules} installed under the name \texttt{TensorProduct}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );|
  <A 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@M := LeftPresentation( M );|
  <A non-torsion left module presented by 2 relations for 3 generators>
  !gapprompt@gap>| !gapinput@N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );|
  <A 2 x 4 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@N := LeftPresentation( N );|
  <A non-torsion left module presented by 2 relations for 4 generators>
  !gapprompt@gap>| !gapinput@mat := HomalgMatrix( "[ \|
  !gapprompt@>| !gapinput@1, 0, -3, -6, \|
  !gapprompt@>| !gapinput@0, 1,  6, 11, \|
  !gapprompt@>| !gapinput@1, 0, -3, -6  \|
  !gapprompt@>| !gapinput@]", 3, 4, ZZ );|
  <A 3 x 4 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@phi := HomalgMap( mat, M, N );|
  <A "homomorphism" of left modules>
  !gapprompt@gap>| !gapinput@IsMorphism( phi );|
  true
  !gapprompt@gap>| !gapinput@phi;|
  <A homomorphism of left modules>
  !gapprompt@gap>| !gapinput@L := Hom( ZZ, M );|
  <A rank 1 right module on 3 generators satisfying yet unknown relations>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( L );|
  <A rank 1 right module on 2 generators satisfying 1 relation>
  !gapprompt@gap>| !gapinput@Display( L );|
  Z/< 3 > + Z^(1 x 1)
  !gapprompt@gap>| !gapinput@L;	## the display method found out further information about the module L|
  <A rank 1 right module on 2 generators satisfying 1 relation>
  !gapprompt@gap>| !gapinput@psi := phi * L;|
  <A homomorphism of right modules>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( psi );|
  <A non-zero homomorphism of right modules>
  !gapprompt@gap>| !gapinput@Display( psi );|
  [ [   0,   0,   1,   1 ],
    [   0,   0,   8,   1 ],
    [   0,   0,   0,  -2 ],
    [   0,   0,   0,   2 ] ]
  
  the map is currently represented by the above 4 x 4 matrix
  !gapprompt@gap>| !gapinput@ML := Source( psi );|
  <A rank 1 right module on 4 generators satisfying 3 relations>
  !gapprompt@gap>| !gapinput@IsIdenticalObj( ML, M * L );	## the caching at work|
  true
  !gapprompt@gap>| !gapinput@NL := Range( psi );|
  <A rank 2 right module on 4 generators satisfying 2 relations>
  !gapprompt@gap>| !gapinput@IsIdenticalObj( NL, N * L );	## the caching at work|
  true
  !gapprompt@gap>| !gapinput@Display( ML );|
  Z/< 3 > + Z/< 3 > + Z/< 3 > + Z^(1 x 1)
  !gapprompt@gap>| !gapinput@Display( NL );|
  Z/< 3 > + Z/< 12 > + Z^(2 x 1)
\end{Verbatim}
 Now we compute a certain natural filtration on the tensor product $M$\texttt{*}$L$: 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@P := Resolution( M );|
  <A non-zero right acyclic complex containing a single morphism of left modules\
   at degrees [ 0 .. 1 ]>
  !gapprompt@gap>| !gapinput@GP := Hom( P );|
  <A non-zero acyclic cocomplex containing a single morphism of right modules at\
   degrees [ 0 .. 1 ]>
  !gapprompt@gap>| !gapinput@CE := Resolution( GP );|
  <An acyclic cocomplex containing a single morphism of right complexes at degre\
  es [ 0 .. 1 ]>
  !gapprompt@gap>| !gapinput@FCE := Hom( CE, L );|
  <A non-zero acyclic complex containing a single morphism of left cocomplexes a\
  t degrees [ 0 .. 1 ]>
  !gapprompt@gap>| !gapinput@BC := HomalgBicomplex( FCE );|
  <A non-zero bicomplex containing left modules at bidegrees [ 0 .. 1 ]x
  [ -1 .. 0 ]>
  !gapprompt@gap>| !gapinput@II_E := SecondSpectralSequenceWithFiltration( BC );|
  <A stable homological spectral sequence with sheets at levels 
  [ 0 .. 2 ] each consisting of left modules at bidegrees [ -1 .. 0 ]x
  [ 0 .. 1 ]>
  !gapprompt@gap>| !gapinput@Display( II_E );|
  The associated transposed spectral sequence:
  
  a homological spectral sequence at bidegrees
  [ [ 0 .. 1 ], [ -1 .. 0 ] ]
  ---------
  Level 0:
  
   * *
   * *
  ---------
  Level 1:
  
   * *
   . .
  ---------
  Level 2:
  
   s s
   . .
  
  Now the spectral sequence of the bicomplex:
  
  a homological spectral sequence at bidegrees
  [ [ -1 .. 0 ], [ 0 .. 1 ] ]
  ---------
  Level 0:
  
   * *
   * *
  ---------
  Level 1:
  
   * *
   . s
  ---------
  Level 2:
  
   s s
   . s
  !gapprompt@gap>| !gapinput@filt := FiltrationBySpectralSequence( II_E );|
  <An ascending filtration with degrees [ -1 .. 0 ] and graded parts:
     0:	<A non-torsion left module presented by 1 relation for 2 generators>
    -1:	<A non-zero left module presented by 2 relations for 2 generators>
  of
  <A non-zero left module presented by 10 relations for 6 generators>>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( filt );|
  <An ascending filtration with degrees [ -1 .. 0 ] and graded parts:
     0:	<A rank 1 left module presented by 1 relation for 2 generators>
    -1:	<A non-zero left module presented by 2 relations for 2 generators>
  of
  <A rank 1 left module presented by 3 relations for 4 generators>>
  !gapprompt@gap>| !gapinput@Display( filt );|
  Degree 0:
  
  Z/< 3 > + Z^(1 x 1)
  ----------
  Degree -1:
  
  Z/< 3 > + Z/< 3 >
  !gapprompt@gap>| !gapinput@Display( ML );|
  Z/< 3 > + Z/< 3 > + Z/< 3 > + Z^(1 x 1)
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Functor{\textunderscore}Ext}}
\logpage{[ 10, 4, 11 ]}\nobreak
\hyperdef{L}{X7D007A7079F7BEE3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Functor{\textunderscore}Ext\index{FunctorExt@\texttt{Functor{\textunderscore}Ext}}
\label{FunctorExt}
}\hfill{\scriptsize (global variable)}}\\


 The bifunctor \texttt{Ext}. 

 Below is the only \emph{specific} line of code used to define \texttt{Functor{\textunderscore}Ext{\textunderscore}for{\textunderscore}fp{\textunderscore}modules} and all the different operations \texttt{Ext} in \textsf{homalg}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  RightSatelliteOfCofunctor( Functor_Hom_for_fp_modules, "Ext" );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Ext}}
\logpage{[ 10, 4, 12 ]}\nobreak
\hyperdef{L}{X8692578881E71913}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Ext({\mdseries\slshape [c, ]o1, o2[, str]})\index{Ext@\texttt{Ext}}
\label{Ext}
}\hfill{\scriptsize (operation)}}\\


 Compute the \mbox{\texttt{\mdseries\slshape c}}-th extension object of \mbox{\texttt{\mdseries\slshape o1}} with \mbox{\texttt{\mdseries\slshape o2}} where \mbox{\texttt{\mdseries\slshape c}} is a nonnegative integer and \mbox{\texttt{\mdseries\slshape o1}} resp. \mbox{\texttt{\mdseries\slshape o2}} could be a module, a map, a complex (of modules or of again of complexes), or
a chain morphism. If \mbox{\texttt{\mdseries\slshape str}}=``a'' then the (cohomologically) graded object $Ext^i($\mbox{\texttt{\mdseries\slshape o1}},\mbox{\texttt{\mdseries\slshape o2}}$)$ for $0 \leq i \leq$\mbox{\texttt{\mdseries\slshape c}} is computed. If neither \mbox{\texttt{\mdseries\slshape c}} nor \mbox{\texttt{\mdseries\slshape str}} is specified then the cohomologically graded object $Ext^i($\mbox{\texttt{\mdseries\slshape o1}},\mbox{\texttt{\mdseries\slshape o2}}$)$ for $0 \leq i \leq d$ is computed, where $d$ is the length of the internally computed free resolution of \mbox{\texttt{\mdseries\slshape o1}}. 

 Each generator of a module of extensions is displayed as a matrix of
appropriate dimensions. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );;|
  !gapprompt@gap>| !gapinput@M := LeftPresentation( M );|
  <A non-torsion left module presented by 2 relations for 3 generators>
  !gapprompt@gap>| !gapinput@N := TorsionObject( M );|
  <A cyclic torsion left module presented by yet unknown relations for a cyclic \
  generator>
  !gapprompt@gap>| !gapinput@iota := TorsionObjectEmb( M );|
  <A monomorphism of left modules>
  !gapprompt@gap>| !gapinput@psi := Ext( 1, iota, N );|
  <A homomorphism of right modules>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( psi );|
  <A non-zero homomorphism of right modules>
  !gapprompt@gap>| !gapinput@Display( psi );|
  [ [  2 ] ]
  
  the map is currently represented by the above 1 x 1 matrix
  !gapprompt@gap>| !gapinput@extNN := Range( psi );|
  <A non-zero cyclic torsion right module on a cyclic generator satisfying 1 rel\
  ation>
  !gapprompt@gap>| !gapinput@IsIdenticalObj( extNN, Ext( 1, N, N ) );	## the caching at work|
  true
  !gapprompt@gap>| !gapinput@extMN := Source( psi );|
  <A non-zero cyclic torsion right module on a cyclic generator satisfying 1 rel\
  ation>
  !gapprompt@gap>| !gapinput@IsIdenticalObj( extMN, Ext( 1, M, N ) );	## the caching at work|
  true
  !gapprompt@gap>| !gapinput@Display( extNN );|
  Z/< 3 >
  !gapprompt@gap>| !gapinput@Display( extMN );|
  Z/< 3 >
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Functor{\textunderscore}Tor}}
\logpage{[ 10, 4, 13 ]}\nobreak
\hyperdef{L}{X821034FE80907E8D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Functor{\textunderscore}Tor\index{FunctorTor@\texttt{Functor{\textunderscore}Tor}}
\label{FunctorTor}
}\hfill{\scriptsize (global variable)}}\\


 The bifunctor \texttt{Tor}. 

 Below is the only \emph{specific} line of code used to define \texttt{Functor{\textunderscore}Tor{\textunderscore}for{\textunderscore}fp{\textunderscore}modules} and all the different operations \texttt{Tor} in \textsf{homalg}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  LeftSatelliteOfFunctor( Functor_TensorProduct_for_fp_modules, "Tor" );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Tor}}
\logpage{[ 10, 4, 14 ]}\nobreak
\hyperdef{L}{X79821906875CF49E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Tor({\mdseries\slshape [c, ]o1, o2[, str]})\index{Tor@\texttt{Tor}}
\label{Tor}
}\hfill{\scriptsize (operation)}}\\


 Compute the \mbox{\texttt{\mdseries\slshape c}}-th torsion object of \mbox{\texttt{\mdseries\slshape o1}} with \mbox{\texttt{\mdseries\slshape o2}} where \mbox{\texttt{\mdseries\slshape c}} is a nonnegative integer and \mbox{\texttt{\mdseries\slshape o1}} resp. \mbox{\texttt{\mdseries\slshape o2}} could be a module, a map, a complex (of modules or of again of complexes), or
a chain morphism. If \mbox{\texttt{\mdseries\slshape str}}=``a'' then the (cohomologically) graded object $Tor_i($\mbox{\texttt{\mdseries\slshape o1}},\mbox{\texttt{\mdseries\slshape o2}}$)$ for $0 \leq i \leq$\mbox{\texttt{\mdseries\slshape c}} is computed. If neither \mbox{\texttt{\mdseries\slshape c}} nor \mbox{\texttt{\mdseries\slshape str}} is specified then the cohomologically graded object $Tor_i($\mbox{\texttt{\mdseries\slshape o1}},\mbox{\texttt{\mdseries\slshape o2}}$)$ for $0 \leq i \leq d$ is computed, where $d$ is the length of the internally computed free resolution of \mbox{\texttt{\mdseries\slshape o1}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );;|
  !gapprompt@gap>| !gapinput@M := LeftPresentation( M );|
  <A non-torsion left module presented by 2 relations for 3 generators>
  !gapprompt@gap>| !gapinput@N := TorsionObject( M );|
  <A cyclic torsion left module presented by yet unknown relations for a cyclic \
  generator>
  !gapprompt@gap>| !gapinput@iota := TorsionObjectEmb( M );|
  <A monomorphism of left modules>
  !gapprompt@gap>| !gapinput@psi := Tor( 1, iota, N );|
  <A homomorphism of left modules>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( psi );|
  <A non-zero homomorphism of left modules>
  !gapprompt@gap>| !gapinput@Display( psi );|
  [ [  1 ] ]
  
  the map is currently represented by the above 1 x 1 matrix
  !gapprompt@gap>| !gapinput@torNN := Source( psi );|
  <A non-zero cyclic torsion left module presented by 1 relation for a cyclic ge\
  nerator>
  !gapprompt@gap>| !gapinput@IsIdenticalObj( torNN, Tor( 1, N, N ) );	## the caching at work|
  true
  !gapprompt@gap>| !gapinput@torMN := Range( psi );|
  <A non-zero cyclic torsion left module presented by 1 relation for a cyclic ge\
  nerator>
  !gapprompt@gap>| !gapinput@IsIdenticalObj( torMN, Tor( 1, M, N ) );	## the caching at work|
  true
  !gapprompt@gap>| !gapinput@Display( torNN );|
  Z/< 3 >
  !gapprompt@gap>| !gapinput@Display( torMN );|
  Z/< 3 >
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Functor{\textunderscore}RHom}}
\logpage{[ 10, 4, 15 ]}\nobreak
\hyperdef{L}{X84C60D997A79524E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Functor{\textunderscore}RHom\index{FunctorRHom@\texttt{Functor{\textunderscore}RHom}}
\label{FunctorRHom}
}\hfill{\scriptsize (global variable)}}\\


 The bifunctor \texttt{RHom}. 

 Below is the only \emph{specific} line of code used to define \texttt{Functor{\textunderscore}RHom{\textunderscore}for{\textunderscore}fp{\textunderscore}modules} and all the different operations \texttt{RHom} in \textsf{homalg}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  RightDerivedCofunctor( Functor_Hom_for_fp_modules );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{RHom}}
\logpage{[ 10, 4, 16 ]}\nobreak
\hyperdef{L}{X7D8BDC0C817C10AB}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RHom({\mdseries\slshape [c, ]o1, o2[, str]})\index{RHom@\texttt{RHom}}
\label{RHom}
}\hfill{\scriptsize (operation)}}\\


 Compute the \mbox{\texttt{\mdseries\slshape c}}-th extension object of \mbox{\texttt{\mdseries\slshape o1}} with \mbox{\texttt{\mdseries\slshape o2}} where \mbox{\texttt{\mdseries\slshape c}} is a nonnegative integer and \mbox{\texttt{\mdseries\slshape o1}} resp. \mbox{\texttt{\mdseries\slshape o2}} could be a module, a map, a complex (of modules or of again of complexes), or
a chain morphism. The string \mbox{\texttt{\mdseries\slshape str}} may take different values: 
\begin{itemize}
\item If \mbox{\texttt{\mdseries\slshape str}}=``a'' then $R^i Hom($\mbox{\texttt{\mdseries\slshape o1}},\mbox{\texttt{\mdseries\slshape o2}}$)$ for $0 \leq i \leq$\mbox{\texttt{\mdseries\slshape c}} is computed.
\item If \mbox{\texttt{\mdseries\slshape str}}=``c'' then the \mbox{\texttt{\mdseries\slshape c}}-th connecting homomorphism with respect to the short exact sequence \mbox{\texttt{\mdseries\slshape o1}} is computed.
\item If \mbox{\texttt{\mdseries\slshape str}}=``t'' then the exact triangle upto cohomological degree \mbox{\texttt{\mdseries\slshape c}} with respect to the short exact sequence \mbox{\texttt{\mdseries\slshape o1}} is computed.
\end{itemize}
 If neither \mbox{\texttt{\mdseries\slshape c}} nor \mbox{\texttt{\mdseries\slshape str}} is specified then the cohomologically graded object $R^i Hom($\mbox{\texttt{\mdseries\slshape o1}},\mbox{\texttt{\mdseries\slshape o2}}$)$ for $0 \leq i \leq d$ is computed, where $d$ is the length of the internally computed free resolution of \mbox{\texttt{\mdseries\slshape o1}}. 

 Each generator of a module of derived homomorphisms is displayed as a matrix
of appropriate dimensions. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@m := HomalgMatrix( [ [ 8, 0 ], [ 0, 2 ] ], ZZ );;|
  !gapprompt@gap>| !gapinput@M := LeftPresentation( m );|
  <A left module presented by 2 relations for 2 generators>
  !gapprompt@gap>| !gapinput@Display( M );|
  Z/< 8 > + Z/< 2 >
  !gapprompt@gap>| !gapinput@M;|
  <A torsion left module presented by 2 relations for 2 generators>
  !gapprompt@gap>| !gapinput@a := HomalgMatrix( [ [ 2, 0 ] ], ZZ );;|
  !gapprompt@gap>| !gapinput@alpha := HomalgMap( a, "free", M );|
  <A homomorphism of left modules>
  !gapprompt@gap>| !gapinput@pi := CokernelEpi( alpha );|
  <An epimorphism of left modules>
  !gapprompt@gap>| !gapinput@Display( pi );|
  [ [  1,  0 ],
    [  0,  1 ] ]
  
  the map is currently represented by the above 2 x 2 matrix
  !gapprompt@gap>| !gapinput@iota := KernelEmb( pi );|
  <A monomorphism of left modules>
  !gapprompt@gap>| !gapinput@Display( iota );|
  [ [  2,  0 ] ]
  
  the map is currently represented by the above 1 x 2 matrix
  !gapprompt@gap>| !gapinput@N := Kernel( pi );|
  <A cyclic torsion left module presented by yet unknown relations for a cyclic \
  generator>
  !gapprompt@gap>| !gapinput@Display( N );|
  Z/< 4 >
  !gapprompt@gap>| !gapinput@C := HomalgComplex( pi );|
  <A left acyclic complex containing a single morphism of left modules at degree\
  s [ 0 .. 1 ]>
  !gapprompt@gap>| !gapinput@Add( C, iota );|
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( C );|
  <A non-zero short exact sequence containing
  2 morphisms of left modules at degrees [ 0 .. 2 ]>
  !gapprompt@gap>| !gapinput@Display( C );|
  -------------------------
  at homology degree: 2
  Z/< 4 >
  -------------------------
  [ [  0,  6 ] ]
  
  the map is currently represented by the above 1 x 2 matrix
  ------------v------------
  at homology degree: 1
  Z/< 2 > + Z/< 8 >
  -------------------------
  [ [  0,  1 ],
    [  1,  1 ] ]
  
  the map is currently represented by the above 2 x 2 matrix
  ------------v------------
  at homology degree: 0
  Z/< 2 > + Z/< 2 >
  -------------------------
  !gapprompt@gap>| !gapinput@T := RHom( C, N );|
  <An exact cotriangle containing 3 morphisms of right cocomplexes at degrees
  [ 0, 1, 2, 0 ]>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( T );|
  <A non-zero exact cotriangle containing
  3 morphisms of right cocomplexes at degrees [ 0, 1, 2, 0 ]>
  !gapprompt@gap>| !gapinput@L := LongSequence( T );|
  <A cosequence containing 5 morphisms of right modules at degrees [ 0 .. 5 ]>
  !gapprompt@gap>| !gapinput@Display( L );|
  -------------------------
  at cohomology degree: 5
  Z/< 4 >
  ------------^------------
  [ [  0,  3 ] ]
  
  the map is currently represented by the above 1 x 2 matrix
  -------------------------
  at cohomology degree: 4
  Z/< 2 > + Z/< 4 >
  ------------^------------
  [ [  0,  1 ],
    [  0,  0 ] ]
  
  the map is currently represented by the above 2 x 2 matrix
  -------------------------
  at cohomology degree: 3
  Z/< 2 > + Z/< 2 >
  ------------^------------
  [ [  1 ],
    [  0 ] ]
  
  the map is currently represented by the above 2 x 1 matrix
  -------------------------
  at cohomology degree: 2
  Z/< 4 >
  ------------^------------
  [ [  0,  2 ] ]
  
  the map is currently represented by the above 1 x 2 matrix
  -------------------------
  at cohomology degree: 1
  Z/< 2 > + Z/< 4 >
  ------------^------------
  [ [  0,  1 ],
    [  2,  0 ] ]
  
  the map is currently represented by the above 2 x 2 matrix
  -------------------------
  at cohomology degree: 0
  Z/< 2 > + Z/< 2 >
  -------------------------
  !gapprompt@gap>| !gapinput@IsExactSequence( L );|
  true
  !gapprompt@gap>| !gapinput@L;|
  <An exact cosequence containing 5 morphisms of right modules at degrees
  [ 0 .. 5 ]>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Functor{\textunderscore}LTensorProduct}}
\logpage{[ 10, 4, 17 ]}\nobreak
\hyperdef{L}{X806251E3836C00B9}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Functor{\textunderscore}LTensorProduct\index{FunctorLTensorProduct@\texttt{Functor{\textunderscore}}\-\texttt{L}\-\texttt{Tensor}\-\texttt{Product}}
\label{FunctorLTensorProduct}
}\hfill{\scriptsize (global variable)}}\\


 The bifunctor \texttt{LTensorProduct}. 

 Below is the only \emph{specific} line of code used to define \texttt{Functor{\textunderscore}LTensorProduct{\textunderscore}for{\textunderscore}fp{\textunderscore}modules} and all the different operations \texttt{LTensorProduct} in \textsf{homalg}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  LeftDerivedFunctor( Functor_TensorProduct_for_fp_modules );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{LTensorProduct}}
\logpage{[ 10, 4, 18 ]}\nobreak
\hyperdef{L}{X7C12DA648798E77E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LTensorProduct({\mdseries\slshape [c, ]o1, o2[, str]})\index{LTensorProduct@\texttt{LTensorProduct}}
\label{LTensorProduct}
}\hfill{\scriptsize (operation)}}\\


 Compute the \mbox{\texttt{\mdseries\slshape c}}-th torsion object of \mbox{\texttt{\mdseries\slshape o1}} with \mbox{\texttt{\mdseries\slshape o2}} where \mbox{\texttt{\mdseries\slshape c}} is a nonnegative integer and \mbox{\texttt{\mdseries\slshape o1}} resp. \mbox{\texttt{\mdseries\slshape o2}} could be a module, a map, a complex (of modules or of again of complexes), or
a chain morphism. The string \mbox{\texttt{\mdseries\slshape str}} may take different values: 
\begin{itemize}
\item If \mbox{\texttt{\mdseries\slshape str}}=``a'' then $L_i TensorProduct($\mbox{\texttt{\mdseries\slshape o1}},\mbox{\texttt{\mdseries\slshape o2}}$)$ for $0 \leq i \leq$\mbox{\texttt{\mdseries\slshape c}} is computed.
\item If \mbox{\texttt{\mdseries\slshape str}}=``c'' then the \mbox{\texttt{\mdseries\slshape c}}-th connecting homomorphism with respect to the short exact sequence \mbox{\texttt{\mdseries\slshape o1}} is computed.
\item If \mbox{\texttt{\mdseries\slshape str}}=``t'' then the exact triangle upto cohomological degree \mbox{\texttt{\mdseries\slshape c}} with respect to the short exact sequence \mbox{\texttt{\mdseries\slshape o1}} is computed.
\end{itemize}
 If neither \mbox{\texttt{\mdseries\slshape c}} nor \mbox{\texttt{\mdseries\slshape str}} is specified then the cohomologically graded object $L_i TensorProduct($\mbox{\texttt{\mdseries\slshape o1}},\mbox{\texttt{\mdseries\slshape o2}}$)$ for $0 \leq i \leq d$ is computed, where $d$ is the length of the internally computed free resolution of \mbox{\texttt{\mdseries\slshape o1}}. 

 Each generator of a module of derived homomorphisms is displayed as a matrix
of appropriate dimensions. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@m := HomalgMatrix( [ [ 8, 0 ], [ 0, 2 ] ], ZZ );;|
  !gapprompt@gap>| !gapinput@M := LeftPresentation( m );|
  <A left module presented by 2 relations for 2 generators>
  !gapprompt@gap>| !gapinput@Display( M );|
  Z/< 8 > + Z/< 2 >
  !gapprompt@gap>| !gapinput@M;|
  <A torsion left module presented by 2 relations for 2 generators>
  !gapprompt@gap>| !gapinput@a := HomalgMatrix( [ [ 2, 0 ] ], ZZ );;|
  !gapprompt@gap>| !gapinput@alpha := HomalgMap( a, "free", M );|
  <A homomorphism of left modules>
  !gapprompt@gap>| !gapinput@pi := CokernelEpi( alpha );|
  <An epimorphism of left modules>
  !gapprompt@gap>| !gapinput@Display( pi );|
  [ [  1,  0 ],
    [  0,  1 ] ]
  
  the map is currently represented by the above 2 x 2 matrix
  !gapprompt@gap>| !gapinput@iota := KernelEmb( pi );|
  <A monomorphism of left modules>
  !gapprompt@gap>| !gapinput@Display( iota );|
  [ [  2,  0 ] ]
  
  the map is currently represented by the above 1 x 2 matrix
  !gapprompt@gap>| !gapinput@N := Kernel( pi );|
  <A cyclic torsion left module presented by yet unknown relations for a cyclic \
  generator>
  !gapprompt@gap>| !gapinput@Display( N );|
  Z/< 4 >
  !gapprompt@gap>| !gapinput@C := HomalgComplex( pi );|
  <A left acyclic complex containing a single morphism of left modules at degree\
  s [ 0 .. 1 ]>
  !gapprompt@gap>| !gapinput@Add( C, iota );|
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( C );|
  <A non-zero short exact sequence containing
  2 morphisms of left modules at degrees [ 0 .. 2 ]>
  !gapprompt@gap>| !gapinput@Display( C );|
  -------------------------
  at homology degree: 2
  Z/< 4 >
  -------------------------
  [ [  0,  6 ] ]
  
  the map is currently represented by the above 1 x 2 matrix
  ------------v------------
  at homology degree: 1
  Z/< 2 > + Z/< 8 >
  -------------------------
  [ [  0,  1 ],
    [  1,  1 ] ]
  
  the map is currently represented by the above 2 x 2 matrix
  ------------v------------
  at homology degree: 0
  Z/< 2 > + Z/< 2 >
  -------------------------
  !gapprompt@gap>| !gapinput@T := LTensorProduct( C, N );|
  <An exact triangle containing 3 morphisms of left complexes at degrees
  [ 1, 2, 3, 1 ]>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( T );|
  <A non-zero exact triangle containing
  3 morphisms of left complexes at degrees [ 1, 2, 3, 1 ]>
  !gapprompt@gap>| !gapinput@L := LongSequence( T );|
  <A sequence containing 5 morphisms of left modules at degrees [ 0 .. 5 ]>
  !gapprompt@gap>| !gapinput@Display( L );|
  -------------------------
  at homology degree: 5
  Z/< 4 >
  -------------------------
  [ [  1,  3 ] ]
  
  the map is currently represented by the above 1 x 2 matrix
  ------------v------------
  at homology degree: 4
  Z/< 2 > + Z/< 4 >
  -------------------------
  [ [  0,  1 ],
    [  0,  1 ] ]
  
  the map is currently represented by the above 2 x 2 matrix
  ------------v------------
  at homology degree: 3
  Z/< 2 > + Z/< 2 >
  -------------------------
  [ [  2 ],
    [  0 ] ]
  
  the map is currently represented by the above 2 x 1 matrix
  ------------v------------
  at homology degree: 2
  Z/< 4 >
  -------------------------
  [ [  0,  2 ] ]
  
  the map is currently represented by the above 1 x 2 matrix
  ------------v------------
  at homology degree: 1
  Z/< 2 > + Z/< 4 >
  -------------------------
  [ [  0,  1 ],
    [  1,  1 ] ]
  
  the map is currently represented by the above 2 x 2 matrix
  ------------v------------
  at homology degree: 0
  Z/< 2 > + Z/< 2 >
  -------------------------
  !gapprompt@gap>| !gapinput@IsExactSequence( L );|
  true
  !gapprompt@gap>| !gapinput@L;|
  <An exact sequence containing 5 morphisms of left modules at degrees
  [ 0 .. 5 ]>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Functor{\textunderscore}HomHom}}
\logpage{[ 10, 4, 19 ]}\nobreak
\hyperdef{L}{X7ACC6A7C86E4354C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Functor{\textunderscore}HomHom\index{FunctorHomHom@\texttt{Functor{\textunderscore}HomHom}}
\label{FunctorHomHom}
}\hfill{\scriptsize (global variable)}}\\


 The bifunctor \texttt{HomHom}. 

 Below is the only \emph{specific} line of code used to define \texttt{Functor{\textunderscore}HomHom{\textunderscore}for{\textunderscore}fp{\textunderscore}modules} and all the different operations \texttt{HomHom} in \textsf{homalg}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  Functor_Hom_for_fp_modules * Functor_Hom_for_fp_modules;
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Functor{\textunderscore}LHomHom}}
\logpage{[ 10, 4, 20 ]}\nobreak
\hyperdef{L}{X84557A6B79382720}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Functor{\textunderscore}LHomHom\index{FunctorLHomHom@\texttt{Functor{\textunderscore}LHomHom}}
\label{FunctorLHomHom}
}\hfill{\scriptsize (global variable)}}\\


 The bifunctor \texttt{LHomHom}. 

 Below is the only \emph{specific} line of code used to define \texttt{Functor{\textunderscore}LHomHom{\textunderscore}for{\textunderscore}fp{\textunderscore}modules} and all the different operations \texttt{LHomHom} in \textsf{homalg}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  LeftDerivedFunctor( Functor_HomHom_for_fp_modules );
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Tool Functors}}\label{Functors:Tool}
\logpage{[ 10, 5, 0 ]}
\hyperdef{L}{X815BF6DA7FD5D44B}{}
{
  }

 
\section{\textcolor{Chapter }{Other Functors}}\label{Functors:Other}
\logpage{[ 10, 6, 0 ]}
\hyperdef{L}{X879135AC8330C509}{}
{
  }

 
\section{\textcolor{Chapter }{Functors: Operations and Functions}}\label{Functors:Operations}
\logpage{[ 10, 7, 0 ]}
\hyperdef{L}{X7DACD68E7E5FA324}{}
{
  }

  }

   
\chapter{\textcolor{Chapter }{Symmetric Algebra and Koszul Complex}}\label{SymmetricAlgebra:chapter}
\logpage{[ 11, 0, 0 ]}
\hyperdef{L}{X7E3E740C80F42986}{}
{
  
\section{\textcolor{Chapter }{Symmetric Algebra: Constructor}}\label{SymmetricAlgebra:Constructors}
\logpage{[ 11, 1, 0 ]}
\hyperdef{L}{X78E07AD87CE14F53}{}
{
  

\subsection{\textcolor{Chapter }{SymmetricPower}}
\logpage{[ 11, 1, 1 ]}\nobreak
\hyperdef{L}{X79E2C2AF842E8419}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SymmetricPower({\mdseries\slshape k, M})\index{SymmetricPower@\texttt{SymmetricPower}}
\label{SymmetricPower}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} module



 Construct the \mbox{\texttt{\mdseries\slshape k}}-th exterior power of module \mbox{\texttt{\mdseries\slshape M}}. }

 }

 
\section{\textcolor{Chapter }{Symmetric Algebra: Properties and Attributes}}\label{SymmetricAlgebra:Attributes}
\logpage{[ 11, 2, 0 ]}
\hyperdef{L}{X7A26D0AD7E8F9FB2}{}
{
  

\subsection{\textcolor{Chapter }{IsSymmetricPower}}
\logpage{[ 11, 2, 1 ]}\nobreak
\hyperdef{L}{X79AECE877A31293F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsSymmetricPower({\mdseries\slshape M})\index{IsSymmetricPower@\texttt{IsSymmetricPower}}
\label{IsSymmetricPower}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Marks a module as an symmetric power of another module. }

 

\subsection{\textcolor{Chapter }{SymmetricPowerExponent}}
\logpage{[ 11, 2, 2 ]}\nobreak
\hyperdef{L}{X8750195584FAA0B2}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SymmetricPowerExponent({\mdseries\slshape M})\index{SymmetricPowerExponent@\texttt{SymmetricPowerExponent}}
\label{SymmetricPowerExponent}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
an integer



 The exponent of the symmetric power. }

 

\subsection{\textcolor{Chapter }{SymmetricPowerBaseModule}}
\logpage{[ 11, 2, 3 ]}\nobreak
\hyperdef{L}{X7D9225D083DDDB0C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SymmetricPowerBaseModule({\mdseries\slshape M})\index{SymmetricPowerBaseModule@\texttt{SymmetricPowerBaseModule}}
\label{SymmetricPowerBaseModule}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a homalg module



 The module that \mbox{\texttt{\mdseries\slshape M}} is an symmetric power of. }

 }

 }

   
\chapter{\textcolor{Chapter }{Exterior Algebra and Koszul Complex}}\label{ExteriorAlgebra:chapter}
\logpage{[ 12, 0, 0 ]}
\hyperdef{L}{X7BD010F3847B274E}{}
{
  What follows are several operations related to the exterior algebra of a free
module: 
\begin{itemize}
\item A constructor for the graded parts of the exterior algebra (``exterior powers'')
\item Several Operations on elements of these exterior powers
\item A constructor for the ``Koszul complex''
\item An implementation of the ``Cayley determinant'' as defined in \cite{CQ11}, which allows calculating greatest common divisors from finite free
resolutions.
\end{itemize}
 
\section{\textcolor{Chapter }{Exterior Algebra: Constructor}}\label{ExteriorAlgebra:Constructors}
\logpage{[ 12, 1, 0 ]}
\hyperdef{L}{X7A005D4E870C281D}{}
{
  

\subsection{\textcolor{Chapter }{ExteriorPower}}
\logpage{[ 12, 1, 1 ]}\nobreak
\hyperdef{L}{X787BB7FF85F0AD68}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ExteriorPower({\mdseries\slshape k, M})\index{ExteriorPower@\texttt{ExteriorPower}}
\label{ExteriorPower}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} module



 Construct the \mbox{\texttt{\mdseries\slshape k}}-th exterior power of module \mbox{\texttt{\mdseries\slshape M}}. }

 }

 
\section{\textcolor{Chapter }{Exterior Algebra: Properties and Attributes}}\label{ExteriorAlgebra:Attributes}
\logpage{[ 12, 2, 0 ]}
\hyperdef{L}{X7E09B9C5844FC31E}{}
{
  

\subsection{\textcolor{Chapter }{IsExteriorPower}}
\logpage{[ 12, 2, 1 ]}\nobreak
\hyperdef{L}{X79C5FE077B58DF82}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsExteriorPower({\mdseries\slshape M})\index{IsExteriorPower@\texttt{IsExteriorPower}}
\label{IsExteriorPower}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Marks a module as an exterior power of another module. }

 

\subsection{\textcolor{Chapter }{ExteriorPowerExponent}}
\logpage{[ 12, 2, 2 ]}\nobreak
\hyperdef{L}{X87CF59278702A550}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ExteriorPowerExponent({\mdseries\slshape M})\index{ExteriorPowerExponent@\texttt{ExteriorPowerExponent}}
\label{ExteriorPowerExponent}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
an integer



 The exponent of the exterior power. }

 

\subsection{\textcolor{Chapter }{ExteriorPowerBaseModule}}
\logpage{[ 12, 2, 3 ]}\nobreak
\hyperdef{L}{X8282D0D7800F63CC}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ExteriorPowerBaseModule({\mdseries\slshape M})\index{ExteriorPowerBaseModule@\texttt{ExteriorPowerBaseModule}}
\label{ExteriorPowerBaseModule}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a homalg module



 The module that \mbox{\texttt{\mdseries\slshape M}} is an exterior power of. }

 }

 
\section{\textcolor{Chapter }{Exterior Algebra: Element Properties}}\label{ExteriorAlgebra:ElementProperty}
\logpage{[ 12, 3, 0 ]}
\hyperdef{L}{X7A2AC54B87C85695}{}
{
  

\subsection{\textcolor{Chapter }{IsExteriorPowerElement}}
\logpage{[ 12, 3, 1 ]}\nobreak
\hyperdef{L}{X7FC4A5DC7B592D04}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsExteriorPowerElement({\mdseries\slshape x})\index{IsExteriorPowerElement@\texttt{IsExteriorPowerElement}}
\label{IsExteriorPowerElement}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Checks if the element \mbox{\texttt{\mdseries\slshape x}} is from an exterior power. }

 }

 
\section{\textcolor{Chapter }{Exterior Algebra: Element Operations}}\label{ExteriorAlgebra:ElementOperations}
\logpage{[ 12, 4, 0 ]}
\hyperdef{L}{X80D7B36379182854}{}
{
  

\subsection{\textcolor{Chapter }{Wedge (for elements of exterior powers of free modules)}}
\logpage{[ 12, 4, 1 ]}\nobreak
\hyperdef{L}{X7C71C3C77F2E225D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Wedge({\mdseries\slshape x, y})\index{Wedge@\texttt{Wedge}!for elements of exterior powers of free modules}
\label{Wedge:for elements of exterior powers of free modules}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
an element of an exterior power



 Calculate $\mbox{\texttt{\mdseries\slshape x}} \wedge \mbox{\texttt{\mdseries\slshape y}}$. }

 

\subsection{\textcolor{Chapter }{ExteriorPowerElementDual}}
\logpage{[ 12, 4, 2 ]}\nobreak
\hyperdef{L}{X8236B4167E79F186}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ExteriorPowerElementDual({\mdseries\slshape x})\index{ExteriorPowerElementDual@\texttt{ExteriorPowerElementDual}}
\label{ExteriorPowerElementDual}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
an element of an exterior power



 For \mbox{\texttt{\mdseries\slshape x}} in a q-th exterior power of a free module of rank n, return $\mbox{\texttt{\mdseries\slshape x}}*$ in the (n-q)-th exterior power, as defined in \cite{CQ11}. }

 

\subsection{\textcolor{Chapter }{SingleValueOfExteriorPowerElement}}
\logpage{[ 12, 4, 3 ]}\nobreak
\hyperdef{L}{X85EDBA2783A1E984}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SingleValueOfExteriorPowerElement({\mdseries\slshape x})\index{SingleValueOfExteriorPowerElement@\texttt{SingleValueOfExteriorPowerElement}}
\label{SingleValueOfExteriorPowerElement}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a ring element



 For \mbox{\texttt{\mdseries\slshape x}} in a highest exterior power, returns its single coordinate in the canonical
basis; i.e. $[\mbox{\texttt{\mdseries\slshape x}}]$ as defined in \cite{CQ11}. }

 }

 
\section{\textcolor{Chapter }{Koszul complex and Cayley determinant}}\label{ExteriorAlgebra:CayleyDeterminant}
\logpage{[ 12, 5, 0 ]}
\hyperdef{L}{X8050EFB77A600595}{}
{
  

\subsection{\textcolor{Chapter }{KoszulCocomplex}}
\logpage{[ 12, 5, 1 ]}\nobreak
\hyperdef{L}{X7D84C7AC809B453F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{KoszulCocomplex({\mdseries\slshape a, E})\index{KoszulCocomplex@\texttt{KoszulCocomplex}}
\label{KoszulCocomplex}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} cocomplex



 Calculate the \mbox{\texttt{\mdseries\slshape E}}-valued Koszul complex of \mbox{\texttt{\mdseries\slshape a}}. }

 

\subsection{\textcolor{Chapter }{CayleyDeterminant}}
\logpage{[ 12, 5, 2 ]}\nobreak
\hyperdef{L}{X794C601787143D2D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CayleyDeterminant({\mdseries\slshape C})\index{CayleyDeterminant@\texttt{CayleyDeterminant}}
\label{CayleyDeterminant}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a ring element



 Calculate the Cayley determinant of the complex \mbox{\texttt{\mdseries\slshape C}}, as defined in \cite{CQ11}. }

 

\subsection{\textcolor{Chapter }{Gcd{\textunderscore}UsingCayleyDeterminant}}
\logpage{[ 12, 5, 3 ]}\nobreak
\hyperdef{L}{X7C72190C8331FADD}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Gcd{\textunderscore}UsingCayleyDeterminant({\mdseries\slshape x, y[, ...]})\index{GcdUsingCayleyDeterminant@\texttt{Gcd{\textunderscore}}\-\texttt{Using}\-\texttt{Cayley}\-\texttt{Determinant}}
\label{GcdUsingCayleyDeterminant}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a ring element



 Returns the greatest common divisor of the given ring elements, calculated
using the Cayley determinant. }

 }

 }

   
\chapter{\textcolor{Chapter }{Examples}}\label{Examples}
\logpage{[ 13, 0, 0 ]}
\hyperdef{L}{X7A489A5D79DA9E5C}{}
{
  
\section{\textcolor{Chapter }{ExtExt}}\label{ExtExt}
\logpage{[ 13, 1, 0 ]}
\hyperdef{L}{X7BB9DE017ECE6E86}{}
{
  This corresponds to Example B.2 in \cite{BaSF}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@imat := HomalgMatrix( "[ \|
  !gapprompt@>| !gapinput@  262,  -33,   75,  -40, \|
  !gapprompt@>| !gapinput@  682,  -86,  196, -104, \|
  !gapprompt@>| !gapinput@ 1186, -151,  341, -180, \|
  !gapprompt@>| !gapinput@-1932,  248, -556,  292, \|
  !gapprompt@>| !gapinput@ 1018, -127,  293, -156  \|
  !gapprompt@>| !gapinput@]", 5, 4, ZZ );|
  <A 5 x 4 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@M := LeftPresentation( imat );|
  <A left module presented by 5 relations for 4 generators>
  !gapprompt@gap>| !gapinput@N := Hom( ZZ, M );|
  <A rank 1 right module on 4 generators satisfying yet unknown relations>
  !gapprompt@gap>| !gapinput@F := InsertObjectInMultiFunctor( Functor_Hom_for_fp_modules, 2, N, "TensorN" );|
  <The functor TensorN for f.p. modules and their maps over computable rings>
  !gapprompt@gap>| !gapinput@G := LeftDualizingFunctor( ZZ );;|
  !gapprompt@gap>| !gapinput@II_E := GrothendieckSpectralSequence( F, G, M );|
  <A stable homological spectral sequence with sheets at levels 
  [ 0 .. 2 ] each consisting of left modules at bidegrees [ -1 .. 0 ]x
  [ 0 .. 1 ]>
  !gapprompt@gap>| !gapinput@Display( II_E );|
  The associated transposed spectral sequence:
  
  a homological spectral sequence at bidegrees
  [ [ 0 .. 1 ], [ -1 .. 0 ] ]
  ---------
  Level 0:
  
   * *
   * *
  ---------
  Level 1:
  
   * *
   . .
  ---------
  Level 2:
  
   s s
   . .
  
  Now the spectral sequence of the bicomplex:
  
  a homological spectral sequence at bidegrees
  [ [ -1 .. 0 ], [ 0 .. 1 ] ]
  ---------
  Level 0:
  
   * *
   * *
  ---------
  Level 1:
  
   * *
   . s
  ---------
  Level 2:
  
   s s
   . s
  !gapprompt@gap>| !gapinput@filt := FiltrationBySpectralSequence( II_E, 0 );|
  <An ascending filtration with degrees [ -1 .. 0 ] and graded parts:
     0:	<A non-torsion left module presented by 3 relations for 4 generators>
    -1:	<A non-zero left module presented by 33 relations for 8 generators>
  of
  <A non-zero left module presented by 27 relations for 19 generators>>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( filt );|
  <An ascending filtration with degrees [ -1 .. 0 ] and graded parts:
     0:	<A non-torsion left module presented by 2 relations for 3 generators>
    
  -1:	<A non-zero torsion left module presented by 6 relations for 6 generators>
  of
  <A rank 1 left module presented by 8 relations for 9 generators>>
  !gapprompt@gap>| !gapinput@m := IsomorphismOfFiltration( filt );|
  <A non-zero isomorphism of left modules>
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{Purity}}\label{Purity}
\logpage{[ 13, 2, 0 ]}
\hyperdef{L}{X7EE63228803A04F1}{}
{
  This corresponds to Example B.3 in \cite{BaSF}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@imat := HomalgMatrix( "[ \|
  !gapprompt@>| !gapinput@  262,  -33,   75,  -40, \|
  !gapprompt@>| !gapinput@  682,  -86,  196, -104, \|
  !gapprompt@>| !gapinput@ 1186, -151,  341, -180, \|
  !gapprompt@>| !gapinput@-1932,  248, -556,  292, \|
  !gapprompt@>| !gapinput@ 1018, -127,  293, -156  \|
  !gapprompt@>| !gapinput@]", 5, 4, ZZ );|
  <A 5 x 4 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@M := LeftPresentation( imat );|
  <A left module presented by 5 relations for 4 generators>
  !gapprompt@gap>| !gapinput@filt := PurityFiltration( M );|
  <The ascending purity filtration with degrees [ -1 .. 0 ] and graded parts:
     0:	<A free left module of rank 1 on a free generator>
    
  -1:	<A non-zero torsion left module presented by 2 relations for 2 generators>
  of
  <A non-pure rank 1 left module presented by 2 relations for 3 generators>>
  !gapprompt@gap>| !gapinput@M;|
  <A non-pure rank 1 left module presented by 2 relations for 3 generators>
  !gapprompt@gap>| !gapinput@II_E := SpectralSequence( filt );|
  <A stable homological spectral sequence with sheets at levels 
  [ 0 .. 2 ] each consisting of left modules at bidegrees [ -1 .. 0 ]x
  [ 0 .. 1 ]>
  !gapprompt@gap>| !gapinput@Display( II_E );|
  The associated transposed spectral sequence:
  
  a homological spectral sequence at bidegrees
  [ [ 0 .. 1 ], [ -1 .. 0 ] ]
  ---------
  Level 0:
  
   * *
   * *
  ---------
  Level 1:
  
   * *
   . .
  ---------
  Level 2:
  
   s .
   . .
  
  Now the spectral sequence of the bicomplex:
  
  a homological spectral sequence at bidegrees
  [ [ -1 .. 0 ], [ 0 .. 1 ] ]
  ---------
  Level 0:
  
   * *
   * *
  ---------
  Level 1:
  
   * *
   . s
  ---------
  Level 2:
  
   s .
   . s
  !gapprompt@gap>| !gapinput@m := IsomorphismOfFiltration( filt );|
  <A non-zero isomorphism of left modules>
  !gapprompt@gap>| !gapinput@IsIdenticalObj( Range( m ), M );|
  true
  !gapprompt@gap>| !gapinput@Source( m );|
  <A non-torsion left module presented by 2 relations for 3 generators (locked)>
  !gapprompt@gap>| !gapinput@Display( last );|
  [ [   0,   2,   0 ],
    [   0,   0,  12 ] ]
  
  Cokernel of the map
  
  Z^(1x2) --> Z^(1x3),
  
  currently represented by the above matrix
  !gapprompt@gap>| !gapinput@Display( filt );|
  Degree 0:
  
  Z^(1 x 1)
  ----------
  Degree -1:
  
  Z/< 2 > + Z/< 12 > 
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{TorExt-Grothendieck}}\label{TorExt-Grothendieck}
\logpage{[ 13, 3, 0 ]}
\hyperdef{L}{X812EF8147AE16E72}{}
{
  This corresponds to Example B.5 in \cite{BaSF}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@imat := HomalgMatrix( "[ \|
  !gapprompt@>| !gapinput@  262,  -33,   75,  -40, \|
  !gapprompt@>| !gapinput@  682,  -86,  196, -104, \|
  !gapprompt@>| !gapinput@ 1186, -151,  341, -180, \|
  !gapprompt@>| !gapinput@-1932,  248, -556,  292, \|
  !gapprompt@>| !gapinput@ 1018, -127,  293, -156  \|
  !gapprompt@>| !gapinput@]", 5, 4, ZZ );|
  <A 5 x 4 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@M := LeftPresentation( imat );|
  <A left module presented by 5 relations for 4 generators>
  !gapprompt@gap>| !gapinput@F := InsertObjectInMultiFunctor( Functor_TensorProduct_for_fp_modules, 2, M, "TensorM" );|
  <The functor TensorM for f.p. modules and their maps over computable rings>
  !gapprompt@gap>| !gapinput@G := LeftDualizingFunctor( ZZ );;|
  !gapprompt@gap>| !gapinput@II_E := GrothendieckSpectralSequence( F, G, M );|
  <A stable cohomological spectral sequence with sheets at levels 
  [ 0 .. 2 ] each consisting of left modules at bidegrees [ -1 .. 0 ]x
  [ 0 .. 1 ]>
  !gapprompt@gap>| !gapinput@Display( II_E );|
  The associated transposed spectral sequence:
  
  a cohomological spectral sequence at bidegrees
  [ [ 0 .. 1 ], [ -1 .. 0 ] ]
  ---------
  Level 0:
  
   * *
   * *
  ---------
  Level 1:
  
   * *
   . .
  ---------
  Level 2:
  
   s s
   . .
  
  Now the spectral sequence of the bicomplex:
  
  a cohomological spectral sequence at bidegrees
  [ [ -1 .. 0 ], [ 0 .. 1 ] ]
  ---------
  Level 0:
  
   * *
   * *
  ---------
  Level 1:
  
   * *
   . s
  ---------
  Level 2:
  
   s s
   . s
  !gapprompt@gap>| !gapinput@filt := FiltrationBySpectralSequence( II_E, 0 );|
  <A descending filtration with degrees [ -1 .. 0 ] and graded parts:
  
  -1:	<A non-zero left module presented by yet unknown relations for 9 generator\
  s>
  
  0:	<A non-zero left module presented by yet unknown relations for 4 generators\
  >
  of
  <A left module presented by yet unknown relations for 29 generators>>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( filt );|
  <A descending filtration with degrees [ -1 .. 0 ] and graded parts:
    -1:	<A non-zero left module presented by 4 relations for 4 generators>
     0:	<A non-torsion left module presented by 2 relations for 3 generators>
  of
  <A non-torsion left module presented by 6 relations for 7 generators>>
  !gapprompt@gap>| !gapinput@m := IsomorphismOfFiltration( filt );|
  <A non-zero isomorphism of left modules>
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{TorExt}}\label{TorExt}
\logpage{[ 13, 4, 0 ]}
\hyperdef{L}{X784BC2567875830B}{}
{
  This corresponds to Example B.6 in \cite{BaSF}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@imat := HomalgMatrix( "[ \|
  !gapprompt@>| !gapinput@  262,  -33,   75,  -40, \|
  !gapprompt@>| !gapinput@  682,  -86,  196, -104, \|
  !gapprompt@>| !gapinput@ 1186, -151,  341, -180, \|
  !gapprompt@>| !gapinput@-1932,  248, -556,  292, \|
  !gapprompt@>| !gapinput@ 1018, -127,  293, -156  \|
  !gapprompt@>| !gapinput@]", 5, 4, ZZ );|
  <A 5 x 4 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@M := LeftPresentation( imat );|
  <A left module presented by 5 relations for 4 generators>
  !gapprompt@gap>| !gapinput@P := Resolution( M );|
  <A non-zero right acyclic complex containing a single morphism of left modules\
   at degrees [ 0 .. 1 ]>
  !gapprompt@gap>| !gapinput@GP := Hom( P );|
  <A non-zero acyclic cocomplex containing a single morphism of right modules at\
   degrees [ 0 .. 1 ]>
  !gapprompt@gap>| !gapinput@FGP := GP * P;|
  <A non-zero acyclic cocomplex containing a single morphism of left complexes a\
  t degrees [ 0 .. 1 ]>
  !gapprompt@gap>| !gapinput@BC := HomalgBicomplex( FGP );|
  <A non-zero bicocomplex containing left modules at bidegrees [ 0 .. 1 ]x
  [ -1 .. 0 ]>
  !gapprompt@gap>| !gapinput@p_degrees := ObjectDegreesOfBicomplex( BC )[1];|
  [ 0, 1 ]
  !gapprompt@gap>| !gapinput@II_E := SecondSpectralSequenceWithFiltration( BC, p_degrees );|
  <A stable cohomological spectral sequence with sheets at levels 
  [ 0 .. 2 ] each consisting of left modules at bidegrees [ -1 .. 0 ]x
  [ 0 .. 1 ]>
  !gapprompt@gap>| !gapinput@Display( II_E );|
  The associated transposed spectral sequence:
  
  a cohomological spectral sequence at bidegrees
  [ [ 0 .. 1 ], [ -1 .. 0 ] ]
  ---------
  Level 0:
  
   * *
   * *
  ---------
  Level 1:
  
   * *
   . .
  ---------
  Level 2:
  
   s s
   . .
  
  Now the spectral sequence of the bicomplex:
  
  a cohomological spectral sequence at bidegrees
  [ [ -1 .. 0 ], [ 0 .. 1 ] ]
  ---------
  Level 0:
  
   * *
   * *
  ---------
  Level 1:
  
   * *
   * *
  ---------
  Level 2:
  
   s s
   . s
  !gapprompt@gap>| !gapinput@filt := FiltrationBySpectralSequence( II_E, 0 );|
  <A descending filtration with degrees [ -1 .. 0 ] and graded parts:
  
  -1:	<A non-zero left module presented by yet unknown relations for 10 generato\
  rs>
     0:	<A rank 1 left module presented by 3 relations for 4 generators>
  of
  <A left module presented by yet unknown relations for 13 generators>>
  !gapprompt@gap>| !gapinput@ByASmallerPresentation( filt );|
  <A descending filtration with degrees [ -1 .. 0 ] and graded parts:
    -1:	<A non-zero left module presented by 4 relations for 4 generators>
     0:	<A rank 1 left module presented by 2 relations for 3 generators>
  of
  <A non-torsion left module presented by 6 relations for 7 generators>>
  !gapprompt@gap>| !gapinput@m := IsomorphismOfFiltration( filt );|
  <A non-zero isomorphism of left modules>
\end{Verbatim}
 }

  }

 

\appendix


\chapter{\textcolor{Chapter }{The Mathematical Idea behind \textsf{Modules}}}\label{homalg-Idea}
\logpage{[ "A", 0, 0 ]}
\hyperdef{L}{X78E86EA18602AC04}{}
{
  As finite dimensional constructions in linear algebra over a field $k$ boil down to solving (in)homogeneous linear systems over $k$, the Gaussian algorithm makes the whole theory perfectly computable. 

 Hence, for homological algebra (viewed as linear algebra over general rings)
to be computable one needs to find appropriate substitutes for the Gaussian
algorithm, where finite dimensionality has to be replaced by finite
generatedness. 

 Luckily such substitutes exist for many rings of interest. Beside the
well-known Hermite normal form algorithm for principal ideal rings it turns
out that appropriate generalizations of the classical Gr{\"o}bner basis
algorithm for polynomial rings provide the desired substitute for a wide class
of commutative \emph{and} noncommutative rings. Note that for noncommutative rings the above discussion
has to be restricted to homological constructions leading to one-sided linear
systems $XA=B$ resp. $AX=B$ ($\to$ \ref{Modules-limitation}). 

   }


\chapter{\textcolor{Chapter }{Logic Subpackages}}\label{Logic}
\logpage{[ "B", 0, 0 ]}
\hyperdef{L}{X8222352C78A19214}{}
{
  
\section{\textcolor{Chapter }{\textsf{LIMOD}: Logical Implications for Modules}}\label{Modules:LIMOD}
\logpage{[ "B", 1, 0 ]}
\hyperdef{L}{X7CFB956F82FBF1FA}{}
{
  }

 
\section{\textcolor{Chapter }{\textsf{LIHOM}: Logical Implications for Homomorphisms of Modules}}\label{Maps:LIHOM}
\logpage{[ "B", 2, 0 ]}
\hyperdef{L}{X7CA14AB186D0A7E0}{}
{
  }

  }


\chapter{\textcolor{Chapter }{Overview of the \textsf{Modules} Package Source Code}}\label{FileOverview}
\logpage{[ "C", 0, 0 ]}
\hyperdef{L}{X866669D781FBA4A4}{}
{
  
\section{\textcolor{Chapter }{Relations and Generators}}\label{ModuleInternals}
\logpage{[ "C", 1, 0 ]}
\hyperdef{L}{X87ED7A1883976BE9}{}
{
  \begin{center}
\begin{tabular}{l|l}Filename \texttt{.gd}/\texttt{.gi}&
Content\\
\hline
\texttt{HomalgRingMap}&
operations and methods ring maps\\
&
\\
\texttt{HomalgRelations}&
a set of relations\\
\texttt{SetsOfRelations}&
several sets of relations\\
\texttt{HomalgGenerators}&
a set of generators\\
\texttt{SetsOfGenerators}&
several sets of generators\\
\end{tabular}\\[2mm]
\textbf{Table: }\emph{The \textsf{homalg} package files}\end{center}

 }

 
\section{\textcolor{Chapter }{The Basic Objects}}\label{The Basic Objects}
\logpage{[ "C", 2, 0 ]}
\hyperdef{L}{X81DDCFC578069518}{}
{
  \begin{center}
\begin{tabular}{l|l}Filename \texttt{.gd}/\texttt{.gi}&
Content\\
\hline
\texttt{HomalgModule}&
modules allowing several presentations\\
&
linked with transition matrices\\
&
\\
\texttt{HomalgSubmodule}&
submodules allowing several sets of generators\\
&
\\
\texttt{HomalgMap}&
maps allowing several presentations\\
&
of their source and target\\
&
\\
\texttt{HomalgFiltration}&
filtration of a module\\
&
\\
\texttt{HomalgComplex}&
(co)complexes of modules or of (co)complexes\\
&
\\
\texttt{HomalgChainMap}&
chain maps of (co)complexes\\
&
consisting of maps or chain maps\\
&
\\
\texttt{HomalgBicomplex}&
bicomplexes of modules or of (co)complexes\\
&
\\
\texttt{HomalgBigradedObject}&
(differential) bigraded modules\\
&
\\
\texttt{HomalgSpectralSequence}&
homological and cohomological\\
&
spectral sequences\\
&
\\
\texttt{HomalgDiagram}&
Betti diagrams\\
\end{tabular}\\[2mm]
\textbf{Table: }\emph{The \textsf{homalg} package files (continued)}\end{center}

 }

 
\section{\textcolor{Chapter }{The High Level Homological Algorithms}}\label{High Level Homological Algorithms}
\logpage{[ "C", 3, 0 ]}
\hyperdef{L}{X7BDE961D858BC60E}{}
{
  \begin{center}
\begin{tabular}{l|l}Filename \texttt{.gd}/\texttt{.gi}&
Content\\
\hline
\texttt{Modules}&
subfactors, resolutions,\\
&
parameterizations, intersections, annihilators\\
\texttt{ToolFunctors}&
zero map, composition, addition, substraction,\\
&
stacking, augmentation, and post dividing maps\\
\texttt{BasicFunctors}&
cokernel, image, kernel, tensor product, Hom,\\
&
Ext, Tor, RHom, LTensorProduct, HomHom, LHomHom,\\
&
BaseChange (preliminary)\\
\texttt{OtherFunctors}&
direct sum\\
\end{tabular}\\[2mm]
\textbf{Table: }\emph{The \textsf{homalg} package files (continued)}\end{center}

 }

 
\section{\textcolor{Chapter }{Logical Implications for \textsf{homalg} Objects}}\label{Logical Implications}
\logpage{[ "C", 4, 0 ]}
\hyperdef{L}{X7EF0F9E47CCE826C}{}
{
  \begin{center}
\begin{tabular}{l|l}Filename \texttt{.gd}/\texttt{.gi}&
Content\\
\hline
\texttt{LIMOD}&
logical implications for modules\\
&
\\
\texttt{LIHOM}&
logical implications for module homomorphisms\\
\end{tabular}\\[2mm]
\textbf{Table: }\emph{The \textsf{homalg} package files (continued)}\end{center}

 }

 }

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

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

\addcontentsline{toc}{chapter}{References}

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

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


\printindex

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