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

\usepackage[top=37mm,bottom=37mm,left=27mm,right=27mm]{geometry}
\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{ Alnuth \\
\mbox{}}}\\
\vfill

\hypersetup{pdftitle={ Alnuth }}
\markright{\scriptsize \mbox{}\hfill  Alnuth  \hfill\mbox{}}
{\Huge \textbf{ ALgebraic NUmber THeory\\
 and an interface to\\
 PARI/GP and OSCAR \\
\mbox{}}}\\
\vfill

{\Huge  4.0.2 \mbox{}}\\[1cm]
{ 21 June 2026 \mbox{}}\\[1cm]
\mbox{}\\[2cm]
{\Large \textbf{\strut  GAP code by Bj{\"o}rn Assmann, Andreas Distler and Bettina Eick  \strut\mbox{}}}\\
{\Large \textbf{\strut  PARI/GP code by Bill Allombert  \strut\mbox{}}}\\
{\Large \textbf{\strut  OSCAR code by Claus Fieker and Max Horn  \strut\mbox{}}}\\
\hypersetup{pdfauthor={ GAP code by Bj{\"o}rn Assmann, Andreas Distler and Bettina Eick ;  PARI/GP code by Bill Allombert ;  OSCAR code by Claus Fieker and Max Horn }}
\mbox{}\\[2cm]
\begin{minipage}{12cm}\noindent
 \emph{Note:} PARI/GP is \emph{not} part of this package. It can be obtained from \href{https://pari.math.u-bordeaux.fr/} {\texttt{https://pari.math.u\texttt{\symbol{45}}bordeaux.fr/}}. If you use GAP via OSCAR, then OSCAR will automatically be used instead of
PARI/GP. \end{minipage}

\end{center}\vfill

\mbox{}\\
\end{titlepage}

\newpage\setcounter{page}{2}
{\small 
\section*{Copyright}
\logpage{[ 0, 0, 1 ]}
 This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 2 of the license, or (at your option) any later
version. 

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

 You should have received a copy of the GNU General Public License along with
this program. If not, see \href{https://www.gnu.org/licenses/} {\texttt{https://www.gnu.org/licenses/}} 

 \mbox{}}\\[1cm]
{\small 
\section*{Acknowledgements}
\logpage{[ 0, 0, 2 ]}
 To begin with we are very grateful for all the feedback by users of former
versions of \textsf{Alnuth}. 

 We thank Bill Allombert who wrote the GP code for the interface to PARI/GP and
who was extremely helpful in the transition from KANT to PARI/GP. 

 For feedback on the development version, including a code patch, we are much
obliged to Max Horn. 

 The second author acknowledges the financial support at CAUL within the
projects PTDC/MAT/101993/2008 and
ISFL\texttt{\symbol{45}}1\texttt{\symbol{45}}143, financed by FEDER and FCT,
in the development of Version 3 of \textsf{Alnuth}. 

 Support for using OSCAR instead of PARI/GP was added by Claus Fieker and Max
Horn. 

 \mbox{}}\\[1cm]
\newpage

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

\tableofcontents
\newpage

 
\chapter{\textcolor{Chapter }{Introduction}}\label{Introduction}
\logpage{[ 1, 0, 0 ]}
\hyperdef{L}{X7DFB63A97E67C0A1}{}
{
  A number field is a finite extension of the field of rational numbers. \textsf{Alnuth} provides various methods to compute with number fields which are given by a
defining polynomial or by generators. For background on number fields we refer
to \cite{Sta79}. 

 Some of the methods provided in this package are written in \textsf{GAP} code. The other part of the methods is imported from the Computer Algebra
Systems PARI/GP \cite{PARI2} respectively OSCAR \cite{Oscar25}, \cite{OSCAR}. Hence this package contains some \textsf{GAP} functions and an interface to some functions to these computer algebra
systems. Therefore one has to have PARI/GP or OSCAR installed to use the full
functionality of \textsf{Alnuth}. 

 We note that only a very small part of the functions available in PARI/GP
respectively OSCAR are linked to \textsf{GAP} and they provides many more methods for computations in number fields. 

 The main methods included in \textsf{Alnuth} are: creating a number field, computing its maximal order, computing its unit
group and a presentation of this unit group, computing the elements of a given
norm of the number field, determining a presentation for a finitely generated
multiplicative subgroup, and factoring polynomials defined over number fields.
For background on algorithms for number fields we refer to \cite{Poh93}, \cite{PZa89} and \cite{Coh93}. 

 The functions provided by \textsf{Alnuth} are introduced in the following chapter. Then an example application is
outlined. In the final chapter of this manual the installation of the package
and configuration of the interface, including hints on the installation of
PARI/GP respectively OSCAR, are described. 

 }

 
\chapter{\textcolor{Chapter }{Working with number fields}}\label{Working with number fields}
\logpage{[ 2, 0, 0 ]}
\hyperdef{L}{X7DC995CB8412F8E2}{}
{
  An algebraic number field is a finite\texttt{\symbol{45}}dimensional extension
of the rational numbers ${\ensuremath{\mathbb Q}}$. Such a number field has a primitive element and it can be defined by the
minimal polynomial of this primitive element. Another important way to define
an algebraic number field is by a set of rational matrices which generate a
number field.  
\section{\textcolor{Chapter }{Creation of number fields}}\label{Creation of number fields}
\logpage{[ 2, 1, 0 ]}
\hyperdef{L}{X86AD0C3F7D38C269}{}
{
  We provide functions to create number fields defined by rational matrices or
by rational polynomials. 

\subsection{\textcolor{Chapter }{FieldByMatricesNC}}
\logpage{[ 2, 1, 1 ]}\nobreak
\hyperdef{L}{X8085204B7DE2C8BA}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{FieldByMatricesNC({\mdseries\slshape matrices})\index{FieldByMatricesNC@\texttt{FieldByMatricesNC}}
\label{FieldByMatricesNC}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{FieldByMatrices({\mdseries\slshape matrices})\index{FieldByMatrices@\texttt{FieldByMatrices}}
\label{FieldByMatrices}
}\hfill{\scriptsize (function)}}\\


 Creates a field generated by the rational matrices \mbox{\texttt{\mdseries\slshape matrices}}. In the faster NC version, the function assumes that the input generates a
field and there are no checks on this performed. }

 

\subsection{\textcolor{Chapter }{FieldByMatrixBasisNC}}
\logpage{[ 2, 1, 2 ]}\nobreak
\hyperdef{L}{X805CFBEB877FCBA3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{FieldByMatrixBasisNC({\mdseries\slshape matrices})\index{FieldByMatrixBasisNC@\texttt{FieldByMatrixBasisNC}}
\label{FieldByMatrixBasisNC}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{FieldByMatrixBasis({\mdseries\slshape matrices})\index{FieldByMatrixBasis@\texttt{FieldByMatrixBasis}}
\label{FieldByMatrixBasis}
}\hfill{\scriptsize (function)}}\\


 Creates a field with basis \mbox{\texttt{\mdseries\slshape matrices}}. The list \mbox{\texttt{\mdseries\slshape matrices}} must consist of rational matrices which form a basis for a number field. In
the faster NC version, the function assumes that the input is a matrix basis
for a field and no checks are performed. }

 

\subsection{\textcolor{Chapter }{FieldByPolynomialNC}}
\logpage{[ 2, 1, 3 ]}\nobreak
\hyperdef{L}{X7AD9823687E61ABC}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{FieldByPolynomialNC({\mdseries\slshape polynomial})\index{FieldByPolynomialNC@\texttt{FieldByPolynomialNC}}
\label{FieldByPolynomialNC}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{FieldByPolynomial({\mdseries\slshape polynomial})\index{FieldByPolynomial@\texttt{FieldByPolynomial}}
\label{FieldByPolynomial}
}\hfill{\scriptsize (function)}}\\


 Creates a field defined by \mbox{\texttt{\mdseries\slshape polynomial}}. The polynomial \mbox{\texttt{\mdseries\slshape polynomial}} must be an irreducible rational polynomial. In the faster NC version, no
checks on the input are performed. }

 }

  
\section{\textcolor{Chapter }{Methods for number fields}}\label{Methods for number fields}
\logpage{[ 2, 2, 0 ]}
\hyperdef{L}{X79007A477D53B572}{}
{
  We outline a number of functions for number fields. 

\subsection{\textcolor{Chapter }{PrimitiveElement}}
\logpage{[ 2, 2, 1 ]}\nobreak
\hyperdef{L}{X86DB31B57FB4F570}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{PrimitiveElement({\mdseries\slshape F})\index{PrimitiveElement@\texttt{PrimitiveElement}}
\label{PrimitiveElement}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{DefiningPolynomial({\mdseries\slshape F})\index{DefiningPolynomial@\texttt{DefiningPolynomial}}
\label{DefiningPolynomial}
}\hfill{\scriptsize (function)}}\\


 Computes a primitive element and a defining polynomial for the given number
field. The defining polynomial is the minimal polynomial of the primitive
element. Since \mbox{\texttt{\mdseries\slshape F}} contains various primitive elements, \texttt{PrimitiveElement} tries to find a primitive element which has a minimal polynomial with small
coefficients. Via the user preference \texttt{PrimitiveElementTrials} the user can decide how many primitive elements will be compared. The default
value is 20. (See \texttt{SetUserPreference} (\textbf{Reference: SetUserPreference}) for more information about user preferences.) }

 

\subsection{\textcolor{Chapter }{IsPrimitiveElementOfNumberField}}
\logpage{[ 2, 2, 2 ]}\nobreak
\hyperdef{L}{X843C2BE881A3576A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsPrimitiveElementOfNumberField({\mdseries\slshape F, a})\index{IsPrimitiveElementOfNumberField@\texttt{IsPrimitiveElementOfNumberField}}
\label{IsPrimitiveElementOfNumberField}
}\hfill{\scriptsize (function)}}\\


 Checks if the given element generates the field. }

 

\subsection{\textcolor{Chapter }{DegreeOverPrimeField}}
\logpage{[ 2, 2, 3 ]}\nobreak
\hyperdef{L}{X7845CECE86A83219}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{DegreeOverPrimeField({\mdseries\slshape F})\index{DegreeOverPrimeField@\texttt{DegreeOverPrimeField}}
\label{DegreeOverPrimeField}
}\hfill{\scriptsize (function)}}\\


 Returns the degree of \mbox{\texttt{\mdseries\slshape F}} over the rationals. }

 

\subsection{\textcolor{Chapter }{EquationOrderBasis}}
\logpage{[ 2, 2, 4 ]}\nobreak
\hyperdef{L}{X8185FEF1811EA43F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{EquationOrderBasis({\mdseries\slshape F})\index{EquationOrderBasis@\texttt{EquationOrderBasis}}
\label{EquationOrderBasis}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{MaximalOrderBasis({\mdseries\slshape F})\index{MaximalOrderBasis@\texttt{MaximalOrderBasis}}
\label{MaximalOrderBasis}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsIntegerOfNumberField({\mdseries\slshape F, k})\index{IsIntegerOfNumberField@\texttt{IsIntegerOfNumberField}}
\label{IsIntegerOfNumberField}
}\hfill{\scriptsize (function)}}\\


 These functions return bases for the equation order or the maximal order of
the number field \mbox{\texttt{\mdseries\slshape F}}. Also, they allow to check if a given element is an integer in the given
number field. }

 

\subsection{\textcolor{Chapter }{UnitGroup}}
\logpage{[ 2, 2, 5 ]}\nobreak
\hyperdef{L}{X7902A7877B65FDA1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{UnitGroup({\mdseries\slshape F})\index{UnitGroup@\texttt{UnitGroup}}
\label{UnitGroup}
}\hfill{\scriptsize (function)}}\\


 determines the unit group of \mbox{\texttt{\mdseries\slshape F}}. 

 Recall that the unit group of \mbox{\texttt{\mdseries\slshape F}} is a finitely generated abelian group. The function \texttt{IsomorphismPcpGroup} from the \textsf{Polycyclic} \cite{Polycyclic} package gives an isomorphism to a pcp group which can be used for various
computations with the unit group. }

 

\subsection{\textcolor{Chapter }{IsUnitOfNumberField}}
\logpage{[ 2, 2, 6 ]}\nobreak
\hyperdef{L}{X7D9484BA7AF4201C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsUnitOfNumberField({\mdseries\slshape F, k})\index{IsUnitOfNumberField@\texttt{IsUnitOfNumberField}}
\label{IsUnitOfNumberField}
}\hfill{\scriptsize (function)}}\\


 checks whether the element \mbox{\texttt{\mdseries\slshape k}} is a unit in \mbox{\texttt{\mdseries\slshape F}}. }

 

