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

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

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

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


\usepackage{fancyvrb}

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


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

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

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

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

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

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





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


\begin{document}

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

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

\hypersetup{pdftitle=\textsf{MatricesForHomalg}}
\markright{\scriptsize \mbox{}\hfill \textsf{MatricesForHomalg} \hfill\mbox{}}
{\Huge \textbf{Matrices for the \textsf{homalg} project\mbox{}}}\\
\vfill

{\Huge Version 2015.02.03\mbox{}}\\[1cm]
{February 2015\mbox{}}\\[1cm]
\mbox{}\\[2cm]
{\Large \textbf{Mohamed Barakat\\
    \mbox{}}}\\
{\Large \textbf{Markus Lange-Hegermann\\
    \mbox{}}}\\
{\Large \textbf{Vinay Wagh\\
    \mbox{}}}\\
\hypersetup{pdfauthor=Mohamed Barakat\\
    ; Markus Lange-Hegermann\\
    ; Vinay Wagh\\
    }
\mbox{}\\[2cm]
\begin{minipage}{12cm}\noindent
(\emph{this manual is still under construction}) \\
\\
 This manual is best viewed as an \textsc{HTML} document. The latest version is available \textsc{online} at: \\
\\
 \href{http://homalg.math.rwth-aachen.de/~barakat/homalg-project/MatricesForHomalg/chap0.html} {\texttt{http://homalg.math.rwth-aachen.de/\texttt{\symbol{126}}barakat/homalg-project/MatricesForHomalg/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/matricesforhomalg} {\texttt{http://homalg.math.rwth-aachen.de/index.php/core-packages/matricesforhomalg}} \end{minipage}

\end{center}\vfill

\mbox{}\\
{\mbox{}\\
\small \noindent \textbf{Mohamed Barakat\\
    }  Email: \href{mailto://barakat@mathematik.uni-kl.de} {\texttt{barakat@mathematik.uni-kl.de}}\\
  Homepage: \href{http://www.mathematik.uni-kl.de/~barakat/} {\texttt{http://www.mathematik.uni-kl.de/\texttt{\symbol{126}}barakat/}}\\
  Address: \begin{minipage}[t]{8cm}\noindent
 Department of Mathematics, \\
 University of Kaiserslautern, \\
 67653 Kaiserslautern, \\
 Germany \end{minipage}
}\\
{\mbox{}\\
\small \noindent \textbf{Markus Lange-Hegermann\\
    }  Email: \href{mailto://markus.lange.hegermann@rwth-aachen.de} {\texttt{markus.lange.hegermann@rwth-aachen.de}}\\
  Homepage: \href{http://wwwb.math.rwth-aachen.de/~markus/} {\texttt{http://wwwb.math.rwth-aachen.de/\texttt{\symbol{126}}markus/}}\\
  Address: \begin{minipage}[t]{8cm}\noindent
 Lehrstuhl B f{\"u}r Mathematik, RWTH Aachen, Templergraben 64, 52056 Aachen,
Germany \end{minipage}
}\\
{\mbox{}\\
\small \noindent \textbf{Vinay Wagh\\
    }  Email: \href{mailto://waghoba@gmail.com} {\texttt{waghoba@gmail.com}}\\
  Homepage: \href{http://www.iitg.ernet.in/vinay.wagh/} {\texttt{http://www.iitg.ernet.in/vinay.wagh/}}\\
  Address: \begin{minipage}[t]{8cm}\noindent
 E-102, Department of Mathematics, \\
 Indian Institute of Technology Guwahati, \\
 Guwahati, Assam, India. \\
 PIN: 781 039. \end{minipage}
}\\
\end{titlepage}

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

 This package may be distributed under the terms and conditions of the GNU
Public License Version 2. \mbox{}}\\[1cm]
\newpage

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

\tableofcontents
\newpage

 \index{\textsf{MatricesForHomalg}}   
\chapter{\textcolor{Chapter }{Introduction}}\label{intro}
\logpage{[ 1, 0, 0 ]}
\hyperdef{L}{X7DFB63A97E67C0A1}{}
{
  
\section{\textcolor{Chapter }{What is the role of the \textsf{MatricesForHomalg} package in the \textsf{homalg} project?}}\label{MatricesForHomalg_role}
\logpage{[ 1, 1, 0 ]}
\hyperdef{L}{X786E559C82E21A50}{}
{
  
\subsection{\textcolor{Chapter }{\textsf{MatricesForHomalg} provides ...}}\label{MatricesForHomalg-provides}
\logpage{[ 1, 1, 1 ]}
\hyperdef{L}{X81CE78C983E09E4F}{}
{
  The package \textsf{MatricesForHomalg} provides: 
\begin{itemize}
\item rings
\item ring elements
\item ring maps
\item matrices
\end{itemize}
 }

 
\subsection{\textcolor{Chapter }{\textsf{homalg} delegates ...}}\label{homalg-delegates}
\logpage{[ 1, 1, 2 ]}
\hyperdef{L}{X814D19E17EDA68B4}{}
{
  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} 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$. The above is of course also valid for the column convention.  }

 
\subsection{\textcolor{Chapter }{The black box concept}}\label{black box}
\logpage{[ 1, 1, 3 ]}
\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}
  }

 }

 
\section{\textcolor{Chapter }{This manual}}\label{overview}
\logpage{[ 1, 2, 0 ]}
\hyperdef{L}{X78DD800B83ABC621}{}
{
  Chapter \ref{install} describes the installation of this package. The remaining chapters are each
devoted to one of the \textsf{MatricesForHomalg} objects ($\to$ \ref{MatricesForHomalg-provides}) with its constructors, properties, attributes, and operations.  }

  }

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

 By default the \textsf{MatricesForHomalg} package is not automatically loaded by \textsf{GAP} when it is installed. You must load the package with \\
\\
 \texttt{LoadPackage}( "MatricesForHomalg" ); \\
\\
 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 }{Rings}}\label{Rings}
\logpage{[ 3, 0, 0 ]}
\hyperdef{L}{X81897F6082CACB59}{}
{
  
\section{\textcolor{Chapter }{Rings: Category and Representations}}\label{Rings:Category}
\logpage{[ 3, 1, 0 ]}
\hyperdef{L}{X8252B2F483D80E41}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgRing}}
\logpage{[ 3, 1, 1 ]}\nobreak
\hyperdef{L}{X85E217C67DD633AB}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgRing({\mdseries\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} categories \texttt{IsStructureObject} and \texttt{IsHomalgRingOrModule}.) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  DeclareCategory( "IsHomalgRing",
          IsStructureObject and
          IsRingWithOne and
          IsHomalgRingOrModule );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsPreHomalgRing}}
\logpage{[ 3, 1, 2 ]}\nobreak
\hyperdef{L}{X81DC249883163C01}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsPreHomalgRing({\mdseries\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. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  DeclareCategory( "IsPreHomalgRing",
          IsHomalgRing );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsHomalgRingElement}}
