% 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{DarkOlive}{rgb}{0.1047,0.2412,0.0064}
\definecolor{FireBrick}{rgb}{0.5812,0.0074,0.0083}
\definecolor{RoyalBlue}{rgb}{0.0236,0.0894,0.6179}
\definecolor{RoyalGreen}{rgb}{0.0236,0.6179,0.0894}
\definecolor{RoyalRed}{rgb}{0.6179,0.0236,0.0894}
\definecolor{LightBlue}{rgb}{0.8544,0.9511,1.0000}
\definecolor{Black}{rgb}{0.0,0.0,0.0}
\definecolor{FuncColor}{rgb}{1.0,0.0,0.0}
%% strange name because of pdflatex bug:
\definecolor{Chapter }{rgb}{0.0,0.0,1.0}

\usepackage{fancyvrb}

\usepackage{pslatex}

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

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


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

\begin{document}

\logpage{[ 0, 0, 0 ]}
\begin{titlepage}
\begin{center}{\Huge \textbf{\textsf{homalg}\mbox{}}}\\[1cm]
\hypersetup{pdftitle=\textsf{homalg}}
\markright{\scriptsize \mbox{}\hfill \textsf{homalg} \hfill\mbox{}}
{\Large \textbf{A \textsf{GAP4} Meta-Package for Homological Algebra\mbox{}}}\\[1cm]
{Version 2009.11.09 \mbox{}}\\[1cm]
{November 2009\mbox{}}\\[1cm]
\mbox{}\\[2cm]
{\large \textbf{Mohamed Barakat\\
    \mbox{}}}\\
\hypersetup{pdfauthor=Mohamed Barakat\\
    }
\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/chap0.html} {\texttt{http://homalg.math.rwth-aachen.de/\texttt{\symbol{126}}barakat/homalg/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/homalg-package} {\texttt{http://homalg.math.rwth-aachen.de/index.php/core-packages/homalg-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://wwwb.math.rwth-aachen.de/~barakat/} {\texttt{http://wwwb.math.rwth-aachen.de/\texttt{\symbol{126}}barakat/}}\\
 --- Address: \begin{minipage}[t]{8cm}\noindent
 Department of Mathematics, \\
 University of Kaiserslautern, \\
 67653 Kaiserslautern, \\
 Germany \end{minipage}
}\\
\end{titlepage}

\newpage\setcounter{page}{2}
{\small 
\section*{Copyright}
\logpage{[ 0, 0, 1 ]}
 {\copyright} 2007-2009 by Mohamed Barakat 

 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 ]}
 \href{http://www-groups.mcs.st-and.ac.uk/~neunhoef/} {Max Neunhöffer}  not only taught me the philosophy of object-oriented programming in \textsf{GAP4}, but also to what extent this philosophy is still unique among programming
languages ($\to$ \ref{WhyGAP4}). The slides (in German) to his talk in our seminar on 30.10.2006 can be
found on \href{http://www-groups.mcs.st-and.ac.uk/~neunhoef/Publications/talks.html} {his homepage}. 

 He, \href{http://www.math.rwth-aachen.de/~Frank.Luebeck/} {Frank
  Lübeck}, and \href{http://www.math.rwth-aachen.de/~Thomas.Breuer/} {Thomas
  Breuer}  patiently answered trillions of specific questions, even those I was too lazy
to look up in the excellent \href{http://www.gap-system.org/Manuals/doc/htm/prg/chapters.htm} {programming
  tutorial}. Without their continuous and tireless help and advice, not only this package
but the  as a whole \href{http://homalg.math.rwth-aachen.de/} {homalg
  project} would have remained on my todo list. 

 A lot of  ideas that make up this package and the whole \textsf{homalg} project came out of intensive discussions with  \href{http://wwwb.math.rwth-aachen.de/~daniel/} {Daniel
  Robertz} during our early collaboration, where we developed our philosophy of a meta
package for homological algebra and  \href{http://homalg.math.rwth-aachen.de/maple/} {implemented} it in \textsf{Maple}. 

 In the fall of 2007 I began collaborating with  \href{http://wwwb.math.rwth-aachen.de/goertzen/} {Simon
  Görtzen} to further pursue and extend these  ideas preparing the transition to \textsf{GAP4}. With his help \textsf{homalg} became an extendable multi-package project. 

 Max Neunh{\"o}ffer convinced me to use his wonderful \textsf{IO} package to start communicating with external computer algebra systems. This
was crucial to remedy the yet missing support for important rings in \textsf{GAP}. Max provided the first piece of code to access the computer algebra system \textsf{Singular}. This was the starting point of the packages \textsf{HomalgToCAS} and \textsf{IO{\textunderscore}ForHomalg}, which were further abstracted by Simon and myself enabling \textsf{homalg} to communicate with virtually any external (computer algebra) system. 

 \href{http://wwwb.math.rwth-aachen.de/~thomas/} {Thomas
  Bächler}  wrote the package \textsf{MapleForHomalg} to directly access \textsf{Maple} via its \textsf{C}-interface. It offers an alternative to the package \textsf{IO{\textunderscore}ForHomalg}, which requires \textsf{Maple}'s terminal interface \texttt{cmaple}. 

 The basic support for \textsf{Sage} was added by Simon, and the support for \textsf{Singular} was initiated by  \href{http://wwwb.math.rwth-aachen.de/~markus/} {Markus
  Lange-Hegermann} and continued by him and Simon, while  \href{http://www.math.rwth-aachen.de/~Markus.Kirschmer/} {Markus
  Kirschmer} contributed the complete support for \textsf{MAGMA}. This formed the beginning of the \textsf{RingsForHomalg} package. Recently, Daniel added the support for \textsf{Macaulay2}. 

 My concerns about how to handle the garbage collection in the external
computer algebra systems were evaporated with the idea of Thomas Breuer using
the so-called \href{http://www.gap-system.org/Manuals/doc/htm/ext/CHAP007.htm} {weak
  pointers}  in \textsf{GAP4} to keep track of all the external objects that became obsolete for \textsf{homalg}. This idea took shape in a discussion with him and Frank L{\"u}beck and
finally found its way into the package \textsf{HomalgToCAS}. 

 My gratitude to all with whom I worked together to develop extension packages
and those who developed their own packages within the \textsf{homalg} project ($\to$ Appendix \ref{homalg-Project}). Without their contributions the package \textsf{homalg} would have remained a core without a body: 
\begin{itemize}
\item \href{http://wwwb.math.rwth-aachen.de/~thomas/} {Thomas Bächler}
\item Barbara Bremer
\item \href{http://www.math.rwth-aachen.de/~Thomas.Breuer/} {Thomas Breuer}
\item Anna Fabia{\a'n}ska
\item \href{http://wwwb.math.rwth-aachen.de/goertzen/} {Simon Görtzen}
\item \href{http://www.math.rwth-aachen.de/~Markus.Kirschmer/} {Markus Kirschmer}
\item \href{http://wwwb.math.rwth-aachen.de/~markus/} {Markus Lange-Hegermann}
\item \href{http://www.math.rwth-aachen.de/~Frank.Luebeck/} {Frank Lübeck}
\item \href{http://www-groups.mcs.st-and.ac.uk/~neunhoef/} {Max Neunhöffer}
\item \href{http://wwwb.math.rwth-aachen.de/~daniel/} {Daniel Robertz}
\end{itemize}
 I would also like to thank  \href{http://www-sop.inria.fr/members/Alban.Quadrat/} {Alban
  Quadrat} for supporting the \textsf{homalg} project and for all the wonderful discussions we had. At several places in the
code I was happy to add the comment: ``I learned this from Alban''. 

 My teacher \href{http://wwwb.math.rwth-aachen.de/Mitarbeiter/plesken.php} {Wilhelm
  Plesken}  remains an inexhaustible source of extremely broad and deep knowledge. Thank
you for being such a magnificent person. 

 This manual was created using the GAPDoc package of Max Neunh{\"o}ffer and
Frank L{\"u}beck. 

 Last but not least, thanks to \emph{Miriam}, \emph{Josef}, \emph{Jonas}, and \emph{Irene} for the endless love and support. \mbox{}}\\[1cm]
\newpage

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

\tableofcontents
\newpage

 \index{\textsf{homalg}}   
\chapter{\textcolor{Chapter }{Introduction}}\label{intro}
\logpage{[ 1, 0, 0 ]}
\hyperdef{L}{X7DFB63A97E67C0A1}{}
{
  
\section{\textcolor{Chapter }{What is the role of the \textsf{homalg} package in the \textsf{homalg} project?}}\label{homalg-vs-homalg}
\logpage{[ 1, 1, 0 ]}
\hyperdef{L}{X7F1B40DB7C1395DD}{}
{
  
\subsection{\textcolor{Chapter }{Philosophy}}\label{philosophy}
\logpage{[ 1, 1, 1 ]}
\hyperdef{L}{X873C99678745ABAF}{}
{
  The package \textsf{homalg} is meant to be the first part of a continuously growing  \href{http://www.opensource.org/} {open
source} multi volume book about  \href{http://en.wikipedia.org/wiki/Homological_algebra} {homological} and \href{http://en.wikipedia.org/wiki/Homotopical_algebra} {homotopical
algebra}. \textsf{homalg} is an attempt to translate as much as possible of homological algebra, as can
be found in books like \cite{ce}, \cite{ML}, \cite{HS}, \cite{rot}, \cite{weihom}, and \cite{GM}, into a language that a computer can directly understand. But just like the
aforementioned books, \textsf{homalg} should, to a great extent, be readable by a mathematician, even without deep
programming knowledge. For the reasons mentioned in ($\to$ Appendix \ref{WhyGAP4}) \textsf{GAP4} was chosen as the language of \textsf{homalg}. }

 
\subsection{\textcolor{Chapter }{\textsf{homalg} provides ...}}\label{homalg-provides}
\logpage{[ 1, 1, 2 ]}
\hyperdef{L}{X82A79A2A78AED00B}{}
{
  The package \textsf{homalg} is the foundational part of the project. It provides procedures to construct
basic objects in homological algebra: 
\begin{itemize}
\item rings
\item ring maps
\item matrices
\item modules (generators, relations)
\item maps
\item filtrations
\item complexes (of modules and of complexes)
\item chain maps
\item bicomplexes
\item bigraded (differential) objects
\item spectral sequences
\item functors
\end{itemize}
 Beside these so-called constructors \textsf{homalg} provides  \emph{operations} to perform computations with these objects. The list of operations includes: 
\begin{itemize}
\item resolution of modules
\item computation of subfactor modules
\item applying functors (like \texttt{Ext}, \texttt{Tor}, ...) to modules, maps, complexes and chain maps
\item derivation and composition of functors
\item horse shoe resolution of short exact sequences of modules
\item connecting homomorphisms and long exact sequences
\item Cartan-Eilenberg resolution of complexes
\item hyper (co)homology
\item spectral sequences of bicomplexes
\item the Grothendieck spectral sequences associated to two composable functors
\item test if a module is torsion-free, reflexive, projective, stably free, free,
pure
\item determine the rank, codimension, 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 }{\textsf{homalg} delegates ...}}\label{homalg-delegates}
\logpage{[ 1, 1, 3 ]}
\hyperdef{L}{X856DCAA4846FBB00}{}
{
  The package \textsf{homalg} \emph{delegates} \emph{all} matrix operations as it treats matrices and their rings as \emph{black boxes}. \textsf{homalg} comes with a single predefined class of rings and a single predefined class of
matrices over these rings -- the so-called internal matrices ($\to$ \ref{IsHomalgInternalMatrixRep}) over so-called internal rings ($\to$ \ref{IsHomalgInternalRingRep}). An internal matrix (resp. ring) is simply a wrapper containing a \textsf{GAP}-builtin matrix (resp. ring). \textsf{homalg} allows other packages to define further classes or extend existing classes of
rings and matrices \emph{together} with their operations. For example: 
\begin{itemize}
\item The \textsf{homalg} subpackage \textsf{ResidueClassRingForHomalg} ($\to$ Appendix \ref{ResidueClassRingForHomalg}) defines the classes of residue class rings, residue class ring elements, and
matrices over residue class rings. Such a matrix is defined by a matrix over
the ambient ring which is nevertheless interpreted modulo the ring relations,
i.e. modulo the generators of the defining ideal. 
\item The package \textsf{GaussForHomalg} extends the class of internal matrices enabling it to wrap sparse matrices
provided by the package \textsf{Gauss}. \textsf{GaussForHomalg} delegates the essential part of the matrix creation and all matrix operations
to \textsf{Gauss}.
\item The package \textsf{HomalgToCAS} ($\to$ Appendix \ref{homalg-Project}) defines the classes of so-called external rings and matrices and the package \textsf{RingsForHomalg} delegates the essential part of the matrix creation and all matrix operations
to external computer algebra systems like \textsf{Singular}, \textsf{Macaulay2}, \textsf{Sage}, \textsf{Macaulay2}, \textsf{MAGMA}, \textsf{Maple}, ... . The package \textsf{homalg} accesses external matrices via pointers. The pointer of an external matrix is
simply its name in the external system. \textsf{HomalgToCAS} chooses these names.
\item The package \textsf{LocalizeRingForHomalg} defines the classes of local(ized) rings, local ring elements, and local
matrices. A \textsf{homalg} local matrix contains a \textsf{homalg} matrix as a numerator and an element of the global ring as a denominator.
\end{itemize}
 

 The matrix operations are divided into two classes called ``Tools'' and ``Basic''. The ``Tools'' operations include addition, subtraction, multiplication, extracting certain
rows or columns, stacking, and augmenting matrices ($\to$ Appendix \ref{Tool_Operations}). The ``Basic'' operations include the two basic operations in linear algebra needed to solve
an inhomogeneous linear system $XA=B$ with coefficients in a not necessarily commutative ring $R$ ($\to$ Appendix \ref{Basic_Operations}): 
\begin{itemize}
\item Effectively reducing $B$ modulo $A$, i.e. effectively deciding if a row (or a set of rows) $B$ lies in the $R$-span of the rows of the matrix $A$.
\item Computing an $R$-generating set of row syzygies (=$R$-relations among the rows) of $A$, i.e. computing an $R$-generating set of the left kernel of $A$. This generating set is then given as the rows of a matrix $Y$ and $YA=0$.
\end{itemize}
 The first operation is nothing but deciding the solvability of the
inhomogeneous system $XA=B$ and if solvable to compute a particular solution $X$, while the second is to compute an $R$-generating set for the homogeneous solution space, i.e. the solution space of
the homogeneous system $YA=0$ ($\to$ \ref{SufficientSupport}). The above is of course also valid for the column convention. }

 
\subsection{\textcolor{Chapter }{Rings supported in a sufficient way}}\label{SufficientSupport}
\logpage{[ 1, 1, 4 ]}
\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{homalg-limitation}). }

 
\subsection{\textcolor{Chapter }{Principal limitation}}\label{homalg-limitation}
\logpage{[ 1, 1, 5 ]}
\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{homalg} 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 }{The black box concept}}\label{black box}
\logpage{[ 1, 1, 6 ]}
\hyperdef{L}{X808E7BA97C5EA311}{}
{
  

 Now we address the following concerns: Wouldn't the idea of using algorithms
like the Gr{\"o}bnerbasis algorithm(s) as a black box ($\to$ \ref{homalg-delegates}) contradict the following facts? 
\begin{itemize}
\item  It is known that an efficient Gr{\"o}bnerbasis algorithm depends on the ring $R$ under consideration. For example the implementation of the algorithm depends
on the ground ring (or field) $k$.
\item  Often enough highly specialized implementations are used to address specific
types of linear systems of equations (occuring in specific homological
problems) in order to increase the speed or reduce the space needed for the
computations.
\end{itemize}
 The following should clarify the above concerns. 
\begin{itemize}
\item  Since each ring comes with its own black box, the first point is automatically
resolved.
\item  Allow the black box coming with each ring to contain the different available
implementations and make them accessible to \textsf{homalg} via standarized names, independent of the computer algebra system used to
perform computations.
\end{itemize}
 See also \ref{Why ZZ}. }

 
\subsection{\textcolor{Chapter }{\textsf{homalg}'s dictionaries (technical)}}\label{homalg-dict}
\logpage{[ 1, 1, 7 ]}
\hyperdef{L}{X795CE4D5866B6F44}{}
{
  \textsf{homalg} 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{homalg} 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{homalg} 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{homalg} 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{homalg}. 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{homalg} no longer distinguishes between internal and external. 

 }

 
\subsection{\textcolor{Chapter }{The advantages of the outsourcing concept}}\label{outsource}
\logpage{[ 1, 1, 8 ]}
\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 \ref{WhyGAP4}). 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, 9 ]}
\hyperdef{L}{X85C5BCDF797B7954}{}
{
  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 \ref{Objectify}): 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, 10 ]}
\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{homalg}'s design. \textsf{homalg} 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 maps, 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 }{Building upon the \textsf{homalg} package}}\label{build}
\logpage{[ 1, 1, 11 ]}
\hyperdef{L}{X78E6DF7E878D754D}{}
{
  As mentioned above, the package \textsf{homalg} should only be the first and foundational part of the \textsf{homalg} project. On the one hand it is designed independently of the details of the
different matrix operations, which other packages are meant to provide.
Typically, these packages (like \textsf{RingsForHomalg}) heavily rely on existing, well tested, and optimized systems like \textsf{Singular}, \textsf{Macaulay2}, or \textsf{MAGMA}. On the other hand other packages can be built upon or extend the \textsf{homalg} package in different ways: 
\begin{itemize}
\item add constructors (sheaves, schemes, simplicial sets, ...)
\item add methods for basic operation (Yoneda products, Massey products, Steenrod
operations, ...)
\item add methods to compute sheaf cohomology, local cohomology, Hochschild
(co)homology, cyclic (co)homology...
\item provide algorithms for holonomic $D$-modules based on the restriction algorithm: localization, computing tensor
products, \texttt{Hom}, \texttt{Ext}, de Rham cohomology, ...
\item support change of rings, Lyndon/Hochschild-Serre spectral sequence, base
change spectral sequences, ...
\item support perturbation techniques, Serre and Eilenberg-Moore spectral sequence
of simplicial spaces of infinite type, ...
\item ...
\end{itemize}
 The project will remain open and contributions are highly welcome. The
different packages will be attributed to their respective authors. The whole
project will be attributed to the "\textsf{homalg} team", i.e. the authors and contributers of all packages in the project. }

 
\subsection{\textcolor{Chapter }{Frequently asked questions}}\label{FAQ}
\logpage{[ 1, 1, 12 ]}
\hyperdef{L}{X7D51BC7A80D43EA0}{}
{
  
\begin{itemize}
\item \textsc{Q}: Does outsourcing the matrices mean that \textsf{homalg} is able to compute spectral sequences, for example, without ever seeing the
matrices involved in the computation?\\
\\
 A: Yes.
\item \textsc{Q}: Can \textsf{homalg} 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{homalg}.
\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{homalg} 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{homalg}. For this purpose, developers can use the unified communication interface
provideb by \textsf{HomalgToCAS}. This is the interface used by \textsf{homalg}.
\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{homalg-provides}) with its constructors, properties, attributes, and operations.  }

  }

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

 By default the \textsf{homalg} package is not automatically loaded by \textsf{GAP} when it is installed. You must load the package with \\
\\
 \texttt{LoadPackage}( "homalg" ); \\
\\
 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  }

   
\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}{X7A321B4885D1BFC1}{}
{
  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{homalg} 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{homalg} is designed to use rings and matrices over these rings together with all their
operations as a black box. In other words: Because \textsf{homalg} works for ${\ensuremath{\mathbb Z}}$, it works by its design for all other computable rings (see also \ref{black box}). }

 
\section{\textcolor{Chapter }{\texttt{gap{\textgreater} ExamplesForHomalg();}}}\label{gap> ExamplesForHomalg();}
\logpage{[ 3, 2, 0 ]}
\hyperdef{L}{X85872612814D30B4}{}
{
  To quickly create a ring for use with \textsf{homalg} 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{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} ($\to$ Appendix \ref{ResidueClassRingForHomalg}). 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}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );
  <A homalg internal ring>
  gap> Display( ZZ );
  Z
  gap> R := ZZ / 2^8;
  <A homalg residue class ring>
  gap> Display( R );
  Z/( 256 )
  gap> M := LeftPresentation( [ 2^5 ], R );
  <A cyclic left module presented by 1 relation for a cyclic generator>
  gap> Display( M );
  Z/( 256 )/< |[ 32 ]| >
  gap> _M := LeftPresentation( [ 2^3 ], R );
  <A cyclic left module presented by 1 relation for a cyclic generator>
  gap> Display( _M );
  Z/( 256 )/< |[ 8 ]| >
  gap> alpha2 := HomalgMap( [ 1 ], M, _M );
  <A "homomorphism" of left modules>
  gap> IsMorphism( alpha2 );
  true
  gap> alpha2;
  <A homomorphism of left modules>
  gap> Display( alpha2 );
  [ [  1 ] ]
  
  modulo [ 256 ]
  
  the map is currently represented by the above 1 x 1 matrix
  gap> M_ := Kernel( alpha2 );
  <A cyclic left module presented by yet unknown relations for a cyclic generato\
  r>
  gap> alpha1 := KernelEmb( alpha2 );
  <A monomorphism of left modules>
  gap> seq := HomalgComplex( alpha2 );
  <An acyclic complex containing a single morphism of left modules at degrees 
  [ 0 .. 1 ]>
  gap> Add( seq, alpha1 );
  gap> seq;
  <A sequence containing 2 morphisms of left modules at degrees [ 0 .. 2 ]>
  gap> IsShortExactSequence( seq );
  true
  gap> seq;
  <A short exact sequence containing 2 morphisms of left modules at degrees 
  [ 0 .. 2 ]>
  gap> Display( seq );
  -------------------------
  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 ]| > 
  -------------------------
  gap> K := LeftPresentation( [ 2^7 ], R );
  <A cyclic left module presented by 1 relation for a cyclic generator>
  gap> L := RightPresentation( [ 2^4 ], R );
  <A cyclic right module on a cyclic generator satisfying 1 relation>
  gap> triangle := LHomHom( 4, seq, K, L, "t" );
  <An exact triangle containing 3 morphisms of left complexes at degrees 
  [ 1, 2, 3, 1 ]>
  gap> lehs := LongSequence( triangle );
  <A sequence containing 14 morphisms of left modules at degrees [ 0 .. 14 ]>
  gap> ByASmallerPresentation( lehs );
  <A non-zero sequence containing 14 morphisms of left modules at degrees 
  [ 0 .. 14 ]>
  gap> IsExactSequence( lehs );
  false
  gap> lehs;
  <A non-zero left acyclic complex containing 
  14 morphisms of left modules at degrees [ 0 .. 14 ]>
  gap> Assert( 0, IsLeftAcyclic( lehs ) );
  gap> Display( lehs );
  -------------------------
  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 ]| > 
  -------------------------
  [ [  6 ] ]
  
  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 ]| > 
  -------------------------
  [ [  6 ] ]
  
  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 ]| > 
  -------------------------
  [ [  6 ] ]
  
  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 ]| > 
  -------------------------
  [ [  6 ] ]
  
  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 }{Rings}}\label{Rings}
\logpage{[ 4, 0, 0 ]}
\hyperdef{L}{X81897F6082CACB59}{}
{
  
\section{\textcolor{Chapter }{Rings: Category and Representations}}\label{Rings:Category}
\logpage{[ 4, 1, 0 ]}
\hyperdef{L}{X8252B2F483D80E41}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgRing}}
\logpage{[ 4, 1, 1 ]}\nobreak
\hyperdef{L}{X85E217C67DD633AB}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgRing({\slshape R})\index{IsHomalgRing@\texttt{IsHomalgRing}}
\label{IsHomalgRing}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



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

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

 

\subsection{\textcolor{Chapter }{IsPreHomalgRing}}
\logpage{[ 4, 1, 2 ]}\nobreak
\hyperdef{L}{X81DC249883163C01}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsPreHomalgRing({\slshape R})\index{IsPreHomalgRing@\texttt{IsPreHomalgRing}}
\label{IsPreHomalgRing}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of pre \textsf{homalg} rings. 

 (It is a subcategory of the \textsf{GAP} category \texttt{IsHomalgRing}.) \\
\\
 These are rings with an incomplete \texttt{homalgTable}. They provide flexibility for developers to support a wider class of rings,
as was necessary for the development of the \textsf{LocalizeRingForHomalg} package. They are not suited for direct usage. }

 

\subsection{\textcolor{Chapter }{IsHomalgRingElement}}
\logpage{[ 4, 1, 3 ]}\nobreak
\hyperdef{L}{X80A410ED8500DA7E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgRingElement({\slshape r})\index{IsHomalgRingElement@\texttt{IsHomalgRingElement}}
\label{IsHomalgRingElement}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of elements of \textsf{homalg} rings which are not GAP4 built-in. }

 

\subsection{\textcolor{Chapter }{IsHomalgInternalRingRep}}
\logpage{[ 4, 1, 4 ]}\nobreak
\hyperdef{L}{X8097E89E7B6EF731}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgInternalRingRep({\slshape R})\index{IsHomalgInternalRingRep@\texttt{IsHomalgInternalRingRep}}
\label{IsHomalgInternalRingRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The internal representation of \textsf{homalg} rings. 

 (It is a representation of the \textsf{GAP} category \texttt{IsHomalgRing}.) }

 }

 
\section{\textcolor{Chapter }{Rings: Constructors}}\label{Rings:Constructors}
\logpage{[ 4, 2, 0 ]}
\hyperdef{L}{X7C7962B97E6CDFE2}{}
{
  This section describes how to construct rings for use with \textsf{homalg}, which exploit the \textsf{GAP4}-built-in abilities to perform the necessary ring operations. By this we also
mean necessary matrix operations over such rings. For the purposes of \textsf{homalg} only the ring of integers is properly supported in \textsf{GAP4}. The \textsf{GAP4} extension packages \textsf{Gauss} and \textsf{GaussForHomalg} extend these built-in abilities to operations with sparse matrices over the
ring ${\ensuremath{\mathbb Z}} / p^n$ for $p$ prime and $n$ positive.

 If a ring $R$ is supported in \textsf{homalg} any of its residue class rings $R/I$ is supported as well, provided the ideal $I$ of relations admits a finite set of generators as a left resp. right ideal ($\to$ \texttt{\texttt{\symbol{92}}/} (\ref{/:constructor for residue class rings})). This is immediate for commutative noetherian rings. 

\subsection{\textcolor{Chapter }{HomalgRingOfIntegers (constructor for the integers)}}
\logpage{[ 4, 2, 1 ]}\nobreak
\hyperdef{L}{X78AC74CB802A8A49}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgRingOfIntegers({\slshape })\index{HomalgRingOfIntegers@\texttt{HomalgRingOfIntegers}!constructor for the integers}
\label{HomalgRingOfIntegers:constructor for the integers}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring

\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgRingOfIntegers({\slshape c})\index{HomalgRingOfIntegers@\texttt{HomalgRingOfIntegers}!constructor for the residue class rings of the integers}
\label{HomalgRingOfIntegers:constructor for the residue class rings of the integers}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring



 The no-argument form returns the ring of integers ${\ensuremath{\mathbb Z}}$ for \textsf{homalg}. 

 The one-argument form accepts an integer \mbox{\texttt{\slshape c}} and returns the ring ${\ensuremath{\mathbb Z}} / c $ for \textsf{homalg}: 
\begin{itemize}
\item \mbox{\texttt{\slshape c}}$ = 0$ defaults to ${\ensuremath{\mathbb Z}}$
\item if \mbox{\texttt{\slshape c}} is a prime power then the package \textsf{GaussForHomalg} is loaded (if it fails to load an error is issued)
\item otherwise, the residue class ring constructor \texttt{/} ($\to$ \texttt{\texttt{\symbol{92}}/} (\ref{/:constructor for residue class rings})) is invoked
\end{itemize}
 The operation \texttt{SetRingProperties} is automatically invoked to set the ring properties. 

 If for some reason you don't want to use the \textsf{GaussForHomalg} package (maybe because you didn't install it), then use

 \texttt{HomalgRingOfIntegers}( ) \texttt{/} \mbox{\texttt{\slshape c}}; 

 but note that the computations will then be considerably slower. }

 

\subsection{\textcolor{Chapter }{HomalgFieldOfRationals (constructor for the field of rationals)}}
\logpage{[ 4, 2, 2 ]}\nobreak
\hyperdef{L}{X7F4829D6808187B3}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgFieldOfRationals({\slshape })\index{HomalgFieldOfRationals@\texttt{HomalgFieldOfRationals}!constructor for the field of rationals}
\label{HomalgFieldOfRationals:constructor for the field of rationals}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring



 The package \textsf{GaussForHomalg} is loaded and the field of rationals ${\ensuremath{\mathbb Q}}$ is returned. If \textsf{GaussForHomalg} fails to load an error is issued. 

 The operation \texttt{SetRingProperties} is automatically invoked to set the ring properties. }

 

\subsection{\textcolor{Chapter }{\texttt{\symbol{92}}/ (constructor for residue class rings)}}
\logpage{[ 4, 2, 3 ]}\nobreak
\hyperdef{L}{X7B76AA8778E3EAC3}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{\texttt{\symbol{92}}/({\slshape R, ring{\textunderscore}rel})\index{/@\texttt{\texttt{\symbol{92}}/}!constructor for residue class rings}
\label{/:constructor for residue class rings}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring



 This is the \textsf{homalg} constructor for residue class rings \mbox{\texttt{\slshape R}} $/ I$, where \mbox{\texttt{\slshape R}} is a \textsf{homalg} ring and $I=$\mbox{\texttt{\slshape ring{\textunderscore}rel}} is the ideal of relations generated by \mbox{\texttt{\slshape ring{\textunderscore}rel}}. \mbox{\texttt{\slshape ring{\textunderscore}rel}} might be: 
\begin{itemize}
\item a set of left resp. right relations on one generator
\item a list of ring elements of \mbox{\texttt{\slshape R}}
\item a ring element of \mbox{\texttt{\slshape R}}
\end{itemize}
 For noncommutative rings: In the first case the left resp. right set of
relations should generate the ideal of relations $I$ as left resp. right ideal generators, and their involutions should generate $I$ as right resp. left ideal generators. If \mbox{\texttt{\slshape ring{\textunderscore}rel}} is not a set of relations, a \emph{left} set of relations is constructed. 

 The operation \texttt{SetRingProperties} is automatically invoked to set the ring properties. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );
  <A homalg internal ring>
  gap> Display( ZZ );
  Z
  gap> Z256 := ZZ / 2^8;
  <A homalg residue class ring>
  gap> Display( Z256 );
  Z/( 256 )
  gap> Z2 := Z256 / 6;
  <A homalg residue class ring>
  gap> Display( Z2 );
  Z/( 2 )
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Rings: Properties}}\label{Rings:Properties}
\logpage{[ 4, 3, 0 ]}
\hyperdef{L}{X7D171A1C797E27C9}{}
{
  The following properties are declared for \textsf{homalg} rings. Note that (apart from so-called true and immediate methods ($\to$ \ref{Rings:LIRNG})) there are no methods installed for ring properties. This means that if the
value of the ring property \texttt{Prop} is not set for a \textsf{homalg} ring \mbox{\texttt{\slshape R}}, then 

 \texttt{Prop}( \mbox{\texttt{\slshape R}} ); 

 will cause an error. One can use the usual \textsf{GAP4} mechanism to check if the value of the property is set or not 

 \texttt{HasProp}( \mbox{\texttt{\slshape R}} ); 

 If you discover that a specific property \texttt{Prop} is missing for a certain \textsf{homalg} ring \mbox{\texttt{\slshape R}} you can it add using the usual \textsf{GAP4} mechanism 

 \texttt{SetProp}( \mbox{\texttt{\slshape R}}, true ); 

 or 

 \texttt{SetProp}( \mbox{\texttt{\slshape R}}, false ); 

 Be very cautious with setting "missing" properties to \textsf{homalg} objects: If the value you set is mathematically wrong \textsf{homalg} will probably draw wrong conclusions and might return wrong results. 

\subsection{\textcolor{Chapter }{ContainsAField}}
\logpage{[ 4, 3, 1 ]}\nobreak
\hyperdef{L}{X84F3040687E68338}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ContainsAField({\slshape R})\index{ContainsAField@\texttt{ContainsAField}}
\label{ContainsAField}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsRationalsForHomalg}}
\logpage{[ 4, 3, 2 ]}\nobreak
\hyperdef{L}{X7C337D0F8413FE38}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsRationalsForHomalg({\slshape R})\index{IsRationalsForHomalg@\texttt{IsRationalsForHomalg}}
\label{IsRationalsForHomalg}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsFieldForHomalg}}
\logpage{[ 4, 3, 3 ]}\nobreak
\hyperdef{L}{X86221E0E8416F1CF}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsFieldForHomalg({\slshape R})\index{IsFieldForHomalg@\texttt{IsFieldForHomalg}}
\label{IsFieldForHomalg}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsDivisionRingForHomalg}}
\logpage{[ 4, 3, 4 ]}\nobreak
\hyperdef{L}{X805112347CF99F02}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsDivisionRingForHomalg({\slshape R})\index{IsDivisionRingForHomalg@\texttt{IsDivisionRingForHomalg}}
\label{IsDivisionRingForHomalg}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsIntegersForHomalg}}
\logpage{[ 4, 3, 5 ]}\nobreak
\hyperdef{L}{X799A9A9F7A26C6B2}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsIntegersForHomalg({\slshape R})\index{IsIntegersForHomalg@\texttt{IsIntegersForHomalg}}
\label{IsIntegersForHomalg}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsResidueClassRingOfTheIntegers}}
\logpage{[ 4, 3, 6 ]}\nobreak
\hyperdef{L}{X8548FE4E8283ACC6}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsResidueClassRingOfTheIntegers({\slshape R})\index{IsResidueClassRingOfTheIntegers@\texttt{IsResidueClassRingOfTheIntegers}}
\label{IsResidueClassRingOfTheIntegers}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

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



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsIntegrallyClosedDomain}}
\logpage{[ 4, 3, 8 ]}\nobreak
\hyperdef{L}{X79D8752F78215FC1}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsIntegrallyClosedDomain({\slshape R})\index{IsIntegrallyClosedDomain@\texttt{IsIntegrallyClosedDomain}}
\label{IsIntegrallyClosedDomain}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsUniqueFactorizationDomain}}
\logpage{[ 4, 3, 9 ]}\nobreak
\hyperdef{L}{X864BF29E7B5D3305}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsUniqueFactorizationDomain({\slshape R})\index{IsUniqueFactorizationDomain@\texttt{IsUniqueFactorizationDomain}}
\label{IsUniqueFactorizationDomain}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsKaplanskyHermite}}
\logpage{[ 4, 3, 10 ]}\nobreak
\hyperdef{L}{X86EF914787EB5572}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsKaplanskyHermite({\slshape R})\index{IsKaplanskyHermite@\texttt{IsKaplanskyHermite}}
\label{IsKaplanskyHermite}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsDedekindDomain}}
\logpage{[ 4, 3, 11 ]}\nobreak
\hyperdef{L}{X86C625EF7E417AA6}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsDedekindDomain({\slshape R})\index{IsDedekindDomain@\texttt{IsDedekindDomain}}
\label{IsDedekindDomain}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsDiscreteValuationRing}}
\logpage{[ 4, 3, 12 ]}\nobreak
\hyperdef{L}{X855E560A7F40B2BF}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsDiscreteValuationRing({\slshape R})\index{IsDiscreteValuationRing@\texttt{IsDiscreteValuationRing}}
\label{IsDiscreteValuationRing}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsFreePolynomialRing}}
\logpage{[ 4, 3, 13 ]}\nobreak
\hyperdef{L}{X80E0C8B28039B8F0}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsFreePolynomialRing({\slshape R})\index{IsFreePolynomialRing@\texttt{IsFreePolynomialRing}}
\label{IsFreePolynomialRing}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsWeylRing}}
\logpage{[ 4, 3, 14 ]}\nobreak
\hyperdef{L}{X850A0EAB7E017D5E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsWeylRing({\slshape R})\index{IsWeylRing@\texttt{IsWeylRing}}
\label{IsWeylRing}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsGlobalDimensionFinite}}
\logpage{[ 4, 3, 15 ]}\nobreak
\hyperdef{L}{X86558C9F8474DA39}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsGlobalDimensionFinite({\slshape R})\index{IsGlobalDimensionFinite@\texttt{IsGlobalDimensionFinite}}
\label{IsGlobalDimensionFinite}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsLeftGlobalDimensionFinite}}
\logpage{[ 4, 3, 16 ]}\nobreak
\hyperdef{L}{X7AE1C7297A66F116}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsLeftGlobalDimensionFinite({\slshape R})\index{IsLeftGlobalDimensionFinite@\texttt{IsLeftGlobalDimensionFinite}}
\label{IsLeftGlobalDimensionFinite}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsRightGlobalDimensionFinite}}
\logpage{[ 4, 3, 17 ]}\nobreak
\hyperdef{L}{X799A94467B8EC416}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsRightGlobalDimensionFinite({\slshape R})\index{IsRightGlobalDimensionFinite@\texttt{IsRightGlobalDimensionFinite}}
\label{IsRightGlobalDimensionFinite}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{HasInvariantBasisProperty}}
\logpage{[ 4, 3, 18 ]}\nobreak
\hyperdef{L}{X81269E1881D45163}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HasInvariantBasisProperty({\slshape R})\index{HasInvariantBasisProperty@\texttt{HasInvariantBasisProperty}}
\label{HasInvariantBasisProperty}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{HasLeftInvariantBasisProperty}}
\logpage{[ 4, 3, 19 ]}\nobreak
\hyperdef{L}{X861F184E7A3A52FF}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HasLeftInvariantBasisProperty({\slshape R})\index{HasLeftInvariantBasisProperty@\texttt{HasLeftInvariantBasisProperty}}
\label{HasLeftInvariantBasisProperty}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{HasRightInvariantBasisProperty}}
\logpage{[ 4, 3, 20 ]}\nobreak
\hyperdef{L}{X79BFFE0E7BD69A95}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HasRightInvariantBasisProperty({\slshape R})\index{HasRightInvariantBasisProperty@\texttt{HasRightInvariantBasisProperty}}
\label{HasRightInvariantBasisProperty}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsLocalRing}}
\logpage{[ 4, 3, 21 ]}\nobreak
\hyperdef{L}{X7B37F8E185604257}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsLocalRing({\slshape R})\index{IsLocalRing@\texttt{IsLocalRing}}
\label{IsLocalRing}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsSemiLocalRing}}
\logpage{[ 4, 3, 22 ]}\nobreak
\hyperdef{L}{X7AAF0A3178E23B09}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsSemiLocalRing({\slshape R})\index{IsSemiLocalRing@\texttt{IsSemiLocalRing}}
\label{IsSemiLocalRing}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsIntegralDomain}}
\logpage{[ 4, 3, 23 ]}\nobreak
\hyperdef{L}{X7EE2F1C187131E19}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsIntegralDomain({\slshape R})\index{IsIntegralDomain@\texttt{IsIntegralDomain}}
\label{IsIntegralDomain}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsHereditary}}
\logpage{[ 4, 3, 24 ]}\nobreak
\hyperdef{L}{X7FEB8A337CC92955}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHereditary({\slshape R})\index{IsHereditary@\texttt{IsHereditary}}
\label{IsHereditary}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsLeftHereditary}}
\logpage{[ 4, 3, 25 ]}\nobreak
\hyperdef{L}{X7D4AC0177C6D85A8}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsLeftHereditary({\slshape R})\index{IsLeftHereditary@\texttt{IsLeftHereditary}}
\label{IsLeftHereditary}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsRightHereditary}}
\logpage{[ 4, 3, 26 ]}\nobreak
\hyperdef{L}{X7DE025D781FEBD04}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsRightHereditary({\slshape R})\index{IsRightHereditary@\texttt{IsRightHereditary}}
\label{IsRightHereditary}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsHermite}}
\logpage{[ 4, 3, 27 ]}\nobreak
\hyperdef{L}{X783ACC147A7F82AA}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHermite({\slshape R})\index{IsHermite@\texttt{IsHermite}}
\label{IsHermite}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsLeftHermite}}
\logpage{[ 4, 3, 28 ]}\nobreak
\hyperdef{L}{X7A33BCFE7B6C6817}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsLeftHermite({\slshape R})\index{IsLeftHermite@\texttt{IsLeftHermite}}
\label{IsLeftHermite}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsRightHermite}}
\logpage{[ 4, 3, 29 ]}\nobreak
\hyperdef{L}{X830989817DC97403}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsRightHermite({\slshape R})\index{IsRightHermite@\texttt{IsRightHermite}}
\label{IsRightHermite}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsNoetherian}}
\logpage{[ 4, 3, 30 ]}\nobreak
\hyperdef{L}{X7AA2911E802BE73D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsNoetherian({\slshape R})\index{IsNoetherian@\texttt{IsNoetherian}}
\label{IsNoetherian}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsLeftNoetherian}}
\logpage{[ 4, 3, 31 ]}\nobreak
\hyperdef{L}{X7803DB3A7E6689B6}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsLeftNoetherian({\slshape R})\index{IsLeftNoetherian@\texttt{IsLeftNoetherian}}
\label{IsLeftNoetherian}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsRightNoetherian}}
\logpage{[ 4, 3, 32 ]}\nobreak
\hyperdef{L}{X78A93EFA7B677CED}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsRightNoetherian({\slshape R})\index{IsRightNoetherian@\texttt{IsRightNoetherian}}
\label{IsRightNoetherian}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsArtinian (for rings)}}
\logpage{[ 4, 3, 33 ]}\nobreak
\hyperdef{L}{X7AF81F6383F5CFCA}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsArtinian({\slshape R})\index{IsArtinian@\texttt{IsArtinian}!for rings}
\label{IsArtinian:for rings}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsLeftArtinian}}
\logpage{[ 4, 3, 34 ]}\nobreak
\hyperdef{L}{X7E000F5780A17602}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsLeftArtinian({\slshape R})\index{IsLeftArtinian@\texttt{IsLeftArtinian}}
\label{IsLeftArtinian}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsRightArtinian}}
\logpage{[ 4, 3, 35 ]}\nobreak
\hyperdef{L}{X7C34A319827FFDDB}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsRightArtinian({\slshape R})\index{IsRightArtinian@\texttt{IsRightArtinian}}
\label{IsRightArtinian}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsOreDomain}}
\logpage{[ 4, 3, 36 ]}\nobreak
\hyperdef{L}{X8290570679F86CE8}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsOreDomain({\slshape R})\index{IsOreDomain@\texttt{IsOreDomain}}
\label{IsOreDomain}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsLeftOreDomain}}
\logpage{[ 4, 3, 37 ]}\nobreak
\hyperdef{L}{X8528CA397BC76826}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsLeftOreDomain({\slshape R})\index{IsLeftOreDomain@\texttt{IsLeftOreDomain}}
\label{IsLeftOreDomain}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsRightOreDomain}}
\logpage{[ 4, 3, 38 ]}\nobreak
\hyperdef{L}{X7FC7E8317BF9B9CE}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsRightOreDomain({\slshape R})\index{IsRightOreDomain@\texttt{IsRightOreDomain}}
\label{IsRightOreDomain}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsPrincipalIdealRing}}
\logpage{[ 4, 3, 39 ]}\nobreak
\hyperdef{L}{X85F1485F840E2354}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsPrincipalIdealRing({\slshape R})\index{IsPrincipalIdealRing@\texttt{IsPrincipalIdealRing}}
\label{IsPrincipalIdealRing}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsLeftPrincipalIdealRing}}
\logpage{[ 4, 3, 40 ]}\nobreak
\hyperdef{L}{X7BF4EFB67DCEBF6D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsLeftPrincipalIdealRing({\slshape R})\index{IsLeftPrincipalIdealRing@\texttt{IsLeftPrincipalIdealRing}}
\label{IsLeftPrincipalIdealRing}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsRightPrincipalIdealRing}}
\logpage{[ 4, 3, 41 ]}\nobreak
\hyperdef{L}{X83858198873F7760}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsRightPrincipalIdealRing({\slshape R})\index{IsRightPrincipalIdealRing@\texttt{IsRightPrincipalIdealRing}}
\label{IsRightPrincipalIdealRing}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsRegular}}
\logpage{[ 4, 3, 42 ]}\nobreak
\hyperdef{L}{X7CF02C4785F0EAB5}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsRegular({\slshape R})\index{IsRegular@\texttt{IsRegular}}
\label{IsRegular}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsFiniteFreePresentationRing}}
\logpage{[ 4, 3, 43 ]}\nobreak
\hyperdef{L}{X7FB92D467B9B6707}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsFiniteFreePresentationRing({\slshape R})\index{IsFiniteFreePresentationRing@\texttt{IsFiniteFreePresentationRing}}
\label{IsFiniteFreePresentationRing}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsLeftFiniteFreePresentationRing}}
\logpage{[ 4, 3, 44 ]}\nobreak
\hyperdef{L}{X7B0EE3BF8402793B}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsLeftFiniteFreePresentationRing({\slshape R})\index{IsLeftFiniteFreePresentationRing@\texttt{IsLeftFiniteFreePresentationRing}}
\label{IsLeftFiniteFreePresentationRing}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsRightFiniteFreePresentationRing}}
\logpage{[ 4, 3, 45 ]}\nobreak
\hyperdef{L}{X839A82AC7D0D7BA1}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsRightFiniteFreePresentationRing({\slshape R})\index{IsRightFiniteFreePresentationRing@\texttt{IsRightFiniteFreePresentationRing}}
\label{IsRightFiniteFreePresentationRing}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsSimpleRing}}
\logpage{[ 4, 3, 46 ]}\nobreak
\hyperdef{L}{X8491CBBE862D4FFB}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsSimpleRing({\slshape R})\index{IsSimpleRing@\texttt{IsSimpleRing}}
\label{IsSimpleRing}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsSemiSimpleRing}}
\logpage{[ 4, 3, 47 ]}\nobreak
\hyperdef{L}{X847DEBCF872F5175}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsSemiSimpleRing({\slshape R})\index{IsSemiSimpleRing@\texttt{IsSemiSimpleRing}}
\label{IsSemiSimpleRing}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{BasisAlgorithmRespectsPrincipalIdeals}}
\logpage{[ 4, 3, 48 ]}\nobreak
\hyperdef{L}{X803259617B5F89AE}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{BasisAlgorithmRespectsPrincipalIdeals({\slshape R})\index{BasisAlgorithmRespectsPrincipalIdeals@\texttt{BasisAlgorithmRespectsPrincipalIdeals}}
\label{BasisAlgorithmRespectsPrincipalIdeals}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape R}} is a ring for \textsf{homalg}. }

 

\subsection{\textcolor{Chapter }{IsMinusOne}}
\logpage{[ 4, 3, 49 ]}\nobreak
\hyperdef{L}{X85B6710082984863}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsMinusOne({\slshape r})\index{IsMinusOne@\texttt{IsMinusOne}}
\label{IsMinusOne}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape r}} is a \textsf{homalg} ring element. }

 }

 
\section{\textcolor{Chapter }{Rings: Attributes}}\label{Rings:Attributes}
\logpage{[ 4, 4, 0 ]}
\hyperdef{L}{X867290E7847A5101}{}
{
  

\subsection{\textcolor{Chapter }{Zero (for homalg ring elements)}}
\logpage{[ 4, 4, 1 ]}\nobreak
\hyperdef{L}{X8783ADB9834BF934}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Zero({\slshape r})\index{Zero@\texttt{Zero}!for homalg ring elements}
\label{Zero:for homalg ring elements}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
the zero of the \textsf{homalg} ring element \mbox{\texttt{\slshape r}}

}

 

\subsection{\textcolor{Chapter }{One (for homalg ring elements)}}
\logpage{[ 4, 4, 2 ]}\nobreak
\hyperdef{L}{X788A1E947DA7F8C8}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{One({\slshape r})\index{One@\texttt{One}!for homalg ring elements}
\label{One:for homalg ring elements}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
the one of the \textsf{homalg} ring element \mbox{\texttt{\slshape r}}

}

 

\subsection{\textcolor{Chapter }{homalgTable}}
\logpage{[ 4, 4, 3 ]}\nobreak
\hyperdef{L}{X7AFD26D480AA9323}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{homalgTable({\slshape R})\index{homalgTable@\texttt{homalgTable}}
\label{homalgTable}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} table



 The \textsf{homalg} table of \mbox{\texttt{\slshape R}} is a ring dictionary, i.e. the translator between \textsf{homalg} and the (specific implementation of the) ring. 

 Every \textsf{homalg} ring has a \textsf{homalg} table. }

 

\subsection{\textcolor{Chapter }{RingElementConstructor}}
\logpage{[ 4, 4, 4 ]}\nobreak
\hyperdef{L}{X816D807781E8F854}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{RingElementConstructor({\slshape R})\index{RingElementConstructor@\texttt{RingElementConstructor}}
\label{RingElementConstructor}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a function



 The constructor of ring elements in the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. }

 

\subsection{\textcolor{Chapter }{TypeOfHomalgMatrix}}
\logpage{[ 4, 4, 5 ]}\nobreak
\hyperdef{L}{X7E5426C67AA9A6E5}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{TypeOfHomalgMatrix({\slshape R})\index{TypeOfHomalgMatrix@\texttt{TypeOfHomalgMatrix}}
\label{TypeOfHomalgMatrix}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a type



 The \textsf{GAP4}-type of \textsf{homalg} matrices over the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. }

 

\subsection{\textcolor{Chapter }{ConstructorForHomalgMatrices}}
\logpage{[ 4, 4, 6 ]}\nobreak
\hyperdef{L}{X80504BE983BD1A70}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ConstructorForHomalgMatrices({\slshape R})\index{ConstructorForHomalgMatrices@\texttt{ConstructorForHomalgMatrices}}
\label{ConstructorForHomalgMatrices}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a type



 The constructor for \textsf{homalg} matrices over the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. }

 

\subsection{\textcolor{Chapter }{Zero (for homalg rings)}}
\logpage{[ 4, 4, 7 ]}\nobreak
\hyperdef{L}{X799B5F797F809EE5}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Zero({\slshape R})\index{Zero@\texttt{Zero}!for homalg rings}
\label{Zero:for homalg rings}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
the zero of the \textsf{homalg} ring \mbox{\texttt{\slshape R}}

}

 

\subsection{\textcolor{Chapter }{One (for homalg rings)}}
\logpage{[ 4, 4, 8 ]}\nobreak
\hyperdef{L}{X84701329860750C3}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{One({\slshape R})\index{One@\texttt{One}!for homalg rings}
\label{One:for homalg rings}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
the one of the \textsf{homalg} ring \mbox{\texttt{\slshape R}}

}

 

\subsection{\textcolor{Chapter }{MinusOne}}
\logpage{[ 4, 4, 9 ]}\nobreak
\hyperdef{L}{X810D03AA827BD128}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{MinusOne({\slshape R})\index{MinusOne@\texttt{MinusOne}}
\label{MinusOne}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
the minus one of the \textsf{homalg} ring \mbox{\texttt{\slshape R}}

}

 

\subsection{\textcolor{Chapter }{IndeterminatesOfPolynomialRing}}
\logpage{[ 4, 4, 10 ]}\nobreak
\hyperdef{L}{X80D585E1793D4552}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IndeterminatesOfPolynomialRing({\slshape R})\index{IndeterminatesOfPolynomialRing@\texttt{IndeterminatesOfPolynomialRing}}
\label{IndeterminatesOfPolynomialRing}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list of \textsf{homalg} ring elements



 The list of indeterminates of the \textsf{homalg} polynomial ring \mbox{\texttt{\slshape R}}. }

 

\subsection{\textcolor{Chapter }{IndeterminateCoordinatesOfRingOfDerivations}}
\logpage{[ 4, 4, 11 ]}\nobreak
\hyperdef{L}{X7F4A050A87C042E5}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IndeterminateCoordinatesOfRingOfDerivations({\slshape R})\index{IndeterminateCoordinatesOfRingOfDerivations@\texttt{Indeterminate}\-\texttt{Coordinates}\-\texttt{Of}\-\texttt{Ring}\-\texttt{Of}\-\texttt{Derivations}}
\label{IndeterminateCoordinatesOfRingOfDerivations}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list of \textsf{homalg} ring elements



 The list of indeterminate coordinates of the \textsf{homalg} Weyl ring \mbox{\texttt{\slshape R}}. }

 

\subsection{\textcolor{Chapter }{IndeterminateDerivationsOfRingOfDerivations}}
\logpage{[ 4, 4, 12 ]}\nobreak
\hyperdef{L}{X78776EBA7DC179B4}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IndeterminateDerivationsOfRingOfDerivations({\slshape R})\index{IndeterminateDerivationsOfRingOfDerivations@\texttt{Indeterminate}\-\texttt{Derivations}\-\texttt{Of}\-\texttt{Ring}\-\texttt{Of}\-\texttt{Derivations}}
\label{IndeterminateDerivationsOfRingOfDerivations}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list of \textsf{homalg} ring elements



 The list of indeterminate derivations of the \textsf{homalg} Weyl ring \mbox{\texttt{\slshape R}}. }

 

\subsection{\textcolor{Chapter }{IndeterminateAntiCommutingVariablesOfExteriorRing}}
\logpage{[ 4, 4, 13 ]}\nobreak
\hyperdef{L}{X7C15E6647945C0E3}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IndeterminateAntiCommutingVariablesOfExteriorRing({\slshape R})\index{IndeterminateAntiCommutingVariablesOfExteriorRing@\texttt{Indeterminate}\-\texttt{Anti}\-\texttt{Commuting}\-\texttt{Variables}\-\texttt{Of}\-\texttt{Exterior}\-\texttt{Ring}}
\label{IndeterminateAntiCommutingVariablesOfExteriorRing}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list of \textsf{homalg} ring elements



 The list of anti-commuting indeterminates of the \textsf{homalg} exterior ring \mbox{\texttt{\slshape R}}. }

 

\subsection{\textcolor{Chapter }{IndeterminatesOfExteriorRing}}
\logpage{[ 4, 4, 14 ]}\nobreak
\hyperdef{L}{X7BBEF7097B459D33}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IndeterminatesOfExteriorRing({\slshape R})\index{IndeterminatesOfExteriorRing@\texttt{IndeterminatesOfExteriorRing}}
\label{IndeterminatesOfExteriorRing}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list of \textsf{homalg} ring elements



 The list of all indeterminates (commuting and anti-commuting) of the \textsf{homalg} exterior ring \mbox{\texttt{\slshape R}}. }

 

\subsection{\textcolor{Chapter }{WeightsOfIndeterminates}}
\logpage{[ 4, 4, 15 ]}\nobreak
\hyperdef{L}{X7E43637F8431FB69}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{WeightsOfIndeterminates({\slshape R})\index{WeightsOfIndeterminates@\texttt{WeightsOfIndeterminates}}
\label{WeightsOfIndeterminates}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list or listlist of integers



 The list of degrees of the indeterminates of the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. }

 

\subsection{\textcolor{Chapter }{MatrixOfWeightsOfIndeterminates}}
\logpage{[ 4, 4, 16 ]}\nobreak
\hyperdef{L}{X84279B6179DD4AE2}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{MatrixOfWeightsOfIndeterminates({\slshape R})\index{MatrixOfWeightsOfIndeterminates@\texttt{MatrixOfWeightsOfIndeterminates}}
\label{MatrixOfWeightsOfIndeterminates}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 A \textsf{homalg} matrix where the list (or listlist) of degrees of the indeterminates of the \textsf{homalg} ring \mbox{\texttt{\slshape R}} is stored. }

 

\subsection{\textcolor{Chapter }{CoefficientsRing}}
\logpage{[ 4, 4, 17 ]}\nobreak
\hyperdef{L}{X8235D10781BE8003}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CoefficientsRing({\slshape R})\index{CoefficientsRing@\texttt{CoefficientsRing}}
\label{CoefficientsRing}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring



 The ring of coefficients of the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. }

 

\subsection{\textcolor{Chapter }{KrullDimension}}
\logpage{[ 4, 4, 18 ]}\nobreak
\hyperdef{L}{X789CF8B778A0C58D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{KrullDimension({\slshape R})\index{KrullDimension@\texttt{KrullDimension}}
\label{KrullDimension}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a non-negative integer



 The Krull dimension of the commutative \textsf{homalg} ring \mbox{\texttt{\slshape R}}. }

 

\subsection{\textcolor{Chapter }{LeftGlobalDimension}}
\logpage{[ 4, 4, 19 ]}\nobreak
\hyperdef{L}{X8735C56B7BEBC86E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{LeftGlobalDimension({\slshape R})\index{LeftGlobalDimension@\texttt{LeftGlobalDimension}}
\label{LeftGlobalDimension}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a non-negative integer



 The left global dimension of the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. }

 

\subsection{\textcolor{Chapter }{RightGlobalDimension}}
\logpage{[ 4, 4, 20 ]}\nobreak
\hyperdef{L}{X7E6C5B5781EF78C5}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{RightGlobalDimension({\slshape R})\index{RightGlobalDimension@\texttt{RightGlobalDimension}}
\label{RightGlobalDimension}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a non-negative integer



 The right global dimension of the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. }

 

\subsection{\textcolor{Chapter }{GlobalDimension}}
\logpage{[ 4, 4, 21 ]}\nobreak
\hyperdef{L}{X7D511B3E7A50AB2A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{GlobalDimension({\slshape R})\index{GlobalDimension@\texttt{GlobalDimension}}
\label{GlobalDimension}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a non-negative integer



 The global dimension of the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. The global dimension is defined, only if the left and right global
dimensions coincide. }

 

\subsection{\textcolor{Chapter }{GeneralLinearRank}}
\logpage{[ 4, 4, 22 ]}\nobreak
\hyperdef{L}{X792D56C278E346B1}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{GeneralLinearRank({\slshape R})\index{GeneralLinearRank@\texttt{GeneralLinearRank}}
\label{GeneralLinearRank}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a non-negative integer



 The general linear rank of the \textsf{homalg} ring \mbox{\texttt{\slshape R}} (\cite{McCRob}, 11.1.14). }

 

\subsection{\textcolor{Chapter }{ElementaryRank}}
\logpage{[ 4, 4, 23 ]}\nobreak
\hyperdef{L}{X79BCB23D873268CB}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ElementaryRank({\slshape R})\index{ElementaryRank@\texttt{ElementaryRank}}
\label{ElementaryRank}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a non-negative integer



 The elementary rank of the \textsf{homalg} ring \mbox{\texttt{\slshape R}} (\cite{McCRob}, 11.3.10). }

 

\subsection{\textcolor{Chapter }{StableRank}}
\logpage{[ 4, 4, 24 ]}\nobreak
\hyperdef{L}{X822907CB7919EEF2}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{StableRank({\slshape R})\index{StableRank@\texttt{StableRank}}
\label{StableRank}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a non-negative integer



 The stable rank of the \textsf{homalg} ring \mbox{\texttt{\slshape R}} (\cite{McCRob}, 11.3.4). }

 }

 
\section{\textcolor{Chapter }{Rings: Operations and Functions}}\label{Rings:Operations}
\logpage{[ 4, 5, 0 ]}
\hyperdef{L}{X7DDAB86C7A7FEDA9}{}
{
  }

  }

   
\chapter{\textcolor{Chapter }{Ring Maps}}\label{RingMaps}
\logpage{[ 5, 0, 0 ]}
\hyperdef{L}{X7B222197819984A6}{}
{
  A \textsf{homalg} ring map is a data structure for maps between finitely generated rings. \textsf{homalg} more or less provides the basic declarations and installs the generic methods
for ring maps, but it is up to other high level packages to install methods
applicable to specific rings. For example, the package \textsf{Sheaves} provides methods for ring maps of (finitely generated) affine rings. 
\section{\textcolor{Chapter }{Ring Maps: Category and Representations}}\label{RingMaps:}
\logpage{[ 5, 1, 0 ]}
\hyperdef{L}{X7B99B8F5780E84C3}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgRingMap}}
\logpage{[ 5, 1, 1 ]}\nobreak
\hyperdef{L}{X7E084D947E3AEFE6}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgRingMap({\slshape phi})\index{IsHomalgRingMap@\texttt{IsHomalgRingMap}}
\label{IsHomalgRingMap}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



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

 

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



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

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

 

\subsection{\textcolor{Chapter }{IsHomalgRingMapRep}}
\logpage{[ 5, 1, 3 ]}\nobreak
\hyperdef{L}{X7DFD1CBA83E63737}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgRingMapRep({\slshape phi})\index{IsHomalgRingMapRep@\texttt{IsHomalgRingMapRep}}
\label{IsHomalgRingMapRep}
}\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{IsHomalgRingMap} (\ref{IsHomalgRingMap}).) }

 }

 
\section{\textcolor{Chapter }{Ring Maps: Constructors}}\label{RingMaps:Constructors}
\logpage{[ 5, 2, 0 ]}
\hyperdef{L}{X8717AEFB7BAC63F7}{}
{
  

\subsection{\textcolor{Chapter }{RingMap (constructor for ring maps)}}
\logpage{[ 5, 2, 1 ]}\nobreak
\hyperdef{L}{X7F21AB318507FF83}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{RingMap({\slshape images, S, T})\index{RingMap@\texttt{RingMap}!constructor for ring maps}
\label{RingMap:constructor for ring maps}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring map



 This constructor returns a ring map (homomorphism) of finitely generated
rings/algebras. It is represented by the images \mbox{\texttt{\slshape images}} of the set of generators of the source \textsf{homalg} ring \mbox{\texttt{\slshape S}} in terms of the generators of the target ring \mbox{\texttt{\slshape T}} ($\to$ \ref{Rings:Constructors}). Unless the source ring is free \emph{and} given on free ring/algebra 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} (\ref{IsMorphism:for ring maps}). If source and target are identical objects, and only then, the ring map is
created as a selfmap. }

 }

 
\section{\textcolor{Chapter }{Ring Maps: Properties}}\label{RingMaps:Properties}
\logpage{[ 5, 3, 0 ]}
\hyperdef{L}{X85DA972D8701BC7C}{}
{
  

\subsection{\textcolor{Chapter }{IsMorphism (for ring maps)}}
\logpage{[ 5, 3, 1 ]}\nobreak
\hyperdef{L}{X8555A4DF84C9165B}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsMorphism({\slshape phi})\index{IsMorphism@\texttt{IsMorphism}!for ring maps}
\label{IsMorphism:for ring maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if \mbox{\texttt{\slshape phi}} is a well-defined map, i.e. independent of all involved presentations. }

 

\subsection{\textcolor{Chapter }{IsIdentityMorphism (for ring maps)}}
\logpage{[ 5, 3, 2 ]}\nobreak
\hyperdef{L}{X832893897FD3744D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsIdentityMorphism({\slshape phi})\index{IsIdentityMorphism@\texttt{IsIdentityMorphism}!for ring maps}
\label{IsIdentityMorphism:for ring maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} ring map \mbox{\texttt{\slshape phi}} is the identity morphism. }

 

\subsection{\textcolor{Chapter }{IsMonomorphism (for ring maps)}}
\logpage{[ 5, 3, 3 ]}\nobreak
\hyperdef{L}{X87F79EA381E3E34F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsMonomorphism({\slshape phi})\index{IsMonomorphism@\texttt{IsMonomorphism}!for ring maps}
\label{IsMonomorphism:for ring maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} ring map \mbox{\texttt{\slshape phi}} is a monomorphism. }

 

\subsection{\textcolor{Chapter }{IsEpimorphism (for ring maps)}}
\logpage{[ 5, 3, 4 ]}\nobreak
\hyperdef{L}{X849F620C824F4078}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsEpimorphism({\slshape phi})\index{IsEpimorphism@\texttt{IsEpimorphism}!for ring maps}
\label{IsEpimorphism:for ring maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} ring map \mbox{\texttt{\slshape phi}} is an epimorphism. }

 

\subsection{\textcolor{Chapter }{IsIsomorphism (for ring maps)}}
\logpage{[ 5, 3, 5 ]}\nobreak
\hyperdef{L}{X82B9422D7B01BA4A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsIsomorphism({\slshape phi})\index{IsIsomorphism@\texttt{IsIsomorphism}!for ring maps}
\label{IsIsomorphism:for ring maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} ring map \mbox{\texttt{\slshape phi}} is an isomorphism. }

 

\subsection{\textcolor{Chapter }{IsAutomorphism (for ring maps)}}
\logpage{[ 5, 3, 6 ]}\nobreak
\hyperdef{L}{X790E34C5802D0F54}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsAutomorphism({\slshape phi})\index{IsAutomorphism@\texttt{IsAutomorphism}!for ring maps}
\label{IsAutomorphism:for ring maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} ring map \mbox{\texttt{\slshape phi}} is an automorphism. }

 }

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

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



 The source of the \textsf{homalg} ring map \mbox{\texttt{\slshape phi}}. }

 

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



 The target (range) of the \textsf{homalg} ring map \mbox{\texttt{\slshape phi}}. }

 

\subsection{\textcolor{Chapter }{DegreeOfMorphism (for ring maps)}}
\logpage{[ 5, 4, 3 ]}\nobreak
\hyperdef{L}{X7C4F3F0F82C6EB88}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DegreeOfMorphism({\slshape phi})\index{DegreeOfMorphism@\texttt{DegreeOfMorphism}!for ring maps}
\label{DegreeOfMorphism:for ring maps}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
an integer



 The degree of the morphism \mbox{\texttt{\slshape phi}} of graded rings. \\
 (no method installed) }

 

\subsection{\textcolor{Chapter }{CoordinateRingOfGraph (for ring maps)}}
\logpage{[ 5, 4, 4 ]}\nobreak
\hyperdef{L}{X785155EE844A98BD}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CoordinateRingOfGraph({\slshape phi})\index{CoordinateRingOfGraph@\texttt{CoordinateRingOfGraph}!for ring maps}
\label{CoordinateRingOfGraph:for ring maps}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring



 The coordinate ring of the graph of the ring map \mbox{\texttt{\slshape phi}}. }

 

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



 The kernel ideal of the ring map \mbox{\texttt{\slshape phi}} (as a submodule). }

 

\subsection{\textcolor{Chapter }{KernelEmb (for ring maps)}}
\logpage{[ 5, 4, 6 ]}\nobreak
\hyperdef{L}{X82AE604486F48FC4}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{KernelEmb({\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{\slshape phi}}$)$ into the \texttt{Source}$($\mbox{\texttt{\slshape phi}}$)$, both viewed as modules over the ring $R := $\texttt{Source}$($\mbox{\texttt{\slshape phi}}$)$ (cf. \texttt{Kernel} (\ref{Kernel:for ring maps})). }

 }

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

\subsection{\textcolor{Chapter }{Kernel (for ring maps)}}
\logpage{[ 5, 5, 1 ]}\nobreak
\hyperdef{L}{X870F43DE7DDD85A3}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Kernel({\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{\slshape phi}} as an abstract module. }

 }

  }

   
\chapter{\textcolor{Chapter }{Matrices}}\label{Matrices}
\logpage{[ 6, 0, 0 ]}
\hyperdef{L}{X812CCAB278643A59}{}
{
  
\section{\textcolor{Chapter }{Matrices: Category and Representations}}\label{Matrices:Category}
\logpage{[ 6, 1, 0 ]}
\hyperdef{L}{X78C552687FF14479}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgMatrix}}
\logpage{[ 6, 1, 1 ]}\nobreak
\hyperdef{L}{X7B68E1057F5F011F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgMatrix({\slshape A})\index{IsHomalgMatrix@\texttt{IsHomalgMatrix}}
\label{IsHomalgMatrix}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



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

 

\subsection{\textcolor{Chapter }{IsHomalgInternalMatrixRep}}
\logpage{[ 6, 1, 2 ]}\nobreak
\hyperdef{L}{X7FE94FC47F460E35}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgInternalMatrixRep({\slshape A})\index{IsHomalgInternalMatrixRep@\texttt{IsHomalgInternalMatrixRep}}
\label{IsHomalgInternalMatrixRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The internal representation of \textsf{homalg} matrices. 

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

 }

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

\subsection{\textcolor{Chapter }{HomalgInitialMatrix (constructor for initial matrices filled with zeros)}}
\logpage{[ 6, 2, 1 ]}\nobreak
\hyperdef{L}{X86D290B084AC6638}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgInitialMatrix({\slshape m, n, R})\index{HomalgInitialMatrix@\texttt{HomalgInitialMatrix}!constructor for initial matrices filled with zeros}
\label{HomalgInitialMatrix:constructor for initial matrices filled with zeros}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 A mutable unevaluated initial $\mbox{\texttt{\slshape m}} \times \mbox{\texttt{\slshape n}}$ \textsf{homalg} matrix filled with zeros over the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. This construction is useful in case one wants to define a matrix by
assigning its nonzero entries. Avoid asking about properties or attributes of
the matrix until you finish filling it, since already computed values of
properties and attributes will be cached and not recomputed unless the values
are explicitly reset ($\to$ \texttt{ResetFilterObj} (\textbf{Prg Tutorial: ResetFilterObj})). 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );
  <A homalg internal ring>
  gap> z := HomalgInitialMatrix( 2, 3, ZZ );
  <An initial homalg internal 2 by 3 matrix>
  gap> HasIsZero( z );
  false
  gap> IsZero( z );
  true
  gap> z;
  <A homalg internal 2 by 3 zero matrix>
\end{Verbatim}
 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> n := HomalgInitialMatrix( 2, 3, ZZ );
  <An initial homalg internal 2 by 3 matrix>
  gap> SetEntryOfHomalgMatrix( n, 1, 1, "1" );
  gap> SetEntryOfHomalgMatrix( n, 2, 3, "1" );
  gap> ResetFilterObj( n, IsMutableMatrix );
  gap> Display( n );
  [ [  1,  0,  0 ],
    [  0,  0,  1 ] ]
  gap> IsZero( n );
  false
  gap> n;
  <A non-zero homalg internal 2 by 3 matrix>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgInitialIdentityMatrix (constructor for initial quadratic matrices with ones on the diagonal)}}
\logpage{[ 6, 2, 2 ]}\nobreak
\hyperdef{L}{X7CB77009868D369A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgInitialIdentityMatrix({\slshape m, R})\index{HomalgInitialIdentityMatrix@\texttt{HomalgInitialIdentityMatrix}!constructor for initial quadratic matrices with ones on the diagonal}
\label{HomalgInitialIdentityMatrix:constructor for initial quadratic matrices with ones on the diagonal}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 A mutable unevaluated initial $\mbox{\texttt{\slshape m}} \times \mbox{\texttt{\slshape m}}$ \textsf{homalg} quadratic matrix with ones on the diagonal over the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. This construction is useful in case one wants to define an elementary matrix
by assigning its off-diagonal nonzero entries. Avoid asking about properties
or attributes of the matrix until you finish filling it, since already
computed values of properties and attributes will be cached and not recomputed
unless the values are explicitly reset ($\to$ \texttt{ResetFilterObj} (\textbf{Prg Tutorial: ResetFilterObj})). 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );
  <A homalg internal ring>
  gap> id := HomalgInitialIdentityMatrix( 3, ZZ );
  <An initial identity homalg internal 3 by 3 matrix>
  gap> HasIsIdentityMatrix( id );
  false
  gap> IsIdentityMatrix( id );
  true
  gap> id;
  <A homalg internal 3 by 3 identity matrix>
\end{Verbatim}
 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> e := HomalgInitialIdentityMatrix( 3, ZZ );
  <An initial identity homalg internal 3 by 3 matrix>
  gap> SetEntryOfHomalgMatrix( e, 1, 2, "1" );
  gap> SetEntryOfHomalgMatrix( e, 2, 1, "-1" );
  gap> ResetFilterObj( e, IsMutableMatrix );
  gap> Display( e );
  [ [   1,   1,   0 ],
    [  -1,   1,   0 ],
    [   0,   0,   1 ] ]
  gap> IsIdentityMatrix( e );
  false
  gap> e;
  <A homalg internal 3 by 3 matrix>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgZeroMatrix (constructor for zero matrices)}}
\logpage{[ 6, 2, 3 ]}\nobreak
\hyperdef{L}{X8309EB7B86953A23}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgZeroMatrix({\slshape m, n, R})\index{HomalgZeroMatrix@\texttt{HomalgZeroMatrix}!constructor for zero matrices}
\label{HomalgZeroMatrix:constructor for zero matrices}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 An immutable unevaluated $\mbox{\texttt{\slshape m}} \times \mbox{\texttt{\slshape n}}$ \textsf{homalg} zero matrix over the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );
  <A homalg internal ring>
  gap> z := HomalgZeroMatrix( 2, 3, ZZ );
  <An unevaluated homalg internal 2 by 3 zero matrix>
  gap> Display( z );
  [ [  0,  0,  0 ],
    [  0,  0,  0 ] ]
  gap> z;
  <A homalg internal 2 by 3 zero matrix>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgIdentityMatrix (constructor for identity matrices)}}
\logpage{[ 6, 2, 4 ]}\nobreak
\hyperdef{L}{X83266B9D7BE740D8}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgIdentityMatrix({\slshape m, R})\index{HomalgIdentityMatrix@\texttt{HomalgIdentityMatrix}!constructor for identity matrices}
\label{HomalgIdentityMatrix:constructor for identity matrices}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 An immutable unevaluated $\mbox{\texttt{\slshape m}} \times \mbox{\texttt{\slshape m}}$ \textsf{homalg} identity matrix over the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );
  <A homalg internal ring>
  gap> id := HomalgIdentityMatrix( 3, ZZ );
  <An unevaluated homalg internal 3 by 3 identity matrix>
  gap> Display( id );
  [ [  1,  0,  0 ],
    [  0,  1,  0 ],
    [  0,  0,  1 ] ]
  gap> id;
  <A homalg internal 3 by 3 identity matrix>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgVoidMatrix (constructor for void matrices)}}
\logpage{[ 6, 2, 5 ]}\nobreak
\hyperdef{L}{X7D2E3472879E28AB}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgVoidMatrix({\slshape [m, ][n, ]R})\index{HomalgVoidMatrix@\texttt{HomalgVoidMatrix}!constructor for void matrices}
\label{HomalgVoidMatrix:constructor for void matrices}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 A void $\mbox{\texttt{\slshape m}} \times \mbox{\texttt{\slshape n}}$ \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{HomalgMatrix (constructor for matrices using a listlist)}}
\logpage{[ 6, 2, 6 ]}\nobreak
\hyperdef{L}{X864ACCB08094F0B7}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgMatrix({\slshape llist, R})\index{HomalgMatrix@\texttt{HomalgMatrix}!constructor for matrices using a listlist}
\label{HomalgMatrix:constructor for matrices using a listlist}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgMatrix({\slshape list, m, n, R})\index{HomalgMatrix@\texttt{HomalgMatrix}!constructor for matrices using a list}
\label{HomalgMatrix:constructor for matrices using a list}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgMatrix({\slshape str{\textunderscore}llist, R})\index{HomalgMatrix@\texttt{HomalgMatrix}!constructor for matrices using a string of a listlist}
\label{HomalgMatrix:constructor for matrices using a string of a listlist}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgMatrix({\slshape str{\textunderscore}list, m, n, R})\index{HomalgMatrix@\texttt{HomalgMatrix}!constructor for matrices using a string of a list}
\label{HomalgMatrix:constructor for matrices using a string of a list}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 An immutable evaluated $\mbox{\texttt{\slshape m}} \times \mbox{\texttt{\slshape n}}$ \textsf{homalg} matrix over the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );
  <A homalg internal ring>
  gap> m := HomalgMatrix( [ [ 1, 2, 3 ], [ 4, 5, 6 ] ], ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> Display( m );
  [ [  1,  2,  3 ],
    [  4,  5,  6 ] ]
\end{Verbatim}
 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> m := HomalgMatrix( [ [ 1, 2, 3 ], [ 4, 5, 6 ] ], 2, 3, ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> Display( m );
  [ [  1,  2,  3 ],
    [  4,  5,  6 ] ]
\end{Verbatim}
 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> m := HomalgMatrix( [ 1, 2, 3,   4, 5, 6 ], 2, 3, ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> Display( m );
  [ [  1,  2,  3 ],
    [  4,  5,  6 ] ]
\end{Verbatim}
 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> m := HomalgMatrix( "[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]", ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> Display( m );
  [ [  1,  2,  3 ],
    [  4,  5,  6 ] ]
\end{Verbatim}
 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> m := HomalgMatrix( "[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]", 2, 3, ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> Display( m );
  [ [  1,  2,  3 ],
    [  4,  5,  6 ] ]
\end{Verbatim}
 It is nevertheless recommended to use the following form to create \textsf{homalg} matrices. This form can also be used to define external matrices. Since
whitespaces ($\to$  \textbf{Reference: Whitespaces}) are ignored, they can be used as optical delimiters: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> m := HomalgMatrix( "[ 1, 2, 3,   4, 5, 6 ]", 2, 3, ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> Display( m );
  [ [  1,  2,  3 ],
    [  4,  5,  6 ] ]
\end{Verbatim}
 One can split the input string over several lines using the backslash
character '\texttt{\symbol{92}}' to end each line 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> m := HomalgMatrix( "[ \
  > 1, 2, 3, \
  > 4, 5, 6  \
  > ]", 2, 3, ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> Display( m );
  [ [  1,  2,  3 ],
    [  4,  5,  6 ] ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgDiagonalMatrix (constructor for diagonal matrices)}}
\logpage{[ 6, 2, 7 ]}\nobreak
\hyperdef{L}{X872D39C678D0C4AE}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgDiagonalMatrix({\slshape diag, R})\index{HomalgDiagonalMatrix@\texttt{HomalgDiagonalMatrix}!constructor for diagonal matrices}
\label{HomalgDiagonalMatrix:constructor for diagonal matrices}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 An immutable unevaluated diagonal \textsf{homalg} matrix over the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. The diagonal consists of the entries of the list \mbox{\texttt{\slshape diag}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );
  <A homalg internal ring>
  gap> d := HomalgDiagonalMatrix( [ 1, 2, 3 ], ZZ );
  <An unevaluated diagonal homalg internal 3 by 3 matrix>
  gap> Display( d );
  [ [  1,  0,  0 ],
    [  0,  2,  0 ],
    [  0,  0,  3 ] ]
  gap> d;
  <A diagonal homalg internal 3 by 3 matrix>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{\texttt{\symbol{92}}* (copy a matrix over a different ring)}}
\logpage{[ 6, 2, 8 ]}\nobreak
\hyperdef{L}{X816710097AE09F35}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{\texttt{\symbol{92}}*({\slshape R, mat})\index{*@\texttt{\texttt{\symbol{92}}*}!copy a matrix over a different ring}
\label{*:copy a matrix over a different ring}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{\texttt{\symbol{92}}*({\slshape mat, R})\index{*@\texttt{\texttt{\symbol{92}}*}!copy a matrix over a different ring (right)}
\label{*:copy a matrix over a different ring (right)}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 An immutable evaluated \textsf{homalg} matrix over the \textsf{homalg} ring \mbox{\texttt{\slshape R}} having the same entries as the matrix \mbox{\texttt{\slshape mat}}. Syntax: \mbox{\texttt{\slshape R}} \texttt{*} \mbox{\texttt{\slshape mat}} or \mbox{\texttt{\slshape mat}} \texttt{*} \mbox{\texttt{\slshape R}} 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );
  <A homalg internal ring>
  gap> Z4 := ZZ / 4;
  <A homalg residue class ring>
  gap> Display( Z4 );
  Z/( 4 )
  gap> d := HomalgDiagonalMatrix( [ 2 .. 4 ], ZZ );
  <An unevaluated diagonal homalg internal 3 by 3 matrix>
  gap> d2 := Z4 * d; ## or d2 := d * Z4;
  <A homalg residue class 3 by 3 matrix>
  gap> Display( d2 );
  [ [  2,  0,  0 ],
    [  0,  3,  0 ],
    [  0,  0,  4 ] ]
  
  modulo [ 4 ]
  gap> d;
  <A diagonal homalg internal 3 by 3 matrix>
  gap> ZeroRows( d );
  [  ]
  gap> ZeroRows( d2 );
  [ 3 ]
  gap> d;
  <A non-zero diagonal homalg internal 3 by 3 matrix>
  gap> d2;
  <A non-zero homalg residue class 3 by 3 matrix>
\end{Verbatim}
 }

 }

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

\subsection{\textcolor{Chapter }{IsZero (for matrices)}}
\logpage{[ 6, 3, 1 ]}\nobreak
\hyperdef{L}{X858B5AF57D5BC90A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsZero({\slshape A})\index{IsZero@\texttt{IsZero}!for matrices}
\label{IsZero:for matrices}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} matrix \mbox{\texttt{\slshape A}} is a zero matrix, taking possible ring relations into account.

 (for the installed standard method see \texttt{IsZeroMatrix} (\ref{IsZeroMatrix:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );
  <A homalg internal ring>
  gap> A := HomalgMatrix( "[ 2 ]", ZZ );
  <A homalg internal 1 by 1 matrix>
  gap> Z2 := ZZ / 2;
  <A homalg residue class ring>
  gap> A := Z2 * A;
  <A homalg residue class 1 by 1 matrix>
  gap> Display( A );
  [ [  2 ] ]
  
  modulo [ 2 ]
  gap> IsZero( A );
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsIdentityMatrix}}
\logpage{[ 6, 3, 2 ]}\nobreak
\hyperdef{L}{X7DCC769487777A6D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsIdentityMatrix({\slshape A})\index{IsIdentityMatrix@\texttt{IsIdentityMatrix}}
\label{IsIdentityMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} matrix \mbox{\texttt{\slshape A}} is an identity matrix, taking possible ring relations into account.

 (for the installed standard method see \texttt{IsIdentityMatrix} (\ref{IsIdentityMatrix:homalgTable entry})) }

 

\subsection{\textcolor{Chapter }{IsPermutationMatrix}}
\logpage{[ 6, 3, 3 ]}\nobreak
\hyperdef{L}{X8612CB4A82D6D79E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsPermutationMatrix({\slshape A})\index{IsPermutationMatrix@\texttt{IsPermutationMatrix}}
\label{IsPermutationMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsSpecialSubidentityMatrix}}
\logpage{[ 6, 3, 4 ]}\nobreak
\hyperdef{L}{X7EEE3E9780EBA607}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsSpecialSubidentityMatrix({\slshape A})\index{IsSpecialSubidentityMatrix@\texttt{IsSpecialSubidentityMatrix}}
\label{IsSpecialSubidentityMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsSubidentityMatrix}}
\logpage{[ 6, 3, 5 ]}\nobreak
\hyperdef{L}{X8672364D79EBCC5D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsSubidentityMatrix({\slshape A})\index{IsSubidentityMatrix@\texttt{IsSubidentityMatrix}}
\label{IsSubidentityMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsLeftRegularMatrix}}
\logpage{[ 6, 3, 6 ]}\nobreak
\hyperdef{L}{X7F745DBF7D65D3C1}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsLeftRegularMatrix({\slshape A})\index{IsLeftRegularMatrix@\texttt{IsLeftRegularMatrix}}
\label{IsLeftRegularMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsRightRegularMatrix}}
\logpage{[ 6, 3, 7 ]}\nobreak
\hyperdef{L}{X7D56A51C878261FE}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsRightRegularMatrix({\slshape A})\index{IsRightRegularMatrix@\texttt{IsRightRegularMatrix}}
\label{IsRightRegularMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsInvertibleMatrix}}
\logpage{[ 6, 3, 8 ]}\nobreak
\hyperdef{L}{X856E1D217A47EE8C}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsInvertibleMatrix({\slshape A})\index{IsInvertibleMatrix@\texttt{IsInvertibleMatrix}}
\label{IsInvertibleMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsLeftInvertibleMatrix}}
\logpage{[ 6, 3, 9 ]}\nobreak
\hyperdef{L}{X7A4FA27C80BC42D1}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsLeftInvertibleMatrix({\slshape A})\index{IsLeftInvertibleMatrix@\texttt{IsLeftInvertibleMatrix}}
\label{IsLeftInvertibleMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsRightInvertibleMatrix}}
\logpage{[ 6, 3, 10 ]}\nobreak
\hyperdef{L}{X7E43FDE57E8449B6}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsRightInvertibleMatrix({\slshape A})\index{IsRightInvertibleMatrix@\texttt{IsRightInvertibleMatrix}}
\label{IsRightInvertibleMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsEmptyMatrix}}
\logpage{[ 6, 3, 11 ]}\nobreak
\hyperdef{L}{X7BFC9266823F2C15}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsEmptyMatrix({\slshape A})\index{IsEmptyMatrix@\texttt{IsEmptyMatrix}}
\label{IsEmptyMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsDiagonalMatrix}}
\logpage{[ 6, 3, 12 ]}\nobreak
\hyperdef{L}{X7EEC8E768178696E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsDiagonalMatrix({\slshape A})\index{IsDiagonalMatrix@\texttt{IsDiagonalMatrix}}
\label{IsDiagonalMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} matrix \mbox{\texttt{\slshape A}} is an identity matrix, taking possible ring relations into account.

 (for the installed standard method see \texttt{IsDiagonalMatrix} (\ref{IsDiagonalMatrix:homalgTable entry})) }

 

\subsection{\textcolor{Chapter }{IsScalarlMatrix}}
\logpage{[ 6, 3, 13 ]}\nobreak
\hyperdef{L}{X8314460887FD9FE1}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsScalarlMatrix({\slshape A})\index{IsScalarlMatrix@\texttt{IsScalarlMatrix}}
\label{IsScalarlMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsUpperTriangularMatrix}}
\logpage{[ 6, 3, 14 ]}\nobreak
\hyperdef{L}{X8740E71C799C0BCC}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsUpperTriangularMatrix({\slshape A})\index{IsUpperTriangularMatrix@\texttt{IsUpperTriangularMatrix}}
\label{IsUpperTriangularMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsLowerTriangularMatrix}}
\logpage{[ 6, 3, 15 ]}\nobreak
\hyperdef{L}{X853A5B988306DBFE}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsLowerTriangularMatrix({\slshape A})\index{IsLowerTriangularMatrix@\texttt{IsLowerTriangularMatrix}}
\label{IsLowerTriangularMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsStrictUpperTriangularMatrix}}
\logpage{[ 6, 3, 16 ]}\nobreak
\hyperdef{L}{X7976C42B7FA905EC}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsStrictUpperTriangularMatrix({\slshape A})\index{IsStrictUpperTriangularMatrix@\texttt{IsStrictUpperTriangularMatrix}}
\label{IsStrictUpperTriangularMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsStrictLowerTriangularMatrix}}
\logpage{[ 6, 3, 17 ]}\nobreak
\hyperdef{L}{X7B0C78AF8056D650}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsStrictLowerTriangularMatrix({\slshape A})\index{IsStrictLowerTriangularMatrix@\texttt{IsStrictLowerTriangularMatrix}}
\label{IsStrictLowerTriangularMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsUpperStairCaseMatrix}}
\logpage{[ 6, 3, 18 ]}\nobreak
\hyperdef{L}{X81A2C3F67C99A3C2}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsUpperStairCaseMatrix({\slshape A})\index{IsUpperStairCaseMatrix@\texttt{IsUpperStairCaseMatrix}}
\label{IsUpperStairCaseMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsLowerStairCaseMatrix}}
\logpage{[ 6, 3, 19 ]}\nobreak
\hyperdef{L}{X7B3A5DE1860373F0}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsLowerStairCaseMatrix({\slshape A})\index{IsLowerStairCaseMatrix@\texttt{IsLowerStairCaseMatrix}}
\label{IsLowerStairCaseMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsTriangularMatrix}}
\logpage{[ 6, 3, 20 ]}\nobreak
\hyperdef{L}{X7BAAE75A8660D7A5}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsTriangularMatrix({\slshape A})\index{IsTriangularMatrix@\texttt{IsTriangularMatrix}}
\label{IsTriangularMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsBasisOfRowsMatrix}}
\logpage{[ 6, 3, 21 ]}\nobreak
\hyperdef{L}{X7F520F89821A8602}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsBasisOfRowsMatrix({\slshape A})\index{IsBasisOfRowsMatrix@\texttt{IsBasisOfRowsMatrix}}
\label{IsBasisOfRowsMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsBasisOfColumnsMatrix}}
\logpage{[ 6, 3, 22 ]}\nobreak
\hyperdef{L}{X7D46613983DC5302}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsBasisOfColumnsMatrix({\slshape A})\index{IsBasisOfColumnsMatrix@\texttt{IsBasisOfColumnsMatrix}}
\label{IsBasisOfColumnsMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsReducedBasisOfRowsMatrix}}
\logpage{[ 6, 3, 23 ]}\nobreak
\hyperdef{L}{X86445AD281024339}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsReducedBasisOfRowsMatrix({\slshape A})\index{IsReducedBasisOfRowsMatrix@\texttt{IsReducedBasisOfRowsMatrix}}
\label{IsReducedBasisOfRowsMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsReducedBasisOfColumnsMatrix}}
\logpage{[ 6, 3, 24 ]}\nobreak
\hyperdef{L}{X7E6BB540865C0344}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsReducedBasisOfColumnsMatrix({\slshape A})\index{IsReducedBasisOfColumnsMatrix@\texttt{IsReducedBasisOfColumnsMatrix}}
\label{IsReducedBasisOfColumnsMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsMutableMatrix}}
\logpage{[ 6, 3, 25 ]}\nobreak
\hyperdef{L}{X873FB3BC7FCF7FCD}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsMutableMatrix({\slshape A})\index{IsMutableMatrix@\texttt{IsMutableMatrix}}
\label{IsMutableMatrix}
}\hfill{\scriptsize (filter)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsInitialMatrix}}
\logpage{[ 6, 3, 26 ]}\nobreak
\hyperdef{L}{X7E6E51517822CB3F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsInitialMatrix({\slshape A})\index{IsInitialMatrix@\texttt{IsInitialMatrix}}
\label{IsInitialMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsInitialIdentityMatrix}}
\logpage{[ 6, 3, 27 ]}\nobreak
\hyperdef{L}{X7EE624707ACEC26E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsInitialIdentityMatrix({\slshape A})\index{IsInitialIdentityMatrix@\texttt{IsInitialIdentityMatrix}}
\label{IsInitialIdentityMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{IsVoidMatrix}}
\logpage{[ 6, 3, 28 ]}\nobreak
\hyperdef{L}{X802794217F56DE51}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsVoidMatrix({\slshape A})\index{IsVoidMatrix@\texttt{IsVoidMatrix}}
\label{IsVoidMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 \mbox{\texttt{\slshape A}} is a \textsf{homalg} matrix. }

 }

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

\subsection{\textcolor{Chapter }{NrRows}}
\logpage{[ 6, 4, 1 ]}\nobreak
\hyperdef{L}{X7AAEA5B1875BEE2D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{NrRows({\slshape A})\index{NrRows@\texttt{NrRows}}
\label{NrRows}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a nonnegative integer



 The number of rows of the matrix \mbox{\texttt{\slshape A}}.

 (for the installed standard method see \texttt{NrRows} (\ref{NrRows:homalgTable entry})) }

 

\subsection{\textcolor{Chapter }{NrColumns}}
\logpage{[ 6, 4, 2 ]}\nobreak
\hyperdef{L}{X781766A47B5D41AD}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{NrColumns({\slshape A})\index{NrColumns@\texttt{NrColumns}}
\label{NrColumns}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a nonnegative integer



 The number of columns of the matrix \mbox{\texttt{\slshape A}}.

 (for the installed standard method see \texttt{NrColumns} (\ref{NrColumns:homalgTable entry})) }

 

\subsection{\textcolor{Chapter }{DeterminantMat}}
\logpage{[ 6, 4, 3 ]}\nobreak
\hyperdef{L}{X83045F6F82C180E1}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DeterminantMat({\slshape A})\index{DeterminantMat@\texttt{DeterminantMat}}
\label{DeterminantMat}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a ring element



 The determinant of the quadratic matrix \mbox{\texttt{\slshape A}}.

 You can invoke it with \texttt{Determinant}( \mbox{\texttt{\slshape A}} ).

 (for the installed standard method see \texttt{Determinant} (\ref{Determinant:homalgTable entry})) }

 

\subsection{\textcolor{Chapter }{ZeroRows}}
\logpage{[ 6, 4, 4 ]}\nobreak
\hyperdef{L}{X828225E0857B1FDA}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ZeroRows({\slshape A})\index{ZeroRows@\texttt{ZeroRows}}
\label{ZeroRows}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a (possibly empty) list of positive integers



 The list of zero rows of the matrix \mbox{\texttt{\slshape A}}. 

 (for the installed standard method see \texttt{ZeroRows} (\ref{ZeroRows:homalgTable entry})) }

 

\subsection{\textcolor{Chapter }{ZeroColumns}}
\logpage{[ 6, 4, 5 ]}\nobreak
\hyperdef{L}{X870D761F7AB96D12}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ZeroColumns({\slshape A})\index{ZeroColumns@\texttt{ZeroColumns}}
\label{ZeroColumns}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a (possibly empty) list of positive integers



 The list of zero columns of the matrix \mbox{\texttt{\slshape A}}. 

 (for the installed standard method see \texttt{ZeroColumns} (\ref{ZeroColumns:homalgTable entry})) }

 

\subsection{\textcolor{Chapter }{NonZeroRows}}
\logpage{[ 6, 4, 6 ]}\nobreak
\hyperdef{L}{X7991ED337C73065A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{NonZeroRows({\slshape A})\index{NonZeroRows@\texttt{NonZeroRows}}
\label{NonZeroRows}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a (possibly empty) list of positive integers



 The list of nonzero rows of the matrix \mbox{\texttt{\slshape A}}. }

 

\subsection{\textcolor{Chapter }{NonZeroColumns}}
\logpage{[ 6, 4, 7 ]}\nobreak
\hyperdef{L}{X7F335DCB7B8781E4}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{NonZeroColumns({\slshape A})\index{NonZeroColumns@\texttt{NonZeroColumns}}
\label{NonZeroColumns}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a (possibly empty) list of positive integers



 The list of nonzero columns of the matrix \mbox{\texttt{\slshape A}}. }

 

\subsection{\textcolor{Chapter }{PositionOfFirstNonZeroEntryPerRow}}
\logpage{[ 6, 4, 8 ]}\nobreak
\hyperdef{L}{X7B7A073D7E1FAEA4}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{PositionOfFirstNonZeroEntryPerRow({\slshape A})\index{PositionOfFirstNonZeroEntryPerRow@\texttt{PositionOfFirstNonZeroEntryPerRow}}
\label{PositionOfFirstNonZeroEntryPerRow}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list of nonnegative integers



 The list of positions of the first nonzero entry per row of the matrix \mbox{\texttt{\slshape A}}, else zero. }

 

\subsection{\textcolor{Chapter }{PositionOfFirstNonZeroEntryPerColumn}}
\logpage{[ 6, 4, 9 ]}\nobreak
\hyperdef{L}{X83B389A97A703E42}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{PositionOfFirstNonZeroEntryPerColumn({\slshape A})\index{PositionOfFirstNonZeroEntryPerColumn@\texttt{PositionOfFirstNonZeroEntryPerColumn}}
\label{PositionOfFirstNonZeroEntryPerColumn}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list of nonnegative integers



 The list of positions of the first nonzero entry per column of the matrix \mbox{\texttt{\slshape A}}, else zero. }

 

\subsection{\textcolor{Chapter }{DegreesOfEntries}}
\logpage{[ 6, 4, 10 ]}\nobreak
\hyperdef{L}{X8608086E82701204}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DegreesOfEntries({\slshape A})\index{DegreesOfEntries@\texttt{DegreesOfEntries}}
\label{DegreesOfEntries}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a listlist of degrees/multi-degrees



 The matrix of degrees of the matrix \mbox{\texttt{\slshape A}}.

 (for the installed standard method see \texttt{DegreesOfEntries} (\ref{DegreesOfEntries:homalgTable entry})) }

 

\subsection{\textcolor{Chapter }{RowRankOfMatrix}}
\logpage{[ 6, 4, 11 ]}\nobreak
\hyperdef{L}{X862841E68674FA2A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{RowRankOfMatrix({\slshape A})\index{RowRankOfMatrix@\texttt{RowRankOfMatrix}}
\label{RowRankOfMatrix}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a nonnegative integer



 The row rank of the matrix \mbox{\texttt{\slshape A}}. }

 

\subsection{\textcolor{Chapter }{ColumnRankOfMatrix}}
\logpage{[ 6, 4, 12 ]}\nobreak
\hyperdef{L}{X7C61862E81CABD51}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ColumnRankOfMatrix({\slshape A})\index{ColumnRankOfMatrix@\texttt{ColumnRankOfMatrix}}
\label{ColumnRankOfMatrix}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a nonnegative integer



 The column rank of the matrix \mbox{\texttt{\slshape A}}. }

 

\subsection{\textcolor{Chapter }{LeftInverse (for matrices)}}
\logpage{[ 6, 4, 13 ]}\nobreak
\hyperdef{L}{X7FBAA11B8008D936}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{LeftInverse({\slshape M})\index{LeftInverse@\texttt{LeftInverse}!for matrices}
\label{LeftInverse:for matrices}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 A (lazy evaluated) left inverse $C$ of the matrix \mbox{\texttt{\slshape M}}. If no left inverse exists then \texttt{Eval}( \mbox{\texttt{\slshape C}} ) $=$ \texttt{false}. ($\to$ \texttt{RightDivide} (\ref{RightDivide:for pairs of matrices})) 

 (for the installed standard method see \texttt{Eval} (\ref{Eval:for matrices created with LeftInverse})) }

 

\subsection{\textcolor{Chapter }{RightInverse (for matrices)}}
\logpage{[ 6, 4, 14 ]}\nobreak
\hyperdef{L}{X7AAD17D47839BCAE}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{RightInverse({\slshape M})\index{RightInverse@\texttt{RightInverse}!for matrices}
\label{RightInverse:for matrices}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 A (lazy evaluated) right inverse $C$ of the matrix \mbox{\texttt{\slshape M}}. If no right inverse exists then \texttt{Eval}( \mbox{\texttt{\slshape C}} ) $=$ \texttt{false}. ($\to$ \texttt{LeftDivide} (\ref{LeftDivide:for pairs of matrices})) 

 (for the installed standard method see \texttt{Eval} (\ref{Eval:for matrices created with RightInverse})) }

 }

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

\subsection{\textcolor{Chapter }{HomalgRing (for matrices)}}
\logpage{[ 6, 5, 1 ]}\nobreak
\hyperdef{L}{X81BBF79C79C3B6DF}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgRing({\slshape mat})\index{HomalgRing@\texttt{HomalgRing}!for matrices}
\label{HomalgRing:for matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring



 The \textsf{homalg} ring of the \textsf{homalg} matrix \mbox{\texttt{\slshape mat}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );
  <A homalg internal ring>
  gap> d := HomalgDiagonalMatrix( [ 2 .. 4 ], ZZ );
  <An unevaluated diagonal homalg internal 3 by 3 matrix>
  gap> R := HomalgRing( d );
  <A homalg internal ring>
  gap> IsIdenticalObj( R, ZZ );
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Involution (for matrices)}}
\logpage{[ 6, 5, 2 ]}\nobreak
\hyperdef{L}{X800FA81F7C42BFEA}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Involution({\slshape M})\index{Involution@\texttt{Involution}!for matrices}
\label{Involution:for matrices}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 The twisted transpose of the \textsf{homalg} matrix \mbox{\texttt{\slshape M}}.

 (for the installed standard method see \texttt{Eval} (\ref{Eval:for matrices created with Involution})) }

 

\subsection{\textcolor{Chapter }{CertainRows (for matrices)}}
\logpage{[ 6, 5, 3 ]}\nobreak
\hyperdef{L}{X7CF5CE79796001F6}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CertainRows({\slshape M, plist})\index{CertainRows@\texttt{CertainRows}!for matrices}
\label{CertainRows:for matrices}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 The matrix of which the $i$-th row is the $k$-th row of the \textsf{homalg} matrix \mbox{\texttt{\slshape M}}, where $k=$\mbox{\texttt{\slshape plist}}$[i]$.

 ($\to$ \texttt{Eval} (\ref{Eval:for matrices created with CertainRows})) }

 

\subsection{\textcolor{Chapter }{CertainColumns (for matrices)}}
\logpage{[ 6, 5, 4 ]}\nobreak
\hyperdef{L}{X8256AF2A840B19C4}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CertainColumns({\slshape M, plist})\index{CertainColumns@\texttt{CertainColumns}!for matrices}
\label{CertainColumns:for matrices}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 The matrix of which the $j$-th column is the $l$-th column of the \textsf{homalg} matrix \mbox{\texttt{\slshape M}}, where $l=$\mbox{\texttt{\slshape plist}}$[i]$.

 (for the installed standard method see \texttt{Eval} (\ref{Eval:for matrices created with CertainColumns})) }

 

\subsection{\textcolor{Chapter }{UnionOfRows (for matrices)}}
\logpage{[ 6, 5, 5 ]}\nobreak
\hyperdef{L}{X7BC803DA871ADD55}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{UnionOfRows({\slshape A, B})\index{UnionOfRows@\texttt{UnionOfRows}!for matrices}
\label{UnionOfRows:for matrices}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Stack the two \textsf{homalg} matrices \mbox{\texttt{\slshape A}} and \mbox{\texttt{\slshape B}}.

 (for the installed standard method see \texttt{Eval} (\ref{Eval:for matrices created with UnionOfRows})) }

 

\subsection{\textcolor{Chapter }{UnionOfColumns (for matrices)}}
\logpage{[ 6, 5, 6 ]}\nobreak
\hyperdef{L}{X7F5B3A427A71C567}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{UnionOfColumns({\slshape A, B})\index{UnionOfColumns@\texttt{UnionOfColumns}!for matrices}
\label{UnionOfColumns:for matrices}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Augment the two \textsf{homalg} matrices \mbox{\texttt{\slshape A}} and \mbox{\texttt{\slshape B}}.

 (for the installed standard method see \texttt{Eval} (\ref{Eval:for matrices created with UnionOfColumns})) }

 

\subsection{\textcolor{Chapter }{DiagMat (for matrices)}}
\logpage{[ 6, 5, 7 ]}\nobreak
\hyperdef{L}{X7F2AD04C86F82240}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DiagMat({\slshape list})\index{DiagMat@\texttt{DiagMat}!for matrices}
\label{DiagMat:for matrices}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Build the block diagonal matrix out of the \textsf{homalg} matrices listed in \mbox{\texttt{\slshape list}}. An error is issued if \mbox{\texttt{\slshape list}} is empty or if one of the arguments is not a \textsf{homalg} matrix.

 (for the installed standard method see \texttt{Eval} (\ref{Eval:for matrices created with DiagMat})) }

 

\subsection{\textcolor{Chapter }{KroneckerMat (for matrices)}}
\logpage{[ 6, 5, 8 ]}\nobreak
\hyperdef{L}{X7CDA5D848468A0AA}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{KroneckerMat({\slshape A, B})\index{KroneckerMat@\texttt{KroneckerMat}!for matrices}
\label{KroneckerMat:for matrices}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 The Kronecker (or tensor) product of the two \textsf{homalg} matrices \mbox{\texttt{\slshape A}} and \mbox{\texttt{\slshape B}}.

 (for the installed standard method see \texttt{Eval} (\ref{Eval:for matrices created with KroneckerMat})) }

 

\subsection{\textcolor{Chapter }{\texttt{\symbol{92}}* (for ring elements and matrices)}}
\logpage{[ 6, 5, 9 ]}\nobreak
\hyperdef{L}{X819535497EC6D00F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{\texttt{\symbol{92}}*({\slshape a, A})\index{*@\texttt{\texttt{\symbol{92}}*}!for ring elements and matrices}
\label{*:for ring elements and matrices}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 The product of the ring element \mbox{\texttt{\slshape a}} with the \textsf{homalg} matrix \mbox{\texttt{\slshape A}} (enter: \mbox{\texttt{\slshape a}} \texttt{*} \mbox{\texttt{\slshape A}};).

 (for the installed standard method see \texttt{Eval} (\ref{Eval:for matrices created with MulMat})) }

 

\subsection{\textcolor{Chapter }{\texttt{\symbol{92}}+ (for matrices)}}
\logpage{[ 6, 5, 10 ]}\nobreak
\hyperdef{L}{X87C773DA85B21ADF}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{\texttt{\symbol{92}}+({\slshape A, B})\index{+@\texttt{\texttt{\symbol{92}}+}!for matrices}
\label{+:for matrices}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 The sum of the two \textsf{homalg} matrices \mbox{\texttt{\slshape A}} and \mbox{\texttt{\slshape B}} (enter: \mbox{\texttt{\slshape A}} \texttt{+} \mbox{\texttt{\slshape B}};).

 (for the installed standard method see \texttt{Eval} (\ref{Eval:for matrices created with AddMat})) }

 

\subsection{\textcolor{Chapter }{\texttt{\symbol{92}}- (for matrices)}}
\logpage{[ 6, 5, 11 ]}\nobreak
\hyperdef{L}{X784B57617B24208C}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{\texttt{\symbol{92}}-({\slshape A, B})\index{-@\texttt{\texttt{\symbol{92}}-}!for matrices}
\label{-:for matrices}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 The difference of the two \textsf{homalg} matrices \mbox{\texttt{\slshape A}} and \mbox{\texttt{\slshape B}} (enter: \mbox{\texttt{\slshape A}} \texttt{-} \mbox{\texttt{\slshape B}};).

 (for the installed standard method see \texttt{Eval} (\ref{Eval:for matrices created with SubMat})) }

 

\subsection{\textcolor{Chapter }{\texttt{\symbol{92}}* (for composable matrices)}}
\logpage{[ 6, 5, 12 ]}\nobreak
\hyperdef{L}{X7E68B0B78407B7A9}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{\texttt{\symbol{92}}*({\slshape A, B})\index{*@\texttt{\texttt{\symbol{92}}*}!for composable matrices}
\label{*:for composable matrices}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 The matrix product of the two \textsf{homalg} matrices \mbox{\texttt{\slshape A}} and \mbox{\texttt{\slshape B}} (enter: \mbox{\texttt{\slshape A}} \texttt{*} \mbox{\texttt{\slshape B}};).

 (for the installed standard method see \texttt{Eval} (\ref{Eval:for matrices created with Compose})) }

 

\subsection{\textcolor{Chapter }{\texttt{\symbol{92}}= (for matrices)}}
\logpage{[ 6, 5, 13 ]}\nobreak
\hyperdef{L}{X78DDAA8180C8FE4F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{\texttt{\symbol{92}}=({\slshape A, B})\index{=@\texttt{\texttt{\symbol{92}}=}!for matrices}
\label{=:for matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} matrices \mbox{\texttt{\slshape A}} and \mbox{\texttt{\slshape B}} are equal (enter: \mbox{\texttt{\slshape A}} \texttt{=} \mbox{\texttt{\slshape B}};), taking possible ring relations into account.

 (for the installed standard method see \texttt{AreEqualMatrices} (\ref{AreEqualMatrices:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );
  <A homalg internal ring>
  gap> A := HomalgMatrix( "[ 1 ]", ZZ );
  <A homalg internal 1 by 1 matrix>
  gap> B := HomalgMatrix( "[ 3 ]", ZZ );
  <A homalg internal 1 by 1 matrix>
  gap> Z2 := ZZ / 2;
  <A homalg residue class ring>
  gap> A := Z2 * A;
  <A homalg residue class 1 by 1 matrix>
  gap> B := Z2 * B;
  <A homalg residue class 1 by 1 matrix>
  gap> Display( A );
  [ [  1 ] ]
  
  modulo [ 2 ]
  gap> Display( B );
  [ [  3 ] ]
  
  modulo [ 2 ]
  gap> A = B;
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{GetColumnIndependentUnitPositions (for matrices)}}
\logpage{[ 6, 5, 14 ]}\nobreak
\hyperdef{L}{X85887BBB86F0A08B}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{GetColumnIndependentUnitPositions({\slshape A, poslist})\index{GetColumnIndependentUnitPositions@\texttt{GetColumnIndependentUnitPositions}!for matrices}
\label{GetColumnIndependentUnitPositions:for matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a (possibly empty) list of pairs of positive integers



 The list of column independet unit position of the matrix \mbox{\texttt{\slshape A}}. We say that a unit \mbox{\texttt{\slshape A}}$[i,k]$ is column independet from the unit \mbox{\texttt{\slshape A}}$[l,j]$ if $i>l$ and \mbox{\texttt{\slshape A}}$[l,k]=0$. The rows are scanned from top to bottom and within each row the columns are
scanned from right to left searching for new units, column independent from
the preceding ones. If \mbox{\texttt{\slshape A}}$[i,k]$ is a new column independent unit then $[i,k]$ is added to the output list. If \mbox{\texttt{\slshape A}} has no units the empty list is returned.

 (for the installed standard method see \texttt{GetColumnIndependentUnitPositions} (\ref{GetColumnIndependentUnitPositions:homalgTable entry})) }

 

\subsection{\textcolor{Chapter }{GetRowIndependentUnitPositions (for matrices)}}
\logpage{[ 6, 5, 15 ]}\nobreak
\hyperdef{L}{X824AB44184DD63B0}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{GetRowIndependentUnitPositions({\slshape A, poslist})\index{GetRowIndependentUnitPositions@\texttt{GetRowIndependentUnitPositions}!for matrices}
\label{GetRowIndependentUnitPositions:for matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a (possibly empty) list of pairs of positive integers



 The list of row independet unit position of the matrix \mbox{\texttt{\slshape A}}. We say that a unit \mbox{\texttt{\slshape A}}$[k,j]$ is row independet from the unit \mbox{\texttt{\slshape A}}$[i,l]$ if $j>l$ and \mbox{\texttt{\slshape A}}$[k,l]=0$. The columns are scanned from left to right and within each column the rows
are scanned from bottom to top searching for new units, row independent from
the preceding ones. If \mbox{\texttt{\slshape A}}$[k,j]$ is a new row independent unit then $[j,k]$ (yes $[j,k]$) is added to the output list. If \mbox{\texttt{\slshape A}} has no units the empty list is returned.

 (for the installed standard method see \texttt{GetRowIndependentUnitPositions} (\ref{GetRowIndependentUnitPositions:homalgTable entry})) }

 

\subsection{\textcolor{Chapter }{GetUnitPosition (for matrices)}}
\logpage{[ 6, 5, 16 ]}\nobreak
\hyperdef{L}{X7A1969A17979FC49}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{GetUnitPosition({\slshape A, poslist})\index{GetUnitPosition@\texttt{GetUnitPosition}!for matrices}
\label{GetUnitPosition:for matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a (possibly empty) list of pairs of positive integers



 The position $[i,j]$ of the first unit \mbox{\texttt{\slshape A}}$[i,j]$ in the matrix \mbox{\texttt{\slshape A}}, where the rows are scanned from top to bottom and within each row the
columns are scanned from left to right. If \mbox{\texttt{\slshape A}}$[i,j]$ is the first occurrence of a unit then the position pair $[i,j]$ is returned. Otherwise \texttt{fail} is returned.

 (for the installed standard method see \texttt{GetUnitPosition} (\ref{GetUnitPosition:homalgTable entry})) }

 

\subsection{\textcolor{Chapter }{BasisOfRowModule (for matrices)}}
\logpage{[ 6, 5, 17 ]}\nobreak
\hyperdef{L}{X80ADBE0D82CC6E85}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{BasisOfRowModule({\slshape M})\index{BasisOfRowModule@\texttt{BasisOfRowModule}!for matrices}
\label{BasisOfRowModule:for matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Let $R$ be the ring over which \mbox{\texttt{\slshape M}} is defined ($R:=$\texttt{HomalgRing}( \mbox{\texttt{\slshape M}} )) and $S$ be the row span of \mbox{\texttt{\slshape M}}, i.e. the $R$-submodule of the free module $R^{(1 \times NrColumns( \mbox{\texttt{\slshape M}} ))}$ spanned by the rows of \mbox{\texttt{\slshape M}}. A solution to the ``submodule membership problem'' is an algorithm which can decide if an element $m$ in $R^{(1 \times NrColumns( \mbox{\texttt{\slshape M}} ))}$ is contained in $S$ or not. And exactly like the Gaussian (resp. Hermite) normal form when $R$ is a field (resp. principal ideal ring), the row span of the resulting matrix $B$ coincides with the row span $S$ of \mbox{\texttt{\slshape M}}, and computing $B$ is typically the first step of such an algorithm. ($\to$ Appendix \ref{homalg-Idea}) }

 

\subsection{\textcolor{Chapter }{BasisOfColumnModule (for matrices)}}
\logpage{[ 6, 5, 18 ]}\nobreak
\hyperdef{L}{X868CDA327D6C8DDC}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{BasisOfColumnModule({\slshape M})\index{BasisOfColumnModule@\texttt{BasisOfColumnModule}!for matrices}
\label{BasisOfColumnModule:for matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Let $R$ be the ring over which \mbox{\texttt{\slshape M}} is defined ($R:=$\texttt{HomalgRing}( \mbox{\texttt{\slshape M}} )) and $S$ be the column span of \mbox{\texttt{\slshape M}}, i.e. the $R$-submodule of the free module $R^{(NrRows( \mbox{\texttt{\slshape M}} ) \times 1)}$ spanned by the columns of \mbox{\texttt{\slshape M}}. A solution to the ``submodule membership problem'' is an algorithm which can decide if an element $m$ in $R^{(NrRows( \mbox{\texttt{\slshape M}} ) \times 1)}$ is contained in $S$ or not. And exactly like the Gaussian (resp. Hermite) normal form when $R$ is a field (resp. principal ideal ring), the column span of the resulting
matrix $B$ coincides with the column span $S$ of \mbox{\texttt{\slshape M}}, and computing $B$ is typically the first step of such an algorithm. ($\to$ Appendix \ref{homalg-Idea}) }

 

\subsection{\textcolor{Chapter }{DecideZeroRows (for pairs of matrices)}}
\logpage{[ 6, 5, 19 ]}\nobreak
\hyperdef{L}{X7F851EC7861170D1}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DecideZeroRows({\slshape A, B})\index{DecideZeroRows@\texttt{DecideZeroRows}!for pairs of matrices}
\label{DecideZeroRows:for pairs of matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Let \mbox{\texttt{\slshape A}} and \mbox{\texttt{\slshape B}} be matrices having the same number of columns and defined over the same ring $R$ ($:=$\texttt{HomalgRing}( \mbox{\texttt{\slshape A}} )) and $S$ be the row span of \mbox{\texttt{\slshape B}}, i.e. the $R$-submodule of the free module $R^{(1 \times NrColumns( \mbox{\texttt{\slshape B}} ))}$ spanned by the rows of \mbox{\texttt{\slshape B}}. The result is a matrix $C$ having the same shape as \mbox{\texttt{\slshape A}}, for which the $i$-th row $\mbox{\texttt{\slshape C}}^i$ is equivalent to the $i$-th row $\mbox{\texttt{\slshape A}}^i$ of \mbox{\texttt{\slshape A}} modulo $S$, i.e. $\mbox{\texttt{\slshape C}}^i-\mbox{\texttt{\slshape A}}^i$ is an element of the row span $S$ of \mbox{\texttt{\slshape B}}. Moreover, the row $\mbox{\texttt{\slshape C}}^i$ is zero, if and only if the row $\mbox{\texttt{\slshape A}}^i$ is an element of $S$. So \texttt{DecideZeroRows} decides which rows of \mbox{\texttt{\slshape A}} are zero modulo the rows of \mbox{\texttt{\slshape B}}. ($\to$ Appendix \ref{homalg-Idea}) }

 

\subsection{\textcolor{Chapter }{DecideZeroColumns (for pairs of matrices)}}
\logpage{[ 6, 5, 20 ]}\nobreak
\hyperdef{L}{X86C97DBB787BAD6D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DecideZeroColumns({\slshape A, B})\index{DecideZeroColumns@\texttt{DecideZeroColumns}!for pairs of matrices}
\label{DecideZeroColumns:for pairs of matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Let \mbox{\texttt{\slshape A}} and \mbox{\texttt{\slshape B}} be matrices having the same number of rows and defined over the same ring $R$ ($:=$\texttt{HomalgRing}( \mbox{\texttt{\slshape A}} )) and $S$ be the column span of \mbox{\texttt{\slshape B}}, i.e. the $R$-submodule of the free module $R^{(NrRows( \mbox{\texttt{\slshape B}} ) \times 1)}$ spanned by the columns of \mbox{\texttt{\slshape B}}. The result is a matrix $C$ having the same shape as \mbox{\texttt{\slshape A}}, for which the $i$-th column $\mbox{\texttt{\slshape C}}_i$ is equivalent to the $i$-th column $\mbox{\texttt{\slshape A}}_i$ of \mbox{\texttt{\slshape A}} modulo $S$, i.e. $\mbox{\texttt{\slshape C}}_i-\mbox{\texttt{\slshape A}}_i$ is an element of the column span $S$ of \mbox{\texttt{\slshape B}}. Moreover, the column $\mbox{\texttt{\slshape C}}_i$ is zero, if and only if the column $\mbox{\texttt{\slshape A}}_i$ is an element of $S$. So \texttt{DecideZeroColumns} decides which columns of \mbox{\texttt{\slshape A}} are zero modulo the columns of \mbox{\texttt{\slshape B}}. ($\to$ Appendix \ref{homalg-Idea}) }

 

\subsection{\textcolor{Chapter }{SyzygiesGeneratorsOfRows (for matrices)}}
\logpage{[ 6, 5, 21 ]}\nobreak
\hyperdef{L}{X86ECEA9B7A4AE578}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{SyzygiesGeneratorsOfRows({\slshape M})\index{SyzygiesGeneratorsOfRows@\texttt{SyzygiesGeneratorsOfRows}!for matrices}
\label{SyzygiesGeneratorsOfRows:for matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Let $R$ be the ring over which \mbox{\texttt{\slshape M}} is defined ($R:=$\texttt{HomalgRing}( \mbox{\texttt{\slshape M}} )). The matrix of row syzygies \texttt{SyzygiesGeneratorsOfRows}( \mbox{\texttt{\slshape M}} ) is a matrix whose rows span the left kernel of \mbox{\texttt{\slshape M}}, i.e. the $R$-submodule of the free module $R^{(1 \times NrRows( \mbox{\texttt{\slshape M}} ))}$ consisting of all rows $X$ satisfying $X\mbox{\texttt{\slshape M}}=0$. ($\to$ Appendix \ref{homalg-Idea}) }

 

\subsection{\textcolor{Chapter }{SyzygiesGeneratorsOfColumns (for matrices)}}
\logpage{[ 6, 5, 22 ]}\nobreak
\hyperdef{L}{X86504B757F6DC990}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{SyzygiesGeneratorsOfColumns({\slshape M})\index{SyzygiesGeneratorsOfColumns@\texttt{SyzygiesGeneratorsOfColumns}!for matrices}
\label{SyzygiesGeneratorsOfColumns:for matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Let $R$ be the ring over which \mbox{\texttt{\slshape M}} is defined ($R:=$\texttt{HomalgRing}( \mbox{\texttt{\slshape M}} )). The matrix of column syzygies \texttt{SyzygiesGeneratorsOfColumns}( \mbox{\texttt{\slshape M}} ) is a matrix whose columns span the right kernel of \mbox{\texttt{\slshape M}}, i.e. the $R$-submodule of the free module $R^{(NrColumns( \mbox{\texttt{\slshape M}} ) \times 1)}$ consisting of all columns $X$ satisfying $\mbox{\texttt{\slshape M}}X=0$. ($\to$ Appendix \ref{homalg-Idea}) }

 

\subsection{\textcolor{Chapter }{SyzygiesGeneratorsOfRows (for pairs of matrices)}}
\logpage{[ 6, 5, 23 ]}\nobreak
\hyperdef{L}{X84A93458804F16F6}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{SyzygiesGeneratorsOfRows({\slshape M, M2})\index{SyzygiesGeneratorsOfRows@\texttt{SyzygiesGeneratorsOfRows}!for pairs of matrices}
\label{SyzygiesGeneratorsOfRows:for pairs of matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Let $R$ be the ring over which \mbox{\texttt{\slshape M}} is defined ($R:=$\texttt{HomalgRing}( \mbox{\texttt{\slshape M}} )). The matrix of \emph{relative} row syzygies \texttt{SyzygiesGeneratorsOfRows}( \mbox{\texttt{\slshape M}}, \mbox{\texttt{\slshape M2}} ) is a matrix whose rows span the left kernel of \mbox{\texttt{\slshape M}} modulo \mbox{\texttt{\slshape M2}}, i.e. the $R$-submodule of the free module $R^{(1 \times NrRows( \mbox{\texttt{\slshape M}} ))}$ consisting of all rows $X$ satisfying $X\mbox{\texttt{\slshape M}}+Y\mbox{\texttt{\slshape M2}}=0$ for some row $Y \in R^{(1 \times NrRows( \mbox{\texttt{\slshape M2}} ))}$. ($\to$ Appendix \ref{homalg-Idea}) }

 

\subsection{\textcolor{Chapter }{SyzygiesGeneratorsOfColumns (for pairs of matrices)}}
\logpage{[ 6, 5, 24 ]}\nobreak
\hyperdef{L}{X7D3FC0CE7B63AAF1}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{SyzygiesGeneratorsOfColumns({\slshape M, M2})\index{SyzygiesGeneratorsOfColumns@\texttt{SyzygiesGeneratorsOfColumns}!for pairs of matrices}
\label{SyzygiesGeneratorsOfColumns:for pairs of matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Let $R$ be the ring over which \mbox{\texttt{\slshape M}} is defined ($R:=$\texttt{HomalgRing}( \mbox{\texttt{\slshape M}} )). The matrix of \emph{relative} column syzygies \texttt{SyzygiesGeneratorsOfColumns}( \mbox{\texttt{\slshape M}}, \mbox{\texttt{\slshape M2}} ) is a matrix whose columns span the right kernel of \mbox{\texttt{\slshape M}} modulo \mbox{\texttt{\slshape M2}}, i.e. the $R$-submodule of the free module $R^{(NrColumns( \mbox{\texttt{\slshape M}} ) \times 1)}$ consisting of all columns $X$ satisfying $\mbox{\texttt{\slshape M}}X+\mbox{\texttt{\slshape M2}}Y=0$ for some column $Y \in R^{(NrColumns( \mbox{\texttt{\slshape M2}} ) \times 1)}$. ($\to$ Appendix \ref{homalg-Idea}) }

 

\subsection{\textcolor{Chapter }{ReducedBasisOfRowModule (for matrices)}}
\logpage{[ 6, 5, 25 ]}\nobreak
\hyperdef{L}{X82E0FF517DC38040}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ReducedBasisOfRowModule({\slshape M})\index{ReducedBasisOfRowModule@\texttt{ReducedBasisOfRowModule}!for matrices}
\label{ReducedBasisOfRowModule:for matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Like \texttt{BasisOfRowModule}( \mbox{\texttt{\slshape M}} ) but where the matrix \texttt{SyzygiesGeneratorsOfRows}( \texttt{ReducedBasisOfRowModule}( \mbox{\texttt{\slshape M}} ) ) contains no units. This can easily be achieved starting from $B:=$\texttt{BasisOfRowModule}( \mbox{\texttt{\slshape M}} ) (and using \texttt{GetColumnIndependentUnitPositions} (\ref{GetColumnIndependentUnitPositions:for matrices}) applied to the matrix of row syzygies of $B$, etc). ($\to$ Appendix \ref{homalg-Idea}) }

 

\subsection{\textcolor{Chapter }{ReducedBasisOfColumnModule (for matrices)}}
\logpage{[ 6, 5, 26 ]}\nobreak
\hyperdef{L}{X84CED11F7A633BDA}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ReducedBasisOfColumnModule({\slshape M})\index{ReducedBasisOfColumnModule@\texttt{ReducedBasisOfColumnModule}!for matrices}
\label{ReducedBasisOfColumnModule:for matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Like \texttt{BasisOfColumnModule}( \mbox{\texttt{\slshape M}} ) but where the matrix \texttt{SyzygiesGeneratorsOfColumns}( \texttt{ReducedBasisOfColumnModule}( \mbox{\texttt{\slshape M}} ) ) contains no units. This can easily be achieved starting from $B:=$\texttt{BasisOfColumnModule}( \mbox{\texttt{\slshape M}} ) (and using \texttt{GetRowIndependentUnitPositions} (\ref{GetRowIndependentUnitPositions:for matrices}) applied to the matrix of column syzygies of $B$, etc.). ($\to$ Appendix \ref{homalg-Idea}) }

 

\subsection{\textcolor{Chapter }{ReducedSyzygiesGeneratorsOfRows (for matrices)}}
\logpage{[ 6, 5, 27 ]}\nobreak
\hyperdef{L}{X7DE458D67B9B85BF}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ReducedSyzygiesGeneratorsOfRows({\slshape M})\index{ReducedSyzygiesGeneratorsOfRows@\texttt{ReducedSyzygiesGeneratorsOfRows}!for matrices}
\label{ReducedSyzygiesGeneratorsOfRows:for matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Like \texttt{SyzygiesGeneratorsOfRows}( \mbox{\texttt{\slshape M}} ) but where the matrix \texttt{SyzygiesGeneratorsOfRows}( \texttt{ReducedSyzygiesGeneratorsOfRows}( \mbox{\texttt{\slshape M}} ) ) contains no units. This can easily be achieved starting from $C:=$\texttt{SyzygiesGeneratorsOfRows}( \mbox{\texttt{\slshape M}} ) (and using \texttt{GetColumnIndependentUnitPositions} (\ref{GetColumnIndependentUnitPositions:for matrices}) applied to the matrix of row syzygies of $C$, etc.). ($\to$ Appendix \ref{homalg-Idea}) }

 

\subsection{\textcolor{Chapter }{ReducedSyzygiesGeneratorsOfColumns (for matrices)}}
\logpage{[ 6, 5, 28 ]}\nobreak
\hyperdef{L}{X8699114D7A865C11}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ReducedSyzygiesGeneratorsOfColumns({\slshape M})\index{ReducedSyzygiesGeneratorsOfColumns@\texttt{ReducedSyzygiesGeneratorsOfColumns}!for matrices}
\label{ReducedSyzygiesGeneratorsOfColumns:for matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Like \texttt{SyzygiesGeneratorsOfColumns}( \mbox{\texttt{\slshape M}} ) but where the matrix \texttt{SyzygiesGeneratorsOfColumns}( \texttt{ReducedSyzygiesGeneratorsOfColumns}( \mbox{\texttt{\slshape M}} ) ) contains no units. This can easily be achieved starting from $C:=$\texttt{SyzygiesGeneratorsOfColumns}( \mbox{\texttt{\slshape M}} ) (and using \texttt{GetRowIndependentUnitPositions} (\ref{GetRowIndependentUnitPositions:for matrices}) applied to the matrix of column syzygies of $C$, etc.). ($\to$ Appendix \ref{homalg-Idea}) }

 

\subsection{\textcolor{Chapter }{BasisOfRowsCoeff (for matrices)}}
\logpage{[ 6, 5, 29 ]}\nobreak
\hyperdef{L}{X7D9DEC6081AF0003}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{BasisOfRowsCoeff({\slshape M, T})\index{BasisOfRowsCoeff@\texttt{BasisOfRowsCoeff}!for matrices}
\label{BasisOfRowsCoeff:for matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Returns $B:=$\texttt{BasisOfRowModule}( \mbox{\texttt{\slshape M}} ) and assigns the \emph{void} matrix \mbox{\texttt{\slshape T}} ($\to$ \texttt{HomalgVoidMatrix} (\ref{HomalgVoidMatrix:constructor for void matrices})) such that $B = \mbox{\texttt{\slshape T}} \mbox{\texttt{\slshape M}}$. ($\to$ Appendix \ref{homalg-Idea}) }

 

\subsection{\textcolor{Chapter }{BasisOfColumnsCoeff (for matrices)}}
\logpage{[ 6, 5, 30 ]}\nobreak
\hyperdef{L}{X7BBC885F7C24DEC2}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{BasisOfColumnsCoeff({\slshape M, T})\index{BasisOfColumnsCoeff@\texttt{BasisOfColumnsCoeff}!for matrices}
\label{BasisOfColumnsCoeff:for matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Returns $B:=$\texttt{BasisOfRowModule}( \mbox{\texttt{\slshape M}} ) and assigns the \emph{void} matrix \mbox{\texttt{\slshape T}} ($\to$ \texttt{HomalgVoidMatrix} (\ref{HomalgVoidMatrix:constructor for void matrices})) such that $B = \mbox{\texttt{\slshape M}} \mbox{\texttt{\slshape T}}$. ($\to$ Appendix \ref{homalg-Idea}) }

 

\subsection{\textcolor{Chapter }{DecideZeroRowsEffectively (for pairs of matrices)}}
\logpage{[ 6, 5, 31 ]}\nobreak
\hyperdef{L}{X8513963C84A9F8CB}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DecideZeroRowsEffectively({\slshape A, B, T})\index{DecideZeroRowsEffectively@\texttt{DecideZeroRowsEffectively}!for pairs of matrices}
\label{DecideZeroRowsEffectively:for pairs of matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Returns $M:=$\texttt{DecideZeroRows}( \mbox{\texttt{\slshape A}}, \mbox{\texttt{\slshape B}} ) and assigns the \emph{void} matrix \mbox{\texttt{\slshape T}} ($\to$ \texttt{HomalgVoidMatrix} (\ref{HomalgVoidMatrix:constructor for void matrices})) such that $M = \mbox{\texttt{\slshape A}} + \mbox{\texttt{\slshape T}}\mbox{\texttt{\slshape B}}$. ($\to$ Appendix \ref{homalg-Idea}) }

 

\subsection{\textcolor{Chapter }{DecideZeroColumnsEffectively (for pairs of matrices)}}
\logpage{[ 6, 5, 32 ]}\nobreak
\hyperdef{L}{X7A06BF7779830815}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DecideZeroColumnsEffectively({\slshape A, B, T})\index{DecideZeroColumnsEffectively@\texttt{DecideZeroColumnsEffectively}!for pairs of matrices}
\label{DecideZeroColumnsEffectively:for pairs of matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Returns $M:=$\texttt{DecideZeroColumns}( \mbox{\texttt{\slshape A}}, \mbox{\texttt{\slshape B}} ) and assigns the \emph{void} matrix \mbox{\texttt{\slshape T}} ($\to$ \texttt{HomalgVoidMatrix} (\ref{HomalgVoidMatrix:constructor for void matrices})) such that $M = \mbox{\texttt{\slshape A}} + \mbox{\texttt{\slshape B}}\mbox{\texttt{\slshape T}}$. ($\to$ Appendix \ref{homalg-Idea}) }

 

\subsection{\textcolor{Chapter }{BasisOfRows (for matrices)}}
\logpage{[ 6, 5, 33 ]}\nobreak
\hyperdef{L}{X81ABDA3E7D94C661}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{BasisOfRows({\slshape M})\index{BasisOfRows@\texttt{BasisOfRows}!for matrices}
\label{BasisOfRows:for matrices}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{BasisOfRows({\slshape M, T})\index{BasisOfRows@\texttt{BasisOfRows}!for pairs of matrices}
\label{BasisOfRows:for pairs of matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 With one argument it is a synonym of \texttt{BasisOfRowModule} (\ref{BasisOfRowModule:for matrices}). with two arguments it is a synonym of \texttt{BasisOfRowsCoeff} (\ref{BasisOfRowsCoeff:for matrices}). }

 

\subsection{\textcolor{Chapter }{BasisOfColumns (for matrices)}}
\logpage{[ 6, 5, 34 ]}\nobreak
\hyperdef{L}{X83A5B51980FFDE53}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{BasisOfColumns({\slshape M})\index{BasisOfColumns@\texttt{BasisOfColumns}!for matrices}
\label{BasisOfColumns:for matrices}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{BasisOfColumns({\slshape M, T})\index{BasisOfColumns@\texttt{BasisOfColumns}!for pairs of matrices}
\label{BasisOfColumns:for pairs of matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 With one argument it is a synonym of \texttt{BasisOfColumnModule} (\ref{BasisOfColumnModule:for matrices}). with two arguments it is a synonym of \texttt{BasisOfColumnsCoeff} (\ref{BasisOfColumnsCoeff:for matrices}). }

 

\subsection{\textcolor{Chapter }{DecideZero (for matrices and relations)}}
\logpage{[ 6, 5, 35 ]}\nobreak
\hyperdef{L}{X85C980288304B4AC}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DecideZero({\slshape mat, rel})\index{DecideZero@\texttt{DecideZero}!for matrices and relations}
\label{DecideZero:for matrices and relations}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( DecideZero,
          "for sets of relations of homalg modules",
          [ IsHomalgMatrix, IsHomalgRelations ],
          
    function( mat, rel )
      local rel_mat;
      
      rel_mat := MatrixOfRelations( BasisOfModule( rel ) );
      
      if IsHomalgRelationsOfLeftModule( rel ) then
          return DecideZeroRows( mat, rel_mat );
      else
          return DecideZeroColumns( mat, rel_mat );
      fi;
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{SyzygiesOfRows (for matrices)}}
\logpage{[ 6, 5, 36 ]}\nobreak
\hyperdef{L}{X86C93ABD857447F8}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{SyzygiesOfRows({\slshape M})\index{SyzygiesOfRows@\texttt{SyzygiesOfRows}!for matrices}
\label{SyzygiesOfRows:for matrices}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{SyzygiesOfRows({\slshape M, M2})\index{SyzygiesOfRows@\texttt{SyzygiesOfRows}!for pairs of matrices}
\label{SyzygiesOfRows:for pairs of matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 With one argument it is a synonym of \texttt{SyzygiesGeneratorsOfRows} (\ref{SyzygiesGeneratorsOfRows:for matrices}). with two arguments it is a synonym of \texttt{SyzygiesGeneratorsOfRows} (\ref{SyzygiesGeneratorsOfRows:for pairs of matrices}). }

 

\subsection{\textcolor{Chapter }{SyzygiesOfColumns (for matrices)}}
\logpage{[ 6, 5, 37 ]}\nobreak
\hyperdef{L}{X80325CAD7CE56F4F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{SyzygiesOfColumns({\slshape M})\index{SyzygiesOfColumns@\texttt{SyzygiesOfColumns}!for matrices}
\label{SyzygiesOfColumns:for matrices}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{SyzygiesOfColumns({\slshape M, M2})\index{SyzygiesOfColumns@\texttt{SyzygiesOfColumns}!for pairs of matrices}
\label{SyzygiesOfColumns:for pairs of matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 With one argument it is a synonym of \texttt{SyzygiesGeneratorsOfColumns} (\ref{SyzygiesGeneratorsOfColumns:for matrices}). with two arguments it is a synonym of \texttt{SyzygiesGeneratorsOfColumns} (\ref{SyzygiesGeneratorsOfColumns:for pairs of matrices}). }

 

\subsection{\textcolor{Chapter }{ReducedSyzygiesOfRows (for matrices)}}
\logpage{[ 6, 5, 38 ]}\nobreak
\hyperdef{L}{X86A798D4850BF9E8}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ReducedSyzygiesOfRows({\slshape M})\index{ReducedSyzygiesOfRows@\texttt{ReducedSyzygiesOfRows}!for matrices}
\label{ReducedSyzygiesOfRows:for matrices}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ReducedSyzygiesOfRows({\slshape M, M2})\index{ReducedSyzygiesOfRows@\texttt{ReducedSyzygiesOfRows}!for pairs of matrices}
\label{ReducedSyzygiesOfRows:for pairs of matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 With one argument it is a synonym of \texttt{ReducedSyzygiesGeneratorsOfRows} (\ref{ReducedSyzygiesGeneratorsOfRows:for matrices}). With two arguments it calls \texttt{ReducedBasisOfRowModule}( \texttt{SyzygiesGeneratorsOfRows}( \mbox{\texttt{\slshape M}}, \mbox{\texttt{\slshape M2}} ) ). ($\to$ \texttt{ReducedBasisOfRowModule} (\ref{ReducedBasisOfRowModule:for matrices}) and \texttt{SyzygiesGeneratorsOfRows} (\ref{SyzygiesGeneratorsOfRows:for pairs of matrices})) }

 

\subsection{\textcolor{Chapter }{ReducedSyzygiesOfColumns (for matrices)}}
\logpage{[ 6, 5, 39 ]}\nobreak
\hyperdef{L}{X8766BBD578557D15}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ReducedSyzygiesOfColumns({\slshape M})\index{ReducedSyzygiesOfColumns@\texttt{ReducedSyzygiesOfColumns}!for matrices}
\label{ReducedSyzygiesOfColumns:for matrices}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ReducedSyzygiesOfColumns({\slshape M, M2})\index{ReducedSyzygiesOfColumns@\texttt{ReducedSyzygiesOfColumns}!for pairs of matrices}
\label{ReducedSyzygiesOfColumns:for pairs of matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 With one argument it is a synonym of \texttt{ReducedSyzygiesGeneratorsOfColumns} (\ref{ReducedSyzygiesGeneratorsOfColumns:for matrices}). With two arguments it calls \texttt{ReducedBasisOfColumnModule}( \texttt{SyzygiesGeneratorsOfColumns}( \mbox{\texttt{\slshape M}}, \mbox{\texttt{\slshape M2}} ) ). ($\to$ \texttt{ReducedBasisOfColumnModule} (\ref{ReducedBasisOfColumnModule:for matrices}) and \texttt{SyzygiesGeneratorsOfColumns} (\ref{SyzygiesGeneratorsOfColumns:for pairs of matrices})) }

 

\subsection{\textcolor{Chapter }{RightDivide (for pairs of matrices)}}
\logpage{[ 6, 5, 40 ]}\nobreak
\hyperdef{L}{X850AEC9C7C00AFF5}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{RightDivide({\slshape B, A})\index{RightDivide@\texttt{RightDivide}!for pairs of matrices}
\label{RightDivide:for pairs of matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix or false



 Let \mbox{\texttt{\slshape B}} and \mbox{\texttt{\slshape A}} be matrices having the same number of columns and defined over the same ring.
The matrix \texttt{RightDivide}( \mbox{\texttt{\slshape B}}, \mbox{\texttt{\slshape A}} ) is a particular solution of the inhomogeneous (one sided) linear system of
equations $X\mbox{\texttt{\slshape A}}=\mbox{\texttt{\slshape B}}$ in case it is solvable. Otherwise \texttt{false} is returned. The name \texttt{RightDivide} suggests ``$X=\mbox{\texttt{\slshape B}}\mbox{\texttt{\slshape A}}^{-1}$''. This generalizes \texttt{LeftInverse} (\ref{LeftInverse:for matrices}) for which \mbox{\texttt{\slshape B}} becomes the identity matrix. ($\to$ \texttt{SyzygiesGeneratorsOfRows} (\ref{SyzygiesGeneratorsOfRows:for matrices})) }

 

\subsection{\textcolor{Chapter }{LeftDivide (for pairs of matrices)}}
\logpage{[ 6, 5, 41 ]}\nobreak
\hyperdef{L}{X7D0EAF527F8514E0}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{LeftDivide({\slshape A, B})\index{LeftDivide@\texttt{LeftDivide}!for pairs of matrices}
\label{LeftDivide:for pairs of matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix or false



 Let \mbox{\texttt{\slshape A}} and \mbox{\texttt{\slshape B}} be matrices having the same number of rows and defined over the same ring. The
matrix \texttt{LeftDivide}( \mbox{\texttt{\slshape A}}, \mbox{\texttt{\slshape B}} ) is a particular solution of the inhomogeneous (one sided) linear system of
equations $\mbox{\texttt{\slshape A}}X=\mbox{\texttt{\slshape B}}$ in case it is solvable. Otherwise \texttt{false} is returned. The name \texttt{LeftDivide} suggests ``$X=\mbox{\texttt{\slshape A}}^{-1}\mbox{\texttt{\slshape B}}$''. This generalizes \texttt{RightInverse} (\ref{RightInverse:for matrices}) for which \mbox{\texttt{\slshape B}} becomes the identity matrix. ($\to$ \texttt{SyzygiesGeneratorsOfColumns} (\ref{SyzygiesGeneratorsOfColumns:for matrices})) }

 

\subsection{\textcolor{Chapter }{RightDivide (for triples of matrices)}}
\logpage{[ 6, 5, 42 ]}\nobreak
\hyperdef{L}{X7A8546EA87E3AE67}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{RightDivide({\slshape B, A, L})\index{RightDivide@\texttt{RightDivide}!for triples of matrices}
\label{RightDivide:for triples of matrices}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{RightDivide({\slshape B, A, L})\index{RightDivide@\texttt{RightDivide}!for pairs matrices and a set of relations}
\label{RightDivide:for pairs matrices and a set of relations}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix or false



 Let \mbox{\texttt{\slshape B}}, \mbox{\texttt{\slshape A}} and \mbox{\texttt{\slshape L}} be matrices having the same number of columns and defined over the same ring (\mbox{\texttt{\slshape L}} might also be a set of relations for a left module with \texttt{NrGenerators}( \mbox{\texttt{\slshape L}} ) $=$ \texttt{NrColumns}( \mbox{\texttt{\slshape B}} ) ). The matrix \texttt{RightDivide}( \mbox{\texttt{\slshape B}}, \mbox{\texttt{\slshape A}}, \mbox{\texttt{\slshape L}} ) is a particular solution of the inhomogeneous (one sided) linear system of
equations $X\mbox{\texttt{\slshape A}}+Y\mbox{\texttt{\slshape L}}=\mbox{\texttt{\slshape B}}$ in case it is solvable (for some $Y$ which is forgotten). Otherwise \texttt{false} is returned. The name \texttt{RightDivide} suggests ``$X=\mbox{\texttt{\slshape B}}\mbox{\texttt{\slshape A}}^{-1}$ modulo \mbox{\texttt{\slshape L}}''. (Cf. \cite[Subsection 3.1.1]{BR}) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( RightDivide,
          "for homalg matrices",
          [ IsHomalgMatrix, IsHomalgMatrix, IsHomalgRelationsOfLeftModule ],
          
    function( B, A, L )	## CAUTION: Do not use lazy evaluation here!!!
      local R, BL, ZA, AL, CA, IAL, ZB, CB, NF, X;
      
      R := HomalgRing( B );
      
      BL := BasisOfModule( L );
      
      ## first reduce A modulo L
      ZA := DecideZero( A, BL );
      
      AL := UnionOfRows( ZA, MatrixOfRelations( BL ) );
      
      ## CA * AL = IAL
      CA := HomalgVoidMatrix( R );
      IAL := BasisOfRows( AL, CA );
      
      ## also reduce B modulo L
      ZB := DecideZero( B, BL );
      
      ## knowing this will avoid computations
      IsIdentityMatrix( IAL );
      
      ## IsSpecialSubidentityMatrix( IAL );	## does not increase performance
      
      ## NF = ZB + CB * IAL
      CB := HomalgVoidMatrix( R );
      NF := DecideZeroRowsEffectively( ZB, IAL, CB );
      
      ## NF <> 0
      if not IsZero( NF ) then
          return false;
      fi;
      
      ## CD = -CB * CA => CD * A = B
      X := -CB * CertainColumns( CA, [ 1 .. NrRows( A ) ] );
      
      ## check assertion
      Assert( 3, IsZero( DecideZero( X * A - B, L ) ) );
      
      return X;
      
      ## technical: -CB * CA := (-CB) * CA and COLEM should take over
      ## since CB := -matrix
      
  end );
  
  
  InstallMethod( RightDivide,
          "for homalg matrices",
          [ IsHomalgMatrix, IsHomalgMatrix, IsHomalgMatrix ],
          
    function( B, A, L )
      
      return RightDivide( B, A, HomalgRelationsForLeftModule( L ) );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{LeftDivide (for triples of matrices)}}
\logpage{[ 6, 5, 43 ]}\nobreak
\hyperdef{L}{X86CEB1FC7C358777}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{LeftDivide({\slshape A, B, L})\index{LeftDivide@\texttt{LeftDivide}!for triples of matrices}
\label{LeftDivide:for triples of matrices}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{LeftDivide({\slshape A, B, L})\index{LeftDivide@\texttt{LeftDivide}!for pairs matrices and a set of relations}
\label{LeftDivide:for pairs matrices and a set of relations}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix or false



 Let \mbox{\texttt{\slshape A}}, \mbox{\texttt{\slshape B}} and \mbox{\texttt{\slshape L}} be matrices having the same number of columns and defined over the same ring (\mbox{\texttt{\slshape L}} might also be a set of relations for a right module with \texttt{NrGenerators}( \mbox{\texttt{\slshape L}} ) $=$ \texttt{NrRows}( \mbox{\texttt{\slshape B}} ) ). The matrix \texttt{LeftDivide}( \mbox{\texttt{\slshape A}}, \mbox{\texttt{\slshape B}}, \mbox{\texttt{\slshape L}} ) is a particular solution of the inhomogeneous (one sided) linear system of
equations $\mbox{\texttt{\slshape A}}X+\mbox{\texttt{\slshape L}}Y=\mbox{\texttt{\slshape B}}$ in case it is solvable (for some $Y$ which is forgotten). Otherwise \texttt{false} is returned. The name \texttt{LeftDivide} suggests ``$X=\mbox{\texttt{\slshape A}}^{-1}\mbox{\texttt{\slshape B}}$ modulo \mbox{\texttt{\slshape L}}''. (Cf. \cite[Subsection 3.1.1]{BR}) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( LeftDivide,
          "for homalg matrices",
          [ IsHomalgMatrix, IsHomalgMatrix, IsHomalgRelationsOfRightModule ],
          
    function( A, B, L )	## CAUTION: Do not use lazy evaluation here!!!
      local R, BL, ZA, AL, CA, IAL, ZB, CB, NF, X;
      
      R := HomalgRing( B );
      
      BL := BasisOfModule( L );
      
      ## first reduce A modulo L
      ZA := DecideZero( A, BL );
      
      AL := UnionOfColumns( ZA, MatrixOfRelations( BL ) );
      
      ## AL * CA = IAL
      CA := HomalgVoidMatrix( R );
      IAL := BasisOfColumns( AL, CA );
      
      ## also reduce B modulo L
      ZB := DecideZero( B, BL );
      
      ## knowing this will avoid computations
      IsIdentityMatrix( IAL );
      
      ## IsSpecialSubidentityMatrix( IAL );	## does not increase performance
      
      ## NF = ZB + IAL * CB
      CB := HomalgVoidMatrix( R );
      NF := DecideZeroColumnsEffectively( ZB, IAL, CB );
      
      ## NF <> 0
      if not IsZero( NF ) then
          return false;
      fi;
      
      ## CD = CA * -CB => A * CD = B
      X := CertainRows( CA, [ 1 .. NrColumns( A ) ] ) * -CB;
      
      ## check assertion
      Assert( 3, IsZero( DecideZero( A * X - B, L ) ) );
      
      return X;
      
      ## technical: CA * -CB := CA * (-CB) and COLEM should take over since
      ## CB := -matrix
      
  end );
  
  
  InstallMethod( LeftDivide,
          "for homalg matrices",
          [ IsHomalgMatrix, IsHomalgMatrix, IsHomalgMatrix ],
          
    function( A, B, L )
      
      return LeftDivide( A, B, HomalgRelationsForRightModule( L ) );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{GenerateSameRowModule (for pairs of matrices)}}
\logpage{[ 6, 5, 44 ]}\nobreak
\hyperdef{L}{X82B2C4987D6D5BD3}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{GenerateSameRowModule({\slshape M, N})\index{GenerateSameRowModule@\texttt{GenerateSameRowModule}!for pairs of matrices}
\label{GenerateSameRowModule:for pairs of matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the row span of \mbox{\texttt{\slshape M}} and of \mbox{\texttt{\slshape N}} are identical or not ($\to$ \texttt{RightDivide} (\ref{RightDivide:for pairs of matrices})). }

 

\subsection{\textcolor{Chapter }{GenerateSameColumnModule (for pairs of matrices)}}
\logpage{[ 6, 5, 45 ]}\nobreak
\hyperdef{L}{X867A947682754A9A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{GenerateSameColumnModule({\slshape M, N})\index{GenerateSameColumnModule@\texttt{GenerateSameColumnModule}!for pairs of matrices}
\label{GenerateSameColumnModule:for pairs of matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the column span of \mbox{\texttt{\slshape M}} and of \mbox{\texttt{\slshape N}} are identical or not ($\to$ \texttt{LeftDivide} (\ref{LeftDivide:for pairs of matrices})). }

 }

  }

   
\chapter{\textcolor{Chapter }{Relations}}\label{Relations}
\logpage{[ 7, 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{\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{\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{[ 7, 1, 0 ]}
\hyperdef{L}{X87DADB7B7CB126DC}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgRelations}}
\logpage{[ 7, 1, 1 ]}\nobreak
\hyperdef{L}{X80AD050F7999B7C0}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgRelations({\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{[ 7, 1, 2 ]}\nobreak
\hyperdef{L}{X790F68B17A4846DC}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgRelationsOfLeftModule({\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{[ 7, 1, 3 ]}\nobreak
\hyperdef{L}{X7FF5A3B180614698}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgRelationsOfRightModule({\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{[ 7, 1, 4 ]}\nobreak
\hyperdef{L}{X8322A26C84E80303}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsRelationsOfFinitelyPresentedModuleRep({\slshape rel})\index{IsRelationsOfFinitelyPresentedModuleRep@\texttt{IsRelationsOfFinitelyPresentedModuleRep}}
\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{[ 7, 2, 0 ]}
\hyperdef{L}{X7CF74FB785F90889}{}
{
  }

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

\subsection{\textcolor{Chapter }{CanBeUsedToDecideZeroEffectively}}
\logpage{[ 7, 3, 1 ]}\nobreak
\hyperdef{L}{X798D893B7FBFCF07}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CanBeUsedToDecideZeroEffectively({\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{\slshape rel}} can be used for normal form reductions. \\
 (no method installed) }

 

\subsection{\textcolor{Chapter }{IsInjectivePresentation}}
\logpage{[ 7, 3, 2 ]}\nobreak
\hyperdef{L}{X7B9398827AEEA2E6}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsInjectivePresentation({\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{\slshape rel}} has zero syzygies. }

 }

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

\subsection{\textcolor{Chapter }{FreeResolution}}
\logpage{[ 7, 4, 1 ]}\nobreak
\hyperdef{L}{X7B0707E685A422FE}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{FreeResolution({\slshape rel})\index{FreeResolution@\texttt{FreeResolution}}
\label{FreeResolution}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} complex



 The computed (part of a) free resolution of the module presented by \textsf{homalg} set of relations \mbox{\texttt{\slshape rel}}. }

 }

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

  }

   
\chapter{\textcolor{Chapter }{Generators}}\label{Generators}
\logpage{[ 8, 0, 0 ]}
\hyperdef{L}{X7BD5B55C802805B4}{}
{
  To present a left/right module it suffices to take a matrix \mbox{\texttt{\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{\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{\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{[ 8, 1, 0 ]}
\hyperdef{L}{X827B67D27E3B91FC}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgGenerators}}
\logpage{[ 8, 1, 1 ]}\nobreak
\hyperdef{L}{X79A6BA1280510584}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgGenerators({\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{[ 8, 1, 2 ]}\nobreak
\hyperdef{L}{X83E88425797FFC9C}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgGeneratorsOfLeftModule({\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{[ 8, 1, 3 ]}\nobreak
\hyperdef{L}{X86E9029487FE58DF}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgGeneratorsOfRightModule({\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 }{IsGeneratorsOfFinitelyGeneratedModuleRep}}
\logpage{[ 8, 1, 4 ]}\nobreak
\hyperdef{L}{X78512B8A8613FBF1}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsGeneratorsOfFinitelyGeneratedModuleRep({\slshape rel})\index{IsGeneratorsOfFinitelyGeneratedModuleRep@\texttt{IsGeneratorsOfFinitelyGeneratedModuleRep}}
\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} category \texttt{IsHomalgGenerators} (\ref{IsHomalgGenerators})) }

 }

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

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

\subsection{\textcolor{Chapter }{IsReduced}}
\logpage{[ 8, 3, 1 ]}\nobreak
\hyperdef{L}{X8134689C7B576946}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsReduced({\slshape gen})\index{IsReduced@\texttt{IsReduced}}
\label{IsReduced}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



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

 }

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

\subsection{\textcolor{Chapter }{ProcedureToReadjustGenerators}}
\logpage{[ 8, 4, 1 ]}\nobreak
\hyperdef{L}{X7B6F787085536F90}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ProcedureToReadjustGenerators({\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{\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{[ 8, 5, 0 ]}
\hyperdef{L}{X7AC876EC8137AEA4}{}
{
  }

  }

   
\chapter{\textcolor{Chapter }{Modules}}\label{Modules}
\logpage{[ 9, 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{\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{\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{[ 9, 1, 0 ]}
\hyperdef{L}{X7C7EBD2383B99C43}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgModule}}
\logpage{[ 9, 1, 1 ]}\nobreak
\hyperdef{L}{X8429977B7FD30F32}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgModule({\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{IsHomalgObject}.) }

 

\subsection{\textcolor{Chapter }{IsFinitelyPresentedModuleOrSubmoduleRep}}
\logpage{[ 9, 1, 2 ]}\nobreak
\hyperdef{L}{X7FB182707ADDF903}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsFinitelyPresentedModuleOrSubmoduleRep({\slshape M})\index{IsFinitelyPresentedModuleOrSubmoduleRep@\texttt{IsFinitelyPresentedModuleOrSubmoduleRep}}
\label{IsFinitelyPresentedModuleOrSubmoduleRep}
}\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}).) }

 

\subsection{\textcolor{Chapter }{IsFinitelyPresentedModuleRep}}
\logpage{[ 9, 1, 3 ]}\nobreak
\hyperdef{L}{X87D53DCC822C8C92}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsFinitelyPresentedModuleRep({\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{IsFinitelyPresentedObjectRep}, and \texttt{IsHomalgRingOrFinitelyPresentedModuleRep}.) }

 

\subsection{\textcolor{Chapter }{IsFinitelyPresentedSubmoduleRep}}
\logpage{[ 9, 1, 4 ]}\nobreak
\hyperdef{L}{X7BFA03B6820E9E55}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsFinitelyPresentedSubmoduleRep({\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}), \texttt{IsFinitelyPresentedModuleOrSubmoduleRep}, \texttt{IsFinitelyPresentedSubobjectRep}, and \texttt{IsHomalgRingOrFinitelyPresentedModuleRep}.) }

 }

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

\subsection{\textcolor{Chapter }{LeftPresentation (constructor for left modules)}}
\logpage{[ 9, 2, 1 ]}\nobreak
\hyperdef{L}{X7EC09F6B83CA4068}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{LeftPresentation({\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{\slshape mat}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ \
  > 2, 3, 4, \
  > 5, 6, 7  \
  > ]", 2, 3, ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> M := LeftPresentation( M );
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> Display( M );
  [ [  2,  3,  4 ],
    [  5,  6,  7 ] ]
  
  Cokernel of the map
  
  Z^(1x2) --> Z^(1x3),
  
  currently represented by the above matrix
  gap> ByASmallerPresentation( M );
  <A rank 1 left module presented by 1 relation for 2 generators>
  gap> Display( last );
  Z/< 3 > + Z^(1 x 1)
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{RightPresentation (constructor for right modules)}}
\logpage{[ 9, 2, 2 ]}\nobreak
\hyperdef{L}{X7A0C400A8042C284}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{RightPresentation({\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{\slshape mat}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ \
  > 2, 3, 4, \
  > 5, 6, 7  \
  > ]", 2, 3, ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> M := RightPresentation( M );
  <A right module on 2 generators satisfying 3 relations>
  gap> ByASmallerPresentation( M );
  <A cyclic torsion right module on a cyclic generator satisfying 1 relation>
  gap> Display( last );
  Z/< 3 >
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgFreeLeftModule (constructor for free left modules)}}
\logpage{[ 9, 2, 3 ]}\nobreak
\hyperdef{L}{X8067510285E38110}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgFreeLeftModule({\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{\slshape r}} over the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> F := HomalgFreeLeftModule( 1, ZZ );
  <A free left module of rank 1 on a free generator>
  gap> 1 * ZZ;
  <The free left module of rank 1 on a free generator>
  gap> F := HomalgFreeLeftModule( 2, ZZ );
  <A free left module of rank 2 on free generators>
  gap> 2 * ZZ;
  <A free left module of rank 2 on free generators>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgFreeRightModule (constructor for free right modules)}}
\logpage{[ 9, 2, 4 ]}\nobreak
\hyperdef{L}{X7D9133C6837FDFE7}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgFreeRightModule({\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{\slshape r}} over the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> F := HomalgFreeRightModule( 1, ZZ );
  <A free right module of rank 1 on a free generator>
  gap> ZZ * 1;
  <The free right module of rank 1 on a free generator>
  gap> F := HomalgFreeRightModule( 2, ZZ );
  <A free right module of rank 2 on free generators>
  gap> ZZ * 2;
  <A free right module of rank 2 on free generators>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgZeroLeftModule (constructor for zero left modules)}}
\logpage{[ 9, 2, 5 ]}\nobreak
\hyperdef{L}{X86EA38328275C44E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgZeroLeftModule({\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{\slshape r}} over the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> F := HomalgZeroLeftModule( ZZ );
  <A zero left module>
  gap> 0 * ZZ;
  <The zero left module>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgZeroRightModule (constructor for zero right modules)}}
\logpage{[ 9, 2, 6 ]}\nobreak
\hyperdef{L}{X8796A5957C40155C}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgZeroRightModule({\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{\slshape r}} over the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> F := HomalgZeroRightModule( ZZ );
  <A zero right module>
  gap> ZZ * 0;
  <The zero right module>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{\texttt{\symbol{92}}* (transfer a module over a different ring)}}
\logpage{[ 9, 2, 7 ]}\nobreak
\hyperdef{L}{X862D629C7C42F4E3}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{\texttt{\symbol{92}}*({\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}{$\Diamond$\ \texttt{\texttt{\symbol{92}}*({\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{\slshape M}} over the \textsf{homalg} ring \mbox{\texttt{\slshape R}}. This works only in three cases: 
\begin{enumerate}
\item $S$ is a subring of \mbox{\texttt{\slshape R}}.
\item \mbox{\texttt{\slshape R}} is a residue class ring of $S$ constructed using \texttt{/} ($\to$ \texttt{\texttt{\symbol{92}}/} (\ref{/:constructor for residue class rings})).
\item \mbox{\texttt{\slshape R}} is a subring of $S$ and the entries of the current matrix of $S$-relations of \mbox{\texttt{\slshape M}} lie in \mbox{\texttt{\slshape R}}.
\end{enumerate}
 CAUTION: So it is not suited for general base change. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );
  <A homalg internal ring>
  gap> Z4 := ZZ / 4;
  <A homalg residue class ring>
  gap> Display( Z4 );
  Z/( 4 )
  gap> M := HomalgDiagonalMatrix( [ 2 .. 4 ], ZZ );
  <An unevaluated diagonal homalg internal 3 by 3 matrix>
  gap> M := LeftPresentation( M );
  <A left module presented by 3 relations for 3 generators>
  gap> Display( M );
  Z/< 2 > + Z/< 3 > + Z/< 4 >
  gap> M;
  <A torsion left module presented by 3 relations for 3 generators>
  gap> N := Z4 * M; ## or N := M * Z4;
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> ByASmallerPresentation( N );
  <A non-torsion left module presented by 1 relation for 2 generators>
  gap> Display( N );
  Z/( 4 )/< |[ 2 ]| > + Z/( 4 )^(1 x 1)
  gap> N;
  <A non-torsion left module presented by 1 relation for 2 generators>
\end{Verbatim}
 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ \
  > 2, 3, 4, \
  > 5, 6, 7  \
  > ]", 2, 3, ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> M := LeftPresentation( M );
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> Z4 := ZZ / 4;;
  gap> Display( Z4 );
  Z/( 4 )
  gap> M4 := Z4 * M;
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> 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
  gap> d := Resolution( 2, M4 );
  <A right acyclic complex containing 2 morphisms of left modules at degrees 
  [ 0 .. 2 ]>
  gap> Hom( d, Z4 );
  <A cocomplex containing 2 morphisms of right modules at degrees [ 0 .. 2 ]>
  gap> dd := Hom( d, Z4 );
  <A cocomplex containing 2 morphisms of right modules at degrees [ 0 .. 2 ]>
  gap> DD := Resolution( 2, dd );
  <A cocomplex containing 2 morphisms of right complexes at degrees [ 0 .. 2 ]>
  gap> D := Hom( DD, Z4 );
  <A complex containing 2 morphisms of left cocomplexes at degrees [ 0 .. 2 ]>
  gap> C := ZZ * D;
  <A "complex" containing 2 morphisms of left cocomplexes at degrees [ 0 .. 2 ]>
  gap> LowestDegreeObject( C );
  <A "cocomplex" containing 2 morphisms of left modules at degrees [ 0 .. 2 ]>
  gap> 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 maps)}}
\logpage{[ 9, 2, 8 ]}\nobreak
\hyperdef{L}{X7BEAB20E7E6259F0}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Subobject({\slshape phi})\index{Subobject@\texttt{Subobject}!constructor for submodules using maps}
\label{Subobject:constructor for submodules using maps}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} submodule



 A synonym of \texttt{ImageSubmodule} (\ref{ImageSubmodule:for maps}). }

 

\subsection{\textcolor{Chapter }{Subobject (constructor for submodules using matrices)}}
\logpage{[ 9, 2, 9 ]}\nobreak
\hyperdef{L}{X84C6C8227814E2BC}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Subobject({\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{\slshape M}} with generators given by the rows/columns of the \textsf{homalg} matrix \mbox{\texttt{\slshape mat}}. }

 

\subsection{\textcolor{Chapter }{Subobject (constructor for submodules using a list of ring elements)}}
\logpage{[ 9, 2, 10 ]}\nobreak
\hyperdef{L}{X811E74A98454101E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Subobject({\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{\slshape M}} with generators given by the entries of the list \mbox{\texttt{\slshape gens}}. }

 

\subsection{\textcolor{Chapter }{LeftSubmodule (constructor for left submodules)}}
\logpage{[ 9, 2, 11 ]}\nobreak
\hyperdef{L}{X8498CB457DD55DF2}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{LeftSubmodule({\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{\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}[fontsize=\small,frame=single,label=Example]
  gap> Z4 := HomalgRingOfIntegers( ) / 4;
  <A homalg residue class ring>
  gap> J := HomalgMatrix( "[ 2 ]", 1, 1, Z4 );
  <A homalg residue class 1 by 1 matrix>
  gap> J := LeftSubmodule( J );
  <A principal (left) ideal given by a cyclic generator>
  gap> IsFree( J );
  false
  gap> J;
  <A principal reflexive non-projective (left) ideal given by a cyclic generator\
  >
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{RightSubmodule (constructor for right submodules)}}
\logpage{[ 9, 2, 12 ]}\nobreak
\hyperdef{L}{X8383318085374771}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{RightSubmodule({\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{\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}[fontsize=\small,frame=single,label=Example]
  gap> Z4 := HomalgRingOfIntegers( ) / 4;
  <A homalg residue class ring>
  gap> J := HomalgMatrix( "[ 2 ]", 1, 1, Z4 );
  <A homalg residue class 1 by 1 matrix>
  gap> J := RightSubmodule( J );
  <A principal (right) ideal given by a cyclic generator>
  gap> IsFree( J );
  false
  gap> J;
  <A principal reflexive non-projective (right) ideal given by a cyclic generato\
  r>
\end{Verbatim}
 }

 }

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

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



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

 

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



 Check if the \textsf{homalg} module \mbox{\texttt{\slshape M}} is stably free. }

 

\subsection{\textcolor{Chapter }{IsProjective}}
\logpage{[ 9, 3, 3 ]}\nobreak
\hyperdef{L}{X7EC041A77E7E46D2}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsProjective({\slshape M})\index{IsProjective@\texttt{IsProjective}}
\label{IsProjective}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



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

 

\subsection{\textcolor{Chapter }{FiniteFreeResolutionExists}}
\logpage{[ 9, 3, 4 ]}\nobreak
\hyperdef{L}{X8784F151844F01FA}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{FiniteFreeResolutionExists({\slshape M})\index{FiniteFreeResolutionExists@\texttt{FiniteFreeResolutionExists}}
\label{FiniteFreeResolutionExists}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} module \mbox{\texttt{\slshape M}} allows a finite free resolution. \\
 (no method installed) }

 

\subsection{\textcolor{Chapter }{IsReflexive}}
\logpage{[ 9, 3, 5 ]}\nobreak
\hyperdef{L}{X7A6A34C283332F60}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsReflexive({\slshape M})\index{IsReflexive@\texttt{IsReflexive}}
\label{IsReflexive}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



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

 

\subsection{\textcolor{Chapter }{IsTorsionFree}}
\logpage{[ 9, 3, 6 ]}\nobreak
\hyperdef{L}{X86D92DA17DCE22DD}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsTorsionFree({\slshape M})\index{IsTorsionFree@\texttt{IsTorsionFree}}
\label{IsTorsionFree}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} module \mbox{\texttt{\slshape M}} is torsion-free. }

 

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



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

 

\subsection{\textcolor{Chapter }{IsCyclic}}
\logpage{[ 9, 3, 8 ]}\nobreak
\hyperdef{L}{X7DA27D338374FD28}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsCyclic({\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{\slshape M}} is cyclic. }

 

\subsection{\textcolor{Chapter }{IsTorsion}}
\logpage{[ 9, 3, 9 ]}\nobreak
\hyperdef{L}{X80C6B26284721409}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsTorsion({\slshape M})\index{IsTorsion@\texttt{IsTorsion}}
\label{IsTorsion}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



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

 

\subsection{\textcolor{Chapter }{IsHolonomic}}
\logpage{[ 9, 3, 10 ]}\nobreak
\hyperdef{L}{X7B547E8A7969F772}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHolonomic({\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{\slshape M}} is holonomic. }

 

\subsection{\textcolor{Chapter }{IsPure}}
\logpage{[ 9, 3, 11 ]}\nobreak
\hyperdef{L}{X7B894ED27D38E4B5}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsPure({\slshape M})\index{IsPure@\texttt{IsPure}}
\label{IsPure}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



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

 

\subsection{\textcolor{Chapter }{HasConstantRank}}
\logpage{[ 9, 3, 12 ]}\nobreak
\hyperdef{L}{X7A20E4597A707218}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HasConstantRank({\slshape M})\index{HasConstantRank@\texttt{HasConstantRank}}
\label{HasConstantRank}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} module \mbox{\texttt{\slshape M}} has constant rank. \\
 (no method installed) }

 

\subsection{\textcolor{Chapter }{ConstructedAsAnIdeal}}
\logpage{[ 9, 3, 13 ]}\nobreak
\hyperdef{L}{X7CD026F185A5E41E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ConstructedAsAnIdeal({\slshape J})\index{ConstructedAsAnIdeal@\texttt{ConstructedAsAnIdeal}}
\label{ConstructedAsAnIdeal}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} submodule \mbox{\texttt{\slshape J}} was constructed as an ideal. \\
 (no method installed) }

 

\subsection{\textcolor{Chapter }{IsPrimeIdeal}}
\logpage{[ 9, 3, 14 ]}\nobreak
\hyperdef{L}{X78020A71848F9FDD}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsPrimeIdeal({\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{\slshape J}} is a prime ideal. The ring has to be commutative. \\
 (no method installed) }

 }

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

\subsection{\textcolor{Chapter }{TheZeroMorphism}}
\logpage{[ 9, 4, 1 ]}\nobreak
\hyperdef{L}{X788B2B087A04780E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{TheZeroMorphism({\slshape M})\index{TheZeroMorphism@\texttt{TheZeroMorphism}}
\label{TheZeroMorphism}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} map



 The zero endomorphism of the \textsf{homalg} module \mbox{\texttt{\slshape M}}. }

 

\subsection{\textcolor{Chapter }{TheIdentityMorphism}}
\logpage{[ 9, 4, 2 ]}\nobreak
\hyperdef{L}{X85EFEC127CA408A1}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{TheIdentityMorphism({\slshape M})\index{TheIdentityMorphism@\texttt{TheIdentityMorphism}}
\label{TheIdentityMorphism}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} map



 The identity automorphism of the \textsf{homalg} module \mbox{\texttt{\slshape M}}. }

 

\subsection{\textcolor{Chapter }{FullSubmodule}}
\logpage{[ 9, 4, 3 ]}\nobreak
\hyperdef{L}{X787E290881680B8A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{FullSubmodule({\slshape M})\index{FullSubmodule@\texttt{FullSubmodule}}
\label{FullSubmodule}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} submodule



 The \textsf{homalg} module \mbox{\texttt{\slshape M}} as a submodule of itself. }

 

\subsection{\textcolor{Chapter }{EmbeddingInSuperObject}}
\logpage{[ 9, 4, 4 ]}\nobreak
\hyperdef{L}{X7C16CBCC78C56CDC}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{EmbeddingInSuperObject({\slshape N})\index{EmbeddingInSuperObject@\texttt{EmbeddingInSuperObject}}
\label{EmbeddingInSuperObject}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} map



 In case \mbox{\texttt{\slshape N}} was defined as a submodule of some module $L$ the embedding of \mbox{\texttt{\slshape N}} in $L$ is returned. }

 

\subsection{\textcolor{Chapter }{FactorObject}}
\logpage{[ 9, 4, 5 ]}\nobreak
\hyperdef{L}{X7FB9A7C3785D92DC}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{FactorObject({\slshape N})\index{FactorObject@\texttt{FactorObject}}
\label{FactorObject}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} module



 In case \mbox{\texttt{\slshape N}} was defined as a submodule of some module $L$ the factor module $L/$\mbox{\texttt{\slshape N}} is returned. }

 

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



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

 

\subsection{\textcolor{Chapter }{UnderlyingSubobject}}
\logpage{[ 9, 4, 7 ]}\nobreak
\hyperdef{L}{X7A23EAD67E6B85C1}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{UnderlyingSubobject({\slshape M})\index{UnderlyingSubobject@\texttt{UnderlyingSubobject}}
\label{UnderlyingSubobject}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} submodule



 In case \mbox{\texttt{\slshape M}} was defined as the module underlying a submodule $L$ then $L$ is returned. \\
 (no method installed) }

 

\subsection{\textcolor{Chapter }{NatTrIdToHomHom{\textunderscore}R (for maps)}}
\logpage{[ 9, 4, 8 ]}\nobreak
\hyperdef{L}{X82FF48CE869939EA}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{NatTrIdToHomHom{\textunderscore}R({\slshape M})\index{NatTrIdToHomHomR@\texttt{NatTrIdToHomHom{\textunderscore}R}!for maps}
\label{NatTrIdToHomHomR:for maps}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} map



 The natural evaluation map from the \textsf{homalg} module \mbox{\texttt{\slshape M}} to its double dual \texttt{HomHom}$($\mbox{\texttt{\slshape M}}$)$ (cf. \texttt{Functor{\textunderscore}HomHom} (\ref{FunctorHomHom})). }

 

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



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

  

\subsection{\textcolor{Chapter }{ElementaryDivisors}}
\logpage{[ 9, 4, 10 ]}\nobreak
\hyperdef{L}{X7EB20A71864D46BF}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ElementaryDivisors({\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{\slshape M}}, in case they exist. \\
 (no method installed) }

 

\subsection{\textcolor{Chapter }{RankOfModule}}
\logpage{[ 9, 4, 11 ]}\nobreak
\hyperdef{L}{X8451B99B7E055667}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{RankOfModule({\slshape M})\index{RankOfModule@\texttt{RankOfModule}}
\label{RankOfModule}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a nonnegative integer



 The projective rank of the \textsf{homalg} module \mbox{\texttt{\slshape M}}. }

 

\subsection{\textcolor{Chapter }{ProjectiveDimension}}
\logpage{[ 9, 4, 12 ]}\nobreak
\hyperdef{L}{X84FDF25D797B874B}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ProjectiveDimension({\slshape M})\index{ProjectiveDimension@\texttt{ProjectiveDimension}}
\label{ProjectiveDimension}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a nonnegative integer



 The projective dimension of the \textsf{homalg} module \mbox{\texttt{\slshape M}}. }

 

\subsection{\textcolor{Chapter }{DegreeOfTorsionFreeness}}
\logpage{[ 9, 4, 13 ]}\nobreak
\hyperdef{L}{X807BA3C583D3F1EB}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DegreeOfTorsionFreeness({\slshape M})\index{DegreeOfTorsionFreeness@\texttt{DegreeOfTorsionFreeness}}
\label{DegreeOfTorsionFreeness}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a nonnegative integer of infinity



 Auslander's degree of torsion-freeness of the \textsf{homalg} module \mbox{\texttt{\slshape M}}. It is set to infinity only for \mbox{\texttt{\slshape M}}$=0$. }

 

\subsection{\textcolor{Chapter }{Codim}}
\logpage{[ 9, 4, 14 ]}\nobreak
\hyperdef{L}{X8096782D822DEE9E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Codim({\slshape M})\index{Codim@\texttt{Codim}}
\label{Codim}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a nonnegative integer of infinity



 The codimension of the \textsf{homalg} module \mbox{\texttt{\slshape M}}. It is set to infinity only for \mbox{\texttt{\slshape M}}$=0$. }

 

\subsection{\textcolor{Chapter }{PurityFiltration}}
\logpage{[ 9, 4, 15 ]}\nobreak
\hyperdef{L}{X816186E587563E3F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{PurityFiltration({\slshape M})\index{PurityFiltration@\texttt{PurityFiltration}}
\label{PurityFiltration}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} filtration



 The purity filtration of the \textsf{homalg} module \mbox{\texttt{\slshape M}}. }

 

\subsection{\textcolor{Chapter }{CodegreeOfPurity}}
\logpage{[ 9, 4, 16 ]}\nobreak
\hyperdef{L}{X8021C33D85444081}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CodegreeOfPurity({\slshape M})\index{CodegreeOfPurity@\texttt{CodegreeOfPurity}}
\label{CodegreeOfPurity}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list of nonnegative integers



 The codegree of purity of the \textsf{homalg} module \mbox{\texttt{\slshape M}}. }

 

\subsection{\textcolor{Chapter }{BettiDiagram (for modules)}}
\logpage{[ 9, 4, 17 ]}\nobreak
\hyperdef{L}{X7C689B3E831DF3E7}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{BettiDiagram({\slshape M})\index{BettiDiagram@\texttt{BettiDiagram}!for modules}
\label{BettiDiagram:for modules}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} diagram



 The Betti diagram of the \textsf{homalg} graded module \mbox{\texttt{\slshape M}}. }

 

\subsection{\textcolor{Chapter }{CastelnuovoMumfordRegularity}}
\logpage{[ 9, 4, 18 ]}\nobreak
\hyperdef{L}{X854A879B8705130F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CastelnuovoMumfordRegularity({\slshape M})\index{CastelnuovoMumfordRegularity@\texttt{CastelnuovoMumfordRegularity}}
\label{CastelnuovoMumfordRegularity}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a non-negative integer



 The Castelnuovo-Mumford regularity of the \textsf{homalg} graded module \mbox{\texttt{\slshape M}}. }

 }

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

\subsection{\textcolor{Chapter }{HomalgRing (for modules)}}
\logpage{[ 9, 5, 1 ]}\nobreak
\hyperdef{L}{X7DDA4A357F4868A0}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgRing({\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{\slshape M}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );
  <A homalg internal ring>
  gap> M := ZZ * 4;
  <A free right module of rank 4 on free generators>
  gap> R := HomalgRing( M );
  <A homalg internal ring>
  gap> IsIdenticalObj( R, ZZ );
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{ByASmallerPresentation (for modules)}}
\logpage{[ 9, 5, 2 ]}\nobreak
\hyperdef{L}{X840D0B4F8798C370}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ByASmallerPresentation({\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{\slshape M}}. This method performs side effects on its argument \mbox{\texttt{\slshape M}} and returns it. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ \
  > 2, 3, 4, \
  > 5, 6, 7  \
  > ]", 2, 3, ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> M := LeftPresentation( M );
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> Display( M );
  [ [  2,  3,  4 ],
    [  5,  6,  7 ] ]
  
  Cokernel of the map
  
  Z^(1x2) --> Z^(1x3),
  
  currently represented by the above matrix
  gap> ByASmallerPresentation( M );
  <A rank 1 left module presented by 1 relation for 2 generators>
  gap> Display( last );
  Z/< 3 > + Z^(1 x 1)
  gap> SetsOfGenerators( M );
  <A set containing 3 sets of generators of a homalg module>
  gap> SetsOfRelations( M );
  <A set containing 3 sets of relations of a homalg module>
  gap> M;
  <A rank 1 left module presented by 1 relation for 2 generators>
  gap> SetPositionOfTheDefaultSetOfRelations( M, 1 );
  gap> M;
  <A rank 1 left module presented by 2 relations for 3 generators>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{UnderlyingObject (for submodules)}}
\logpage{[ 9, 5, 3 ]}\nobreak
\hyperdef{L}{X7830175E855BE5DB}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{UnderlyingObject({\slshape M})\index{UnderlyingObject@\texttt{UnderlyingObject}!for submodules}
\label{UnderlyingObject:for submodules}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} module



 In case \mbox{\texttt{\slshape M}} was defined as a submodule of some module $L$ the module underlying the submodule $M$ is returned. }

 

\subsection{\textcolor{Chapter }{SuperObject (for submodules)}}
\logpage{[ 9, 5, 4 ]}\nobreak
\hyperdef{L}{X8316839687EB0667}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{SuperObject({\slshape M})\index{SuperObject@\texttt{SuperObject}!for submodules}
\label{SuperObject:for submodules}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} module



 In case \mbox{\texttt{\slshape M}} was defined as a submodule of some module $L$ the super module $L$ is returned. }

 

\subsection{\textcolor{Chapter }{\texttt{\symbol{92}}* (constructor for ideal multiples)}}
\logpage{[ 9, 5, 5 ]}\nobreak
\hyperdef{L}{X865CC3577A550E56}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{\texttt{\symbol{92}}*({\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{\slshape J}}\mbox{\texttt{\slshape M}} (resp. \mbox{\texttt{\slshape M}}\mbox{\texttt{\slshape J}}) of the given left (resp. right) $R$-module \mbox{\texttt{\slshape M}}, where \mbox{\texttt{\slshape J}} is a left (resp. right) ideal in $R$. }

 

\subsection{\textcolor{Chapter }{SubmoduleQuotient (for submodules)}}
\logpage{[ 9, 5, 6 ]}\nobreak
\hyperdef{L}{X849D7E6E81F1817B}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{SubmoduleQuotient({\slshape K, J})\index{SubmoduleQuotient@\texttt{SubmoduleQuotient}!for submodules}
\label{SubmoduleQuotient:for submodules}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ideal



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

 

\subsection{\textcolor{Chapter }{Saturate (for ideals)}}
\logpage{[ 9, 5, 7 ]}\nobreak
\hyperdef{L}{X82AE15AF82136AE0}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Saturate({\slshape K, J})\index{Saturate@\texttt{Saturate}!for ideals}
\label{Saturate:for ideals}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ideal



 Compute the saturation ideal $\mbox{\texttt{\slshape K}}:\mbox{\texttt{\slshape J}}^\infty$ of the ideals \mbox{\texttt{\slshape K}} and \mbox{\texttt{\slshape J}}. 

 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );
  <A homalg internal ring>
  gap> Display( ZZ );
  Z
  gap> m := LeftSubmodule( "2", ZZ );
  <A principal (left) ideal given by a cyclic generator>
  gap> Display( m );
  [ [  2 ] ]
  
  A (left) ideal generated by the entry of the above matrix
  gap> K := LeftSubmodule( "3", ZZ );
  <A principal (left) ideal given by a cyclic generator>
  gap> Display( K );
  [ [  3 ] ]
  
  A (left) ideal generated by the entry of the above matrix
  gap> J := Intersect( K, m^3 );
  <A principal (left) ideal given by a cyclic generator>
  gap> Display( J );
  [ [  24 ] ]
  
  A (left) ideal generated by the entry of the above matrix
  gap> Jm := SubmoduleQuotient( J, m );
  <A principal (left) ideal given by a cyclic generator>
  gap> Display( Jm );
  [ [  -12 ] ]
  
  A (left) ideal generated by the entry of the above matrix
  gap> J_m := Saturate( J, m );
  <A principal (left) ideal given by a cyclic generator>
  gap> Display( J_m );
  [ [  -3 ] ]
  
  A (left) ideal generated by the entry of the above matrix
  gap> J_m = K;
  true
\end{Verbatim}
 

 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Saturate,
          "for homalg submodules",
          [ IsFinitelyPresentedSubmoduleRep, IsFinitelyPresentedSubmoduleRep ],
          
    function( K, J )
      local quotient_last, quotient;
      
      quotient_last := SubmoduleQuotient( K, J );
      
      quotient := SubmoduleQuotient( quotient_last, J );
      
      while not IsSubset( quotient_last, quotient ) do
          quotient_last := quotient;
          quotient := SubmoduleQuotient( quotient_last, J );
      od;
      
      return quotient_last;
      
  end );
  
  
  InstallMethod( \-,	## a geometrically motivated definition
          "for homalg submodules",
          [ IsFinitelyPresentedSubmoduleRep, IsFinitelyPresentedSubmoduleRep ],
          
    function( K, J )
      
      return Saturate( K, J );
      
  end );
\end{Verbatim}
 }

 }

  }

   
\chapter{\textcolor{Chapter }{Maps}}\label{Maps}
\logpage{[ 10, 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} (\ref{Source:for maps})) and its target ($\to$ \texttt{Range} (\ref{Range:for maps})). 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{[ 10, 1, 0 ]}
\hyperdef{L}{X790FEEBD86F5C143}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgMap}}
\logpage{[ 10, 1, 1 ]}\nobreak
\hyperdef{L}{X7DA293237F14CD74}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgMap({\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} category \texttt{IsHomalgMorphism}.) }

 

\subsection{\textcolor{Chapter }{IsHomalgSelfMap}}
\logpage{[ 10, 1, 2 ]}\nobreak
\hyperdef{L}{X7F34D26882D20FF0}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgSelfMap({\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}.) }

 

\subsection{\textcolor{Chapter }{IsMapOfFinitelyGeneratedModulesRep}}
\logpage{[ 10, 1, 3 ]}\nobreak
\hyperdef{L}{X813202447B5C8FB3}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsMapOfFinitelyGeneratedModulesRep({\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{IsHomalgChainMap} (\ref{IsHomalgChainMap}), which is a subrepresentation of the \textsf{GAP} representation \texttt{IsMorphismOfFinitelyGeneratedModulesRep}.) }

 }

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

\subsection{\textcolor{Chapter }{HomalgMap (constructor for maps)}}
\logpage{[ 10, 2, 1 ]}\nobreak
\hyperdef{L}{X790E02137DBA584C}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgMap({\slshape mat, M, N})\index{HomalgMap@\texttt{HomalgMap}!constructor for maps}
\label{HomalgMap:constructor for maps}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgMap({\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{\slshape mat}} relative to the current set of generators of the source \textsf{homalg} module \mbox{\texttt{\slshape M}} and target module \mbox{\texttt{\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} (\ref{IsMorphism:for maps}). 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}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> M := LeftPresentation( M );
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );
  <A homalg internal 2 by 4 matrix>
  gap> N := LeftPresentation( N );
  <A non-torsion left module presented by 2 relations for 4 generators>
  gap> mat := HomalgMatrix( "[ \
  > 1, 0, -2, -4, \
  > 0, 1,  4,  7, \
  > 1, 0, -2, -4  \
  > ]", 3, 4, ZZ );;
  <A homalg internal 3 by 4 matrix>
  gap> phi := HomalgMap( mat, M, N );
  <A "homomorphism" of left modules>
  gap> IsMorphism( phi );
  true
  gap> phi;
  <A homomorphism of left modules>
  gap> 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
  gap> ByASmallerPresentation( M );
  <A rank 1 left module presented by 1 relation for 2 generators>
  gap> Display( last );
  Z/< 3 > + Z^(1 x 1)
  gap> Display( phi );
  [ [   2,   1,   0,  -1 ],
    [   1,   0,  -2,  -4 ] ]
  
  the map is currently represented by the above 2 x 4 matrix
  gap> ByASmallerPresentation( N );
  <A rank 2 left module presented by 1 relation for 3 generators>
  gap> Display( N );
  Z/< 4 > + Z^(1 x 2)
  gap> Display( phi );
  [ [  -8,   0,   0 ],
    [  -3,  -1,  -2 ] ]
  
  the map is currently represented by the above 2 x 3 matrix
  gap> ByASmallerPresentation( phi );
  <A homomorphism of left modules>
  gap> 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}[fontsize=\small,frame=single,label=Example]
  gap> N;
  <A rank 2 left module presented by 1 relation for 3 generators>
  gap> SetPositionOfTheDefaultSetOfGenerators( N, 1 );
  gap> N;
  <A rank 2 left module presented by 2 relations for 4 generators>
  gap> psi := HomalgMap( mat, "free", N );
  <A homomorphism of left modules>
  gap> 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}[fontsize=\small,frame=single,label=Example]
  gap> chi := HomalgMap( mat );	## or chi := HomalgMap( mat, "l" );
  <A homomorphism of left modules>
  gap> Source( chi );
  <A free left module of rank 3 on free generators>
  gap> 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}[fontsize=\small,frame=single,label=Example]
  gap> kappa := HomalgMap( mat, "r" );
  <A homomorphism of right modules>
  gap> Source( kappa );
  <A free right module of rank 4 on free generators>
  gap> Range( kappa );
  <A free right module of rank 3 on free generators>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgZeroMap (constructor for zero maps)}}
\logpage{[ 10, 2, 2 ]}\nobreak
\hyperdef{L}{X81489DAF7B0674F3}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgZeroMap({\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{\slshape M}} and the target \textsf{homalg} module \mbox{\texttt{\slshape N}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> M := LeftPresentation( M );
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );
  <A homalg internal 2 by 4 matrix>
  gap> N := LeftPresentation( N );
  <A non-torsion left module presented by 2 relations for 4 generators>
  gap> HomalgZeroMap( M, N );
  <The zero morphism of left modules>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgIdentityMap (constructor for identity maps)}}
\logpage{[ 10, 2, 3 ]}\nobreak
\hyperdef{L}{X7BF289B882C9DDF4}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgIdentityMap({\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{\slshape M}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> M := LeftPresentation( M );
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> HomalgIdentityMap( M );
  <The identity morphism of a left module>
\end{Verbatim}
 }

 }

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

\subsection{\textcolor{Chapter }{IsMorphism (for maps)}}
\logpage{[ 10, 3, 1 ]}\nobreak
\hyperdef{L}{X86E3C9497FC8060D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsMorphism({\slshape phi})\index{IsMorphism@\texttt{IsMorphism}!for maps}
\label{IsMorphism:for maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if \mbox{\texttt{\slshape phi}} is a well-defined map, i.e. independent of all involved presentations. }

 

\subsection{\textcolor{Chapter }{IsGeneralizedMorphism (for maps)}}
\logpage{[ 10, 3, 2 ]}\nobreak
\hyperdef{L}{X7B906ED186D98634}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsGeneralizedMorphism({\slshape phi})\index{IsGeneralizedMorphism@\texttt{IsGeneralizedMorphism}!for maps}
\label{IsGeneralizedMorphism:for maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if \mbox{\texttt{\slshape phi}} is a generalized morphism. }

 

\subsection{\textcolor{Chapter }{IsGeneralizedEpimorphism (for maps)}}
\logpage{[ 10, 3, 3 ]}\nobreak
\hyperdef{L}{X7F68045E837F63F2}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsGeneralizedEpimorphism({\slshape phi})\index{IsGeneralizedEpimorphism@\texttt{IsGeneralizedEpimorphism}!for maps}
\label{IsGeneralizedEpimorphism:for maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if \mbox{\texttt{\slshape phi}} is a generalized epimorphism. }

 

\subsection{\textcolor{Chapter }{IsGeneralizedMonomorphism (for maps)}}
\logpage{[ 10, 3, 4 ]}\nobreak
\hyperdef{L}{X7D2DFB4A78F7E961}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsGeneralizedMonomorphism({\slshape phi})\index{IsGeneralizedMonomorphism@\texttt{IsGeneralizedMonomorphism}!for maps}
\label{IsGeneralizedMonomorphism:for maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if \mbox{\texttt{\slshape phi}} is a generalized monomorphism. }

 

\subsection{\textcolor{Chapter }{IsGeneralizedIsomorphism (for maps)}}
\logpage{[ 10, 3, 5 ]}\nobreak
\hyperdef{L}{X7889C42285FEFAD9}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsGeneralizedIsomorphism({\slshape phi})\index{IsGeneralizedIsomorphism@\texttt{IsGeneralizedIsomorphism}!for maps}
\label{IsGeneralizedIsomorphism:for maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if \mbox{\texttt{\slshape phi}} is a generalized isomorphism. }

 

\subsection{\textcolor{Chapter }{IsIdentityMorphism (for maps)}}
\logpage{[ 10, 3, 6 ]}\nobreak
\hyperdef{L}{X794805DB836690E2}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsIdentityMorphism({\slshape phi})\index{IsIdentityMorphism@\texttt{IsIdentityMorphism}!for maps}
\label{IsIdentityMorphism:for maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} map \mbox{\texttt{\slshape phi}} is the identity morphism. }

 

\subsection{\textcolor{Chapter }{IsMonomorphism (for maps)}}
\logpage{[ 10, 3, 7 ]}\nobreak
\hyperdef{L}{X7F3B100C7D4D671E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsMonomorphism({\slshape phi})\index{IsMonomorphism@\texttt{IsMonomorphism}!for maps}
\label{IsMonomorphism:for maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} map \mbox{\texttt{\slshape phi}} is a monomorphism. }

 

\subsection{\textcolor{Chapter }{IsEpimorphism (for maps)}}
\logpage{[ 10, 3, 8 ]}\nobreak
\hyperdef{L}{X82CC091D876739D7}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsEpimorphism({\slshape phi})\index{IsEpimorphism@\texttt{IsEpimorphism}!for maps}
\label{IsEpimorphism:for maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} map \mbox{\texttt{\slshape phi}} is an epimorphism. }

 

\subsection{\textcolor{Chapter }{IsSplitMonomorphism (for maps)}}
\logpage{[ 10, 3, 9 ]}\nobreak
\hyperdef{L}{X828AA70580E860A5}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsSplitMonomorphism({\slshape phi})\index{IsSplitMonomorphism@\texttt{IsSplitMonomorphism}!for maps}
\label{IsSplitMonomorphism:for maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} map \mbox{\texttt{\slshape phi}} is a split monomorphism. \\
 }

 

\subsection{\textcolor{Chapter }{IsSplitEpimorphism (for maps)}}
\logpage{[ 10, 3, 10 ]}\nobreak
\hyperdef{L}{X78C79D5F7C55B7F2}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsSplitEpimorphism({\slshape phi})\index{IsSplitEpimorphism@\texttt{IsSplitEpimorphism}!for maps}
\label{IsSplitEpimorphism:for maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} map \mbox{\texttt{\slshape phi}} is a split epimorphism. \\
 }

 

\subsection{\textcolor{Chapter }{IsIsomorphism (for maps)}}
\logpage{[ 10, 3, 11 ]}\nobreak
\hyperdef{L}{X852DC9617E29C3E5}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsIsomorphism({\slshape phi})\index{IsIsomorphism@\texttt{IsIsomorphism}!for maps}
\label{IsIsomorphism:for maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} map \mbox{\texttt{\slshape phi}} is an isomorphism. }

 

\subsection{\textcolor{Chapter }{IsAutomorphism (for maps)}}
\logpage{[ 10, 3, 12 ]}\nobreak
\hyperdef{L}{X81D3E2667C838B05}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsAutomorphism({\slshape phi})\index{IsAutomorphism@\texttt{IsAutomorphism}!for maps}
\label{IsAutomorphism:for maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} map \mbox{\texttt{\slshape phi}} is an automorphism. }

 }

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

\subsection{\textcolor{Chapter }{Source (for maps)}}
\logpage{[ 10, 4, 1 ]}\nobreak
\hyperdef{L}{X8650F45C7B9240DE}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Source({\slshape phi})\index{Source@\texttt{Source}!for maps}
\label{Source:for maps}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} module



 The source of the \textsf{homalg} map \mbox{\texttt{\slshape phi}}. }

 

\subsection{\textcolor{Chapter }{Range (for maps)}}
\logpage{[ 10, 4, 2 ]}\nobreak
\hyperdef{L}{X7CE00F1E7952F99C}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Range({\slshape phi})\index{Range@\texttt{Range}!for maps}
\label{Range:for maps}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} module



 The target (range) of the \textsf{homalg} map \mbox{\texttt{\slshape phi}}. }

 

\subsection{\textcolor{Chapter }{DegreeOfMorphism (for maps)}}
\logpage{[ 10, 4, 3 ]}\nobreak
\hyperdef{L}{X875F31788601AD52}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DegreeOfMorphism({\slshape phi})\index{DegreeOfMorphism@\texttt{DegreeOfMorphism}!for maps}
\label{DegreeOfMorphism:for maps}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
an integer



 The degree of the morphism \mbox{\texttt{\slshape phi}} of graded modules. \\
 (no method installed) }

 

\subsection{\textcolor{Chapter }{CokernelEpi (for maps)}}
\logpage{[ 10, 4, 4 ]}\nobreak
\hyperdef{L}{X81F11B607D4E5252}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CokernelEpi({\slshape phi})\index{CokernelEpi@\texttt{CokernelEpi}!for maps}
\label{CokernelEpi:for maps}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} map



 The natural epimorphism from the \texttt{Range}$($\mbox{\texttt{\slshape phi}}$)$ onto the \texttt{Cokernel}$($\mbox{\texttt{\slshape phi}}$)$ (cf. \texttt{Cokernel} (\ref{Cokernel})). }

 

\subsection{\textcolor{Chapter }{CokernelNaturalGeneralizedIsomorphism (for maps)}}
\logpage{[ 10, 4, 5 ]}\nobreak
\hyperdef{L}{X7A3F204A7C40FB6A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CokernelNaturalGeneralizedIsomorphism({\slshape phi})\index{CokernelNaturalGeneralizedIsomorphism@\texttt{CokernelNaturalGeneralizedIsomorphism}!for maps}
\label{CokernelNaturalGeneralizedIsomorphism:for maps}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} map



 The natural generalized isomorphism from the \texttt{Cokernel}$($\mbox{\texttt{\slshape phi}}$)$ onto the \texttt{Range}$($\mbox{\texttt{\slshape phi}}$)$ (cf. \texttt{Cokernel} (\ref{Cokernel})). }

 

\subsection{\textcolor{Chapter }{KernelSubmodule (for maps)}}
\logpage{[ 10, 4, 6 ]}\nobreak
\hyperdef{L}{X804B0C0E87A04C0A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{KernelSubmodule({\slshape phi})\index{KernelSubmodule@\texttt{KernelSubmodule}!for maps}
\label{KernelSubmodule:for maps}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} submodule



 This constructor returns the finitely generated kernel of the \textsf{homalg} map \mbox{\texttt{\slshape phi}} as a submodule of the \textsf{homalg} module \texttt{Source}(\mbox{\texttt{\slshape phi}}) with generators given by the syzygies of \mbox{\texttt{\slshape phi}}. }

 

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



 The natural embedding of the \texttt{Kernel}$($\mbox{\texttt{\slshape phi}}$)$ into the \texttt{Source}$($\mbox{\texttt{\slshape phi}}$)$ (cf. \texttt{Kernel} (\ref{Kernel:for maps})). }

 

\subsection{\textcolor{Chapter }{ImageSubmodule (for maps)}}
\logpage{[ 10, 4, 8 ]}\nobreak
\hyperdef{L}{X7C63F7AC80633A39}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ImageSubmodule({\slshape phi})\index{ImageSubmodule@\texttt{ImageSubmodule}!for maps}
\label{ImageSubmodule:for maps}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} submodule



 This constructor returns the finitely generated image of the \textsf{homalg} map \mbox{\texttt{\slshape phi}} as a submodule of the \textsf{homalg} module \texttt{Range}(\mbox{\texttt{\slshape phi}}) with generators given by \mbox{\texttt{\slshape phi}} applied to the generators of its source module. }

 

\subsection{\textcolor{Chapter }{ImageModuleEmb (for maps)}}
\logpage{[ 10, 4, 9 ]}\nobreak
\hyperdef{L}{X7820B9D47B3CC106}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ImageModuleEmb({\slshape phi})\index{ImageModuleEmb@\texttt{ImageModuleEmb}!for maps}
\label{ImageModuleEmb:for maps}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} map



 The natural embedding of the \texttt{ImageModule}$($\mbox{\texttt{\slshape phi}}$)$ into the \texttt{Range}$($\mbox{\texttt{\slshape phi}}$)$ (cf. \texttt{ImageModule} (\ref{ImageModule})). }

 

\subsection{\textcolor{Chapter }{ImageModuleEpi (for maps)}}
\logpage{[ 10, 4, 10 ]}\nobreak
\hyperdef{L}{X81F89EF780FDFED2}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ImageModuleEpi({\slshape phi})\index{ImageModuleEpi@\texttt{ImageModuleEpi}!for maps}
\label{ImageModuleEpi:for maps}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} map



 The natural epimorphism from the \texttt{Source}$($\mbox{\texttt{\slshape phi}}$)$ onto the \texttt{ImageModule}$($\mbox{\texttt{\slshape phi}}$)$ (cf. \texttt{ImageModule} (\ref{ImageModule})). }

 

\subsection{\textcolor{Chapter }{MorphismAidMap (for maps)}}
\logpage{[ 10, 4, 11 ]}\nobreak
\hyperdef{L}{X846A8280844E89FF}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{MorphismAidMap({\slshape phi})\index{MorphismAidMap@\texttt{MorphismAidMap}!for maps}
\label{MorphismAidMap:for maps}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} map



 The morphism aid map of a true generalized map. \\
 (no method installed) }

 }

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

\subsection{\textcolor{Chapter }{HomalgRing (for maps)}}
\logpage{[ 10, 5, 1 ]}\nobreak
\hyperdef{L}{X7FD700F17C52F978}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgRing({\slshape phi})\index{HomalgRing@\texttt{HomalgRing}!for maps}
\label{HomalgRing:for maps}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring



 The \textsf{homalg} ring of the \textsf{homalg} map \mbox{\texttt{\slshape phi}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );
  <A homalg internal ring>
  gap> phi := HomalgIdentityMap( 2 * ZZ );
  <The identity morphism of a left module>
  gap> R := HomalgRing( phi );
  <A homalg internal ring>
  gap> IsIdenticalObj( R, ZZ );
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{ByASmallerPresentation (for maps)}}
\logpage{[ 10, 5, 2 ]}\nobreak
\hyperdef{L}{X87C9F65378E81254}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ByASmallerPresentation({\slshape phi})\index{ByASmallerPresentation@\texttt{ByASmallerPresentation}!for maps}
\label{ByASmallerPresentation:for maps}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} map



 See \texttt{ByASmallerPresentation} (\ref{ByASmallerPresentation:for modules}) on modules. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( ByASmallerPresentation,
          "for homalg maps",
          [ IsMapOfFinitelyGeneratedModulesRep ],
          
    function( phi )
      
      ByASmallerPresentation( Source( phi ) );
      ByASmallerPresentation( Range( phi ) );
      DecideZero( phi );
      
      return phi;
      
  end );
\end{Verbatim}
 This method performs side effects on its argument \mbox{\texttt{\slshape phi}} and returns it. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> M := LeftPresentation( M );
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );
  <A homalg internal 2 by 4 matrix>
  gap> N := LeftPresentation( N );
  <A non-torsion left module presented by 2 relations for 4 generators>
  gap> mat := HomalgMatrix( "[ \
  > 1, 0, -2, -4, \
  > 0, 1,  4,  7, \
  > 1, 0, -2, -4  \
  > ]", 3, 4, ZZ );;
  <A homalg internal 3 by 4 matrix>
  gap> phi := HomalgMap( mat, M, N );
  <A "homomorphism" of left modules>
  gap> IsMorphism( phi );
  true
  gap> phi;
  <A homomorphism of left modules>
  gap> 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
  gap> ByASmallerPresentation( phi );
  <A homomorphism of left modules>
  gap> Display( phi );
  [ [   0,   0,   0 ],
    [   1,  -1,  -2 ] ]
  
  the map is currently represented by the above 2 x 3 matrix
  gap> M;
  <A rank 1 left module presented by 1 relation for 2 generators>
  gap> Display( M );
  Z/< 3 > + Z^(1 x 1)
  gap> N;
  <A rank 2 left module presented by 1 relation for 3 generators>
  gap> Display( N );
  Z/< 4 > + Z^(1 x 2)
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{PreInverse (for maps)}}
\logpage{[ 10, 5, 3 ]}\nobreak
\hyperdef{L}{X829CAB6B78A1062E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{PreInverse({\slshape phi})\index{PreInverse@\texttt{PreInverse}!for maps}
\label{PreInverse:for maps}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} map, \texttt{false}, or \texttt{fail}



 Compute a pre-inverse of the morphism \mbox{\texttt{\slshape phi}} in case one exists. For a pre-inverse to exist \mbox{\texttt{\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{\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{homalg-limitation}). The operation \texttt{PreInverse} is used to install a method for the property \texttt{IsSplitEpimorphism} (\ref{IsSplitEpimorphism:for maps}). 

 \texttt{PreInverse} checks if it can decide the projectivity of \texttt{Range}$( \mbox{\texttt{\slshape phi}} )$. To decide the projectivity of a module $M$ over a \emph{commutative} ring you can use \\
\\
 \texttt{IsSplitEpimorphism}( \texttt{FreeHullEpi}$( M )$ ); \\
\\
 Of course you can use \texttt{IsProjective}$( M )$ which triggers other methods. }

 }

  }

   
\chapter{\textcolor{Chapter }{Complexes}}\label{Complexes}
\logpage{[ 11, 0, 0 ]}
\hyperdef{L}{X79C388D385DB7CD1}{}
{
  
\section{\textcolor{Chapter }{Complexes: Category and Representations}}\label{Complexes:Category}
\logpage{[ 11, 1, 0 ]}
\hyperdef{L}{X7FF155CB7C4C7CB4}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgComplex}}
\logpage{[ 11, 1, 1 ]}\nobreak
\hyperdef{L}{X8166F9FD7BFDA207}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgComplex({\slshape C})\index{IsHomalgComplex@\texttt{IsHomalgComplex}}
\label{IsHomalgComplex}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} (co)complexes. 

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

 

\subsection{\textcolor{Chapter }{IsComplexOfFinitelyPresentedObjectsRep}}
\logpage{[ 11, 1, 2 ]}\nobreak
\hyperdef{L}{X825B40448449FFF6}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsComplexOfFinitelyPresentedObjectsRep({\slshape C})\index{IsComplexOfFinitelyPresentedObjectsRep@\texttt{IsComplexOfFinitelyPresentedObjectsRep}}
\label{IsComplexOfFinitelyPresentedObjectsRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



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

 (It is a representation of the \textsf{GAP} category \texttt{IsHomalgComplex} (\ref{IsHomalgComplex}), which is a subrepresentation of the \textsf{GAP} representation \texttt{IsFinitelyPresentedObjectRep}.) }

 

\subsection{\textcolor{Chapter }{IsCocomplexOfFinitelyPresentedObjectsRep}}
\logpage{[ 11, 1, 3 ]}\nobreak
\hyperdef{L}{X7B0613FF7A702D48}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsCocomplexOfFinitelyPresentedObjectsRep({\slshape C})\index{IsCocomplexOfFinitelyPresentedObjectsRep@\texttt{IsCocomplexOfFinitelyPresentedObjectsRep}}
\label{IsCocomplexOfFinitelyPresentedObjectsRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



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

 (It is a representation of the \textsf{GAP} category \texttt{IsHomalgComplex} (\ref{IsHomalgComplex}), which is a subrepresentation of the \textsf{GAP} representation \texttt{IsFinitelyPresentedObjectRep}.) }

 }

 
\section{\textcolor{Chapter }{Complexes: Constructors}}\label{Complexes:Constructors}
\logpage{[ 11, 2, 0 ]}
\hyperdef{L}{X7B31FFA97FEE9B80}{}
{
  

\subsection{\textcolor{Chapter }{HomalgComplex (constructor for complexes given a module)}}
\logpage{[ 11, 2, 1 ]}\nobreak
\hyperdef{L}{X7CEFE0D78485051C}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgComplex({\slshape M[, d]})\index{HomalgComplex@\texttt{HomalgComplex}!constructor for complexes given a module}
\label{HomalgComplex:constructor for complexes given a module}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgComplex({\slshape phi[, d]})\index{HomalgComplex@\texttt{HomalgComplex}!constructor for complexes given a map}
\label{HomalgComplex:constructor for complexes given a map}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgComplex({\slshape C[, d]})\index{HomalgComplex@\texttt{HomalgComplex}!constructor for complexes given a complex}
\label{HomalgComplex:constructor for complexes given a complex}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgComplex({\slshape cm[, d]})\index{HomalgComplex@\texttt{HomalgComplex}!constructor for complexes given a chain map}
\label{HomalgComplex:constructor for complexes given a chain map}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} complex



 The first syntax creates a complex (i.e. chain complex) with the single \textsf{homalg} module \mbox{\texttt{\slshape M}} ($\to$ \ref{Modules:Constructors}) at (homological) degree \mbox{\texttt{\slshape d}}. 

 The second syntax creates a complex with the single \textsf{homalg} map \mbox{\texttt{\slshape phi}} ($\to$ \texttt{HomalgMap} (\ref{HomalgMap:constructor for maps})), its source placed at (homological) degree \mbox{\texttt{\slshape d}} (and its target at \mbox{\texttt{\slshape d}}$-1$). 

 The third syntax creates a complex (i.e. chain complex) with the single \textsf{homalg} (co)complex \mbox{\texttt{\slshape C}} at (homological) degree \mbox{\texttt{\slshape d}}. 

 The fourth syntax creates a complex with the single \textsf{homalg} (co)chain map \mbox{\texttt{\slshape cm}} ($\to$ \texttt{HomalgChainMap} (\ref{HomalgChainMap:constructor for chain maps given a map})), its source placed at (homological) degree \mbox{\texttt{\slshape d}} (and its target at \mbox{\texttt{\slshape d}}$-1$). 

 If \mbox{\texttt{\slshape d}} is not provided it defaults to zero in all cases. \\
 To add a map (resp. (co)chain map) to a complex use \texttt{Add} (\ref{Add:to complexes given a map}). 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> M := LeftPresentation( M );
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );
  <A homalg internal 2 by 4 matrix>
  gap> N := LeftPresentation( N );
  <A non-torsion left module presented by 2 relations for 4 generators>
  gap> mat := HomalgMatrix( "[ \
  > 0, 3, 6, 9, \
  > 0, 2, 4, 6, \
  > 0, 3, 6, 9  \
  > ]", 3, 4, ZZ );
  <A homalg internal 3 by 4 matrix>
  gap> phi := HomalgMap( mat, M, N );
  <A "homomorphism" of left modules>
  gap> IsMorphism( phi );
  true
  gap> phi;
  <A homomorphism of left modules>
\end{Verbatim}
 The first possibility: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  <A homomorphism of left modules>
  gap> C := HomalgComplex( N );
  <A non-zero graded homology object consisting of a single left module at degre\
  e 0>
  gap> Add( C, phi );
  gap> C;
  <A complex containing a single morphism of left modules at degrees [ 0 .. 1 ]>
\end{Verbatim}
 The second possibility: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> C := HomalgComplex( phi );
  <A non-zero acyclic complex containing a single morphism of left modules at de\
  grees [ 0 .. 1 ]>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgCocomplex (constructor for cocomplexes given a module)}}
\logpage{[ 11, 2, 2 ]}\nobreak
\hyperdef{L}{X78A8710D7A3E3054}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgCocomplex({\slshape M[, d]})\index{HomalgCocomplex@\texttt{HomalgCocomplex}!constructor for cocomplexes given a module}
\label{HomalgCocomplex:constructor for cocomplexes given a module}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgCocomplex({\slshape phi[, d]})\index{HomalgCocomplex@\texttt{HomalgCocomplex}!constructor for cocomplexes given a map}
\label{HomalgCocomplex:constructor for cocomplexes given a map}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgCocomplex({\slshape C[, d]})\index{HomalgCocomplex@\texttt{HomalgCocomplex}!constructor for cocomplexes given a complex}
\label{HomalgCocomplex:constructor for cocomplexes given a complex}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgCocomplex({\slshape cm[, d]})\index{HomalgCocomplex@\texttt{HomalgCocomplex}!constructor for cocomplexes given a chain map}
\label{HomalgCocomplex:constructor for cocomplexes given a chain map}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} complex



 The first syntax creates a cocomplex (i.e. cochain complex) with the single \textsf{homalg} module \mbox{\texttt{\slshape M}} at (cohomological) degree \mbox{\texttt{\slshape d}}. 

 The second syntax creates a cocomplex with the single \textsf{homalg} map \mbox{\texttt{\slshape phi}} ($\to$ \texttt{HomalgMap} (\ref{HomalgMap:constructor for maps})), its source placed at (cohomological) degree \mbox{\texttt{\slshape d}} (and its target at \mbox{\texttt{\slshape d}}$+1$). 

 The third syntax creates a cocomplex (i.e. cochain complex) with the single \textsf{homalg} cocomplex \mbox{\texttt{\slshape C}} at (cohomological) degree \mbox{\texttt{\slshape d}}. 

 The fourth syntax creates a cocomplex with the single \textsf{homalg} (co)chain map \mbox{\texttt{\slshape cm}} ($\to$ \texttt{HomalgChainMap} (\ref{HomalgChainMap:constructor for chain maps given a map})), its source placed at (cohomological) degree \mbox{\texttt{\slshape d}} (and its target at \mbox{\texttt{\slshape d}}$+1$). 

 If \mbox{\texttt{\slshape d}} is not provided it defaults to zero in all cases. \\
 To add a map (resp. (co)chain map) to a cocomplex use \texttt{Add} (\ref{Add:to complexes given a map}). 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> M := RightPresentation( Involution( M ) );
  <A non-torsion right module on 3 generators satisfying 2 relations>
  gap> N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );
  <A homalg internal 2 by 4 matrix>
  gap> N := RightPresentation( Involution( N ) );
  <A non-torsion right module on 4 generators satisfying 2 relations>
  gap> mat := HomalgMatrix( "[ \
  > 0, 3, 6, 9, \
  > 0, 2, 4, 6, \
  > 0, 3, 6, 9  \
  > ]", 3, 4, ZZ );
  <A homalg internal 3 by 4 matrix>
  gap> phi := HomalgMap( Involution( mat ), M, N );
  <A "homomorphism" of right modules>
  gap> IsMorphism( phi );
  true
  gap> phi;
  <A homomorphism of right modules>
\end{Verbatim}
 The first possibility: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  <A homomorphism of right modules>
  gap> C := HomalgCocomplex( M );
  <A non-zero graded cohomology object consisting of a single right module at de\
  gree 0>
  gap> Add( C, phi );
  gap> C;
  <A cocomplex containing a single morphism of right modules at degrees
  [ 0 .. 1 ]>
\end{Verbatim}
 The second possibility: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> C := HomalgCocomplex( phi );
  <A non-zero acyclic cocomplex containing a single morphism of right modules at\
   degrees [ 0 .. 1 ]>
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Complexes: Properties}}\label{Complexes:Properties}
\logpage{[ 11, 3, 0 ]}
\hyperdef{L}{X80A23E668343440B}{}
{
  

\subsection{\textcolor{Chapter }{IsSequence}}
\logpage{[ 11, 3, 1 ]}\nobreak
\hyperdef{L}{X7C668F517AEB1F99}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsSequence({\slshape C})\index{IsSequence@\texttt{IsSequence}}
\label{IsSequence}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if all maps in \mbox{\texttt{\slshape C}} are well-defined. }

 

\subsection{\textcolor{Chapter }{IsComplex}}
\logpage{[ 11, 3, 2 ]}\nobreak
\hyperdef{L}{X856E7B4E8264E8F0}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsComplex({\slshape C})\index{IsComplex@\texttt{IsComplex}}
\label{IsComplex}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if \mbox{\texttt{\slshape C}} is complex. }

 

\subsection{\textcolor{Chapter }{IsAcyclic}}
\logpage{[ 11, 3, 3 ]}\nobreak
\hyperdef{L}{X847A62A6806046C4}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsAcyclic({\slshape C})\index{IsAcyclic@\texttt{IsAcyclic}}
\label{IsAcyclic}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} complex \mbox{\texttt{\slshape C}} is acyclic, i.e. exact except at its boundaries. }

 

\subsection{\textcolor{Chapter }{IsRightAcyclic}}
\logpage{[ 11, 3, 4 ]}\nobreak
\hyperdef{L}{X7F4927337891E086}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsRightAcyclic({\slshape C})\index{IsRightAcyclic@\texttt{IsRightAcyclic}}
\label{IsRightAcyclic}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} complex \mbox{\texttt{\slshape C}} is acyclic, i.e. exact except at its left boundary. }

 

\subsection{\textcolor{Chapter }{IsLeftAcyclic}}
\logpage{[ 11, 3, 5 ]}\nobreak
\hyperdef{L}{X8673124C83AA8FCC}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsLeftAcyclic({\slshape C})\index{IsLeftAcyclic@\texttt{IsLeftAcyclic}}
\label{IsLeftAcyclic}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} complex \mbox{\texttt{\slshape C}} is acyclic, i.e. exact except at its right boundary. }

 

\subsection{\textcolor{Chapter }{IsGradedObject}}
\logpage{[ 11, 3, 6 ]}\nobreak
\hyperdef{L}{X78FEA48B7839E683}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsGradedObject({\slshape C})\index{IsGradedObject@\texttt{IsGradedObject}}
\label{IsGradedObject}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} complex \mbox{\texttt{\slshape C}} is a graded object, i.e. if all maps between the objects in \mbox{\texttt{\slshape C}} vanish. }

 

\subsection{\textcolor{Chapter }{IsExactSequence}}
\logpage{[ 11, 3, 7 ]}\nobreak
\hyperdef{L}{X793465497B435197}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsExactSequence({\slshape C})\index{IsExactSequence@\texttt{IsExactSequence}}
\label{IsExactSequence}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} complex \mbox{\texttt{\slshape C}} is exact. }

 

\subsection{\textcolor{Chapter }{IsShortExactSequence}}
\logpage{[ 11, 3, 8 ]}\nobreak
\hyperdef{L}{X87ADD4F685457000}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsShortExactSequence({\slshape C})\index{IsShortExactSequence@\texttt{IsShortExactSequence}}
\label{IsShortExactSequence}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} complex \mbox{\texttt{\slshape C}} is a short exact sequence. }

 

\subsection{\textcolor{Chapter }{IsSplitShortExactSequence}}
\logpage{[ 11, 3, 9 ]}\nobreak
\hyperdef{L}{X7BAF581986905995}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsSplitShortExactSequence({\slshape C})\index{IsSplitShortExactSequence@\texttt{IsSplitShortExactSequence}}
\label{IsSplitShortExactSequence}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} complex \mbox{\texttt{\slshape C}} is a split short exact sequence. }

 

\subsection{\textcolor{Chapter }{IsTriangle}}
\logpage{[ 11, 3, 10 ]}\nobreak
\hyperdef{L}{X84B794FB86C169CF}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsTriangle({\slshape C})\index{IsTriangle@\texttt{IsTriangle}}
\label{IsTriangle}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Set to true if the \textsf{homalg} complex \mbox{\texttt{\slshape C}} is a triangle. }

 

\subsection{\textcolor{Chapter }{IsExactTriangle}}
\logpage{[ 11, 3, 11 ]}\nobreak
\hyperdef{L}{X81E57EE37FC94539}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsExactTriangle({\slshape C})\index{IsExactTriangle@\texttt{IsExactTriangle}}
\label{IsExactTriangle}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} complex \mbox{\texttt{\slshape C}} is an exact triangle. }

 }

 
\section{\textcolor{Chapter }{Complexes: Attributes}}\label{Complexes:Attributes}
\logpage{[ 11, 4, 0 ]}
\hyperdef{L}{X7BC7B49D7F928DF8}{}
{
  

\subsection{\textcolor{Chapter }{BettiDiagram (for complexes)}}
\logpage{[ 11, 4, 1 ]}\nobreak
\hyperdef{L}{X8148B0227E77C74F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{BettiDiagram({\slshape C})\index{BettiDiagram@\texttt{BettiDiagram}!for complexes}
\label{BettiDiagram:for complexes}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} diagram



 The Betti diagram of the \textsf{homalg} complex \mbox{\texttt{\slshape C}} of graded modules. }

 }

 
\section{\textcolor{Chapter }{Complexes: Operations and Functions}}\label{Complexes:Operations}
\logpage{[ 11, 5, 0 ]}
\hyperdef{L}{X84E12E9C7A60D9BC}{}
{
  

\subsection{\textcolor{Chapter }{Add (to complexes given a map)}}
\logpage{[ 11, 5, 1 ]}\nobreak
\hyperdef{L}{X857E46A67FA6A09A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Add({\slshape C, phi})\index{Add@\texttt{Add}!to complexes given a map}
\label{Add:to complexes given a map}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Add({\slshape C, mat})\index{Add@\texttt{Add}!to complexes given a matrix}
\label{Add:to complexes given a matrix}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} complex



 In the first syntax the map \mbox{\texttt{\slshape phi}} is added to the (co)chain complex \mbox{\texttt{\slshape C}} ($\to$ \ref{Complexes:Constructors}) as the new \emph{highest} degree morphism and the altered argument \mbox{\texttt{\slshape C}} is returned. In case \mbox{\texttt{\slshape C}} is a chain complex, the highest degree module in \mbox{\texttt{\slshape C}} and the target of \mbox{\texttt{\slshape phi}} must be \emph{identical}. In case \mbox{\texttt{\slshape C}} is a \emph{co}chain complex, the highest degree module in \mbox{\texttt{\slshape C}} and the source of \mbox{\texttt{\slshape phi}} must be \emph{identical}. 

 In the second syntax the matrix \mbox{\texttt{\slshape mat}} is interpreted as the matrix of the new \emph{highest} degree morphism $psi$, created according to the following rules: In case \mbox{\texttt{\slshape C}} is a chain complex, the highest degree left (resp. right) module $C_d$ in \mbox{\texttt{\slshape C}} is declared as the target of $psi$, while its source is taken to be a free left (resp. right) module of rank
equal to \texttt{NrRows}(\mbox{\texttt{\slshape mat}}) (resp. \texttt{NrColumns}(\mbox{\texttt{\slshape mat}})). For this \texttt{NrColumns}(\mbox{\texttt{\slshape mat}}) (resp. \texttt{NrRows}(\mbox{\texttt{\slshape mat}})) must coincide with the \texttt{NrGenerators}($C_d$). In case \mbox{\texttt{\slshape C}} is a \emph{co}chain complex, the highest degree left (resp. right) module $C^d$ in \mbox{\texttt{\slshape C}} is declared as the source of $psi$, while its target is taken to be a free left (resp. right) module of rank
equal to \texttt{NrColumns}(\mbox{\texttt{\slshape mat}}) (resp. \texttt{NrRows}(\mbox{\texttt{\slshape mat}})). For this \texttt{NrRows}(\mbox{\texttt{\slshape mat}}) (resp. \texttt{Columns}(\mbox{\texttt{\slshape mat}})) must coincide with the \texttt{NrGenerators}($C^d$). 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> mat := HomalgMatrix( "[ 0, 1,   0, 0 ]", 2, 2, ZZ );
  <A homalg internal 2 by 2 matrix>
  gap> phi := HomalgMap( mat );
  <A homomorphism of left modules>
  gap> C := HomalgComplex( phi );
  <A non-zero acyclic complex containing a single morphism of left modules at de\
  grees [ 0 .. 1 ]>
  gap> Add( C, mat );
  gap> C;
  <A sequence containing 2 morphisms of left modules at degrees [ 0 .. 2 ]>
  gap> Display( C );
  -------------------------
  at homology degree: 2
  Z^(1 x 2)
  -------------------------
  [ [  0,  1 ],
    [  0,  0 ] ]
  
  the map is currently represented by the above 2 x 2 matrix
  ------------v------------
  at homology degree: 1
  Z^(1 x 2)
  -------------------------
  [ [  0,  1 ],
    [  0,  0 ] ]
  
  the map is currently represented by the above 2 x 2 matrix
  ------------v------------
  at homology degree: 0
  Z^(1 x 2)
  -------------------------
  gap> IsComplex( C );
  true
  gap> IsAcyclic( C );
  true
  gap> IsExactSequence( C );
  false
  gap> C;
  <A non-zero acyclic complex containing 2 morphisms of left modules at degrees
  [ 0 .. 2 ]>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{ByASmallerPresentation (for complexes)}}
\logpage{[ 11, 5, 2 ]}\nobreak
\hyperdef{L}{X79677A407C9EF3A0}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ByASmallerPresentation({\slshape C})\index{ByASmallerPresentation@\texttt{ByASmallerPresentation}!for complexes}
\label{ByASmallerPresentation:for complexes}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} complex



 See \texttt{ByASmallerPresentation} (\ref{ByASmallerPresentation:for modules}) on modules. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( ByASmallerPresentation,
          "for homalg complexes",
          [ IsHomalgComplex ],
          
    function( C )
      
      List( ObjectsOfComplex( C ), ByASmallerPresentation );
      
      if Length( ObjectDegreesOfComplex( C ) ) > 1 then
          List( MorphismsOfComplex( C ), DecideZero );
      fi;
      
      IsZero( C );
      
      return C;
      
  end );
\end{Verbatim}
 This method performs side effects on its argument \mbox{\texttt{\slshape C}} and returns it. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> M := LeftPresentation( M );
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );
  <A homalg internal 2 by 4 matrix>
  gap> N := LeftPresentation( N );
  <A non-torsion left module presented by 2 relations for 4 generators>
  gap> mat := HomalgMatrix( "[ \
  > 0, 3, 6, 9, \
  > 0, 2, 4, 6, \
  > 0, 3, 6, 9  \
  > ]", 3, 4, ZZ );
  <A homalg internal 3 by 4 matrix>
  gap> phi := HomalgMap( mat, M, N );
  <A "homomorphism" of left modules>
  gap> IsMorphism( phi );
  true
  gap> phi;
  <A homomorphism of left modules>
  gap> C := HomalgComplex( phi );
  <A non-zero acyclic complex containing a single morphism of left modules at de\
  grees [ 0 .. 1 ]>
  gap> Display( C );
  -------------------------
  at homology degree: 1
  [ [  2,  3,  4 ],
    [  5,  6,  7 ] ]
  
  Cokernel of the map
  
  Z^(1x2) --> Z^(1x3),
  
  currently represented by the above matrix
  -------------------------
  [ [  0,  3,  6,  9 ],
    [  0,  2,  4,  6 ],
    [  0,  3,  6,  9 ] ]
  
  the map is currently represented by the above 3 x 4 matrix
  ------------v------------
  at homology degree: 0
  [ [  2,  3,  4,  5 ],
    [  6,  7,  8,  9 ] ]
  
  Cokernel of the map
  
  Z^(1x2) --> Z^(1x4),
  
  currently represented by the above matrix
  -------------------------
\end{Verbatim}
 And now: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ByASmallerPresentation( C );
  <A non-zero acyclic complex containing a single morphism of left modules at de\
  grees [ 0 .. 1 ]>
  gap> Display( C );
  -------------------------
  at homology degree: 1
  Z/< 3 > + Z^(1 x 1)
  -------------------------
  [ [  0,  0,  0 ],
    [  2,  0,  0 ] ]
  
  the map is currently represented by the above 2 x 3 matrix
  ------------v------------
  at homology degree: 0
  Z/< 4 > + Z^(1 x 2)
  -------------------------
\end{Verbatim}
 }

 }

  }

   
\chapter{\textcolor{Chapter }{Chain Maps}}\label{ChainMaps}
\logpage{[ 12, 0, 0 ]}
\hyperdef{L}{X85F418EB859E7597}{}
{
  
\section{\textcolor{Chapter }{ChainMaps: Categories and Representations}}\label{ChainMaps:Category}
\logpage{[ 12, 1, 0 ]}
\hyperdef{L}{X7908AEB8851AF1DB}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgChainMap}}
\logpage{[ 12, 1, 1 ]}\nobreak
\hyperdef{L}{X7D1F7DA582F16489}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgChainMap({\slshape cm})\index{IsHomalgChainMap@\texttt{IsHomalgChainMap}}
\label{IsHomalgChainMap}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} (co)chain maps. 

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

 

\subsection{\textcolor{Chapter }{IsHomalgChainSelfMap}}
\logpage{[ 12, 1, 2 ]}\nobreak
\hyperdef{L}{X86891F6D7B6C3A02}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgChainSelfMap({\slshape cm})\index{IsHomalgChainSelfMap@\texttt{IsHomalgChainSelfMap}}
\label{IsHomalgChainSelfMap}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} (co)chain self-maps. 

 (It is a subcategory of the \textsf{GAP} categories \texttt{IsHomalgChainMap} and \texttt{IsHomalgEndomorphism}.) }

 

\subsection{\textcolor{Chapter }{IsChainMapOfFinitelyPresentedObjectsRep}}
\logpage{[ 12, 1, 3 ]}\nobreak
\hyperdef{L}{X783A5A2079D987B4}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsChainMapOfFinitelyPresentedObjectsRep({\slshape c})\index{IsChainMapOfFinitelyPresentedObjectsRep@\texttt{IsChainMapOfFinitelyPresentedObjectsRep}}
\label{IsChainMapOfFinitelyPresentedObjectsRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



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

 (It is a representation of the \textsf{GAP} category \texttt{IsHomalgChainMap} (\ref{IsHomalgChainMap}), which is a subrepresentation of the \textsf{GAP} representation \texttt{IsMorphismOfFinitelyGeneratedModulesRep}.) }

 

\subsection{\textcolor{Chapter }{IsCochainMapOfFinitelyPresentedObjectsRep}}
\logpage{[ 12, 1, 4 ]}\nobreak
\hyperdef{L}{X7AFE9E9B80991D55}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsCochainMapOfFinitelyPresentedObjectsRep({\slshape c})\index{IsCochainMapOfFinitelyPresentedObjectsRep@\texttt{IsCochain}\-\texttt{Map}\-\texttt{Of}\-\texttt{Finitely}\-\texttt{Presented}\-\texttt{ObjectsRep}}
\label{IsCochainMapOfFinitelyPresentedObjectsRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



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

 (It is a representation of the \textsf{GAP} category \texttt{IsHomalgChainMap} (\ref{IsHomalgChainMap}), which is a subrepresentation of the \textsf{GAP} representation \texttt{IsMorphismOfFinitelyGeneratedModulesRep}.) }

 }

 
\section{\textcolor{Chapter }{Chain Maps: Constructors}}\label{ChainMaps:Constructors}
\logpage{[ 12, 2, 0 ]}
\hyperdef{L}{X788ADE6C84D455B4}{}
{
  

\subsection{\textcolor{Chapter }{HomalgChainMap (constructor for chain maps given a map)}}
\logpage{[ 12, 2, 1 ]}\nobreak
\hyperdef{L}{X790F53107827F484}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgChainMap({\slshape phi[, C][, D][, d]})\index{HomalgChainMap@\texttt{HomalgChainMap}!constructor for chain maps given a map}
\label{HomalgChainMap:constructor for chain maps given a map}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} chain map



 The constructor creates a (co)chain map given a source \textsf{homalg} (co)chain complex \mbox{\texttt{\slshape C}}, a target \textsf{homalg} (co)chain complex \mbox{\texttt{\slshape D}} ($\to$ \ref{Modules:Constructors}), and a \textsf{homalg} map \mbox{\texttt{\slshape phi}} ($\to$ \ref{Maps:Constructors})at (co)homological degree \mbox{\texttt{\slshape d}}. The returned (co)chain map will cautiously be indicated using parenthesis: ``chain map''. To verify if the result is indeed a (co)chain map use \texttt{IsMorphism} (\ref{IsMorphism:for chain maps}). If source and target are identical objects, and only then, the (co)chain map
is created as a (co)chain selfmap. 

 The following examples shows a chain map that induces the zero map on
homology, but is itself \emph{not} zero in the derived category: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := 1 * ZZ;
  <The free left module of rank 1 on a free generator>
  gap> Display( M );
  Z^(1 x 1)
  gap> N := HomalgMatrix( "[3]", 1, 1, ZZ );;
  gap> N := LeftPresentation( N );
  <A cyclic left module presented by 1 relation for a cyclic generator>
  gap> Display( N );
  Z/< 3 >
  gap> a := HomalgMap( HomalgMatrix( "[2]", 1, 1, ZZ ), M, M );
  <An endomorphism of a left module>
  gap> c := HomalgMap( HomalgMatrix( "[2]", 1, 1, ZZ ), M, N );
  <A homomorphism of left modules>
  gap> b := HomalgMap( HomalgMatrix( "[1]", 1, 1, ZZ ), M, M );
  <An endomorphism of a left module>
  gap> d := HomalgMap( HomalgMatrix( "[1]", 1, 1, ZZ ), M, N );
  <A homomorphism of left modules>
  gap> C1 := HomalgComplex( a );
  <A non-zero acyclic complex containing a single morphism of left modules at de\
  grees [ 0 .. 1 ]>
  gap> C2 := HomalgComplex( c );
  <A non-zero acyclic complex containing a single morphism of left modules at de\
  grees [ 0 .. 1 ]>
  gap> cm := HomalgChainMap( d, C1, C2 );
  <A "chain map" containing a single left morphism at degree 0>
  gap> Add( cm, b );
  gap> IsMorphism( cm );
  true
  gap> cm;
  <A chain map containing 2 morphisms of left modules at degrees [ 0 .. 1 ]>
  gap> hcm := DefectOfExactness( cm );
  <A chain map of graded objects containing
  2 morphisms of left modules at degrees [ 0 .. 1 ]>
  gap> IsZero( hcm );
  true
  gap> IsZero( Source( hcm ) );
  false
  gap> IsZero( Range( hcm ) );
  false
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Chain Maps: Properties}}\label{ChainMaps:Properties}
\logpage{[ 12, 3, 0 ]}
\hyperdef{L}{X7E0B309481FE7648}{}
{
  

\subsection{\textcolor{Chapter }{IsMorphism (for chain maps)}}
\logpage{[ 12, 3, 1 ]}\nobreak
\hyperdef{L}{X7C51945578C40438}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsMorphism({\slshape cm})\index{IsMorphism@\texttt{IsMorphism}!for chain maps}
\label{IsMorphism:for chain maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if \mbox{\texttt{\slshape cm}} is a well-defined chain map, i.e. independent of all involved presentations. }

 

\subsection{\textcolor{Chapter }{IsGeneralizedMorphism (for chain maps)}}
\logpage{[ 12, 3, 2 ]}\nobreak
\hyperdef{L}{X875F349481F18752}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsGeneralizedMorphism({\slshape cm})\index{IsGeneralizedMorphism@\texttt{IsGeneralizedMorphism}!for chain maps}
\label{IsGeneralizedMorphism:for chain maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if \mbox{\texttt{\slshape cm}} is a generalized morphism. }

 

\subsection{\textcolor{Chapter }{IsGeneralizedEpimorphism (for chain maps)}}
\logpage{[ 12, 3, 3 ]}\nobreak
\hyperdef{L}{X8629415C78396475}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsGeneralizedEpimorphism({\slshape cm})\index{IsGeneralizedEpimorphism@\texttt{IsGeneralizedEpimorphism}!for chain maps}
\label{IsGeneralizedEpimorphism:for chain maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if \mbox{\texttt{\slshape cm}} is a generalized epimorphism. }

 

\subsection{\textcolor{Chapter }{IsGeneralizedMonomorphism (for chain maps)}}
\logpage{[ 12, 3, 4 ]}\nobreak
\hyperdef{L}{X7E47F063846C6D6E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsGeneralizedMonomorphism({\slshape cm})\index{IsGeneralizedMonomorphism@\texttt{IsGeneralizedMonomorphism}!for chain maps}
\label{IsGeneralizedMonomorphism:for chain maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if \mbox{\texttt{\slshape cm}} is a generalized monomorphism. }

 

\subsection{\textcolor{Chapter }{IsGeneralizedIsomorphism (for chain maps)}}
\logpage{[ 12, 3, 5 ]}\nobreak
\hyperdef{L}{X798F94AA7EB8FD5E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsGeneralizedIsomorphism({\slshape cm})\index{IsGeneralizedIsomorphism@\texttt{IsGeneralizedIsomorphism}!for chain maps}
\label{IsGeneralizedIsomorphism:for chain maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if \mbox{\texttt{\slshape cm}} is a generalized isomorphism. }

 

\subsection{\textcolor{Chapter }{IsIdentityMorphism (for chain maps)}}
\logpage{[ 12, 3, 6 ]}\nobreak
\hyperdef{L}{X81F1E2EF7A6C53B2}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsIdentityMorphism({\slshape cm})\index{IsIdentityMorphism@\texttt{IsIdentityMorphism}!for chain maps}
\label{IsIdentityMorphism:for chain maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} chain map \mbox{\texttt{\slshape cm}} is the identity chain map. }

 

\subsection{\textcolor{Chapter }{IsMonomorphism (for chain maps)}}
\logpage{[ 12, 3, 7 ]}\nobreak
\hyperdef{L}{X820E6D8F87B9B086}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsMonomorphism({\slshape cm})\index{IsMonomorphism@\texttt{IsMonomorphism}!for chain maps}
\label{IsMonomorphism:for chain maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} chain map \mbox{\texttt{\slshape cm}} is a monomorphism. }

 

\subsection{\textcolor{Chapter }{IsEpimorphism (for chain maps)}}
\logpage{[ 12, 3, 8 ]}\nobreak
\hyperdef{L}{X79A006138311157D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsEpimorphism({\slshape cm})\index{IsEpimorphism@\texttt{IsEpimorphism}!for chain maps}
\label{IsEpimorphism:for chain maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} chain map \mbox{\texttt{\slshape cm}} is an epimorphism. }

 

\subsection{\textcolor{Chapter }{IsSplitMonomorphism (for chain maps)}}
\logpage{[ 12, 3, 9 ]}\nobreak
\hyperdef{L}{X78F5E853877CA1EC}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsSplitMonomorphism({\slshape cm})\index{IsSplitMonomorphism@\texttt{IsSplitMonomorphism}!for chain maps}
\label{IsSplitMonomorphism:for chain maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} chain map \mbox{\texttt{\slshape cm}} is a split monomorphism. \\
 }

 

\subsection{\textcolor{Chapter }{IsSplitEpimorphism (for chain maps)}}
\logpage{[ 12, 3, 10 ]}\nobreak
\hyperdef{L}{X82846E59855F74A2}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsSplitEpimorphism({\slshape cm})\index{IsSplitEpimorphism@\texttt{IsSplitEpimorphism}!for chain maps}
\label{IsSplitEpimorphism:for chain maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} chain map \mbox{\texttt{\slshape cm}} is a split epimorphism. \\
 }

 

\subsection{\textcolor{Chapter }{IsIsomorphism (for chain maps)}}
\logpage{[ 12, 3, 11 ]}\nobreak
\hyperdef{L}{X8606D3E57A5FEF4F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsIsomorphism({\slshape cm})\index{IsIsomorphism@\texttt{IsIsomorphism}!for chain maps}
\label{IsIsomorphism:for chain maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} chain map \mbox{\texttt{\slshape cm}} is an isomorphism. }

 

\subsection{\textcolor{Chapter }{IsAutomorphism (for chain maps)}}
\logpage{[ 12, 3, 12 ]}\nobreak
\hyperdef{L}{X78D6ECA186775C9D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsAutomorphism({\slshape cm})\index{IsAutomorphism@\texttt{IsAutomorphism}!for chain maps}
\label{IsAutomorphism:for chain maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} chain map \mbox{\texttt{\slshape cm}} is an automorphism. }

 

\subsection{\textcolor{Chapter }{IsGradedMorphism (for chain maps)}}
\logpage{[ 12, 3, 13 ]}\nobreak
\hyperdef{L}{X79D6B23F79EBA680}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsGradedMorphism({\slshape cm})\index{IsGradedMorphism@\texttt{IsGradedMorphism}!for chain maps}
\label{IsGradedMorphism:for chain maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the source and target complex of the \textsf{homalg} chain map \mbox{\texttt{\slshape cm}} are graded objects, i.e. if all their morphisms vanish. }

 

\subsection{\textcolor{Chapter }{IsQuasiIsomorphism (for chain maps)}}
\logpage{[ 12, 3, 14 ]}\nobreak
\hyperdef{L}{X81E12B4F85E452FF}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsQuasiIsomorphism({\slshape cm})\index{IsQuasiIsomorphism@\texttt{IsQuasiIsomorphism}!for chain maps}
\label{IsQuasiIsomorphism:for chain maps}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} chain map \mbox{\texttt{\slshape cm}} is a quasi-isomorphism. }

 }

 
\section{\textcolor{Chapter }{Chain Maps: Attributes}}\label{ChainMaps:Attributes}
\logpage{[ 12, 4, 0 ]}
\hyperdef{L}{X856EBA6F7A94C552}{}
{
  

\subsection{\textcolor{Chapter }{Source (for chain maps)}}
\logpage{[ 12, 4, 1 ]}\nobreak
\hyperdef{L}{X793C9A3E7962BECA}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Source({\slshape cm})\index{Source@\texttt{Source}!for chain maps}
\label{Source:for chain maps}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} complex



 The source of the \textsf{homalg} chain map \mbox{\texttt{\slshape cm}}. }

 

\subsection{\textcolor{Chapter }{Range (for chain maps)}}
\logpage{[ 12, 4, 2 ]}\nobreak
\hyperdef{L}{X7ACA13B67F5B254F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Range({\slshape cm})\index{Range@\texttt{Range}!for chain maps}
\label{Range:for chain maps}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} complex



 The target (range) of the \textsf{homalg} chain map \mbox{\texttt{\slshape cm}}. }

 }

 
\section{\textcolor{Chapter }{Chain Maps: Operations and Functions}}\label{ChainMaps:Operations}
\logpage{[ 12, 5, 0 ]}
\hyperdef{L}{X8684197D8481DE87}{}
{
  

\subsection{\textcolor{Chapter }{ByASmallerPresentation (for chain maps)}}
\logpage{[ 12, 5, 1 ]}\nobreak
\hyperdef{L}{X7E92DECA823942D1}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ByASmallerPresentation({\slshape cm})\index{ByASmallerPresentation@\texttt{ByASmallerPresentation}!for chain maps}
\label{ByASmallerPresentation:for chain maps}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} complex



 See \texttt{ByASmallerPresentation} (\ref{ByASmallerPresentation:for complexes}) on complexes. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( ByASmallerPresentation,
          "for homalg chain maps",
          [ IsHomalgChainMap ],
          
    function( cm )
      
      ByASmallerPresentation( Source( cm ) );
      ByASmallerPresentation( Range( cm ) );
      
      List( MorphismsOfChainMap( cm ), DecideZero );
      
      return cm;
      
  end );
\end{Verbatim}
 This method performs side effects on its argument \mbox{\texttt{\slshape cm}} and returns it. }

 }

  }

   
\chapter{\textcolor{Chapter }{Bicomplexes}}\label{Bicomplexes}
\logpage{[ 13, 0, 0 ]}
\hyperdef{L}{X7CEDAD61826170CF}{}
{
  Each bicomplex in \textsf{homalg} has an underlying complex of complexes. The bicomplex structure is simply the
addition of the known sign trick which induces the obvious equivalence between
the category of bicomplexes and the category of complexes with complexes as
objects and chain maps as morphisms. The majority of filtered complexes in
algebra and geometry (unlike topology) arise as the total complex of a
bicomplex. Hence, most spectral sequences in algebra are spectral sequences of
bicomplexes. Indeed, bicomplexes in \textsf{homalg} are mainly used as an input for the spectral sequence machinery. 
\section{\textcolor{Chapter }{Bicomplexes: Category and Representations}}\label{Bicomplexes:Category}
\logpage{[ 13, 1, 0 ]}
\hyperdef{L}{X7CBAE2807BD16E7E}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgBicomplex}}
\logpage{[ 13, 1, 1 ]}\nobreak
\hyperdef{L}{X80B7C45A850F4C3E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgBicomplex({\slshape BC})\index{IsHomalgBicomplex@\texttt{IsHomalgBicomplex}}
\label{IsHomalgBicomplex}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} bi(co)complexes. 

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

 

\subsection{\textcolor{Chapter }{IsBicomplexOfFinitelyPresentedObjectsRep}}
\logpage{[ 13, 1, 2 ]}\nobreak
\hyperdef{L}{X7892BBCD783ABE16}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsBicomplexOfFinitelyPresentedObjectsRep({\slshape BC})\index{IsBicomplexOfFinitelyPresentedObjectsRep@\texttt{IsBicomplexOfFinitelyPresentedObjectsRep}}
\label{IsBicomplexOfFinitelyPresentedObjectsRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} representation of bicomplexes (homological bicomplexes) of finitley generated \textsf{homalg} objects. 

 (It is a representation of the \textsf{GAP} category \texttt{IsHomalgBicomplex} (\ref{IsHomalgBicomplex}), which is a subrepresentation of the \textsf{GAP} representation \texttt{IsFinitelyPresentedObjectRep}.) }

 

\subsection{\textcolor{Chapter }{IsBicocomplexOfFinitelyPresentedObjectsRep}}
\logpage{[ 13, 1, 3 ]}\nobreak
\hyperdef{L}{X7A82F6DC7C4C7761}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsBicocomplexOfFinitelyPresentedObjectsRep({\slshape BC})\index{IsBicocomplexOfFinitelyPresentedObjectsRep@\texttt{IsBicocomplex}\-\texttt{Of}\-\texttt{Finitely}\-\texttt{Presented}\-\texttt{ObjectsRep}}
\label{IsBicocomplexOfFinitelyPresentedObjectsRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} representation of bicocomplexes (cohomological bicomplexes) of finitley
generated \textsf{homalg} objects. 

 (It is a representation of the \textsf{GAP} category \texttt{IsHomalgBicomplex} (\ref{IsHomalgBicomplex}), which is a subrepresentation of the \textsf{GAP} representation \texttt{IsFinitelyPresentedObjectRep}.) }

 }

 
\section{\textcolor{Chapter }{Bicomplexes: Constructors}}\label{Bicomplexes:Constructors}
\logpage{[ 13, 2, 0 ]}
\hyperdef{L}{X842D047F7E00F774}{}
{
  

\subsection{\textcolor{Chapter }{HomalgBicomplex (constructor for bicomplexes given a complex of complexes)}}
\logpage{[ 13, 2, 1 ]}\nobreak
\hyperdef{L}{X86D50FE285F49BF6}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgBicomplex({\slshape C})\index{HomalgBicomplex@\texttt{HomalgBicomplex}!constructor for bicomplexes given a complex of complexes}
\label{HomalgBicomplex:constructor for bicomplexes given a complex of complexes}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} bicomplex



 This constructor creates a bicomplex (homological bicomplex) given a \textsf{homalg} complex of (co)complexes \mbox{\texttt{\slshape C}} ($\to$ \texttt{HomalgComplex} (\ref{HomalgComplex:constructor for complexes given a chain map})), resp. creates a bicocomplex (cohomological bicomplex) given a \textsf{homalg} cocomplex of (co)complexes \mbox{\texttt{\slshape C}} ($\to$ \texttt{HomalgCocomplex} (\ref{HomalgCocomplex:constructor for cocomplexes given a chain map})). Using the usual sign-trick a complex of complexes gives rise to a bicomplex
and vice versa. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );
  <A homalg internal 2 by 3 matrix>
  gap> M := LeftPresentation( M );
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> d := Resolution( M );
  <A non-zero right acyclic complex containing a single morphism of left modules\
   at degrees [ 0 .. 1 ]>
  gap> dd := Hom( d );
  <An acyclic cocomplex containing a single morphism of right modules at degrees\
   [ 0 .. 1 ]>
  <A non-zero acyclic cocomplex containing a single morphism of right modules at\
   degrees [ 0 .. 1 ]>
  gap> C := Resolution( dd );
  <An acyclic cocomplex containing a single morphism of right complexes at degre\
  es [ 0 .. 1 ]>
  gap> CC := Hom( C );
  <An acyclic complex containing a single morphism of left cocomplexes at degree\
  s [ 0 .. 1 ]>
  gap> BC := HomalgBicomplex( CC );
  <A bicomplex containing left modules at bidegrees [ 0 .. 1 ]x[ -1 .. 0 ]>
  gap> Display( BC );
   * *
   * *
  gap> UU := UnderlyingComplex( BC );
  <An acyclic complex containing a single morphism of left cocomplexes at degree\
  s [ 0 .. 1 ]>
  gap> IsIdenticalObj( UU, CC );
  true
  gap> tBC := TransposedBicomplex( BC );
  <A bicomplex containing left modules at bidegrees [ -1 .. 0 ]x[ 0 .. 1 ]>
  gap> Display( tBC );
   * *
   * *
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Bicomplexes: Properties}}\label{Bicomplexes:Properties}
\logpage{[ 13, 3, 0 ]}
\hyperdef{L}{X854AA4C379C813AC}{}
{
  

\subsection{\textcolor{Chapter }{IsBisequence}}
\logpage{[ 13, 3, 1 ]}\nobreak
\hyperdef{L}{X7912E2147849BA74}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsBisequence({\slshape BC})\index{IsBisequence@\texttt{IsBisequence}}
\label{IsBisequence}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if all maps in \mbox{\texttt{\slshape BC}} are well-defined. }

 

\subsection{\textcolor{Chapter }{IsBicomplex}}
\logpage{[ 13, 3, 2 ]}\nobreak
\hyperdef{L}{X87886CA9828D0B4A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsBicomplex({\slshape BC})\index{IsBicomplex@\texttt{IsBicomplex}}
\label{IsBicomplex}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if \mbox{\texttt{\slshape BC}} is bicomplex. }

 

\subsection{\textcolor{Chapter }{IsTransposedWRTTheAssociatedComplex}}
\logpage{[ 13, 3, 3 ]}\nobreak
\hyperdef{L}{X85363EC87E54554C}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsTransposedWRTTheAssociatedComplex({\slshape BC})\index{IsTransposedWRTTheAssociatedComplex@\texttt{IsTransposedWRTTheAssociatedComplex}}
\label{IsTransposedWRTTheAssociatedComplex}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if \mbox{\texttt{\slshape BC}} is transposed with respect to the associated complex of complexes. \\
 (no method installed). }

 }

 
\section{\textcolor{Chapter }{Bicomplexes: Attributes}}\label{Bicomplexes:Attributes}
\logpage{[ 13, 4, 0 ]}
\hyperdef{L}{X7E2F2E387A4EF533}{}
{
  

\subsection{\textcolor{Chapter }{TotalComplex}}
\logpage{[ 13, 4, 1 ]}\nobreak
\hyperdef{L}{X7C805D967E803BEF}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{TotalComplex({\slshape BC})\index{TotalComplex@\texttt{TotalComplex}}
\label{TotalComplex}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} (co)complex



 The associated total complex. }

 

\subsection{\textcolor{Chapter }{SpectralSequence (for bicomplexes)}}
\logpage{[ 13, 4, 2 ]}\nobreak
\hyperdef{L}{X7E672CA37AA3D34C}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{SpectralSequence({\slshape BC})\index{SpectralSequence@\texttt{SpectralSequence}!for bicomplexes}
\label{SpectralSequence:for bicomplexes}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} (co)homological spectral sequence



 The associated spectral sequence. }

 }

 
\section{\textcolor{Chapter }{Bicomplexes: Operations and Functions}}\label{Bicomplexes:Operations}
\logpage{[ 13, 5, 0 ]}
\hyperdef{L}{X81357E7A7C6D31F5}{}
{
  

\subsection{\textcolor{Chapter }{UnderlyingComplex}}
\logpage{[ 13, 5, 1 ]}\nobreak
\hyperdef{L}{X7CE9470285B819BC}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{UnderlyingComplex({\slshape BC})\index{UnderlyingComplex@\texttt{UnderlyingComplex}}
\label{UnderlyingComplex}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} complex



 The (co)complex of (co)complexes underlying the (co)homological bicomplex \mbox{\texttt{\slshape BC}}. }

 

\subsection{\textcolor{Chapter }{ByASmallerPresentation (for bicomplexes)}}
\logpage{[ 13, 5, 2 ]}\nobreak
\hyperdef{L}{X7D4B66E08666B142}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ByASmallerPresentation({\slshape B})\index{ByASmallerPresentation@\texttt{ByASmallerPresentation}!for bicomplexes}
\label{ByASmallerPresentation:for bicomplexes}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} bicomplex



 See \texttt{ByASmallerPresentation} (\ref{ByASmallerPresentation:for complexes}) on complexes. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( ByASmallerPresentation,
          "for homalg bicomplexes",
          [ IsHomalgBicomplex ],
          
    function( B )
      
      ByASmallerPresentation( UnderlyingComplex( B ) );
      
      IsZero( B );
      
      return B;
      
  end );
\end{Verbatim}
 This method performs side effects on its argument \mbox{\texttt{\slshape B}} and returns it. }

 }

  }

   
\chapter{\textcolor{Chapter }{Bigraded Objects}}\label{BigradedObjects}
\logpage{[ 14, 0, 0 ]}
\hyperdef{L}{X86C997977B62C726}{}
{
  Bigraded objects in \textsf{homalg} provide a data structure for the sheets (or pages) of spectral sequences. 
\section{\textcolor{Chapter }{BigradedObjects: Categories and Representations}}\label{BigradedObjects:Category}
\logpage{[ 14, 1, 0 ]}
\hyperdef{L}{X82C303E27EA6C844}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgBigradedObject}}
\logpage{[ 14, 1, 1 ]}\nobreak
\hyperdef{L}{X795C082E83748032}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgBigradedObject({\slshape Er})\index{IsHomalgBigradedObject@\texttt{IsHomalgBigradedObject}}
\label{IsHomalgBigradedObject}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} bigraded objects. 

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

 

\subsection{\textcolor{Chapter }{IsHomalgBigradedObjectAssociatedToAnExactCouple}}
\logpage{[ 14, 1, 2 ]}\nobreak
\hyperdef{L}{X7ADBEEA47D650EF2}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgBigradedObjectAssociatedToAnExactCouple({\slshape Er})\index{IsHomalgBigradedObjectAssociatedToAnExactCouple@\texttt{IsHomalg}\-\texttt{Bigraded}\-\texttt{Object}\-\texttt{Associated}\-\texttt{To}\-\texttt{An}\-\texttt{Exact}\-\texttt{Couple}}
\label{IsHomalgBigradedObjectAssociatedToAnExactCouple}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} bigraded objects associated to an exact couple. 

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

 

\subsection{\textcolor{Chapter }{IsHomalgBigradedObjectAssociatedToAFilteredComplex}}
\logpage{[ 14, 1, 3 ]}\nobreak
\hyperdef{L}{X7994D63E7F77C704}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgBigradedObjectAssociatedToAFilteredComplex({\slshape Er})\index{IsHomalgBigradedObjectAssociatedToAFilteredComplex@\texttt{IsHomalg}\-\texttt{Bigraded}\-\texttt{Object}\-\texttt{Associated}\-\texttt{To}\-\texttt{A}\-\texttt{Filtered}\-\texttt{Complex}}
\label{IsHomalgBigradedObjectAssociatedToAFilteredComplex}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} bigraded objects associated to a filtered complex. \\
 The $0$-th spectral sheet $E_0$ stemming from a filtration is a bigraded (differential) object, which, in
general, does not stem from an exact couple (although $E_1$, $E_2$, ... do). 

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

 

\subsection{\textcolor{Chapter }{IsHomalgBigradedObjectAssociatedToABicomplex}}
\logpage{[ 14, 1, 4 ]}\nobreak
\hyperdef{L}{X8007507A79E54A1A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgBigradedObjectAssociatedToABicomplex({\slshape Er})\index{IsHomalgBigradedObjectAssociatedToABicomplex@\texttt{IsHomalg}\-\texttt{Bigraded}\-\texttt{Object}\-\texttt{Associated}\-\texttt{To}\-\texttt{A}\-\texttt{Bicomplex}}
\label{IsHomalgBigradedObjectAssociatedToABicomplex}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} bigraded objects associated to a bicmplex. 

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

 

\subsection{\textcolor{Chapter }{IsBigradedObjectOfFinitelyPresentedObjectsRep}}
\logpage{[ 14, 1, 5 ]}\nobreak
\hyperdef{L}{X7AE4EB99817C4508}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsBigradedObjectOfFinitelyPresentedObjectsRep({\slshape Er})\index{IsBigradedObjectOfFinitelyPresentedObjectsRep@\texttt{IsBigraded}\-\texttt{Object}\-\texttt{Of}\-\texttt{Finitely}\-\texttt{Presented}\-\texttt{ObjectsRep}}
\label{IsBigradedObjectOfFinitelyPresentedObjectsRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



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

 (It is a representation of the \textsf{GAP} category \texttt{IsHomalgBigradedObject} (\ref{IsHomalgBigradedObject}), which is a subrepresentation of the \textsf{GAP} representation \texttt{IsFinitelyPresentedObjectRep}.) }

 }

 
\section{\textcolor{Chapter }{Bigraded Objects: Constructors}}\label{BigradedObjects:Constructors}
\logpage{[ 14, 2, 0 ]}
\hyperdef{L}{X7A37F65D79540DFE}{}
{
  

\subsection{\textcolor{Chapter }{HomalgBigradedObject (constructor for bigraded objects given a bicomplex)}}
\logpage{[ 14, 2, 1 ]}\nobreak
\hyperdef{L}{X79DCB6FF7E6FFA8B}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgBigradedObject({\slshape B})\index{HomalgBigradedObject@\texttt{HomalgBigradedObject}!constructor for bigraded objects given a bicomplex}
\label{HomalgBigradedObject:constructor for bigraded objects given a bicomplex}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} bigraded object



 This constructor creates a homological (resp. cohomological) bigraded object
given a homological (resp. cohomological) \textsf{homalg} bicomplex \mbox{\texttt{\slshape B}} ($\to$ \texttt{HomalgBicomplex} (\ref{HomalgBicomplex:constructor for bicomplexes given a complex of complexes})). This is nothing but the level zero sheet (without differential) of the
spectral sequence associated to the bicomplex \mbox{\texttt{\slshape B}}. So it is the double array of \textsf{homalg} objects (i.e. modules or complexes) in \mbox{\texttt{\slshape B}} forgetting the morphisms. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );;
  gap> M := LeftPresentation( M );
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> d := Resolution( M );;
  gap> dd := Hom( d );;
  gap> C := Resolution( dd );;
  gap> CC := Hom( C );
  <An acyclic complex containing a single morphism of left cocomplexes at degree\
  s [ 0 .. 1 ]>
  gap> B := HomalgBicomplex( CC );
  <A bicomplex containing left modules at bidegrees [ 0 .. 1 ]x[ -1 .. 0 ]>
  gap> E0 := HomalgBigradedObject( B );
  <A bigraded object containing left modules at bidegrees [ 0 .. 1 ]x
  [ -1 .. 0 ]>
  gap> Display( E0 );
  Level 0:
  
   * *
   * *
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{AsDifferentialObject (for homalg bigraded objects stemming from a bicomplex)}}
\logpage{[ 14, 2, 2 ]}\nobreak
\hyperdef{L}{X7D0A240684BD8FC3}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{AsDifferentialObject({\slshape Er})\index{AsDifferentialObject@\texttt{AsDifferentialObject}!for homalg bigraded objects stemming from a bicomplex}
\label{AsDifferentialObject:for homalg bigraded objects stemming from a bicomplex}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} bigraded object



 Add the induced bidegree $( -r, r - 1 )$ (resp. $( r, -r + 1 )$) differential to the level \mbox{\texttt{\slshape r}} homological (resp. cohomological) bigraded object stemming from a homological
(resp. cohomological) bicomplex. This method performs side effects on its
argument \mbox{\texttt{\slshape Er}} and returns it. 

 For an example see \texttt{DefectOfExactness} (\ref{DefectOfExactness:for homalg differential bigraded objects}) below. }

 

\subsection{\textcolor{Chapter }{DefectOfExactness (for homalg differential bigraded objects)}}
\logpage{[ 14, 2, 3 ]}\nobreak
\hyperdef{L}{X783AA6E3817BFC0F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DefectOfExactness({\slshape Er})\index{DefectOfExactness@\texttt{DefectOfExactness}!for homalg differential bigraded objects}
\label{DefectOfExactness:for homalg differential bigraded objects}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} bigraded object



 Homological: Compute the homology of a level \mbox{\texttt{\slshape r}} \emph{differential} homological bigraded object, that is the \mbox{\texttt{\slshape r}}-th sheet of a homological spectral sequence endowed with a bidegree $( -r, r - 1 )$ differential. The result is a level \mbox{\texttt{\slshape r}}$+1$ homological bigraded object \emph{without} its differential. 

 Cohomological: Compute the cohomology of a level \mbox{\texttt{\slshape r}} \emph{differential} cohomological bigraded object, that is the \mbox{\texttt{\slshape r}}-th sheet of a cohomological spectral sequence endowed with a bidegree $( r, -r + 1 )$ differential. The result is a level \mbox{\texttt{\slshape r}}$+1$ cohomological bigraded object \emph{without} its differential. 

 The differential of the resulting level \mbox{\texttt{\slshape r}}$+1$ object can a posteriori be computed using \texttt{AsDifferentialObject} (\ref{AsDifferentialObject:for homalg bigraded objects stemming from a bicomplex}). The objects in the result are subquotients of the objects in \mbox{\texttt{\slshape Er}}. An object in \mbox{\texttt{\slshape Er}} (at a spot $(p,q)$) is called \emph{stable} if no passage to a true subquotient occurs at any higher level. Of course, a
zero object (at a spot $(p,q)$) is always stable. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );;
  gap> M := LeftPresentation( M );
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> d := Resolution( M );;
  gap> dd := Hom( d );;
  gap> C := Resolution( dd );;
  gap> CC := Hom( C );
  <An acyclic complex containing a single morphism of left cocomplexes at degree\
  s [ 0 .. 1 ]>
  gap> B := HomalgBicomplex( CC );
  <A bicomplex containing left modules at bidegrees [ 0 .. 1 ]x[ -1 .. 0 ]>
\end{Verbatim}
 Now we construct the spectral sequence associated to the bicomplex $B$, also called the \emph{first} spectral sequence: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> I_E0 := HomalgBigradedObject( B );
  <A bigraded object containing left modules at bidegrees [ 0 .. 1 ]x
  [ -1 .. 0 ]>
  gap> Display( I_E0 );
  Level 0:
  
   * *
   * *
  gap> AsDifferentialObject( I_E0 );
  <A bigraded object with a differential of bidegree
  [ 0, -1 ] containing left modules at bidegrees [ 0 .. 1 ]x[ -1 .. 0 ]>
  gap> I_E0;
  <A bigraded object with a differential of bidegree
  [ 0, -1 ] containing left modules at bidegrees [ 0 .. 1 ]x[ -1 .. 0 ]>
  gap> AsDifferentialObject( I_E0 );
  <A bigraded object with a differential of bidegree
  [ 0, -1 ] containing left modules at bidegrees [ 0 .. 1 ]x[ -1 .. 0 ]>
  gap> I_E1 := DefectOfExactness( I_E0 );
  <A bigraded object containing left modules at bidegrees [ 0 .. 1 ]x
  [ -1 .. 0 ]>
  gap> Display( I_E1 );
  Level 1:
  
   * *
   . .
  gap> AsDifferentialObject( I_E1 );
  <A bigraded object with a differential of bidegree
  [ -1, 0 ] containing left modules at bidegrees [ 0 .. 1 ]x[ -1 .. 0 ]>
  gap> I_E2 := DefectOfExactness( I_E1 );
  <A bigraded object containing left modules at bidegrees [ 0 .. 1 ]x
  [ -1 .. 0 ]>
  gap> Display( I_E2 );
  Level 2:
  
   s .
   . .
\end{Verbatim}
 Legend: 
\begin{itemize}
\item A star \mbox{\texttt{\slshape *}} stands for a nonzero module.
\item A dot \mbox{\texttt{\slshape .}} stands for a zero module.
\item The letter \mbox{\texttt{\slshape s}} stands for a nonzero module that became stable.
\end{itemize}
 

 The \emph{second} spectral sequence of the bicomplex is, by definition, the spectral sequence
associated to the transposed bicomplex: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> tB := TransposedBicomplex( B );
  <A bicomplex containing left modules at bidegrees [ -1 .. 0 ]x[ 0 .. 1 ]>
  gap> II_E0 := HomalgBigradedObject( tB );
  <A bigraded object containing left modules at bidegrees [ -1 .. 0 ]x
  [ 0 .. 1 ]>
  gap> Display( II_E0 );
  Level 0:
  
   * *
   * *
  gap> AsDifferentialObject( II_E0 );
  <A bigraded object with a differential of bidegree
  [ 0, -1 ] containing left modules at bidegrees [ -1 .. 0 ]x[ 0 .. 1 ]>
  gap> II_E1 := DefectOfExactness( II_E0 );
  <A bigraded object containing left modules at bidegrees [ -1 .. 0 ]x
  [ 0 .. 1 ]>
  gap> Display( II_E1 );
  Level 1:
  
   * *
   . s
  gap> AsDifferentialObject( II_E1 );
  <A bigraded object with a differential of bidegree
  [ -1, 0 ] containing left modules at bidegrees [ -1 .. 0 ]x[ 0 .. 1 ]>
  gap> II_E2 := DefectOfExactness( II_E1 );
  <A bigraded object containing left modules at bidegrees [ -1 .. 0 ]x
  [ 0 .. 1 ]>
  gap> Display( II_E2 );
  Level 2:
  
   s .
   . s
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Bigraded Objects: Properties}}\label{BigradedObjects:Properties}
\logpage{[ 14, 3, 0 ]}
\hyperdef{L}{X83F0D79981589A42}{}
{
  

\subsection{\textcolor{Chapter }{IsEndowedWithDifferential}}
\logpage{[ 14, 3, 1 ]}\nobreak
\hyperdef{L}{X82DD24197D46CB80}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsEndowedWithDifferential({\slshape Er})\index{IsEndowedWithDifferential@\texttt{IsEndowedWithDifferential}}
\label{IsEndowedWithDifferential}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if \mbox{\texttt{\slshape Er}} is a differential bigraded object. \\
 (no method installed) }

 

\subsection{\textcolor{Chapter }{IsStableSheet}}
\logpage{[ 14, 3, 2 ]}\nobreak
\hyperdef{L}{X8466E4747DF9DDF4}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsStableSheet({\slshape Er})\index{IsStableSheet@\texttt{IsStableSheet}}
\label{IsStableSheet}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if \mbox{\texttt{\slshape Er}} is stable. \\
 (no method installed) }

 }

  
\section{\textcolor{Chapter }{Bigraded Objects: Operations and Functions}}\label{BigradedObjects:Operations}
\logpage{[ 14, 4, 0 ]}
\hyperdef{L}{X7A5828337CE2F4F2}{}
{
  

\subsection{\textcolor{Chapter }{ByASmallerPresentation (for bigraded objects)}}
\logpage{[ 14, 4, 1 ]}\nobreak
\hyperdef{L}{X7A70FD7C82C0C837}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ByASmallerPresentation({\slshape Er})\index{ByASmallerPresentation@\texttt{ByASmallerPresentation}!for bigraded objects}
\label{ByASmallerPresentation:for bigraded objects}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} bigraded object



 See \texttt{ByASmallerPresentation} (\ref{ByASmallerPresentation:for modules}) on modules. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( ByASmallerPresentation,
          "for homalg bigraded objects",
          [ IsHomalgBigradedObject ],
          
    function( Er )
      
      List( Flat( ObjectsOfBigradedObject( Er ) ), ByASmallerPresentation );
      
      return Er;
      
  end );
\end{Verbatim}
 This method performs side effects on its argument \mbox{\texttt{\slshape Er}} and returns it. }

 }

  }

   
\chapter{\textcolor{Chapter }{Spectral Sequences}}\label{SpectralSequences}
\logpage{[ 15, 0, 0 ]}
\hyperdef{L}{X87330D8C82E71B50}{}
{
  Spectral sequences are regarded as the computational sledgehammer in
homological algebra. Quoting the last lines of Rotman's book \cite{rot}: 

 ``The reader should now be convinced that virtually every purely homological
result may be proved with spectral sequences. Even though ``elementary'' proofs may exist for many of these results, spectral sequences offer a
systematic approach in place of sporadic success.'' 
\section{\textcolor{Chapter }{SpectralSequences: Categorie and Representations}}\label{SpectralSequences:Category}
\logpage{[ 15, 1, 0 ]}
\hyperdef{L}{X85E1174B7BDA291E}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgSpectralSequence}}
\logpage{[ 15, 1, 1 ]}\nobreak
\hyperdef{L}{X795DCCD88630BA47}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgSpectralSequence({\slshape E})\index{IsHomalgSpectralSequence@\texttt{IsHomalgSpectralSequence}}
\label{IsHomalgSpectralSequence}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} (co)homological spectral sequences. 

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

 

\subsection{\textcolor{Chapter }{IsHomalgSpectralSequenceAssociatedToAnExactCouple}}
\logpage{[ 15, 1, 2 ]}\nobreak
\hyperdef{L}{X7F2858CB84D2FF7F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgSpectralSequenceAssociatedToAnExactCouple({\slshape E})\index{IsHomalgSpectralSequenceAssociatedToAnExactCouple@\texttt{IsHomalg}\-\texttt{Spectral}\-\texttt{Sequence}\-\texttt{Associated}\-\texttt{To}\-\texttt{An}\-\texttt{Exact}\-\texttt{Couple}}
\label{IsHomalgSpectralSequenceAssociatedToAnExactCouple}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} associated to an exact couple. 

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

 

\subsection{\textcolor{Chapter }{IsHomalgSpectralSequenceAssociatedToAFilteredComplex}}
\logpage{[ 15, 1, 3 ]}\nobreak
\hyperdef{L}{X7A6FDA637E4D77CA}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgSpectralSequenceAssociatedToAFilteredComplex({\slshape E})\index{IsHomalgSpectralSequenceAssociatedToAFilteredComplex@\texttt{IsHomalg}\-\texttt{Spectral}\-\texttt{Sequence}\-\texttt{Associated}\-\texttt{To}\-\texttt{A}\-\texttt{Filtered}\-\texttt{Complex}}
\label{IsHomalgSpectralSequenceAssociatedToAFilteredComplex}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} associated to a filtered complex. 

 (It is a subcategory of the \textsf{GAP} category \texttt{IsHomalgSpectralSequence}.) \\
\\
 The $0$-th spectral sheet $E_0$ stemming from a filtration is a bigraded (differential) object, which, in
general, does not stem from an exact couple (although $E_1$, $E_2$, ... do). }

 

\subsection{\textcolor{Chapter }{IsHomalgSpectralSequenceAssociatedToABicomplex}}
\logpage{[ 15, 1, 4 ]}\nobreak
\hyperdef{L}{X7E7F02B379ABFBF6}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgSpectralSequenceAssociatedToABicomplex({\slshape E})\index{IsHomalgSpectralSequenceAssociatedToABicomplex@\texttt{IsHomalg}\-\texttt{Spectral}\-\texttt{Sequence}\-\texttt{Associated}\-\texttt{To}\-\texttt{A}\-\texttt{Bicomplex}}
\label{IsHomalgSpectralSequenceAssociatedToABicomplex}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} associated to a bicomplex. 

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

 

\subsection{\textcolor{Chapter }{IsSpectralSequenceOfFinitelyPresentedObjectsRep}}
\logpage{[ 15, 1, 5 ]}\nobreak
\hyperdef{L}{X81B2C07D7BBD25A9}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsSpectralSequenceOfFinitelyPresentedObjectsRep({\slshape E})\index{IsSpectralSequenceOfFinitelyPresentedObjectsRep@\texttt{IsSpectral}\-\texttt{Sequence}\-\texttt{Of}\-\texttt{Finitely}\-\texttt{Presented}\-\texttt{ObjectsRep}}
\label{IsSpectralSequenceOfFinitelyPresentedObjectsRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} representation of homological spectral sequences of finitley generated \textsf{homalg} objects. 

 (It is a representation of the \textsf{GAP} category \texttt{IsHomalgSpectralSequence} (\ref{IsHomalgSpectralSequence}), which is a subrepresentation of the \textsf{GAP} representation \texttt{IsFinitelyPresentedObjectRep}.) }

 

\subsection{\textcolor{Chapter }{IsSpectralCosequenceOfFinitelyPresentedObjectsRep}}
\logpage{[ 15, 1, 6 ]}\nobreak
\hyperdef{L}{X7ACDC0C97D8F072A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsSpectralCosequenceOfFinitelyPresentedObjectsRep({\slshape E})\index{IsSpectralCosequenceOfFinitelyPresentedObjectsRep@\texttt{IsSpectral}\-\texttt{Cosequence}\-\texttt{Of}\-\texttt{Finitely}\-\texttt{Presented}\-\texttt{ObjectsRep}}
\label{IsSpectralCosequenceOfFinitelyPresentedObjectsRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} representation of cohomological spectral sequences of finitley generated \textsf{homalg} objects. 

 (It is a representation of the \textsf{GAP} category \texttt{IsHomalgSpectralSequence} (\ref{IsHomalgSpectralSequence}), which is a subrepresentation of the \textsf{GAP} representation \texttt{IsFinitelyPresentedObjectRep}.) }

 }

 
\section{\textcolor{Chapter }{Spectral Sequences: Constructors}}\label{SpectralSequences:Constructors}
\logpage{[ 15, 2, 0 ]}
\hyperdef{L}{X84F3E1DF86C576A3}{}
{
  

\subsection{\textcolor{Chapter }{HomalgSpectralSequence (constructor for spectral sequences given a bicomplex)}}
\logpage{[ 15, 2, 1 ]}\nobreak
\hyperdef{L}{X840EE4DE7D84F72D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgSpectralSequence({\slshape r, B, a})\index{HomalgSpectralSequence@\texttt{HomalgSpectralSequence}!constructor for spectral sequences given a bicomplex}
\label{HomalgSpectralSequence:constructor for spectral sequences given a bicomplex}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgSpectralSequence({\slshape r, B})\index{HomalgSpectralSequence@\texttt{HomalgSpectralSequence}!constructor for spectral sequences without a special sheet given a bicomplex}
\label{HomalgSpectralSequence:constructor for spectral sequences without a special sheet given a bicomplex}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgSpectralSequence({\slshape B, a})\index{HomalgSpectralSequence@\texttt{HomalgSpectralSequence}!constructor for spectral sequences without bound given a bicomplex}
\label{HomalgSpectralSequence:constructor for spectral sequences without bound given a bicomplex}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{HomalgSpectralSequence({\slshape B})\index{HomalgSpectralSequence@\texttt{HomalgSpectralSequence}!constructor for spectral sequences without bound and without a special sheet given a bicomplex}
\label{HomalgSpectralSequence:constructor for spectral sequences without bound and without a special sheet given a bicomplex}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} spectral sequence



 The first syntax is the main constructor. It creates the homological (resp.
cohomological) spectral sequence associated to the homological (resp.
cohomological) bicomplex \mbox{\texttt{\slshape B}} starting at level $0$ and ending at level \mbox{\texttt{\slshape r}}$\geq 0$ (regardless if the spectral sequence stabilizes earlier). The generalized
embeddings into the objects of 0-th sheet are always computed for each higher
sheet $Er$ and stored as a record under the component $Er$!.absolute{\textunderscore}embeddings. If \mbox{\texttt{\slshape a}} is greater than $0$ the generalized embeddings into the objects of the \mbox{\texttt{\slshape a}}-th sheet also get computed for each higher sheet $Er$ and stored as a record under the component $Er$!.relative{\textunderscore}embeddings. The level \mbox{\texttt{\slshape a}} at which the spectral sequence becomes intrinsic is a natural candidate for \mbox{\texttt{\slshape a}}. The \mbox{\texttt{\slshape a}}-th sheet is called the \emph{special} sheet. 

 If \mbox{\texttt{\slshape r}}$=-1$ it computes all the sheets of the spectral sequence until the sequence
stabilizes, i.e. until all higher arrows become zero. 

 If \mbox{\texttt{\slshape a}}$=-1$ no special sheet is specified. 

 In the second syntax \mbox{\texttt{\slshape a}} is set to $-1$. 

 In the third syntax \mbox{\texttt{\slshape r}} is set to $-1$. 

 In the fourth syntax both \mbox{\texttt{\slshape r}} and \mbox{\texttt{\slshape a}} are set to $-1$. 

 The following example demonstrates the computation of a $Tor-Ext$ spectral sequence: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );;
  gap> M := LeftPresentation( M );
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> dM := Resolution( M );
  <A non-zero right acyclic complex containing a single morphism of left modules\
   at degrees [ 0 .. 1 ]>
  gap> CC := Hom( dM, dM );
  <An acyclic cocomplex containing a single morphism of right complexes at degre\
  es [ 0 .. 1 ]>
  gap> B := HomalgBicomplex( CC );
  <A bicocomplex containing right modules at bidegrees [ 0 .. 1 ]x[ -1 .. 0 ]>
\end{Verbatim}
 Now we construct the spectral sequence associated to the bicomplex $B$, also called the \emph{first} spectral sequence: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> I_E := HomalgSpectralSequence( 2, B );
  <A stable cohomological spectral sequence with sheets at levels 
  [ 0 .. 2 ] each consisting of right modules at bidegrees [ 0 .. 1 ]x
  [ -1 .. 0 ]>
  gap> Display( I_E );
  a cohomological spectral sequence at bidegrees
  [ [ 0 .. 1 ], [ -1 .. 0 ] ]
  ---------
  Level 0:
  
   * *
   * *
  ---------
  Level 1:
  
   * *
   . .
  ---------
  Level 2:
  
   s s
   . .
\end{Verbatim}
 Legend: 
\begin{itemize}
\item A star \mbox{\texttt{\slshape *}} stands for a nonzero module.
\item A dot \mbox{\texttt{\slshape .}} stands for a zero module.
\item The letter \mbox{\texttt{\slshape s}} stands for a nonzero module that became stable.
\end{itemize}
 

 The \emph{second} spectral sequence of the bicomplex is, by definition, the spectral sequence
associated to the transposed bicomplex: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> tB := TransposedBicomplex( B );
  <A bicocomplex containing right modules at bidegrees [ -1 .. 0 ]x[ 0 .. 1 ]>
  gap> II_E := HomalgSpectralSequence( tB, 2 );
  <A stable cohomological spectral sequence with sheets at levels 
  [ 0 .. 2 ] each consisting of right modules at bidegrees [ -1 .. 0 ]x
  [ 0 .. 1 ]>
  gap> Display( II_E );
  a cohomological spectral sequence at bidegrees
  [ [ -1 .. 0 ], [ 0 .. 1 ] ]
  ---------
  Level 0:
  
   * *
   * *
  ---------
  Level 1:
  
   * *
   * *
  ---------
  Level 2:
  
   s s
   . s
\end{Verbatim}
 }

 }

  
\section{\textcolor{Chapter }{Spectral Sequences: Attributes}}\label{SpectralSequences:Attributes}
\logpage{[ 15, 3, 0 ]}
\hyperdef{L}{X8014BAE984177944}{}
{
  

\subsection{\textcolor{Chapter }{GeneralizedEmbeddingsInTotalObjects}}
\logpage{[ 15, 3, 1 ]}\nobreak
\hyperdef{L}{X862BD6E2875BC376}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{GeneralizedEmbeddingsInTotalObjects({\slshape E})\index{GeneralizedEmbeddingsInTotalObjects@\texttt{GeneralizedEmbeddingsInTotalObjects}}
\label{GeneralizedEmbeddingsInTotalObjects}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a record containing \textsf{homalg} maps



 The generalized embbedings of the objects in the stable sheet into the objects
of the associated total complex. }

 

\subsection{\textcolor{Chapter }{GeneralizedEmbeddingsInTotalDefects}}
\logpage{[ 15, 3, 2 ]}\nobreak
\hyperdef{L}{X7B84FE76787EAD55}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{GeneralizedEmbeddingsInTotalDefects({\slshape E})\index{GeneralizedEmbeddingsInTotalDefects@\texttt{GeneralizedEmbeddingsInTotalDefects}}
\label{GeneralizedEmbeddingsInTotalDefects}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a record containing \textsf{homalg} maps



 The generalized embbedings of the objects in the stable sheet into the defects
of the associated total complex. }

 }

 
\section{\textcolor{Chapter }{Spectral Sequences: Operations and Functions}}\label{SpectralSequences:Operations}
\logpage{[ 15, 4, 0 ]}
\hyperdef{L}{X7BD192607D03A699}{}
{
  

\subsection{\textcolor{Chapter }{ByASmallerPresentation (for spectral sequences)}}
\logpage{[ 15, 4, 1 ]}\nobreak
\hyperdef{L}{X8775988481D1579F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ByASmallerPresentation({\slshape E})\index{ByASmallerPresentation@\texttt{ByASmallerPresentation}!for spectral sequences}
\label{ByASmallerPresentation:for spectral sequences}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} spectral sequence



 See \texttt{ByASmallerPresentation} (\ref{ByASmallerPresentation:for bigraded objects}) on bigraded object. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( ByASmallerPresentation,
          "for homalg spectral sequences",
          [ IsHomalgSpectralSequence ],
          
    function( E )
      
      ByASmallerPresentation( HighestLevelSheetInSpectralSequence( E ) );
      
      if IsBound( E!.TransposedSpectralSequence ) then
          ByASmallerPresentation( E!.TransposedSpectralSequence );
      fi;
      
      return E;
      
  end );
\end{Verbatim}
 This method performs side effects on its argument \mbox{\texttt{\slshape E}} and returns it. }

 }

  }

   
\chapter{\textcolor{Chapter }{Functors}}\label{Functors}
\logpage{[ 16, 0, 0 ]}
\hyperdef{L}{X78D1062D78BE08C1}{}
{
  Functors and their natural transformations form the heart of the \textsf{homalg} package. Usually, a functor is realized in computer algebra systems as a
procedure which can be applied to a certain type of objects. In \cite{BR} it was explained how to implement a functor of abelian categories -- by itself
-- as an object which can be further manipulated (composed, derived, ...). So
in addition to the constructor \texttt{CreateHomalgFunctor} (\ref{CreateHomalgFunctor:constructor for functors}) which is used to create functors from scratch, \textsf{homalg} provides further easy-to-use constructors to create new functors out of
existing ones: 
\begin{itemize}
\item \texttt{InsertObjectInMultiFunctor} (\ref{InsertObjectInMultiFunctor:constructor for functors given a multi-functor and an object})
\item \texttt{RightSatelliteOfCofunctor} (\ref{RightSatelliteOfCofunctor:constructor of the right satellite of a contravariant functor})
\item \texttt{LeftSatelliteOfFunctor} (\ref{LeftSatelliteOfFunctor:constructor of the left satellite of a covariant functor})
\item \texttt{RightDerivedCofunctor} (\ref{RightDerivedCofunctor:constructor of the right derived functor of a contravariant functor})
\item \texttt{LeftDerivedFunctor} (\ref{LeftDerivedFunctor:constructor of the left derived functor of a covariant functor})
\item \texttt{ComposeFunctors} (\ref{ComposeFunctors:constructor for functors given two functors})
\end{itemize}
 In \textsf{homalg} each functor is implemented as a \textsf{GAP4} object. 

 So-called installers ($\to$ \texttt{InstallFunctor} (\ref{InstallFunctor}) and \texttt{InstallDeltaFunctor} (\ref{InstallDeltaFunctor})) take such a functor object and create operations in order to apply the
functor on objects, morphisms, complexes (of objects or again of complexes),
and chain maps. The installer \texttt{InstallDeltaFunctor} (\ref{InstallDeltaFunctor}) creates additional operations for $\delta$-functors in order to compute connecting homomorphisms, exact triangles, and
associated long exact sequences by starting with a short exact sequence. 

 In \textsf{homalg} special emphasis is laid on the action of functors on \emph{morphisms}, as an essential part of the very definition of a functor. This is for no
obvious reason often neglected in computer algebra systems. Starting from a
functor where the action on morphisms is also defined, all the above
constructors again create functors with actions both on objects and on
morphisms (and hence on chain complexes and chain maps). 

 It turned out that in a variety of situations a caching mechanism for functors
is not only extremely useful (e.g. to avoid repeated expensive computations)
but also an absolute necessity for the coherence of data. Functors in \textsf{homalg} are therefore endowed with a caching mechanism. 

 If $R$ is a \textsf{homalg} ring in which the component $R$!.\texttt{ByASmallerPresentation} is set to true \\
\\
 \texttt{R!.ByASmallerPresentation := true}; \\
\\
 any functor which returns an object over $R$ will first apply \texttt{ByASmallerPresentation} (\ref{ByASmallerPresentation:for modules}) to its result before returning it. 

 One of the highlights in \textsf{homalg} is the computation of Grothendieck's spectral sequences connecting the
composition of the derivations of two functors with the derived functor of
their composite. 
\section{\textcolor{Chapter }{Functors: Category and Representations}}\label{Functors:Category}
\logpage{[ 16, 1, 0 ]}
\hyperdef{L}{X7E41BC437F2B76E1}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgFunctor}}
\logpage{[ 16, 1, 1 ]}\nobreak
\hyperdef{L}{X7EB19E0787C99FF2}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgFunctor({\slshape F})\index{IsHomalgFunctor@\texttt{IsHomalgFunctor}}
\label{IsHomalgFunctor}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} (multi-)functors. }

 

\subsection{\textcolor{Chapter }{IsHomalgFunctorRep}}
\logpage{[ 16, 1, 2 ]}\nobreak
\hyperdef{L}{X87ECF5AF7A154723}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsHomalgFunctorRep({\slshape E})\index{IsHomalgFunctorRep@\texttt{IsHomalgFunctorRep}}
\label{IsHomalgFunctorRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} representation of \textsf{homalg} (multi-)functors. 

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

 }

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

\subsection{\textcolor{Chapter }{CreateHomalgFunctor (constructor for functors)}}
\logpage{[ 16, 2, 1 ]}\nobreak
\hyperdef{L}{X79407A4E78D628FF}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CreateHomalgFunctor({\slshape list1, list2, ...})\index{CreateHomalgFunctor@\texttt{CreateHomalgFunctor}!constructor for functors}
\label{CreateHomalgFunctor:constructor for functors}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} functor



 This constructor is used to create functors for \textsf{homalg} from scratch. \mbox{\texttt{\slshape listN}} is of the form \mbox{\texttt{\slshape listN = [ stringN, valueN ]}}. \mbox{\texttt{\slshape stringN}} will be the name of a component of the created functor and \mbox{\texttt{\slshape valueN}} will be its value. This constructor is listed here for the sake of
completeness. Its documentation is rather better placed in a \textsf{homalg} programmers guide. The remaining constructors create new functors out of
existing ones and are probably more interesting for end users. 

 The constructor does \emph{not} invoke \texttt{InstallFunctor} (\ref{InstallFunctor}). This has to be done manually! }

 

\subsection{\textcolor{Chapter }{InsertObjectInMultiFunctor (constructor for functors given a multi-functor and an object)}}
\logpage{[ 16, 2, 2 ]}\nobreak
\hyperdef{L}{X79454910823BD09F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{InsertObjectInMultiFunctor({\slshape F, p, obj, H})\index{InsertObjectInMultiFunctor@\texttt{InsertObjectInMultiFunctor}!constructor for functors given a multi-functor and an object}
\label{InsertObjectInMultiFunctor:constructor for functors given a multi-functor and an object}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} functor



 Given a \textsf{homalg} multi-functor \mbox{\texttt{\slshape F}} with multiplicity $m$ and a string \mbox{\texttt{\slshape H}} return the functor \texttt{Functor{\textunderscore}}\mbox{\texttt{\slshape H}} $:=$ \mbox{\texttt{\slshape F}}$(...,$\mbox{\texttt{\slshape obj}}$,...)$, where \mbox{\texttt{\slshape obj}} is inserted at the \mbox{\texttt{\slshape p}}-th position. Of course \mbox{\texttt{\slshape obj}} must be an object (e.g. ring, module, ...) that can be inserted at this
particular position. The string \mbox{\texttt{\slshape H}} becomes the name of the returned functor ($\to$ \texttt{NameOfFunctor} (\ref{NameOfFunctor})). The variable \texttt{Functor{\textunderscore}}\mbox{\texttt{\slshape H}} will automatically be assigned if free, otherwise a warning is issued. 

 The constructor automatically invokes \texttt{InstallFunctor} (\ref{InstallFunctor}) which installs several necessary operations under the name \mbox{\texttt{\slshape H}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> ZZ * 1;
  <The free right module of rank 1 on a free generator>
  gap> InsertObjectInMultiFunctor( Functor_Hom, 2, ZZ * 1, "Hom_ZZ" );
  <The functor Hom_ZZ>
  gap> Functor_Hom_ZZ;	## got automatically defined
  <The functor Hom_ZZ>
  gap> Hom_ZZ;		## got automatically defined
  <Operation "Hom_ZZ">
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{RightSatelliteOfCofunctor (constructor of the right satellite of a contravariant functor)}}
\logpage{[ 16, 2, 3 ]}\nobreak
\hyperdef{L}{X7E0DE63378A5E204}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{RightSatelliteOfCofunctor({\slshape F[, p][, H]})\index{RightSatelliteOfCofunctor@\texttt{RightSatelliteOfCofunctor}!constructor of the right satellite of a contravariant functor}
\label{RightSatelliteOfCofunctor:constructor of the right satellite of a contravariant functor}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} functor



 Given a \textsf{homalg} (multi-)functor \mbox{\texttt{\slshape F}} and a string \mbox{\texttt{\slshape H}} return the right satellite of \mbox{\texttt{\slshape F}} with respect to its \mbox{\texttt{\slshape p}}-th argument. \mbox{\texttt{\slshape F}} is assumed contravariant in its \mbox{\texttt{\slshape p}}-th argument. The string \mbox{\texttt{\slshape H}} becomes the name of the returned functor ($\to$ \texttt{NameOfFunctor} (\ref{NameOfFunctor})). The variable \texttt{Functor{\textunderscore}}\mbox{\texttt{\slshape H}} will automatically be assigned if free, otherwise a warning is issued. 

 If \mbox{\texttt{\slshape p}} is not specified it is assumed $1$. If the string \mbox{\texttt{\slshape H}} is not specified the letter 'S' is added to the left of the name of \mbox{\texttt{\slshape F}} ($\to$ \texttt{NameOfFunctor} (\ref{NameOfFunctor})). 

 The constructor automatically invokes \texttt{InstallFunctor} (\ref{InstallFunctor}) which installs several necessary operations under the name \mbox{\texttt{\slshape H}}. 

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

 

\subsection{\textcolor{Chapter }{LeftSatelliteOfFunctor (constructor of the left satellite of a covariant functor)}}
\logpage{[ 16, 2, 4 ]}\nobreak
\hyperdef{L}{X87448A45780737AE}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{LeftSatelliteOfFunctor({\slshape F[, p][, H]})\index{LeftSatelliteOfFunctor@\texttt{LeftSatelliteOfFunctor}!constructor of the left satellite of a covariant functor}
\label{LeftSatelliteOfFunctor:constructor of the left satellite of a covariant functor}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} functor



 Given a \textsf{homalg} (multi-)functor \mbox{\texttt{\slshape F}} and a string \mbox{\texttt{\slshape H}} return the left satellite of \mbox{\texttt{\slshape F}} with respect to its \mbox{\texttt{\slshape p}}-th argument. \mbox{\texttt{\slshape F}} is assumed covariant in its \mbox{\texttt{\slshape p}}-th argument. The string \mbox{\texttt{\slshape H}} becomes the name of the returned functor ($\to$ \texttt{NameOfFunctor} (\ref{NameOfFunctor})). The variable \texttt{Functor{\textunderscore}}\mbox{\texttt{\slshape H}} will automatically be assigned if free, otherwise a warning is issued. 

 If \mbox{\texttt{\slshape p}} is not specified it is assumed $1$. If the string \mbox{\texttt{\slshape H}} is not specified the string ``S{\textunderscore}'' is added to the left of the name of \mbox{\texttt{\slshape F}} ($\to$ \texttt{NameOfFunctor} (\ref{NameOfFunctor})). 

 The constructor automatically invokes \texttt{InstallFunctor} (\ref{InstallFunctor}) which installs several necessary operations under the name \mbox{\texttt{\slshape H}}. 

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

 

\subsection{\textcolor{Chapter }{RightDerivedCofunctor (constructor of the right derived functor of a contravariant functor)}}
\logpage{[ 16, 2, 5 ]}\nobreak
\hyperdef{L}{X79EBC65E7DB3FDFB}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{RightDerivedCofunctor({\slshape F[, p][, H]})\index{RightDerivedCofunctor@\texttt{RightDerivedCofunctor}!constructor of the right derived functor of a contravariant functor}
\label{RightDerivedCofunctor:constructor of the right derived functor of a contravariant functor}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} functor



 Given a \textsf{homalg} (multi-)functor \mbox{\texttt{\slshape F}} and a string \mbox{\texttt{\slshape H}} return the right derived functor of \mbox{\texttt{\slshape F}} with respect to its \mbox{\texttt{\slshape p}}-th argument. \mbox{\texttt{\slshape F}} is assumed contravariant in its \mbox{\texttt{\slshape p}}-th argument. The string \mbox{\texttt{\slshape H}} becomes the name of the returned functor ($\to$ \texttt{NameOfFunctor} (\ref{NameOfFunctor})). The variable \texttt{Functor{\textunderscore}}\mbox{\texttt{\slshape H}} will automatically be assigned if free, otherwise a warning is issued. 

 If \mbox{\texttt{\slshape p}} is not specified it is assumed $1$. If the string \mbox{\texttt{\slshape H}} is not specified the letter 'R' is added to the left of the name of \mbox{\texttt{\slshape F}} ($\to$ \texttt{NameOfFunctor} (\ref{NameOfFunctor})). 

 The constructor automatically invokes \texttt{InstallFunctor} (\ref{InstallFunctor}) and \texttt{InstallDeltaFunctor} (\ref{InstallDeltaFunctor}) which install several necessary operations under the name \mbox{\texttt{\slshape H}}. 

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

 

\subsection{\textcolor{Chapter }{LeftDerivedFunctor (constructor of the left derived functor of a covariant functor)}}
\logpage{[ 16, 2, 6 ]}\nobreak
\hyperdef{L}{X7AC81ED178F2ECB7}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{LeftDerivedFunctor({\slshape F[, p][, H]})\index{LeftDerivedFunctor@\texttt{LeftDerivedFunctor}!constructor of the left derived functor of a covariant functor}
\label{LeftDerivedFunctor:constructor of the left derived functor of a covariant functor}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} functor



 Given a \textsf{homalg} (multi-)functor \mbox{\texttt{\slshape F}} and a string \mbox{\texttt{\slshape H}} return the left derived functor of \mbox{\texttt{\slshape F}} with respect to its \mbox{\texttt{\slshape p}}-th argument. \mbox{\texttt{\slshape F}} is assumed covariant in its \mbox{\texttt{\slshape p}}-th argument. The string \mbox{\texttt{\slshape H}} becomes the name of the returned functor ($\to$ \texttt{NameOfFunctor} (\ref{NameOfFunctor})). The variable \texttt{Functor{\textunderscore}}\mbox{\texttt{\slshape H}} will automatically be assigned if free, otherwise a warning is issued. 

 If \mbox{\texttt{\slshape p}} is not specified it is assumed $1$. If the string \mbox{\texttt{\slshape H}} is not specified the letter ``S{\textunderscore}'' is added to the left of the name of \mbox{\texttt{\slshape F}} ($\to$ \texttt{NameOfFunctor} (\ref{NameOfFunctor})). 

 The constructor automatically invokes \texttt{InstallFunctor} (\ref{InstallFunctor}) and \texttt{InstallDeltaFunctor} (\ref{InstallDeltaFunctor}) which install several necessary operations under the name \mbox{\texttt{\slshape H}}. 

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

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

 

\subsection{\textcolor{Chapter }{ComposeFunctors (constructor for functors given two functors)}}
\logpage{[ 16, 2, 7 ]}\nobreak
\hyperdef{L}{X7B0F972B850EB3CF}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ComposeFunctors({\slshape F[, p], G[, H]})\index{ComposeFunctors@\texttt{ComposeFunctors}!constructor for functors given two functors}
\label{ComposeFunctors:constructor for functors given two functors}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} functor



 Given two \textsf{homalg} (multi-)functors \mbox{\texttt{\slshape F}} and \mbox{\texttt{\slshape G}} and a string \mbox{\texttt{\slshape H}} return the composed functor \texttt{Functor{\textunderscore}}\mbox{\texttt{\slshape H}} $:=$ \mbox{\texttt{\slshape F}}$(...,$\mbox{\texttt{\slshape G}}$(...),...)$, where \mbox{\texttt{\slshape G}} is inserted at the \mbox{\texttt{\slshape p}}-th position. Of course \mbox{\texttt{\slshape G}} must be a functor that can be inserted at this particular position. The string \mbox{\texttt{\slshape H}} becomes the name of the returned functor ($\to$ \texttt{NameOfFunctor} (\ref{NameOfFunctor})). The variable \texttt{Functor{\textunderscore}}\mbox{\texttt{\slshape H}} will automatically be assigned if free, otherwise a warning is issued. 

 If \mbox{\texttt{\slshape p}} is not specified it is assumed $1$. If the string \mbox{\texttt{\slshape H}} is not specified the names of \mbox{\texttt{\slshape F}} and \mbox{\texttt{\slshape G}} are concatenated in this order ($\to$ \texttt{NameOfFunctor} (\ref{NameOfFunctor})). 

 \mbox{\texttt{\slshape F}} * \mbox{\texttt{\slshape G}} is a shortcut for \texttt{ComposeFunctors}(\mbox{\texttt{\slshape F}},1,\mbox{\texttt{\slshape G}}). 

 The constructor automatically invokes \texttt{InstallFunctor} (\ref{InstallFunctor}) which installs several necessary operations under the name \mbox{\texttt{\slshape H}}. 

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

 Check this: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> Functor_Hom * Functor_TensorProduct;
  <The functor HomTensorProduct>
  gap> Functor_HomTensorProduct;	## got automatically defined
  <The functor HomTensorProduct>
  gap> HomTensorProduct;		## got automatically defined
  <Operation "HomTensorProduct">
\end{Verbatim}
 }

 }

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

\subsection{\textcolor{Chapter }{Genesis}}
\logpage{[ 16, 3, 1 ]}\nobreak
\hyperdef{L}{X7BCB7F008620570C}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Genesis({\slshape F})\index{Genesis@\texttt{Genesis}}
\label{Genesis}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list



 The first entry of the returned list is the name of the constructor used to
create the functor \mbox{\texttt{\slshape F}}. The reset of the list contains arguments that were passed to this
constructor for creating \mbox{\texttt{\slshape F}}. 

 These are examples of different functors created using the different
constructors: 
\begin{itemize}
\item  \texttt{CreateHomalgFunctor}: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> Functor_Hom;
  <The functor Hom>
  gap> Genesis( Functor_Hom );
  [ "CreateHomalgFunctor", [ "name", "Hom" ], [ "number_of_arguments", 2 ],
    [ "1", [ [ "contravariant", "right adjoint", "distinguished" ] ] ],
    [ "2", [ [ "covariant", "left exact" ] ] ],
    [ "OnObjects", function( M, N ) ... end ],
    [ "OnMorphisms", function( M_or_mor, N_or_mor ) ... end ] ]
\end{Verbatim}

\item  \texttt{InsertObjectInMultiFunctor}: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> LeftDualizingFunctor( ZZ, "ZZ_Hom" );
  <The functor ZZ_Hom>
  gap> Functor_ZZ_Hom;	## got automatically defined
  <The functor ZZ_Hom>
  gap> ZZ_Hom;		## got automatically defined
  <Operation "ZZ_Hom">
  gap> Genesis( Functor_ZZ_Hom );
  [ "InsertObjectInMultiFunctor", <The functor Hom>, 2,
    <The free left module of rank 1 on a free generator> ]
  gap> 1 * ZZ;
  <The free left module of rank 1 on a free generator>
\end{Verbatim}

\item  \texttt{LeftDerivedFunctor}: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> Functor_TensorProduct;
  <The functor TensorProduct>
  gap> Genesis( Functor_LTensorProduct );
  [ "LeftDerivedFunctor", <The functor TensorProduct>, 1 ]
\end{Verbatim}

\item  \texttt{RightDerivedCofunctor}: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> Genesis( Functor_RHom );
  [ "RightDerivedCofunctor", <The functor Hom>, 1 ]
\end{Verbatim}

\item  \texttt{LeftSatelliteOfFunctor}: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> Genesis( Functor_Tor );
  [ "LeftSatelliteOfFunctor", <The functor TensorProduct>, 1 ]
\end{Verbatim}

\item  \texttt{RightSatelliteOfCofunctor}: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> Genesis( Functor_Ext );
  [ "RightSatelliteOfCofunctor", <The functor Hom>, 1 ]
\end{Verbatim}

\item  \texttt{ComposeFunctors}: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> Genesis( Functor_HomHom );
  [ "ComposeFunctors", [ <The functor Hom>, <The functor Hom> ], 1 ]
  gap> ValueGlobal( "ComposeFunctors" );
  <Operation "ComposeFunctors">
\end{Verbatim}

\end{itemize}
 }

 }

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

\subsection{\textcolor{Chapter }{functor{\textunderscore}Cokernel}}
\logpage{[ 16, 4, 1 ]}\nobreak
\hyperdef{L}{X7B9FE8BF80D47B6E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \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,
          CreateHomalgFunctor(
                  [ "name", "Cokernel" ],
                  [ "natural_transformation", "CokernelEpi" ],
                  [ "special", true ],
                  [ "number_of_arguments", 1 ],
                  [ "1", [ [ "covariant" ],
                          [ IsMapOfFinitelyGeneratedModulesRep,
                            [ IsHomalgChainMap, IsImageSquare ] ] ] ],
                  [ "OnObjects", _Functor_Cokernel_OnObjects ]
                  )
          );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Cokernel}}
\logpage{[ 16, 4, 2 ]}\nobreak
\hyperdef{L}{X875F177A82BF9B8B}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Cokernel({\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}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );;
  gap> M := LeftPresentation( M );
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );;
  gap> N := LeftPresentation( N );
  <A non-torsion left module presented by 2 relations for 4 generators>
  gap> mat := HomalgMatrix( "[ \
  > 1, 0, -3, -6, \
  > 0, 1,  6, 11, \
  > 1, 0, -3, -6  \
  > ]", 3, 4, ZZ );;
  gap> phi := HomalgMap( mat, M, N );;
  gap> IsMorphism( phi );
  true
  gap> phi;
  <A homomorphism of left modules>
  gap> coker := Cokernel( phi );
  <A left module presented by 5 relations for 4 generators>
  gap> ByASmallerPresentation( coker );
  <A rank 1 left module presented by 1 relation for 2 generators>
  gap> Display( coker );
  Z/< 8 > + Z^(1 x 1)
  gap> nu := CokernelEpi( phi );
  <An epimorphism of left modules>
  gap> Display( nu );
  [ [  -5,   0 ],
    [  -6,   1 ],
    [   1,  -2 ],
    [   0,   1 ] ]
  
  the map is currently represented by the above 4 x 2 matrix
  gap> DefectOfExactness( phi, nu );
  <A zero left module>
  gap> ByASmallerPresentation( nu );
  <An epimorphism of left modules>
  gap> Display( nu );
  [ [   2,   0 ],
    [   1,  -2 ],
    [   0,   1 ] ]
  
  the map is currently represented by the above 3 x 2 matrix
  gap> PreInverse( nu );
  false
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{functor{\textunderscore}ImageModule}}
\logpage{[ 16, 4, 3 ]}\nobreak
\hyperdef{L}{X8013A3EC7AB58B62}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{functor{\textunderscore}ImageModule\index{functorImageModule@\texttt{functor{\textunderscore}ImageModule}}
\label{functorImageModule}
}\hfill{\scriptsize (global variable)}}\\


 The functor that associates to a map its image. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallValue( functor_ImageModule,
          CreateHomalgFunctor(
                  [ "name", "ImageModule" ],
                  [ "natural_transformation", "ImageModuleEmb" ],
                  [ "number_of_arguments", 1 ],
                  [ "1", [ [ "covariant" ],
                          [ IsMapOfFinitelyGeneratedModulesRep ] ] ],
                  [ "OnObjects", _Functor_ImageModule_OnObjects ]
                  )
          );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{ImageModule}}
\logpage{[ 16, 4, 4 ]}\nobreak
\hyperdef{L}{X847761DC82AFA6E6}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ImageModule({\slshape phi})\index{ImageModule@\texttt{ImageModule}}
\label{ImageModule}
}\hfill{\scriptsize (operation)}}\\


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

 

\subsection{\textcolor{Chapter }{functor{\textunderscore}Kernel}}
\logpage{[ 16, 4, 5 ]}\nobreak
\hyperdef{L}{X7E1FD2EA8358FEA7}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{functor{\textunderscore}Kernel\index{functorKernel@\texttt{functor{\textunderscore}Kernel}}
\label{functorKernel}
}\hfill{\scriptsize (global variable)}}\\


 The functor that associates to a map its kernel. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallValue( functor_Kernel,
          CreateHomalgFunctor(
                  [ "name", "Kernel" ],
                  [ "natural_transformation", "KernelEmb" ],
                  [ "special", true ],
                  [ "number_of_arguments", 1 ],
                  [ "1", [ [ "covariant" ],
                          [ IsMapOfFinitelyGeneratedModulesRep,
                            [ IsHomalgChainMap, IsKernelSquare ] ] ] ],
                  [ "OnObjects", _Functor_Kernel_OnObjects ]
                  )
          );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Kernel (for maps)}}
\logpage{[ 16, 4, 6 ]}\nobreak
\hyperdef{L}{X85C128B37E76827F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Kernel({\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}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );;
  gap> M := LeftPresentation( M );
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );;
  gap> N := LeftPresentation( N );
  <A non-torsion left module presented by 2 relations for 4 generators>
  gap> mat := HomalgMatrix( "[ \
  > 1, 0, -3, -6, \
  > 0, 1,  6, 11, \
  > 1, 0, -3, -6  \
  > ]", 3, 4, ZZ );;
  gap> phi := HomalgMap( mat, M, N );;
  gap> IsMorphism( phi );
  true
  gap> phi;
  <A homomorphism of left modules>
  gap> ker := Kernel( phi );
  <A cyclic left module presented by yet unknown relations for a cyclic generato\
  r>
  gap> Display( ker );
  Z/< -3 >
  gap> ByASmallerPresentation( last );
  <A cyclic torsion left module presented by 1 relation for a cyclic generator>
  gap> Display( ker );
  Z/< 3 >
  gap> iota := KernelEmb( phi );
  <A monomorphism of left modules>
  gap> Display( iota );
  [ [  0,  2,  4 ] ]
  
  the map is currently represented by the above 1 x 3 matrix
  gap> DefectOfExactness( iota, phi );
  <A zero left module>
  gap> ByASmallerPresentation( iota );
  <A monomorphism of left modules>
  gap> Display( iota );
  [ [  2,  0 ] ]
  
  the map is currently represented by the above 1 x 2 matrix
  gap> PostInverse( iota );
  false
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{functor{\textunderscore}DefectOfExactness}}
\logpage{[ 16, 4, 7 ]}\nobreak
\hyperdef{L}{X795B435785C96DFD}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{functor{\textunderscore}DefectOfExactness\index{functorDefectOfExactness@\texttt{functor{\textunderscore}}\-\texttt{Defect}\-\texttt{Of}\-\texttt{Exactness}}
\label{functorDefectOfExactness}
}\hfill{\scriptsize (global variable)}}\\


 The functor that associates to a pair of composable maps with a zero
compositum the defect of exactness, i.e. the kernel of the outer map modulo
the image of the inner map. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallValue( functor_DefectOfExactness,
          CreateHomalgFunctor(
                  [ "name", "DefectOfExactness" ],
                  [ "special", true ],
                  [ "number_of_arguments", 1 ],
                  [ "1", [ [ "covariant" ],
                          [ IsHomalgComplex and IsATwoSequence,
                            [ IsHomalgChainMap, IsLambekPairOfSquares ] ] ] ],
                  [ "OnObjects", _Functor_DefectOfExactness_OnObjects ]
                  )
          );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{DefectOfExactness}}
\logpage{[ 16, 4, 8 ]}\nobreak
\hyperdef{L}{X7E6CDE7E85F09122}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DefectOfExactness({\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{\slshape phi}} is applied first and from the right. For right modules \mbox{\texttt{\slshape psi}} is applied first and from the left. 

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

 

\subsection{\textcolor{Chapter }{Functor{\textunderscore}Hom}}
\logpage{[ 16, 4, 9 ]}\nobreak
\hyperdef{L}{X7B93718087EFD69B}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \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,
          CreateHomalgFunctor(
                  [ "name", "Hom" ],
                  [ "number_of_arguments", 2 ],
                  [ "1", [ [ "contravariant", "right adjoint", "distinguished" ] ] ],
                  [ "2", [ [ "covariant", "left exact" ] ] ],
                  [ "OnObjects", _Functor_Hom_OnObjects ],
                  [ "OnMorphisms", _Functor_Hom_OnMorphisms ]
                  )
          );
\end{Verbatim}
 }

 

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


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

 Each generator of a module of homomorphisms is displayed as a matrix of
appropriate dimensions. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );;
  gap> M := LeftPresentation( M );
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );;
  gap> N := LeftPresentation( N );
  <A non-torsion left module presented by 2 relations for 4 generators>
  gap> mat := HomalgMatrix( "[ \
  > 1, 0, -3, -6, \
  > 0, 1,  6, 11, \
  > 1, 0, -3, -6  \
  > ]", 3, 4, ZZ );;
  gap> phi := HomalgMap( mat, M, N );;
  gap> IsMorphism( phi );
  true
  gap> phi;
  <A homomorphism of left modules>
  gap> psi := Hom( phi, M );
  <A homomorphism of right modules>
  gap> ByASmallerPresentation( psi );
  <A homomorphism of right modules>
  gap> 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
  gap> homNM := Source( psi );
  <A non-torsion right module on 4 generators satisfying 2 relations>
  gap> IsIdenticalObj( homNM, Hom( N, M ) );	## the caching at work
  true
  gap> homMM := Range( psi );
  <A non-torsion right module on 3 generators satisfying 2 relations>
  gap> IsIdenticalObj( homMM, Hom( M, M ) );	## the caching at work
  true
  gap> Display( homNM );
  Z/< 3 > + Z/< 3 > + Z^(2 x 1)
  gap> Display( homMM );
  Z/< 3 > + Z/< 3 > + Z^(1 x 1)
  gap> IsMonomorphism( psi );
  false
  gap> IsEpimorphism( psi );
  false
  gap> GeneratorsOfModule( homMM );
  <A set of 3 generators of a homalg right module>
  gap> Display( last );
  [ [  0,  0,  0 ],
    [  0,  1,  2 ],
    [  0,  0,  0 ] ]
  
  [ [  0,  2,  4 ],
    [  0,  0,  0 ],
    [  0,  2,  4 ] ]
  
  [ [   0,   1,   3 ],
    [   0,   0,  -2 ],
    [   0,   1,   3 ] ]
  
  gap> GeneratorsOfModule( homNM );
  <A set of 4 generators of a homalg right module>
  gap> Display( last );
  [ [  0,  1,  2 ],
    [  0,  1,  2 ],
    [  0,  1,  2 ],
    [  0,  0,  0 ] ]
  
  [ [  0,  1,  2 ],
    [  0,  0,  0 ],
    [  0,  0,  0 ],
    [  0,  2,  4 ] ]
  
  [ [   0,   0,  -3 ],
    [   0,   0,   7 ],
    [   0,   0,  -5 ],
    [   0,   0,   1 ] ]
  
  [ [   0,   1,  -3 ],
    [   0,   0,  12 ],
    [   0,   0,  -9 ],
    [   0,   2,   6 ] ]
  
\end{Verbatim}
 If for example the source $N$ gets a new presentation, you will see the effect on the generators: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ByASmallerPresentation( N );
  <A rank 2 left module presented by 1 relation for 3 generators>
  gap> GeneratorsOfModule( homNM );
  <A set of 4 generators of a homalg right module>
  gap> Display( last );
  [ [  0,  3,  6 ],
    [  0,  1,  2 ],
    [  0,  0,  0 ] ]
  
  [ [   0,   9,  18 ],
    [   0,   0,   0 ],
    [   0,   2,   4 ] ]
  
  [ [   0,   0,   0 ],
    [   0,   0,  -5 ],
    [   0,   0,   1 ] ]
  
  [ [   0,   9,  18 ],
    [   0,   0,  -9 ],
    [   0,   2,   6 ] ]
  
\end{Verbatim}
 Now we compute a certain natural filtration on \texttt{Hom}$(M,M)$: 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> dM := Resolution( M );
  <A non-zero right acyclic complex containing a single morphism of left modules\
   at degrees [ 0 .. 1 ]>
  gap> hMM := Hom( dM, dM );
  <An acyclic cocomplex containing a single morphism of right complexes at degre\
  es [ 0 .. 1 ]>
  gap> BMM := HomalgBicomplex( hMM );
  <A bicocomplex containing right modules at bidegrees [ 0 .. 1 ]x[ -1 .. 0 ]>
  gap> 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 ]>
  gap> 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
  gap> filt := FiltrationBySpectralSequence( II_E );
  <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 3 generators satisfying 2 relations>
  of
  <A right module on 4 generators satisfying yet unknown relations>>
  gap> 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>>
  gap> Display( filt );
  Degree -1:
  
  Z/< 3 >
  ----------
  Degree 0:
  
  Z/< 3 > + Z^(1 x 1)
  gap> Display( homMM );
  Z/< 3 > + Z/< 3 > + Z^(1 x 1)
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Functor{\textunderscore}TensorProduct}}
\logpage{[ 16, 4, 11 ]}\nobreak
\hyperdef{L}{X7A1A077D8268FADE}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Functor{\textunderscore}TensorProduct\index{FunctorTensorProduct@\texttt{Functor{\textunderscore}TensorProduct}}
\label{FunctorTensorProduct}
}\hfill{\scriptsize (global variable)}}\\


 The tensor product bifunctor. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallValue( Functor_TensorProduct,
          CreateHomalgFunctor(
                  [ "name", "TensorProduct" ],
                  [ "number_of_arguments", 2 ],
                  [ "1", [ [ "covariant", "left adjoint", "distinguished" ] ] ],
                  [ "2", [ [ "covariant", "left adjoint" ] ] ],
                  [ "OnObjects", _Functor_TensorProduct_OnObjects ],
                  [ "OnMorphisms", _Functor_TensorProduct_OnMorphisms ]
                  )
          );
\end{Verbatim}
 }

 

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


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

 The symbol \texttt{*} is a shorthand for several operations associated with the functor \texttt{Functor{\textunderscore}TensorProduct} installed under the name \texttt{TensorProduct}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> M := HomalgMatrix( "[ 2, 3, 4,   5, 6, 7 ]", 2, 3, ZZ );;
  gap> M := LeftPresentation( M );
  <A non-torsion left module presented by 2 relations for 3 generators>
  gap> N := HomalgMatrix( "[ 2, 3, 4, 5,   6, 7, 8, 9 ]", 2, 4, ZZ );;
  gap> N := LeftPresentation( N );
  <A non-torsion left module presented by 2 relations for 4 generators>
  gap> mat := HomalgMatrix( "[ \
  > 1, 0, -3, -6, \
  > 0, 1,  6, 11, \
  > 1, 0, -3, -6  \
  > ]", 3, 4, ZZ );;
  gap> phi := HomalgMap( mat, M, N );;
  gap> IsMorphism( phi );
  true
  gap> phi;
  <A homomorphism of left modules>
  gap> L := Hom( ZZ, M );
  <A right module on 3 generators satisfying yet unknown relations>
  gap> ByASmallerPresentation( L );
  <A rank 1 right module on 2 generators satisfying 1 relation>
  gap> Display( L );
  Z/< 3 > + Z^(1 x 1)
  gap> L;	## the display method found out further information about the module L
  <A rank 1 right module on 2 generators satisfying 1 relation>
  gap> psi := phi * L;
  <A homomorphism of right modules>
  gap> ByASmallerPresentation( psi );
  <A homomorphism of right modules>
  gap> 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
  
  gap> ML := Source( psi );
  <A non-torsion right module on 4 generators satisfying 3 relations>
  gap> IsIdenticalObj( ML, M * L );	## the caching at work
  true
  gap> NL := Range( psi );
  <A non-torsion right module on 4 generators satisfying 2 relations>
  gap> IsIdenticalObj( NL, N * L );	## the caching at work
  true
  gap> Display( ML );
  Z/< 3 > + Z/< 3 > + Z/< 3 > + Z^(1 x 1)
  gap> 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}[fontsize=\small,frame=single,label=Example]
  gap> P := Resolution( M );
  <A non-zero right acyclic complex containing a single morphism of left modules\
   at degrees [ 0 .. 1 ]>
  gap> GP := Hom( P );
  <An acyclic cocomplex containing a single morphism of right modules at degrees\
   [ 0 .. 1 ]>
  gap> CE := Resolution( GP );
  <An acyclic cocomplex containing a single morphism of right complexes at degre\
  es [ 0 .. 1 ]>
  gap> FCE := Hom( CE, L );
  <An acyclic complex containing a single morphism of left cocomplexes at degree\
  s [ 0 .. 1 ]>
  gap> BC := HomalgBicomplex( FCE );
  <A bicomplex containing left modules at bidegrees [ 0 .. 1 ]x[ -1 .. 0 ]>
  gap> 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 ]>
  gap> 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
  gap> 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>>
  gap> 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 non-torsion left module presented by 3 relations for 4 generators>>
  gap> Display( filt );
  Degree 0:
  
  Z/< 3 > + Z^(1 x 1)
  ----------
  Degree -1:
  
  Z/< 3 > + Z/< 3 >
  gap> Display( ML );
  Z/< 3 > + Z/< 3 > + Z/< 3 > + Z^(1 x 1)
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Functor{\textunderscore}Ext}}
\logpage{[ 16, 4, 13 ]}\nobreak
\hyperdef{L}{X7D007A7079F7BEE3}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \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} and all the different operations \texttt{Ext} in \textsf{homalg}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  RightSatelliteOfCofunctor( Functor_Hom, "Ext" );
\end{Verbatim}
 }

 

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


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

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

 

\subsection{\textcolor{Chapter }{Functor{\textunderscore}Tor}}
\logpage{[ 16, 4, 15 ]}\nobreak
\hyperdef{L}{X821034FE80907E8D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \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} and all the different operations \texttt{Tor} in \textsf{homalg}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  LeftSatelliteOfFunctor( Functor_TensorProduct, "Tor" );
\end{Verbatim}
 }

 

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


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

 

\subsection{\textcolor{Chapter }{Functor{\textunderscore}RHom}}
\logpage{[ 16, 4, 17 ]}\nobreak
\hyperdef{L}{X84C60D997A79524E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \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} and all the different operations \texttt{RHom} in \textsf{homalg}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  RightDerivedCofunctor( Functor_Hom );
\end{Verbatim}
 }

 

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


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

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

 

\subsection{\textcolor{Chapter }{Functor{\textunderscore}LTensorProduct}}
\logpage{[ 16, 4, 19 ]}\nobreak
\hyperdef{L}{X806251E3836C00B9}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Functor{\textunderscore}LTensorProduct\index{FunctorLTensorProduct@\texttt{Functor{\textunderscore}LTensorProduct}}
\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} and all the different operations \texttt{LTensorProduct} in \textsf{homalg}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  LeftDerivedFunctor( Functor_TensorProduct );
\end{Verbatim}
 }

 

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


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

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

 

\subsection{\textcolor{Chapter }{Functor{\textunderscore}HomHom}}
\logpage{[ 16, 4, 21 ]}\nobreak
\hyperdef{L}{X7ACC6A7C86E4354C}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \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} and all the different operations \texttt{HomHom} in \textsf{homalg}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  Functor_Hom * Functor_Hom;
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Functor{\textunderscore}LHomHom}}
\logpage{[ 16, 4, 22 ]}\nobreak
\hyperdef{L}{X84557A6B79382720}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \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} and all the different operations \texttt{LHomHom} in \textsf{homalg}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  LeftDerivedFunctor( Functor_HomHom );
\end{Verbatim}
 }

 }

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

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

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

\subsection{\textcolor{Chapter }{NameOfFunctor}}
\logpage{[ 16, 7, 1 ]}\nobreak
\hyperdef{L}{X845E5EF17BBBF64C}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{NameOfFunctor({\slshape F})\index{NameOfFunctor@\texttt{NameOfFunctor}}
\label{NameOfFunctor}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a string



 The name of the \textsf{homalg} functor \mbox{\texttt{\slshape F}}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> NameOfFunctor( Functor_Ext );
  "Ext"
  gap> Display( Functor_Ext );
  Ext
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{InstallFunctor}}
\logpage{[ 16, 7, 2 ]}\nobreak
\hyperdef{L}{X7EAE59AC7D402D5A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{InstallFunctor({\slshape F})\index{InstallFunctor@\texttt{InstallFunctor}}
\label{InstallFunctor}
}\hfill{\scriptsize (operation)}}\\


 Install several methods for \textsf{GAP} operations that get declared under the name of the \textsf{homalg} (multi-)functor \mbox{\texttt{\slshape F}} ($\to$ \texttt{NameOfFunctor} (\ref{NameOfFunctor})). These methods are used to apply the functor to objects, morphisms,
(co)complexes of objects, and (co)chain maps. The objects in the (co)complexes
might again be (co)complexes. 

 (For purely technical reasons the multiplicity of the functor might at most be
three. This restriction should disappear in future versions.) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( InstallFunctor,
          "for homalg functors",
          [ IsHomalgFunctorRep ],
          
    function( Functor )
      
      InstallFunctorOnObjects( Functor );
      
      if IsSpecialFunctor( Functor ) then
          
          InstallSpecialFunctorOnMorphisms( Functor );
          
      else
          
          InstallFunctorOnMorphisms( Functor );
          
          InstallFunctorOnComplexes( Functor );
          
          InstallFunctorOnChainMaps( Functor );
          
      fi;
      
  end );
\end{Verbatim}
 The method does not return anything. }

 

\subsection{\textcolor{Chapter }{InstallDeltaFunctor}}
\logpage{[ 16, 7, 3 ]}\nobreak
\hyperdef{L}{X7BD3887982B2663E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{InstallDeltaFunctor({\slshape F})\index{InstallDeltaFunctor@\texttt{InstallDeltaFunctor}}
\label{InstallDeltaFunctor}
}\hfill{\scriptsize (operation)}}\\


 In case \mbox{\texttt{\slshape F}} is a $\delta$-functor in the sense of Grothendieck the procedure installs several
operations under the name of the \textsf{homalg} (multi-)functor \mbox{\texttt{\slshape F}} ($\to$ \texttt{NameOfFunctor} (\ref{NameOfFunctor})) allowing one to compute connecting homomorphisms, exact triangles, and
associated long exact sequences. The input of these operations is a short
exact sequence. 

 (For purely technical reasons the multiplicity of the functor might at most be
three. This restriction should disappear in future versions.) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( InstallDeltaFunctor,
          "for homalg functors",
          [ IsHomalgFunctorRep ],
          
    function( Functor )
      local number_of_arguments;
      
      number_of_arguments := MultiplicityOfFunctor( Functor );
      
      if number_of_arguments = 1 then
          
          HelperToInstallUnivariateDeltaFunctor( Functor );
          
      elif number_of_arguments = 2 then
          
          HelperToInstallFirstArgumentOfBivariateDeltaFunctor( Functor );
          HelperToInstallSecondArgumentOfBivariateDeltaFunctor( Functor );
          
      elif number_of_arguments = 3 then
          
          HelperToInstallFirstArgumentOfTrivariateDeltaFunctor( Functor );
          HelperToInstallSecondArgumentOfTrivariateDeltaFunctor( Functor );
          HelperToInstallThirdArgumentOfTrivariateDeltaFunctor( Functor );
          
      fi;
      
  end );
\end{Verbatim}
 The method does not return anything. }

 }

  }

   
\chapter{\textcolor{Chapter }{Examples}}\label{Examples}
\logpage{[ 17, 0, 0 ]}
\hyperdef{L}{X7A489A5D79DA9E5C}{}
{
  
\section{\textcolor{Chapter }{ExtExt}}\label{ExtExt}
\logpage{[ 17, 1, 0 ]}
\hyperdef{L}{X7BB9DE017ECE6E86}{}
{
  This corresponds to Example B.2 in \cite{BaSF}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> imat := HomalgMatrix( "[ \
  >   262,  -33,   75,  -40, \
  >   682,  -86,  196, -104, \
  >  1186, -151,  341, -180, \
  > -1932,  248, -556,  292, \
  >  1018, -127,  293, -156  \
  > ]", 5, 4, ZZ );
  <A homalg internal 5 by 4 matrix>
  gap> M := LeftPresentation( imat );
  <A left module presented by 5 relations for 4 generators>
  gap> N := Hom( ZZ, M );
  <A right module on 4 generators satisfying yet unknown relations>
  gap> F := InsertObjectInMultiFunctor( Functor_Hom, 2, N, "TensorN" );
  <The functor TensorN>
  gap> G := LeftDualizingFunctor( ZZ );;
  gap> 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 ]>
  gap> 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
  gap> 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>>
  gap> 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 left module presented by 6 relations for 6 generators>
  of
  <A non-torsion left module presented by 8 relations for 9 generators>>
  gap> m := IsomorphismOfFiltration( filt );
  <An isomorphism of left modules>
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{Purity}}\label{Purity}
\logpage{[ 17, 2, 0 ]}
\hyperdef{L}{X7EE63228803A04F1}{}
{
  This corresponds to Example B.3 in \cite{BaSF}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> imat := HomalgMatrix( "[ \
  >   262,  -33,   75,  -40, \
  >   682,  -86,  196, -104, \
  >  1186, -151,  341, -180, \
  > -1932,  248, -556,  292, \
  >  1018, -127,  293, -156  \
  > ]", 5, 4, ZZ );
  <A homalg internal 5 by 4 matrix>
  gap> M := LeftPresentation( imat );
  <A left module presented by 5 relations for 4 generators>
  gap> 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>>
  gap> M;
  <A non-pure rank 1 left module presented by 5 relations for 4 generators>
  gap> 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 ]>
  gap> 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
  gap> m := IsomorphismOfFiltration( filt );
  <An isomorphism of left modules>
  gap> IsIdenticalObj( Range( m ), M );
  true
  gap> Source( m );
  <A non-torsion left module presented by 2 relations for 3 generators (locked)>
  gap> Display( last );
  [ [   0,   2,   0 ],
    [   0,   0,  12 ] ]
  
  Cokernel of the map
  
  Z^(1x2) --> Z^(1x3),
  
  currently represented by the above matrix
  gap> 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{[ 17, 3, 0 ]}
\hyperdef{L}{X812EF8147AE16E72}{}
{
  This corresponds to Example B.5 in \cite{BaSF}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> imat := HomalgMatrix( "[ \
  >   262,  -33,   75,  -40, \
  >   682,  -86,  196, -104, \
  >  1186, -151,  341, -180, \
  > -1932,  248, -556,  292, \
  >  1018, -127,  293, -156  \
  > ]", 5, 4, ZZ );
  <A homalg internal 5 by 4 matrix>
  gap> M := LeftPresentation( imat );
  <A left module presented by 5 relations for 4 generators>
  gap> F := InsertObjectInMultiFunctor( Functor_TensorProduct, 2, M, "TensorM" );
  <The functor TensorM>
  gap> G := LeftDualizingFunctor( ZZ );;
  gap> 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 ]>
  gap> 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
  gap> filt := FiltrationBySpectralSequence( II_E, 0 );
  <A descending filtration with degrees [ -1 .. 0 ] and graded parts:
    -1:	<A non-zero left module presented by 8 relations for 8 generators>
     0:	<A non-torsion left module presented by 3 relations for 4 generators>
  of
  <A left module presented by yet unknown relations for 29 generators>>
  gap> 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>>
  gap> m := IsomorphismOfFiltration( filt );
  <An isomorphism of left modules>
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{TorExt}}\label{TorExt}
\logpage{[ 17, 4, 0 ]}
\hyperdef{L}{X784BC2567875830B}{}
{
  This corresponds to Example B.6 in \cite{BaSF}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Example]
  gap> ZZ := HomalgRingOfIntegers( );;
  gap> imat := HomalgMatrix( "[ \
  >   262,  -33,   75,  -40, \
  >   682,  -86,  196, -104, \
  >  1186, -151,  341, -180, \
  > -1932,  248, -556,  292, \
  >  1018, -127,  293, -156  \
  > ]", 5, 4, ZZ );
  <A homalg internal 5 by 4 matrix>
  gap> M := LeftPresentation( imat );
  <A left module presented by 5 relations for 4 generators>
  gap> P := Resolution( M );
  <A non-zero right acyclic complex containing a single morphism of left modules\
   at degrees [ 0 .. 1 ]>
  gap> GP := Hom( P );
  <An acyclic cocomplex containing a single morphism of right modules at degrees\
   [ 0 .. 1 ]>
  gap> FGP := GP * P;
  <A non-zero acyclic cocomplex containing a single morphism of left complexes a\
  t degrees [ 0 .. 1 ]>
  gap> BC := HomalgBicomplex( FGP );
  <A non-zero bicocomplex containing left modules at bidegrees [ 0 .. 1 ]x
  [ -1 .. 0 ]>
  gap> p_degrees := ObjectDegreesOfBicomplex( BC )[1];
  [ 0, 1 ]
  gap> 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 ]>
  gap> 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
  gap> filt := FiltrationBySpectralSequence( II_E, 0 );
  <A descending filtration with degrees [ -1 .. 0 ] and graded parts:
    -1:	<A non-zero left module presented by 10 relations for 10 generators>
     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>>
  gap> 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>>
  gap> m := IsomorphismOfFiltration( filt );
  <An isomorphism of left modules>
\end{Verbatim}
 }

  }

 

\appendix


\chapter{\textcolor{Chapter }{Development}}\label{devel}
\logpage{[ "A", 0, 0 ]}
\hyperdef{L}{X816F972F826BE589}{}
{
  
\section{\textcolor{Chapter }{Why was \textsf{homalg} discontinued in \href{http://www.maplesoft.com/} {Maple}?}}\label{WhyNotMaple}
\logpage{[ "A", 1, 0 ]}
\hyperdef{L}{X85B7FB29805B14C9}{}
{
  The original implementation of \textsf{homalg} in \textsf{Maple} by Daniel Robertz and myself hit several walls. The speed of the Gr{\"o}bner
basis routines in \textsf{Maple} was the smallest issue. The rising complexity of data structures for high
level algorithms (bicomplexes, functors, spectral sequences, ...) became the
main problem. We very much felt the need for an object-oriented programming
language, a language that allows defining complicated mathematical objects
carrying properties and attributes and even containing other objects as
subobjects. 

 As we were pushed to look for an alternative to \textsf{Maple}, our wish list grew even further. Section \ref{WhyGAP4} is a summary of this wish list. }

 
\section{\textcolor{Chapter }{Why \href{http://www.gap-system.org/} {GAP4}?}}\label{WhyGAP4}
\logpage{[ "A", 2, 0 ]}
\hyperdef{L}{X7D2A5B127A68AB58}{}
{
  
\subsection{\textcolor{Chapter }{\textsf{GAP} is free and open software}}\label{OpenGAP}
\logpage{[ "A", 2, 1 ]}
\hyperdef{L}{X8148BBD87B272E84}{}
{
  In 1993 J. Neub{\"u}ser  \href{http://www.gap-system.org/Doc/Talks/cgt.ps} {addressed} the necessity of free software in mathematics: 

 ``You can read Sylow's Theorem and its proof in Huppert's book in the library
without even buying the book and then you can use Sylow's Theorem for the rest
of your life free of charge, but - and for understandable reasons of getting
funds for the maintenance, the necessity of which I have pointed out [...] -
for many computer algebra systems license fees have to be paid regularly for
the total time of their use. In order to protect what you pay for, you do not
get the source, but only an executable, i.e. a black box. You can press
buttons and you get answers in the same way as you get the bright pictures
from your television set but you cannot control how they were made in either
case.

 With this situation two of the most basic rules of conduct in mathematics are
violated. In mathematics information is passed on free of charge and
everything is laid open for checking. Not applying these rules to computer
algebra systems that are made for mathematical research [...] means moving in
a most undesirable direction. Most important: Can we expect somebody to
believe a result of a program that he is not allowed to see? [...] And even:
If O'Nan and Scott would have to pay a license fee for using an implementation
of their ideas about primitive groups, should not they in turn be entitled to
charge a license fee for using their ideas in the implementation?'' 

 I had the pleasure of being one of his students. 

 The detailed copyright for \textsf{GAP} can found on the \textsf{GAP} homepage under  \href{http://www.gap-system.org/Download/copyright.html#free} {Start -- Download --
Copyright}. }

 
\subsection{\textcolor{Chapter }{\textsf{GAP} has an area of expertise}}\label{ExpertGAP}
\logpage{[ "A", 2, 2 ]}
\hyperdef{L}{X799403717D4414BA}{}
{
  Not only does \textsf{GAP} have the potential of natively supporting a wide range of mathematical
structures, but finite groups and their representation theory are already an
area of expertise. So there are at least some areas where one does not need to
start from scratch. 

 But one could argue that rings are more central for homological algebra than
finite groups, and that \textsf{GAP4}, as for the time when the \textsf{homalg} project was shaping, does not seriously support important rings in a manner
that enables homological computations. This drawback would favor, for example,  \href{http://www.singular.uni-kl.de/} {Singular} (with its subsystem \textsf{Plural}) over \textsf{GAP4}. Point \ref{GAP-IO} indicates how this drawback was overcome in a way, that even gave the lead
back to \textsf{GAP4}. 

 One of my future plans for the \textsf{homalg} project is to address moduli problems in algebraic geometry (favorably via
orbifold stacks), where discrete groups (and especially finite groups) play a
central role. As of the time of writing these lines, discrete groups, finite
groups, and orbifolds are already in the focus of part of the project: The
package \textsf{SCO} by Simon G{\"o}rtzen to compute the cohomology of orbifolds is part of the
currently available \textsf{homalg} project. 

 For the remaining points the choice of \textsf{GAP4} as the programming language for developing \textsf{homalg} was unavoidable. }

 
\subsection{\textcolor{Chapter }{\textsf{GAP4} can communicate}}\label{GAP-IO}
\logpage{[ "A", 2, 3 ]}
\hyperdef{L}{X863002078157C105}{}
{
  With the excellent \textsf{IO} \href{http://www-groups.mcs.st-and.ac.uk/~neunhoef/Computer/Software/Gap/io.html} {package}  of Max Neunh{\"o}ffer \textsf{GAP4} is able to communicate in an extremely efficient way with the outer world via
bidirectional streams. This allows \textsf{homalg} to delegate things that cannot be done in \textsf{GAP} to an external system such as \textsf{Singular}, \textsf{Sage}, \textsf{Macaulay2}, \textsf{MAGMA}, or \textsf{Maple}. }

 
\subsection{\textcolor{Chapter }{\textsf{GAP4} is a \emph{mathematical} object-oriented programming language}}\label{Objectify}
\logpage{[ "A", 2, 4 ]}
\hyperdef{L}{X78EB6CAE7C7F2F7C}{}
{
  The object-oriented programming philosophy of \textsf{GAP4} was developed by mathematicians who wanted to handle complex mathematical  objects carrying  \emph{properties} and \emph{attributes}, as often encountered in algebra and geometry. \textsf{GAP4} was thus designed to address the needs of \emph{mathematical} object-oriented programming more than any other language designed by computer
scientists. This was primarily achieved by the advanced  \emph{method selection} techniques that very much resemble the mathematical way of thinking. 

 Unlike the common object-oriented programming languages, methods in \textsf{GAP4} are not bound to objects but to operations. In particular, one can also install methods that depend on two or more
arguments. The index of a subgroup is an easy example of an operation
illustrating this. While it would be sufficient to bind a method for computing
the order of a group to the object representing the group, it is not clear
what to do with the index, since its definition involves two objects: a group $G$ and a subgroup $U$. Note that the index of $U$ in a subgroup of $G$ containing $U$ might also be of interest. Things become even more complicated when the
arguments of the operation are unrelated objects. Moreover, binding methods to
operations makes it possible for the programming language to support the
installation of one or more methods for the same operation, depending on
already known properties or attributes of the involved objects. 

 Moreover \textsf{GAP4} supports so-called \emph{immediate and true methods}. This considerably simplifies teaching theorems to the computer. For example
it takes one line of code to teach \textsf{GAP4} that a reflexive left module over a ring with left global dimension less or
equal to two is projective. These logical implications are installed globally
and \textsf{GAP4} immediately uses them as soon as the respective assumptions are fulfilled.
This mechanism enables \textsf{GAP4} to draw arbitrary long lines of conclusions. The more one knows about the
objects involved in the computation the more specialized efficient algorithms
can be utilized, while other computations can be completely avoided. \textsf{homalg} is equipped with plenty of logical implications for rings, matrices, modules,
morphisms, and complexes. 

 When all these features become relevant to what you want to do, there is
hardly an alternative to \textsf{GAP4}. }

 
\subsection{\textcolor{Chapter }{\textsf{GAP4} packages are easily extendible}}\label{BigGAP}
\logpage{[ "A", 2, 5 ]}
\hyperdef{L}{X7E1B9133835F33FD}{}
{
  Being able to install several methods for a single operation ($\to$ \ref{Objectify}) has the additional advantage of making \textsf{GAP4} packages easily extendible. If you have an algorithm that, in a special case,
performs better than existing algorithms you can install it as a method which
gets triggered when the special case occurs. You don't need to break existing
code to insert an additional \texttt{elif} section contributing to an increasing unreadability of the code. Even better,
you don't even need to know \emph{anything} about the code of other existing methods. In addition to that, you can add
(maybe missing) properties and attributes (along with methods to compute them)
to existing objects. }

 }

 
\section{\textcolor{Chapter }{Why not \href{http://www.sagemath.org/} {Sage}?}}\label{WhyNotSage}
\logpage{[ "A", 3, 0 ]}
\hyperdef{L}{X7F7CF4AE830E312B}{}
{
  Although the \textsf{python}-based \textsf{Sage} fulfills most of the above requirements, it was primarily the points expressed
in \ref{Objectify} that finally favored \textsf{GAP4} over \textsf{Sage}: The object-orientedness of \textsf{python}, although very modern, does not cover the needs of the \textsf{homalg} package. At this place I would like to thank  \href{http://modular.math.washington.edu/} {William
Stein} for the helpful discussion about \textsf{Sage} during the early stage of developing \textsf{homalg}, and to Max Neunh{\"o}ffer who explained me the advantages of the
object-oriented programming in \textsf{GAP4}. }

 
\section{\textcolor{Chapter }{How does \textsf{homalg} compare to \textsf{Sage}?}}\label{Sage}
\logpage{[ "A", 4, 0 ]}
\hyperdef{L}{X81A6C501841B20C4}{}
{
  In what follows \textsf{homalg} often refers to the whole \textsf{homalg} project. 

 
\subsection{\textcolor{Chapter }{They differ in objectives and scale}}\label{homalg-Sage-objectives}
\logpage{[ "A", 4, 1 ]}
\hyperdef{L}{X82A6EC2C850909B1}{}
{
  First of all, \textsf{Sage} is a huge project, that, among other things, is intended to replace
commercial, general purpose computer algebra systems like \textsf{Maple} and \textsf{Mathematica}. So while \textsf{Sage} targets (a growing number of) different fields of computer algebra, \textsf{homalg} only focuses on homological, and hopefully in the near future also homotopical
techniques (applicable to some of these different fields). The two projects
simply follow different goals and are different in scale. }

 
\subsection{\textcolor{Chapter }{They differ in the programming language}}\label{homalg-Sage-language}
\logpage{[ "A", 4, 2 ]}
\hyperdef{L}{X8346070A86BF5CC5}{}
{
  \textsf{Sage} is based on \textsf{python} and the \textsf{C}-extension \textsf{cython} while \textsf{homalg} is based on \textsf{GAP4}. Quoting from an email response William Stein sent me on the 25. of February,
2008: ``Sage *is* Python + a library''. Although I seriously considered developing \textsf{homalg} as part of \textsf{Sage}, for the reason mentioned in \ref{Objectify} I finally decided to use \textsf{GAP4} as the programming language. }

 
\subsection{\textcolor{Chapter }{They differ in the way they communicate with the outer world}}\label{homalg-Sage-communicate}
\logpage{[ "A", 4, 3 ]}
\hyperdef{L}{X8040F9357F008C1E}{}
{
  Both \textsf{Sage} and \textsf{homalg} rely for many things on external computer algebra systems. But although one
can simply invoke a \textsf{GAP} shell or a \textsf{Singular} shell from within \textsf{Sage}, \textsf{Sage} normally runs the external computer algebra systems in the background and
tries to understand the internals of the objects residing in them. An object
in the external computer algebra system is wrapped by an object in \textsf{Sage} and supporting this external object involves understanding its details in the
external system. \textsf{homalg} follows a different strategy: The only external objects \textsf{homalg} needs (beside rings) are non-empty matrices. And being zero or not is
basically the only thing \textsf{homalg} wants to know about a matrix after knowing its dimension. I myself was stunned
by this insight, which culminated in \emph{the principle of least communication} ($\to$ \ref{least-communication}). 

 In particular, \textsf{Sage} can make use of all of \textsf{homalg}, but for in order to make full use, \textsf{Sage} needs to understand the internals of the \textsf{homalg} objects. On the contrary, \textsf{homalg} can only make limited use of \textsf{Sage} (or of virtually any computer algebra system that supports rings in a
sufficient way ($\to$ \ref{SufficientSupport})), but without the need to delve into the inner life of the \textsf{Sage} objects. 

 }

 }

  }


\chapter{\textcolor{Chapter }{The Mathematical Idea behind \textsf{homalg}}}\label{homalg-Idea}
\logpage{[ "B", 0, 0 ]}
\hyperdef{L}{X7FBD6C8A83D64BE4}{}
{
  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 constructive one needs to find apropriate 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 apropriate 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{homalg-limitation}). 

 The two appendices \ref{Basic_Operations} and \ref{Tool_Operations} provide the list of matrix operations needed by \textsf{homalg} to perform homological computations. Subsection \ref{homalg-delegates} explains how these matrix operations can be delegated to external systems.  }


\chapter{\textcolor{Chapter }{The Basic Matrix Operations}}\label{Basic_Operations}
\logpage{[ "C", 0, 0 ]}
\hyperdef{L}{X7CB422647C7DD289}{}
{
  These are the operations used to solve one-sided (in)homogeneous linear
systems $XA=B$ resp. $AX=B$ ($\to$ Appendix \ref{homalg-Idea}). 
\section{\textcolor{Chapter }{Main}}\label{Main}
\logpage{[ "C", 1, 0 ]}
\hyperdef{L}{X810454AB85D336F5}{}
{
  
\begin{itemize}
\item \texttt{BasisOfRowModule} (\ref{BasisOfRowModule:for matrices})
\item \texttt{BasisOfColumnModule} (\ref{BasisOfColumnModule:for matrices})
\end{itemize}
 
\begin{itemize}
\item \texttt{DecideZeroRows} (\ref{DecideZeroRows:for pairs of matrices})
\item \texttt{DecideZeroColumns} (\ref{DecideZeroColumns:for pairs of matrices})
\end{itemize}
 
\begin{itemize}
\item \texttt{SyzygiesGeneratorsOfRows} (\ref{SyzygiesGeneratorsOfRows:for matrices})
\item \texttt{SyzygiesGeneratorsOfColumns} (\ref{SyzygiesGeneratorsOfColumns:for matrices})
\end{itemize}
 }

 
\section{\textcolor{Chapter }{Effective}}\label{Effective}
\logpage{[ "C", 2, 0 ]}
\hyperdef{L}{X8435BB2E7A819478}{}
{
  
\begin{itemize}
\item \texttt{BasisOfRowsCoeff} (\ref{BasisOfRowsCoeff:for matrices})
\item \texttt{BasisOfColumnsCoeff} (\ref{BasisOfColumnsCoeff:for matrices})
\end{itemize}
 
\begin{itemize}
\item \texttt{DecideZeroRowsEffectively} (\ref{DecideZeroRowsEffectively:for pairs of matrices})
\item \texttt{DecideZeroColumnsEffectively} (\ref{DecideZeroColumnsEffectively:for pairs of matrices})
\end{itemize}
 }

 
\section{\textcolor{Chapter }{Relative}}\label{Relative}
\logpage{[ "C", 3, 0 ]}
\hyperdef{L}{X7B1023F47EAB7A97}{}
{
  
\begin{itemize}
\item \texttt{SyzygiesGeneratorsOfRows} (\ref{SyzygiesGeneratorsOfRows:for pairs of matrices})
\item \texttt{SyzygiesGeneratorsOfColumns} (\ref{SyzygiesGeneratorsOfColumns:for pairs of matrices})
\end{itemize}
 }

 
\section{\textcolor{Chapter }{Reduced}}\label{Reduced}
\logpage{[ "C", 4, 0 ]}
\hyperdef{L}{X7A0B865E7E70DB3D}{}
{
  
\begin{itemize}
\item \texttt{ReducedBasisOfRowModule} (\ref{ReducedBasisOfRowModule:for matrices})
\item \texttt{ReducedBasisOfColumnModule} (\ref{ReducedBasisOfColumnModule:for matrices})
\end{itemize}
 
\begin{itemize}
\item \texttt{ReducedSyzygiesGeneratorsOfRows} (\ref{ReducedSyzygiesGeneratorsOfRows:for matrices})
\item \texttt{ReducedSyzygiesGeneratorsOfColumns} (\ref{ReducedSyzygiesGeneratorsOfColumns:for matrices})
\end{itemize}
 }

  }


\chapter{\textcolor{Chapter }{The Matrix Tool Operations}}\label{Tool_Operations}
\logpage{[ "D", 0, 0 ]}
\hyperdef{L}{X7B2993CB7B012115}{}
{
  The functions listed below are components of the \texttt{homalgTable} object stored in the ring. They are only indirectly accessible through
standard methods that invoke them. 
\section{\textcolor{Chapter }{The Tool Operations \emph{without} a Fallback Method}}\label{ToolsNoFallBack}
\logpage{[ "D", 1, 0 ]}
\hyperdef{L}{X7988F0AF7D87FD23}{}
{
  There are matrix methods for which \textsf{homalg} needs a \texttt{homalgTable} entry for non-internal rings, as it cannot provide a suitable fallback. Below
is the list of these \texttt{homalgTable} entries. 

\subsection{\textcolor{Chapter }{ZeroMatrix (homalgTable entry for initial matrices)}}
\logpage{[ "D", 1, 1 ]}\nobreak
\hyperdef{L}{X844AE1F77FD35292}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ZeroMatrix({\slshape C})\index{ZeroMatrix@\texttt{ZeroMatrix}!homalgTable entry for initial matrices}
\label{ZeroMatrix:homalgTable entry for initial matrices}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{ZeroMatrix} is bound then the method \texttt{Eval} (\ref{Eval:for matrices created with HomalgInitialMatrix}) resets the filter \texttt{IsInitialMatrix} and returns $RP$!.\texttt{ZeroMatrix}$( \mbox{\texttt{\slshape C}} )$. }

 

\subsection{\textcolor{Chapter }{IdentityMatrix (homalgTable entry for initial identity matrices)}}
\logpage{[ "D", 1, 2 ]}\nobreak
\hyperdef{L}{X7E93ABB57B76CD2B}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IdentityMatrix({\slshape C})\index{IdentityMatrix@\texttt{IdentityMatrix}!homalgTable entry for initial identity matrices}
\label{IdentityMatrix:homalgTable entry for initial identity matrices}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{IdentityMatrix} is bound then the method \texttt{Eval} (\ref{Eval:for matrices created with HomalgInitialIdentityMatrix}) resets the filter \texttt{IsInitialIdentityMatrix} and returns $RP$!.\texttt{IdentityMatrix}$( \mbox{\texttt{\slshape C}} )$. }

 

\subsection{\textcolor{Chapter }{ZeroMatrix (homalgTable entry)}}
\logpage{[ "D", 1, 3 ]}\nobreak
\hyperdef{L}{X785390E38396CAEB}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ZeroMatrix({\slshape C})\index{ZeroMatrix@\texttt{ZeroMatrix}!homalgTable entry}
\label{ZeroMatrix:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{ZeroMatrix} is bound then the method \texttt{Eval} (\ref{Eval:for matrices created with HomalgZeroMatrix}) returns $RP$!.\texttt{ZeroMatrix}$( \mbox{\texttt{\slshape C}} )$. }

 

\subsection{\textcolor{Chapter }{IdentityMatrix (homalgTable entry)}}
\logpage{[ "D", 1, 4 ]}\nobreak
\hyperdef{L}{X87BFF3567DEEBEF4}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IdentityMatrix({\slshape C})\index{IdentityMatrix@\texttt{IdentityMatrix}!homalgTable entry}
\label{IdentityMatrix:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{IdentityMatrix} is bound then the method \texttt{Eval} (\ref{Eval:for matrices created with HomalgIdentityMatrix}) returns $RP$!.\texttt{IdentityMatrix}$( \mbox{\texttt{\slshape C}} )$. }

 

\subsection{\textcolor{Chapter }{Involution (homalgTable entry)}}
\logpage{[ "D", 1, 5 ]}\nobreak
\hyperdef{L}{X85884C3178473521}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Involution({\slshape M})\index{Involution@\texttt{Involution}!homalgTable entry}
\label{Involution:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{Involution} is bound then the method \texttt{Eval} (\ref{Eval:for matrices created with Involution}) returns $RP$!.\texttt{Involution} applied to the content of the attribute \texttt{EvalInvolution}$( \mbox{\texttt{\slshape C}} ) = \mbox{\texttt{\slshape M}}$. }

 

\subsection{\textcolor{Chapter }{CertainRows (homalgTable entry)}}
\logpage{[ "D", 1, 6 ]}\nobreak
\hyperdef{L}{X7B6FC3267CD9EE9D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CertainRows({\slshape M, plist})\index{CertainRows@\texttt{CertainRows}!homalgTable entry}
\label{CertainRows:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{CertainRows} is bound then the method \texttt{Eval} (\ref{Eval:for matrices created with CertainRows}) returns $RP$!.\texttt{CertainRows} applied to the content of the attribute \texttt{EvalCertainRows}$( \mbox{\texttt{\slshape C}} ) = [ \mbox{\texttt{\slshape M}}, \mbox{\texttt{\slshape plist}} ]$. }

 

\subsection{\textcolor{Chapter }{CertainColumns (homalgTable entry)}}
\logpage{[ "D", 1, 7 ]}\nobreak
\hyperdef{L}{X78EADFC67D17CF04}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CertainColumns({\slshape M, plist})\index{CertainColumns@\texttt{CertainColumns}!homalgTable entry}
\label{CertainColumns:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{CertainColumns} is bound then the method \texttt{Eval} (\ref{Eval:for matrices created with CertainColumns}) returns $RP$!.\texttt{CertainColumns} applied to the content of the attribute \texttt{EvalCertainColumns}$( \mbox{\texttt{\slshape C}} ) = [ \mbox{\texttt{\slshape M}}, \mbox{\texttt{\slshape plist}} ]$. }

 

\subsection{\textcolor{Chapter }{UnionOfRows (homalgTable entry)}}
\logpage{[ "D", 1, 8 ]}\nobreak
\hyperdef{L}{X7DEB535782A3323E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{UnionOfRows({\slshape A, B})\index{UnionOfRows@\texttt{UnionOfRows}!homalgTable entry}
\label{UnionOfRows:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{UnionOfRows} is bound then the method \texttt{Eval} (\ref{Eval:for matrices created with UnionOfRows}) returns $RP$!.\texttt{UnionOfRows} applied to the content of the attribute \texttt{EvalUnionOfRows}$( \mbox{\texttt{\slshape C}} ) = [ \mbox{\texttt{\slshape A}}, \mbox{\texttt{\slshape B}} ]$. }

 

\subsection{\textcolor{Chapter }{UnionOfColumns (homalgTable entry)}}
\logpage{[ "D", 1, 9 ]}\nobreak
\hyperdef{L}{X7DF5DB55836D13A7}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{UnionOfColumns({\slshape A, B})\index{UnionOfColumns@\texttt{UnionOfColumns}!homalgTable entry}
\label{UnionOfColumns:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{UnionOfColumns} is bound then the method \texttt{Eval} (\ref{Eval:for matrices created with UnionOfColumns}) returns $RP$!.\texttt{UnionOfColumns} applied to the content of the attribute \texttt{EvalUnionOfColumns}$( \mbox{\texttt{\slshape C}} ) = [ \mbox{\texttt{\slshape A}}, \mbox{\texttt{\slshape B}} ]$. }

 

\subsection{\textcolor{Chapter }{DiagMat (homalgTable entry)}}
\logpage{[ "D", 1, 10 ]}\nobreak
\hyperdef{L}{X86C5B86981FA1F9A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DiagMat({\slshape e})\index{DiagMat@\texttt{DiagMat}!homalgTable entry}
\label{DiagMat:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{DiagMat} is bound then the method \texttt{Eval} (\ref{Eval:for matrices created with DiagMat}) returns $RP$!.\texttt{DiagMat} applied to the content of the attribute \texttt{EvalDiagMat}$( \mbox{\texttt{\slshape C}} ) = \mbox{\texttt{\slshape e}}$. }

 

\subsection{\textcolor{Chapter }{KroneckerMat (homalgTable entry)}}
\logpage{[ "D", 1, 11 ]}\nobreak
\hyperdef{L}{X82202A6A7FAB7174}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{KroneckerMat({\slshape A, B})\index{KroneckerMat@\texttt{KroneckerMat}!homalgTable entry}
\label{KroneckerMat:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{KroneckerMat} is bound then the method \texttt{Eval} (\ref{Eval:for matrices created with KroneckerMat}) returns $RP$!.\texttt{KroneckerMat} applied to the content of the attribute \texttt{EvalKroneckerMat}$( \mbox{\texttt{\slshape C}} ) = [ \mbox{\texttt{\slshape A}}, \mbox{\texttt{\slshape B}} ]$. }

 

\subsection{\textcolor{Chapter }{MulMat (homalgTable entry)}}
\logpage{[ "D", 1, 12 ]}\nobreak
\hyperdef{L}{X828F8C7785EEC3D1}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{MulMat({\slshape a, A})\index{MulMat@\texttt{MulMat}!homalgTable entry}
\label{MulMat:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{MulMat} is bound then the method \texttt{Eval} (\ref{Eval:for matrices created with MulMat}) returns $RP$!.\texttt{MulMat} applied to the content of the attribute \texttt{EvalMulMat}$( \mbox{\texttt{\slshape C}} ) = [ \mbox{\texttt{\slshape a}}, \mbox{\texttt{\slshape A}} ]$. }

 

\subsection{\textcolor{Chapter }{AddMat (homalgTable entry)}}
\logpage{[ "D", 1, 13 ]}\nobreak
\hyperdef{L}{X7B0B12F080A90039}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{AddMat({\slshape A, B})\index{AddMat@\texttt{AddMat}!homalgTable entry}
\label{AddMat:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{AddMat} is bound then the method \texttt{Eval} (\ref{Eval:for matrices created with AddMat}) returns $RP$!.\texttt{AddMat} applied to the content of the attribute \texttt{EvalAddMat}$( \mbox{\texttt{\slshape C}} ) = [ \mbox{\texttt{\slshape A}}, \mbox{\texttt{\slshape B}} ]$. }

 

\subsection{\textcolor{Chapter }{SubMat (homalgTable entry)}}
\logpage{[ "D", 1, 14 ]}\nobreak
\hyperdef{L}{X7FE11AA27AE7D2D7}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{SubMat({\slshape A, B})\index{SubMat@\texttt{SubMat}!homalgTable entry}
\label{SubMat:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{SubMat} is bound then the method \texttt{Eval} (\ref{Eval:for matrices created with SubMat}) returns $RP$!.\texttt{SubMat} applied to the content of the attribute \texttt{EvalSubMat}$( \mbox{\texttt{\slshape C}} ) = [ \mbox{\texttt{\slshape A}}, \mbox{\texttt{\slshape B}} ]$. }

 

\subsection{\textcolor{Chapter }{Compose (homalgTable entry)}}
\logpage{[ "D", 1, 15 ]}\nobreak
\hyperdef{L}{X7D491D957E63C3A4}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Compose({\slshape A, B})\index{Compose@\texttt{Compose}!homalgTable entry}
\label{Compose:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{Compose} is bound then the method \texttt{Eval} (\ref{Eval:for matrices created with Compose}) returns $RP$!.\texttt{Compose} applied to the content of the attribute \texttt{EvalCompose}$( \mbox{\texttt{\slshape C}} ) = [ \mbox{\texttt{\slshape A}}, \mbox{\texttt{\slshape B}} ]$. }

 

\subsection{\textcolor{Chapter }{IsZeroMatrix (homalgTable entry)}}
\logpage{[ "D", 1, 16 ]}\nobreak
\hyperdef{L}{X849BB912798A01EB}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsZeroMatrix({\slshape M})\index{IsZeroMatrix@\texttt{IsZeroMatrix}!homalgTable entry}
\label{IsZeroMatrix:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape M}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{IsZeroMatrix} is bound then the standard method for the property \texttt{IsZero} (\ref{IsZero:for matrices}) shown below returns $RP$!.\texttt{IsZeroMatrix}$( \mbox{\texttt{\slshape M}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( IsZero,
          "for homalg matrices",
          [ IsHomalgMatrix ],
          
    function( M )
      local R, RP;
      
      R := HomalgRing( M );
      
      RP := homalgTable( R );
      
      if IsBound(RP!.IsZeroMatrix) then
          ## CAUTION: the external system must be able
          ## to check zero modulo possible ring relations!
          
          return RP!.IsZeroMatrix( M ); ## with this, \= can fall back to IsZero
      fi;
      
      #=====# the fallback method #=====#
      
      ## from the GAP4 documentation: ?Zero
      ## `ZeroSameMutability( <obj> )' is equivalent to `0 * <obj>'.
      
      return M = 0 * M; ## hence, by default, IsZero falls back to \= (see below)
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{NrRows (homalgTable entry)}}
\logpage{[ "D", 1, 17 ]}\nobreak
\hyperdef{L}{X7AE057CF7C6B0EE0}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{NrRows({\slshape C})\index{NrRows@\texttt{NrRows}!homalgTable entry}
\label{NrRows:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a nonnegative integer



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{NrRows} is bound then the standard method for the attribute \texttt{NrRows} (\ref{NrRows}) shown below returns $RP$!.\texttt{NrRows}$( \mbox{\texttt{\slshape C}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( NrRows,
          "for homalg matrices",
          [ IsHomalgMatrix ],
          
    function( C )
      local R, RP;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      if IsBound(RP!.NrRows) then
          return RP!.NrRows( C );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called NrRows in the ",
                 "homalgTable to apply to a non-internal matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      return Length( Eval( C )!.matrix );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{NrColumns (homalgTable entry)}}
\logpage{[ "D", 1, 18 ]}\nobreak
\hyperdef{L}{X7D8E706887116F30}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{NrColumns({\slshape C})\index{NrColumns@\texttt{NrColumns}!homalgTable entry}
\label{NrColumns:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a nonnegative integer



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{NrColumns} is bound then the standard method for the attribute \texttt{NrColumns} (\ref{NrColumns}) shown below returns $RP$!.\texttt{NrColumns}$( \mbox{\texttt{\slshape C}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( NrColumns,
          "for homalg matrices",
          [ IsHomalgMatrix ],
          
    function( C )
      local R, RP;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      if IsBound(RP!.NrColumns) then
          return RP!.NrColumns( C );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called NrColumns in the ",
                 "homalgTable to apply to a non-internal matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      return Length( Eval( C )!.matrix[ 1 ] );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Determinant (homalgTable entry)}}
\logpage{[ "D", 1, 19 ]}\nobreak
\hyperdef{L}{X80A573257D7F2E1A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Determinant({\slshape C})\index{Determinant@\texttt{Determinant}!homalgTable entry}
\label{Determinant:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a ring element



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{Determinant} is bound then the standard method for the attribute \texttt{DeterminantMat} (\ref{DeterminantMat}) shown below returns $RP$!.\texttt{Determinant}$( \mbox{\texttt{\slshape C}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( DeterminantMat,
          "for homalg matrices",
          [ IsHomalgMatrix ],
          
    function( C )
      local R, RP;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      if NrRows( C ) <> NrColumns( C ) then
          Error( "the matrix is not quadratic\n" );
      fi;
      
      if IsBound(RP!.Determinant) then
          return RingElementConstructor( R )( RP!.Determinant( C ), R );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called Determinant in the ",
                 "homalgTable to apply to a non-internal matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      return Determinant( Eval( C )!.matrix );
      
  end );
  
  
  InstallMethod( Determinant,
          "for homalg matrices",
          [ IsHomalgMatrix ],
          
    function( C )
      
      return DeterminantMat( C );
      
  end );
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{The Tool Operations with a Fallback Method}}\label{ToolsFallBack}
\logpage{[ "D", 2, 0 ]}
\hyperdef{L}{X7912E42C81296637}{}
{
  These are the methods for which it is recommended for performance reasons to
have a \texttt{homalgTable} entry for non-internal rings. \textsf{homalg} only provides a generic fallback method. 

\subsection{\textcolor{Chapter }{AreEqualMatrices (homalgTable entry)}}
\logpage{[ "D", 2, 1 ]}\nobreak
\hyperdef{L}{X7871FE5478BFC167}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{AreEqualMatrices({\slshape M1, M2})\index{AreEqualMatrices@\texttt{AreEqualMatrices}!homalgTable entry}
\label{AreEqualMatrices:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape M1}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{AreEqualMatrices} is bound then the standard method for the operation \texttt{\texttt{\symbol{92}}=} (\ref{=:for matrices}) shown below returns $RP$!.\texttt{AreEqualMatrices}$( \mbox{\texttt{\slshape M1}}, \mbox{\texttt{\slshape M2}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( \=,
          "for homalg comparable matrices",
          [ IsHomalgMatrix, IsHomalgMatrix ],
          
    function( M1, M2 )
      local R, RP;
      
      R := HomalgRing( M1 );
      
      RP := homalgTable( R );
      
      if IsBound(RP!.AreEqualMatrices) then
          ## CAUTION: the external system must be able to check equality
          ## modulo possible ring relations (known to the external system)!
          return RP!.AreEqualMatrices( M1, M2 );
      elif IsBound(RP!.Equal) then
          ## CAUTION: the external system must be able to check equality
          ## modulo possible ring relations (known to the external system)!
          return RP!.Equal( M1, M2 );
      elif IsBound(RP!.IsZeroMatrix) then   ## ensuring this avoids infinite loops
          return IsZero( M1 - M2 );
      fi;
      
      TryNextMethod( );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsIdentityMatrix (homalgTable entry)}}
\logpage{[ "D", 2, 2 ]}\nobreak
\hyperdef{L}{X80C1856D82172268}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsIdentityMatrix({\slshape M})\index{IsIdentityMatrix@\texttt{IsIdentityMatrix}!homalgTable entry}
\label{IsIdentityMatrix:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape M}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{IsIdentityMatrix} is bound then the standard method for the property \texttt{IsIdentityMatrix} (\ref{IsIdentityMatrix}) shown below returns $RP$!.\texttt{IsIdentityMatrix}$( \mbox{\texttt{\slshape M}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( IsIdentityMatrix,
          "for homalg matrices",
          [ IsHomalgMatrix ],
          
    function( M )
      local R, RP;
      
      R := HomalgRing( M );
      
      RP := homalgTable( R );
      
      if IsBound(RP!.IsIdentityMatrix) then
          return RP!.IsIdentityMatrix( M );
      fi;
      
      #=====# the fallback method #=====#
      
      return M = HomalgIdentityMatrix( NrRows( M ), HomalgRing( M ) );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsDiagonalMatrix (homalgTable entry)}}
\logpage{[ "D", 2, 3 ]}\nobreak
\hyperdef{L}{X7B6420E88418316B}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsDiagonalMatrix({\slshape M})\index{IsDiagonalMatrix@\texttt{IsDiagonalMatrix}!homalgTable entry}
\label{IsDiagonalMatrix:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape M}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{IsDiagonalMatrix} is bound then the standard method for the property \texttt{IsDiagonalMatrix} (\ref{IsDiagonalMatrix}) shown below returns $RP$!.\texttt{IsDiagonalMatrix}$( \mbox{\texttt{\slshape M}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( IsDiagonalMatrix,
          "for homalg matrices",
          [ IsHomalgMatrix ],
          
    function( M )
      local R, RP, diag;
      
      R := HomalgRing( M );
      
      RP := homalgTable( R );
      
      if IsBound(RP!.IsDiagonalMatrix) then
          return RP!.IsDiagonalMatrix( M );
      fi;
      
      #=====# the fallback method #=====#
      
      diag := DiagonalEntries( M );
      
      return M = HomalgDiagonalMatrix( diag, NrRows( M ), NrColumns( M ), R );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{ZeroRows (homalgTable entry)}}
\logpage{[ "D", 2, 4 ]}\nobreak
\hyperdef{L}{X872B70367F412945}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ZeroRows({\slshape C})\index{ZeroRows@\texttt{ZeroRows}!homalgTable entry}
\label{ZeroRows:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a (possibly empty) list of positive integers



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{ZeroRows} is bound then the standard method of the attribute \texttt{ZeroRows} (\ref{ZeroRows}) shown below returns $RP$!.\texttt{ZeroRows}$( \mbox{\texttt{\slshape C}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( ZeroRows,
          "for homalg matrices",
          [ IsHomalgMatrix ],
          
    function( C )
      local R, RP, z;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      if IsBound(RP!.ZeroRows) then
          return RP!.ZeroRows( C );
      fi;
      
      #=====# the fallback method #=====#
      
      z := HomalgZeroMatrix( 1, NrColumns( C ), R );
      
      return Filtered( [ 1 .. NrRows( C ) ], a -> CertainRows( C, [ a ] ) = z );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{ZeroColumns (homalgTable entry)}}
\logpage{[ "D", 2, 5 ]}\nobreak
\hyperdef{L}{X7A469E6D7EA63BB6}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ZeroColumns({\slshape C})\index{ZeroColumns@\texttt{ZeroColumns}!homalgTable entry}
\label{ZeroColumns:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a (possibly empty) list of positive integers



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{ZeroColumns} is bound then the standard method of the attribute \texttt{ZeroColumns} (\ref{ZeroColumns}) shown below returns $RP$!.\texttt{ZeroColumns}$( \mbox{\texttt{\slshape C}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( ZeroColumns,
          "for homalg matrices",
          [ IsHomalgMatrix ],
          
    function( C )
      local R, RP, z;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      if IsBound(RP!.ZeroColumns) then
          return RP!.ZeroColumns( C );
      fi;
      
      #=====# the fallback method #=====#
      
      z := HomalgZeroMatrix( NrRows( C ), 1, R );
      
      return Filtered( [ 1 .. NrColumns( C ) ], a -> CertainColumns( C, [ a ] ) = z );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{GetColumnIndependentUnitPositions (homalgTable entry)}}
\logpage{[ "D", 2, 6 ]}\nobreak
\hyperdef{L}{X7BCBACDB79C96FBF}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{GetColumnIndependentUnitPositions({\slshape M, poslist})\index{GetColumnIndependentUnitPositions@\texttt{GetColumnIndependentUnitPositions}!homalgTable entry}
\label{GetColumnIndependentUnitPositions:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a (possibly empty) list of pairs of positive integers



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape M}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{GetColumnIndependentUnitPositions} is bound then the standard method of the operation \texttt{GetColumnIndependentUnitPositions} (\ref{GetColumnIndependentUnitPositions:for matrices}) returns $RP$!.\texttt{GetColumnIndependentUnitPositions}$( \mbox{\texttt{\slshape M}}, \mbox{\texttt{\slshape poslist}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( GetColumnIndependentUnitPositions,
          "for homalg matrices",
          [ IsHomalgMatrix, IsHomogeneousList ],
          
    function( M, poslist )
      local R, RP, rest, pos, i, j, k;
      
      R := HomalgRing( M );
      
      RP := homalgTable( R );
      
      if IsBound(RP!.GetColumnIndependentUnitPositions) then
          pos := RP!.GetColumnIndependentUnitPositions( M, poslist );
          if pos <> [ ] then
              SetIsZero( M, false );
          fi;
          return pos;
      fi;
      
      #=====# the fallback method #=====#
      
      rest := [ 1 .. NrColumns( M ) ];
      
      pos := [ ];
      
      for i in [ 1 .. NrRows( M ) ] do
          for k in Reversed( rest ) do
              if not [ i, k ] in poslist and
                 IsUnit( R, GetEntryOfHomalgMatrix( M, i, k ) ) then
                  Add( pos, [ i, k ] );
                  rest := Filtered( rest,
                                  a -> IsZero( GetEntryOfHomalgMatrix( M, i, a ) ) );
                  break;
              fi;
          od;
      od;
      
      if pos <> [ ] then
          SetIsZero( M, false );
      fi;
      
      return pos;
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{GetRowIndependentUnitPositions (homalgTable entry)}}
\logpage{[ "D", 2, 7 ]}\nobreak
\hyperdef{L}{X855C57B6822E7A98}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{GetRowIndependentUnitPositions({\slshape M, poslist})\index{GetRowIndependentUnitPositions@\texttt{GetRowIndependentUnitPositions}!homalgTable entry}
\label{GetRowIndependentUnitPositions:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a (possibly empty) list of pairs of positive integers



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape M}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{GetRowIndependentUnitPositions} is bound then the standard method of the operation \texttt{GetRowIndependentUnitPositions} (\ref{GetRowIndependentUnitPositions:for matrices}) returns $RP$!.\texttt{GetRowIndependentUnitPositions}$( \mbox{\texttt{\slshape M}}, \mbox{\texttt{\slshape poslist}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( GetRowIndependentUnitPositions,
          "for homalg matrices",
          [ IsHomalgMatrix, IsHomogeneousList ],
          
    function( M, poslist )
      local R, RP, rest, pos, j, i, k;
      
      R := HomalgRing( M );
      
      RP := homalgTable( R );
      
      if IsBound(RP!.GetRowIndependentUnitPositions) then
          pos := RP!.GetRowIndependentUnitPositions( M, poslist );
          if pos <> [ ] then
              SetIsZero( M, false );
          fi;
          return pos;
      fi;
      
      #=====# the fallback method #=====#
      
      rest := [ 1 .. NrRows( M ) ];
      
      pos := [ ];
      
      for j in [ 1 .. NrColumns( M ) ] do
          for k in Reversed( rest ) do
              if not [ j, k ] in poslist and
                 IsUnit( R, GetEntryOfHomalgMatrix( M, k, j ) ) then
                  Add( pos, [ j, k ] );
                  rest := Filtered( rest,
                                  a -> IsZero( GetEntryOfHomalgMatrix( M, a, j ) ) );
                  break;
              fi;
          od;
      od;
      
      if pos <> [ ] then
          SetIsZero( M, false );
      fi;
      
      return pos;
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{GetUnitPosition (homalgTable entry)}}
\logpage{[ "D", 2, 8 ]}\nobreak
\hyperdef{L}{X876495AA79063CDE}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{GetUnitPosition({\slshape M, poslist})\index{GetUnitPosition@\texttt{GetUnitPosition}!homalgTable entry}
\label{GetUnitPosition:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a (possibly empty) list of pairs of positive integers



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape M}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{GetUnitPosition} is bound then the standard method of the operation \texttt{GetUnitPosition} (\ref{GetUnitPosition:for matrices}) returns $RP$!.\texttt{GetUnitPosition}$( \mbox{\texttt{\slshape M}}, \mbox{\texttt{\slshape poslist}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( GetUnitPosition,
          "for homalg matrices",
          [ IsHomalgMatrix, IsHomogeneousList ],
          
    function( M, poslist )
      local R, RP, pos, m, n, i, j;
      
      R := HomalgRing( M );
      
      RP := homalgTable( R );
      
      if IsBound(RP!.GetUnitPosition) then
          pos := RP!.GetUnitPosition( M, poslist );
          if IsList( pos ) and IsPosInt( pos[1] ) and IsPosInt( pos[2] ) then
              SetIsZero( M, false );
          fi;
          return pos;
      fi;
      
      #=====# the fallback method #=====#
      
      m := NrRows( M );
      n := NrColumns( M );
      
      for i in [ 1 .. m ] do
          for j in [ 1 .. n ] do
              if not [ i, j ] in poslist and not j in poslist and
                 IsUnit( R, GetEntryOfHomalgMatrix( M, i, j ) ) then
                  SetIsZero( M, false );
                  return [ i, j ];
              fi;
          od;
      od;
      
      return fail;
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{DegreesOfEntries (homalgTable entry)}}
\logpage{[ "D", 2, 9 ]}\nobreak
\hyperdef{L}{X817279EB87104A01}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DegreesOfEntries({\slshape C})\index{DegreesOfEntries@\texttt{DegreesOfEntries}!homalgTable entry}
\label{DegreesOfEntries:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a listlist of degrees/multi-degrees



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{DegreesOfEntries} is bound then the standard method for the attribute \texttt{DegreesOfEntries} (\ref{DegreesOfEntries}) shown below returns $RP$!.\texttt{DegreesOfEntries}$( \mbox{\texttt{\slshape C}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( DegreesOfEntries,
          "for homalg matrices",
          [ IsHomalgMatrix ],
          
    function( C )
      local R, RP, weights, e, c;
      
      if IsZero( C ) then
          return ListWithIdenticalEntries( NrRows( C ),
                         ListWithIdenticalEntries( NrColumns( C ), -1 ) );
      fi;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      if Set( WeightsOfIndeterminates( R ) ) <> [ 1 ] then
          
          weights := WeightsOfIndeterminates( R );
          
          if IsList( weights[1] ) then
              if IsBound(RP!.MultiWeightedDegreesOfEntries) then
                  return RP!.MultiWeightedDegreesOfEntries( C, weights );
              fi;
          elif IsBound(RP!.WeightedDegreesOfEntries) then
              return RP!.WeightedDegreesOfEntries( C, weights );
          fi;
          
      elif IsBound(RP!.DegreesOfEntries) then
          return RP!.DegreesOfEntries( C );
      fi;
      
      #=====# the fallback method #=====#
      
      e := EntriesOfHomalgMatrix( C );
      
      e := List( e, DegreeMultivariatePolynomial );
      
      c := NrColumns( C );
      
      return List( [ 1 .. NrRows( C ) ], r -> e{[ ( r - 1 ) * c + 1 .. r * c ]} );
      
  end );
\end{Verbatim}
 }

 }

  }


\chapter{\textcolor{Chapter }{Logic Subpackages}}\label{Logic}
\logpage{[ "E", 0, 0 ]}
\hyperdef{L}{X8222352C78A19214}{}
{
  
\section{\textcolor{Chapter }{\textsf{LIRNG}: Logical Implications for Rings}}\label{Rings:LIRNG}
\logpage{[ "E", 1, 0 ]}
\hyperdef{L}{X86BB747287348853}{}
{
  }

 
\section{\textcolor{Chapter }{\textsf{LIMAP}: Logical Implications for Ring Maps}}\label{RingMaps:LIMAP}
\logpage{[ "E", 2, 0 ]}
\hyperdef{L}{X7B2915F1867EE8D0}{}
{
  }

 
\section{\textcolor{Chapter }{\textsf{LIMAT}: Logical Implications for Matrices}}\label{Matrices:LIMAT}
\logpage{[ "E", 3, 0 ]}
\hyperdef{L}{X799DA94B849ABF1E}{}
{
  }

 
\section{\textcolor{Chapter }{\textsf{COLEM}: Clever Operations for Lazy Evaluated Matrices}}\label{Matrices:COLEM}
\logpage{[ "E", 4, 0 ]}
\hyperdef{L}{X847B8AB5843231C2}{}
{
  Most of the matrix tool operations listed in Appendix \ref{ToolsNoFallBack} which return a new matrix are lazy evaluated. The value of a \textsf{homalg} matrix is stored in the attribute \texttt{Eval}. Below is the list of the installed methods for the attribute \texttt{Eval}. 

\subsection{\textcolor{Chapter }{Eval (for matrices created with HomalgInitialMatrix)}}
\logpage{[ "E", 4, 1 ]}\nobreak
\hyperdef{L}{X7EEAADA6807A5A45}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Eval({\slshape C})\index{Eval@\texttt{Eval}!for matrices created with HomalgInitialMatrix}
\label{Eval:for matrices created with HomalgInitialMatrix}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 In case the matrix \mbox{\texttt{\slshape A}} was created using \texttt{HomalgInitialMatrix} (\ref{HomalgInitialMatrix:constructor for initial matrices filled with zeros}) then the filter \texttt{IsInitialMatrix} for \mbox{\texttt{\slshape A}} is set to true and the \texttt{homalgTable} function ($\to$ \texttt{ZeroMatrix} (\ref{ZeroMatrix:homalgTable entry for initial matrices})) will be used to set the attribute \texttt{Eval} and resets the filter \texttt{IsInitialMatrix}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices (IsInitialMatrix)",
          [ IsHomalgMatrix and IsInitialMatrix and
            HasNrRows and HasNrColumns ],
          
    function( C )
      local R, RP, z, zz;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      if IsBound( RP!.ZeroMatrix ) then
          ResetFilterObj( C, IsInitialMatrix );
          return RP!.ZeroMatrix( C );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called ZeroMatrix in the ",
                 "homalgTable to evaluate a non-internal initial matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      z := Zero( HomalgRing( C ) );
      
      ResetFilterObj( C, IsInitialMatrix );
      
      zz := ListWithIdenticalEntries( NrColumns( C ), z );
      
      return homalgInternalMatrixHull(
                     List( [ 1 .. NrRows( C ) ], i -> ShallowCopy( zz ) ) );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with HomalgInitialIdentityMatrix)}}
\logpage{[ "E", 4, 2 ]}\nobreak
\hyperdef{L}{X7B619CA885024F0F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Eval({\slshape C})\index{Eval@\texttt{Eval}!for matrices created with HomalgInitialIdentityMatrix}
\label{Eval:for matrices created with HomalgInitialIdentityMatrix}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 In case the matrix \mbox{\texttt{\slshape A}} was created using \texttt{HomalgInitialIdentityMatrix} (\ref{HomalgInitialIdentityMatrix:constructor for initial quadratic matrices with ones on the diagonal}) then the filter \texttt{IsInitialIdentityMatrix} for \mbox{\texttt{\slshape A}} is set to true and the \texttt{homalgTable} function ($\to$ \texttt{IdentityMatrix} (\ref{IdentityMatrix:homalgTable entry for initial identity matrices})) will be used to set the attribute \texttt{Eval} and resets the filter \texttt{IsInitialIdentityMatrix}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices (IsInitialIdentityMatrix)",
          [ IsHomalgMatrix and IsInitialIdentityMatrix and
            HasNrRows and HasNrColumns ],
          
    function( C )
      local R, RP, o, z, zz, id;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      if IsBound( RP!.IdentityMatrix ) then
          ResetFilterObj( C, IsInitialIdentityMatrix );
          return RP!.IdentityMatrix( C );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called IdentityMatrix in the ",
                 "homalgTable to evaluate a non-internal initial identity matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      z := Zero( HomalgRing( C ) );
      o := One( HomalgRing( C ) );
      
      ResetFilterObj( C, IsInitialIdentityMatrix );
      
      zz := ListWithIdenticalEntries( NrColumns( C ), z );
      
      id := List( [ 1 .. NrRows( C ) ],
                  function(i)
                    local z;
                    z := ShallowCopy( zz ); z[i] := o; return z;
                  end );
      
      return homalgInternalMatrixHull( id );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with HomalgZeroMatrix)}}
\logpage{[ "E", 4, 3 ]}\nobreak
\hyperdef{L}{X7EADAA3180A84318}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Eval({\slshape C})\index{Eval@\texttt{Eval}!for matrices created with HomalgZeroMatrix}
\label{Eval:for matrices created with HomalgZeroMatrix}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 In case the matrix \mbox{\texttt{\slshape A}} was created using \texttt{HomalgZeroMatrix} (\ref{HomalgZeroMatrix:constructor for zero matrices}) then the filter \texttt{IsZeroMatrix} for \mbox{\texttt{\slshape A}} is set to true and the \texttt{homalgTable} function ($\to$ \texttt{ZeroMatrix} (\ref{ZeroMatrix:homalgTable entry})) will be used to set the attribute \texttt{Eval}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices (IsZero)",
          [ IsHomalgMatrix and IsZero and HasNrRows and HasNrColumns ], 20,
          
    function( C )
      local R, RP, z;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      if ( NrRows( C ) = 0 or NrColumns( C ) = 0 ) and
         not ( IsBound( R!.SafeToEvaluateEmptyMatrices ) and
               R!.SafeToEvaluateEmptyMatrices = true ) then
          Info( InfoWarning, 1, "\033[01m\033[5;31;47m",
                "an empty matrix is about to get evaluated!",
                "\033[0m" );
      fi;
      
      if IsBound( RP!.ZeroMatrix ) then
          return RP!.ZeroMatrix( C );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called ZeroMatrix in the ",
                 "homalgTable to evaluate a non-internal zero matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      z := Zero( HomalgRing( C ) );
      
      ## copying the rows saves memory;
      ## we assume that the entries are never modified!!!
      return homalgInternalMatrixHull(
                     ListWithIdenticalEntries( NrRows( C ),
                             ListWithIdenticalEntries( NrColumns( C ), z ) ) );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with HomalgIdentityMatrix)}}
\logpage{[ "E", 4, 4 ]}\nobreak
\hyperdef{L}{X78CCA57B84E51834}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Eval({\slshape C})\index{Eval@\texttt{Eval}!for matrices created with HomalgIdentityMatrix}
\label{Eval:for matrices created with HomalgIdentityMatrix}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 In case the matrix \mbox{\texttt{\slshape A}} was created using \texttt{HomalgIdentityMatrix} (\ref{HomalgIdentityMatrix:constructor for identity matrices}) then the filter \texttt{IsIdentityMatrix} for \mbox{\texttt{\slshape A}} is set to true and the \texttt{homalgTable} function ($\to$ \texttt{IdentityMatrix} (\ref{IdentityMatrix:homalgTable entry})) will be used to set the attribute \texttt{Eval}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices (IsIdentityMatrix)",
          [ IsHomalgMatrix and IsIdentityMatrix and HasNrRows and HasNrColumns ], 10,
          
    function( C )
      local R, RP, o, z, zz, id;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      if IsBound( RP!.IdentityMatrix ) then
          return RP!.IdentityMatrix( C );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called IdentityMatrix in the ",
                 "homalgTable to evaluate a non-internal identity matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      z := Zero( HomalgRing( C ) );
      o := One( HomalgRing( C ) );
      
      zz := ListWithIdenticalEntries( NrColumns( C ), z );
      
      id := List( [ 1 .. NrRows( C ) ],
                  function(i)
                    local z;
                    z := ShallowCopy( zz ); z[i] := o; return z;
                  end );
      
      return homalgInternalMatrixHull( id );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with Involution)}}
\logpage{[ "E", 4, 5 ]}\nobreak
\hyperdef{L}{X7928991E8768FA72}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Eval({\slshape C})\index{Eval@\texttt{Eval}!for matrices created with Involution}
\label{Eval:for matrices created with Involution}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 In case the matrix was created using \texttt{Involution} (\ref{Involution:for matrices}) then the filter \texttt{HasEvalInvolution} for \mbox{\texttt{\slshape A}} is set to true and the \texttt{homalgTable} function \texttt{Involution} (\ref{Involution:homalgTable entry}) will be used to set the attribute \texttt{Eval}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices (HasEvalInvolution)",
          [ IsHomalgMatrix and HasEvalInvolution ],
          
    function( C )
      local R, RP, M;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      M :=  EvalInvolution( C );
      
      if IsBound(RP!.Involution) then
          return RP!.Involution( M );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called Involution in the ",
                 "homalgTable to apply to a non-internal matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      return homalgInternalMatrixHull( TransposedMat( Eval( M )!.matrix ) );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with CertainRows)}}
\logpage{[ "E", 4, 6 ]}\nobreak
\hyperdef{L}{X852DCBD57A742FA5}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Eval({\slshape C})\index{Eval@\texttt{Eval}!for matrices created with CertainRows}
\label{Eval:for matrices created with CertainRows}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 In case the matrix was created using \texttt{CertainRows} (\ref{CertainRows:for matrices}) then the filter \texttt{HasEvalCertainRows} for \mbox{\texttt{\slshape A}} is set to true and the \texttt{homalgTable} function \texttt{CertainRows} (\ref{CertainRows:homalgTable entry}) will be used to set the attribute \texttt{Eval}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices (HasEvalCertainRows)",
          [ IsHomalgMatrix and HasEvalCertainRows ],
          
    function( C )
      local R, RP, e, M, plist;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      e :=  EvalCertainRows( C );
      
      M := e[1];
      plist := e[2];
      
      if IsBound(RP!.CertainRows) then
          return RP!.CertainRows( M, plist );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called CertainRows in the ",
                 "homalgTable to apply to a non-internal matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      return homalgInternalMatrixHull( Eval( M )!.matrix{ plist } );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with CertainColumns)}}
\logpage{[ "E", 4, 7 ]}\nobreak
\hyperdef{L}{X835F6F2E7D590F3D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Eval({\slshape C})\index{Eval@\texttt{Eval}!for matrices created with CertainColumns}
\label{Eval:for matrices created with CertainColumns}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 In case the matrix was created using \texttt{CertainColumns} (\ref{CertainColumns:for matrices}) then the filter \texttt{HasEvalCertainColumns} for \mbox{\texttt{\slshape A}} is set to true and the \texttt{homalgTable} function \texttt{CertainColumns} (\ref{CertainColumns:homalgTable entry}) will be used to set the attribute \texttt{Eval}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices (HasEvalCertainColumns)",
          [ IsHomalgMatrix and HasEvalCertainColumns ],
          
    function( C )
      local R, RP, e, M, plist;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      e :=  EvalCertainColumns( C );
      
      M := e[1];
      plist := e[2];
      
      if IsBound(RP!.CertainColumns) then
          return RP!.CertainColumns( M, plist );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called CertainColumns in the ",
                 "homalgTable to apply to a non-internal matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      return homalgInternalMatrixHull(
                     Eval( M )!.matrix{[ 1 .. NrRows( M ) ]}{plist} );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with UnionOfRows)}}
\logpage{[ "E", 4, 8 ]}\nobreak
\hyperdef{L}{X7F35A61C8522A1B0}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Eval({\slshape C})\index{Eval@\texttt{Eval}!for matrices created with UnionOfRows}
\label{Eval:for matrices created with UnionOfRows}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 In case the matrix was created using \texttt{UnionOfRows} (\ref{UnionOfRows:for matrices}) then the filter \texttt{HasEvalUnionOfRows} for \mbox{\texttt{\slshape A}} is set to true and the \texttt{homalgTable} function \texttt{UnionOfRows} (\ref{UnionOfRows:homalgTable entry}) will be used to set the attribute \texttt{Eval}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices (HasEvalUnionOfRows)",
          [ IsHomalgMatrix and HasEvalUnionOfRows ],
          
    function( C )
      local R, RP, e, A, B, U;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      e :=  EvalUnionOfRows( C );
      
      A := e[1];
      B := e[2];
      
      if IsBound(RP!.UnionOfRows) then
          return RP!.UnionOfRows( A, B );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called UnionOfRows in the ",
                 "homalgTable to apply to a non-internal matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      U := ShallowCopy( Eval( A )!.matrix );
      
      U{ [ NrRows( A ) + 1 .. NrRows( A ) + NrRows( B ) ] } := Eval( B )!.matrix;
      
      return homalgInternalMatrixHull( U );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with UnionOfColumns)}}
\logpage{[ "E", 4, 9 ]}\nobreak
\hyperdef{L}{X7EDE6095820F8128}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Eval({\slshape C})\index{Eval@\texttt{Eval}!for matrices created with UnionOfColumns}
\label{Eval:for matrices created with UnionOfColumns}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 In case the matrix was created using \texttt{UnionOfColumns} (\ref{UnionOfColumns:for matrices}) then the filter \texttt{HasEvalUnionOfColumns} for \mbox{\texttt{\slshape A}} is set to true and the \texttt{homalgTable} function \texttt{UnionOfColumns} (\ref{UnionOfColumns:homalgTable entry}) will be used to set the attribute \texttt{Eval}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices (HasEvalUnionOfColumns)",
          [ IsHomalgMatrix and HasEvalUnionOfColumns ],
          
    function( C )
      local R, RP, e, A, B, U;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      e :=  EvalUnionOfColumns( C );
      
      A := e[1];
      B := e[2];
      
      if IsBound(RP!.UnionOfColumns) then
          return RP!.UnionOfColumns( A, B );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called UnionOfColumns in the ",
                 "homalgTable to apply to a non-internal matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      U := List( Eval( A )!.matrix, ShallowCopy );
      
      U{ [ 1 .. NrRows( A ) ] }
        { [ NrColumns( A ) + 1 .. NrColumns( A ) + NrColumns( B ) ] }
        := Eval( B )!.matrix;
      
      return homalgInternalMatrixHull( U );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with DiagMat)}}
\logpage{[ "E", 4, 10 ]}\nobreak
\hyperdef{L}{X7FD68F43831046B6}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Eval({\slshape C})\index{Eval@\texttt{Eval}!for matrices created with DiagMat}
\label{Eval:for matrices created with DiagMat}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 In case the matrix was created using \texttt{DiagMat} (\ref{DiagMat:for matrices}) then the filter \texttt{HasEvalDiagMat} for \mbox{\texttt{\slshape A}} is set to true and the \texttt{homalgTable} function \texttt{DiagMat} (\ref{DiagMat:homalgTable entry}) will be used to set the attribute \texttt{Eval}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices (HasEvalDiagMat)",
          [ IsHomalgMatrix and HasEvalDiagMat ],
          
    function( C )
      local R, RP, e, z, m, n, diag, mat;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      e :=  EvalDiagMat( C );
      
      if IsBound(RP!.DiagMat) then
          return RP!.DiagMat( e );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called DiagMat in the ",
                 "homalgTable to apply to a non-internal matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      z := Zero( R );
      
      m := Sum( List( e, NrRows ) );
      n := Sum( List( e, NrColumns ) );
      
      diag := List( [ 1 .. m ],  a -> List( [ 1 .. n ], b -> z ) );
      
      m := 0;
      n := 0;
      
      for mat in e do
          diag{ [ m + 1 .. m + NrRows( mat ) ] }{ [ n + 1 .. n + NrColumns( mat ) ] }
            := Eval( mat )!.matrix;
          
          m := m + NrRows( mat );
          n := n + NrColumns( mat );
      od;
      
      return homalgInternalMatrixHull( diag );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with KroneckerMat)}}
\logpage{[ "E", 4, 11 ]}\nobreak
\hyperdef{L}{X84F45FB4854A079C}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Eval({\slshape C})\index{Eval@\texttt{Eval}!for matrices created with KroneckerMat}
\label{Eval:for matrices created with KroneckerMat}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 In case the matrix was created using \texttt{KroneckerMat} (\ref{KroneckerMat:for matrices}) then the filter \texttt{HasEvalKroneckerMat} for \mbox{\texttt{\slshape A}} is set to true and the \texttt{homalgTable} function \texttt{KroneckerMat} (\ref{KroneckerMat:homalgTable entry}) will be used to set the attribute \texttt{Eval}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices (HasEvalKroneckerMat)",
          [ IsHomalgMatrix and HasEvalKroneckerMat ],
          
    function( C )
      local R, RP, A, B;
      
      R := HomalgRing( C );
      
      if HasIsCommutative( R ) and not IsCommutative( R ) then
          Info( InfoWarning, 1, "\033[01m\033[5;31;47m",
                "the Kronecker product is only defined for commutative rings!",
                "\033[0m" );
      fi;
      
      RP := homalgTable( R );
      
      A :=  EvalKroneckerMat( C )[1];
      B :=  EvalKroneckerMat( C )[2];
      
      if IsBound(RP!.KroneckerMat) then
          return RP!.KroneckerMat( A, B );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called KroneckerMat in the ",
                 "homalgTable to apply to a non-internal matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      return homalgInternalMatrixHull(
                     KroneckerProduct( Eval( A )!.matrix, Eval( B )!.matrix ) );
      ## this was easy, thanks GAP :)
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with MulMat)}}
\logpage{[ "E", 4, 12 ]}\nobreak
\hyperdef{L}{X7B68797C7EA79B10}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Eval({\slshape C})\index{Eval@\texttt{Eval}!for matrices created with MulMat}
\label{Eval:for matrices created with MulMat}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 In case the matrix was created using \texttt{\texttt{\symbol{92}}*} (\ref{*:for ring elements and matrices}) then the filter \texttt{HasEvalMulMat} for \mbox{\texttt{\slshape A}} is set to true and the \texttt{homalgTable} function \texttt{MulMat} (\ref{MulMat:homalgTable entry}) will be used to set the attribute \texttt{Eval}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices (HasEvalMulMat)",
          [ IsHomalgMatrix and HasEvalMulMat ],
          
    function( C )
      local R, RP, e, a, A;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      e :=  EvalMulMat( C );
      
      a := e[1];
      A := e[2];
      
      if IsBound(RP!.MulMat) then
          return RP!.MulMat( a, A );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called MulMat in the ",
                 "homalgTable to apply to a non-internal matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      return a * Eval( A );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with AddMat)}}
\logpage{[ "E", 4, 13 ]}\nobreak
\hyperdef{L}{X85971C16868BD83C}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Eval({\slshape C})\index{Eval@\texttt{Eval}!for matrices created with AddMat}
\label{Eval:for matrices created with AddMat}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 In case the matrix was created using \texttt{\texttt{\symbol{92}}+} (\ref{+:for matrices}) then the filter \texttt{HasEvalAddMat} for \mbox{\texttt{\slshape A}} is set to true and the \texttt{homalgTable} function \texttt{AddMat} (\ref{AddMat:homalgTable entry}) will be used to set the attribute \texttt{Eval}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices (HasEvalAddMat)",
          [ IsHomalgMatrix and HasEvalAddMat ],
          
    function( C )
      local R, RP, e, A, B;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      e :=  EvalAddMat( C );
      
      A := e[1];
      B := e[2];
      
      if IsBound(RP!.AddMat) then
          return RP!.AddMat( A, B );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called AddMat in the ",
                 "homalgTable to apply to a non-internal matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      return Eval( A ) + Eval( B );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with SubMat)}}
\logpage{[ "E", 4, 14 ]}\nobreak
\hyperdef{L}{X86F848318791595C}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Eval({\slshape C})\index{Eval@\texttt{Eval}!for matrices created with SubMat}
\label{Eval:for matrices created with SubMat}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 In case the matrix was created using \texttt{\texttt{\symbol{92}}-} (\ref{-:for matrices}) then the filter \texttt{HasEvalSubMat} for \mbox{\texttt{\slshape A}} is set to true and the \texttt{homalgTable} function \texttt{SubMat} (\ref{SubMat:homalgTable entry}) will be used to set the attribute \texttt{Eval}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices (HasEvalSubMat)",
          [ IsHomalgMatrix and HasEvalSubMat ],
          
    function( C )
      local R, RP, e, A, B;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      e :=  EvalSubMat( C );
      
      A := e[1];
      B := e[2];
      
      if IsBound(RP!.SubMat) then
          return RP!.SubMat( A, B );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called SubMat in the ",
                 "homalgTable to apply to a non-internal matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      return Eval( A ) - Eval( B );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with Compose)}}
\logpage{[ "E", 4, 15 ]}\nobreak
\hyperdef{L}{X7F7682FC86F602C2}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Eval({\slshape C})\index{Eval@\texttt{Eval}!for matrices created with Compose}
\label{Eval:for matrices created with Compose}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\slshape C}}



 In case the matrix was created using \texttt{\texttt{\symbol{92}}*} (\ref{*:for composable matrices}) then the filter \texttt{HasEvalCompose} for \mbox{\texttt{\slshape A}} is set to true and the \texttt{homalgTable} function \texttt{Compose} (\ref{Compose:homalgTable entry}) will be used to set the attribute \texttt{Eval}. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices (HasEvalCompose)",
          [ IsHomalgMatrix and HasEvalCompose ],
          
    function( C )
      local R, RP, e, A, B;
      
      R := HomalgRing( C );
      
      RP := homalgTable( R );
      
      e :=  EvalCompose( C );
      
      A := e[1];
      B := e[2];
      
      if IsBound(RP!.Compose) then
          return RP!.Compose( A, B );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called Compose in the ",
                 "homalgTable to apply to a non-internal matrix\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      return Eval( A ) * Eval( B );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with LeftInverse)}}
\logpage{[ "E", 4, 16 ]}\nobreak
\hyperdef{L}{X807FAD72788E9A9F}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Eval({\slshape A})\index{Eval@\texttt{Eval}!for matrices created with LeftInverse}
\label{Eval:for matrices created with LeftInverse}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
see below



 In case the matrix was created using \texttt{LeftInverse} (\ref{LeftInverse:for matrices}) then the filter \texttt{HasEvalLeftInverse} for \mbox{\texttt{\slshape A}} is set to true and the method listed below will be used to set the attribute \texttt{Eval}. ($\to$ \texttt{RightDivide} (\ref{RightDivide:for pairs of matrices})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices",
          [ IsHomalgMatrix and HasEvalLeftInverse ],
          
    function( LI )
      local R, RI, Id, left_inv;
      
      R := HomalgRing( LI );
      
      RI := EvalLeftInverse( LI );
      
      Id := HomalgIdentityMatrix( NrColumns( RI ), R );
      
      left_inv := RightDivide( Id, RI );	## ( cf. [BR, Subsection 3.1.3] )
      
      if IsBool( left_inv ) then
          return false;
      fi;
      
      ## CAUTION: for the following SetXXX RightDivide is assumed
      ## NOT to be lazy evaluated!!!
      
      SetIsLeftInvertibleMatrix( RI, true );
      
      if HasIsInvertibleMatrix( RI ) and IsInvertibleMatrix( RI ) then
          SetIsInvertibleMatrix( LI, true );
      else
          SetIsRightInvertibleMatrix( LI, true );
      fi;
      
      return Eval( left_inv );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with RightInverse)}}
\logpage{[ "E", 4, 17 ]}\nobreak
\hyperdef{L}{X798F29F882931278}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Eval({\slshape A})\index{Eval@\texttt{Eval}!for matrices created with RightInverse}
\label{Eval:for matrices created with RightInverse}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
see below



 In case the matrix was created using \texttt{RightInverse} (\ref{RightInverse:for matrices}) then the filter \texttt{HasEvalRightInverse} for \mbox{\texttt{\slshape A}} is set to true and the method listed below will be used to set the attribute \texttt{Eval}. ($\to$ \texttt{LeftDivide} (\ref{LeftDivide:for pairs of matrices})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices",
          [ IsHomalgMatrix and HasEvalRightInverse ],
          
    function( RI )
      local R, LI, Id, right_inv;
      
      R := HomalgRing( RI );
      
      LI := EvalRightInverse( RI );
      
      Id := HomalgIdentityMatrix( NrRows( LI ), R );
      
      right_inv := LeftDivide( LI, Id );	## ( cf. [BR, Subsection 3.1.3] )
      
      if IsBool( right_inv ) then
          return false;
      fi;
      
      ## CAUTION: for the following SetXXX LeftDivide is assumed
      ## NOT to be lazy evaluated!!!
      
      SetIsRightInvertibleMatrix( LI, true );
      
      if HasIsInvertibleMatrix( LI ) and IsInvertibleMatrix( LI ) then
          SetIsInvertibleMatrix( RI, true );
      else
          SetIsLeftInvertibleMatrix( RI, true );
      fi;
      
      return Eval( right_inv );
      
  end );
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{\textsf{LIMOD}: Logical Implications for Modules}}\label{Modules:LIMOD}
\logpage{[ "E", 5, 0 ]}
\hyperdef{L}{X8462717983D4B197}{}
{
  }

 
\section{\textcolor{Chapter }{\textsf{LIMOR}: Logical Implications for Morphisms}}\label{Maps:LIMOR}
\logpage{[ "E", 6, 0 ]}
\hyperdef{L}{X84825525828B807D}{}
{
  }

 
\section{\textcolor{Chapter }{\textsf{LICPX}: Logical Implications for Complexes}}\label{Complexes:LICPX}
\logpage{[ "E", 7, 0 ]}
\hyperdef{L}{X81D8B00980E61855}{}
{
  }

  }


\chapter{\textcolor{Chapter }{The subpackage \textsf{ResidueClassRingForHomalg} as a sample ring package}}\label{ResidueClassRingForHomalg}
\logpage{[ "F", 0, 0 ]}
\hyperdef{L}{X7F3BA9AE7A0D245D}{}
{
  For an example see \ref{HomHom}. 
\section{\textcolor{Chapter }{The Mandatory Basic Operations}}\label{ResidueClassRingForHomalg:BasicNoFallBack}
\logpage{[ "F", 1, 0 ]}
\hyperdef{L}{X84978AF3878A8375}{}
{
  

\subsection{\textcolor{Chapter }{BasisOfRowModule (ResidueClassRing)}}
\logpage{[ "F", 1, 1 ]}\nobreak
\hyperdef{L}{X7AB980C5791BA204}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{BasisOfRowModule({\slshape M})\index{BasisOfRowModule@\texttt{BasisOfRowModule}!ResidueClassRing}
\label{BasisOfRowModule:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  BasisOfRowModule :=
    function( M )
      local Mrel;
      
      Mrel := UnionOfRows( M );
      
      Mrel := HomalgResidueClassMatrix(
                      BasisOfRowModule( Mrel ), HomalgRing( M ) );
      
      return GetRidOfObsoleteRows( Mrel );
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{BasisOfColumnModule (ResidueClassRing)}}
\logpage{[ "F", 1, 2 ]}\nobreak
\hyperdef{L}{X7F2B3332793FACA3}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{BasisOfColumnModule({\slshape M})\index{BasisOfColumnModule@\texttt{BasisOfColumnModule}!ResidueClassRing}
\label{BasisOfColumnModule:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  BasisOfColumnModule :=
    function( M )
      local Mrel;
      
      Mrel := UnionOfColumns( M );
      
      Mrel := HomalgResidueClassMatrix(
                      BasisOfColumnModule( Mrel ), HomalgRing( M ) );
      
      return GetRidOfObsoleteColumns( Mrel );
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{DecideZeroRows (ResidueClassRing)}}
\logpage{[ "F", 1, 3 ]}\nobreak
\hyperdef{L}{X83E072E1790A7D38}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DecideZeroRows({\slshape A, B})\index{DecideZeroRows@\texttt{DecideZeroRows}!ResidueClassRing}
\label{DecideZeroRows:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  DecideZeroRows :=
    function( A, B )
      local Brel;
      
      Brel := UnionOfRows( B );
      
      Brel := BasisOfRowModule( Brel );
      
      return HomalgResidueClassMatrix(
                     DecideZeroRows( Eval( A ), Brel ), HomalgRing( A ) );
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{DecideZeroColumns (ResidueClassRing)}}
\logpage{[ "F", 1, 4 ]}\nobreak
\hyperdef{L}{X841426A87A1A20E4}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DecideZeroColumns({\slshape A, B})\index{DecideZeroColumns@\texttt{DecideZeroColumns}!ResidueClassRing}
\label{DecideZeroColumns:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  DecideZeroColumns :=
    function( A, B )
      local Brel;
      
      Brel := UnionOfColumns( B );
      
      Brel := BasisOfColumnModule( Brel );
      
      return HomalgResidueClassMatrix(
                     DecideZeroColumns( Eval( A ), Brel ), HomalgRing( A ) );
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{SyzygiesGeneratorsOfRows (ResidueClassRing)}}
\logpage{[ "F", 1, 5 ]}\nobreak
\hyperdef{L}{X80F4836F7F175B12}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{SyzygiesGeneratorsOfRows({\slshape M})\index{SyzygiesGeneratorsOfRows@\texttt{SyzygiesGeneratorsOfRows}!ResidueClassRing}
\label{SyzygiesGeneratorsOfRows:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  SyzygiesGeneratorsOfRows :=
    function( M )
      local R, ring_rel, rel, S;
      
      R := HomalgRing( M );
      
      ring_rel := RingRelations( R );
      
      rel := MatrixOfRelations( ring_rel );
      
      if IsHomalgRelationsOfRightModule( ring_rel ) then
          rel := Involution( rel );
      fi;
      
      rel := DiagMat( ListWithIdenticalEntries( NrColumns( M ), rel ) );
      
      S := SyzygiesGeneratorsOfRows( Eval( M ), rel );
      
      S := HomalgResidueClassMatrix( S, R );
      
      S := GetRidOfObsoleteRows( S );
      
      if IsZero( S ) then
          
          SetIsLeftRegularMatrix( M, true );
          
      fi;
      
      return S;
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{SyzygiesGeneratorsOfColumns (ResidueClassRing)}}
\logpage{[ "F", 1, 6 ]}\nobreak
\hyperdef{L}{X7899768C8304A59E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{SyzygiesGeneratorsOfColumns({\slshape M})\index{SyzygiesGeneratorsOfColumns@\texttt{SyzygiesGeneratorsOfColumns}!ResidueClassRing}
\label{SyzygiesGeneratorsOfColumns:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  SyzygiesGeneratorsOfColumns :=
    function( M )
      local R, ring_rel, rel, S;
      
      R := HomalgRing( M );
      
      ring_rel := RingRelations( R );
      
      rel := MatrixOfRelations( ring_rel );
      
      if IsHomalgRelationsOfLeftModule( ring_rel ) then
          rel := Involution( rel );
      fi;
      
      rel := DiagMat( ListWithIdenticalEntries( NrRows( M ), rel ) );
      
      S := SyzygiesGeneratorsOfColumns( Eval( M ), rel );
      
      S := HomalgResidueClassMatrix( S, R );
      
      S := GetRidOfObsoleteColumns( S );
      
      if IsZero( S ) then
          
          SetIsRightRegularMatrix( M, true );
          
      fi;
      
      return S;
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{BasisOfRowsCoeff (ResidueClassRing)}}
\logpage{[ "F", 1, 7 ]}\nobreak
\hyperdef{L}{X78BC2E8E7A78CC82}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{BasisOfRowsCoeff({\slshape M, T})\index{BasisOfRowsCoeff@\texttt{BasisOfRowsCoeff}!ResidueClassRing}
\label{BasisOfRowsCoeff:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  BasisOfRowsCoeff :=
    function( M, T )
      local Mrel, TT, bas;
      
      Mrel := UnionOfRows( M );
      
      TT := HomalgVoidMatrix( HomalgRing( Mrel ) );
      
      bas := BasisOfRowsCoeff( Mrel, TT );
      
      SetEval( T, CertainColumns( TT, [ 1 .. NrRows( M ) ] ) );
      
      ResetFilterObj( T, IsVoidMatrix );
      
      ## FIXME: GetRidOfObsoleteRows and correct T
      return HomalgResidueClassMatrix( bas, HomalgRing( M ) );
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{BasisOfColumnsCoeff (ResidueClassRing)}}
\logpage{[ "F", 1, 8 ]}\nobreak
\hyperdef{L}{X7D2E9D797877FFBD}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{BasisOfColumnsCoeff({\slshape M, T})\index{BasisOfColumnsCoeff@\texttt{BasisOfColumnsCoeff}!ResidueClassRing}
\label{BasisOfColumnsCoeff:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  BasisOfColumnsCoeff :=
    function( M, T )
      local Mrel, TT, bas;
      
      Mrel := UnionOfColumns( M );
      
      TT := HomalgVoidMatrix( HomalgRing( Mrel ) );
      
      bas := BasisOfColumnsCoeff( Mrel, TT );
      
      SetEval( T, CertainRows( TT, [ 1 .. NrColumns( M ) ] ) );
      
      ResetFilterObj( T, IsVoidMatrix );
      
      ## FIXME: GetRidOfObsoleteColumns and correct T
      return HomalgResidueClassMatrix( bas, HomalgRing( M ) );
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{DecideZeroRowsEffectively (ResidueClassRing)}}
\logpage{[ "F", 1, 9 ]}\nobreak
\hyperdef{L}{X7F10DC697D2B828D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DecideZeroRowsEffectively({\slshape A, B, T})\index{DecideZeroRowsEffectively@\texttt{DecideZeroRowsEffectively}!ResidueClassRing}
\label{DecideZeroRowsEffectively:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  DecideZeroRowsEffectively :=
    function( A, B, T )
      local Brel, TT, red;
      
      Brel := UnionOfRows( B );
      
      TT := HomalgVoidMatrix( HomalgRing( Brel ) );
      
      red := DecideZeroRowsEffectively( Eval( A ), Brel, TT );
      
      SetEval( T, CertainColumns( TT, [ 1 .. NrRows( B ) ] ) );
      
      ResetFilterObj( T, IsVoidMatrix );
      
      return HomalgResidueClassMatrix( red, HomalgRing( A ) );
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{DecideZeroColumnsEffectively (ResidueClassRing)}}
\logpage{[ "F", 1, 10 ]}\nobreak
\hyperdef{L}{X7B68B9F27BC02520}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DecideZeroColumnsEffectively({\slshape A, B, T})\index{DecideZeroColumnsEffectively@\texttt{DecideZeroColumnsEffectively}!ResidueClassRing}
\label{DecideZeroColumnsEffectively:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  DecideZeroColumnsEffectively :=
    function( A, B, T )
      local Brel, TT, red;
      
      Brel := UnionOfColumns( B );
      
      TT := HomalgVoidMatrix( HomalgRing( Brel ) );
      
      red := DecideZeroColumnsEffectively( Eval( A ), Brel, TT );
      
      SetEval( T, CertainRows( TT, [ 1 .. NrColumns( B ) ] ) );
      
      ResetFilterObj( T, IsVoidMatrix );
      
      return HomalgResidueClassMatrix( red, HomalgRing( A ) );
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{RelativeSyzygiesGeneratorsOfRows (ResidueClassRing)}}
\logpage{[ "F", 1, 11 ]}\nobreak
\hyperdef{L}{X7DF62C5D7D2E6A6E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{RelativeSyzygiesGeneratorsOfRows({\slshape M, M2})\index{RelativeSyzygiesGeneratorsOfRows@\texttt{RelativeSyzygiesGeneratorsOfRows}!ResidueClassRing}
\label{RelativeSyzygiesGeneratorsOfRows:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  RelativeSyzygiesGeneratorsOfRows :=
    function( M, M2 )
      local M2rel, S;
      
      M2rel := UnionOfRows( M2 );
      
      S := SyzygiesGeneratorsOfRows( Eval( M ), M2rel );
      
      S := HomalgResidueClassMatrix( S, HomalgRing( M ) );
      
      S := GetRidOfObsoleteRows( S );
      
      if IsZero( S ) then
          
          SetIsLeftRegularMatrix( M, true );
          
      fi;
      
      return S;
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{RelativeSyzygiesGeneratorsOfColumns (ResidueClassRing)}}
\logpage{[ "F", 1, 12 ]}\nobreak
\hyperdef{L}{X852F9FD8837D97A5}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{RelativeSyzygiesGeneratorsOfColumns({\slshape M, M2})\index{RelativeSyzygiesGeneratorsOfColumns@\texttt{RelativeSyzygiesGeneratorsOfColumns}!ResidueClassRing}
\label{RelativeSyzygiesGeneratorsOfColumns:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  RelativeSyzygiesGeneratorsOfColumns :=
    function( M, M2 )
      local M2rel, S;
      
      M2rel := UnionOfColumns( M2 );
      
      S := SyzygiesGeneratorsOfColumns( Eval( M ), M2rel );
      
      S := HomalgResidueClassMatrix( S, HomalgRing( M ) );
      
      S := GetRidOfObsoleteColumns( S );
      
      if IsZero( S ) then
          
          SetIsRightRegularMatrix( M, true );
          
      fi;
      
      return S;
      
    end,
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{The Mandatory Tool Operations}}\label{ResidueClassRingForHomalg:ToolsNoFallBack}
\logpage{[ "F", 2, 0 ]}
\hyperdef{L}{X83E14F457ADC297D}{}
{
  Here we list those matrix operations for which \textsf{homalg} provides no fallback method. 

\subsection{\textcolor{Chapter }{ZeroMatrix (ResidueClassRing)}}
\logpage{[ "F", 2, 1 ]}\nobreak
\hyperdef{L}{X80393225841391E7}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ZeroMatrix({\slshape })\index{ZeroMatrix@\texttt{ZeroMatrix}!ResidueClassRing}
\label{ZeroMatrix:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 ($\to$ \texttt{ZeroMatrix} (\ref{ZeroMatrix:homalgTable entry for initial matrices}) and \texttt{ZeroMatrix} (\ref{ZeroMatrix:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  ZeroMatrix := C -> HomalgZeroMatrix(
                        NrRows( C ), NrColumns( C ), AmbientRing( HomalgRing( C ) ) ),
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IdentityMatrix (ResidueClassRing)}}
\logpage{[ "F", 2, 2 ]}\nobreak
\hyperdef{L}{X811B306C81435D87}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IdentityMatrix({\slshape })\index{IdentityMatrix@\texttt{IdentityMatrix}!ResidueClassRing}
\label{IdentityMatrix:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 ($\to$ \texttt{IdentityMatrix} (\ref{IdentityMatrix:homalgTable entry for initial identity matrices}) and \texttt{IdentityMatrix} (\ref{IdentityMatrix:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  IdentityMatrix := C -> HomalgIdentityMatrix(
          NrRows( C ), AmbientRing( HomalgRing( C ) ) ),
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Involution (ResidueClassRing)}}
\logpage{[ "F", 2, 3 ]}\nobreak
\hyperdef{L}{X7B322C637FC26E2D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Involution({\slshape })\index{Involution@\texttt{Involution}!ResidueClassRing}
\label{Involution:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 ($\to$ \texttt{Involution} (\ref{Involution:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  Involution :=
    function( M )
      local N, R;
      
      N := Involution( Eval( M ) );
      
      R := HomalgRing( N );
      
      if not ( HasIsCommutative( R ) and IsCommutative( R ) and
               HasIsReducedModuloRingRelations( M ) and
               IsReducedModuloRingRelations( M ) ) then
          
          ## reduce the matrix N w.r.t. the ring relations
          N := DecideZero( N, HomalgRing( M ) );
      fi;
      
      return N;
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{CertainRows (ResidueClassRing)}}
\logpage{[ "F", 2, 4 ]}\nobreak
\hyperdef{L}{X7C5B29A37B13A53D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CertainRows({\slshape })\index{CertainRows@\texttt{CertainRows}!ResidueClassRing}
\label{CertainRows:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 ($\to$ \texttt{CertainRows} (\ref{CertainRows:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  CertainRows :=
    function( M, plist )
      local N;
      
      N := CertainRows( Eval( M ), plist );
      
      if not ( HasIsReducedModuloRingRelations( M ) and
               IsReducedModuloRingRelations( M ) ) then
          
          ## reduce the matrix N w.r.t. the ring relations
          N := DecideZero( N, HomalgRing( M ) );
      fi;
      
      return N;
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{CertainColumns (ResidueClassRing)}}
\logpage{[ "F", 2, 5 ]}\nobreak
\hyperdef{L}{X84CBE51981BA2C77}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{CertainColumns({\slshape })\index{CertainColumns@\texttt{CertainColumns}!ResidueClassRing}
\label{CertainColumns:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 ($\to$ \texttt{CertainColumns} (\ref{CertainColumns:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  CertainColumns :=
    function( M, plist )
      local N;
      
      N := CertainColumns( Eval( M ), plist );
      
      if not ( HasIsReducedModuloRingRelations( M ) and
               IsReducedModuloRingRelations( M ) ) then
          
          ## reduce the matrix N w.r.t. the ring relations
          N := DecideZero( N, HomalgRing( M ) );
      fi;
      
      return N;
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{UnionOfRows (ResidueClassRing)}}
\logpage{[ "F", 2, 6 ]}\nobreak
\hyperdef{L}{X8510678E8569799E}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{UnionOfRows({\slshape })\index{UnionOfRows@\texttt{UnionOfRows}!ResidueClassRing}
\label{UnionOfRows:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 ($\to$ \texttt{UnionOfRows} (\ref{UnionOfRows:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  UnionOfRows :=
    function( A, B )
      local N;
      
      N := UnionOfRows( Eval( A ), Eval( B ) );
      
      if not ForAll( [ A, B ], HasIsReducedModuloRingRelations and
                 IsReducedModuloRingRelations ) then
          
          ## reduce the matrix N w.r.t. the ring relations
          N := DecideZero( N, HomalgRing( A ) );
      fi;
      
      return N;
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{UnionOfColumns (ResidueClassRing)}}
\logpage{[ "F", 2, 7 ]}\nobreak
\hyperdef{L}{X862F756A7FC0F0D4}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{UnionOfColumns({\slshape })\index{UnionOfColumns@\texttt{UnionOfColumns}!ResidueClassRing}
\label{UnionOfColumns:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 ($\to$ \texttt{UnionOfColumns} (\ref{UnionOfColumns:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  UnionOfColumns :=
    function( A, B )
      local N;
      
      N := UnionOfColumns( Eval( A ), Eval( B ) );
      
      if not ForAll( [ A, B ], HasIsReducedModuloRingRelations and
                 IsReducedModuloRingRelations ) then
          
          ## reduce the matrix N w.r.t. the ring relations
          N := DecideZero( N, HomalgRing( A ) );
      fi;
      
      return N;
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{DiagMat (ResidueClassRing)}}
\logpage{[ "F", 2, 8 ]}\nobreak
\hyperdef{L}{X802BEBF5790D4167}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{DiagMat({\slshape })\index{DiagMat@\texttt{DiagMat}!ResidueClassRing}
\label{DiagMat:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 ($\to$ \texttt{DiagMat} (\ref{DiagMat:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  DiagMat :=
    function( e )
      local N;
      
      N := DiagMat( List( e, Eval ) );
      
      if not ForAll( e, HasIsReducedModuloRingRelations and
                 IsReducedModuloRingRelations ) then
          
          ## reduce the matrix N w.r.t. the ring relations
          N := DecideZero( N, HomalgRing( e[1] ) );
      fi;
      
      return N;
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{KroneckerMat (ResidueClassRing)}}
\logpage{[ "F", 2, 9 ]}\nobreak
\hyperdef{L}{X85F1DDDB864AF265}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{KroneckerMat({\slshape })\index{KroneckerMat@\texttt{KroneckerMat}!ResidueClassRing}
\label{KroneckerMat:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 ($\to$ \texttt{KroneckerMat} (\ref{KroneckerMat:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  KroneckerMat :=
    function( A, B )
      local N;
      
      N := KroneckerMat( Eval( A ), Eval( B ) );
      
      if not ForAll( [ A, B ], HasIsReducedModuloRingRelations and
                 IsReducedModuloRingRelations ) then
          
          ## reduce the matrix N w.r.t. the ring relations
          N := DecideZero( N, HomalgRing( A ) );
      fi;
      
      return N;
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{MulMat (ResidueClassRing)}}
\logpage{[ "F", 2, 10 ]}\nobreak
\hyperdef{L}{X7A5D229384E9D19C}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{MulMat({\slshape })\index{MulMat@\texttt{MulMat}!ResidueClassRing}
\label{MulMat:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 ($\to$ \texttt{MulMat} (\ref{MulMat:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  MulMat :=
    function( a, A )
      
      return DecideZero( EvalRingElement( a ) * Eval( A ), HomalgRing( A ) );
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{AddMat (ResidueClassRing)}}
\logpage{[ "F", 2, 11 ]}\nobreak
\hyperdef{L}{X83E1AEC781AE1274}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{AddMat({\slshape })\index{AddMat@\texttt{AddMat}!ResidueClassRing}
\label{AddMat:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 ($\to$ \texttt{AddMat} (\ref{AddMat:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  AddMat :=
    function( A, B )
      
      return DecideZero( Eval( A ) + Eval( B ), HomalgRing( A ) );
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{SubMat (ResidueClassRing)}}
\logpage{[ "F", 2, 12 ]}\nobreak
\hyperdef{L}{X79A1C9297BE0C09A}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{SubMat({\slshape })\index{SubMat@\texttt{SubMat}!ResidueClassRing}
\label{SubMat:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 ($\to$ \texttt{SubMat} (\ref{SubMat:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  SubMat :=
    function( A, B )
      
      return DecideZero( Eval( A ) - Eval( B ), HomalgRing( A ) );
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Compose (ResidueClassRing)}}
\logpage{[ "F", 2, 13 ]}\nobreak
\hyperdef{L}{X875447A686949D59}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Compose({\slshape })\index{Compose@\texttt{Compose}!ResidueClassRing}
\label{Compose:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 ($\to$ \texttt{Compose} (\ref{Compose:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  Compose :=
    function( A, B )
      
      return DecideZero( Eval( A ) * Eval( B ), HomalgRing( A ) );
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsZeroMatrix (ResidueClassRing)}}
\logpage{[ "F", 2, 14 ]}\nobreak
\hyperdef{L}{X78D7BABE806B82FA}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsZeroMatrix({\slshape M})\index{IsZeroMatrix@\texttt{IsZeroMatrix}!ResidueClassRing}
\label{IsZeroMatrix:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 ($\to$ \texttt{IsZeroMatrix} (\ref{IsZeroMatrix:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  IsZeroMatrix := M -> IsZero( DecideZero( Eval( M ), HomalgRing( M ) ) ),
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{NrRows (ResidueClassRing)}}
\logpage{[ "F", 2, 15 ]}\nobreak
\hyperdef{L}{X78BBB7CE7D6C1CAD}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{NrRows({\slshape C})\index{NrRows@\texttt{NrRows}!ResidueClassRing}
\label{NrRows:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a nonnegative integer



 ($\to$ \texttt{NrRows} (\ref{NrRows:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  NrRows := C -> NrRows( Eval( C ) ),
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{NrColumns (ResidueClassRing)}}
\logpage{[ "F", 2, 16 ]}\nobreak
\hyperdef{L}{X7B5809EA8236F9F4}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{NrColumns({\slshape C})\index{NrColumns@\texttt{NrColumns}!ResidueClassRing}
\label{NrColumns:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a nonnegative integer



 ($\to$ \texttt{NrColumns} (\ref{NrColumns:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  NrColumns := C -> NrColumns( Eval( C ) ),
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Determinant (ResidueClassRing)}}
\logpage{[ "F", 2, 17 ]}\nobreak
\hyperdef{L}{X80831B287AB565BA}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{Determinant({\slshape C})\index{Determinant@\texttt{Determinant}!ResidueClassRing}
\label{Determinant:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
an element of ambient \textsf{homalg} ring



 ($\to$ \texttt{Determinant} (\ref{Determinant:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  Determinant := C -> DecideZero( Determinant( Eval( C ) ), HomalgRing( C ) ),
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Some of the Recommended Tool Operations}}\label{ResidueClassRingForHomalg:ToolsFallBack}
\logpage{[ "F", 3, 0 ]}
\hyperdef{L}{X7A537DB185A0F67C}{}
{
  Here we list those matrix operations for which \textsf{homalg} does provide a fallback method. But specifying the below \texttt{homalgTable} functions increases the performance by replacing the fallback method. 

\subsection{\textcolor{Chapter }{AreEqualMatrices (ResidueClassRing)}}
\logpage{[ "F", 3, 1 ]}\nobreak
\hyperdef{L}{X848EB509816E8A7D}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{AreEqualMatrices({\slshape A, B})\index{AreEqualMatrices@\texttt{AreEqualMatrices}!ResidueClassRing}
\label{AreEqualMatrices:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 ($\to$ \texttt{AreEqualMatrices} (\ref{AreEqualMatrices:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  AreEqualMatrices :=
    function( A, B )
      
      return IsZero( DecideZero( Eval( A ) - Eval( B ), HomalgRing( A ) ) );
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsIdentityMatrix (ResidueClassRing)}}
\logpage{[ "F", 3, 2 ]}\nobreak
\hyperdef{L}{X7F1E028C7BC66972}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsIdentityMatrix({\slshape M})\index{IsIdentityMatrix@\texttt{IsIdentityMatrix}!ResidueClassRing}
\label{IsIdentityMatrix:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 ($\to$ \texttt{IsIdentityMatrix} (\ref{IsIdentityMatrix:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  IsIdentityMatrix := M ->
            IsIdentityMatrix( DecideZero( Eval( M ), HomalgRing( M ) ) ),
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsDiagonalMatrix (ResidueClassRing)}}
\logpage{[ "F", 3, 3 ]}\nobreak
\hyperdef{L}{X87B8E7137DC97A71}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{IsDiagonalMatrix({\slshape M})\index{IsDiagonalMatrix@\texttt{IsDiagonalMatrix}!ResidueClassRing}
\label{IsDiagonalMatrix:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 ($\to$ \texttt{IsDiagonalMatrix} (\ref{IsDiagonalMatrix:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  IsDiagonalMatrix := M ->
            IsDiagonalMatrix( DecideZero( Eval( M ), HomalgRing( M ) ) ),
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{ZeroRows (ResidueClassRing)}}
\logpage{[ "F", 3, 4 ]}\nobreak
\hyperdef{L}{X7EFC928C7E59CEAE}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ZeroRows({\slshape C})\index{ZeroRows@\texttt{ZeroRows}!ResidueClassRing}
\label{ZeroRows:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 ($\to$ \texttt{ZeroRows} (\ref{ZeroRows:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  ZeroRows := C -> ZeroRows( DecideZero( Eval( C ), HomalgRing( C ) ) ),
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{ZeroColumns (ResidueClassRing)}}
\logpage{[ "F", 3, 5 ]}\nobreak
\hyperdef{L}{X7E78F7D6796C7016}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{ZeroColumns({\slshape C})\index{ZeroColumns@\texttt{ZeroColumns}!ResidueClassRing}
\label{ZeroColumns:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 ($\to$ \texttt{ZeroColumns} (\ref{ZeroColumns:homalgTable entry})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  ZeroColumns := C -> ZeroColumns( DecideZero( Eval( C ), HomalgRing( C ) ) ),
\end{Verbatim}
 }

 }

  }


\chapter{\textcolor{Chapter }{Debugging \textsf{homalg}}}\label{Debugging}
\logpage{[ "G", 0, 0 ]}
\hyperdef{L}{X7DC71AA679A8CB8D}{}
{
  Beside the \textsf{GAP} builtin debugging facilities ($\to$  (\textbf{Tutorial: Debugging})) \textsf{homalg} provides two ways to debug the computations. 
\section{\textcolor{Chapter }{Increase the assertion level}}\label{SetAssertionLevel}
\logpage{[ "G", 1, 0 ]}
\hyperdef{L}{X8062637283DD739D}{}
{
  \textsf{homalg} comes with numerous builtin assertion checks. They are activated if the user
increases the assertion level using \\
\\
 \texttt{SetAssertionLevel}( \mbox{\texttt{\slshape level}} ); \\
\\
 ($\to$  (\textbf{Reference: SetAssertionLevel})), where \mbox{\texttt{\slshape level}} is one of the values below: \begin{center}
\begin{tabular}{l|l}\mbox{\texttt{\slshape level}}&
description\\
\hline
&
\\
0&
no assertion checks whatsoever\\
&
\\
1&
``high''-level homological assertions are checked\\
&
\\
2&
``mid''-level homological assertions are checked\\
&
\\
3&
``low''-level homological assertions are checked\\
&
\\
4&
assertions about basic matrix operations are checked ($\to$ Appendix \ref{Basic_Operations})\\
&
(these are among the operations often delegated to external systems)\\
&
\\
\hline
\end{tabular}\\[2mm]
\end{center}

 In particular, if \textsf{homalg} delegates matrix operations to an external system then \texttt{SetAssertionLevel}( 4 ); can be used to let \textsf{homalg} debug the external system. \\
\\
 Below you can find the record of the available level-4 assertions, which is a \textsf{GAP}-component of every \textsf{homalg} ring. Each assertion can thus be overwritten by package developers or even
ordinary users. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  asserts :=
    rec(
        BasisOfRowsCoeff :=
          function( B, T, M ) return B = T * M; end,
        
        BasisOfColumnsCoeff :=
          function( B, M, T ) return B = M * T; end,
        
        DecideZeroRows_Effectively :=
          function( M, A, B ) return M = DecideZeroRows( A, B ); end,
        
        DecideZeroColumns_Effectively :=
          function( M, A, B ) return M = DecideZeroColumns( A, B ); end,
        
        DecideZeroRowsEffectively :=
          function( M, A, T, B ) return M = A + T * B; end,
        
        DecideZeroColumnsEffectively :=
          function( M, A, B, T ) return M = A + B * T; end,
        
        DecideZeroRowsWRTNonBasis :=
          function( B )
            local R;
            R := HomalgRing( B );
            if not ( HasIsBasisOfRowsMatrix( B ) and
                     IsBasisOfRowsMatrix( B ) ) and
               IsBound( R!.DecideZeroWRTNonBasis ) then
                if R!.DecideZeroWRTNonBasis = "warn" then
                    Info( InfoWarning, 1,
                          "about to reduce with respect to a matrix",
                          "with IsBasisOfRowsMatrix not set to true" );
                elif R!.DecideZeroWRTNonBasis = "error" then
                    Error( "about to reduce with respect to a matrix",
                           "with IsBasisOfRowsMatrix not set to true\n" );
                fi;
            fi;
          end,
        
        DecideZeroColumnsWRTNonBasis :=
          function( B )
            local R;
            R := HomalgRing( B );
            if not ( HasIsBasisOfColumnsMatrix( B ) and
                     IsBasisOfColumnsMatrix( B ) ) and
               IsBound( R!.DecideZeroWRTNonBasis ) then
                if R!.DecideZeroWRTNonBasis = "warn" then
                    Info( InfoWarning, 1,
                          "about to reduce with respect to a matrix",
                          "with IsBasisOfColumnsMatrix not set to true" );
                elif R!.DecideZeroWRTNonBasis = "error" then
                    Error( "about to reduce with respect to a matrix",
                           "with IsBasisOfColumnsMatrix not set to true\n" );
                fi;
            fi;
          end,
        
        ReducedBasisOfRowModule :=
          function( M, B )
            return GenerateSameRowModule( B, BasisOfRowModule( M ) );
          end,
        
        ReducedBasisOfColumnModule :=
          function( M, B )
            return GenerateSameColumnModule( B, BasisOfColumnModule( M ) );
          end,
        
        ReducedSyzygiesGeneratorsOfRows :=
          function( M, S )
            return GenerateSameRowModule( S, SyzygiesGeneratorsOfRows( M ) );
          end,
        
        ReducedSyzygiesGeneratorsOfColumns :=
          function( M, S )
            return GenerateSameColumnModule( S, SyzygiesGeneratorsOfColumns( M ) );
          end,
        
       );
\end{Verbatim}
 }

 
\section{\textcolor{Chapter }{Use \texttt{homalgMode}}}\label{use homalgMode}
\logpage{[ "G", 2, 0 ]}
\hyperdef{L}{X80B1C680873A124A}{}
{
  

\subsection{\textcolor{Chapter }{homalgMode}}
\logpage{[ "G", 2, 1 ]}\nobreak
\hyperdef{L}{X7D07F29F7EB515EE}{}
{\noindent\textcolor{FuncColor}{$\Diamond$\ \texttt{homalgMode({\slshape str[, str2]})\index{homalgMode@\texttt{homalgMode}}
\label{homalgMode}
}\hfill{\scriptsize (method)}}\\


 This function sets different modes which influence how much of the basic
matrix operations and the logical matrix methods become visible ($\to$ Appendices \ref{Basic_Operations}, \ref{Logic}). Handling the string \mbox{\texttt{\slshape str}} is \emph{not} case-sensitive. If a second string \mbox{\texttt{\slshape str2}} is given, then \texttt{homalgMode}( \mbox{\texttt{\slshape str2}} ) is invoked at the end. In case you let \textsf{homalg} delegate matrix operations to an external system the you might also want to
check \texttt{homalgIOMode} in the \textsf{HomalgToCAS} package manual. \begin{center}
\begin{tabular}{l|c|l}\mbox{\texttt{\slshape str}}&
\mbox{\texttt{\slshape str}} (long form)&
mode description\\
\hline
&
&
\\
""&
""&
the default mode, i.e. the computation protocol won't be visible\\
&
&
(\texttt{homalgMode}( ) is a short form for \texttt{homalgMode}( "" ))\\
&
&
\\
"b"&
"basic"&
make the basic matrix operations visible + \texttt{homalgMode}( "logic" )\\
&
&
\\
"d"&
"debug"&
same as "basic" but also makes \texttt{Row/ColumnReducedEchelonForm} visible\\
&
&
\\
"l"&
"logic"&
make the logical methods in \textsf{LIMAT} and \textsf{COLEM} visible\\
&
&
\\
\hline
\end{tabular}\\[2mm]
\end{center}

 All modes other than the "default"-mode only set their specific values and
leave the other values untouched, which allows combining them to some extent.
This also means that in order to get from one mode to a new mode (without the
aim to combine them) one needs to reset to the "default"-mode first. This can
be done using \texttt{homalgMode}( "", new{\textunderscore}mode ); 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallGlobalFunction( homalgMode,
    function( arg )
      local nargs, mode, s;
      
      nargs := Length( arg );
      
      if nargs = 0 or ( IsString( arg[1] ) and arg[1] = "" ) then
          mode := "default";
      elif IsString( arg[1] ) then	## now we know, the string is not empty
          s := arg[1];
          if LowercaseString( s{[1]} ) = "b" then
              mode := "basic";
          elif LowercaseString( s{[1]} ) = "d" then
              mode := "debug";
          elif LowercaseString( s{[1]} ) = "l" then
              mode := "logic";
          else
              mode := "";
          fi;
      else
          Error( "the first argument must be a string\n" );
      fi;
      
      if mode = "default" then
          HOMALG.color_display := false;
          SetInfoLevel( InfoCOLEM, 1 );
          SetInfoLevel( InfoLIMAT, 1 );
          SetInfoLevel( InfoHomalgBasicOperations, 1 );
      elif mode = "basic" then
          SetInfoLevel( InfoHomalgBasicOperations, 3 );
          homalgMode( "logic" );
      elif mode = "debug" then
          SetInfoLevel( InfoHomalgBasicOperations, 4 );
          homalgMode( "logic" );
      elif mode = "logic" then
          HOMALG.color_display := true;
          SetInfoLevel( InfoCOLEM, 2 );
          SetInfoLevel( InfoLIMAT, 2 );
      fi;
      
      if nargs > 1 and IsString( arg[2] ) then
          homalgMode( arg[2] );
      fi;
      
  end );
\end{Verbatim}
 }

 }

  }


\chapter{\textcolor{Chapter }{The Core Packages and the Idea behind their Splitting}}\label{homalg-Project}
\logpage{[ "H", 0, 0 ]}
\hyperdef{L}{X849691F37C7AC1B4}{}
{
  I will try to explain the idea behind splitting the 5 \emph{core packages}: 
\begin{enumerate}
\item \textsf{homalg}
\item \textsf{HomalgToCAS}
\item \textsf{IO{\textunderscore}ForHomalg}
\item \textsf{RingsForHomalg}
\item \textsf{ExamplesForHomalg}
\end{enumerate}
 
\section{\textcolor{Chapter }{The 5=1+4 split}}\label{5=1+4}
\logpage{[ "H", 1, 0 ]}
\hyperdef{L}{X7AED759D7A410F98}{}
{
  The following is an attempt to explain the 5=1+4 split. 
\subsection{\textcolor{Chapter }{Logically independent}}\label{homalg-independent}
\logpage{[ "H", 1, 1 ]}
\hyperdef{L}{X818F306582DFF370}{}
{
  The package \textsf{homalg} is logically independent from all other packages in the project. And among the
5 core packages it is the only package that has to do with mathematics. The
remaining four packages are of technical nature. More precisely, \textsf{homalg} is a stand alone package, that offers abstract homological constructions for
any computable ring. But since the ring of integers (at least up till now) is
the only ring which for the purposes of homological algebra is \emph{sufficiently supported} in \textsf{GAP} ($\to$ \ref{SufficientSupport}), \textsf{homalg} can put the above mentioned abstract constructions into action only for the
ring of integers and by generic (but of course non-efficient) methods for any
of its residue class rings (Simon G{\"o}rtzen's package \textsf{Gauss} adds the missing sufficient support for ${\ensuremath{\mathbb Z}}/p^n$ and ${\ensuremath{\mathbb Q}}$ to \textsf{GAP} and his other package \textsf{GaussForHomalg} makes this support visible to \textsf{homalg}). }

 
\subsection{\textcolor{Chapter }{Black boxes}}\label{black boxes}
\logpage{[ "H", 1, 2 ]}
\hyperdef{L}{X7EE794358500309A}{}
{
  The package \textsf{homalg} uses rings and matrices over these rings as a black box, enabling other
packages to ``abuse'' \textsf{homalg} to compute over rings other than the ring of integers by simply providing the
appropriate black boxes. And whether these rings and matrices are inside or
outside \textsf{GAP} is not at all the concern of \textsf{homalg}. Even the \textsf{GAP} representation for external rings, external ring elements, and external
matrices are declared in the package \textsf{HomalgToCAS} and not in homalg. }

 
\subsection{\textcolor{Chapter }{Summing up}}\label{summing up}
\logpage{[ "H", 1, 3 ]}
\hyperdef{L}{X786DDEFD85AD19F4}{}
{
  One of the main concepts of the \textsf{homalg} project is that high level and low level computations in homological algebra
can and \emph{should} be separated. So splitting \textsf{homalg} from the remaining 4 core packages is just emphasizing this concept. Moreover, \textsf{homalg} is up till now by far the biggest package in the project and will probably
keep growing by supporting more basic homological constructions, whereas the
other 4 packages will remain stable over longer time intervals. }

 }

 
\section{\textcolor{Chapter }{The 4=1+1+1+1 split}}\label{4=1+1+1+1}
\logpage{[ "H", 2, 0 ]}
\hyperdef{L}{X7B49B460794C8490}{}
{
  The following is meant to justify the remaining 4=1+1+1+1 split. 
\subsection{\textcolor{Chapter }{\textsf{HomalgToCAS}}}\label{HomalgToCAS}
\logpage{[ "H", 2, 1 ]}
\hyperdef{L}{X80FB5BB57BBE5B17}{}
{
  The package \textsf{HomalgToCAS} (which needs the \textsf{homalg} package) includes all what is needed to let the black boxes used by \textsf{homalg} reside in external computer algebra systems. So as mentioned above, \textsf{HomalgToCAS} is the right place to declare the three \textsf{GAP} representations external rings, external ring elements, and external matrices.
Still, \textsf{HomalgToCAS} is independent from the external computer algebra system with which \textsf{GAP} will communicate \emph{and} independent of how this communication physically looks like. }

 
\subsection{\textcolor{Chapter }{\textsf{IO{\textunderscore}ForHomalg} and Alternatives}}\label{IO_ForHomalg}
\logpage{[ "H", 2, 2 ]}
\hyperdef{L}{X86F316DA837A4FE4}{}
{
  The package \textsf{IO{\textunderscore}ForHomalg} (which needs \textsf{HomalgToCAS}) allows \textsf{GAP} to communicate via I/O-streams with computer algebra systems that come with a
terminal interface. \textsf{IO{\textunderscore}ForHomalg} uses Max Neunh{\"o}ffer's \textsf{IO} package, yet it is independent from the specific computer algebra system, as
long as the latter provides a terminal interface. Splitting \textsf{IO{\textunderscore}ForHomalg} from \textsf{HomalgToCAS} gives the freedom to replace the former by another package that lets \textsf{GAP} communicate with an external system using a different technology. So making \textsf{IO{\textunderscore}ForHomalg} a package of its own makes it clear for developers of a new communication
method which package of the \textsf{homalg} project has to be imitated/replaced. To be concrete, Thomas B{\"a}chler wrote
a package called \textsf{MapleForHomalg} that enables \textsf{GAP} to communicate with \textsf{Maple} without the need for a terminal interface, as, for example, such an interface
is missing from recent versions of \textsf{Maple} on MAC OS X starting from \textsf{Maple} 10. }

 
\subsection{\textcolor{Chapter }{\textsf{RingsForHomalg}}}\label{RingsForHomalg}
\logpage{[ "H", 2, 3 ]}
\hyperdef{L}{X78E3E28C81E8DC12}{}
{
  The package \textsf{RingsForHomalg} (which needs \textsf{HomalgToCAS}) provides the details of the black boxes \textsf{homalg} relies on. The details of the black boxes of course depend on the external
computer algebra system (\textsf{Singular}, \textsf{MAGMA}, \textsf{Macaulay2}, \textsf{Maple}, \textsf{Sage}, ...), but are independent from the way the communication takes place. So it
can be used either with \textsf{IO{\textunderscore}ForHomalg}, with \textsf{MapleForHomalg}, or with any future communication package. }

 
\subsection{\textcolor{Chapter }{Your own \textsf{RingsForHomalg}}}\label{RingsForHomalg alternatives}
\logpage{[ "H", 2, 4 ]}
\hyperdef{L}{X7AD8DBE280C58EE9}{}
{
  If someone needs to support a ring in some computer algebra system that \textsf{GAP} can already communicate with, but where the ring is not supported by \textsf{RingsForHomalg} yet, she or he needs to imitate/replace \textsf{RingsForHomalg} (as Simon G{\"o}rtzen did with his \textsf{GaussForHomalg}, where the computer algebra system was \textsf{GAP} itself, extended by his package \textsf{Gauss}). Any substitute for \textsf{RingsForHomalg} -- as it only needs \textsf{HomalgToCAS} -- will again be independent from the way how \textsf{GAP} communicates with the computer algebra system that hosts the ring. This should
encourage people to link more external systems to \textsf{homalg} without being forced to join the development of the package \textsf{RingsForHomalg}. They can simply write their own package and get the full credit for it. }

 
\subsection{\textcolor{Chapter }{\textsf{ExamplesForHomalg}}}\label{ExamplesForHomalg}
\logpage{[ "H", 2, 5 ]}
\hyperdef{L}{X7A0A10B585C49632}{}
{
  The package \textsf{ExamplesForHomalg} (which needs \textsf{RingsForHomalg}) contains example scripts over various rings that are written in a universal
way, i.e. independent from the system that hosts the rings. These examples
cannot be part of the \textsf{homalg} package as they are defined over rings that \textsf{GAP} does not support. The package \textsf{ExamplesForHomalg} is meant to be the package where anyone can contribute interesting examples
using \textsf{homalg} without necessarily contributing to the code of any of the remaining core
packages. }

 
\subsection{\textcolor{Chapter }{Documentation}}\label{Documentation}
\logpage{[ "H", 2, 6 ]}
\hyperdef{L}{X7F4F8D6F7CD6B765}{}
{
  Splitting the core packages is part of documenting the project. The complete
manuals of the \textsf{homalg} and \textsf{ExamplesForHomalg} packages (maybe apart from the appendices) can then be free from any
non-mathematical technicalities the average user is not interested in. A
documentation of the three packages \textsf{HomalgToCAS}, \textsf{IO{\textunderscore}ForHomalg}, and \textsf{RingsForHomalg} will be rather technical and of interest mainly for developers. }

 
\subsection{\textcolor{Chapter }{Crediting}}\label{Crediting}
\logpage{[ "H", 2, 7 ]}
\hyperdef{L}{X814A1DC581E36F66}{}
{
  Everyone is encouraged to contribute to the \textsf{homalg} project. The project follows the philosophy of avoiding huge monolithic
packages and splitting unrelated tasks. This should enable contributers to
write their own packages (building on other existing packages) and getting the
full credit for their work, which can then be easily distinguished from the
work of others. }

 
\subsection{\textcolor{Chapter }{Stability}}\label{Stability}
\logpage{[ "H", 2, 8 ]}
\hyperdef{L}{X78397E8681145827}{}
{
  A huge monolithic package can never stabilize, even though parts of it will
stay frozen for a long period of time. The splitting makes it likely that
parts of the project together with their documentation quickly reach a stable
state. }

 }

  }


\chapter{\textcolor{Chapter }{Overview of the \textsf{homalg} Package Source Code}}\label{FileOverview}
\logpage{[ "I", 0, 0 ]}
\hyperdef{L}{X84555A0687FBAE33}{}
{
  The \textsf{homalg} package reached more than 50.000 lines of \textsf{GAP4} code (excluding the documentation) before the first release was made. To keep
this amount of code tracebale, the package was split in several files. 
\section{\textcolor{Chapter }{Rings, Ring Maps, Matrices, Relations, and Generators}}\label{ModuleInternals}
\logpage{[ "I", 1, 0 ]}
\hyperdef{L}{X81FBD52187762933}{}
{
  \begin{center}
\begin{tabular}{l|l}Filename \texttt{.gd}/\texttt{.gi}&
Content\\
\hline
\texttt{homalg}&
definitions of the basic \textsf{GAP4} categories\\
&
and some tool functions (e.g. \texttt{homalgMode})\\
&
\\
\texttt{homalgTable}&
dictionaries between \textsf{homalg}\\
&
and the computing engines\\
\texttt{HomalgRing}&
internal and external rings\\
&
\\
\texttt{HomalgRingMap}&
ring maps\\
&
\\
\texttt{HomalgMatrix}&
internal and external matrices\\
&
\\
\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{[ "I", 2, 0 ]}
\hyperdef{L}{X81DDCFC578069518}{}
{
  \begin{center}
\begin{tabular}{l|l}Filename \texttt{.gd}/\texttt{.gi}&
Content\\
\hline
\texttt{HomalgModule}&
modules and submodules allowing several\\
&
presentations linked with transition matrices\\
&
\\
\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{HomalgFunctor}&
constructors of (multi) functors of\\
&
module categories (yet over the same ring),\\
&
left derivation of covariant functors,\\
&
right derivation of contravariant functors,\\
&
left satellites of covariant functors,\\
&
right satellites of contravariant functors,\\
&
and composition of functors\\
&
\\
\texttt{HomalgDiagram}&
Betti diagrams\\
\end{tabular}\\[2mm]
\textbf{Table: }\emph{The \textsf{homalg} package files (continued)}\end{center}

 }

 
\section{\textcolor{Chapter }{The Low Level Algorithms}}\label{Low Level Algorithms}
\logpage{[ "I", 3, 0 ]}
\hyperdef{L}{X7C4917CE80359953}{}
{
  In the following CAS or CASystem mean computer algebra systems. \begin{center}
\begin{tabular}{l|l}Filename \texttt{.gd}/\texttt{.gi}&
Content\\
\hline
\texttt{Tools}&
the elementary matrix operations that can be\\
&
overwritten using the homalgTable\\
&
(and hence delegable even to other CASystems)\\
&
\\
\texttt{Service}&
the three operations: basis, reduction, and syzygies;\\
&
they can also be overwritten using the homalgTable\\
&
(and hence delegable even to other CASystems)\\
&
\\
\texttt{Basic}&
higher level operations for matrices\\
&
(cannot be overwritten using the homalgTable)\\
\end{tabular}\\[2mm]
\textbf{Table: }\emph{The \textsf{homalg} package files (continued)}\end{center}

 }

 
\section{\textcolor{Chapter }{The High Level Algorithms}}\label{Hight Level Algorithms}
\logpage{[ "I", 4, 0 ]}
\hyperdef{L}{X7C5E35877E431ED6}{}
{
  \begin{center}
\begin{tabular}{l|l}Filename \texttt{.gd}/\texttt{.gi}&
Content\\
\hline
\texttt{Modules}&
subfactors, resolutions, syzygy modules,\\
&
parameterizations, intersections, annihilators\\
&
\\
\texttt{Maps}&
resolutions, (co)kernel sequences\\
&
\\
\texttt{Complexes}&
(co)homology, horse shoe lemma, connecting\\
&
homomorphisms, Cartan-Eilenberg resolution\\
&
\\
\texttt{ChainMaps}&
(co)homology\\
&
\\
\texttt{SpectralSequences}&
Grothendieck bicomplexes associated to two\\
&
composable functors, spectral sequences\\
&
of bicomplexes, Grothendieck spectral sequences\\
\texttt{Filtrations}&
spectral filtrations, i.e. filtrations induced\\
&
by spectral sequences of bicomplexes,\\
&
purity filtration\\
&
\\
\texttt{ToolFunctors}&
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}&
torsion submodule, torsion free factor,\\
&
direct sum, pullback, pushout, Auslander dual\\
\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{[ "I", 5, 0 ]}
\hyperdef{L}{X7E8463067BB2F31E}{}
{
  \begin{center}
\begin{tabular}{l|l}Filename \texttt{.gd}/\texttt{.gi}&
Content\\
\hline
\texttt{LIRNG}&
logical implications for rings\\
&
\\
\texttt{LIMAP}&
logical implications for ring maps\\
&
\\
\texttt{LIMAT}&
logical implications for matrices\\
&
\\
\texttt{COLEM}&
clever operations for lazy evaluated matrices\\
&
\\
\texttt{LIMOD}&
logical implications for modules\\
&
\\
\texttt{LIMOR}&
logical implications for morphisms\\
&
\\
\texttt{LICPX}&
logical implications for complexes\\
&
\\
\end{tabular}\\[2mm]
\textbf{Table: }\emph{The \textsf{homalg} package files (continued)}\end{center}

 }

 
\section{\textcolor{Chapter }{The subpackage \textsf{ResidueClassRingForHomalg}}}\label{ResidueClassRingForHomalg_subpackage}
\logpage{[ "I", 6, 0 ]}
\hyperdef{L}{X85A3964E7A98C065}{}
{
  \begin{center}
\begin{tabular}{l|l}Filename \texttt{.gd}/\texttt{.gi}&
Content\\
\hline
\texttt{ResidueClassRingForHomalg}&
some global variables\\
&
\\
\texttt{ResidueClassRing}&
residue class rings, their elements, and matrices,\\
&
together with their constructors and operations\\
&
\\
\texttt{ResidueClassRingTools}&
the elementary matrix operations for matrices\\
&
over residue class rings\\
&
\\
\texttt{ResidueClassRingBasic}&
the three operations: basis, reduction, and syzygies\\
&
for matrices over residue class rings\\
&
\\
\end{tabular}\\[2mm]
\textbf{Table: }\emph{The \textsf{homalg} package files (continued)}\end{center}

 }

 
\section{\textcolor{Chapter }{The homalgTable for \textsf{GAP4} built-in rings}}\label{The built-in rings}
\logpage{[ "I", 7, 0 ]}
\hyperdef{L}{X860DCFF383750919}{}
{
  For the purposes of \textsf{homalg}, the ring of integers is, at least up till now, the only ring which is
properly supported in \textsf{GAP4}. The \textsf{GAP4} built-in cababilities for polynomial rings (also univariate) and group rings
do not statisfy the minimum requirements of \textsf{homalg}. The \textsf{GAP4} package \textsf{Gauss} enables \textsf{GAP} to fullfil the \textsf{homalg} requirements for prime fields, and ${\ensuremath{\mathbb Z}} / p^n$. \begin{center}
\begin{tabular}{l|l}Filename .gi&
Content\\
\hline
\texttt{Integers}&
the homalgTable for the ring of integers\\
\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{homalgBib.xml}

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


\printindex

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