\subsection{\textcolor{Chapter }{ExponentsOfUnits}}
\logpage{[ 2, 2, 7 ]}\nobreak
\hyperdef{L}{X80389D828474FC64}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ExponentsOfUnits({\mdseries\slshape F, elms})\index{ExponentsOfUnits@\texttt{ExponentsOfUnits}}
\label{ExponentsOfUnits}
}\hfill{\scriptsize (function)}}\\


 This function determines the exponent vectors of the elements in \mbox{\texttt{\mdseries\slshape elms}} with respect to the generators of the unit group of \mbox{\texttt{\mdseries\slshape F}}. If the unit group of \mbox{\texttt{\mdseries\slshape F}} is not known, then the function computes this unit group also. }

 

\subsection{\textcolor{Chapter }{IsCyclotomicField}}
\logpage{[ 2, 2, 8 ]}\nobreak
\hyperdef{L}{X84CAE4627F0CD639}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsCyclotomicField({\mdseries\slshape F})\index{IsCyclotomicField@\texttt{IsCyclotomicField}}
\label{IsCyclotomicField}
}\hfill{\scriptsize (function)}}\\


 Check whether \mbox{\texttt{\mdseries\slshape F}} is cyclotomic. }

 

\subsection{\textcolor{Chapter }{NormCosetsOfNumberField}}
\logpage{[ 2, 2, 9 ]}\nobreak
\hyperdef{L}{X7A43318584DB3756}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{NormCosetsOfNumberField({\mdseries\slshape F, norm})\index{NormCosetsOfNumberField@\texttt{NormCosetsOfNumberField}}
\label{NormCosetsOfNumberField}
}\hfill{\scriptsize (function)}}\\


 Returns a description for the set of all elements of norm \mbox{\texttt{\mdseries\slshape norm}} in \mbox{\texttt{\mdseries\slshape F}}. These elements can be written as a finite union of cosets of the unit group