\logpage{[ 3, 1, 3 ]}\nobreak
\hyperdef{L}{X80A410ED8500DA7E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgRingElement({\mdseries\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. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  DeclareCategory( "IsHomalgRingElement",
          IsExtAElement and
          IsExtLElement and
          IsExtRElement and
          IsAdditiveElementWithInverse and
          IsMultiplicativeElementWithInverse and
          IsAssociativeElement and
          IsAdditivelyCommutativeElement and
          ## all the above guarantees IsHomalgRingElement => IsRingElement (in GAP4)
          IsAttributeStoringRep );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsHomalgInternalRingRep}}
\logpage{[ 3, 1, 4 ]}\nobreak
\hyperdef{L}{X8097E89E7B6EF731}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgInternalRingRep({\mdseries\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{[ 3, 2, 0 ]}
\hyperdef{L}{X7C7962B97E6CDFE2}{}
{
  This section describes how to construct rings for use with \textsf{MatricesForHomalg}, 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{MatricesForHomalg} 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{MatricesForHomalg} 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{[ 3, 2, 1 ]}\nobreak
\hyperdef{L}{X78AC74CB802A8A49}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgRingOfIntegers({\mdseries\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}{$\triangleright$\ \ \texttt{HomalgRingOfIntegers({\mdseries\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{\mdseries\slshape c}} and returns the ring ${\ensuremath{\mathbb Z}} / c $ for \textsf{homalg}: 
\begin{itemize}
\item \mbox{\texttt{\mdseries\slshape c}}$ = 0$ defaults to ${\ensuremath{\mathbb Z}}$
\item if \mbox{\texttt{\mdseries\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{\mdseries\slshape c}}; 

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

 

\subsection{\textcolor{Chapter }{HomalgFieldOfRationals (constructor for the field of rationals)}}
\logpage{[ 3, 2, 2 ]}\nobreak
\hyperdef{L}{X7F4829D6808187B3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgFieldOfRationals({\mdseries\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{[ 3, 2, 3 ]}\nobreak
\hyperdef{L}{X85D9DDE384304BAB}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{\texttt{\symbol{92}}/({\mdseries\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{\mdseries\slshape R}} $/ I$, where \mbox{\texttt{\mdseries\slshape R}} is a \textsf{homalg} ring and $I=$\mbox{\texttt{\mdseries\slshape ring{\textunderscore}rel}} is the ideal of relations generated by \mbox{\texttt{\mdseries\slshape ring{\textunderscore}rel}}. \mbox{\texttt{\mdseries\slshape ring{\textunderscore}rel}} might be: 
\begin{itemize}
\item a set of ring relations of a left resp. right ideal
\item a list of ring elements of \mbox{\texttt{\mdseries\slshape R}}
\item a ring element of \mbox{\texttt{\mdseries\slshape R}}
\end{itemize}
 For noncommutative rings: In the first case the set of ring relations should
generate the ideal of relations $I$ as left resp. right ideal, and their involutions should generate $I$ as right resp. left ideal. If \mbox{\texttt{\mdseries\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}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@Display( ZZ );|
  <An internal ring>
  !gapprompt@gap>| !gapinput@Z256 := ZZ / 2^8;|
  Z/( 256 )
  !gapprompt@gap>| !gapinput@Display( Z256 );|
  <A residue class ring>
  !gapprompt@gap>| !gapinput@Z2 := Z256 / 6;|
  Z/( 256, 6 )
  !gapprompt@gap>| !gapinput@BasisOfRows( MatrixOfRelations( Z2 ) );|
  <An unevaluated non-zero 1 x 1 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@Z2;|
  Z/( 2 )
  !gapprompt@gap>| !gapinput@Display( Z2 );|
  <A residue class ring>
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{Rings: Properties}}\label{Rings:Properties}
\logpage{[ 3, 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{\mdseries\slshape R}}, then 

 \texttt{Prop}( \mbox{\texttt{\mdseries\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{\mdseries\slshape R}} ); 

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

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

 or 

 \texttt{SetProp}( \mbox{\texttt{\mdseries\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 }{IsZero (for rings)}}
\logpage{[ 3, 3, 1 ]}\nobreak
\hyperdef{L}{X7C48437187E668F3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsZero({\mdseries\slshape R})\index{IsZero@\texttt{IsZero}!for rings}
\label{IsZero:for rings}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the ring \mbox{\texttt{\mdseries\slshape R}} is a zero, i.e., if \texttt{One}$($\mbox{\texttt{\mdseries\slshape R}}$)=$\texttt{Zero}$($\mbox{\texttt{\mdseries\slshape R}}$)$. }

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

\subsection{\textcolor{Chapter }{IsArtinian (for rings)}}
\logpage{[ 3, 3, 38 ]}\nobreak
\hyperdef{L}{X7AF81F6383F5CFCA}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsArtinian({\mdseries\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{\mdseries\slshape R}} is a ring for \textsf{homalg}. }

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

\subsection{\textcolor{Chapter }{BasisAlgorithmRespectsPrincipalIdeals}}
\logpage{[ 3, 3, 54 ]}\nobreak
\hyperdef{L}{X803259617B5F89AE}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{BasisAlgorithmRespectsPrincipalIdeals({\mdseries\slshape R})\index{BasisAlgorithmRespectsPrincipalIdeals@\texttt{Basis}\-\texttt{Algorithm}\-\texttt{Respects}\-\texttt{Principal}\-\texttt{Ideals}}
\label{BasisAlgorithmRespectsPrincipalIdeals}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



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

 

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



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

 

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



 Check if the ring element \mbox{\texttt{\mdseries\slshape r}} is the additive inverse of one. }

 

\subsection{\textcolor{Chapter }{IsMonic (for homalg ring elements)}}
\logpage{[ 3, 3, 57 ]}\nobreak
\hyperdef{L}{X7A0A3A927BE3F352}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsMonic({\mdseries\slshape r})\index{IsMonic@\texttt{IsMonic}!for homalg ring elements}
\label{IsMonic:for homalg ring elements}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} ring element \mbox{\texttt{\mdseries\slshape r}} is monic. }

 

\subsection{\textcolor{Chapter }{IsMonicUptoUnit (for homalg ring elements)}}
\logpage{[ 3, 3, 58 ]}\nobreak
\hyperdef{L}{X785EF83B8054D2FF}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsMonicUptoUnit({\mdseries\slshape r})\index{IsMonicUptoUnit@\texttt{IsMonicUptoUnit}!for homalg ring elements}
\label{IsMonicUptoUnit:for homalg ring elements}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if leading coefficient of the \textsf{homalg} ring element \mbox{\texttt{\mdseries\slshape r}} is a unit. }

 

\subsection{\textcolor{Chapter }{IsLeftRegular (for homalg ring elements)}}
\logpage{[ 3, 3, 59 ]}\nobreak
\hyperdef{L}{X811A01D5803ADCA3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsLeftRegular({\mdseries\slshape r})\index{IsLeftRegular@\texttt{IsLeftRegular}!for homalg ring elements}
\label{IsLeftRegular:for homalg ring elements}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} ring element \mbox{\texttt{\mdseries\slshape r}} is left regular. }

 

\subsection{\textcolor{Chapter }{IsRightRegular (for homalg ring elements)}}
\logpage{[ 3, 3, 60 ]}\nobreak
\hyperdef{L}{X7E99731F83A41777}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsRightRegular({\mdseries\slshape r})\index{IsRightRegular@\texttt{IsRightRegular}!for homalg ring elements}
\label{IsRightRegular:for homalg ring elements}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} ring element \mbox{\texttt{\mdseries\slshape r}} is right regular. }

 

\subsection{\textcolor{Chapter }{IsRegular (for homalg ring elements)}}
\logpage{[ 3, 3, 61 ]}\nobreak
\hyperdef{L}{X80A3294C834D8F21}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsRegular({\mdseries\slshape r})\index{IsRegular@\texttt{IsRegular}!for homalg ring elements}
\label{IsRegular:for homalg ring elements}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 Check if the \textsf{homalg} ring element \mbox{\texttt{\mdseries\slshape r}} is regular, i.e. left and right regular. }

 }

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

\subsection{\textcolor{Chapter }{Inverse (for homalg ring elements)}}
\logpage{[ 3, 4, 1 ]}\nobreak
\hyperdef{L}{X8066502785A109B8}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Inverse({\mdseries\slshape r})\index{Inverse@\texttt{Inverse}!for homalg ring elements}
\label{Inverse:for homalg ring elements}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring element or fail



 The inverse of the \textsf{homalg} ring element \mbox{\texttt{\mdseries\slshape r}}. 
\begin{Verbatim}[commandchars=!@A,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>A !gapinput@ZZ := HomalgRingOfIntegers( );;A
  !gapprompt@gap>A !gapinput@R := ZZ / 2^8;A
  Z/( 256 )
  !gapprompt@gap>A !gapinput@r := (1/3*One(R)+1/5)+3/7;A
  |[ 157 ]|
  !gapprompt@gap>A !gapinput@1 / r;	## = r^-1;A
  |[ 181 ]|
  !gapprompt@gap>A !gapinput@s := (1/3*One(R)+2/5)+3/7;A
  |[ 106 ]|
  !gapprompt@gap>A !gapinput@1 / s;A
  fail
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{homalgTable}}
\logpage{[ 3, 4, 2 ]}\nobreak
\hyperdef{L}{X7AFD26D480AA9323}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{homalgTable({\mdseries\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{\mdseries\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{[ 3, 4, 3 ]}\nobreak
\hyperdef{L}{X816D807781E8F854}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RingElementConstructor({\mdseries\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{\mdseries\slshape R}}. }

 

\subsection{\textcolor{Chapter }{TypeOfHomalgMatrix}}
\logpage{[ 3, 4, 4 ]}\nobreak
\hyperdef{L}{X7E5426C67AA9A6E5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{TypeOfHomalgMatrix({\mdseries\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{\mdseries\slshape R}}. }

 

\subsection{\textcolor{Chapter }{ConstructorForHomalgMatrices}}
\logpage{[ 3, 4, 5 ]}\nobreak
\hyperdef{L}{X80504BE983BD1A70}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ConstructorForHomalgMatrices({\mdseries\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{\mdseries\slshape R}}. }

 

\subsection{\textcolor{Chapter }{Zero (for homalg rings)}}
\logpage{[ 3, 4, 6 ]}\nobreak
\hyperdef{L}{X799B5F797F809EE5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Zero({\mdseries\slshape R})\index{Zero@\texttt{Zero}!for homalg rings}
\label{Zero:for homalg rings}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring element



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

 

\subsection{\textcolor{Chapter }{One (for homalg rings)}}
\logpage{[ 3, 4, 7 ]}\nobreak
\hyperdef{L}{X84701329860750C3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{One({\mdseries\slshape R})\index{One@\texttt{One}!for homalg rings}
\label{One:for homalg rings}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring element



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

 

\subsection{\textcolor{Chapter }{MinusOne}}
\logpage{[ 3, 4, 8 ]}\nobreak
\hyperdef{L}{X810D03AA827BD128}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{MinusOne({\mdseries\slshape R})\index{MinusOne@\texttt{MinusOne}}
\label{MinusOne}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring element



 The minus one of the \textsf{homalg} ring \mbox{\texttt{\mdseries\slshape R}}. }

 

\subsection{\textcolor{Chapter }{ProductOfIndeterminates}}
\logpage{[ 3, 4, 9 ]}\nobreak
\hyperdef{L}{X7CC4312578DC42B6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ProductOfIndeterminates({\mdseries\slshape R})\index{ProductOfIndeterminates@\texttt{ProductOfIndeterminates}}
\label{ProductOfIndeterminates}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} ring element



 The product of indeterminates of the \textsf{homalg} ring \mbox{\texttt{\mdseries\slshape R}}. }

 

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



 The list of rational parameters of the \textsf{homalg} ring \mbox{\texttt{\mdseries\slshape R}}. }

 

\subsection{\textcolor{Chapter }{IndeterminatesOfPolynomialRing}}
\logpage{[ 3, 4, 11 ]}\nobreak
\hyperdef{L}{X80D585E1793D4552}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IndeterminatesOfPolynomialRing({\mdseries\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{\mdseries\slshape R}}. }

 

\subsection{\textcolor{Chapter }{RelativeIndeterminatesOfPolynomialRing}}
\logpage{[ 3, 4, 12 ]}\nobreak
\hyperdef{L}{X84CE78E379A34C56}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RelativeIndeterminatesOfPolynomialRing({\mdseries\slshape R})\index{RelativeIndeterminatesOfPolynomialRing@\texttt{Relative}\-\texttt{Indeterminates}\-\texttt{Of}\-\texttt{Polynomial}\-\texttt{Ring}}
\label{RelativeIndeterminatesOfPolynomialRing}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a list of \textsf{homalg} ring elements



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

 

\subsection{\textcolor{Chapter }{IndeterminateCoordinatesOfRingOfDerivations}}
\logpage{[ 3, 4, 13 ]}\nobreak
\hyperdef{L}{X7F4A050A87C042E5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IndeterminateCoordinatesOfRingOfDerivations({\mdseries\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{\mdseries\slshape R}}. }

 

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



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

 

\subsection{\textcolor{Chapter }{IndeterminateDerivationsOfRingOfDerivations}}
\logpage{[ 3, 4, 15 ]}\nobreak
\hyperdef{L}{X78776EBA7DC179B4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IndeterminateDerivationsOfRingOfDerivations({\mdseries\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{\mdseries\slshape R}}. }

 

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



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

 

\subsection{\textcolor{Chapter }{IndeterminateAntiCommutingVariablesOfExteriorRing}}
\logpage{[ 3, 4, 17 ]}\nobreak
\hyperdef{L}{X7C15E6647945C0E3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IndeterminateAntiCommutingVariablesOfExteriorRing({\mdseries\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{\mdseries\slshape R}}. }

 

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



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

 

\subsection{\textcolor{Chapter }{IndeterminatesOfExteriorRing}}
\logpage{[ 3, 4, 19 ]}\nobreak
\hyperdef{L}{X7BBEF7097B459D33}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IndeterminatesOfExteriorRing({\mdseries\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{\mdseries\slshape R}}. }

 

\subsection{\textcolor{Chapter }{CoefficientsRing}}
\logpage{[ 3, 4, 20 ]}\nobreak
\hyperdef{L}{X8235D10781BE8003}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CoefficientsRing({\mdseries\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{\mdseries\slshape R}}. }

 

\subsection{\textcolor{Chapter }{KrullDimension}}
\logpage{[ 3, 4, 21 ]}\nobreak
\hyperdef{L}{X789CF8B778A0C58D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{KrullDimension({\mdseries\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{\mdseries\slshape R}}. }

 

\subsection{\textcolor{Chapter }{LeftGlobalDimension}}
\logpage{[ 3, 4, 22 ]}\nobreak
\hyperdef{L}{X8735C56B7BEBC86E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftGlobalDimension({\mdseries\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{\mdseries\slshape R}}. }

 

\subsection{\textcolor{Chapter }{RightGlobalDimension}}
\logpage{[ 3, 4, 23 ]}\nobreak
\hyperdef{L}{X7E6C5B5781EF78C5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightGlobalDimension({\mdseries\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{\mdseries\slshape R}}. }

 

\subsection{\textcolor{Chapter }{GlobalDimension}}
\logpage{[ 3, 4, 24 ]}\nobreak
\hyperdef{L}{X7D511B3E7A50AB2A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{GlobalDimension({\mdseries\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{\mdseries\slshape R}}. The global dimension is defined, only if the left and right global
dimensions coincide. }

 

\subsection{\textcolor{Chapter }{GeneralLinearRank}}
\logpage{[ 3, 4, 25 ]}\nobreak
\hyperdef{L}{X792D56C278E346B1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{GeneralLinearRank({\mdseries\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{\mdseries\slshape R}} (\cite{McCRob}, 11.1.14). }

 

\subsection{\textcolor{Chapter }{ElementaryRank}}
\logpage{[ 3, 4, 26 ]}\nobreak
\hyperdef{L}{X79BCB23D873268CB}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ElementaryRank({\mdseries\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{\mdseries\slshape R}} (\cite{McCRob}, 11.3.10). }

 

\subsection{\textcolor{Chapter }{StableRank}}
\logpage{[ 3, 4, 27 ]}\nobreak
\hyperdef{L}{X822907CB7919EEF2}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{StableRank({\mdseries\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{\mdseries\slshape R}} (\cite{McCRob}, 11.3.4). }

 

\subsection{\textcolor{Chapter }{AssociatedGradedRing}}
\logpage{[ 3, 4, 28 ]}\nobreak
\hyperdef{L}{X826BE1E87EE023B2}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AssociatedGradedRing({\mdseries\slshape R})\index{AssociatedGradedRing@\texttt{AssociatedGradedRing}}
\label{AssociatedGradedRing}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a homalg ring



 The graded ring associated to the filtered ring \mbox{\texttt{\mdseries\slshape R}}. }

 }

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

  }

   
\chapter{\textcolor{Chapter }{Ring Maps}}\label{RingMaps}
\logpage{[ 4, 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{[ 4, 1, 0 ]}
\hyperdef{L}{X7B99B8F5780E84C3}{}
{
  

\subsection{\textcolor{Chapter }{IsHomalgRingMap}}
\logpage{[ 4, 1, 1 ]}\nobreak
\hyperdef{L}{X7E084D947E3AEFE6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgRingMap({\mdseries\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{[ 4, 1, 2 ]}\nobreak
\hyperdef{L}{X87DB79AF83F17FB6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgRingSelfMap({\mdseries\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{[ 4, 1, 3 ]}\nobreak
\hyperdef{L}{X7DFD1CBA83E63737}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgRingMapRep({\mdseries\slshape phi})\index{IsHomalgRingMapRep@\texttt{IsHomalgRingMapRep}}
\label{IsHomalgRingMapRep}
}\hfill{\scriptsize (Representation)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} representation of \textsf{homalg} ring maps. 

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

 }

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

\subsection{\textcolor{Chapter }{RingMap (constructor for ring maps)}}
\logpage{[ 4, 2, 1 ]}\nobreak
\hyperdef{L}{X7F21AB318507FF83}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RingMap({\mdseries\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{\mdseries\slshape images}} of the set of generators of the source \textsf{homalg} ring \mbox{\texttt{\mdseries\slshape S}} in terms of the generators of the target ring \mbox{\texttt{\mdseries\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{[ 4, 3, 0 ]}
\hyperdef{L}{X85DA972D8701BC7C}{}
{
  

\subsection{\textcolor{Chapter }{IsMorphism (for ring maps)}}
\logpage{[ 4, 3, 1 ]}\nobreak
\hyperdef{L}{X8555A4DF84C9165B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsMorphism({\mdseries\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{\mdseries\slshape phi}} is a well-defined map, i.e. independent of all involved presentations. }

 

\subsection{\textcolor{Chapter }{IsIdentityMorphism (for ring maps)}}
\logpage{[ 4, 3, 2 ]}\nobreak
\hyperdef{L}{X832893897FD3744D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsIdentityMorphism({\mdseries\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{\mdseries\slshape phi}} is the identity morphism. }

 

\subsection{\textcolor{Chapter }{IsMonomorphism (for ring maps)}}
\logpage{[ 4, 3, 3 ]}\nobreak
\hyperdef{L}{X87F79EA381E3E34F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsMonomorphism({\mdseries\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{\mdseries\slshape phi}} is a monomorphism. }

 

\subsection{\textcolor{Chapter }{IsEpimorphism (for ring maps)}}
\logpage{[ 4, 3, 4 ]}\nobreak
\hyperdef{L}{X849F620C824F4078}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsEpimorphism({\mdseries\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{\mdseries\slshape phi}} is an epimorphism. }

 

\subsection{\textcolor{Chapter }{IsIsomorphism (for ring maps)}}
\logpage{[ 4, 3, 5 ]}\nobreak
\hyperdef{L}{X82B9422D7B01BA4A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsIsomorphism({\mdseries\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{\mdseries\slshape phi}} is an isomorphism. }

 

\subsection{\textcolor{Chapter }{IsAutomorphism (for ring maps)}}
\logpage{[ 4, 3, 6 ]}\nobreak
\hyperdef{L}{X790E34C5802D0F54}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsAutomorphism({\mdseries\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{\mdseries\slshape phi}} is an automorphism. }

 }

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

\subsection{\textcolor{Chapter }{Source (for ring maps)}}
\logpage{[ 4, 4, 1 ]}\nobreak
\hyperdef{L}{X83678DEC78394702}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Source({\mdseries\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{\mdseries\slshape phi}}. }

 

\subsection{\textcolor{Chapter }{Range (for ring maps)}}
\logpage{[ 4, 4, 2 ]}\nobreak
\hyperdef{L}{X7EBE68567900396A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Range({\mdseries\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{\mdseries\slshape phi}}. }

 

\subsection{\textcolor{Chapter }{DegreeOfMorphism (for ring maps)}}
\logpage{[ 4, 4, 3 ]}\nobreak
\hyperdef{L}{X7C4F3F0F82C6EB88}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DegreeOfMorphism({\mdseries\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{\mdseries\slshape phi}} of graded rings. \\
 (no method installed) }

 

\subsection{\textcolor{Chapter }{CoordinateRingOfGraph (for ring maps)}}
\logpage{[ 4, 4, 4 ]}\nobreak
\hyperdef{L}{X785155EE844A98BD}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CoordinateRingOfGraph({\mdseries\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{\mdseries\slshape phi}}. }

 }

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

  }

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

\subsection{\textcolor{Chapter }{IsHomalgMatrix}}
\logpage{[ 5, 1, 1 ]}\nobreak
\hyperdef{L}{X7B68E1057F5F011F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgMatrix({\mdseries\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. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  DeclareCategory( "IsHomalgMatrix",
          IsMatrixObj and
          IsAttributeStoringRep );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsHomalgInternalMatrixRep}}
\logpage{[ 5, 1, 2 ]}\nobreak
\hyperdef{L}{X7FE94FC47F460E35}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgInternalMatrixRep({\mdseries\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{[ 5, 2, 0 ]}
\hyperdef{L}{X7977387186436CDF}{}
{
  

\subsection{\textcolor{Chapter }{HomalgInitialMatrix (constructor for initial matrices filled with zeros)}}
\logpage{[ 5, 2, 1 ]}\nobreak
\hyperdef{L}{X86D290B084AC6638}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgInitialMatrix({\mdseries\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{\mdseries\slshape m}} \times \mbox{\texttt{\mdseries\slshape n}}$ \textsf{homalg} matrix filled with zeros over the \textsf{homalg} ring \mbox{\texttt{\mdseries\slshape R}}. This construction is useful in case one wants to define a matrix by
assigning its nonzero entries. The property \texttt{IsInitialMatrix} (\ref{IsInitialMatrix}) is reset as soon as the matrix is evaluated. New computed properties or
attributes of the matrix won't be cached, until the matrix is explicitly made
immutable using ($\to$ \texttt{MakeImmutable} (\textbf{Reference: MakeImmutable})). 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@z := HomalgInitialMatrix( 2, 3, ZZ );|
  <An initial 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@HasIsZero( z );|
  false
  !gapprompt@gap>| !gapinput@IsZero( z );|
  true
  !gapprompt@gap>| !gapinput@z;|
  <A 2 x 3 mutable matrix over an internal ring>
  !gapprompt@gap>| !gapinput@HasIsZero( z );|
  false
\end{Verbatim}
 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@n := HomalgInitialMatrix( 2, 3, ZZ );|
  <An initial 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@SetMatElm( n, 1, 1, "1" );|
  !gapprompt@gap>| !gapinput@SetMatElm( n, 2, 3, "1" );|
  !gapprompt@gap>| !gapinput@MakeImmutable( n );|
  <A 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@Display( n );|
  [ [  1,  0,  0 ],
    [  0,  0,  1 ] ]
  !gapprompt@gap>| !gapinput@IsZero( n );|
  false
  !gapprompt@gap>| !gapinput@n;|
  <A non-zero 2 x 3 matrix over an internal ring>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgInitialIdentityMatrix (constructor for initial quadratic matrices with ones on the diagonal)}}
\logpage{[ 5, 2, 2 ]}\nobreak
\hyperdef{L}{X7CB77009868D369A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgInitialIdentityMatrix({\mdseries\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{\mdseries\slshape m}} \times \mbox{\texttt{\mdseries\slshape m}}$ \textsf{homalg} quadratic matrix with ones on the diagonal over the \textsf{homalg} ring \mbox{\texttt{\mdseries\slshape R}}. This construction is useful in case one wants to define an elementary matrix
by assigning its off-diagonal nonzero entries. The property \texttt{IsInitialIdentityMatrix} (\ref{IsInitialIdentityMatrix}) is reset as soon as the matrix is evaluated. New computed properties or
attributes of the matrix won't be cached, until the matrix is explicitly made
immutable using ($\to$ \texttt{MakeImmutable} (\textbf{Reference: MakeImmutable})). 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@id := HomalgInitialIdentityMatrix( 3, ZZ );|
  <An initial identity 3 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@HasIsOne( id );|
  false
  !gapprompt@gap>| !gapinput@IsOne( id );|
  true
  !gapprompt@gap>| !gapinput@id;|
  <A 3 x 3 mutable matrix over an internal ring>
  !gapprompt@gap>| !gapinput@HasIsOne( id );|
  false
\end{Verbatim}
 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@e := HomalgInitialIdentityMatrix( 3, ZZ );|
  <An initial identity 3 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@SetMatElm( e, 1, 2, "1" );|
  !gapprompt@gap>| !gapinput@SetMatElm( e, 2, 1, "-1" );|
  !gapprompt@gap>| !gapinput@MakeImmutable( e );|
  <A 3 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@Display( e );|
  [ [   1,   1,   0 ],
    [  -1,   1,   0 ],
    [   0,   0,   1 ] ]
  !gapprompt@gap>| !gapinput@IsOne( e );|
  false
  !gapprompt@gap>| !gapinput@e;|
  <A 3 x 3 matrix over an internal ring>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgZeroMatrix (constructor for zero matrices)}}
\logpage{[ 5, 2, 3 ]}\nobreak
\hyperdef{L}{X8309EB7B86953A23}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgZeroMatrix({\mdseries\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{\mdseries\slshape m}} \times \mbox{\texttt{\mdseries\slshape n}}$ \textsf{homalg} zero matrix over the \textsf{homalg} ring \mbox{\texttt{\mdseries\slshape R}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@z := HomalgZeroMatrix( 2, 3, ZZ );|
  <An unevaluated 2 x 3 zero matrix over an internal ring>
  !gapprompt@gap>| !gapinput@Display( z );|
  [ [  0,  0,  0 ],
    [  0,  0,  0 ] ]
  !gapprompt@gap>| !gapinput@z;|
  <A 2 x 3 zero matrix over an internal ring>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgIdentityMatrix (constructor for identity matrices)}}
\logpage{[ 5, 2, 4 ]}\nobreak
\hyperdef{L}{X83266B9D7BE740D8}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgIdentityMatrix({\mdseries\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{\mdseries\slshape m}} \times \mbox{\texttt{\mdseries\slshape m}}$ \textsf{homalg} identity matrix over the \textsf{homalg} ring \mbox{\texttt{\mdseries\slshape R}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@id := HomalgIdentityMatrix( 3, ZZ );|
  <An unevaluated 3 x 3 identity matrix over an internal ring>
  !gapprompt@gap>| !gapinput@Display( id );|
  [ [  1,  0,  0 ],
    [  0,  1,  0 ],
    [  0,  0,  1 ] ]
  !gapprompt@gap>| !gapinput@id;|
  <A 3 x 3 identity matrix over an internal ring>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgVoidMatrix (constructor for void matrices)}}
\logpage{[ 5, 2, 5 ]}\nobreak
\hyperdef{L}{X7D2E3472879E28AB}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgVoidMatrix({\mdseries\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{\mdseries\slshape m}} \times \mbox{\texttt{\mdseries\slshape n}}$ \textsf{homalg} matrix. }

 

\subsection{\textcolor{Chapter }{HomalgMatrix (constructor for matrices using a listlist)}}
\logpage{[ 5, 2, 6 ]}\nobreak
\hyperdef{L}{X864ACCB08094F0B7}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgMatrix({\mdseries\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}{$\triangleright$\ \ \texttt{HomalgMatrix({\mdseries\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}{$\triangleright$\ \ \texttt{HomalgMatrix({\mdseries\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}{$\triangleright$\ \ \texttt{HomalgMatrix({\mdseries\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{\mdseries\slshape m}} \times \mbox{\texttt{\mdseries\slshape n}}$ \textsf{homalg} matrix over the \textsf{homalg} ring \mbox{\texttt{\mdseries\slshape R}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@m := HomalgMatrix( [ [ 1, 2, 3 ], [ 4, 5, 6 ] ], ZZ );|
  <A 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@Display( m );|
  [ [  1,  2,  3 ],
    [  4,  5,  6 ] ]
\end{Verbatim}
 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@m := HomalgMatrix( [ [ 1, 2, 3 ], [ 4, 5, 6 ] ], 2, 3, ZZ );|
  <A 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@Display( m );|
  [ [  1,  2,  3 ],
    [  4,  5,  6 ] ]
\end{Verbatim}
 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@m := HomalgMatrix( [ 1, 2, 3,   4, 5, 6 ], 2, 3, ZZ );|
  <A 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@Display( m );|
  [ [  1,  2,  3 ],
    [  4,  5,  6 ] ]
\end{Verbatim}
 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@m := HomalgMatrix( "[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]", ZZ );|
  <A 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@Display( m );|
  [ [  1,  2,  3 ],
    [  4,  5,  6 ] ]
\end{Verbatim}
 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@m := HomalgMatrix( "[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]", 2, 3, ZZ );|
  <A 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@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}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@m := HomalgMatrix( "[ 1, 2, 3,   4, 5, 6 ]", 2, 3, ZZ );|
  <A 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@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}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@m := HomalgMatrix( "[ \|
  !gapprompt@>| !gapinput@1, 2, 3, \|
  !gapprompt@>| !gapinput@4, 5, 6  \|
  !gapprompt@>| !gapinput@]", 2, 3, ZZ );|
  <A 2 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@Display( m );|
  [ [  1,  2,  3 ],
    [  4,  5,  6 ] ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{HomalgDiagonalMatrix (constructor for diagonal matrices)}}
\logpage{[ 5, 2, 7 ]}\nobreak
\hyperdef{L}{X872D39C678D0C4AE}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgDiagonalMatrix({\mdseries\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{\mdseries\slshape R}}. The diagonal consists of the entries of the list \mbox{\texttt{\mdseries\slshape diag}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@d := HomalgDiagonalMatrix( [ 1, 2, 3 ], ZZ );|
  <An unevaluated diagonal 3 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@Display( d );|
  [ [  1,  0,  0 ],
    [  0,  2,  0 ],
    [  0,  0,  3 ] ]
  !gapprompt@gap>| !gapinput@d;|
  <A diagonal 3 x 3 matrix over an internal ring>
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{\texttt{\symbol{92}}* (copy a matrix over a different ring)}}
\logpage{[ 5, 2, 8 ]}\nobreak
\hyperdef{L}{X81225377833C4644}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{\texttt{\symbol{92}}*({\mdseries\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}{$\triangleright$\ \ \texttt{\texttt{\symbol{92}}*({\mdseries\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{\mdseries\slshape R}} having the same entries as the matrix \mbox{\texttt{\mdseries\slshape mat}}. Syntax: \mbox{\texttt{\mdseries\slshape R}} \texttt{*} \mbox{\texttt{\mdseries\slshape mat}} or \mbox{\texttt{\mdseries\slshape mat}} \texttt{*} \mbox{\texttt{\mdseries\slshape R}} 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@Z4 := ZZ / 4;|
  Z/( 4 )
  !gapprompt@gap>| !gapinput@Display( Z4 );|
  <A residue class ring>
  !gapprompt@gap>| !gapinput@d := HomalgDiagonalMatrix( [ 2 .. 4 ], ZZ );|
  <An unevaluated diagonal 3 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@d2 := Z4 * d; ## or d2 := d * Z4;|
  <A 3 x 3 matrix over a residue class ring>
  !gapprompt@gap>| !gapinput@Display( d2 );|
  [ [  2,  0,  0 ],
    [  0,  3,  0 ],
    [  0,  0,  4 ] ]
  
  modulo [ 4 ]
  !gapprompt@gap>| !gapinput@d;|
  <A diagonal 3 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@ZeroRows( d );|
  [  ]
  !gapprompt@gap>| !gapinput@ZeroRows( d2 );|
  [ 3 ]
  !gapprompt@gap>| !gapinput@d;|
  <A non-zero diagonal 3 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@d2;|
  <A non-zero 3 x 3 matrix over a residue class ring>
\end{Verbatim}
 }

 }

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

\subsection{\textcolor{Chapter }{IsZero (for matrices)}}
\logpage{[ 5, 3, 1 ]}\nobreak
\hyperdef{L}{X858B5AF57D5BC90A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsZero({\mdseries\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{\mdseries\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}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@A := HomalgMatrix( "[ 2 ]", ZZ );|
  <A 1 x 1 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@Z2 := ZZ / 2;|
  Z/( 2 )
  !gapprompt@gap>| !gapinput@A := Z2 * A;|
  <A 1 x 1 matrix over a residue class ring>
  !gapprompt@gap>| !gapinput@Display( A );|
  [ [  2 ] ]
  
  modulo [ 2 ]
  !gapprompt@gap>| !gapinput@IsZero( A );|
  true
\end{Verbatim}
 }

 

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



 Check if the \textsf{homalg} matrix \mbox{\texttt{\mdseries\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 }{IsUnitFree}}
\logpage{[ 5, 3, 3 ]}\nobreak
\hyperdef{L}{X7813653578F174AB}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsUnitFree({\mdseries\slshape A})\index{IsUnitFree@\texttt{IsUnitFree}}
\label{IsUnitFree}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

\subsection{\textcolor{Chapter }{IsDiagonalMatrix}}
\logpage{[ 5, 3, 13 ]}\nobreak
\hyperdef{L}{X7EEC8E768178696E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsDiagonalMatrix({\mdseries\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{\mdseries\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{[ 5, 3, 14 ]}\nobreak
\hyperdef{L}{X8314460887FD9FE1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsScalarlMatrix({\mdseries\slshape A})\index{IsScalarlMatrix@\texttt{IsScalarlMatrix}}
\label{IsScalarlMatrix}
}\hfill{\scriptsize (property)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 

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



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

 }

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

\subsection{\textcolor{Chapter }{NrRows}}
\logpage{[ 5, 4, 1 ]}\nobreak
\hyperdef{L}{X7AAEA5B1875BEE2D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NrRows({\mdseries\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{\mdseries\slshape A}}.

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

 

\subsection{\textcolor{Chapter }{NrColumns}}
\logpage{[ 5, 4, 2 ]}\nobreak
\hyperdef{L}{X781766A47B5D41AD}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NrColumns({\mdseries\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{\mdseries\slshape A}}.

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

 

\subsection{\textcolor{Chapter }{DeterminantMat}}
\logpage{[ 5, 4, 3 ]}\nobreak
\hyperdef{L}{X83045F6F82C180E1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DeterminantMat({\mdseries\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{\mdseries\slshape A}}.

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

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

 

\subsection{\textcolor{Chapter }{ZeroRows}}
\logpage{[ 5, 4, 4 ]}\nobreak
\hyperdef{L}{X828225E0857B1FDA}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ZeroRows({\mdseries\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{\mdseries\slshape A}}. 

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

 

\subsection{\textcolor{Chapter }{ZeroColumns}}
\logpage{[ 5, 4, 5 ]}\nobreak
\hyperdef{L}{X870D761F7AB96D12}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ZeroColumns({\mdseries\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{\mdseries\slshape A}}. 

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

 

\subsection{\textcolor{Chapter }{NonZeroRows}}
\logpage{[ 5, 4, 6 ]}\nobreak
\hyperdef{L}{X7991ED337C73065A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NonZeroRows({\mdseries\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{\mdseries\slshape A}}. }

 

\subsection{\textcolor{Chapter }{NonZeroColumns}}
\logpage{[ 5, 4, 7 ]}\nobreak
\hyperdef{L}{X7F335DCB7B8781E4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NonZeroColumns({\mdseries\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{\mdseries\slshape A}}. }

 

\subsection{\textcolor{Chapter }{PositionOfFirstNonZeroEntryPerRow}}
\logpage{[ 5, 4, 8 ]}\nobreak
\hyperdef{L}{X7B7A073D7E1FAEA4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PositionOfFirstNonZeroEntryPerRow({\mdseries\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{\mdseries\slshape A}}, else zero. }

 

\subsection{\textcolor{Chapter }{PositionOfFirstNonZeroEntryPerColumn}}
\logpage{[ 5, 4, 9 ]}\nobreak
\hyperdef{L}{X83B389A97A703E42}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PositionOfFirstNonZeroEntryPerColumn({\mdseries\slshape A})\index{PositionOfFirstNonZeroEntryPerColumn@\texttt{Position}\-\texttt{Of}\-\texttt{First}\-\texttt{Non}\-\texttt{Zero}\-\texttt{Entry}\-\texttt{Per}\-\texttt{Column}}
\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{\mdseries\slshape A}}, else zero. }

 

\subsection{\textcolor{Chapter }{RowRankOfMatrix}}
\logpage{[ 5, 4, 10 ]}\nobreak
\hyperdef{L}{X862841E68674FA2A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RowRankOfMatrix({\mdseries\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{\mdseries\slshape A}}. }

 

\subsection{\textcolor{Chapter }{ColumnRankOfMatrix}}
\logpage{[ 5, 4, 11 ]}\nobreak
\hyperdef{L}{X7C61862E81CABD51}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ColumnRankOfMatrix({\mdseries\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{\mdseries\slshape A}}. }

 

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



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

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

 

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



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

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

 

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



 \mbox{\texttt{\mdseries\slshape A}} is a \textsf{homalg} matrix (row convention). }

 

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



 \mbox{\texttt{\mdseries\slshape A}} is a \textsf{homalg} matrix (row convention). }

 

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



 \mbox{\texttt{\mdseries\slshape A}} is a \textsf{homalg} matrix (row convention). }

 

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



 \mbox{\texttt{\mdseries\slshape A}} is a \textsf{homalg} matrix (row convention). }

 

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



 \mbox{\texttt{\mdseries\slshape A}} is a \textsf{homalg} matrix (row convention). }

 

\subsection{\textcolor{Chapter }{HilbertPolynomial}}
\logpage{[ 5, 4, 19 ]}\nobreak
\hyperdef{L}{X84299BAB807A1E13}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HilbertPolynomial({\mdseries\slshape A})\index{HilbertPolynomial@\texttt{HilbertPolynomial}}
\label{HilbertPolynomial}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a univariate polynomial with rational coefficients



 \mbox{\texttt{\mdseries\slshape A}} is a \textsf{homalg} matrix (row convention). }

 

\subsection{\textcolor{Chapter }{AffineDimension}}
\logpage{[ 5, 4, 20 ]}\nobreak
\hyperdef{L}{X7BC36CC67CB09858}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AffineDimension({\mdseries\slshape A})\index{AffineDimension@\texttt{AffineDimension}}
\label{AffineDimension}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a nonnegative integer



 \mbox{\texttt{\mdseries\slshape A}} is a \textsf{homalg} matrix (row convention). }

 

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



 \mbox{\texttt{\mdseries\slshape A}} is a \textsf{homalg} matrix (row convention). }

 

\subsection{\textcolor{Chapter }{ProjectiveDegree}}
\logpage{[ 5, 4, 22 ]}\nobreak
\hyperdef{L}{X82A1B55879AB1742}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ProjectiveDegree({\mdseries\slshape A})\index{ProjectiveDegree@\texttt{ProjectiveDegree}}
\label{ProjectiveDegree}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
a nonnegative integer



 \mbox{\texttt{\mdseries\slshape A}} is a \textsf{homalg} matrix (row convention). }

 

\subsection{\textcolor{Chapter }{ConstantTermOfHilbertPolynomialn}}
\logpage{[ 5, 4, 23 ]}\nobreak
\hyperdef{L}{X791B772A7E368A88}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ConstantTermOfHilbertPolynomialn({\mdseries\slshape A})\index{ConstantTermOfHilbertPolynomialn@\texttt{ConstantTermOfHilbertPolynomialn}}
\label{ConstantTermOfHilbertPolynomialn}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
an integer



 \mbox{\texttt{\mdseries\slshape A}} is a \textsf{homalg} matrix (row convention). }

 

\subsection{\textcolor{Chapter }{MatrixOfSymbols}}
\logpage{[ 5, 4, 24 ]}\nobreak
\hyperdef{L}{X835972A77F02C5BB}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{MatrixOfSymbols({\mdseries\slshape A})\index{MatrixOfSymbols@\texttt{MatrixOfSymbols}}
\label{MatrixOfSymbols}
}\hfill{\scriptsize (attribute)}}\\
\textbf{\indent Returns:\ }
an integer



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

 }

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

\subsection{\textcolor{Chapter }{HomalgRing (for matrices)}}
\logpage{[ 5, 5, 1 ]}\nobreak
\hyperdef{L}{X81BBF79C79C3B6DF}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{HomalgRing({\mdseries\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{\mdseries\slshape mat}}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ZZ := HomalgRingOfIntegers( );|
  Z
  !gapprompt@gap>| !gapinput@d := HomalgDiagonalMatrix( [ 2 .. 4 ], ZZ );|
  <An unevaluated diagonal 3 x 3 matrix over an internal ring>
  !gapprompt@gap>| !gapinput@R := HomalgRing( d );|
  Z
  !gapprompt@gap>| !gapinput@IsIdenticalObj( R, ZZ );|
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{LeftInverse (for matrices)}}
\logpage{[ 5, 5, 2 ]}\nobreak
\hyperdef{L}{X7FBAA11B8008D936}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftInverse({\mdseries\slshape RI})\index{LeftInverse@\texttt{LeftInverse}!for matrices}
\label{LeftInverse:for matrices}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix or false



 The left inverse of the matrix \mbox{\texttt{\mdseries\slshape RI}}. The lazy version of this operation is \texttt{LeftInverseLazy} (\ref{LeftInverseLazy:for matrices}). ($\to$ \texttt{RightDivide} (\ref{RightDivide:for pairs of matrices})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( LeftInverse,
          "for homalg matrices",
          [ IsHomalgMatrix ],
          
    function( RI )
      local Id, LI;
      
      Id := HomalgIdentityMatrix( NrColumns( RI ), HomalgRing( RI ) );
      
      LI := RightDivide( Id, RI );	## ( cf. [BR08, Subsection 3.1.3] )
      
      ## CAUTION: for the following SetXXX RightDivide is assumed
      ## NOT to be lazy evaluated!!!
      
      SetIsLeftInvertibleMatrix( RI, IsHomalgMatrix( LI ) );
      
      if IsBool( LI ) then
          return fail;
      fi;
      
      if HasIsInvertibleMatrix( RI ) and IsInvertibleMatrix( RI ) then
          SetIsInvertibleMatrix( LI, true );
      else
          SetIsRightInvertibleMatrix( LI, true );
      fi;
      
      SetRightInverse( LI, RI );
      
      SetNrColumns( LI, NrRows( RI ) );
      
      if NrRows( RI ) = NrColumns( RI ) then
          ## a left inverse of a ring element is unique
          ## and coincides with the right inverse
          SetRightInverse( RI, LI );
          SetLeftInverse( LI, RI );
      fi;
      
      return LI;
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{RightInverse (for matrices)}}
\logpage{[ 5, 5, 3 ]}\nobreak
\hyperdef{L}{X7AAD17D47839BCAE}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightInverse({\mdseries\slshape LI})\index{RightInverse@\texttt{RightInverse}!for matrices}
\label{RightInverse:for matrices}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix or false



 The right inverse of the matrix \mbox{\texttt{\mdseries\slshape LI}}. The lazy version of this operation is \texttt{RightInverseLazy} (\ref{RightInverseLazy:for matrices}). ($\to$ \texttt{LeftDivide} (\ref{LeftDivide:for pairs of matrices})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( RightInverse,
          "for homalg matrices",
          [ IsHomalgMatrix ],
          
    function( LI )
      local Id, RI;
      
      Id := HomalgIdentityMatrix( NrRows( LI ), HomalgRing( LI ) );
      
      RI := LeftDivide( LI, Id );	## ( cf. [BR08, Subsection 3.1.3] )
      
      ## CAUTION: for the following SetXXX LeftDivide is assumed
      ## NOT to be lazy evaluated!!!
      
      SetIsRightInvertibleMatrix( LI, IsHomalgMatrix( RI ) );
      
      if IsBool( RI ) then
          return fail;
      fi;
      
      if HasIsInvertibleMatrix( LI ) and IsInvertibleMatrix( LI ) then
          SetIsInvertibleMatrix( RI, true );
      else
          SetIsLeftInvertibleMatrix( RI, true );
      fi;
      
      SetLeftInverse( RI, LI );
      
      SetNrRows( RI, NrColumns( LI ) );
      
      if NrRows( LI ) = NrColumns( LI ) then
          ## a right inverse of a ring element is unique
          ## and coincides with the left inverse
          SetLeftInverse( LI, RI );
          SetRightInverse( RI, LI );
      fi;
      
      return RI;
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{LeftInverseLazy (for matrices)}}
\logpage{[ 5, 5, 4 ]}\nobreak
\hyperdef{L}{X7A7E42C179142727}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftInverseLazy({\mdseries\slshape M})\index{LeftInverseLazy@\texttt{LeftInverseLazy}!for matrices}
\label{LeftInverseLazy:for matrices}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 A lazy evaluated left inverse $C$ of the matrix \mbox{\texttt{\mdseries\slshape M}}. If no left inverse exists then \texttt{Eval}( \mbox{\texttt{\mdseries\slshape C}} ) will issue an error.

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

 

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



 A lazy evaluated right inverse $C$ of the matrix \mbox{\texttt{\mdseries\slshape M}}. If no right inverse exists then \texttt{Eval}( \mbox{\texttt{\mdseries\slshape C}} ) will issue an error.

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

 

\subsection{\textcolor{Chapter }{Involution (for matrices)}}
\logpage{[ 5, 5, 6 ]}\nobreak
\hyperdef{L}{X800FA81F7C42BFEA}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Involution({\mdseries\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{\mdseries\slshape M}}.

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

 

\subsection{\textcolor{Chapter }{CertainRows (for matrices)}}
\logpage{[ 5, 5, 7 ]}\nobreak
\hyperdef{L}{X7CF5CE79796001F6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CertainRows({\mdseries\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{\mdseries\slshape M}}, where $k=$\mbox{\texttt{\mdseries\slshape plist}}$[i]$.

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

 

\subsection{\textcolor{Chapter }{CertainColumns (for matrices)}}
\logpage{[ 5, 5, 8 ]}\nobreak
\hyperdef{L}{X8256AF2A840B19C4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CertainColumns({\mdseries\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{\mdseries\slshape M}}, where $l=$\mbox{\texttt{\mdseries\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{[ 5, 5, 9 ]}\nobreak
\hyperdef{L}{X7BC803DA871ADD55}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{UnionOfRows({\mdseries\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{\mdseries\slshape A}} and \mbox{\texttt{\mdseries\slshape B}}.

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

 

\subsection{\textcolor{Chapter }{UnionOfColumns (for matrices)}}
\logpage{[ 5, 5, 10 ]}\nobreak
\hyperdef{L}{X7F5B3A427A71C567}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{UnionOfColumns({\mdseries\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{\mdseries\slshape A}} and \mbox{\texttt{\mdseries\slshape B}}.

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

 

\subsection{\textcolor{Chapter }{DiagMat (for matrices)}}
\logpage{[ 5, 5, 11 ]}\nobreak
\hyperdef{L}{X7F2AD04C86F82240}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DiagMat({\mdseries\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{\mdseries\slshape list}}. An error is issued if \mbox{\texttt{\mdseries\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{[ 5, 5, 12 ]}\nobreak
\hyperdef{L}{X7CDA5D848468A0AA}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{KroneckerMat({\mdseries\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{\mdseries\slshape A}} and \mbox{\texttt{\mdseries\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{[ 5, 5, 13 ]}\nobreak
\hyperdef{L}{X7D1A074278B415BE}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{\texttt{\symbol{92}}*({\mdseries\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{\mdseries\slshape a}} with the \textsf{homalg} matrix \mbox{\texttt{\mdseries\slshape A}} (enter: \mbox{\texttt{\mdseries\slshape a}} \texttt{*} \mbox{\texttt{\mdseries\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{[ 5, 5, 14 ]}\nobreak
\hyperdef{L}{X87C773DA85B21ADF}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{\texttt{\symbol{92}}+({\mdseries\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{\mdseries\slshape A}} and \mbox{\texttt{\mdseries\slshape B}} (enter: \mbox{\texttt{\mdseries\slshape A}} \texttt{+} \mbox{\texttt{\mdseries\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{[ 5, 5, 15 ]}\nobreak
\hyperdef{L}{X784B57617B24208C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{\texttt{\symbol{92}}-({\mdseries\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{\mdseries\slshape A}} and \mbox{\texttt{\mdseries\slshape B}} (enter: \mbox{\texttt{\mdseries\slshape A}} \texttt{-} \mbox{\texttt{\mdseries\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{[ 5, 5, 16 ]}\nobreak
\hyperdef{L}{X7F5961D78754157B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{\texttt{\symbol{92}}*({\mdseries\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{\mdseries\slshape A}} and \mbox{\texttt{\mdseries\slshape B}} (enter: \mbox{\texttt{\mdseries\slshape A}} \texttt{*} \mbox{\texttt{\mdseries\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{[ 5, 5, 17 ]}\nobreak
\hyperdef{L}{X7E2074A77AFF518A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{\texttt{\symbol{92}}=({\mdseries\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{\mdseries\slshape A}} and \mbox{\texttt{\mdseries\slshape B}} are equal (enter: \mbox{\texttt{\mdseries\slshape A}} \texttt{=} \mbox{\texttt{\mdseries\slshape B}};), taking possible ring relations into account.

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

 

\subsection{\textcolor{Chapter }{GetColumnIndependentUnitPositions (for matrices)}}
\logpage{[ 5, 5, 18 ]}\nobreak
\hyperdef{L}{X85887BBB86F0A08B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{GetColumnIndependentUnitPositions({\mdseries\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{\mdseries\slshape A}}. We say that a unit \mbox{\texttt{\mdseries\slshape A}}$[i,k]$ is column independet from the unit \mbox{\texttt{\mdseries\slshape A}}$[l,j]$ if $i>l$ and \mbox{\texttt{\mdseries\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{\mdseries\slshape A}}$[i,k]$ is a new column independent unit then $[i,k]$ is added to the output list. If \mbox{\texttt{\mdseries\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{[ 5, 5, 19 ]}\nobreak
\hyperdef{L}{X824AB44184DD63B0}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{GetRowIndependentUnitPositions({\mdseries\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{\mdseries\slshape A}}. We say that a unit \mbox{\texttt{\mdseries\slshape A}}$[k,j]$ is row independet from the unit \mbox{\texttt{\mdseries\slshape A}}$[i,l]$ if $j>l$ and \mbox{\texttt{\mdseries\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{\mdseries\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{\mdseries\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{[ 5, 5, 20 ]}\nobreak
\hyperdef{L}{X7A1969A17979FC49}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{GetUnitPosition({\mdseries\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{\mdseries\slshape A}}$[i,j]$ in the matrix \mbox{\texttt{\mdseries\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{\mdseries\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 }{Eliminate}}
\logpage{[ 5, 5, 21 ]}\nobreak
\hyperdef{L}{X781B1C0C80529B09}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eliminate({\mdseries\slshape rel, indets})\index{Eliminate@\texttt{Eliminate}}
\label{Eliminate}
}\hfill{\scriptsize (operation)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix



 Eliminate the independents \mbox{\texttt{\mdseries\slshape indets}} from the matrix (or list of ring elements) \mbox{\texttt{\mdseries\slshape rel}}, i.e. compute a generating set of the ideal defined as the intersection of
the ideal generated by the entries of the list \mbox{\texttt{\mdseries\slshape rel}} with the subring generated by all indeterminates except those in \mbox{\texttt{\mdseries\slshape indets}}. by the list of indeterminates \mbox{\texttt{\mdseries\slshape indets}}. }

 

\subsection{\textcolor{Chapter }{BasisOfRowModule (for matrices)}}
\logpage{[ 5, 5, 22 ]}\nobreak
\hyperdef{L}{X80ADBE0D82CC6E85}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{BasisOfRowModule({\mdseries\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{\mdseries\slshape M}} is defined ($R:=$\texttt{HomalgRing}( \mbox{\texttt{\mdseries\slshape M}} )) and $S$ be the row span of \mbox{\texttt{\mdseries\slshape M}}, i.e. the $R$-submodule of the free module $R^{(1 \times NrColumns( \mbox{\texttt{\mdseries\slshape M}} ))}$ spanned by the rows of \mbox{\texttt{\mdseries\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{\mdseries\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{\mdseries\slshape M}}, and computing $B$ is typically the first step of such an algorithm. ($\to$ Appendix \ref{Basic_Operations}) }

 

\subsection{\textcolor{Chapter }{BasisOfColumnModule (for matrices)}}
\logpage{[ 5, 5, 23 ]}\nobreak
\hyperdef{L}{X868CDA327D6C8DDC}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{BasisOfColumnModule({\mdseries\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{\mdseries\slshape M}} is defined ($R:=$\texttt{HomalgRing}( \mbox{\texttt{\mdseries\slshape M}} )) and $S$ be the column span of \mbox{\texttt{\mdseries\slshape M}}, i.e. the $R$-submodule of the free module $R^{(NrRows( \mbox{\texttt{\mdseries\slshape M}} ) \times 1)}$ spanned by the columns of \mbox{\texttt{\mdseries\slshape M}}. A solution to the ``submodule membership problem'' is an algorithm which can decide if an element $m$ in $R^{(NrRows( \mbox{\texttt{\mdseries\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{\mdseries\slshape M}}, and computing $B$ is typically the first step of such an algorithm. ($\to$ Appendix \ref{Basic_Operations}) }

 

\subsection{\textcolor{Chapter }{DecideZeroRows (for pairs of matrices)}}
\logpage{[ 5, 5, 24 ]}\nobreak
\hyperdef{L}{X7F851EC7861170D1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DecideZeroRows({\mdseries\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{\mdseries\slshape A}} and \mbox{\texttt{\mdseries\slshape B}} be matrices having the same number of columns and defined over the same ring $R$ ($:=$\texttt{HomalgRing}( \mbox{\texttt{\mdseries\slshape A}} )) and $S$ be the row span of \mbox{\texttt{\mdseries\slshape B}}, i.e. the $R$-submodule of the free module $R^{(1 \times NrColumns( \mbox{\texttt{\mdseries\slshape B}} ))}$ spanned by the rows of \mbox{\texttt{\mdseries\slshape B}}. The result is a matrix $C$ having the same shape as \mbox{\texttt{\mdseries\slshape A}}, for which the $i$-th row $\mbox{\texttt{\mdseries\slshape C}}^i$ is equivalent to the $i$-th row $\mbox{\texttt{\mdseries\slshape A}}^i$ of \mbox{\texttt{\mdseries\slshape A}} modulo $S$, i.e. $\mbox{\texttt{\mdseries\slshape C}}^i-\mbox{\texttt{\mdseries\slshape A}}^i$ is an element of the row span $S$ of \mbox{\texttt{\mdseries\slshape B}}. Moreover, the row $\mbox{\texttt{\mdseries\slshape C}}^i$ is zero, if and only if the row $\mbox{\texttt{\mdseries\slshape A}}^i$ is an element of $S$. So \texttt{DecideZeroRows} decides which rows of \mbox{\texttt{\mdseries\slshape A}} are zero modulo the rows of \mbox{\texttt{\mdseries\slshape B}}. ($\to$ Appendix \ref{Basic_Operations}) }

 

\subsection{\textcolor{Chapter }{DecideZeroColumns (for pairs of matrices)}}
\logpage{[ 5, 5, 25 ]}\nobreak
\hyperdef{L}{X86C97DBB787BAD6D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DecideZeroColumns({\mdseries\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{\mdseries\slshape A}} and \mbox{\texttt{\mdseries\slshape B}} be matrices having the same number of rows and defined over the same ring $R$ ($:=$\texttt{HomalgRing}( \mbox{\texttt{\mdseries\slshape A}} )) and $S$ be the column span of \mbox{\texttt{\mdseries\slshape B}}, i.e. the $R$-submodule of the free module $R^{(NrRows( \mbox{\texttt{\mdseries\slshape B}} ) \times 1)}$ spanned by the columns of \mbox{\texttt{\mdseries\slshape B}}. The result is a matrix $C$ having the same shape as \mbox{\texttt{\mdseries\slshape A}}, for which the $i$-th column $\mbox{\texttt{\mdseries\slshape C}}_i$ is equivalent to the $i$-th column $\mbox{\texttt{\mdseries\slshape A}}_i$ of \mbox{\texttt{\mdseries\slshape A}} modulo $S$, i.e. $\mbox{\texttt{\mdseries\slshape C}}_i-\mbox{\texttt{\mdseries\slshape A}}_i$ is an element of the column span $S$ of \mbox{\texttt{\mdseries\slshape B}}. Moreover, the column $\mbox{\texttt{\mdseries\slshape C}}_i$ is zero, if and only if the column $\mbox{\texttt{\mdseries\slshape A}}_i$ is an element of $S$. So \texttt{DecideZeroColumns} decides which columns of \mbox{\texttt{\mdseries\slshape A}} are zero modulo the columns of \mbox{\texttt{\mdseries\slshape B}}. ($\to$ Appendix \ref{Basic_Operations}) }

 

\subsection{\textcolor{Chapter }{SyzygiesGeneratorsOfRows (for matrices)}}
\logpage{[ 5, 5, 26 ]}\nobreak
\hyperdef{L}{X86ECEA9B7A4AE578}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SyzygiesGeneratorsOfRows({\mdseries\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{\mdseries\slshape M}} is defined ($R:=$\texttt{HomalgRing}( \mbox{\texttt{\mdseries\slshape M}} )). The matrix of row syzygies \texttt{SyzygiesGeneratorsOfRows}( \mbox{\texttt{\mdseries\slshape M}} ) is a matrix whose rows span the left kernel of \mbox{\texttt{\mdseries\slshape M}}, i.e. the $R$-submodule of the free module $R^{(1 \times NrRows( \mbox{\texttt{\mdseries\slshape M}} ))}$ consisting of all rows $X$ satisfying $X\mbox{\texttt{\mdseries\slshape M}}=0$. ($\to$ Appendix \ref{Basic_Operations}) }

 

\subsection{\textcolor{Chapter }{SyzygiesGeneratorsOfColumns (for matrices)}}
\logpage{[ 5, 5, 27 ]}\nobreak
\hyperdef{L}{X86504B757F6DC990}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SyzygiesGeneratorsOfColumns({\mdseries\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{\mdseries\slshape M}} is defined ($R:=$\texttt{HomalgRing}( \mbox{\texttt{\mdseries\slshape M}} )). The matrix of column syzygies \texttt{SyzygiesGeneratorsOfColumns}( \mbox{\texttt{\mdseries\slshape M}} ) is a matrix whose columns span the right kernel of \mbox{\texttt{\mdseries\slshape M}}, i.e. the $R$-submodule of the free module $R^{(NrColumns( \mbox{\texttt{\mdseries\slshape M}} ) \times 1)}$ consisting of all columns $X$ satisfying $\mbox{\texttt{\mdseries\slshape M}}X=0$. ($\to$ Appendix \ref{Basic_Operations}) }

 

\subsection{\textcolor{Chapter }{SyzygiesGeneratorsOfRows (for pairs of matrices)}}
\logpage{[ 5, 5, 28 ]}\nobreak
\hyperdef{L}{X84A93458804F16F6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SyzygiesGeneratorsOfRows({\mdseries\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{\mdseries\slshape M}} is defined ($R:=$\texttt{HomalgRing}( \mbox{\texttt{\mdseries\slshape M}} )). The matrix of \emph{relative} row syzygies \texttt{SyzygiesGeneratorsOfRows}( \mbox{\texttt{\mdseries\slshape M}}, \mbox{\texttt{\mdseries\slshape M2}} ) is a matrix whose rows span the left kernel of \mbox{\texttt{\mdseries\slshape M}} modulo \mbox{\texttt{\mdseries\slshape M2}}, i.e. the $R$-submodule of the free module $R^{(1 \times NrRows( \mbox{\texttt{\mdseries\slshape M}} ))}$ consisting of all rows $X$ satisfying $X\mbox{\texttt{\mdseries\slshape M}}+Y\mbox{\texttt{\mdseries\slshape M2}}=0$ for some row $Y \in R^{(1 \times NrRows( \mbox{\texttt{\mdseries\slshape M2}} ))}$. ($\to$ Appendix \ref{Basic_Operations}) }

 

\subsection{\textcolor{Chapter }{SyzygiesGeneratorsOfColumns (for pairs of matrices)}}
\logpage{[ 5, 5, 29 ]}\nobreak
\hyperdef{L}{X7D3FC0CE7B63AAF1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SyzygiesGeneratorsOfColumns({\mdseries\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{\mdseries\slshape M}} is defined ($R:=$\texttt{HomalgRing}( \mbox{\texttt{\mdseries\slshape M}} )). The matrix of \emph{relative} column syzygies \texttt{SyzygiesGeneratorsOfColumns}( \mbox{\texttt{\mdseries\slshape M}}, \mbox{\texttt{\mdseries\slshape M2}} ) is a matrix whose columns span the right kernel of \mbox{\texttt{\mdseries\slshape M}} modulo \mbox{\texttt{\mdseries\slshape M2}}, i.e. the $R$-submodule of the free module $R^{(NrColumns( \mbox{\texttt{\mdseries\slshape M}} ) \times 1)}$ consisting of all columns $X$ satisfying $\mbox{\texttt{\mdseries\slshape M}}X+\mbox{\texttt{\mdseries\slshape M2}}Y=0$ for some column $Y \in R^{(NrColumns( \mbox{\texttt{\mdseries\slshape M2}} ) \times 1)}$. ($\to$ Appendix \ref{Basic_Operations}) }

 

\subsection{\textcolor{Chapter }{ReducedBasisOfRowModule (for matrices)}}
\logpage{[ 5, 5, 30 ]}\nobreak
\hyperdef{L}{X82E0FF517DC38040}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ReducedBasisOfRowModule({\mdseries\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{\mdseries\slshape M}} ) but where the matrix \texttt{SyzygiesGeneratorsOfRows}( \texttt{ReducedBasisOfRowModule}( \mbox{\texttt{\mdseries\slshape M}} ) ) contains no units. This can easily be achieved starting from $B:=$\texttt{BasisOfRowModule}( \mbox{\texttt{\mdseries\slshape M}} ) (and using \texttt{GetColumnIndependentUnitPositions} (\ref{GetColumnIndependentUnitPositions:for matrices}) applied to the matrix of row syzygies of $B$, etc). ($\to$ Appendix \ref{Basic_Operations}) }

 

\subsection{\textcolor{Chapter }{ReducedBasisOfColumnModule (for matrices)}}
\logpage{[ 5, 5, 31 ]}\nobreak
\hyperdef{L}{X84CED11F7A633BDA}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ReducedBasisOfColumnModule({\mdseries\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{\mdseries\slshape M}} ) but where the matrix \texttt{SyzygiesGeneratorsOfColumns}( \texttt{ReducedBasisOfColumnModule}( \mbox{\texttt{\mdseries\slshape M}} ) ) contains no units. This can easily be achieved starting from $B:=$\texttt{BasisOfColumnModule}( \mbox{\texttt{\mdseries\slshape M}} ) (and using \texttt{GetRowIndependentUnitPositions} (\ref{GetRowIndependentUnitPositions:for matrices}) applied to the matrix of column syzygies of $B$, etc.). ($\to$ Appendix \ref{Basic_Operations}) }

 

\subsection{\textcolor{Chapter }{ReducedSyzygiesGeneratorsOfRows (for matrices)}}
\logpage{[ 5, 5, 32 ]}\nobreak
\hyperdef{L}{X7DE458D67B9B85BF}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ReducedSyzygiesGeneratorsOfRows({\mdseries\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{\mdseries\slshape M}} ) but where the matrix \texttt{SyzygiesGeneratorsOfRows}( \texttt{ReducedSyzygiesGeneratorsOfRows}( \mbox{\texttt{\mdseries\slshape M}} ) ) contains no units. This can easily be achieved starting from $C:=$\texttt{SyzygiesGeneratorsOfRows}( \mbox{\texttt{\mdseries\slshape M}} ) (and using \texttt{GetColumnIndependentUnitPositions} (\ref{GetColumnIndependentUnitPositions:for matrices}) applied to the matrix of row syzygies of $C$, etc.). ($\to$ Appendix \ref{Basic_Operations}) }

 

\subsection{\textcolor{Chapter }{ReducedSyzygiesGeneratorsOfColumns (for matrices)}}
\logpage{[ 5, 5, 33 ]}\nobreak
\hyperdef{L}{X8699114D7A865C11}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ReducedSyzygiesGeneratorsOfColumns({\mdseries\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{\mdseries\slshape M}} ) but where the matrix \texttt{SyzygiesGeneratorsOfColumns}( \texttt{ReducedSyzygiesGeneratorsOfColumns}( \mbox{\texttt{\mdseries\slshape M}} ) ) contains no units. This can easily be achieved starting from $C:=$\texttt{SyzygiesGeneratorsOfColumns}( \mbox{\texttt{\mdseries\slshape M}} ) (and using \texttt{GetRowIndependentUnitPositions} (\ref{GetRowIndependentUnitPositions:for matrices}) applied to the matrix of column syzygies of $C$, etc.). ($\to$ Appendix \ref{Basic_Operations}) }

 

\subsection{\textcolor{Chapter }{BasisOfRowsCoeff (for matrices)}}
\logpage{[ 5, 5, 34 ]}\nobreak
\hyperdef{L}{X7D9DEC6081AF0003}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{BasisOfRowsCoeff({\mdseries\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{\mdseries\slshape M}} ) and assigns the \emph{void} matrix \mbox{\texttt{\mdseries\slshape T}} ($\to$ \texttt{HomalgVoidMatrix} (\ref{HomalgVoidMatrix:constructor for void matrices})) such that $B = \mbox{\texttt{\mdseries\slshape T}} \mbox{\texttt{\mdseries\slshape M}}$. ($\to$ Appendix \ref{Basic_Operations}) }

 

\subsection{\textcolor{Chapter }{BasisOfColumnsCoeff (for matrices)}}
\logpage{[ 5, 5, 35 ]}\nobreak
\hyperdef{L}{X7BBC885F7C24DEC2}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{BasisOfColumnsCoeff({\mdseries\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{\mdseries\slshape M}} ) and assigns the \emph{void} matrix \mbox{\texttt{\mdseries\slshape T}} ($\to$ \texttt{HomalgVoidMatrix} (\ref{HomalgVoidMatrix:constructor for void matrices})) such that $B = \mbox{\texttt{\mdseries\slshape M}} \mbox{\texttt{\mdseries\slshape T}}$. ($\to$ Appendix \ref{Basic_Operations}) }

 

\subsection{\textcolor{Chapter }{DecideZeroRowsEffectively (for pairs of matrices)}}
\logpage{[ 5, 5, 36 ]}\nobreak
\hyperdef{L}{X8513963C84A9F8CB}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DecideZeroRowsEffectively({\mdseries\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{\mdseries\slshape A}}, \mbox{\texttt{\mdseries\slshape B}} ) and assigns the \emph{void} matrix \mbox{\texttt{\mdseries\slshape T}} ($\to$ \texttt{HomalgVoidMatrix} (\ref{HomalgVoidMatrix:constructor for void matrices})) such that $M = \mbox{\texttt{\mdseries\slshape A}} + \mbox{\texttt{\mdseries\slshape T}}\mbox{\texttt{\mdseries\slshape B}}$. ($\to$ Appendix \ref{Basic_Operations}) }

 

\subsection{\textcolor{Chapter }{DecideZeroColumnsEffectively (for pairs of matrices)}}
\logpage{[ 5, 5, 37 ]}\nobreak
\hyperdef{L}{X7A06BF7779830815}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DecideZeroColumnsEffectively({\mdseries\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{\mdseries\slshape A}}, \mbox{\texttt{\mdseries\slshape B}} ) and assigns the \emph{void} matrix \mbox{\texttt{\mdseries\slshape T}} ($\to$ \texttt{HomalgVoidMatrix} (\ref{HomalgVoidMatrix:constructor for void matrices})) such that $M = \mbox{\texttt{\mdseries\slshape A}} + \mbox{\texttt{\mdseries\slshape B}}\mbox{\texttt{\mdseries\slshape T}}$. ($\to$ Appendix \ref{Basic_Operations}) }

 

\subsection{\textcolor{Chapter }{BasisOfRows (for matrices)}}
\logpage{[ 5, 5, 38 ]}\nobreak
\hyperdef{L}{X81ABDA3E7D94C661}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{BasisOfRows({\mdseries\slshape M})\index{BasisOfRows@\texttt{BasisOfRows}!for matrices}
\label{BasisOfRows:for matrices}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{BasisOfRows({\mdseries\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{[ 5, 5, 39 ]}\nobreak
\hyperdef{L}{X83A5B51980FFDE53}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{BasisOfColumns({\mdseries\slshape M})\index{BasisOfColumns@\texttt{BasisOfColumns}!for matrices}
\label{BasisOfColumns:for matrices}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{BasisOfColumns({\mdseries\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{[ 5, 5, 40 ]}\nobreak
\hyperdef{L}{X85C980288304B4AC}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DecideZero({\mdseries\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 ring relations",
          [ IsHomalgMatrix, IsHomalgRingRelations ],
          
    function( mat, rel )
      
      return DecideZero( mat,  MatrixOfRelations( rel ) );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{SyzygiesOfRows (for matrices)}}
\logpage{[ 5, 5, 41 ]}\nobreak
\hyperdef{L}{X86C93ABD857447F8}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SyzygiesOfRows({\mdseries\slshape M})\index{SyzygiesOfRows@\texttt{SyzygiesOfRows}!for matrices}
\label{SyzygiesOfRows:for matrices}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SyzygiesOfRows({\mdseries\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{[ 5, 5, 42 ]}\nobreak
\hyperdef{L}{X80325CAD7CE56F4F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SyzygiesOfColumns({\mdseries\slshape M})\index{SyzygiesOfColumns@\texttt{SyzygiesOfColumns}!for matrices}
\label{SyzygiesOfColumns:for matrices}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SyzygiesOfColumns({\mdseries\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{[ 5, 5, 43 ]}\nobreak
\hyperdef{L}{X86A798D4850BF9E8}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ReducedSyzygiesOfRows({\mdseries\slshape M})\index{ReducedSyzygiesOfRows@\texttt{ReducedSyzygiesOfRows}!for matrices}
\label{ReducedSyzygiesOfRows:for matrices}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ReducedSyzygiesOfRows({\mdseries\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{\mdseries\slshape M}}, \mbox{\texttt{\mdseries\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{[ 5, 5, 44 ]}\nobreak
\hyperdef{L}{X8766BBD578557D15}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ReducedSyzygiesOfColumns({\mdseries\slshape M})\index{ReducedSyzygiesOfColumns@\texttt{ReducedSyzygiesOfColumns}!for matrices}
\label{ReducedSyzygiesOfColumns:for matrices}
}\hfill{\scriptsize (operation)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ReducedSyzygiesOfColumns({\mdseries\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{\mdseries\slshape M}}, \mbox{\texttt{\mdseries\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{[ 5, 5, 45 ]}\nobreak
\hyperdef{L}{X850AEC9C7C00AFF5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RightDivide({\mdseries\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{\mdseries\slshape B}} and \mbox{\texttt{\mdseries\slshape A}} be matrices having the same number of columns and defined over the same ring.
The matrix \texttt{RightDivide}( \mbox{\texttt{\mdseries\slshape B}}, \mbox{\texttt{\mdseries\slshape A}} ) is a particular solution of the inhomogeneous (one sided) linear system of
equations $X\mbox{\texttt{\mdseries\slshape A}}=\mbox{\texttt{\mdseries\slshape B}}$ in case it is solvable. Otherwise \texttt{false} is returned. The name \texttt{RightDivide} suggests ``$X=\mbox{\texttt{\mdseries\slshape B}}\mbox{\texttt{\mdseries\slshape A}}^{-1}$''. This generalizes \texttt{LeftInverse} (\ref{LeftInverse:for matrices}) for which \mbox{\texttt{\mdseries\slshape B}} becomes the identity matrix. ($\to$ \texttt{SyzygiesGeneratorsOfRows} (\ref{SyzygiesGeneratorsOfRows:for matrices})) }

 

\subsection{\textcolor{Chapter }{LeftDivide (for pairs of matrices)}}
\logpage{[ 5, 5, 46 ]}\nobreak
\hyperdef{L}{X7D0EAF527F8514E0}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{LeftDivide({\mdseries\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{\mdseries\slshape A}} and \mbox{\texttt{\mdseries\slshape B}} be matrices having the same number of rows and defined over the same ring. The
matrix \texttt{LeftDivide}( \mbox{\texttt{\mdseries\slshape A}}, \mbox{\texttt{\mdseries\slshape B}} ) is a particular solution of the inhomogeneous (one sided) linear system of
equations $\mbox{\texttt{\mdseries\slshape A}}X=\mbox{\texttt{\mdseries\slshape B}}$ in case it is solvable. Otherwise \texttt{false} is returned. The name \texttt{LeftDivide} suggests ``$X=\mbox{\texttt{\mdseries\slshape A}}^{-1}\mbox{\texttt{\mdseries\slshape B}}$''. This generalizes \texttt{RightInverse} (\ref{RightInverse:for matrices}) for which \mbox{\texttt{\mdseries\slshape B}} becomes the identity matrix. ($\to$ \texttt{SyzygiesGeneratorsOfColumns} (\ref{SyzygiesGeneratorsOfColumns:for matrices})) }

 

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



 Let \mbox{\texttt{\mdseries\slshape B}}, \mbox{\texttt{\mdseries\slshape A}} and \mbox{\texttt{\mdseries\slshape L}} be matrices having the same number of columns and defined over the same ring.
The matrix \texttt{RightDivide}( \mbox{\texttt{\mdseries\slshape B}}, \mbox{\texttt{\mdseries\slshape A}}, \mbox{\texttt{\mdseries\slshape L}} ) is a particular solution of the inhomogeneous (one sided) linear system of
equations $X\mbox{\texttt{\mdseries\slshape A}}+Y\mbox{\texttt{\mdseries\slshape L}}=\mbox{\texttt{\mdseries\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{\mdseries\slshape B}}\mbox{\texttt{\mdseries\slshape A}}^{-1}$ modulo \mbox{\texttt{\mdseries\slshape L}}''. (Cf. \cite[Subsection 3.1.1]{BR}) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( RightDivide,
          "for homalg matrices",
          [ IsHomalgMatrix, IsHomalgMatrix, IsHomalgMatrix ],
          
    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 := BasisOfRows( L );
      
      ## first reduce A modulo L
      ZA := DecideZeroRows( A, BL );
      
      AL := UnionOfRows( ZA, BL );
      
      ## CA * AL = IAL
      CA := HomalgVoidMatrix( R );
      IAL := BasisOfRows( AL, CA );
      
      ## also reduce B modulo L
      ZB := DecideZeroRows( B, BL );
      
      ## knowing this will avoid computations
      IsOne( 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 fail;
      fi;
      
      ## CD = -CB * CA => CD * A = B
      X := -CB * CertainColumns( CA, [ 1 .. NrRows( A ) ] );
      
      ## check assertion
      Assert( 5, IsZero( DecideZeroRows( X * A - B, BL ) ) );
      
      return X;
      
      ## technical: -CB * CA := (-CB) * CA and COLEM should take over
      ## since CB := -matrix
      
  end );
\end{Verbatim}
 }

 

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



 Let \mbox{\texttt{\mdseries\slshape A}}, \mbox{\texttt{\mdseries\slshape B}} and \mbox{\texttt{\mdseries\slshape L}} be matrices having the same number of columns and defined over the same ring.
The matrix \texttt{LeftDivide}( \mbox{\texttt{\mdseries\slshape A}}, \mbox{\texttt{\mdseries\slshape B}}, \mbox{\texttt{\mdseries\slshape L}} ) is a particular solution of the inhomogeneous (one sided) linear system of
equations $\mbox{\texttt{\mdseries\slshape A}}X+\mbox{\texttt{\mdseries\slshape L}}Y=\mbox{\texttt{\mdseries\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{\mdseries\slshape A}}^{-1}\mbox{\texttt{\mdseries\slshape B}}$ modulo \mbox{\texttt{\mdseries\slshape L}}''. (Cf. \cite[Subsection 3.1.1]{BR}) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( LeftDivide,
          "for homalg matrices",
          [ IsHomalgMatrix, IsHomalgMatrix, IsHomalgMatrix ],
          
    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 := BasisOfColumns( L );
      
      ## first reduce A modulo L
      ZA := DecideZeroColumns( A, BL );
      
      AL := UnionOfColumns( ZA, BL );
      
      ## AL * CA = IAL
      CA := HomalgVoidMatrix( R );
      IAL := BasisOfColumns( AL, CA );
      
      ## also reduce B modulo L
      ZB := DecideZeroColumns( B, BL );
      
      ## knowing this will avoid computations
      IsOne( 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 fail;
      fi;
      
      ## CD = CA * -CB => A * CD = B
      X := CertainRows( CA, [ 1 .. NrColumns( A ) ] ) * -CB;
      
      ## check assertion
      Assert( 5, IsZero( DecideZeroColumns( A * X - B, BL ) ) );
      
      return X;
      
      ## technical: CA * -CB := CA * (-CB) and COLEM should take over since
      ## CB := -matrix
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{GenerateSameRowModule (for pairs of matrices)}}
\logpage{[ 5, 5, 49 ]}\nobreak
\hyperdef{L}{X82B2C4987D6D5BD3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{GenerateSameRowModule({\mdseries\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{\mdseries\slshape M}} and of \mbox{\texttt{\mdseries\slshape N}} are identical or not ($\to$ \texttt{RightDivide} (\ref{RightDivide:for pairs of matrices})). }

 

\subsection{\textcolor{Chapter }{GenerateSameColumnModule (for pairs of matrices)}}
\logpage{[ 5, 5, 50 ]}\nobreak
\hyperdef{L}{X867A947682754A9A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{GenerateSameColumnModule({\mdseries\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{\mdseries\slshape M}} and of \mbox{\texttt{\mdseries\slshape N}} are identical or not ($\to$ \texttt{LeftDivide} (\ref{LeftDivide:for pairs of matrices})). }

 }

  }

   
\chapter{\textcolor{Chapter }{Ring Relations}}\label{RingRelations}
\logpage{[ 6, 0, 0 ]}
\hyperdef{L}{X8163F0658017F220}{}
{
  
\section{\textcolor{Chapter }{Ring Relations: Categories and Representations}}\label{RingRelations:Category}
\logpage{[ 6, 1, 0 ]}
\hyperdef{L}{X7EB7C20C78788C69}{}
{
  

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



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

 

\subsection{\textcolor{Chapter }{IsHomalgRingRelationsAsGeneratorsOfLeftIdeal}}
\logpage{[ 6, 1, 2 ]}\nobreak
\hyperdef{L}{X7DECADD683403C65}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgRingRelationsAsGeneratorsOfLeftIdeal({\mdseries\slshape rel})\index{IsHomalgRingRelationsAsGeneratorsOfLeftIdeal@\texttt{IsHomalg}\-\texttt{Ring}\-\texttt{Relations}\-\texttt{As}\-\texttt{Generators}\-\texttt{Of}\-\texttt{Left}\-\texttt{Ideal}}
\label{IsHomalgRingRelationsAsGeneratorsOfLeftIdeal}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} ring relations as generators of a left ideal. 

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

 

\subsection{\textcolor{Chapter }{IsHomalgRingRelationsAsGeneratorsOfRightIdeal}}
\logpage{[ 6, 1, 3 ]}\nobreak
\hyperdef{L}{X78746A217FEEB058}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsHomalgRingRelationsAsGeneratorsOfRightIdeal({\mdseries\slshape rel})\index{IsHomalgRingRelationsAsGeneratorsOfRightIdeal@\texttt{IsHomalg}\-\texttt{Ring}\-\texttt{Relations}\-\texttt{As}\-\texttt{Generators}\-\texttt{Of}\-\texttt{Right}\-\texttt{Ideal}}
\label{IsHomalgRingRelationsAsGeneratorsOfRightIdeal}
}\hfill{\scriptsize (Category)}}\\
\textbf{\indent Returns:\ }
\texttt{true} or \texttt{false}



 The \textsf{GAP} category of \textsf{homalg} ring relations as generators of a right ideal. 

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

 

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



 The \textsf{GAP} representation of a finite set of relations of a \textsf{homalg} ring. 

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

 }

 
\section{\textcolor{Chapter }{Ring Relations: Constructors}}\label{RingRelations:Constructors}
\logpage{[ 6, 2, 0 ]}
\hyperdef{L}{X81D1405F81B86E4B}{}
{
  }

 
\section{\textcolor{Chapter }{Ring Relations: Properties}}\label{RingRelations:Properties}
\logpage{[ 6, 3, 0 ]}
\hyperdef{L}{X7FFB5DE07BB77319}{}
{
  

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



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

 

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



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

 }

 
\section{\textcolor{Chapter }{Ring Relations: Attributes}}\label{RingRelations:Attributes}
\logpage{[ 6, 4, 0 ]}
\hyperdef{L}{X849ED71B8164D1C2}{}
{
  }

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

  }

 

\appendix


\chapter{\textcolor{Chapter }{The Basic Matrix Operations}}\label{Basic_Operations}
\logpage{[ "A", 0, 0 ]}
\hyperdef{L}{X7CB422647C7DD289}{}
{
  These are the operations used to solve one-sided (in)homogeneous linear
systems $XA=B$ resp. $AX=B$.  
\section{\textcolor{Chapter }{Main}}\label{Main}
\logpage{[ "A", 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{[ "A", 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{[ "A", 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{[ "A", 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{[ "B", 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{[ "B", 1, 0 ]}
\hyperdef{L}{X7E6D7EAE78DAE6B0}{}
{
  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 }{InitialMatrix (homalgTable entry for initial matrices)}}
\logpage{[ "B", 1, 1 ]}\nobreak
\hyperdef{L}{X7DBA33F083A317B5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{InitialMatrix({\mdseries\slshape C})\index{InitialMatrix@\texttt{InitialMatrix}!homalgTable entry for initial matrices}
\label{InitialMatrix:homalgTable entry for initial matrices}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\mdseries\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\mdseries\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{InitialMatrix} is bound then the method \texttt{Eval} (\ref{Eval:for matrices created with HomalgInitialMatrix}) resets the filter \texttt{IsInitialMatrix} and returns $RP$!.\texttt{InitialMatrix}$( \mbox{\texttt{\mdseries\slshape C}} )$. }

 

\subsection{\textcolor{Chapter }{InitialIdentityMatrix (homalgTable entry for initial identity matrices)}}
\logpage{[ "B", 1, 2 ]}\nobreak
\hyperdef{L}{X84179BE87E7DCE76}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{InitialIdentityMatrix({\mdseries\slshape C})\index{InitialIdentityMatrix@\texttt{InitialIdentityMatrix}!homalgTable entry for initial identity matrices}
\label{InitialIdentityMatrix:homalgTable entry for initial identity matrices}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
the \texttt{Eval} value of a \textsf{homalg} matrix \mbox{\texttt{\mdseries\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\mdseries\slshape C}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{InitialIdentityMatrix} is bound then the method \texttt{Eval} (\ref{Eval:for matrices created with HomalgInitialIdentityMatrix}) resets the filter \texttt{IsInitialIdentityMatrix} and returns $RP$!.\texttt{InitialIdentityMatrix}$( \mbox{\texttt{\mdseries\slshape C}} )$. }

 

\subsection{\textcolor{Chapter }{ZeroMatrix (homalgTable entry)}}
\logpage{[ "B", 1, 3 ]}\nobreak
\hyperdef{L}{X785390E38396CAEB}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ZeroMatrix({\mdseries\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{\mdseries\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\mdseries\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{\mdseries\slshape C}} )$. }

 

\subsection{\textcolor{Chapter }{IdentityMatrix (homalgTable entry)}}
\logpage{[ "B", 1, 4 ]}\nobreak
\hyperdef{L}{X87BFF3567DEEBEF4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IdentityMatrix({\mdseries\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{\mdseries\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\mdseries\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{\mdseries\slshape C}} )$. }

 

\subsection{\textcolor{Chapter }{Involution (homalgTable entry)}}
\logpage{[ "B", 1, 5 ]}\nobreak
\hyperdef{L}{X85884C3178473521}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Involution({\mdseries\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{\mdseries\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\mdseries\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{\mdseries\slshape C}} ) = \mbox{\texttt{\mdseries\slshape M}}$. }

 

\subsection{\textcolor{Chapter }{CertainRows (homalgTable entry)}}
\logpage{[ "B", 1, 6 ]}\nobreak
\hyperdef{L}{X7B6FC3267CD9EE9D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CertainRows({\mdseries\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{\mdseries\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\mdseries\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{\mdseries\slshape C}} ) = [ \mbox{\texttt{\mdseries\slshape M}}, \mbox{\texttt{\mdseries\slshape plist}} ]$. }

 

\subsection{\textcolor{Chapter }{CertainColumns (homalgTable entry)}}
\logpage{[ "B", 1, 7 ]}\nobreak
\hyperdef{L}{X78EADFC67D17CF04}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CertainColumns({\mdseries\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{\mdseries\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\mdseries\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{\mdseries\slshape C}} ) = [ \mbox{\texttt{\mdseries\slshape M}}, \mbox{\texttt{\mdseries\slshape plist}} ]$. }

 

\subsection{\textcolor{Chapter }{UnionOfRows (homalgTable entry)}}
\logpage{[ "B", 1, 8 ]}\nobreak
\hyperdef{L}{X7DEB535782A3323E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{UnionOfRows({\mdseries\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{\mdseries\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\mdseries\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{\mdseries\slshape C}} ) = [ \mbox{\texttt{\mdseries\slshape A}}, \mbox{\texttt{\mdseries\slshape B}} ]$. }

 

\subsection{\textcolor{Chapter }{UnionOfColumns (homalgTable entry)}}
\logpage{[ "B", 1, 9 ]}\nobreak
\hyperdef{L}{X7DF5DB55836D13A7}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{UnionOfColumns({\mdseries\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{\mdseries\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\mdseries\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{\mdseries\slshape C}} ) = [ \mbox{\texttt{\mdseries\slshape A}}, \mbox{\texttt{\mdseries\slshape B}} ]$. }

 

\subsection{\textcolor{Chapter }{DiagMat (homalgTable entry)}}
\logpage{[ "B", 1, 10 ]}\nobreak
\hyperdef{L}{X86C5B86981FA1F9A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DiagMat({\mdseries\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{\mdseries\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\mdseries\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{\mdseries\slshape C}} ) = \mbox{\texttt{\mdseries\slshape e}}$. }

 

\subsection{\textcolor{Chapter }{KroneckerMat (homalgTable entry)}}
\logpage{[ "B", 1, 11 ]}\nobreak
\hyperdef{L}{X82202A6A7FAB7174}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{KroneckerMat({\mdseries\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{\mdseries\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\mdseries\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{\mdseries\slshape C}} ) = [ \mbox{\texttt{\mdseries\slshape A}}, \mbox{\texttt{\mdseries\slshape B}} ]$. }

 

\subsection{\textcolor{Chapter }{MulMat (homalgTable entry)}}
\logpage{[ "B", 1, 12 ]}\nobreak
\hyperdef{L}{X828F8C7785EEC3D1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{MulMat({\mdseries\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{\mdseries\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\mdseries\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{\mdseries\slshape C}} ) = [ \mbox{\texttt{\mdseries\slshape a}}, \mbox{\texttt{\mdseries\slshape A}} ]$. }

 

\subsection{\textcolor{Chapter }{AddMat (homalgTable entry)}}
\logpage{[ "B", 1, 13 ]}\nobreak
\hyperdef{L}{X7B0B12F080A90039}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AddMat({\mdseries\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{\mdseries\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\mdseries\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{\mdseries\slshape C}} ) = [ \mbox{\texttt{\mdseries\slshape A}}, \mbox{\texttt{\mdseries\slshape B}} ]$. }

 

\subsection{\textcolor{Chapter }{SubMat (homalgTable entry)}}
\logpage{[ "B", 1, 14 ]}\nobreak
\hyperdef{L}{X7FE11AA27AE7D2D7}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SubMat({\mdseries\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{\mdseries\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\mdseries\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{\mdseries\slshape C}} ) = [ \mbox{\texttt{\mdseries\slshape A}}, \mbox{\texttt{\mdseries\slshape B}} ]$. }

 

\subsection{\textcolor{Chapter }{Compose (homalgTable entry)}}
\logpage{[ "B", 1, 15 ]}\nobreak
\hyperdef{L}{X7D491D957E63C3A4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Compose({\mdseries\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{\mdseries\slshape C}}



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\mdseries\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{\mdseries\slshape C}} ) = [ \mbox{\texttt{\mdseries\slshape A}}, \mbox{\texttt{\mdseries\slshape B}} ]$. }

 

\subsection{\textcolor{Chapter }{IsZeroMatrix (homalgTable entry)}}
\logpage{[ "B", 1, 16 ]}\nobreak
\hyperdef{L}{X849BB912798A01EB}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsZeroMatrix({\mdseries\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{\mdseries\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{\mdseries\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{[ "B", 1, 17 ]}\nobreak
\hyperdef{L}{X7AE057CF7C6B0EE0}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NrRows({\mdseries\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{\mdseries\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{\mdseries\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 of the non-internal ring\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      return Length( Eval( C )!.matrix );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{NrColumns (homalgTable entry)}}
\logpage{[ "B", 1, 18 ]}\nobreak
\hyperdef{L}{X7D8E706887116F30}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NrColumns({\mdseries\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{\mdseries\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{\mdseries\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 of the non-internal ring\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{[ "B", 1, 19 ]}\nobreak
\hyperdef{L}{X80A573257D7F2E1A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Determinant({\mdseries\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{\mdseries\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{\mdseries\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 a square matrix\n" );
      fi;
      
      if IsEmptyMatrix( C ) then
          return One( R );
      elif IsZero( C ) then
          return Zero( R );
      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 of the non-internal ring\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{[ "B", 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{[ "B", 2, 1 ]}\nobreak
\hyperdef{L}{X7871FE5478BFC167}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AreEqualMatrices({\mdseries\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{\mdseries\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{\mdseries\slshape M1}}, \mbox{\texttt{\mdseries\slshape M2}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( \=,
          "for homalg comparable matrices",
          [ IsHomalgMatrix, IsHomalgMatrix ],
          
    function( M1, M2 )
      local R, RP, are_equal;
      
      ## do not touch mutable matrices
      if not ( IsMutable( M1 ) or IsMutable( M2 ) ) then
          
          if IsBound( M1!.AreEqual ) then
              are_equal := _ElmWPObj_ForHomalg( M1!.AreEqual, M2, fail );
              if are_equal <> fail then
                  return are_equal;
              fi;
          else
              M1!.AreEqual :=
                ContainerForWeakPointers(
                        TheTypeContainerForWeakPointersOnComputedValues,
                        [ "operation", "AreEqual" ] );
          fi;
          
          if IsBound( M2!.AreEqual ) then
              are_equal := _ElmWPObj_ForHomalg( M2!.AreEqual, M1, fail );
              if are_equal <> fail then
                  return are_equal;
              fi;
          fi;
          ## do not store things symmetrically below to ``save'' memory
          
      fi;
      
      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)!
          are_equal := 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)!
          are_equal := RP!.Equal( M1, M2 );
      elif IsBound(RP!.IsZeroMatrix) then   ## ensuring this avoids infinite loops
          are_equal := IsZero( M1 - M2 );
      fi;
      
      if IsBound( are_equal ) then
          
          ## do not touch mutable matrices
          if not ( IsMutable( M1 ) or IsMutable( M2 ) ) then
              
              if are_equal then
                  MatchPropertiesAndAttributes( M1, M2,
                          LIMAT.intrinsic_properties,
                          LIMAT.intrinsic_attributes,
                          LIMAT.intrinsic_components
                          );
              fi;
              
              ## do not store things symmetrically to ``save'' memory
              _AddTwoElmWPObj_ForHomalg( M1!.AreEqual, M2, are_equal );
              
          fi;
          
          return are_equal;
      fi;
      
      TryNextMethod( );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsIdentityMatrix (homalgTable entry)}}
\logpage{[ "B", 2, 2 ]}\nobreak
\hyperdef{L}{X80C1856D82172268}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsIdentityMatrix({\mdseries\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{\mdseries\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{IsOne} (\ref{IsOne}) shown below returns $RP$!.\texttt{IsIdentityMatrix}$( \mbox{\texttt{\mdseries\slshape M}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( IsOne,
          "for homalg matrices",
          [ IsHomalgMatrix ],
          
    function( M )
      local R, RP;
      
      if NrRows( M ) <> NrColumns( M ) then
          return false;
      fi;
      
      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{[ "B", 2, 3 ]}\nobreak
\hyperdef{L}{X7B6420E88418316B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsDiagonalMatrix({\mdseries\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{\mdseries\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{\mdseries\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{[ "B", 2, 4 ]}\nobreak
\hyperdef{L}{X872B70367F412945}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ZeroRows({\mdseries\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{\mdseries\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{\mdseries\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{[ "B", 2, 5 ]}\nobreak
\hyperdef{L}{X7A469E6D7EA63BB6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ZeroColumns({\mdseries\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{\mdseries\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{\mdseries\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{[ "B", 2, 6 ]}\nobreak
\hyperdef{L}{X7BCBACDB79C96FBF}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{GetColumnIndependentUnitPositions({\mdseries\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{\mdseries\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}) shown below returns $RP$!.\texttt{GetColumnIndependentUnitPositions}$( \mbox{\texttt{\mdseries\slshape M}}, \mbox{\texttt{\mdseries\slshape poslist}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( GetColumnIndependentUnitPositions,
          "for homalg matrices",
          [ IsHomalgMatrix, IsHomogeneousList ],
          
    function( M, poslist )
      local cache, R, RP, rest, pos, i, j, k;
      
      if IsBound( M!.GetColumnIndependentUnitPositions ) then
          cache := M!.GetColumnIndependentUnitPositions;
          if IsBound( cache.(String( poslist )) ) then
              return cache.(String( poslist ));
          fi;
      else
          cache := rec( );
          M!.GetColumnIndependentUnitPositions := cache;
      fi;
      
      R := HomalgRing( M );
      
      RP := homalgTable( R );
      
      if IsBound(RP!.GetColumnIndependentUnitPositions) then
          pos := RP!.GetColumnIndependentUnitPositions( M, poslist );
          if pos <> [ ] then
              SetIsZero( M, false );
          fi;
          cache.(String( poslist )) := pos;
          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, MatElm( M, i, k ) ) then
                  Add( pos, [ i, k ] );
                  rest := Filtered( rest,
                                  a -> IsZero( MatElm( M, i, a ) ) );
                  break;
              fi;
          od;
      od;
      
      if pos <> [ ] then
          SetIsZero( M, false );
      fi;
      
      cache.(String( poslist )) := pos;
      
      return pos;
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{GetRowIndependentUnitPositions (homalgTable entry)}}
\logpage{[ "B", 2, 7 ]}\nobreak
\hyperdef{L}{X855C57B6822E7A98}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{GetRowIndependentUnitPositions({\mdseries\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{\mdseries\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}) shown below returns $RP$!.\texttt{GetRowIndependentUnitPositions}$( \mbox{\texttt{\mdseries\slshape M}}, \mbox{\texttt{\mdseries\slshape poslist}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( GetRowIndependentUnitPositions,
          "for homalg matrices",
          [ IsHomalgMatrix, IsHomogeneousList ],
          
    function( M, poslist )
      local cache, R, RP, rest, pos, j, i, k;
      
      if IsBound( M!.GetRowIndependentUnitPositions ) then
          cache := M!.GetRowIndependentUnitPositions;
          if IsBound( cache.(String( poslist )) ) then
              return cache.(String( poslist ));
          fi;
      else
          cache := rec( );
          M!.GetRowIndependentUnitPositions := cache;
      fi;
      
      R := HomalgRing( M );
      
      RP := homalgTable( R );
      
      if IsBound(RP!.GetRowIndependentUnitPositions) then
          pos := RP!.GetRowIndependentUnitPositions( M, poslist );
          if pos <> [ ] then
              SetIsZero( M, false );
          fi;
          cache.( String( poslist ) ) := pos;
          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, MatElm( M, k, j ) ) then
                  Add( pos, [ j, k ] );
                  rest := Filtered( rest,
                                  a -> IsZero( MatElm( M, a, j ) ) );
                  break;
              fi;
          od;
      od;
      
      if pos <> [ ] then
          SetIsZero( M, false );
      fi;
      
      cache.( String( poslist ) ) := pos;
      
      return pos;
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{GetUnitPosition (homalgTable entry)}}
\logpage{[ "B", 2, 8 ]}\nobreak
\hyperdef{L}{X876495AA79063CDE}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{GetUnitPosition({\mdseries\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{\mdseries\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}) shown below returns $RP$!.\texttt{GetUnitPosition}$( \mbox{\texttt{\mdseries\slshape M}}, \mbox{\texttt{\mdseries\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, MatElm( M, i, j ) ) then
                  SetIsZero( M, false );
                  return [ i, j ];
              fi;
          od;
      od;
      
      return fail;
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{PositionOfFirstNonZeroEntryPerRow (homalgTable entry)}}
\logpage{[ "B", 2, 9 ]}\nobreak
\hyperdef{L}{X7F40B57079CF80ED}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PositionOfFirstNonZeroEntryPerRow({\mdseries\slshape M, poslist})\index{PositionOfFirstNonZeroEntryPerRow@\texttt{PositionOfFirstNonZeroEntryPerRow}!homalgTable entry}
\label{PositionOfFirstNonZeroEntryPerRow:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a list of nonnegative integers



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\mdseries\slshape M}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{PositionOfFirstNonZeroEntryPerRow} is bound then the standard method of the attribute \texttt{PositionOfFirstNonZeroEntryPerRow} (\ref{PositionOfFirstNonZeroEntryPerRow}) shown below returns $RP$!.\texttt{PositionOfFirstNonZeroEntryPerRow}$( \mbox{\texttt{\mdseries\slshape M}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( PositionOfFirstNonZeroEntryPerRow,
          "for homalg matrices",
          [ IsHomalgMatrix ],
          
    function( M )
      local R, RP, pos, entries, r, c, i, k, j;
      
      R := HomalgRing( M );
      
      RP := homalgTable( R );
      
      if IsBound(RP!.PositionOfFirstNonZeroEntryPerRow) then
          return RP!.PositionOfFirstNonZeroEntryPerRow( M );
      elif IsBound(RP!.PositionOfFirstNonZeroEntryPerColumn) then
          return PositionOfFirstNonZeroEntryPerColumn( Involution( M ) );
      fi;
      
      #=====# the fallback method #=====#
      
      entries := EntriesOfHomalgMatrix( M );
      
      r := NrRows( M );
      c := NrColumns( M );
      
      pos := ListWithIdenticalEntries( r, 0 );
      
      for i in [ 1 .. r ] do
          k := (i - 1) * c;
          for j in [ 1 .. c ] do
              if not IsZero( entries[k + j] ) then
                  pos[i] := j;
                  break;
              fi;
          od;
      od;
      
      return pos;
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{PositionOfFirstNonZeroEntryPerColumn (homalgTable entry)}}
\logpage{[ "B", 2, 10 ]}\nobreak
\hyperdef{L}{X833B384278492266}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{PositionOfFirstNonZeroEntryPerColumn({\mdseries\slshape M, poslist})\index{PositionOfFirstNonZeroEntryPerColumn@\texttt{Position}\-\texttt{Of}\-\texttt{First}\-\texttt{Non}\-\texttt{Zero}\-\texttt{Entry}\-\texttt{Per}\-\texttt{Column}!homalgTable entry}
\label{PositionOfFirstNonZeroEntryPerColumn:homalgTable entry}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a list of nonnegative integers



 Let $R :=$ \texttt{HomalgRing}$( \mbox{\texttt{\mdseries\slshape M}} )$ and $RP :=$ \texttt{homalgTable}$( R )$. If the \texttt{homalgTable} component $RP$!.\texttt{PositionOfFirstNonZeroEntryPerColumn} is bound then the standard method of the attribute \texttt{PositionOfFirstNonZeroEntryPerColumn} (\ref{PositionOfFirstNonZeroEntryPerColumn}) shown below returns $RP$!.\texttt{PositionOfFirstNonZeroEntryPerColumn}$( \mbox{\texttt{\mdseries\slshape M}} )$. 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( PositionOfFirstNonZeroEntryPerColumn,
          "for homalg matrices",
          [ IsHomalgMatrix ],
          
    function( M )
      local R, RP, pos, entries, r, c, j, i, k;
      
      R := HomalgRing( M );
      
      RP := homalgTable( R );
      
      if IsBound(RP!.PositionOfFirstNonZeroEntryPerColumn) then
          return RP!.PositionOfFirstNonZeroEntryPerColumn( M );
      elif IsBound(RP!.PositionOfFirstNonZeroEntryPerRow) then
          return PositionOfFirstNonZeroEntryPerRow( Involution( M ) );
      fi;
      
      #=====# the fallback method #=====#
      
      entries := EntriesOfHomalgMatrix( M );
      
      r := NrRows( M );
      c := NrColumns( M );
      
      pos := ListWithIdenticalEntries( c, 0 );
      
      for j in [ 1 .. c ] do
          for i in [ 1 .. r ] do
              k := (i - 1) * c;
              if not IsZero( entries[k + j] ) then
                  pos[j] := i;
                  break;
              fi;
          od;
      od;
      
      return pos;
      
  end );
\end{Verbatim}
 }

 }

  }


\chapter{\textcolor{Chapter }{Logic Subpackages}}\label{Logic}
\logpage{[ "C", 0, 0 ]}
\hyperdef{L}{X8222352C78A19214}{}
{
  
\section{\textcolor{Chapter }{\textsf{LIRNG}: Logical Implications for Rings}}\label{Rings:LIRNG}
\logpage{[ "C", 1, 0 ]}
\hyperdef{L}{X7DE389C07CF06C01}{}
{
  }

 
\section{\textcolor{Chapter }{\textsf{LIMAP}: Logical Implications for Ring Maps}}\label{RingMaps:LIMAP}
\logpage{[ "C", 2, 0 ]}
\hyperdef{L}{X85DDAFCE84FAA317}{}
{
  }

 
\section{\textcolor{Chapter }{\textsf{LIMAT}: Logical Implications for Matrices}}\label{Matrices:LIMAT}
\logpage{[ "C", 3, 0 ]}
\hyperdef{L}{X86489E427D72B7E9}{}
{
  }

 
\section{\textcolor{Chapter }{\textsf{COLEM}: Clever Operations for Lazy Evaluated Matrices}}\label{Matrices:COLEM}
\logpage{[ "C", 4, 0 ]}
\hyperdef{L}{X7BC2CDB37CB0582C}{}
{
  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{[ "C", 4, 1 ]}\nobreak
\hyperdef{L}{X7EEAADA6807A5A45}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eval({\mdseries\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{\mdseries\slshape C}}



 In case the matrix \mbox{\texttt{\mdseries\slshape C}} was created using \texttt{HomalgInitialMatrix} (\ref{HomalgInitialMatrix:constructor for initial matrices filled with zeros}) then the filter \texttt{IsInitialMatrix} for \mbox{\texttt{\mdseries\slshape C}} is set to true and the \texttt{homalgTable} function ($\to$ \texttt{InitialMatrix} (\ref{InitialMatrix: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!.InitialMatrix ) then
          ResetFilterObj( C, IsInitialMatrix );
          return RP!.InitialMatrix( C );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called InitialMatrix 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{[ "C", 4, 2 ]}\nobreak
\hyperdef{L}{X7B619CA885024F0F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eval({\mdseries\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{\mdseries\slshape C}}



 In case the matrix \mbox{\texttt{\mdseries\slshape C}} 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{\mdseries\slshape C}} is set to true and the \texttt{homalgTable} function ($\to$ \texttt{InitialIdentityMatrix} (\ref{InitialIdentityMatrix: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!.InitialIdentityMatrix ) then
          ResetFilterObj( C, IsInitialIdentityMatrix );
          return RP!.InitialIdentityMatrix( C );
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called InitialIdentityMatrix 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{[ "C", 4, 3 ]}\nobreak
\hyperdef{L}{X7EADAA3180A84318}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eval({\mdseries\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{\mdseries\slshape C}}



 In case the matrix \mbox{\texttt{\mdseries\slshape C}} was created using \texttt{HomalgZeroMatrix} (\ref{HomalgZeroMatrix:constructor for zero matrices}) then the filter \texttt{IsZeroMatrix} for \mbox{\texttt{\mdseries\slshape C}} 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 ",
                 "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{[ "C", 4, 4 ]}\nobreak
\hyperdef{L}{X78CCA57B84E51834}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eval({\mdseries\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{\mdseries\slshape C}}



 In case the matrix \mbox{\texttt{\mdseries\slshape C}} was created using \texttt{HomalgIdentityMatrix} (\ref{HomalgIdentityMatrix:constructor for identity matrices}) then the filter \texttt{IsOne} for \mbox{\texttt{\mdseries\slshape C}} 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 (IsOne)",
          [ IsHomalgMatrix and IsOne and HasNrRows and HasNrColumns ], 10,
          
    function( C )
      local R, id, RP, o, z, zz;
      
      R := HomalgRing( C );
      
      if IsBound( R!.IdentityMatrices ) then
          id := ElmWPObj( R!.IdentityMatrices!.weak_pointers, NrColumns( C ) );
          if id <> fail then
              R!.IdentityMatrices!.cache_hits := R!.IdentityMatrices!.cache_hits + 1;
              return id;
          fi;
          ## we do not count cache_misses as it is equivalent to counter
      fi;
      
      RP := homalgTable( R );
      
      if IsBound( RP!.IdentityMatrix ) then
          id := RP!.IdentityMatrix( C );
          SetElmWPObj( R!.IdentityMatrices!.weak_pointers, NrColumns( C ), id );
          R!.IdentityMatrices!.counter := R!.IdentityMatrices!.counter + 1;
          return id;
      fi;
      
      if not IsHomalgInternalMatrixRep( C ) then
          Error( "could not find a procedure called IdentityMatrix ",
                 "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 );
      
      id := homalgInternalMatrixHull( id );
      
      SetElmWPObj( R!.IdentityMatrices!.weak_pointers, NrColumns( C ), id );
      
      return id;
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with LeftInverseLazy)}}
\logpage{[ "C", 4, 5 ]}\nobreak
\hyperdef{L}{X8362669D87FD667B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eval({\mdseries\slshape LI})\index{Eval@\texttt{Eval}!for matrices created with LeftInverseLazy}
\label{Eval:for matrices created with LeftInverseLazy}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
see below



 In case the matrix \mbox{\texttt{\mdseries\slshape LI}} was created using \texttt{LeftInverseLazy} (\ref{LeftInverseLazy:for matrices}) then the filter \texttt{HasEvalLeftInverse} for \mbox{\texttt{\mdseries\slshape LI}} is set to true and the method listed below will be used to set the attribute \texttt{Eval}. ($\to$ \texttt{LeftInverse} (\ref{LeftInverse:for matrices})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices",
          [ IsHomalgMatrix and HasEvalLeftInverse ],
          
    function( LI )
      local left_inv;
      
      left_inv := LeftInverse( EvalLeftInverse( LI ) );
      
      if IsBool( left_inv ) then
          return false;
      fi;
      
      return Eval( left_inv );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with RightInverseLazy)}}
\logpage{[ "C", 4, 6 ]}\nobreak
\hyperdef{L}{X84D72DF482F70AD5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eval({\mdseries\slshape RI})\index{Eval@\texttt{Eval}!for matrices created with RightInverseLazy}
\label{Eval:for matrices created with RightInverseLazy}
}\hfill{\scriptsize (method)}}\\
\textbf{\indent Returns:\ }
see below



 In case the matrix \mbox{\texttt{\mdseries\slshape RI}} was created using \texttt{RightInverseLazy} (\ref{RightInverseLazy:for matrices}) then the filter \texttt{HasEvalRightInverse} for \mbox{\texttt{\mdseries\slshape RI}} is set to true and the method listed below will be used to set the attribute \texttt{Eval}. ($\to$ \texttt{RightInverse} (\ref{RightInverse:for matrices})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InstallMethod( Eval,
          "for homalg matrices",
          [ IsHomalgMatrix and HasEvalRightInverse ],
          
    function( RI )
      local right_inv;
      
      right_inv := RightInverse( EvalRightInverse( RI ) );
      
      if IsBool( right_inv ) then
          return false;
      fi;
      
      return Eval( right_inv );
      
  end );
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Eval (for matrices created with Involution)}}
\logpage{[ "C", 4, 7 ]}\nobreak
\hyperdef{L}{X7928991E8768FA72}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eval({\mdseries\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{\mdseries\slshape C}}



 In case the matrix was created using \texttt{Involution} (\ref{Involution:for matrices}) then the filter \texttt{HasEvalInvolution} for \mbox{\texttt{\mdseries\slshape C}} 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 of the non-internal ring\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{[ "C", 4, 8 ]}\nobreak
\hyperdef{L}{X852DCBD57A742FA5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eval({\mdseries\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{\mdseries\slshape C}}



 In case the matrix was created using \texttt{CertainRows} (\ref{CertainRows:for matrices}) then the filter \texttt{HasEvalCertainRows} for \mbox{\texttt{\mdseries\slshape C}} 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 of the non-internal ring\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{[ "C", 4, 9 ]}\nobreak
\hyperdef{L}{X835F6F2E7D590F3D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eval({\mdseries\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{\mdseries\slshape C}}



 In case the matrix was created using \texttt{CertainColumns} (\ref{CertainColumns:for matrices}) then the filter \texttt{HasEvalCertainColumns} for \mbox{\texttt{\mdseries\slshape C}} 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 of the non-internal ring\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{[ "C", 4, 10 ]}\nobreak
\hyperdef{L}{X7F35A61C8522A1B0}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eval({\mdseries\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{\mdseries\slshape C}}



 In case the matrix was created using \texttt{UnionOfRows} (\ref{UnionOfRows:for matrices}) then the filter \texttt{HasEvalUnionOfRows} for \mbox{\texttt{\mdseries\slshape C}} 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 of the non-internal ring\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{[ "C", 4, 11 ]}\nobreak
\hyperdef{L}{X7EDE6095820F8128}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eval({\mdseries\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{\mdseries\slshape C}}



 In case the matrix was created using \texttt{UnionOfColumns} (\ref{UnionOfColumns:for matrices}) then the filter \texttt{HasEvalUnionOfColumns} for \mbox{\texttt{\mdseries\slshape C}} 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 of the non-internal ring\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{[ "C", 4, 12 ]}\nobreak
\hyperdef{L}{X7FD68F43831046B6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eval({\mdseries\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{\mdseries\slshape C}}



 In case the matrix was created using \texttt{DiagMat} (\ref{DiagMat:for matrices}) then the filter \texttt{HasEvalDiagMat} for \mbox{\texttt{\mdseries\slshape C}} 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 of the non-internal ring\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{[ "C", 4, 13 ]}\nobreak
\hyperdef{L}{X84F45FB4854A079C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eval({\mdseries\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{\mdseries\slshape C}}



 In case the matrix was created using \texttt{KroneckerMat} (\ref{KroneckerMat:for matrices}) then the filter \texttt{HasEvalKroneckerMat} for \mbox{\texttt{\mdseries\slshape C}} 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 ) ) and
         ( HasIsSuperCommutative( R ) and not IsSuperCommutative( R ) ) then
          Info( InfoWarning, 1, "\033[01m\033[5;31;47m",
                "the Kronecker product is only defined for (super) 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 of the non-internal ring\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{[ "C", 4, 14 ]}\nobreak
\hyperdef{L}{X7B68797C7EA79B10}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eval({\mdseries\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{\mdseries\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{\mdseries\slshape C}} 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 of the non-internal ring\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{[ "C", 4, 15 ]}\nobreak
\hyperdef{L}{X85971C16868BD83C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eval({\mdseries\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{\mdseries\slshape C}}



 In case the matrix was created using \texttt{\texttt{\symbol{92}}+} (\ref{+:for matrices}) then the filter \texttt{HasEvalAddMat} for \mbox{\texttt{\mdseries\slshape C}} 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 of the non-internal ring\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{[ "C", 4, 16 ]}\nobreak
\hyperdef{L}{X86F848318791595C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eval({\mdseries\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{\mdseries\slshape C}}



 In case the matrix was created using \texttt{\texttt{\symbol{92}}-} (\ref{-:for matrices}) then the filter \texttt{HasEvalSubMat} for \mbox{\texttt{\mdseries\slshape C}} 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 of the non-internal ring\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{[ "C", 4, 17 ]}\nobreak
\hyperdef{L}{X7F7682FC86F602C2}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Eval({\mdseries\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{\mdseries\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{\mdseries\slshape C}} 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 of the non-internal ring\n" );
      fi;
      
      #=====# can only work for homalg internal matrices #=====#
      
      return Eval( A ) * Eval( B );
      
  end );
\end{Verbatim}
 }

 }

  }


\chapter{\textcolor{Chapter }{The subpackage \textsf{ResidueClassRingForHomalg} as a sample ring package}}\label{ResidueClassRingForHomalg}
\logpage{[ "D", 0, 0 ]}
\hyperdef{L}{X7A4877FE83D15A0A}{}
{
  
\section{\textcolor{Chapter }{The Mandatory Basic Operations}}\label{ResidueClassRingForHomalg:BasicNoFallBack}
\logpage{[ "D", 1, 0 ]}
\hyperdef{L}{X84978AF3878A8375}{}
{
  

\subsection{\textcolor{Chapter }{BasisOfRowModule (ResidueClassRing)}}
\logpage{[ "D", 1, 1 ]}\nobreak
\hyperdef{L}{X7AB980C5791BA204}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{BasisOfRowModule({\mdseries\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{[ "D", 1, 2 ]}\nobreak
\hyperdef{L}{X7F2B3332793FACA3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{BasisOfColumnModule({\mdseries\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{[ "D", 1, 3 ]}\nobreak
\hyperdef{L}{X83E072E1790A7D38}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DecideZeroRows({\mdseries\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{[ "D", 1, 4 ]}\nobreak
\hyperdef{L}{X841426A87A1A20E4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DecideZeroColumns({\mdseries\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{[ "D", 1, 5 ]}\nobreak
\hyperdef{L}{X80F4836F7F175B12}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SyzygiesGeneratorsOfRows({\mdseries\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 IsHomalgRingRelationsAsGeneratorsOfRightIdeal( 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
          
          SetIsLeftRegular( M, true );
          
      fi;
      
      return S;
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{SyzygiesGeneratorsOfColumns (ResidueClassRing)}}
\logpage{[ "D", 1, 6 ]}\nobreak
\hyperdef{L}{X7899768C8304A59E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SyzygiesGeneratorsOfColumns({\mdseries\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 IsHomalgRingRelationsAsGeneratorsOfLeftIdeal( 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
          
          SetIsRightRegular( M, true );
          
      fi;
      
      return S;
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{BasisOfRowsCoeff (ResidueClassRing)}}
\logpage{[ "D", 1, 7 ]}\nobreak
\hyperdef{L}{X78BC2E8E7A78CC82}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{BasisOfRowsCoeff({\mdseries\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, nz;
      
      Mrel := UnionOfRows( M );
      
      TT := HomalgVoidMatrix( HomalgRing( Mrel ) );
      
      bas := BasisOfRowsCoeff( Mrel, TT );
      
      bas := HomalgResidueClassMatrix( bas, HomalgRing( M ) );
      
      nz := NonZeroRows( bas );
      
      SetEval( T, CertainRows( CertainColumns( TT, [ 1 .. NrRows( M ) ] ), nz ) );
      
      ResetFilterObj( T, IsVoidMatrix );
      
      ## the generic BasisOfRowsCoeff will assume that
      ## ( NrRows( B ) = 0 ) = IsZero( B )
      return CertainRows( bas, nz );
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{BasisOfColumnsCoeff (ResidueClassRing)}}
\logpage{[ "D", 1, 8 ]}\nobreak
\hyperdef{L}{X7D2E9D797877FFBD}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{BasisOfColumnsCoeff({\mdseries\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, nz;
      
      Mrel := UnionOfColumns( M );
      
      TT := HomalgVoidMatrix( HomalgRing( Mrel ) );
      
      bas := BasisOfColumnsCoeff( Mrel, TT );
      
      bas := HomalgResidueClassMatrix( bas, HomalgRing( M ) );
      
      nz := NonZeroColumns( bas );
      
      SetEval( T, CertainColumns( CertainRows( TT, [ 1 .. NrColumns( M ) ] ), nz ) );
      
      ResetFilterObj( T, IsVoidMatrix );
      
      ## the generic BasisOfColumnsCoeff will assume that
      ## ( NrColumns( B ) = 0 ) = IsZero( B )
      return CertainColumns( bas, nz );
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{DecideZeroRowsEffectively (ResidueClassRing)}}
\logpage{[ "D", 1, 9 ]}\nobreak
\hyperdef{L}{X7F10DC697D2B828D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DecideZeroRowsEffectively({\mdseries\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{[ "D", 1, 10 ]}\nobreak
\hyperdef{L}{X7B68B9F27BC02520}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DecideZeroColumnsEffectively({\mdseries\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{[ "D", 1, 11 ]}\nobreak
\hyperdef{L}{X7DF62C5D7D2E6A6E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RelativeSyzygiesGeneratorsOfRows({\mdseries\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
          
          SetIsLeftRegular( M, true );
          
      fi;
      
      return S;
      
    end,
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{RelativeSyzygiesGeneratorsOfColumns (ResidueClassRing)}}
\logpage{[ "D", 1, 12 ]}\nobreak
\hyperdef{L}{X852F9FD8837D97A5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{RelativeSyzygiesGeneratorsOfColumns({\mdseries\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
          
          SetIsRightRegular( M, true );
          
      fi;
      
      return S;
      
    end,
\end{Verbatim}
 }

 }

 
\section{\textcolor{Chapter }{The Mandatory Tool Operations}}\label{ResidueClassRingForHomalg:ToolsNoFallBack}
\logpage{[ "D", 2, 0 ]}
\hyperdef{L}{X83E14F457ADC297D}{}
{
  Here we list those matrix operations for which \textsf{homalg} provides no fallback method. 

\subsection{\textcolor{Chapter }{InitialMatrix (ResidueClassRing)}}
\logpage{[ "D", 2, 1 ]}\nobreak
\hyperdef{L}{X81CD6BAB7CA73AFC}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{InitialMatrix({\mdseries\slshape })\index{InitialMatrix@\texttt{InitialMatrix}!ResidueClassRing}
\label{InitialMatrix:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 ($\to$ \texttt{InitialMatrix} (\ref{InitialMatrix:homalgTable entry for initial matrices})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InitialMatrix := C -> HomalgInitialMatrix(
                        NrRows( C ), NrColumns( C ), AmbientRing( HomalgRing( C ) ) ),
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{InitialIdentityMatrix (ResidueClassRing)}}
\logpage{[ "D", 2, 2 ]}\nobreak
\hyperdef{L}{X7D0F99857E280142}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{InitialIdentityMatrix({\mdseries\slshape })\index{InitialIdentityMatrix@\texttt{InitialIdentityMatrix}!ResidueClassRing}
\label{InitialIdentityMatrix:ResidueClassRing}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
a \textsf{homalg} matrix over the ambient ring



 ($\to$ \texttt{InitialIdentityMatrix} (\ref{InitialIdentityMatrix:homalgTable entry for initial identity matrices})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  InitialIdentityMatrix := C -> HomalgInitialIdentityMatrix(
          NrRows( C ), AmbientRing( HomalgRing( C ) ) ),
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{ZeroMatrix (ResidueClassRing)}}
\logpage{[ "D", 2, 3 ]}\nobreak
\hyperdef{L}{X80393225841391E7}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ZeroMatrix({\mdseries\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})) 
\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{[ "D", 2, 4 ]}\nobreak
\hyperdef{L}{X811B306C81435D87}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IdentityMatrix({\mdseries\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})) 
\begin{Verbatim}[fontsize=\small,frame=single,label=Code]
  IdentityMatrix := C -> HomalgIdentityMatrix(
          NrRows( C ), AmbientRing( HomalgRing( C ) ) ),
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{Involution (ResidueClassRing)}}
\logpage{[ "D", 2, 5 ]}\nobreak
\hyperdef{L}{X7B322C637FC26E2D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Involution({\mdseries\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{[ "D", 2, 6 ]}\nobreak
\hyperdef{L}{X7C5B29A37B13A53D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CertainRows({\mdseries\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{[ "D", 2, 7 ]}\nobreak
\hyperdef{L}{X84CBE51981BA2C77}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{CertainColumns({\mdseries\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{[ "D", 2, 8 ]}\nobreak
\hyperdef{L}{X8510678E8569799E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{UnionOfRows({\mdseries\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{[ "D", 2, 9 ]}\nobreak
\hyperdef{L}{X862F756A7FC0F0D4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{UnionOfColumns({\mdseries\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{[ "D", 2, 10 ]}\nobreak
\hyperdef{L}{X802BEBF5790D4167}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{DiagMat({\mdseries\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{[ "D", 2, 11 ]}\nobreak
\hyperdef{L}{X85F1DDDB864AF265}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{KroneckerMat({\mdseries\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{[ "D", 2, 12 ]}\nobreak
\hyperdef{L}{X7A5D229384E9D19C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{MulMat({\mdseries\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{[ "D", 2, 13 ]}\nobreak
\hyperdef{L}{X83E1AEC781AE1274}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AddMat({\mdseries\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{[ "D", 2, 14 ]}\nobreak
\hyperdef{L}{X79A1C9297BE0C09A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{SubMat({\mdseries\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{[ "D", 2, 15 ]}\nobreak
\hyperdef{L}{X875447A686949D59}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Compose({\mdseries\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{[ "D", 2, 16 ]}\nobreak
\hyperdef{L}{X78D7BABE806B82FA}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsZeroMatrix({\mdseries\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{[ "D", 2, 17 ]}\nobreak
\hyperdef{L}{X78BBB7CE7D6C1CAD}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NrRows({\mdseries\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{[ "D", 2, 18 ]}\nobreak
\hyperdef{L}{X7B5809EA8236F9F4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{NrColumns({\mdseries\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{[ "D", 2, 19 ]}\nobreak
\hyperdef{L}{X80831B287AB565BA}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{Determinant({\mdseries\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{[ "D", 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{[ "D", 3, 1 ]}\nobreak
\hyperdef{L}{X848EB509816E8A7D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{AreEqualMatrices({\mdseries\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 }{IsOne (ResidueClassRing)}}
\logpage{[ "D", 3, 2 ]}\nobreak
\hyperdef{L}{X80122FB3846A6BA5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsOne({\mdseries\slshape M})\index{IsOne@\texttt{IsOne}!ResidueClassRing}
\label{IsOne: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 ->
            IsOne( DecideZero( Eval( M ), HomalgRing( M ) ) ),
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsDiagonalMatrix (ResidueClassRing)}}
\logpage{[ "D", 3, 3 ]}\nobreak
\hyperdef{L}{X87B8E7137DC97A71}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{IsDiagonalMatrix({\mdseries\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{[ "D", 3, 4 ]}\nobreak
\hyperdef{L}{X7EFC928C7E59CEAE}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ZeroRows({\mdseries\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{[ "D", 3, 5 ]}\nobreak
\hyperdef{L}{X7E78F7D6796C7016}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{ZeroColumns({\mdseries\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{MatricesForHomalg}}}\label{Debugging}
\logpage{[ "E", 0, 0 ]}
\hyperdef{L}{X7A7670B27F594061}{}
{
  Beside the \textsf{GAP} builtin debugging facilities ($\to$  (\textbf{Reference: Debugging and Profiling Facilities})) \textsf{MatricesForHomalg} provides two ways to debug the computations. 
\section{\textcolor{Chapter }{Increase the assertion level}}\label{SetAssertionLevel}
\logpage{[ "E", 1, 0 ]}
\hyperdef{L}{X8062637283DD739D}{}
{
  \textsf{MatricesForHomalg} comes with numerous builtin assertion checks. They are activated if the user
increases the assertion level using \\
\\
 \texttt{SetAssertionLevel}( \mbox{\texttt{\mdseries\slshape level}} ); \\
\\
 ($\to$  (\textbf{Reference: SetAssertionLevel})), where \mbox{\texttt{\mdseries\slshape level}} is one of the values below: \begin{center}
\begin{tabular}{l|l}\mbox{\texttt{\mdseries\slshape level}}&
description\\
\hline
&
\\
0&
no assertion checks whatsoever\\
&
\\
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{MatricesForHomalg} delegates matrix operations to an external system then \texttt{SetAssertionLevel}( 4 ); can be used to let \textsf{MatricesForHomalg} 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(
        BasisOfRowModule :=
          function( B ) return ( NrRows( B ) = 0 ) = IsZero( B ); end,
        
        BasisOfColumnModule :=
          function( B ) return ( NrColumns( B ) = 0 ) = IsZero( B ); end,
        
        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 }{\texttt{Using homalgMode}}}\label{using homalgMode}
\logpage{[ "E", 2, 0 ]}
\hyperdef{L}{X86954B797AAF65DF}{}
{
  

\subsection{\textcolor{Chapter }{homalgMode}}
\logpage{[ "E", 2, 1 ]}\nobreak
\hyperdef{L}{X7D07F29F7EB515EE}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\ \ \texttt{homalgMode({\mdseries\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{\mdseries\slshape str}} is \emph{not} case-sensitive. If a second string \mbox{\texttt{\mdseries\slshape str2}} is given, then \texttt{homalgMode}( \mbox{\texttt{\mdseries\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{\mdseries\slshape str}}&
\mbox{\texttt{\mdseries\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_MATRICES.color_display := false;
          for s in HOMALG_MATRICES.matrix_logic_infolevels do
              SetInfoLevel( s, 1 );
          od;
          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_MATRICES.color_display := true;
          for s in HOMALG_MATRICES.matrix_logic_infolevels do
              SetInfoLevel( s, 2 );
          od;
      fi;
      
      if nargs > 1 and IsString( arg[2] ) then
          homalgMode( arg[2] );
      fi;
      
  end );
\end{Verbatim}
 }

 }

  }


\chapter{\textcolor{Chapter }{Overview of the \textsf{MatricesForHomalg} Package Source Code}}\label{FileOverview}
\logpage{[ "F", 0, 0 ]}
\hyperdef{L}{X7DAAD9CE8405DD8F}{}
{
  
\section{\textcolor{Chapter }{Rings, Ring Maps, Matrices, Ring Relations}}\label{RingsMapsMatrices}
\logpage{[ "F", 1, 0 ]}
\hyperdef{L}{X87E0F36680867FA2}{}
{
  \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{MatricesForHomalg}\\
&
and the computing engines\\
\texttt{HomalgRing}&
internal and external rings\\
&
\\
\texttt{HomalgRingMap}&
ring maps\\
&
\\
\texttt{HomalgMatrix}&
internal and external matrices\\
&
\\
\texttt{HomalgRingRelations}&
a set of ring relations\\
\end{tabular}\\[2mm]
\textbf{Table: }\emph{The \textsf{MatricesForHomalg} package files}\end{center}

 }

 
\section{\textcolor{Chapter }{The Low Level Algorithms}}\label{Low Level Algorithms}
\logpage{[ "F", 2, 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{MatricesForHomalg} package files (continued)}\end{center}

 }

 
\section{\textcolor{Chapter }{Logical Implications for \textsf{MatricesForHomalg} Objects}}\label{Logical Implications}
\logpage{[ "F", 3, 0 ]}
\hyperdef{L}{X8751EA667F5DB4AC}{}
{
  \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\\
&
\\
\end{tabular}\\[2mm]
\textbf{Table: }\emph{The \textsf{MatricesForHomalg} package files (continued)}\end{center}

 }

 
\section{\textcolor{Chapter }{The subpackage \textsf{ResidueClassRingForHomalg}}}\label{ResidueClassRingForHomalg_subpackage}
\logpage{[ "F", 4, 0 ]}
\hyperdef{L}{X792F10DC845F66E9}{}
{
  \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{MatricesForHomalg} package files (continued)}\end{center}

 }

 
\section{\textcolor{Chapter }{The homalgTable for \textsf{GAP4} built-in rings}}\label{The built-in rings}
\logpage{[ "F", 5, 0 ]}
\hyperdef{L}{X7AD686B87BC62898}{}
{
  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{MatricesForHomalg} package files (continued)}\end{center}

 }

 }

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

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

\addcontentsline{toc}{chapter}{References}

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

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


\printindex

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