of \mbox{\texttt{\mdseries\slshape F}}. The function returns coset representatives for these cosets. }

 }

  
\section{\textcolor{Chapter }{Presentations of multiplicative subgroups}}\label{Presentations of multiplicative subgroups}
\logpage{[ 2, 3, 0 ]}
\hyperdef{L}{X833A0296798E0463}{}
{
  Suppose that a finite number of invertible elements of a number field are
given. Then these elements generate a finitely generated abelian group.
However, it is a non\texttt{\symbol{45}}trivial task to provide a presentation
for this abelian group. The most useful representation for such groups is as
pcp group. 

\subsection{\textcolor{Chapter }{PcpPresentationOfMultiplicativeSubgroup}}
\logpage{[ 2, 3, 1 ]}\nobreak
\hyperdef{L}{X7975303583E6058B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{PcpPresentationOfMultiplicativeSubgroup({\mdseries\slshape F, elms})\index{PcpPresentationOfMultiplicativeSubgroup@\texttt{Pcp}\-\texttt{Presentation}\-\texttt{Of}\-\texttt{Multiplicative}\-\texttt{Subgroup}}
\label{PcpPresentationOfMultiplicativeSubgroup}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsomorphismPcpGroup({\mdseries\slshape F, elms})\index{IsomorphismPcpGroup@\texttt{IsomorphismPcpGroup}}
\label{IsomorphismPcpGroup}
}\hfill{\scriptsize (function)}}\\


 Determine a pcp presentation for the multiplicative group of $\mbox{\texttt{\mdseries\slshape F}}\backslash\{0\}$ generated by \mbox{\texttt{\mdseries\slshape elms}} and an isomorphism on this presentation. Note, that the method \texttt{IsomorphismPcpGroup} is defined in the \textsf{Polycyclic} package \cite{Polycyclic}. We refer to the manual of this package for further background. 

 In the determination of the Pcp\texttt{\symbol{45}}presentation of a
multiplicative subgroup generated by \mbox{\texttt{\mdseries\slshape elms}} the relations between the elements in \mbox{\texttt{\mdseries\slshape elms}} play an important role. Let $elms=\{e_1,\dots,e_l\}$ be a finite subset of a field \mbox{\texttt{\mdseries\slshape F}}. The relation lattice for \mbox{\texttt{\mdseries\slshape elms}} is 
\[ rl(elms):=\left\{(h_1,\dots,h_l) \in {\ensuremath{\mathbb Z}}^l | e_1^{h_1}
\cdots e_l^{h_l} = 1\right\} . \]
 }

 

\subsection{\textcolor{Chapter }{RelationLattice}}
\logpage{[ 2, 3, 2 ]}\nobreak
\hyperdef{L}{X7C6E88FE82BB9DE3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{RelationLattice({\mdseries\slshape F, elms})\index{RelationLattice@\texttt{RelationLattice}}
\label{RelationLattice}
}\hfill{\scriptsize (function)}}\\


 Determines a generating set for the relation lattice of the field elements \mbox{\texttt{\mdseries\slshape elms}}. }

 }

  
\section{\textcolor{Chapter }{Methods to compute with subgroups of the unit group}}\label{Methods to compute with subgroups of the unit group}
\logpage{[ 2, 4, 0 ]}
\hyperdef{L}{X86F68B4883142B5A}{}
{
  

\subsection{\textcolor{Chapter }{RelationLatticeOfUnits}}
\logpage{[ 2, 4, 1 ]}\nobreak
\hyperdef{L}{X82B056EC85CF150D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{RelationLatticeOfUnits({\mdseries\slshape F, elms})\index{RelationLatticeOfUnits@\texttt{RelationLatticeOfUnits}}
\label{RelationLatticeOfUnits}
}\hfill{\scriptsize (function)}}\\


 Determines a basis for the relation lattice of the units \mbox{\texttt{\mdseries\slshape elms}} in triangularized form. Note that this method is more efficient than the
method \texttt{RelationLattice}. }

 

\subsection{\textcolor{Chapter }{IntersectionOfUnitSubgroups}}
\logpage{[ 2, 4, 2 ]}\nobreak
\hyperdef{L}{X7B8C89C980CB15F7}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IntersectionOfUnitSubgroups({\mdseries\slshape F, gen1, gen2})\index{IntersectionOfUnitSubgroups@\texttt{IntersectionOfUnitSubgroups}}
\label{IntersectionOfUnitSubgroups}
}\hfill{\scriptsize (function)}}\\


 The lists \mbox{\texttt{\mdseries\slshape gen1}} and \mbox{\texttt{\mdseries\slshape gen2}} are supposed to generate two subgroups $U_1$ and $U_2$ of the unit group of \mbox{\texttt{\mdseries\slshape F}}. This function determines the intersection of $U_1$ with $U_2$. The result is returned as a list of vectors generating the lattice $\{ e \in {\ensuremath{\mathbb Z}}^n \mid g_1^{e_1} \cdots g_n^{e_n} \in U_2 \}$ for \mbox{\texttt{\mdseries\slshape gen1}} = $[g_1, \ldots, g_n]$. 

 For efficiency reasons this function does not check the input and it may
return wrong results if the input generators do not fulfil the requirements. }

 }

  
\section{\textcolor{Chapter }{Factorisation of polynomials over a number field}}\label{Factorisation of polynomials over a number field}
\logpage{[ 2, 5, 0 ]}
\hyperdef{L}{X7F656B217EF114DA}{}
{
  

\subsection{\textcolor{Chapter }{FactorsPolynomialAlgExt}}
\logpage{[ 2, 5, 1 ]}\nobreak
\hyperdef{L}{X815A5FBE805119CC}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{FactorsPolynomialAlgExt({\mdseries\slshape F, pol})\index{FactorsPolynomialAlgExt@\texttt{FactorsPolynomialAlgExt}}
\label{FactorsPolynomialAlgExt}
}\hfill{\scriptsize (function)}}\\


 embeds the rational polynomial \mbox{\texttt{\mdseries\slshape pol}} into the polynomial ring over the number field \mbox{\texttt{\mdseries\slshape F}}, which has to be constructed by \texttt{FieldByPolynomial} or \texttt{AlgebraicExtension}, and returns the factorization of the embedded polynomial. By default \mbox{\texttt{\mdseries\slshape a}} denotes the primitive element of the field one can obtain from \texttt{PrimitiveElement(\mbox{\texttt{\mdseries\slshape F}})}, that is, a root of the defining polynomial of \mbox{\texttt{\mdseries\slshape F}}. }

 

\subsection{\textcolor{Chapter }{FactorsPolynomialAlnuth}}
\logpage{[ 2, 5, 2 ]}\nobreak
\hyperdef{L}{X7CC3F0458523CB22}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{FactorsPolynomialAlnuth({\mdseries\slshape pol})\index{FactorsPolynomialAlnuth@\texttt{FactorsPolynomialAlnuth}}
\label{FactorsPolynomialAlnuth}
}\hfill{\scriptsize (function)}}\\


 takes a polynomial \mbox{\texttt{\mdseries\slshape pol}} defined over an algebraic extension of the Rationals and factors it using the
external CAS (PARI/GP or OSCAR). 

 The alias \texttt{FactorsPolynomialPari} is provided for backwards compatibility. 
\begin{Verbatim}[commandchars=@|C,fontsize=\small,frame=single,label=Example]
  @gapprompt|gap>C @gapinput|x := Indeterminate( Rationals, "x" );;C
  @gapprompt|gap>C @gapinput|pol := 2*x^7+2*x^5+8*x^4+8*x^2;C
  2*x^7+2*x^5+8*x^4+8*x^2
  @gapprompt|gap>C @gapinput|L := FieldByPolynomial( x^3-4 );C
  <algebraic extension over the Rationals of degree 3>
  @gapprompt|gap>C @gapinput|y := Indeterminate( L, "y" );;C
  @gapprompt|gap>C @gapinput|FactorsPolynomialAlgExt( L, pol );C
  [ !2*y, y, y+a, y^2+!1, y^2+(-a)*y+a^2 ]
  @gapprompt|gap>C @gapinput|FactorsPolynomialAlnuth( last[5] );C
  [ y^2+(-a)*y+a^2 ]
\end{Verbatim}
 }

 }

  
\section{\textcolor{Chapter }{Examples}}\label{Examples}
\logpage{[ 2, 6, 0 ]}
\hyperdef{L}{X7A489A5D79DA9E5C}{}
{
  

\subsection{\textcolor{Chapter }{ExampleMatField}}
\logpage{[ 2, 6, 1 ]}\nobreak
\hyperdef{L}{X7B4AE27B7BB8A9ED}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ExampleMatField({\mdseries\slshape l})\index{ExampleMatField@\texttt{ExampleMatField}}
\label{ExampleMatField}
}\hfill{\scriptsize (function)}}\\


 This function returns some examples of fields generated by matrices. There are
9 such example fields provided and they can be obtained by assigning the input \mbox{\texttt{\mdseries\slshape l}} to an integer between 1 and 9. Some of the properties of the examples are
summarized in the following table. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
                      degree over Q  number of generators  dim. of generators
  ExampleMatField(1)              4                     4                   4
  ExampleMatField(2)              4                     4                   4
  ExampleMatField(3)              4                     4                   4
  ExampleMatField(4)              4                    13                   4
  ExampleMatField(5)              4                    13                   4
  ExampleMatField(6)              4                     7                   4
  ExampleMatField(7)              4                    18                   4
  ExampleMatField(8)              4                    13                   4
  ExampleMatField(9)              4                     7                   4
\end{Verbatim}
 }

 }

 }

 
\chapter{\textcolor{Chapter }{An example application}}\label{An example application}
\logpage{[ 3, 0, 0 ]}
\hyperdef{L}{X81CAD2F27B2066C4}{}
{
  In this section we outline two example computations with the functions of the
previous chapter. The first example uses number fields defined by matrices and
the second example considers number fields defined by a polynomial.  
\section{\textcolor{Chapter }{Number fields defined by matrices}}\label{Number fields defined by matrices}
\logpage{[ 3, 1, 0 ]}
\hyperdef{L}{X7981DB6C79742C4C}{}
{
  
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@m1 := [ [ 1, 0, 0, -7 ], |
  !gapprompt@>| !gapinput@           [ 7, 1, 0, -7 ], |
  !gapprompt@>| !gapinput@           [ 0, 7, 1, -7 ], |
  !gapprompt@>| !gapinput@           [ 0, 0, 7, -6 ] ];;|
  
  #
  !gapprompt@gap>| !gapinput@m2 := [ [ 0, 0, -13, 14 ], |
  !gapprompt@>| !gapinput@           [ -1, 0, -13, 1 ], |
  !gapprompt@>| !gapinput@           [ 13, -1, -13, 1 ], |
  !gapprompt@>| !gapinput@           [ 0, 13, -14, 1 ] ];;|
  
  #
  !gapprompt@gap>| !gapinput@F := FieldByMatricesNC( [m1, m2] );|
  <rational matrix field of unknown degree>
  
  #
  !gapprompt@gap>| !gapinput@DegreeOverPrimeField(F);|
  4
  !gapprompt@gap>| !gapinput@PrimitiveElement(F);|
  [ [ 0, -1, 1, 0 ], [ 0, -1, 0, 1 ], [ 0, -1, 0, 0 ], [ 1, -1, 0, 0 ] ]
  
  #
  !gapprompt@gap>| !gapinput@Basis(F);|
  Basis( <rational matrix field of degree 4>, 
  [ [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ], 
    [ [ 0, 1, 0, 0 ], [ -1, 1, 1, 0 ], [ -1, 0, 1, 1 ], [ -1, 0, 0, 1 ] ], 
    [ [ 0, 0, 1, 0 ], [ -1, 0, 1, 1 ], [ -1, -1, 1, 1 ], [ 0, -1, 0, 1 ] ], 
    [ [ 0, 0, 0, 1 ], [ -1, 0, 0, 1 ], [ 0, -1, 0, 1 ], [ 0, 0, -1, 1 ] ] ] )
  
  #
  !gapprompt@gap>| !gapinput@MaximalOrderBasis(F);|
  Basis( <rational matrix field of degree 4>, 
  [ [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ], 
    [ [ 0, -1, 1, 0 ], [ 0, -1, 0, 1 ], [ 0, -1, 0, 0 ], [ 1, -1, 0, 0 ] ], 
    [ [ 0, 0, 0, -1 ], [ 1, 0, 0, -1 ], [ 0, 1, 0, -1 ], [ 0, 0, 1, -1 ] ], 
    [ [ -1, 1, 0, 0 ], [ -1, 0, 1, 0 ], [ -1, 0, 0, 1 ], [ -1, 0, 0, 0 ] ] ] )
  
  #
  !gapprompt@gap>| !gapinput@U := UnitGroup(F);|
  <matrix group with 2 generators>
  
  #
  !gapprompt@gap>| !gapinput@u := GeneratorsOfGroup( U );;|
  
  #
  !gapprompt@gap>| !gapinput@nat := IsomorphismPcpGroup(U);;|
  !gapprompt@gap>| !gapinput@H := Image(nat);|
  Pcp-group with orders [ 10, 0 ]
  !gapprompt@gap>| !gapinput@ImageElm( nat, u[1] );|
  g1
  !gapprompt@gap>| !gapinput@ImageElm( nat, u[2] );|
  g2
  !gapprompt@gap>| !gapinput@ImageElm( nat, u[1]*u[2] );|
  g1*g2
  !gapprompt@gap>| !gapinput@u[1] = PreImagesRepresentative(nat, GeneratorsOfGroup(H)[1] );|
  true
\end{Verbatim}
 }

  
\section{\textcolor{Chapter }{Number fields defined by a polynomial}}\label{Number fields defined by a polynomial}
\logpage{[ 3, 2, 0 ]}
\hyperdef{L}{X85ADC6A27B26C804}{}
{
  
\begin{Verbatim}[commandchars=@|D,fontsize=\small,frame=single,label=Example]
  @gapprompt|gap>D @gapinput|g := UnivariatePolynomial( Rationals, [ 16, 64, -28, -4, 1 ] );D
  x^4-4*x^3-28*x^2+64*x+16
  
  #
  @gapprompt|gap>D @gapinput|F := FieldByPolynomialNC(g);D
  <algebraic extension over the Rationals of degree 4>
  @gapprompt|gap>D @gapinput|PrimitiveElement(F);D
  a
  @gapprompt|gap>D @gapinput|MaximalOrderBasis(F);D
  Basis( <algebraic extension over the Rationals of degree 4>, 
  [ !1, 1/2*a, 1/4*a^2, 1/56*a^3+1/14*a^2+1/14*a-2/7 ] )
  
  #
  @gapprompt|gap>D @gapinput|U := UnitGroup(F);D
  <group with 4 generators>
  
  #
  @gapprompt|gap>D @gapinput|natU := IsomorphismPcpGroup(U);;D
  @gapprompt|gap>D @gapinput|elms := List( [1..10], x-> Random(F) );;D
  
  #
  @gapprompt|gap>D @gapinput| PcpPresentationOfMultiplicativeSubgroup( F, elms );D
  Pcp-group with orders [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
  
  #
  @gapprompt|gap>D @gapinput|isom := IsomorphismPcpGroup( F, elms );;D
  @gapprompt|gap>D @gapinput|y := RandomGroupElement( elms );;D
  @gapprompt|gap>D @gapinput|z := ImageElm( isom, y );;D
  @gapprompt|gap>D @gapinput|y = PreImagesRepresentative( isom, z );D
  true
  
  #
  @gapprompt|gap>D @gapinput|FactorsPolynomialAlgExt( F, g );D
  [ x_1+(-a), x_1+(a-2), x_1+(-1/7*a^3+3/7*a^2+31/7*a-40/7), 
    x_1+(1/7*a^3-3/7*a^2-31/7*a+26/7) ]
\end{Verbatim}
 }

 }

 
\chapter{\textcolor{Chapter }{Installation}}\label{Installation}
\logpage{[ 4, 0, 0 ]}
\hyperdef{L}{X8360C04082558A12}{}
{
  This package provides an interface between \textsf{GAP} and either PARI/GP or OSCAR. When \textsf{Alnuth} is loaded in \textsf{GAP} running inside OSCAR, it automatically uses OSCAR. Otherwise, \textsf{Alnuth} uses PARI/GP, which has to be obtained and installed independently of this
package. \textsf{Alnuth} works with PARI/GP Version 2.5 or higher.  
\section{\textcolor{Chapter }{Installing Alnuth}}\label{Installing Alnuth}
\logpage{[ 4, 1, 0 ]}
\hyperdef{L}{X821B9C2D817C0BE7}{}
{
  The package \textsf{Alnuth} is part of the standard distribution of \textsf{GAP} so that in most cases there is no need to install it separately. If you are
using \textsf{GAP} inside OSCAR, then \textsf{Alnuth} is already bundled and automatically uses OSCAR, so no further installation is
required. Otherwise, to use \textsf{Alnuth} you need to have PARI/GP installed. See the following section for information
on PARI/GP. 

 In case you want to update \textsf{Alnuth} independently of your main \textsf{GAP} installation or if you are interested in an old version of \textsf{Alnuth} interfacing to KANT/KASH you can find all released versions of \textsf{Alnuth} in the form of gzipped tar\texttt{\symbol{45}}archives at \href{https://github.com/gap-packages/alnuth/releases} {\texttt{https://github.com/gap\texttt{\symbol{45}}packages/alnuth/releases}} 

 There are two ways of installing a \textsf{GAP} package. If you have permission to add files to the installation of \textsf{GAP} on your system you may install \textsf{Alnuth} into the \texttt{pkg} subdirectory of the \textsf{GAP} installation tree. Otherwise you may install \textsf{Alnuth} in a private \texttt{pkg} directory (for details see Subsections  (\textbf{Reference: Installing a GAP Package}) and  (\textbf{Reference: GAP Root Directories}) in the \textsf{GAP} reference manual). 

 To install the latest version of \textsf{Alnuth} download one of the archives \texttt{alnuth.tar.gz}, move it to the directory \texttt{pkg} in which you want to install, and unpack the archive. If you are using the
command line you can unpack with the command \texttt{tar xzf alnuth.tar.gz}. 

 }

  
\section{\textcolor{Chapter }{Getting PARI/GP}}\label{Getting PARI/GP}
\logpage{[ 4, 2, 0 ]}
\hyperdef{L}{X83B28FDC7FACCE51}{}
{
  Using \textsf{Alnuth} outside OSCAR requires an installation of PARI/GP in Version 2.5 or higher.
The software PARI/GP is freely available at \href{https://pari.math.u-bordeaux.fr/} {\texttt{https://pari.math.u\texttt{\symbol{45}}bordeaux.fr/}} 

 Note that the place where PARI/GP is located in your system is independent of
the place where \textsf{Alnuth} is installed. 

 
\begin{enumerate}
\item  \emph{Installing under Linux} 

 In many Linux distributions PARI/GP can be installed via the software package
manager, but this might sometimes be an older version which cannot be used
together with \textsf{Alnuth}. (Starting GP from the command line with the option \texttt{\texttt{\symbol{45}}\texttt{\symbol{45}}version\texttt{\symbol{45}}short} will show you the version number.) 

 If you install PARI/GP from source make sure you install with GMP support for
better performance and complete the installation with \texttt{make install} so that you can start GP by just calling \texttt{gp} from the command line. 
\item  \emph{Installing under Windows} 

 For Windows it is sufficient to get the basic GP binary which can be found at \href{https://pari.math.u-bordeaux.fr/download.html} {\texttt{https://pari.math.u\texttt{\symbol{45}}bordeaux.fr/download.html}} 
\end{enumerate}
 }

  
\section{\textcolor{Chapter }{Adjust the path of the executable for GP}}\label{Adjust the path of the executable for GP}
\logpage{[ 4, 3, 0 ]}
\hyperdef{L}{X815DF28A87D65A3A}{}
{
  When \textsf{Alnuth} is used outside OSCAR, it needs to know where the executable for GP is. In the
default setting \textsf{Alnuth} looks for an executable program named \texttt{gp} in the search paths of the system. More precisely, for a file \texttt{gp} inside one of the directories in the list returned by \texttt{DirectoriesSystemPrograms()} (called in a \textsf{GAP} session). 

 Under Linux the default setting should work with a standard installation of
PARI/GP. 

 For the default setting to work under Windows the downloaded executable file,
for example \texttt{gp\texttt{\symbol{45}}2\texttt{\symbol{45}}5\texttt{\symbol{45}}0.exe} has to be renamed to \texttt{gp.exe} and moved to one of the directories listed by \texttt{DirectoriesSystemPrograms()} (Ignore the leading \texttt{cygdrive} in each path name and note that the single letter specifies the drive, for
example \texttt{/cygdrive/c/Windows/} denotes the folder \texttt{Windows} on drive \texttt{C:}). 

 To check whether an executable of GP in Version 2.5 or higher is available
with the default setting, you can use the function 

\subsection{\textcolor{Chapter }{PariVersion}}
\logpage{[ 4, 3, 1 ]}\nobreak
\hyperdef{L}{X84E2E83F8251DC49}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{PariVersion({\mdseries\slshape })\index{PariVersion@\texttt{PariVersion}}
\label{PariVersion}
}\hfill{\scriptsize (function)}}\\


 which prints the version number, if the user preference \texttt{PariGpPath} refers to a usable GP executable. }

 If you cannot use the default setting for you purpose, you have several ways
to configure Alnuth. 

 The recommended approach is to use the \textsf{GAP} user preference system: 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@SetUserPreference("alnuth", "PariGpPath", "/home/my/pari-2.5.0/gp");|
  !gapprompt@gap>| !gapinput@SetUserPreference("alnuth", "PariStackSize", 256);|
  !gapprompt@gap>| !gapinput@WriteGapIniFile();|
\end{Verbatim}
 This changes the current session immediately. \texttt{WriteGapIniFile()} writes the current non\texttt{\symbol{45}}default settings to your personal \texttt{gap.ini}, so they are used again in future \textsf{GAP} sessions. See  (\textbf{Reference: Configuring User preferences}) for background on the user preference system. 

 The user preferences relevant for Alnuth are shown by \texttt{ShowUserPreferences("alnuth");}. The most important ones are \texttt{PariGpPath}, \texttt{PariGpOptions}, \texttt{PariStackSize}, and \texttt{PrimitiveElementTrials}. 

 In older versions of \textsf{Alnuth} configuration was done via the global variables \texttt{AL{\textunderscore}EXECUTABLE}, \texttt{AL{\textunderscore}PATH}, \texttt{AL{\textunderscore}OPTIONS}, \texttt{AL{\textunderscore}STACKSIZE}, and \texttt{PRIM{\textunderscore}TEST}. These globals are deprecated, and they trigger a warning when used. The
globals except for \texttt{AL{\textunderscore}PATH} still serve as a fallback if the corresponding user preference is unusable.
Their replacements are as follows: 
\begin{description}
\item[{\texttt{AL{\textunderscore}EXECUTABLE}}] use the user preference \texttt{PariGpPath}
\item[{\texttt{AL{\textunderscore}OPTIONS}}] use the user preference \texttt{PariGpOptions}
\item[{\texttt{AL{\textunderscore}STACKSIZE}}] use the user preference \texttt{PariStackSize}
\item[{\texttt{PRIM{\textunderscore}TEST}}] use the user preference \texttt{PrimitiveElementTrials}
\item[{\texttt{AL{\textunderscore}PATH}}] has been removed; Alnuth now always uses the bundled GP helper files.
\end{description}
 

 For backwards compatibility, the following functions still exist after loading
the package (see Section \ref{Loading and testing the package}), but they are deprecated wrappers around the user preference system. 

\subsection{\textcolor{Chapter }{SetAlnuthExternalExecutable}}
\logpage{[ 4, 3, 2 ]}\nobreak
\hyperdef{L}{X7F2835FB7C5069DD}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{SetAlnuthExternalExecutable({\mdseries\slshape path})\index{SetAlnuthExternalExecutable@\texttt{SetAlnuthExternalExecutable}}
\label{SetAlnuthExternalExecutable}
}\hfill{\scriptsize (function)}}\\


 sets the user preference \texttt{PariGpPath} for the current \textsf{GAP} session. Depending on your installation of PARI/GP and your operating system
the string \mbox{\texttt{\mdseries\slshape path}} can be either the command to start GP in a terminal (for example \texttt{gp}) or the complete path to the executable of GP. The function is deprecated;
new code should call \texttt{SetUserPreference("alnuth", "PariGpPath", path);} directly. 

 The function returns the stored preference value. }

 

\subsection{\textcolor{Chapter }{SetAlnuthExternalExecutablePermanently}}
\logpage{[ 4, 3, 3 ]}\nobreak
\hyperdef{L}{X81CD0C70812FC6F3}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{SetAlnuthExternalExecutablePermanently({\mdseries\slshape path})\index{SetAlnuthExternalExecutablePermanently@\texttt{Set}\-\texttt{Alnuth}\-\texttt{External}\-\texttt{Executable}\-\texttt{Permanently}}
\label{SetAlnuthExternalExecutablePermanently}
}\hfill{\scriptsize (function)}}\\


 does the same as \texttt{SetAlnuthExternalExecutable} and then calls \texttt{WriteGapIniFile()} to persist the current user preference settings in your personal \texttt{gap.ini}. The function is deprecated; new code should call \texttt{SetUserPreference("alnuth", "PariGpPath", path); WriteGapIniFile();} instead. }

 

\subsection{\textcolor{Chapter }{RestoreAlnuthExternalExecutablePermanently}}
\logpage{[ 4, 3, 4 ]}\nobreak
\hyperdef{L}{X7F648B427EB19552}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{RestoreAlnuthExternalExecutablePermanently({\mdseries\slshape })\index{RestoreAlnuthExternalExecutablePermanently@\texttt{Restore}\-\texttt{Alnuth}\-\texttt{External}\-\texttt{Executable}\-\texttt{Permanently}}
\label{RestoreAlnuthExternalExecutablePermanently}
}\hfill{\scriptsize (function)}}\\


 restores the default value of \texttt{PariGpPath} and then calls \texttt{WriteGapIniFile()}. The function is deprecated; new code should set \texttt{PariGpPath} to the desired default command or path and then call \texttt{WriteGapIniFile()} directly. }

 }

  
\section{\textcolor{Chapter }{Loading and testing the package}}\label{Loading and testing the package}
\logpage{[ 4, 4, 0 ]}
\hyperdef{L}{X781C2F107F76F8A4}{}
{
  If \textsf{Alnuth} is not loaded when GAP is started you have to request it explicitly to use it.
This is done by calling \texttt{LoadPackage("alnuth");} in a GAP session. If \textsf{Alnuth} had not been loaded already a short banner will be displayed. 

 
\begin{Verbatim}[commandchars=!|F,fontsize=\small,frame=single,label=Example]
  !gapprompt|gap>F !gapinput|LoadPackage("alnuth");F
  Loading Alnuth 4.0.0 (ALgebraic NUmber THeory and an interface to PARI/GP and OSCAR)
  by Björn Assmann,
     Andreas Distler (a.distler@tu-bs.de), and
     Bettina Eick (http://www.iaa.tu-bs.de/beick).
  maintained by:
     Max Horn (https://www.quendi.de/math) and
     The GAP Team (support@gap-system.org).
  Homepage: https://gap-packages.github.io/alnuth
  Report issues at https://github.com/gap-packages/alnuth/issues
  true
  gap>
\end{Verbatim}
 To load a certain version of \textsf{Alnuth} you can specify the version number as second argument in the call to \texttt{LoadPackage}. (See \texttt{LoadPackage} (\textbf{Reference: LoadPackage}) in the \textsf{GAP} reference manual or type \texttt{?LoadPackage} within a GAP session). 

 Once the package is loaded, it is possible to check the correct installation
running a short test by calling \texttt{ReadPackage("Alnuth", "tst/testinstall.tst");}. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ReadPackage("Alnuth", "tst/testinstall.g");|
  Architecture: aarch64-apple-darwin21.4.0-default64-kv8
  
  testing: GAPROOT/pkg/alnuth/tst/ALNUTH.tst
        66 ms (33 ms GC) and 11.0MB allocated for GAPROOT/pkg/alnuth/tst/ALNUTH.tst
  testing: GAPROOT/pkg/alnuth/tst/version.tst
        21 ms (21 ms GC) and 29.6KB allocated for GAPROOT/pkg/alnuth/tst/version.tst
  -----------------------------------
  total        87 ms (54 ms GC) and 11.0MB allocated
                0 failures in 2 files
  
  #I  No errors detected while testing
  gap>
\end{Verbatim}
 The architecture, timings and memory usage will usually differ; other
discrepancies in the output indicate some problem. 

 If the test suite runs into an error in the first part, which when running
outside OSCAR verifies the availability of PARI/GP, check your installation of
PARI/GP and consult the last chapter of the documentation of \textsf{Alnuth} for more information. 

 If you find any bugs or have any suggestions or comments, we would very much
appreciate it if you would let us know by submitting an issue at the \textsf{Alnuth} issue tracker on GitHub \href{https://github.com/gap-packages/alnuth/issues} {\texttt{https://github.com/gap\texttt{\symbol{45}}packages/alnuth/issues}} or by writing an mail to \href{mailto://support@gap-system.org} {\texttt{support@gap\texttt{\symbol{45}}system.org}}. }

 }

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

\bibliographystyle{alpha}
\bibliography{manual.bib}

\addcontentsline{toc}{chapter}{References}

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

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


\printindex

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