% 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.0}
\definecolor{citeColor}{rgb}{0.0,0.0,0.0}
\definecolor{fileColor}{rgb}{0.0,0.0,0.0}
\definecolor{urlColor}{rgb}{0.0,0.0,0.0}
\definecolor{promptColor}{rgb}{0.0,0.0,0.0}
\definecolor{brkpromptColor}{rgb}{0.0,0.0,0.0}
\definecolor{gapinputColor}{rgb}{0.0,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{36}{38}\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{The \textsf{GAP} Character Table Library\index{CTblLib}\mbox{}}}\\
\vfill

\hypersetup{pdftitle=The \textsf{GAP} Character Table Library\index{CTblLib}}
\markright{\scriptsize \mbox{}\hfill The \textsf{GAP} Character Table Library\index{CTblLib} \hfill\mbox{}}
{\Huge (Version 1.3.4) \mbox{}}\\[1cm]
\mbox{}\\[2cm]
{\Large \textbf{Thomas Breuer   \mbox{}}}\\
\hypersetup{pdfauthor=Thomas Breuer   }
\end{center}\vfill

\mbox{}\\
{\mbox{}\\
\small \noindent \textbf{Thomas Breuer   }  Email: \href{mailto://sam@math.rwth-aachen.de} {\texttt{sam@math.rwth-aachen.de}}\\
  Homepage: \href{https://www.math.rwth-aachen.de/~Thomas.Breuer} {\texttt{https://www.math.rwth-aachen.de/\texttt{\symbol{126}}Thomas.Breuer}}}\\
\end{titlepage}

\newpage\setcounter{page}{2}
{\small 
\section*{Copyright}
\logpage{[ 0, 0, 1 ]}
 {\copyright} 2003{\textendash}2022 by Thomas Breuer 

 This package may be distributed under the terms and conditions of the GNU
Public License Version 3 or later, see \href{http://www.gnu.org/licenses} {\texttt{http://www.gnu.org/licenses}}. \mbox{}}\\[1cm]
\newpage

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

\tableofcontents
\newpage

    
\chapter{\textcolor{Chapter }{Introduction to the \textsf{GAP} Character Table Library}}\label{ch:introduction}
\logpage{[ 1, 0, 0 ]}
\hyperdef{L}{X86DEA3CF7802FFF7}{}
{
  The usefulness of \textsf{GAP} for character theoretic tasks depends on the availability of many known
character tables, and there are a lot of character tables in the \textsf{GAP} table library. Of course, this library is ``open'' in the sense that it shall be extended. So we would be grateful for any
further tables of interest sent to us for inclusion into our library. Please
offer interesting new character tables via e-mail to \href{mailto://sam@math.rwth-aachen.de} {\texttt{sam@math.rwth-aachen.de}}. 

 It depends on your \textsf{GAP} installation whether the character table library is available. You can check
this as follows. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@InstalledPackageVersion( "ctbllib" ) <> fail;|
  true
\end{Verbatim}
 

 If the result is \texttt{false} then the library is not installed, and you may ask your system administrator
for installing it, or install the library in your home directory, see
Section{\nobreakspace}\ref{subsect:install}. 

 For general information about character tables in \textsf{GAP}, see Chapter{\nobreakspace} (\textbf{Reference: Character Tables}). 

 \label{application-files}   Examples of character theoretic computations  involving the \textsf{GAP} Character Table Library are part of the package. They are dealing with the
following aspects. 

 
\begin{itemize}
\item  Maintenance issues concerning the \textsf{GAP} Character Table Library  (\textbf{CTblLibXpls: Maintenance Issues for the GAP Character Table Library}). 
\item  Constructions of character tables using table automorphisms, see  (\textbf{CTblLibXpls: Using Table Automorphisms for Constructing Character Tables in GAP}). 
\item  Computations of common central extensions, see  (\textbf{CTblLibXpls: Constructing Character Tables of Central Extensions in GAP}). 
\item  Hamiltonian cycles in the generating graphs of finite groups, see  (\textbf{CTblLibXpls: GAP  Computations  Concerning  Hamiltonian  Cycles in the Generating Graphs of
Finite Groups}). 
\item  A question about the group PSO$^+(8,5).S_3$, see  (\textbf{CTblLibXpls: GAP Computations with O{\textunderscore}8\texttt{\symbol{94}}+(5).S{\textunderscore}3 and O{\textunderscore}8\texttt{\symbol{94}}+(2).S{\textunderscore}3}). 
\item  Solvable subgroups of maximal order in sporadic simple groups  (\textbf{CTblLibXpls: Solvable Subgroups of Maximal Order in Sporadic Simple Groups}). 
\item  Large Nilpotent Subgroups of sporadic simple groups  (\textbf{CTblLibXpls: Large Nilpotent Subgroups of Sporadic Simple Groups}). 
\item  Computations of possible permutation characters, see  (\textbf{CTblLibXpls: Permutation Characters in GAP}). 
\item  Ambiguous class fusions, see  (\textbf{CTblLibXpls: Ambiguous Class Fusions in the GAP Character Table Library}). 
\item  Some computations concerning the classification of groups with the property
that all complex irreducible characters of the same degree are Galois
conjugate (together with Klaus Lux), see  (\textbf{CTblLibXpls: GAP computations needed in the proof of [DNT13, Theorem 6.1 (ii)]}). 
\item  Probabilistic generation of finite simple groups, see \cite{ProbGenArxiv} or an updated version at  (\textbf{CTblLibXpls: GAP Computations Concerning Probabilistic Generation of Finite Simple Groups}). 
\item  Ordinary character tables, Brauer tables, and decomposition matrices, see \href{http://www.math.rwth-aachen.de/~Thomas.Breuer/ctbllib/doc/ctbldeco.pdf} {\texttt{doc/ctbldeco.pdf}} and \href{http://www.math.rwth-aachen.de/~Thomas.Breuer/ctbllib/htm/ctbldeco.htm} {\texttt{htm/ctbldeco.htm}}. 
\item  Multiplicity-free permutation characters of the sporadic simple groups and
their automorphism groups, see \href{http://www.math.rwth-aachen.de/~Thomas.Breuer/ctbllib/doc/multfree.pdf} {\texttt{doc/multfree.pdf}} and \href{http://www.math.rwth-aachen.de/~Thomas.Breuer/ctbllib/htm/multfree.htm} {\texttt{htm/multfree.htm}}. 
\item  Multiplicity-free permutation characters of central extensions of the sporadic
simple groups, and their automorphic extensions (together with J{\"u}rgen
M{\"u}ller), see \href{http://www.math.rwth-aachen.de/~Thomas.Breuer/ctbllib/doc/multfre2.pdf} {\texttt{doc/multfre2.pdf}} and \href{http://www.math.rwth-aachen.de/~Thomas.Breuer/ctbllib/htm/multfre2.htm} {\texttt{htm/multfre2.htm}}. 
\item  The construction of some character tables of \textsf{Atlas} groups, using character theoretic methods, see \cite{AtlasVerifyLargeArxiv} or an updated version at \href{http://www.math.rwth-aachen.de/~Thomas.Breuer/ctbllib/doc/ctblatlas.pdf} {\texttt{doc/ctblatlas.pdf}} and \href{http://www.math.rwth-aachen.de/~Thomas.Breuer/ctbllib/htm/ctblatlas.htm} {\texttt{htm/ctblatlas.htm}}. 
\item  The verification of the character table of the Baby Monster group, see \cite{BMverify} or an updated version at \href{http://www.math.rwth-aachen.de/~Thomas.Breuer/ctbllib/doc/ctblbm.pdf} {\texttt{doc/ctblbm.pdf}} and \href{http://www.math.rwth-aachen.de/~Thomas.Breuer/ctbllib/htm/ctblbm.htm} {\texttt{htm/ctblbm.htm}}. 
\end{itemize}
 

 If you use the \textsf{GAP} Character Table Library to solve a problem then please send a short e-mail to \href{mailto://sam@math.rwth-aachen.de} {\texttt{sam@math.rwth-aachen.de}} about it. The \textsf{GAP} Character Table Library database should be referenced as follows. 
\begin{Verbatim}[fontsize=\small,frame=single,label=]
  @misc{ CTblLib1.3.4,
    author =       {Breuer, T.},
    title =        {The \textsf{GAP} {C}haracter {T}able {L}ibrary,
                    {V}ersion 1.3.4},
    month =        {April},
    year =         {2022},
    note =         {\textsf{GAP} package},
    howpublished = {http://www.math.rwth-aachen.de/\~{}Thomas.Breuer/ctbllib}
  }
\end{Verbatim}
 

 For referencing the \textsf{GAP} system in general, use the entry{\nobreakspace}\cite{GAP} in the bibliography of this manual, see also 

 \href{http://www.gap-system.org} {\texttt{http://www.gap-system.org}}.  
\section{\textcolor{Chapter }{History of the \textsf{GAP} Character Table Library}}\label{sec:history}
\logpage{[ 1, 1, 0 ]}
\hyperdef{L}{X7ED5D4B77E9F2A4C}{}
{
  The first version of the \textsf{GAP} Character Table Library was released with \textsf{GAP}{\nobreakspace}3.1 in March 1992. 

 It was the first aim of this library to continue the character table library
of the \textsf{CAS} system (see \cite{NPP84}) in \textsf{GAP}, as a part of the process of reimplementing the algorithms of \textsf{CAS} in \textsf{GAP}, see{\nobreakspace} (\textbf{Reference: History of Character Theory Stuff in GAP}). \textsf{GAP}{\nobreakspace}3.1 provided only very restricted methods for computing
character tables from groups, so its character theory part was concerned
mainly with library tables. 

 A second aspect of the character table library was to make all character
tables shown in the \textsf{Atlas} of Finite Groups \cite{CCN85} available in \textsf{GAP}. In fact \textsf{GAP} turned out to provide a very good environment for systematic checks of these
character tables. 

 To some extent, the access to the (ordinary) character tables
in{\nobreakspace}\cite{CCN85} was a prerequisite for storing also the corresponding Brauer character tables
in the \textsf{GAP} Character Table Library. Already \textsf{GAP}{\nobreakspace}3.1 contained many of these tables. They have been computed
mainly ``outside of \textsf{GAP}'', using the methods described in{\nobreakspace}\cite{HJLP92}, and part of the library has been published in the \textsf{Atlas} of Brauer Characters \cite{JLPW95}. One of the roles of \textsf{GAP} was again to perform systematic checks. 

 Besides these projects, many individual character tables have been added to
the \textsf{GAP} Character Table Library since the times of \textsf{GAP}{\nobreakspace}3.1. They were computed from groups or with character theoretic
methods or using a combination of these two possibilities (see,
e.{\nobreakspace}g., \cite{NPP84} and \cite{LP91}). 

 Section{\nobreakspace}\ref{sec:contents} lists some of the sources. The changes in the \textsf{GAP} Character Table Library since the release of \textsf{GAP}{\nobreakspace}4.1 (in July 1999) are individually documented in the file \href{http://www.math.rwth-aachen.de/~Thomas.Breuer/ctbllib/doc/ctbldiff.pdf} {\texttt{doc/ctbldiff.pdf}} of the package. 

 Currently the main focus in the development of the \textsf{GAP} Character Table Library is {\textendash}besides the addition of tables that
appear to be interesting{\textendash} the better interaction with other
databases, such as the \textsf{Atlas} of Group Representations and the \textsf{GAP} Library of Tables of Marks (see the \textsf{GAP} packages \textsf{AtlasRep} and \textsf{TomLib}) and \textsf{GAP}'s group libraries, and an improvement of the ``database'' aspect of the character table library itself, see the sections \ref{sect:accessdata} and \ref{sect:ctbllib-browse}.  

 Until the release of \textsf{GAP}{\nobreakspace}4.3 in spring 2002, the \textsf{GAP} Character Table Library had been a part of the main \textsf{GAP} library. With \textsf{GAP}{\nobreakspace}4.3, it was ``split off'' as a \textsf{GAP} package. }

  
\section{\textcolor{Chapter }{What's New in \textsf{CTblLib}, Compared to Older Versions?}}\label{sect:What's New in CTblLib?}
\logpage{[ 1, 2, 0 ]}
\hyperdef{L}{X7DFD446B7840A6E0}{}
{
  The PDF file \texttt{doc/ctbldiff.pdf} of the package lists the important changes to the data since October 1996,
mainly related to the relevant simple groups. 

 A perhaps more suitable overview of these changes is given by the \textsf{GAP} readable file \texttt{data/ctbldiff.json}, which contains a complete overview of all changes, including the additions
of class fusions. (Note that each added or changed fusion is mentioned twice
in this list, once for the ``from'' table and once for the ``to'' table.) This list of changes can be shown and evaluated using \texttt{BrowseCTblLibDifferences} (\ref{BrowseCTblLibDifferences}) if the \textsf{Browse} package (see{\nobreakspace}\cite{Browse}) is available.    
\subsection{\textcolor{Chapter }{What's New in Version 1.3.4? (April 2022)}}\label{sec:new1.3.4}
\logpage{[ 1, 2, 1 ]}
\hyperdef{L}{X8673993582B1792E}{}
{
  The release of Version{\nobreakspace}1.3.4 was necessary for technical
reasons: Now the testfile mentioned in \texttt{PackageInfo.g} exits \textsf{GAP} in the end. }

  
\subsection{\textcolor{Chapter }{What's New in Version 1.3.3? (January 2022)}}\label{sec:new1.3.3}
\logpage{[ 1, 2, 2 ]}
\hyperdef{L}{X81F15ABF81515359}{}
{
  The reason for this release was the addition of the new example section  (\textbf{CTblLibXpls: Generation of sporadic simple groups by {\ensuremath\pi}- and {\ensuremath\pi}'-subgroups (December{\nobreakspace}2021)}), which requires the new data file \texttt{data/prim{\textunderscore}perm{\textunderscore}M.json}. (The data had already been used before in the example section  (\textbf{CTblLibXpls: The Monster}), which has now been changed accordingly.) 

 The database attribute \texttt{IsQuasisimple} has been added, which describes perfect central extensions of nonabelian
simple groups. It can be used for example to select the character tables of
quasisimple groups with \texttt{AllCharacterTableNames} (\ref{AllCharacterTableNames}). Thanks to Gunter Malle for suggesting this addition. 

 No new character tables have been added, and there are only a few new class
fusions, admissible names, and group constructions. }

  
\subsection{\textcolor{Chapter }{What's New in Version 1.3.2? (March 2021)}}\label{sec:new1.3.2}
\logpage{[ 1, 2, 3 ]}
\hyperdef{L}{X7C0B3B6D7EC044DC}{}
{
  The main new features of this release are technical. 
\begin{itemize}
\item  The initialization of the database (at the time when the package gets loaded)
has been changed. Instead of executing \textsf{GAP} code in the formerly available (huge) file \texttt{data/ctprimar.tbl}, now one calls a few short \textsf{GAP} functions, in the new file \texttt{gap4/ctprimar.g}, which evaluate JSON format files. This was one more step on the way to make
the database independent of \textsf{GAP}. 
\item  Also the files with the precomputed attribute values are now in JSON format,
since now the \textsf{Browse} supports this format. 
\item  The \href{http://www.math.rwth-aachen.de/~Thomas.Breuer/ctbllib/ctbltoc/index.html} {``WWW table of contents''} of the package has been updated in the sense that it shows the same as the
functions \texttt{DisplayCTblLibInfo} (\ref{DisplayCTblLibInfo:for a name}) and \texttt{BrowseCTblLibInfo} (\ref{BrowseCTblLibInfo}); at the same time, these functions have been extended in order to link each
table to its main table and to its duplicates. The code for creating the HTML
files is now distributed with the package, in the \texttt{ctbltoc} directory. 
\item  The mechanism for processing the package documentation (which contains two \textsf{GAPDoc} books) has been changed to a more standard way. Now it is enough to process
one \textsf{GAP} input file in the package directory. 
\end{itemize}
 

 In several \texttt{InfoText} (\ref{InfoText}) values of character tables, information about group constructions has been
added; where possible, these constructions are now also available via \texttt{GroupInfoForCharacterTable} (\ref{GroupInfoForCharacterTable}); for example, this function now supports also the construction of a group as
the automorphism group of a simple group. (Thanks to Gunter Malle for ideas
and discussions about this feature.) 

 The function \texttt{BrowseAtlasImprovements} (\ref{BrowseAtlasImprovements}) can now show (also) the improvements for the \textsf{Atlas} of Brauer Characters \cite{JLPW95}. 

 The strings \texttt{"L2(49)"} and \texttt{"L2(81)"} are now valid inputs for \texttt{DisplayAtlasMap} (\ref{DisplayAtlasMap:for the name of a simple group}) and \texttt{BrowseAtlasTable} (\ref{BrowseAtlasTable}), and \texttt{DisplayAtlasContents} (\ref{DisplayAtlasContents}) and \texttt{BrowseAtlasContents} (\ref{BrowseAtlasContents}) now show information about these two and \texttt{"L6(2)"} and \texttt{"S10(2)"}. 

 Besides these changes, a few new tables and class fusions have been added. A
few new examples of applications have been added, see the sections \ref{subsect:elabsubgroup},  (\textbf{CTblLibXpls: The Character Table of 4.L{\textunderscore}2(49).2{\textunderscore}3 (December 2020)}),  (\textbf{CTblLibXpls: The Character Table of 4.L{\textunderscore}2(81).2{\textunderscore}3 (December 2020)}).  }

  
\subsection{\textcolor{Chapter }{What's New in Version 1.3.1? (April 2020)}}\label{sec:new1.3.1}
\logpage{[ 1, 2, 4 ]}
\hyperdef{L}{X79418416826FE5F2}{}
{
  This release was motivated by small technical changes: A few typos were fixed,
an acknowledgement was added, the directory name of the package now contains
the version number (in order not to overwrite older versions), and the process
to generate the package documentation was made independent of other packages. 

 Besides that, the function \texttt{CharacterTableComputedByMagma} (\ref{CharacterTableComputedByMagma}) was made more robust. 

 In particular, the data part of the package was not changed at all. }

  
\subsection{\textcolor{Chapter }{What's New in Version 1.3.0? (December 2019)}}\label{sec:new1.3.0}
\logpage{[ 1, 2, 5 ]}
\hyperdef{L}{X83D8236D7E750DFE}{}
{
  We distinguish bug fixes, new features, new character table data, new data of
other kind, and changed documentation. 

 \emph{The following bugs were fixed.} 

 
\begin{itemize}
\item  The $2$-modular Brauer table of the character table with the identifier \texttt{"3.(2x2\texttt{\symbol{94}}(1+8)):(U4(2):2x2)"} was wrong, due to an error in the \textsf{GAP} function that constructs this Brauer table from the known Brauer table of $U_4(2).2$; this was the only case in the library that was affected by this bug. (Thanks
to J{\"u}rgen M{\"u}ller who pointed out this error.)  
\item  The $2$-power map of the character table with the identifier \texttt{"2.F4(2).2"} was wrong,  see Section  (\textbf{CTblLibXpls: An Error in a Power Map of the Character Table of 2.F{\textunderscore}4(2).2 (November 2015)}). (This error has been found in the context of the computations that are
described in \cite{BMO17}.) 
\item  The character table of $E_6(2)$ was wrong w. r. t. some irrational character values and power maps on the
classes of element order $91$,  see Section  (\textbf{CTblLibXpls: An Error in the Character Table of E{\textunderscore}6(2) (March 2016)}).  (Thanks to Bill Unger who pointed out this error.)  
\item  Character tables with construction info \texttt{ConstructAdjusted} (\ref{ConstructAdjusted}) had immutable \texttt{ComputedPowerMaps} (\textbf{Reference: ComputedPowerMaps}) values, which made it impossible to add more power maps. (Thanks to Fabian
Gundlach who pointed out this error.)  
\end{itemize}
 

 \emph{The following features have been added.} 

 
\begin{itemize}
\item  The functions \texttt{AllCharacterTableNames} (\ref{AllCharacterTableNames}), \texttt{OneCharacterTableName} (\ref{OneCharacterTableName}), and \texttt{BrowseCTblLibInfo} (\ref{BrowseCTblLibInfo}) support now the global option \texttt{OrderedBy}. 
\item  The operation \texttt{BrauerTable} (\ref{BrauerTable:for a string, and a prime integer}) now admits also a string as its first argument, and then delegates to the
ordinary character table with this name. 
\item  The operation \texttt{BrauerTable} (\ref{BrauerTable:for a string, and a prime integer}) is now successful also if the ordinary character table in question has the
attribute \texttt{ConstructionInfoCharacterTable} (\ref{ConstructionInfoCharacterTable}) set and the first entry of the attribute value is the string \texttt{"ConstructGS3"} and the Brauer tables for the character tables involved in the construction
are available, see Section  (\textbf{CTblLibXpls: Examples for the Type G.S{\textunderscore}3}). 
\item  The function \texttt{CambridgeMaps} (\ref{CambridgeMaps}) has been improved in the sense that ``relative'' class names such as \texttt{"B*2"} occur whenever this is possible, where the element order does not appear in
the class name, and a Galois automorphism describes the relation to another
class. (The character table with identifier \texttt{"L2(13)"} is an example for which the result is now different.) 
\item  The function \texttt{ConstructIsoclinic} (\ref{ConstructIsoclinic}) has been extended, according to the extended functionality of \texttt{CharacterTableIsoclinic} (\textbf{Reference: CharacterTableIsoclinic}). For examples, see the sections  (\textbf{CTblLibXpls: Groups of the Structures 3.U{\textunderscore}3(8).3{\textunderscore}1 and 3.U{\textunderscore}3(8).6 (February 2017)}) and  (\textbf{CTblLibXpls: The Character Table of 9.U{\textunderscore}3(8).3{\textunderscore}3 (March 2017)}). 
\item  There is now a default \texttt{InfoText} (\ref{InfoText}) method for library character tables, which returns an empty string. This
admits searches for properties of the info text via \texttt{AllCharacterTableNames} (\ref{AllCharacterTableNames}). Similarly, also properties of \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) can now be searched efficiently, see \texttt{AllCharacterTableNames} (\ref{AllCharacterTableNames}) for examples. 
\item  With the user preference \texttt{DisplayFunction} of the \textsf{AtlasRep} package (see Section \ref{subsect:displayfunction}), one can configure how functions like \texttt{DisplayCTblLibInfo} (\ref{DisplayCTblLibInfo:for a name}) place their output on the screen. (Up to now, the function \texttt{Pager} (\textbf{Reference: Pager}) had always been called.) 
\item  The definition of ``duplicate tables'' has been extended in order to get a better integration of the \textsf{SpinSym} package, see Section{\nobreakspace}\ref{sec:duplicates}. 
\item  A new variant of the function \texttt{GAPTableOfMagmaFile} (\ref{GAPTableOfMagmaFile:for a string}) admits entering a \textsf{MAGMA} format string instead of the name of a file that contains this string. 
\item  The new function \texttt{CharacterTableComputedByMagma} (\ref{CharacterTableComputedByMagma}) uses the \textsf{MAGMA} system (if this is available) for computing the character table of a
permutation group. 
\item  The new function \texttt{NotifyCharacterTables} (\ref{NotifyCharacterTables}) is more efficient than \texttt{NotifyCharacterTable} (\ref{NotifyCharacterTable}) if one wants to add several private character tables at the same time. 
\item  In the tables of maximal subgroups and Sylow $p$ normalizers shown by \texttt{DisplayCTblLibInfo} (\ref{DisplayCTblLibInfo:for a name}) and \texttt{BrowseCTblLibInfo} (\ref{BrowseCTblLibInfo}), the former \texttt{Name} column has been replaced by two columns \texttt{Structure} (which tries to show information about the structures of the groups, using \texttt{StructureDescriptionCharacterTableName} (\ref{StructureDescriptionCharacterTableName})) and \texttt{Name} (which just shows the identifiers of the character tables). This improvement
arose from a discussion with Gabriel Navarro. 
\item  The former \textsf{GAP} readable text file \texttt{data/ctbldiff.dat} has been replaced by the (still \textsf{GAP} readable) JSON format file \texttt{data/ctbldiff.json}. (It is planned for future releases to replace more data files by JSON format
files, in order to make the data independent of \textsf{GAP}.) 
\item  Two filenames of the package have been changed, from \texttt{ctadmin.tbd} and \texttt{ctadmin.tbi} to \texttt{ctadmin.gd} and \texttt{ctadmin.gi}, respectively. 
\end{itemize}
 

 Concerning \emph{added character table data}, the full list of differences w. r. t. earlier versions can be found in the
file \texttt{data/ctbldiff.json} of the package; see \texttt{BrowseCTblLibDifferences} (\ref{BrowseCTblLibDifferences}) for a way to utilize this list in a \textsf{GAP} session. 

 \emph{The following other data have been added.} 

 
\begin{itemize}
\item  \texttt{GroupInfoForCharacterTable} (\ref{GroupInfoForCharacterTable}) works now for more character tables than before. 

 In particular there are representations for all \textsf{Atlas} groups (bicyclic extensions of simple groups whose character tables are shown
in the \textsf{Atlas} of Finite Groups \cite{CCN85}, up to isoclinism), except the groups $2.B$ and $M$; several of these representations were computed in the context of the
computations that are described in \cite{BMO17}. 

 Also the library tables of groups that occur in \textsf{GAP}'s library of primitive groups (the \textsf{GAP} package \textsf{PrimGrp}) know about this fact; note that older versions of \textsf{PrimGrp} contained only groups of degree at most $2499$. 

 See Section  (\textbf{CTblLibXpls: Some finite factor groups of perfect space groups (February 2014)}) for some other representations that are now available. 
\end{itemize}
 

 \emph{Finally, the documentation was changed as follows.} 

 
\begin{itemize}
\item  Several of the files showing examples of character theoretic computations with \textsf{GAP} have been turned into the \textsf{GAPDoc} book ``CTblLibXpls'', see above.  Some advantages of this new setup are that the contents can be accessed also
in \textsf{GAP}'s interactive help, and that cross-referencing is simpler. 
\end{itemize}
 }

  
\subsection{\textcolor{Chapter }{What's New in Version 1.2.2? (March 2013)}}\label{sec:new1.2.2}
\logpage{[ 1, 2, 6 ]}
\hyperdef{L}{X7BC6B5FD7F720EA0}{}
{
  The following bugs were fixed. 
\begin{itemize}
\item  The functions \texttt{AllCharacterTableNames} (\ref{AllCharacterTableNames}) and \texttt{OneCharacterTableName} (\ref{OneCharacterTableName}) ran into an error in certain situations, if the library had been extended by
private tables, see Section \ref{sec:extending}. (As a consequence, the description of \texttt{IsDuplicateTable} (\ref{IsDuplicateTable}) has been extended.) Thanks to Alexander Konovalov and Lukas Maas for pointing
out this error. 
\item  The function \texttt{CharacterTableOfIndexTwoSubdirectProduct} (\ref{CharacterTableOfIndexTwoSubdirectProduct}) returned a wrong result if the two factors were given by the \emph{same} character table. An example is $(A_5 \times A_5).2$, created as a subdirect product of two copies of $S_5$. 
\end{itemize}
 }

  
\subsection{\textcolor{Chapter }{What's New in Version 1.2.0 and 1.2.1? (May 2012)}}\label{sec:new1.2}
\logpage{[ 1, 2, 7 ]}
\hyperdef{L}{X7E26A5FD7EBB4FA1}{}
{
  Concerning character table data, we have the following. 
\begin{itemize}
\item  A few bugs in character tables have been fixed. 
\item  Several class fusions stored in character tables have been changed, in order
to be more consistent with related data, see Section \ref{sec:CTblLib Maintenance} for reasons of such changes. 
\item  Many new character tables have been added. For example, a character table is
available for each table of marks in the \textsf{TomLib} package. 
\end{itemize}
 

 Besides these changes of the data, the following features are new. 
\begin{itemize}
\item  A tutorial for beginners was added to the package manual, see Chapter \ref{ch:tutorial}, and the package manual was restructured. The manual is now based on the \textsf{GAPDoc} package (see{\nobreakspace}\cite{GAPDoc}). 
\item  Generic constructions of Brauer tables are now available if the underlying
ordinary table is encoded via \texttt{ConstructMGA} (\ref{ConstructMGA}), \texttt{ConstructIndexTwoSubdirectProduct} (\ref{ConstructIndexTwoSubdirectProduct}), or \texttt{ConstructV4G} (\ref{ConstructV4G}), and if the Brauer tables of the compound tables are known. 
\item  The attributes \texttt{FusionToTom} (\ref{FusionToTom}) and \texttt{Maxes} (\ref{Maxes}) are no longer set in duplicate tables. This can be regarded as a bugfix, in
the following sense. For the sake of consistency, it would in general be
necessary to apply a permutation to the fusion into the table of marks, and to
add the class fusions from the tables of the maximal subgroups to the
duplicate table. 
\item  The consistency checks for character tables have been improved and are now
documented, see Section{\nobreakspace}\ref{sec:CTblLib Sanity Checks}. Due to these checks, several class fusions had to be replaced. 
\item  The concept of duplicate character tables is now documented, see
Section{\nobreakspace}\ref{sec:duplicates}. As a consequence, the behaviour of \texttt{AllCharacterTableNames} (\ref{AllCharacterTableNames}) has changed in situations where \texttt{IsSimple} (\textbf{Reference: IsSimple for a character table}) or \texttt{IsSporadicSimple} (\textbf{Reference: IsSporadicSimple for a character table}) occur as arguments (see  (\textbf{Reference: Group Operations Applicable to Character Tables})), as follows. In earlier versions of the package, duplicate tables had
automatically been excluded. From now on, duplicates can be excluded if one
wants so, but they are not automatically excluded. This change may be regarded
as a bugfix. 
\item  Several attribute values for character tables, such as \texttt{Size} (\textbf{Reference: Size}) and \texttt{NrConjugacyClasses} (\textbf{Reference: NrConjugacyClasses}) are now available without reading the character table data files, provided
that the \textsf{Browse} package (see{\nobreakspace}\cite{Browse}) has been loaded. See the documentation of \texttt{AllCharacterTableNames} (\ref{AllCharacterTableNames}) for details; this function is much faster if only these attributes appear in
the conditions given. Thus it is now more reasonable to use this function for
searches in the table library. 
\item  \textsf{GAP}'s group libraries provide many groups for which the Character Table Library
contains the character tables. Given a character table from the library, one
can list and access available groups with the functions described in
Section{\nobreakspace}\ref{sect:tblgrp}, provided that the \textsf{Browse} package (see{\nobreakspace}\cite{Browse}) has been loaded. 
\item  An interactive overview of the contents is now available that is based on the \textsf{Browse} package \cite{Browse}, see Section \ref{sect:ctbllib-browse}. 
\item  Information about Deligne-Lusztig names of unipotent characters of finite
groups of Lie type is now available, see Section \ref{sec:unipotsec}. 
\item  An interface for reading \textsf{MAGMA} tables was added, see Section \ref{sec:interface-magma}. 
\end{itemize}
 }

  
\subsection{\textcolor{Chapter }{What's New in Version 1.1? (November 2003)}}\label{sec:new1.1}
\logpage{[ 1, 2, 8 ]}
\hyperdef{L}{X79402202865D152A}{}
{
  First of all, of course several character tables were added; for an overview,
see the file \texttt{doc/ctbldiff.pdf} in the home directory of the package. Also lots of class fusions were added.
This includes factor fusions onto the tables of the factor groups modulo the
largest normal $p$-subgroups whenever the tables of the factors are available; these maps admit
the automatic construction of the $p$-modular Brauer tables if the corresponding tables of the factors are
available. For example, the $2$-modular Brauer table of the maximal subgroup of the type $2^{10}:M_{22}$ in the group $Fi_{22}$ is available because of the known $2$-modular table of $M_{22}$ and the stored factor fusion onto the table of $M_{22}$. 

 Second, more information has been made more explicit, in the following sense. 
\begin{itemize}
\item  \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) values of tables that are constructed from generic tables are now valid
arguments of \texttt{CharacterTable} (\textbf{Reference: CharacterTable}), for example \texttt{CharacterTable( "C10" )} and \texttt{CharacterTable( "Sym(5)" )} can be used to create the character table of the cyclic group of order $10$ and of the symmetric group of degree $5$, respectively. 
\item  Attributes have been introduced that replace more or less hidden components
(see Section{\nobreakspace}\ref{sec:attributes}); in particular, the way how many ordinary tables are encoded via the
construction from other tables is no longer encapsulated in a function call
but instead the name of the function and the arguments are stored as an
attribute value (see{\nobreakspace}\texttt{ConstructionInfoCharacterTable} (\ref{ConstructionInfoCharacterTable})). 
\item  The functions that are used for the table constructions have been documented
(see Chapter{\nobreakspace}\ref{chap:constructions}). 
\item  Several consistency checks are now part of the package distribution, in the
files \texttt{gap4/test.gd} and \texttt{gap4/test.gi}. However, currently they are not documented. The new file \texttt{tst/testall.g} lists the files that belong to the ``standard test suite''. Further checks involving the \textsf{GAP} Character Table Library are parts of the \textsf{GAP} packages AtlasRep (see{\nobreakspace}\cite{AtlasRep}) and TomLib. 
\item  As a part of the consistency checks, class fusions between character tables
and from character tables into corresponding tables of marks have been
recomputed, and the \texttt{text} components have been standardized; this means that the texts express whether
the maps are unique, unique up to table automorphisms, or ambiguous. However,
currently this is not documented. 
\item  One can now avoid unloading the contents of data files, which can speed up
computations involving many library tables. (In version 1.1, the function \texttt{CTblLibSetUnload} had been provided for that. Since version 1.2, a \textsf{GAP} 4.5 user preference replaces this function.) 
\end{itemize}
 

 Third, several errors have been corrected (again see{\nobreakspace}\texttt{doc/ctbldiff.pdf}). Most of them affect class fusions, and for most of those, the term ``error'' could be regarded as not really appropriate. See \ref{sec:CTblLib Maintenance} for details. 

 Finally, the \textsf{GAP} functions for reading and writing other formats of character tables have been
moved from the main \textsf{GAP} library to this package (see Chapter{\nobreakspace}\ref{chap:interfaces}), because they are useful only for library tables. The \textsf{GAP}{\nobreakspace}3 format is now also supported, mainly for documentation
purposes (see Section{\nobreakspace}\ref{sec:interface-gap3}). }

 }

  
\section{\textcolor{Chapter }{Acknowledgements}}\label{sec:acknowledgements}
\logpage{[ 1, 3, 0 ]}
\hyperdef{L}{X82A988D47DFAFCFA}{}
{
  The development of the \textsf{GAP} Character Table Library has been supported by several DFG grants, in
particular the project ``Representation Theory of Finite Groups and Finite Dimensional Algebras'' (until 1991), the Schwerpunkt ``Algorithmische Zahlentheorie und Algebra'' (from 1991 until 1997), and the \href{https://www.computeralgebra.de/sfb/} {SFB-TRR 195 ``Symbolic Tools in Mathematics and their Applications''} (Project-ID 286237555, since 2017). 

 The functions for the conversion of \textsf{CAS} tables to \textsf{GAP} format have been written by G{\"o}tz Pfeiffer. The functions for converting
the so-called ``Cambridge format'' (in which the original data of the \textsf{Atlas} of Finite Groups had been stored) to \textsf{GAP} format have been written by Christoph Jansen. 

 The generic character tables of double covers of alternating and symmetric
groups were contributed by Felix Noeske, see{\nobreakspace}\cite{Noe02}. 

 The functions in Section{\nobreakspace}\ref{sec:unipotsec} (\texttt{DeligneLusztigName} (\ref{DeligneLusztigName}), \texttt{DeligneLusztigNames} (\ref{DeligneLusztigNames}), and \texttt{UnipotentCharacter} (\ref{UnipotentCharacter})) as well as the corresponding data for the finite groups of Lie type in the \textsf{GAP} Character Table Library have been contributed by Michael Cla{\ss}en-Houben,
see{\nobreakspace}\cite{Cla05}. 

 Several character tables of maximal subgroups of covering groups of simple
groups have been computed by Sebastian Dany, see{\nobreakspace}\cite{Dan06}.  

 Thanks to Frank L{\"u}beck and Max Neunh{\"o}ffer for their help with solving
technical problems concerning the HMTL part of the example files that belong
to the package documentation, and to Ian Hutchinson whose {\TeX} to HTML translator \texttt{TtH} was used to provide these HTML files. 

 Thanks to Frank L{\"u}beck and Max Neunh{\"o}ffer also for developing the \textsf{GAPDoc} package (see{\nobreakspace}\cite{GAPDoc}), on which the manual of the \textsf{CTblLib} package is based. The previously available documentation format had been
completely inappropriate. }

 }

     
\chapter{\textcolor{Chapter }{Tutorial for the \textsf{GAP} Character Table Library}}\label{ch:tutorial}
\logpage{[ 2, 0, 0 ]}
\hyperdef{L}{X7C4E7E1181E82D8E}{}
{
  This chapter gives an overview of the basic functionality provided by the \textsf{GAP} Character Table Library. The main concepts and interface functions are
presented in the sections{\nobreakspace}\ref{sect:concepts} and \ref{sect:accesstbl}, Section{\nobreakspace}\ref{sect:tutsectctbllib} shows a few small examples. 

 In order to force that the examples consist only of ASCII characters, we set
the user preference \texttt{DisplayFunction} of the \textsf{AtlasRep} to the value \texttt{"Print"}. This is necessary because the {\LaTeX} and HTML versions of \textsf{GAPDoc} documents do not support non-ASCII characters. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@origpref:= UserPreference( "AtlasRep", "DisplayFunction" );;|
  !gapprompt@gap>| !gapinput@SetUserPreference( "AtlasRep", "DisplayFunction", "Print" );|
\end{Verbatim}
  
\section{\textcolor{Chapter }{Concepts used in the \textsf{GAP} Character Table Library}}\label{sect:concepts}
\logpage{[ 2, 1, 0 ]}
\hyperdef{L}{X86B34875862028E8}{}
{
  The main idea behind working with the \textsf{GAP} Character Table Library is to deal with character tables of groups but \emph{without} having access to these groups. This situation occurs for example if one
extracts information from the printed \textsf{Atlas} of Finite Groups (\cite{CCN85}). 

 This restriction means first of all that we need a way to access the character
tables, see Section \ref{sect:accesstbl} for that. Once we have such a character table, we can compute all those data
about the underlying group $G$, say, that are determined by the character table. Chapter  (\textbf{Reference: Attributes and Properties for Groups and Character Tables}) lists such attributes and properties. For example, it can be computed from the
character table of $G$ whether $G$ is solvable or not. 

 Questions that cannot be answered using only the character table of $G$ can perhaps be treated using additional information. For example, the
structure of subgroups of $G$ is in general not determined by the character table of $G$, but the character table may yield partial information. Two examples can be
found in the sections \ref{subsect:sylowstructure3on} and \ref{subsect:permcharfi23}. 

 In the character table context, the role of homomorphisms between two groups
is taken by \emph{class fusions}. Monomorphisms correspond to subgroup fusions, epimorphisms correspond to
factor fusions. Given two character tables of a group $G$ and a subgroup $H$ of $G$, one can in general compute only \emph{candidates} for the class fusion of $H$ into $G$, for example using \texttt{PossibleClassFusions} (\textbf{Reference: PossibleClassFusions}). Note that $G$ may contain several nonconjugate subgroups isomorphic with $H$, which may have different class fusions.  

 One can often reduce a question about a group $G$ to a question about its maximal subgroups. In the character table context, it
is often sufficient to know the character table of $G$, the character tables of its maximal subgroups, and their class fusions into $G$. We are in this situation if the attribute \texttt{Maxes} (\ref{Maxes}) is set in the character table of $G$. 

 \emph{Summary:} The character theoretic approach that is supported by the \textsf{GAP} Character Table Library, that is, an approach without explicitly using the
underlying groups, has the advantages that it can be used to answer many
questions, and that these computations are usually cheap, compared to
computations with groups. Disadvantages are that this approach is not always
successful, and that answers are often ``nonconstructive'' in the sense that one can show the existence of something without getting
one's hands on it. }

  
\section{\textcolor{Chapter }{Accessing a Character Table from the Library}}\label{sect:accesstbl}
\logpage{[ 2, 2, 0 ]}
\hyperdef{L}{X84930B2D7849E019}{}
{
  As stated in Section \ref{sect:concepts}, we must define how character tables from the \textsf{GAP} Character Table Library can be accessed.  
\subsection{\textcolor{Chapter }{Accessing a Character Table via a name}}\label{subsect:accesstblbyname}
\logpage{[ 2, 2, 1 ]}
\hyperdef{L}{X8658DC3A83B5A98B}{}
{
  The most common way to access a character table from the \textsf{GAP} Character Table Library is to call \texttt{CharacterTable} (\ref{CharacterTable:for a string}) with argument a string that is an \emph{admissible name} for the character table. Typical admissible names are similar to the group
names used in the \textsf{Atlas} of Finite Groups \cite{CCN85}. One of these names is the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of the character table, this name is used by \textsf{GAP} when it prints library character tables. 

 For example, an admissible name for the character table of an almost simple
group is the \textsf{Atlas} name, such as \texttt{A5}, \texttt{M11}, or \texttt{L2(11).2}. Other names may be admissible, for example \texttt{S6} is admissible for the symmetric group on six points, which is called $A_6.2_1$ in the \textsf{Atlas}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@CharacterTable( "J1" );|
  CharacterTable( "J1" )
  !gapprompt@gap>| !gapinput@CharacterTable( "L2(11)" );|
  CharacterTable( "L2(11)" )
  !gapprompt@gap>| !gapinput@CharacterTable( "S5" );|
  CharacterTable( "A5.2" )
\end{Verbatim}
 }

  
\subsection{\textcolor{Chapter }{Accessing a Character Table via properties}}\label{subsect:accesstblbyproperties}
\logpage{[ 2, 2, 2 ]}
\hyperdef{L}{X7AA474817D17BF49}{}
{
  If one does not know an admissible name of the character table of a group one
is interested in, or if one does not know whether ths character table is
available at all, one can use \texttt{AllCharacterTableNames} (\ref{AllCharacterTableNames}) to compute a list of identifiers of all available character tables with given
properties. Analogously, \texttt{OneCharacterTableName} (\ref{OneCharacterTableName}) can be used to compute one such identifier. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@AllCharacterTableNames( Size, 168 );|
  [ "(2^2xD14):3", "2^3.7.3", "L3(2)", "L3(4)M7", "L3(4)M8" ]
  !gapprompt@gap>| !gapinput@OneCharacterTableName( NrConjugacyClasses, n -> n <= 4 );|
  "S3"
\end{Verbatim}
 For certain filters, such as \texttt{Size} (\textbf{Reference: Size}) and \texttt{NrConjugacyClasses} (\textbf{Reference: NrConjugacyClasses}), the computations are fast because the values for all library tables are
precomputed. See \texttt{AllCharacterTableNames} (\ref{AllCharacterTableNames}) for an overview of these filters. 

 The function \texttt{BrowseCTblLibInfo} (\ref{BrowseCTblLibInfo}) provides an interactive overview of available character tables, which allows
one for example to search also for substrings in identifiers of character
tables. This function is available only if the \textsf{Browse} package has been loaded. }

  
\subsection{\textcolor{Chapter }{Accessing a Character Table via a Table of Marks}}\label{subsect:accesstblbytom}
\logpage{[ 2, 2, 3 ]}
\hyperdef{L}{X7C6BFB4384CAFFC8}{}
{
  Let $G$ be a group whose table of marks is available via the \textsf{TomLib} package (see \cite{TomLib} for how to access tables of marks from this library) then the \textsf{GAP} Character Table Library contains the character table of $G$, and one can access this table by using the table of marks as an argument of \texttt{CharacterTable} (\ref{CharacterTable:for a table of marks}). 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@tom:= TableOfMarks( "M11" );|
  TableOfMarks( "M11" )
  !gapprompt@gap>| !gapinput@t:= CharacterTable( tom );|
  CharacterTable( "M11" )
\end{Verbatim}
 }

  
\subsection{\textcolor{Chapter }{Accessing a Character Table relative to another Character Table }}\label{subsect:accesstblbytbl}
\logpage{[ 2, 2, 4 ]}
\hyperdef{L}{X7E6AF18C7F139F54}{}
{
  If one has already a character table from the \textsf{GAP} Character Table Library that belongs to the group $G$, say, then names of related tables can be found as follows. 

 The value of the attribute \texttt{Maxes} (\ref{Maxes}), if known, is the list of identifiers of the character tables of all classes
of maximal subgroups of $G$. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@t:= CharacterTable( "M11" );|
  CharacterTable( "M11" )
  !gapprompt@gap>| !gapinput@HasMaxes( t );|
  true
  !gapprompt@gap>| !gapinput@Maxes( t );|
  [ "A6.2_3", "L2(11)", "3^2:Q8.2", "A5.2", "2.S4" ]
\end{Verbatim}
 If the \texttt{Maxes} (\ref{Maxes}) value of the character table with identifier $id$, say, is known then the character table of the groups in the $i$-th class of maximal subgroups can be accessed via the ``relative name'' $id$\texttt{M}$i$. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@CharacterTable( "M11M2" );|
  CharacterTable( "L2(11)" )
\end{Verbatim}
 The value of the attribute \texttt{NamesOfFusionSources} (\textbf{Reference: NamesOfFusionSources}) is the list of identifiers of those character tables which store class fusions
to $G$. So these character tables belong to subgroups of $G$ and groups that have $G$ as a factor group. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@NamesOfFusionSources( t );|
  [ "A5.2", "A6.2_3", "P48/G1/L1/V1/ext2", "P48/G1/L1/V2/ext2", 
    "L2(11)", "2.S4", "3^5:M11", "3^6.M11", "s4", "3^2:Q8.2", "M11N2", 
    "5:4", "11:5" ]
\end{Verbatim}
 The value of the attribute \texttt{ComputedClassFusions} (\textbf{Reference: ComputedClassFusions}) is the list of records whose \texttt{name} components are the identifiers of those character tables to which class
fusions are stored. So these character tables belong to overgroups and factor
groups of $G$. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@List( ComputedClassFusions( t ), r -> r.name );|
  [ "A11", "M12", "M23", "HS", "McL", "ON", "3^5:M11", "B" ]
\end{Verbatim}
 }

  
\subsection{\textcolor{Chapter }{Different character tables for the same group}}\label{subsect:severaltables}
\logpage{[ 2, 2, 5 ]}
\hyperdef{L}{X7CD1E9AA871848EC}{}
{
  The \textsf{GAP} Character Table Library may contain several different character tables of a
given group, in the sense that the rows and columns are sorted differently. 

 For example, the \textsf{Atlas} table of the alternating group $A_5$ is available, and since $A_5$ is isomorphic with the groups PSL$(2, 4)$ and PSL$(2, 5)$, two more character tables of $A_5$ can be constructed in a natural way. The three tables are of course
permutation isomorphic. The first two are sorted in the same way, but the rows
and columns of the third one are sorted differently. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@t1:= CharacterTable( "A5" );;|
  !gapprompt@gap>| !gapinput@t2:= CharacterTable( "PSL", 2, 4 );;|
  !gapprompt@gap>| !gapinput@t3:= CharacterTable( "PSL", 2, 5 );;|
  !gapprompt@gap>| !gapinput@TransformingPermutationsCharacterTables( t1, t2 );|
  rec( columns := (), group := Group([ (4,5) ]), rows := () )
  !gapprompt@gap>| !gapinput@TransformingPermutationsCharacterTables( t1, t3 );|
  rec( columns := (2,4)(3,5), group := Group([ (2,3) ]), 
    rows := (2,5,3,4) )
\end{Verbatim}
 Another situation where several character tables for the same group are
available is that a group contains several classes of isomorphic maximal
subgroups such that the class fusions are different. 

 For example, the Mathieu group $M_{12}$ contains two classes of maximal subgroups of index $12$, which are isomorphic with $M_{11}$. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@t:= CharacterTable( "M12" );|
  CharacterTable( "M12" )
  !gapprompt@gap>| !gapinput@mx:= Maxes( t );|
  [ "M11", "M12M2", "A6.2^2", "M12M4", "L2(11)", "3^2.2.S4", "M12M7", 
    "2xS5", "M8.S4", "4^2:D12", "A4xS3" ]
  !gapprompt@gap>| !gapinput@s1:= CharacterTable( mx[1] );|
  CharacterTable( "M11" )
  !gapprompt@gap>| !gapinput@s2:= CharacterTable( mx[2] );|
  CharacterTable( "M12M2" )
\end{Verbatim}
 The class fusions into $M_{12}$ are stored on the library tables of the maximal subgroups. The groups in the
first class of $M_{11}$ type subgroups contain elements in the classes \texttt{4B}, \texttt{6B}, and \texttt{8B} of $M_{12}$, and the groups in the second class contain elements in the classes \texttt{4A}, \texttt{6A}, and \texttt{8A}. Note that according to the \textsf{Atlas} (see \cite[p.{\nobreakspace}33]{CCN85}), the permutation characters of the action of $M_{12}$ on the cosets of $M_{11}$ type subgroups from the two classes of maximal subgroups are \texttt{1a + 11a} and \texttt{1a + 11b}, respectively. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@GetFusionMap( s1, t );|
  [ 1, 3, 4, 7, 8, 10, 12, 12, 15, 14 ]
  !gapprompt@gap>| !gapinput@GetFusionMap( s2, t );|
  [ 1, 3, 4, 6, 8, 10, 11, 11, 14, 15 ]
  !gapprompt@gap>| !gapinput@Display( t );|
  M12
  
        2   6  4  6  1  2  5  5  1  2  1  3  3   1   .   .
        3   3  1  1  3  2  .  .  .  1  1  .  .   .   .   .
        5   1  1  .  .  .  .  .  1  .  .  .  .   1   .   .
       11   1  .  .  .  .  .  .  .  .  .  .  .   .   1   1
  
           1a 2a 2b 3a 3b 4a 4b 5a 6a 6b 8a 8b 10a 11a 11b
       2P  1a 1a 1a 3a 3b 2b 2b 5a 3b 3a 4a 4b  5a 11b 11a
       3P  1a 2a 2b 1a 1a 4a 4b 5a 2a 2b 8a 8b 10a 11a 11b
       5P  1a 2a 2b 3a 3b 4a 4b 1a 6a 6b 8a 8b  2a 11a 11b
      11P  1a 2a 2b 3a 3b 4a 4b 5a 6a 6b 8a 8b 10a  1a  1a
  
  X.1       1  1  1  1  1  1  1  1  1  1  1  1   1   1   1
  X.2      11 -1  3  2 -1 -1  3  1 -1  . -1  1  -1   .   .
  X.3      11 -1  3  2 -1  3 -1  1 -1  .  1 -1  -1   .   .
  X.4      16  4  . -2  1  .  .  1  1  .  .  .  -1   A  /A
  X.5      16  4  . -2  1  .  .  1  1  .  .  .  -1  /A   A
  X.6      45  5 -3  .  3  1  1  . -1  . -1 -1   .   1   1
  X.7      54  6  6  .  .  2  2 -1  .  .  .  .   1  -1  -1
  X.8      55 -5  7  1  1 -1 -1  .  1  1 -1 -1   .   .   .
  X.9      55 -5 -1  1  1  3 -1  .  1 -1 -1  1   .   .   .
  X.10     55 -5 -1  1  1 -1  3  .  1 -1  1 -1   .   .   .
  X.11     66  6  2  3  . -2 -2  1  . -1  .  .   1   .   .
  X.12     99 -1  3  .  3 -1 -1 -1 -1  .  1  1  -1   .   .
  X.13    120  . -8  3  .  .  .  .  .  1  .  .   .  -1  -1
  X.14    144  4  .  . -3  .  . -1  1  .  .  .  -1   1   1
  X.15    176 -4  . -4 -1  .  .  1 -1  .  .  .   1   .   .
  
  A = E(11)+E(11)^3+E(11)^4+E(11)^5+E(11)^9
    = (-1+Sqrt(-11))/2 = b11
\end{Verbatim}
 Permutation equivalent library tables are related to each other. In the above
example, the table \texttt{s2} is a \emph{duplicate} of \texttt{s1}, and there are functions for making the relations explicit. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@IsDuplicateTable( s2 );|
  true
  !gapprompt@gap>| !gapinput@IdentifierOfMainTable( s2 );|
  "M11"
  !gapprompt@gap>| !gapinput@IdentifiersOfDuplicateTables( s1 );|
  [ "HSM9", "M12M2", "ONM11" ]
\end{Verbatim}
 See Section{\nobreakspace}\ref{sec:duplicates} for details about duplicate character tables. }

 }

  
\section{\textcolor{Chapter }{Examples of Using the \textsf{GAP} Character Table Library}}\label{sect:tutsectctbllib}
\logpage{[ 2, 3, 0 ]}
\hyperdef{L}{X83B721F3801ED6D1}{}
{
  The sections \ref{subsect:ambivalent}, \ref{subsect:ppure}, and \ref{subsect:onepblock} show how the function \texttt{AllCharacterTableNames} (\ref{AllCharacterTableNames}) can be used to search for character tables with certain properties. The \textsf{GAP} Character Table Library serves as a tool for finding and checking conjectures
in these examples. 

 In Section \ref{subsect:permcharfi23}, a question about a subgroup of the sporadic simple Fischer group $G = Fi_{23}$ is answered using only character tables from the \textsf{GAP} Character Table Library. 

 More examples can be found in \cite{GMN}, \cite{AmbigFus}, \cite{ctblpope}, \cite{ProbGenArxiv}, \cite{Auto}.  
\subsection{\textcolor{Chapter }{Example: Ambivalent Simple Groups}}\label{subsect:ambivalent}
\logpage{[ 2, 3, 1 ]}
\hyperdef{L}{X87AC9A4181AC369C}{}
{
  A group $G$ is called \emph{ambivalent} if each element in $G$ is $G$-conjugate to its inverse. Equivalently, $G$ is ambivalent if all its characters are real-valued. We are interested in
nonabelian simple ambivalent groups. Since ambivalence is of course invariant
under permutation equivalence, we may omit duplicate character tables. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@isambivalent:= tbl -> PowerMap( tbl, -1 )|
  !gapprompt@>| !gapinput@                           = [ 1 .. NrConjugacyClasses( tbl ) ];;|
  !gapprompt@gap>| !gapinput@AllCharacterTableNames( IsSimple, true, IsDuplicateTable, false,|
  !gapprompt@>| !gapinput@       IsAbelian, false, isambivalent, true );|
  [ "3D4(2)", "3D4(3)", "3D4(4)", "A10", "A14", "A5", "A6", "J1", "J2", 
    "L2(101)", "L2(109)", "L2(113)", "L2(121)", "L2(125)", "L2(13)", 
    "L2(16)", "L2(17)", "L2(25)", "L2(29)", "L2(32)", "L2(37)", 
    "L2(41)", "L2(49)", "L2(53)", "L2(61)", "L2(64)", "L2(73)", 
    "L2(8)", "L2(81)", "L2(89)", "L2(97)", "O12+(2)", "O12-(2)", 
    "O12-(3)", "O7(5)", "O8+(2)", "O8+(3)", "O8+(7)", "O8-(2)", 
    "O8-(3)", "O9(3)", "S10(2)", "S12(2)", "S4(4)", "S4(5)", "S4(8)", 
    "S4(9)", "S6(2)", "S6(4)", "S6(5)", "S8(2)" ]
\end{Verbatim}
  }

  
\subsection{\textcolor{Chapter }{Example: Simple $p$-pure Groups}}\label{subsect:ppure}
\logpage{[ 2, 3, 2 ]}
\hyperdef{L}{X7AD705F685FBF179}{}
{
  A group $G$ is called \emph{$p$-pure} for a prime integer $p$ that divides $|G|$ if the centralizer orders of nonidentity $p$-elements in $G$ are $p$-powers. Equivalently, $G$ is $p$-pure if $p$ divides $|G|$ and each element in $G$ of order divisible by $p$ is a $p$-element. (This property was studied by L. H{\a'e}thelyi in 2002.) 

 We are interested in small nonabelian simple $p$-pure groups. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@isppure:= function( p )|
  !gapprompt@>| !gapinput@     return tbl -> Size( tbl ) mod p = 0 and|
  !gapprompt@>| !gapinput@       ForAll( OrdersClassRepresentatives( tbl ),|
  !gapprompt@>| !gapinput@               n -> n mod p <> 0 or IsPrimePowerInt( n ) );|
  !gapprompt@>| !gapinput@   end;;|
  !gapprompt@gap>| !gapinput@for i in [ 2, 3, 5, 7, 11, 13 ] do|
  !gapprompt@>| !gapinput@     Print( i, "\n",|
  !gapprompt@>| !gapinput@       AllCharacterTableNames( IsSimple, true, IsAbelian, false,|
  !gapprompt@>| !gapinput@           IsDuplicateTable, false, isppure( i ), true ),|
  !gapprompt@>| !gapinput@       "\n" );|
  !gapprompt@>| !gapinput@   od;|
  2
  [ "A5", "A6", "L2(16)", "L2(17)", "L2(31)", "L2(32)", "L2(64)", 
    "L2(8)", "L3(2)", "L3(4)", "Sz(32)", "Sz(8)" ]
  3
  [ "A5", "A6", "L2(17)", "L2(19)", "L2(27)", "L2(53)", "L2(8)", 
    "L2(81)", "L3(2)", "L3(4)" ]
  5
  [ "A5", "A6", "A7", "L2(11)", "L2(125)", "L2(25)", "L2(49)", "L3(4)", 
    "M11", "M22", "S4(7)", "Sz(32)", "Sz(8)", "U4(2)", "U4(3)" ]
  7
  [ "A7", "A8", "A9", "G2(3)", "HS", "J1", "J2", "L2(13)", "L2(49)", 
    "L2(8)", "L2(97)", "L3(2)", "L3(4)", "M22", "O8+(2)", "S6(2)", 
    "Sz(8)", "U3(3)", "U3(5)", "U4(3)", "U6(2)" ]
  11
  [ "A11", "A12", "A13", "Co2", "HS", "J1", "L2(11)", "L2(121)", 
    "L2(23)", "L5(3)", "M11", "M12", "M22", "M23", "M24", "McL", 
    "O10+(3)", "O12+(3)", "ON", "Suz", "U5(2)", "U6(2)" ]
  13
  [ "2E6(2)", "2F4(2)'", "3D4(2)", "A13", "A14", "A15", "F4(2)", 
    "Fi22", "G2(3)", "G2(4)", "L2(13)", "L2(25)", "L2(27)", "L3(3)", 
    "L4(3)", "O7(3)", "O8+(3)", "S4(5)", "S6(3)", "Suz", "Sz(8)", 
    "U3(4)" ]
\end{Verbatim}
 

 Looking at these examples, we may observe that the alternating group $A_n$ of degree $n$ is $2$-pure iff $n \in \{ 4, 5, 6 \}$, $3$-pure iff $n \in \{ 3, 4, 5, 6 \}$, and $p$-pure, for $p \geq 5$, iff $n \in \{ p, p+1, p+2 \}$. 

 Also, the Suzuki groups $Sz(q)$ are $2$-pure since the centralizers of nonidentity $2$-elements are contained in Sylow $2$-subgroups. 

 From the inspection of the generic character table(s) of $PSL(2, q)$, we see that $PSL(2, p^d)$ is $p$-pure Additionally, exactly the following cases of $l$-purity occur, for a prime $l$. 
\begin{itemize}
\item  $q$ is even and $q-1$ or $q+1$ is a power of $l$. 
\item  For $q \equiv 1 \pmod{4}$, $(q+1)/2$ is a power of $l$ or $q-1$ is a power of $l = 2$. 
\item  For $q \equiv 3 \pmod{4}$, $(q-1)/2$ is a power of $l$ or $q+1$ is a power of $l = 2$. 
\end{itemize}
  }

  
\subsection{\textcolor{Chapter }{Example: Simple Groups with only one $p$-Block}}\label{subsect:onepblock}
\logpage{[ 2, 3, 3 ]}
\hyperdef{L}{X7C2C7B138646D0C5}{}
{
  Are there nonabelian simple groups with only one $p$-block, for some prime $p$? 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@fun:= function( tbl )|
  !gapprompt@>| !gapinput@     local result, p, bl;|
  !gapprompt@>| !gapinput@|
  !gapprompt@>| !gapinput@     result:= false;|
  !gapprompt@>| !gapinput@     for p in PrimeDivisors( Size( tbl ) ) do|
  !gapprompt@>| !gapinput@       bl:= PrimeBlocks( tbl, p );|
  !gapprompt@>| !gapinput@       if Length( bl.defect ) = 1 then|
  !gapprompt@>| !gapinput@         result:= true;|
  !gapprompt@>| !gapinput@         Print( "only one block: ", Identifier( tbl ), ", p = ", p, "\n" );|
  !gapprompt@>| !gapinput@       fi;|
  !gapprompt@>| !gapinput@     od;|
  !gapprompt@>| !gapinput@|
  !gapprompt@>| !gapinput@     return result;|
  !gapprompt@>| !gapinput@end;;|
  !gapprompt@gap>| !gapinput@AllCharacterTableNames( IsSimple, true, IsAbelian, false,|
  !gapprompt@>| !gapinput@                           IsDuplicateTable, false, fun, true );|
  only one block: M22, p = 2
  only one block: M24, p = 2
  [ "M22", "M24" ]
\end{Verbatim}
 We see that the sporadic simple groups $M_{22}$ and $M_{24}$ have only one $2$-block.  }

  
\subsection{\textcolor{Chapter }{Example:The Sylow $3$ subgroup of $3.O'N$}}\label{subsect:sylowstructure3on}
\logpage{[ 2, 3, 4 ]}
\hyperdef{L}{X7FA308D585DC1B40}{}
{
  We want to determine the structure of the Sylow $3$-subgroups of the triple cover $G = 3.O'N$ of the sporadic simple O'Nan group $O'N$. The Sylow $3$-subgroup of $O'N$ is an elementary abelian group of order $3^4$, since the Sylow $3$ normalizer in $O'N$ has the structure $3^4:2^{1+4}D_{10}$ (see \cite[p.{\nobreakspace}132]{CCN85}). 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@CharacterTable( "ONN3" );|
  CharacterTable( "3^4:2^(1+4)D10" )
\end{Verbatim}
 Let $P$ be a Sylow $3$-subgroup of $G$. Then $P$ is not abelian, since the centralizer order of any preimage of an element of
order three in the simple factor group of $G$ is not divisible by $3^5$. Moreover, the exponent of $P$ is three. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@3t:= CharacterTable( "3.ON" );;|
  !gapprompt@gap>| !gapinput@orders:= OrdersClassRepresentatives( 3t );;|
  !gapprompt@gap>| !gapinput@ord3:= PositionsProperty( orders, x -> x = 3 );|
  [ 2, 3, 7 ]
  !gapprompt@gap>| !gapinput@sizes:= SizesCentralizers( 3t ){ ord3 };|
  [ 1382446517760, 1382446517760, 3240 ]
  !gapprompt@gap>| !gapinput@Size( 3t );|
  1382446517760
  !gapprompt@gap>| !gapinput@Collected( Factors( sizes[3] ) );|
  [ [ 2, 3 ], [ 3, 4 ], [ 5, 1 ] ]
  !gapprompt@gap>| !gapinput@9 in orders;|
  false
\end{Verbatim}
 So both the centre and the Frattini subgroup of $P$ are equal to the centre of $G$, hence $P$ is an extraspecial group $3^{1+4}_+$. }

  
\subsection{\textcolor{Chapter }{Example: Primitive Permutation Characters of $2.A_6$}}\label{subsect:primpermchars2A6}
\logpage{[ 2, 3, 5 ]}
\hyperdef{L}{X83BF83D87BC1B123}{}
{
  It is often interesting to compute the primitive permutation characters of a
group $G$, that is, the characters of the permutation actions of $G$ on the cosets of its maximal subgroups. These characters can be computed for
example when the character tables of $G$, the character tables of its maximal subgroups, and the class fusions from
these character tables into the table of $G$ are known. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@tbl:= CharacterTable( "2.A6" );;|
  !gapprompt@gap>| !gapinput@HasMaxes( tbl );|
  true
  !gapprompt@gap>| !gapinput@maxes:= Maxes( tbl );|
  [ "2.A5", "2.A6M2", "3^2:8", "2.Symm(4)", "2.A6M5" ]
  !gapprompt@gap>| !gapinput@mx:= List( maxes, CharacterTable );;|
  !gapprompt@gap>| !gapinput@prim1:= List( mx, s -> TrivialCharacter( s )^tbl );;|
  !gapprompt@gap>| !gapinput@Display( tbl,|
  !gapprompt@>| !gapinput@     rec( chars:= prim1, centralizers:= false, powermap:= false ) );|
  2.A6
  
         1a 2a 4a 3a 6a 3b 6b 8a 8b 5a 10a 5b 10b
  
  Y.1     6  6  2  3  3  .  .  .  .  1   1  1   1
  Y.2     6  6  2  .  .  3  3  .  .  1   1  1   1
  Y.3    10 10  2  1  1  1  1  2  2  .   .  .   .
  Y.4    15 15  3  3  3  .  .  1  1  .   .  .   .
  Y.5    15 15  3  .  .  3  3  1  1  .   .  .   .
\end{Verbatim}
 These permutation characters are the ones listed in \cite[p.{\nobreakspace}4]{CCN85}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@PermCharInfo( tbl, prim1 ).ATLAS;|
  [ "1a+5a", "1a+5b", "1a+9a", "1a+5a+9a", "1a+5b+9a" ]
\end{Verbatim}
 Alternatively, one can compute the primitive permutation characters from the
table of marks if this table and the fusion into it are known. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@tom:= TableOfMarks( tbl );|
  TableOfMarks( "2.A6" )
  !gapprompt@gap>| !gapinput@allperm:= PermCharsTom( tbl, tom );;|
  !gapprompt@gap>| !gapinput@prim2:= allperm{ MaximalSubgroupsTom( tom )[1] };;|
  !gapprompt@gap>| !gapinput@Display( tbl,|
  !gapprompt@>| !gapinput@     rec( chars:= prim2, centralizers:= false, powermap:= false ) );|
  2.A6
  
         1a 2a 4a 3a 6a 3b 6b 8a 8b 5a 10a 5b 10b
  
  Y.1     6  6  2  3  3  .  .  .  .  1   1  1   1
  Y.2     6  6  2  .  .  3  3  .  .  1   1  1   1
  Y.3    10 10  2  1  1  1  1  2  2  .   .  .   .
  Y.4    15 15  3  .  .  3  3  1  1  .   .  .   .
  Y.5    15 15  3  3  3  .  .  1  1  .   .  .   .
\end{Verbatim}
 We see that the two approaches yield the same permutation characters, but the
two lists are sorted in a different way. The latter is due to the fact that
the rows of the table of marks are ordered in a way that is not compatible
with the ordering of maximal subgroups for the character table. Moreover,
there is no way to choose the fusion from the character table to the table of
marks in such a way that the two lists of permutation characters would become
equal. The component \texttt{perm} in the \texttt{FusionToTom} (\ref{FusionToTom}) record of the character table describes the incompatibility. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@FusionToTom( tbl );|
  rec( map := [ 1, 2, 5, 4, 8, 3, 7, 11, 11, 6, 13, 6, 13 ], 
    name := "2.A6", perm := (4,5), 
    text := "fusion map is unique up to table autom." )
\end{Verbatim}
 }

  
\subsection{\textcolor{Chapter }{Example: A Permutation Character of $Fi_{23}$}}\label{subsect:permcharfi23}
\logpage{[ 2, 3, 6 ]}
\hyperdef{L}{X808DD8997F10D429}{}
{
  Let $x$ be a \texttt{3B} element in the sporadic simple Fischer group $G = Fi_{23}$. The normalizer $M$ of $x$ in $G$ is a maximal subgroup of the type $3^{{1+8}}_+.2^{{1+6}}_-.3^{{1+2}}_+.2S_4$. We are interested in the distribution of the elements of the normal subgroup $N$ of the type $3^{{1+8}}_+$ in $M$ to the conjugacy classes of $G$. 

 This information can be computed from the permutation character $\pi = 1_N^G$, so we try to compute this permutation character. We have $\pi = (1_N^M)^G$, and $1_N^M$ can be computed as the inflation of the regular character of the factor group $M/N$ to $M$. Note that the character tables of $G$ and $M$ are available, as well as the class fusion of $M$ in $G$, and that $N$ is the largest normal $3$-subgroup of $M$. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@t:= CharacterTable( "Fi23" );|
  CharacterTable( "Fi23" )
  !gapprompt@gap>| !gapinput@mx:= Maxes( t );|
  [ "2.Fi22", "O8+(3).3.2", "2^2.U6(2).2", "S8(2)", "S3xO7(3)", 
    "2..11.m23", "3^(1+8).2^(1+6).3^(1+2).2S4", "Fi23M8", "A12.2", 
    "(2^2x2^(1+8)).(3xU4(2)).2", "2^(6+8):(A7xS3)", "S4xS6(2)", 
    "S4(4).4", "L2(23)" ]
  !gapprompt@gap>| !gapinput@m:= CharacterTable( mx[7] );|
  CharacterTable( "3^(1+8).2^(1+6).3^(1+2).2S4" )
  !gapprompt@gap>| !gapinput@n:= ClassPositionsOfPCore( m, 3 );|
  [ 1 .. 6 ]
  !gapprompt@gap>| !gapinput@f:= m / n;|
  CharacterTable( "3^(1+8).2^(1+6).3^(1+2).2S4/[ 1, 2, 3, 4, 5, 6 ]" )
  !gapprompt@gap>| !gapinput@reg:= 0 * [ 1 .. NrConjugacyClasses( f ) ];;|
  !gapprompt@gap>| !gapinput@reg[1]:= Size( f );;|
  !gapprompt@gap>| !gapinput@infl:= reg{ GetFusionMap( m, f ) };|
  [ 165888, 165888, 165888, 165888, 165888, 165888, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
  !gapprompt@gap>| !gapinput@ind:= Induced( m, t, [ infl ] );|
  [ ClassFunction( CharacterTable( "Fi23" ),
    [ 207766624665600, 0, 0, 0, 603832320, 127567872, 6635520, 663552, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0 ] ) ]
  !gapprompt@gap>| !gapinput@PermCharInfo( t, ind ).contained;|
  [ [ 1, 0, 0, 0, 864, 1538, 3456, 13824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ]
  !gapprompt@gap>| !gapinput@PositionsProperty( OrdersClassRepresentatives( t ), x -> x = 3 );|
  [ 5, 6, 7, 8 ]
\end{Verbatim}
 Thus $N$ contains $864$ elements in the class \texttt{3A}, $1\,538$ elements in the class \texttt{3B}, and so on. }

  
\subsection{\textcolor{Chapter }{Example: Non-commutators in the commutator group}}\label{subsect:commutatorlength}
\logpage{[ 2, 3, 7 ]}
\hyperdef{L}{X7A23CB7D8267FE55}{}
{
  In general, not every element in the commutator group of a group is itself a
commutator. Are there examples in the Character Table Library, and if yes,
what is a smallest one? 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@nam:= OneCharacterTableName( CommutatorLength, x -> x > 1|
  !gapprompt@>| !gapinput@                                : OrderedBy:= Size );|
  "3.(A4x3):2"
  !gapprompt@gap>| !gapinput@Size( CharacterTable( nam ) );|
  216
\end{Verbatim}
 The smallest groups with this property have order $96$. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@OneSmallGroup( Size, [ 2 .. 100 ],|
  !gapprompt@>| !gapinput@                  G -> CommutatorLength( G ) > 1, true );|
  <pc group of size 96 with 6 generators>
\end{Verbatim}
 (Note the different syntax: \texttt{OneSmallGroup} (\textbf{smallgrp: OneSmallGroup}) does not admit a function such as \texttt{x -{\textgreater} x {\textgreater} 1} for describing the admissible values.) 

 Nonabelian simple groups cannot be expected to have non-commutators, by the
main theorem in \cite{LOST2010}. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@OneCharacterTableName( IsSimple, true, IsAbelian, false,|
  !gapprompt@>| !gapinput@                          IsDuplicateTable, false,|
  !gapprompt@>| !gapinput@                          CommutatorLength, x -> x > 1|
  !gapprompt@>| !gapinput@                          : OrderedBy:= Size );|
  fail
\end{Verbatim}
 Perfect groups can contain non-commutators. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@nam:= OneCharacterTableName( IsPerfect, true,|
  !gapprompt@>| !gapinput@                                IsDuplicateTable, false,|
  !gapprompt@>| !gapinput@                                CommutatorLength, x -> x > 1|
  !gapprompt@>| !gapinput@                                : OrderedBy:= Size );|
  "P1/G1/L1/V1/ext2"
  !gapprompt@gap>| !gapinput@Size( CharacterTable( nam ) );|
  960
\end{Verbatim}
 This is in fact the smallest example of a perfect group that contains
non-commutators. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@for n in [ 2 .. 960 ] do|
  !gapprompt@>| !gapinput@     for i in [ 1 .. NrPerfectGroups( n ) ] do|
  !gapprompt@>| !gapinput@       g:= PerfectGroup( n,  i);|
  !gapprompt@>| !gapinput@       if CommutatorLength( g ) <> 1 then|
  !gapprompt@>| !gapinput@         Print( [ n, i ], "\n" );|
  !gapprompt@>| !gapinput@       fi;|
  !gapprompt@>| !gapinput@     od;|
  !gapprompt@>| !gapinput@   od;|
  [ 960, 2 ]
\end{Verbatim}
 }

  
\subsection{\textcolor{Chapter }{Example: An irreducible $11$-modular character of $J_4$ (December 2018)}}\label{subsect:J4mod11deg887778}
\logpage{[ 2, 3, 8 ]}
\hyperdef{L}{X79CDDEE67A41EAB8}{}
{
  Let $G$ be the sporadic simple Janko group $J_4$. For the ordinary irreducible characters of degree $1333$ of $G$, the reductions modulo $11$ are known to be irreducible Brauer characters. 

 David Craven asked Richard Parker how to show that the antisymmetric squares
of these Brauer characters are irreducible. Richard proposed the following. 

 Restrict the given ordinary character $\chi$, say, to a subgroup $S$ of $J_4$ whose $11$-modular character table is known, decompose the restriction $\chi_S$ into irreducible Brauer characters, and compute those constituents that are
constant on all subsets of conjugacy classes that fuse in $J_4$. If the Brauer character $\chi_S$ cannot be written as a sum of two such constituents then $\chi$, as a Brauer character of $J_4$, is irreducible. 

 Here is a \textsf{GAP} session that shows how to apply this idea. 

 The group $J_4$ has exactly two ordinary irreducible characters of degree $1333$. They are complex conjugate, and so are their antisymmetric squares. Thus we
may consider just one of the two. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@t:= CharacterTable( "J4" );;|
  !gapprompt@gap>| !gapinput@deg1333:= Filtered( Irr( t ), x -> x[1] = 1333 );;|
  !gapprompt@gap>| !gapinput@antisym:= AntiSymmetricParts( t, deg1333, 2 );;|
  !gapprompt@gap>| !gapinput@List(  antisym, x -> Position( Irr( t ), x ) );|
  [ 7, 6 ]
  !gapprompt@gap>| !gapinput@ComplexConjugate( antisym[1] ) = antisym[2];|
  true
  !gapprompt@gap>| !gapinput@chi:= antisym[1];;  chi[1];|
  887778
\end{Verbatim}
 Let $S$ be a maximal subgroup of the structure $2^{11}:M_{24}$ in $J_4$. Fortunately, the $11$-modular character table of $S$ is available (it had been constructed by Christoph Jansen), and we can
restrict the interesting character to this table. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@s:= CharacterTable( Maxes( t )[1] );;|
  !gapprompt@gap>| !gapinput@Size( s ) = 2^11 * Size( CharacterTable( "M24" ) );|
  true
  !gapprompt@gap>| !gapinput@rest:= RestrictedClassFunction( chi, s );;|
  !gapprompt@gap>| !gapinput@smod11:= s mod 11;;|
  !gapprompt@gap>| !gapinput@rest:= RestrictedClassFunction( rest, smod11 );;|
\end{Verbatim}
 The restriction is a sum of nine pairwise different irreducible Brauer
characters of $S$. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@dec:= Decomposition( Irr( smod11 ), [ rest ], "nonnegative" )[1];;|
  !gapprompt@gap>| !gapinput@Sum( dec );|
  9
  !gapprompt@gap>| !gapinput@constpos:= PositionsProperty( dec, x -> x <> 0 );|
  [ 15, 36, 46, 53, 55, 58, 63, 67, 69 ]
\end{Verbatim}
 Next we compute those sets of classes of $S$ which fuse in $J_4$. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@smod11fuss:= GetFusionMap( smod11, s );;|
  !gapprompt@gap>| !gapinput@sfust:= GetFusionMap( s, t );;|
  !gapprompt@gap>| !gapinput@fus:= CompositionMaps( sfust, smod11fuss );;|
  !gapprompt@gap>| !gapinput@inv:= Filtered( InverseMap( fus ), IsList );|
  [ [ 3, 4, 5 ], [ 2, 6, 7 ], [ 8, 9 ], [ 10, 11, 16 ], 
    [ 12, 14, 15, 17, 18, 21 ], [ 13, 19, 20, 22 ], [ 26, 27, 28, 30 ], 
    [ 25, 29, 31 ], [ 34, 39 ], [ 35, 37, 38 ], [ 40, 42 ], [ 41, 43 ], 
    [ 44, 47, 48 ], [ 45, 49, 50 ], [ 46, 51 ], [ 56, 57 ], [ 63, 64 ], 
    [ 69, 70 ] ]
\end{Verbatim}
 Finally, we run over all $2^9$ subsets of the irreducible constituents. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@const:= Irr( smod11 ){ constpos };;|
  !gapprompt@gap>| !gapinput@zero:= 0 * TrivialCharacter( smod11 );;|
  !gapprompt@gap>| !gapinput@comb:= List( Combinations( const ), x -> Sum( x, zero ) );;|
  !gapprompt@gap>| !gapinput@cand:= Filtered( comb,|
  !gapprompt@>| !gapinput@              x -> ForAll( inv, l -> Length( Set( x{ l } ) ) = 1 ) );;|
  !gapprompt@gap>| !gapinput@List( cand, x -> x[1] );|
  [ 0, 887778 ]
\end{Verbatim}
 We see that no proper subset of the constituents yields a Brauer character
that can be restricted from $J_4$. }

  
\subsection{\textcolor{Chapter }{Example: Tensor Products that are Generalized Projectives (October 2019)}}\label{subsect:nonprojtensor}
\logpage{[ 2, 3, 9 ]}
\hyperdef{L}{X8135F74080E50B14}{}
{
  Let $G$ be a finite group and $p$ be a prime integer. If the tensor product $\Phi$, say, of two ordinary irreducible characters of $G$ vanishes on all $p$-singular elements of $G$ then $\Phi$ is a ${\ensuremath{\mathbb Z}}$-linear combination of the \emph{projective indecomposable characters} $\Phi_{\varphi} = \sum_{{\chi \in {{\rm Irr}}(G)}} d_{{\chi \varphi}} \chi$ of $G$, where $\varphi$ runs over the irreducible $p$-modular Brauer characters of $G$ and $d_{{\chi \varphi}}$ is the decomposition number of $\chi$ and $\varphi$. (See for example \cite[p. 25]{Nav98} or \cite[Def. 4.3.1]{LP10}.) Such class functions are called generalized projective characters. 

 In fact, very often $\Phi$ is a projective character, that is, the coefficients of the decomposition into
projective indecomposable characters are nonnegative. 

 We are interested in examples where this is \emph{not} the case. For that, we write a small \textsf{GAP} function that computes, for a given $p$-modular character table, those tensor products of ordinary irreducible
characters that are generalized projective characters but are not projective. 

 Many years ago, Richard Parker had been interested in the question whether
such tensor products can exist for a given group. Note that forming tensor
products that vanish on $p$-singular elements is a recipe for creating projective characters, provided
one knows in advance that the answer is negative for the given group. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@GenProjNotProj:= function( modtbl )|
  !gapprompt@>| !gapinput@     local p, tbl, X, PIMs, n, psingular, list, labels, i, j, psi,|
  !gapprompt@>| !gapinput@           pos, dec, poss;|
  !gapprompt@>| !gapinput@|
  !gapprompt@>| !gapinput@     p:= UnderlyingCharacteristic( modtbl );|
  !gapprompt@>| !gapinput@     tbl:= OrdinaryCharacterTable( modtbl );|
  !gapprompt@>| !gapinput@     X:= Irr( tbl );|
  !gapprompt@>| !gapinput@     PIMs:= TransposedMat( DecompositionMatrix( modtbl ) ) * X;|
  !gapprompt@>| !gapinput@     n:= Length( X );|
  !gapprompt@>| !gapinput@     psingular:= Difference( [ 1 .. n ], GetFusionMap( modtbl, tbl ) );|
  !gapprompt@>| !gapinput@     list:= [];|
  !gapprompt@>| !gapinput@     labels:= [];|
  !gapprompt@>| !gapinput@     for i in [ 1 .. n ] do|
  !gapprompt@>| !gapinput@       for j in [ 1 .. i ] do|
  !gapprompt@>| !gapinput@         psi:= List( [ 1 .. n ], x -> X[i][x] * X[j][x] );|
  !gapprompt@>| !gapinput@         if IsZero( psi{ psingular } ) then|
  !gapprompt@>| !gapinput@           # This is a generalized projective character.|
  !gapprompt@>| !gapinput@           pos:= Position( list, psi );|
  !gapprompt@>| !gapinput@           if pos = fail then|
  !gapprompt@>| !gapinput@             Add( list, psi );|
  !gapprompt@>| !gapinput@             Add( labels, [ [ j, i ] ] );|
  !gapprompt@>| !gapinput@           else|
  !gapprompt@>| !gapinput@             Add( labels[ pos ], [ j, i ] );|
  !gapprompt@>| !gapinput@           fi;|
  !gapprompt@>| !gapinput@         fi;|
  !gapprompt@>| !gapinput@       od;|
  !gapprompt@>| !gapinput@     od;|
  !gapprompt@>| !gapinput@|
  !gapprompt@>| !gapinput@     if Length( list ) > 0 then|
  !gapprompt@>| !gapinput@       # Decompose the generalized projective tensor products|
  !gapprompt@>| !gapinput@       # into the projective indecomposables.|
  !gapprompt@>| !gapinput@       dec:= Decomposition( PIMs, list, "nonnegative" );|
  !gapprompt@>| !gapinput@       poss:= Positions( dec, fail );|
  !gapprompt@>| !gapinput@       return Set( Concatenation( labels{ poss } ) );|
  !gapprompt@>| !gapinput@     else|
  !gapprompt@>| !gapinput@       return [];|
  !gapprompt@>| !gapinput@     fi;|
  !gapprompt@>| !gapinput@     end;;|
\end{Verbatim}
 

 One group for which the function returns a nonempty result is the sporadic
simple Janko group $J_2$ in characteristic $2$. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@tbl:= CharacterTable( "J2" );;|
  !gapprompt@gap>| !gapinput@modtbl:= tbl mod 2;;|
  !gapprompt@gap>| !gapinput@pairs:= GenProjNotProj( modtbl );|
  [ [ 6, 12 ] ]
  !gapprompt@gap>| !gapinput@irr:= Irr( tbl );;|
  !gapprompt@gap>| !gapinput@PIMs:= TransposedMat( DecompositionMatrix( modtbl ) ) * irr;;|
  !gapprompt@gap>| !gapinput@SolutionMat( PIMs, irr[6] * irr[12] );|
  [ 0, 0, 0, 1, 1, 1, 0, 0, -2, 3 ]
\end{Verbatim}
 

 Checking all available tables from the library takes several hours of CPU time
and also requires a lot of space;  finally, it yields the following result. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@examples:= [];;|
  !gapprompt@gap>| !gapinput@for name in AllCharacterTableNames( IsDuplicateTable, false ) do|
  !gapprompt@>| !gapinput@     tbl:= CharacterTable( name );|
  !gapprompt@>| !gapinput@     for p in PrimeDivisors( Size( tbl ) ) do|
  !gapprompt@>| !gapinput@       modtbl:= tbl mod p;|
  !gapprompt@>| !gapinput@       if modtbl <> fail then|
  !gapprompt@>| !gapinput@         res:= GenProjNotProj( modtbl );|
  !gapprompt@>| !gapinput@         if not IsEmpty( res ) then|
  !gapprompt@>| !gapinput@           AddSet( examples, [ name, p, Length( res ) ] );|
  !gapprompt@>| !gapinput@        fi;|
  !gapprompt@>| !gapinput@      fi;|
  !gapprompt@>| !gapinput@    od;|
  !gapprompt@>| !gapinput@  od;|
  !gapprompt@gap>| !gapinput@examples;|
  [ [ "(A5xJ2):2", 2, 4 ], [ "(D10xJ2).2", 2, 9 ], [ "2.Suz", 3, 1 ], 
    [ "2.Suz.2", 3, 4 ], [ "2xCo2", 5, 4 ], [ "3.Suz", 2, 6 ], 
    [ "3.Suz.2", 2, 4 ], [ "Co2", 5, 1 ], [ "Co3", 2, 4 ], 
    [ "Isoclinic(2.Suz.2)", 3, 4 ], [ "J2", 2, 1 ], [ "Suz", 2, 2 ], 
    [ "Suz", 3, 1 ], [ "Suz.2", 3, 4 ] ]
\end{Verbatim}
 This list looks rather ``sporadic''. The number of examples is small, and all groups in question except two (the
subdirect products of $S_5$ and $J_2.2$, and of $5:4$ and $J_2.2$, respectively) are extensions of sporadic simple groups. 

 Note that the following cases could be omitted because the characters in
question belong to proper factor groups: $2.Suz$ mod $3$, $2.Suz.2$ mod $3$, and its isoclinic variant. }

  
\subsection{\textcolor{Chapter }{Example: Certain elementary abelian subgroups in quasisimple groups (November
2020)}}\label{subsect:elabsubgroup}
\logpage{[ 2, 3, 10 ]}
\hyperdef{L}{X7AD5E36B7D44C507}{}
{
  In October 2020, Bob Guralnick asked: Does each quasisimple group $G$ contain an elementary abelian subgroup that contains elements from all
conjugacy classes of involutions in $G$? (Such a subgroup is called a \emph{broad} subgroup of $G$. See \cite{GR20} for the paper.) 

 In the case of simple groups, theoretical arguments suffice to show that the
answer is positive for simple groups of alternating and Lie type, thus it
remains to inspect the sporadic simple groups. 

 In the case of nonsimple quasisimple groups, again groups having a sporadic
simple factor group have to be checked, and also the central extensions of
groups of Lie type by exceptional multipliers have to be checked
computationally. 

 In the following situations, the answer is positive for a given group $G$. 

 
\begin{enumerate}
\item  $G$ has at most two classes of involutions. (Take an involution $x$ in the centre of a Sylow $2$-subgroup $P$ of $G$; if there is a conjugacy class of involutions in $G$ different from $x^G$ then $P$ contains an element in the other involution class.) 
\item  $G$ has exactly three classes of involutions such that there are representatives $x$, $y$, $z$ with the property $x y = z$. (The subgroup $\langle x, y \rangle$ is a Klein four group; note that $x$ and $y$ commute because $x^{{-1}} y^{{-1}} x y = (x y)^2 = z^2 = 1$ holds.) 
\item  $G$ has a central elementary abelian $2$-subgroup $N$, and there is an elementary abelian $2$-subgroup $P / N$ in $G / N$ containing elements from all those involution classes of $G / N$ that lift to involutions of $G$, but no elements from other involution classes of $G / N$. (Just take the preimage $P$, which is elementary abelian.) 

 This condition is satisfied for example if the answer is positive for $G / N$ and \emph{all} involutions of $G / N$ lift to involutions in $G$, or if exactly one class of involutions of $G / N$ lifts to involutions in $G$. 
\end{enumerate}
 

 The following function evaluates the first two of the above criteria and easy
cases of the third one, for the given character table of the group $G$. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ApplyCriteria:= "dummy";;  # Avoid a syntax error ...|
  !gapprompt@gap>| !gapinput@ApplyCriteria:= function( tbl )|
  !gapprompt@>| !gapinput@   local id, ord, invpos, cen, facttbl, factfus, invmap, factord,|
  !gapprompt@>| !gapinput@          factinvpos, imgs;|
  !gapprompt@>| !gapinput@   id:= ReplacedString( Identifier( tbl ), " ", "" );|
  !gapprompt@>| !gapinput@   ord:= OrdersClassRepresentatives( tbl );|
  !gapprompt@>| !gapinput@   invpos:= PositionsProperty( ord, x -> x <= 2 );|
  !gapprompt@>| !gapinput@   if Length( invpos ) <= 3 then|
  !gapprompt@>| !gapinput@     # There are at most 2 involution classes.|
  !gapprompt@>| !gapinput@     Print( "#I  ", id, ": ",|
  !gapprompt@>| !gapinput@            "done (", Length( invpos ) - 1, " inv. class(es))\n" );|
  !gapprompt@>| !gapinput@     return true;|
  !gapprompt@>| !gapinput@   elif Length( invpos ) = 4 and|
  !gapprompt@>| !gapinput@        ClassMultiplicationCoefficient( tbl, invpos[2], invpos[3],|
  !gapprompt@>| !gapinput@                                             invpos[4] ) <> 0 then|
  !gapprompt@>| !gapinput@     Print( "#I  ", id, ": ",|
  !gapprompt@>| !gapinput@            "done (3 inv. classes, nonzero str. const.)\n" );|
  !gapprompt@>| !gapinput@     return true;|
  !gapprompt@>| !gapinput@   fi;|
  !gapprompt@>| !gapinput@   cen:= Intersection( invpos, ClassPositionsOfCentre( tbl ) );|
  !gapprompt@>| !gapinput@   if Length( cen ) > 1 then|
  !gapprompt@>| !gapinput@     # Consider the factor modulo the largest central el. ab. 2-group.|
  !gapprompt@>| !gapinput@     facttbl:= tbl / cen;|
  !gapprompt@>| !gapinput@     factfus:= GetFusionMap( tbl, facttbl );|
  !gapprompt@>| !gapinput@     invmap:= InverseMap( factfus );|
  !gapprompt@>| !gapinput@     factord:= OrdersClassRepresentatives( facttbl );|
  !gapprompt@>| !gapinput@     factinvpos:= PositionsProperty( factord, x -> x <= 2 );|
  !gapprompt@>| !gapinput@     if ForAll( factinvpos,|
  !gapprompt@>| !gapinput@            i -> invmap[i] in invpos or|
  !gapprompt@>| !gapinput@                 ( IsList( invmap[i] ) and|
  !gapprompt@>| !gapinput@                   IsSubset( invpos, invmap[i] ) ) ) then|
  !gapprompt@>| !gapinput@       # All involutions of the factor group lift to involutions.|
  !gapprompt@>| !gapinput@       if ApplyCriteria( facttbl ) = true then|
  !gapprompt@>| !gapinput@         Print( "#I  ", id, ": ",|
  !gapprompt@>| !gapinput@                "done (all inv. in ",|
  !gapprompt@>| !gapinput@                ReplacedString( Identifier( facttbl ), " ", "" ),|
  !gapprompt@>| !gapinput@                " lift to inv.)\n" );|
  !gapprompt@>| !gapinput@         return true;|
  !gapprompt@>| !gapinput@       fi;|
  !gapprompt@>| !gapinput@     fi;|
  !gapprompt@>| !gapinput@     imgs:= Set( factfus{ invpos } );|
  !gapprompt@>| !gapinput@     if Length( imgs ) = 2 and|
  !gapprompt@>| !gapinput@        ForAll( imgs,|
  !gapprompt@>| !gapinput@            i -> invmap[i] in invpos or|
  !gapprompt@>| !gapinput@                 ( IsList( invmap[i] ) and|
  !gapprompt@>| !gapinput@                   IsSubset( invpos, invmap[i] ) ) ) then|
  !gapprompt@>| !gapinput@       # There is a C2 subgroup of the factor|
  !gapprompt@>| !gapinput@       # such that its involution lifts to involutions,|
  !gapprompt@>| !gapinput@       # and the lifts of the C2 cover all involution classes of 'tbl'.|
  !gapprompt@>| !gapinput@       Print( "#I  ", id, ": ",|
  !gapprompt@>| !gapinput@              "done (all inv. in ", id,|
  !gapprompt@>| !gapinput@              " are lifts of a C2\n",|
  !gapprompt@>| !gapinput@              "#I  in the factor modulo ",|
  !gapprompt@>| !gapinput@              ReplacedString( String( cen ), " ", "" ), ")\n" );|
  !gapprompt@>| !gapinput@       return true;|
  !gapprompt@>| !gapinput@     fi;|
  !gapprompt@>| !gapinput@   fi;|
  !gapprompt@>| !gapinput@   Print( "#I  ", id, ": ",|
  !gapprompt@>| !gapinput@          "OPEN (", Length( invpos  ) - 1, " inv. class(es))\n" );|
  !gapprompt@>| !gapinput@   return false;|
  !gapprompt@>| !gapinput@end;;|
\end{Verbatim}
 

 We start with the sporadic simple groups. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@SizeScreen( [ 72 ] );;|
  !gapprompt@gap>| !gapinput@spor:= AllCharacterTableNames( IsSporadicSimple, true,|
  !gapprompt@>| !gapinput@                                  IsDuplicateTable, false );|
  [ "B", "Co1", "Co2", "Co3", "F3+", "Fi22", "Fi23", "HN", "HS", "He", 
    "J1", "J2", "J3", "J4", "Ly", "M", "M11", "M12", "M22", "M23", 
    "M24", "McL", "ON", "Ru", "Suz", "Th" ]
  !gapprompt@gap>| !gapinput@Filtered( spor,|
  !gapprompt@>| !gapinput@       x -> not ApplyCriteria( CharacterTable( x ) ) );|
  #I  B: OPEN (4 inv. class(es))
  #I  Co1: OPEN (3 inv. class(es))
  #I  Co2: done (3 inv. classes, nonzero str. const.)
  #I  Co3: done (2 inv. class(es))
  #I  F3+: done (2 inv. class(es))
  #I  Fi22: done (3 inv. classes, nonzero str. const.)
  #I  Fi23: done (3 inv. classes, nonzero str. const.)
  #I  HN: done (2 inv. class(es))
  #I  HS: done (2 inv. class(es))
  #I  He: done (2 inv. class(es))
  #I  J1: done (1 inv. class(es))
  #I  J2: done (2 inv. class(es))
  #I  J3: done (1 inv. class(es))
  #I  J4: done (2 inv. class(es))
  #I  Ly: done (1 inv. class(es))
  #I  M: done (2 inv. class(es))
  #I  M11: done (1 inv. class(es))
  #I  M12: done (2 inv. class(es))
  #I  M22: done (1 inv. class(es))
  #I  M23: done (1 inv. class(es))
  #I  M24: done (2 inv. class(es))
  #I  McL: done (1 inv. class(es))
  #I  ON: done (1 inv. class(es))
  #I  Ru: done (2 inv. class(es))
  #I  Suz: done (2 inv. class(es))
  #I  Th: done (1 inv. class(es))
  [ "B", "Co1" ]
\end{Verbatim}
 

 The two open cases can be handled as follows. 

 The group $G = B$ contains maximal subgroups of the type $5:4 \times HS.2$ (the normalizers of \texttt{5A} elements, see \cite[p.{\nobreakspace}217]{CCN85}). The direct factor $H = HS.2$ of such a subgroup has four classes of involutions, which fuse to the four
involution classes of $G$. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@t:= CharacterTable( "B" );;|
  !gapprompt@gap>| !gapinput@invpos:= Positions( OrdersClassRepresentatives( t ), 2 );|
  [ 2, 3, 4, 5 ]
  !gapprompt@gap>| !gapinput@mx:= List( Maxes( t ), CharacterTable );;|
  !gapprompt@gap>| !gapinput@s:= First( mx,|
  !gapprompt@>| !gapinput@         x -> Size( x ) = 20 * Size( CharacterTable( "HS.2" ) ) );|
  CharacterTable( "5:4xHS.2" )
  !gapprompt@gap>| !gapinput@fus:= GetFusionMap( s, t );;|
  !gapprompt@gap>| !gapinput@prod:= ClassPositionsOfDirectProductDecompositions( s );|
  [ [ [ 1, 40 .. 157 ], [ 1 .. 39 ] ] ]
  !gapprompt@gap>| !gapinput@fusinB:= List( prod[1], l -> fus{ l } );|
  [ [ 1, 18, 8, 3, 8 ], 
    [ 1, 3, 4, 6, 8, 9, 14, 19, 18, 18, 25, 22, 31, 36, 43, 51, 50, 54, 
        57, 81, 100, 2, 5, 8, 11, 16, 21, 20, 24, 34, 33, 48, 52, 59, 
        76, 106, 100, 100, 137 ] ]
  !gapprompt@gap>| !gapinput@IsSubset( fusinB[2], invpos );|
  true
  !gapprompt@gap>| !gapinput@h:= CharacterTable( "HS.2" );;|
  !gapprompt@gap>| !gapinput@fusinB[2]{ Positions( OrdersClassRepresentatives( h ), 2 ) };|
  [ 3, 4, 2, 5 ]
\end{Verbatim}
 

 The table of marks of $H$ is known. We find five classes of elementary abelian subgroups of order eight
in $H$ that contain elements from all four involution classes of $H$. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@tom:= TableOfMarks( h );|
  TableOfMarks( "HS.2" )
  !gapprompt@gap>| !gapinput@ord:= OrdersTom( tom );;|
  !gapprompt@gap>| !gapinput@invpos:= Positions( ord, 2 );|
  [ 2, 3, 534, 535 ]
  !gapprompt@gap>| !gapinput@8pos:= Positions( ord, 8 );;|
  !gapprompt@gap>| !gapinput@filt:= Filtered( 8pos,|
  !gapprompt@>| !gapinput@       x -> ForAll( invpos,|
  !gapprompt@>| !gapinput@              y -> Length( IntersectionsTom( tom, x, y ) ) >= y|
  !gapprompt@>| !gapinput@                   and IntersectionsTom( tom, x, y )[y] <> 0 ) );|
  [ 587, 589, 590, 593, 595 ]
  !gapprompt@gap>| !gapinput@reps:= List( filt, i -> RepresentativeTom( tom, i ) );;|
  !gapprompt@gap>| !gapinput@ForAll( reps, IsElementaryAbelian );|
  true
\end{Verbatim}
 

 The group $G = Co_1$ has a maximal subgroup $H$ of type $A_9 \times S_3$ (see \cite[p.{\nobreakspace}183]{CCN85}) that contains elements from all three involution classes of $G$. Moreover, the factor $S_3$ contains \texttt{2A} elements, and the factor $A_9$ contains \texttt{2B} and \texttt{2C} elements. This yields the desired elementary abelian subgroup of order eight. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@t:= CharacterTable( "Co1" );;|
  !gapprompt@gap>| !gapinput@invpos:= Positions( OrdersClassRepresentatives( t ), 2 );|
  [ 2, 3, 4 ]
  !gapprompt@gap>| !gapinput@mx:= List( Maxes( t ), CharacterTable );;|
  !gapprompt@gap>| !gapinput@s:= First( mx, x -> Size( x ) = 3 * Factorial( 9 ) );|
  CharacterTable( "A9xS3" )
  !gapprompt@gap>| !gapinput@fus:= GetFusionMap( s, t );;|
  !gapprompt@gap>| !gapinput@prod:= ClassPositionsOfDirectProductDecompositions( s );|
  [ [ [ 1 .. 3 ], [ 1, 4 .. 52 ] ] ]
  !gapprompt@gap>| !gapinput@List( prod[1], l -> fus{ l } );|
  [ [ 1, 8, 2 ], 
    [ 1, 3, 4, 5, 7, 6, 13, 14, 15, 19, 24, 28, 36, 37, 39, 50, 61, 61 
       ] ]
\end{Verbatim}
  

 Thus we know that the answer is positive for each sporadic simple group. Next
we look at the relevant covering groups of sporadic simple groups. For a
quasisimple group with a sporadic simple factor, the Schur multiplier has at
most the prime factors $2$ and $3$; only the extension by the $2$-part of the multipier must be checked. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@sporcov:= AllCharacterTableNames( IsSporadicSimple, true,|
  !gapprompt@>| !gapinput@       IsDuplicateTable, false, OfThose, SchurCover );|
  [ "12.M22", "2.B", "2.Co1", "2.HS", "2.J2", "2.M12", "2.Ru", "3.F3+", 
    "3.J3", "3.McL", "3.ON", "6.Fi22", "6.Suz", "Co2", "Co3", "Fi23", 
    "HN", "He", "J1", "J4", "Ly", "M", "M11", "M23", "M24", "Th" ]
  !gapprompt@gap>| !gapinput@Filtered( sporcov, x -> '.' in x );|
  [ "12.M22", "2.B", "2.Co1", "2.HS", "2.J2", "2.M12", "2.Ru", "3.F3+", 
    "3.J3", "3.McL", "3.ON", "6.Fi22", "6.Suz" ]
  !gapprompt@gap>| !gapinput@relevant:= [ "2.M22", "4.M22", "2.B", "2.Co1", "2.HS", "2.J2",|
  !gapprompt@>| !gapinput@                "2.M12", "2.Ru", "2.Fi22", "2.Suz" ];;|
  !gapprompt@gap>| !gapinput@Filtered( relevant,|
  !gapprompt@>| !gapinput@       x -> not ApplyCriteria( CharacterTable( x ) ) );|
  #I  2.M22: done (3 inv. classes, nonzero str. const.)
  #I  4.M22: done (2 inv. class(es))
  #I  2.B: OPEN (5 inv. class(es))
  #I  2.Co1: OPEN (4 inv. class(es))
  #I  2.HS: done (3 inv. classes, nonzero str. const.)
  #I  2.J2: done (3 inv. classes, nonzero str. const.)
  #I  2.M12: done (3 inv. classes, nonzero str. const.)
  #I  2.Ru: done (3 inv. classes, nonzero str. const.)
  #I  2.Fi22/[1,2]: done (3 inv. classes, nonzero str. const.)
  #I  2.Fi22: done (all inv. in 2.Fi22/[1,2] lift to inv.)
  #I  2.Suz: done (3 inv. classes, nonzero str. const.)
  [ "2.B", "2.Co1" ]
\end{Verbatim}
 

 The group $B$ has four classes of involutions, let us call them \texttt{2A}, \texttt{2B}, \texttt{2C}, and \texttt{2D}. All except \texttt{2C} lift to involutions in $2.B$. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@t:= CharacterTable( "B" );;|
  !gapprompt@gap>| !gapinput@2t:= CharacterTable( "2.B" );;|
  !gapprompt@gap>| !gapinput@invpost:= Positions( OrdersClassRepresentatives( t ), 2 );|
  [ 2, 3, 4, 5 ]
  !gapprompt@gap>| !gapinput@invpos2t:= Positions( OrdersClassRepresentatives( 2t ), 2 );|
  [ 2, 3, 4, 5, 7 ]
  !gapprompt@gap>| !gapinput@GetFusionMap( 2t, t ){ invpos2t };|
  [ 1, 2, 3, 3, 5 ]
\end{Verbatim}
 

 Thus it suffices to show that there is a subgroup of type $2^2$ in $B$ that contains elements from \texttt{2A}, \texttt{2B}, and \texttt{2D} (but no element from \texttt{2C}). This follows from the fact that the $($\texttt{2A}, \texttt{2B}, \texttt{2D}$)$ structure constant of $B$ is nonzero. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ClassMultiplicationCoefficient( t, 2, 3, 5 );|
  120
\end{Verbatim}
 

 The group $Co_1$ has three classes of involutions, let us call them \texttt{2A}, \texttt{2B}, and \texttt{2C}. All except \texttt{2B} lift to involutions in $2.Co_1$. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@t:= CharacterTable( "Co1" );;|
  !gapprompt@gap>| !gapinput@2t:= CharacterTable( "2.Co1" );;|
  !gapprompt@gap>| !gapinput@invpost:= Positions( OrdersClassRepresentatives( t ), 2 );|
  [ 2, 3, 4 ]
  !gapprompt@gap>| !gapinput@invpos2t:= Positions( OrdersClassRepresentatives( 2t ), 2 );|
  [ 2, 3, 4, 6 ]
  !gapprompt@gap>| !gapinput@GetFusionMap( 2t, t ){ invpos2t };|
  [ 1, 2, 2, 4 ]
\end{Verbatim}
 

 Thus it suffices to show that there is a subgroup of type $2^2$ in $Co_1$ that contains elements from \texttt{2A} and \texttt{2C} but no element from \texttt{2B}. This follows from the fact that the $($\texttt{2A}, \texttt{2A}, \texttt{2C}$)$ structure constant of $Co_1$ is nonzero. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ClassMultiplicationCoefficient( t, 2, 2, 4 );|
  264
\end{Verbatim}
 

 Finally, we deal with the relevant central extensions of finite simple groups
of Lie type with exceptional multipliers. These groups are listed in \cite[p.{\nobreakspace}xvi, Table 5]{CCN85}. The following cases belong to exceptional multipliers with nontrivial $2$-part. 

 \begin{center}
\begin{tabular}{|l|l|r|}\hline
Group&
Name&
Multiplier\\
\hline
$A_1(4)$&
\texttt{"A5"}&
$2$\\
$A_2(2)$&
\texttt{"L3(2)"}&
$2$\\
$A_2(4)$&
\texttt{"L3(4)"}&
$4^2$\\
$A_3(2)$&
\texttt{"A8"}&
$2$\\
${}^2A_3(2)$&
\texttt{"U4(2)"}&
$2$\\
${}^2A_5(2)$&
\texttt{"U6(2)"}&
$2^2$\\
$B_2(2)$&
\texttt{"S6"}&
$2$\\
${}^2B_2(2)$&
\texttt{"Sz(8)"}&
$2^2$\\
$B_3(2) \cong C_3(2)$&
\texttt{"S6(2)"}&
$2$\\
$D_4(2)$&
\texttt{"O8+(2)"}&
$2^2$\\
$G_2(4)$&
\texttt{"G2(4)"}&
$2$\\
$F_4(2)$&
\texttt{"F4(2)"}&
$2$\\
${}^2E_6(2)$&
\texttt{"2E6(2)"}&
$2^2$\\
\hline
\end{tabular}\\[2mm]
\textbf{Table: }Groups with exceptional $2$-part of their multiplier\end{center}

 

 This leads to the following list of cases to be checked. (We would not need to
deal with the groups $A_5$ and $L_3(2)$, because of isomorphisms with groups of Lie type for which the multiplier in
question is not exceptional, but here we ignore this fact.) 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@list:= [|
  !gapprompt@>| !gapinput@     [ "A5", "2.A5" ],|
  !gapprompt@>| !gapinput@     [ "L3(2)", "2.L3(2)" ],|
  !gapprompt@>| !gapinput@     [ "L3(4)", "2.L3(4)", "2^2.L3(4)", "4_1.L3(4)", "4_2.L3(4)",|
  !gapprompt@>| !gapinput@       "(2x4).L3(4)", "4^2.L3(4)" ],|
  !gapprompt@>| !gapinput@     [ "A8", "2.A8" ],|
  !gapprompt@>| !gapinput@     [ "U4(2)", "2.U4(2)"],|
  !gapprompt@>| !gapinput@     [ "U6(2)", "2.U6(2)", "2^2.U6(2)" ],|
  !gapprompt@>| !gapinput@     [ "A6", "2.A6" ],|
  !gapprompt@>| !gapinput@     [ "Sz(8)", "2.Sz(8)", "2^2.Sz(8)" ],|
  !gapprompt@>| !gapinput@     [ "S6(2)", "2.S6(2)" ],|
  !gapprompt@>| !gapinput@     [ "O8+(2)", "2.O8+(2)", "2^2.O8+(2)" ],|
  !gapprompt@>| !gapinput@     [ "G2(4)", "2.G2(4)" ],|
  !gapprompt@>| !gapinput@     [ "F4(2)", "2.F4(2)" ],|
  !gapprompt@>| !gapinput@     [ "2E6(2)", "2.2E6(2)", "2^2.2E6(2)" ] ];;|
  !gapprompt@gap>| !gapinput@Filtered( Concatenation( list ),|
  !gapprompt@>| !gapinput@       x -> not ApplyCriteria( CharacterTable( x ) ) );|
  #I  A5: done (1 inv. class(es))
  #I  2.A5: done (1 inv. class(es))
  #I  L3(2): done (1 inv. class(es))
  #I  2.L3(2): done (1 inv. class(es))
  #I  L3(4): done (1 inv. class(es))
  #I  2.L3(4): done (3 inv. classes, nonzero str. const.)
  #I  2^2.L3(4)/[1,2,3,4]: done (1 inv. class(es))
  #I  2^2.L3(4): done (all inv. in 2^2.L3(4)/[1,2,3,4] lift to inv.)
  #I  4_1.L3(4): done (2 inv. class(es))
  #I  4_2.L3(4): done (2 inv. class(es))
  #I  (2x4).L3(4): done (all inv. in (2x4).L3(4) are lifts of a C2
  #I  in the factor modulo [1,2,3,4])
  #I  4^2.L3(4): done (all inv. in 4^2.L3(4) are lifts of a C2
  #I  in the factor modulo [1,2,3,4])
  #I  A8: done (2 inv. class(es))
  #I  2.A8: done (2 inv. class(es))
  #I  U4(2): done (2 inv. class(es))
  #I  2.U4(2): done (2 inv. class(es))
  #I  U6(2): done (3 inv. classes, nonzero str. const.)
  #I  2.U6(2)/[1,2]: done (3 inv. classes, nonzero str. const.)
  #I  2.U6(2): done (all inv. in 2.U6(2)/[1,2] lift to inv.)
  #I  2^2.U6(2)/[1,2,3,4]: done (3 inv. classes, nonzero str. const.)
  #I  2^2.U6(2): done (all inv. in 2^2.U6(2)/[1,2,3,4] lift to inv.)
  #I  A6: done (1 inv. class(es))
  #I  2.A6: done (1 inv. class(es))
  #I  Sz(8): done (1 inv. class(es))
  #I  2.Sz(8): done (2 inv. class(es))
  #I  2^2.Sz(8)/[1,2,3,4]: done (1 inv. class(es))
  #I  2^2.Sz(8): done (all inv. in 2^2.Sz(8)/[1,2,3,4] lift to inv.)
  #I  S6(2): OPEN (4 inv. class(es))
  #I  2.S6(2): OPEN (3 inv. class(es))
  #I  O8+(2): OPEN (5 inv. class(es))
  #I  2.O8+(2): OPEN (5 inv. class(es))
  #I  2^2.O8+(2): OPEN (5 inv. class(es))
  #I  G2(4): done (2 inv. class(es))
  #I  2.G2(4): done (3 inv. classes, nonzero str. const.)
  #I  F4(2): OPEN (4 inv. class(es))
  #I  2.F4(2)/[1,2]: OPEN (4 inv. class(es))
  #I  2.F4(2): OPEN (9 inv. class(es))
  #I  2E6(2): done (3 inv. classes, nonzero str. const.)
  #I  2.2E6(2)/[1,2]: done (3 inv. classes, nonzero str. const.)
  #I  2.2E6(2): done (all inv. in 2.2E6(2)/[1,2] lift to inv.)
  #I  2^2.2E6(2)/[1,2,3,4]: done (3 inv. classes, nonzero str. const.)
  #I  2^2.2E6(2): done (all inv. in 2^2.2E6(2)/[1,2,3,4] lift to inv.)
  [ "S6(2)", "2.S6(2)", "O8+(2)", "2.O8+(2)", "2^2.O8+(2)", "F4(2)", 
    "2.F4(2)" ]
\end{Verbatim}
 

 We could assume that the answer is positive for the simple groups in the list
of open cases, by theoretical arguments, but it is easy to show this
computationally. 

 For $G = S_6(2)$, consider a maximal subgroup $2^6.L_3(2)$ of $G$ (see \cite[p.{\nobreakspace}46]{CCN85}): Its $2$-core is elementary abelian and covers all four involution classes of $G$. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@t:= CharacterTable( "S6(2)" );;|
  !gapprompt@gap>| !gapinput@invpos:= Positions( OrdersClassRepresentatives( t ), 2 );|
  [ 2, 3, 4, 5 ]
  !gapprompt@gap>| !gapinput@mx:= List( Maxes( t ), CharacterTable );;|
  !gapprompt@gap>| !gapinput@s:= First( mx,|
  !gapprompt@>| !gapinput@         x -> Size( x ) = 2^6 * Size( CharacterTable( "L3(2)" ) ) );|
  CharacterTable( "2^6:L3(2)" )
  !gapprompt@gap>| !gapinput@corepos:= ClassPositionsOfPCore( s, 2 );|
  [ 1 .. 5 ]
  !gapprompt@gap>| !gapinput@OrdersClassRepresentatives( t ){ corepos };|
  [ 1, 2, 2, 2, 2 ]
  !gapprompt@gap>| !gapinput@GetFusionMap( s, t ){ corepos };|
  [ 1, 3, 4, 2, 5 ]
\end{Verbatim}
 

 Concerning $G = 2.S_6(2)$, note that from the four involution classes of $S_6(2)$, exactly \texttt{2B} and \texttt{2D} lift to involutions in $2.S_6(2)$. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@2t:= CharacterTable( "2.S6(2)" );;|
  !gapprompt@gap>| !gapinput@invpost:= Positions( OrdersClassRepresentatives( t ), 2 );|
  [ 2, 3, 4, 5 ]
  !gapprompt@gap>| !gapinput@invpos2t:= Positions( OrdersClassRepresentatives( 2t ), 2 );|
  [ 2, 4, 6 ]
  !gapprompt@gap>| !gapinput@GetFusionMap( 2t, t ){ invpos2t };|
  [ 1, 3, 5 ]
\end{Verbatim}
 

 Thus it suffices to show that there is a subgroup of type $2^2$ in $S_6(2)$ that contains elements from \texttt{2B} and \texttt{2D} but no elements from \texttt{2A} or \texttt{2C}. This follows from the fact that the $($\texttt{2B}, \texttt{2D}, \texttt{2D}$)$ structure constant of $S_6(2)$ is nonzero. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ClassMultiplicationCoefficient( t, 3, 5, 5 );|
  15
\end{Verbatim}
 

 For $G = O_8^+(2)$, we consider the known table of marks. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@t:= CharacterTable( "O8+(2)" );;|
  !gapprompt@gap>| !gapinput@tom:= TableOfMarks( t );|
  TableOfMarks( "O8+(2)" )
  !gapprompt@gap>| !gapinput@ord:= OrdersTom( tom );;|
  !gapprompt@gap>| !gapinput@invpos:= Positions( ord, 2 );|
  [ 2, 3, 4, 5, 6 ]
  !gapprompt@gap>| !gapinput@8pos:= Positions( ord, 8 );;|
  !gapprompt@gap>| !gapinput@filt:= Filtered( 8pos,|
  !gapprompt@>| !gapinput@            x -> ForAll( invpos,|
  !gapprompt@>| !gapinput@                   y -> Length( IntersectionsTom( tom, x, y ) ) >= y|
  !gapprompt@>| !gapinput@                        and IntersectionsTom( tom, x, y )[y] <> 0 ) );|
  [ 151, 153 ]
  !gapprompt@gap>| !gapinput@reps:= List( filt, i -> RepresentativeTom( tom, i ) );;|
  !gapprompt@gap>| !gapinput@ForAll( reps, IsElementaryAbelian );|
  true
\end{Verbatim}
 

 Concerning $G = 2.O_8^+(2)$, note that from the five involution classes of $O_8^+(2)$, exactly \texttt{2A}, \texttt{2B}, and \texttt{2E} lift to involutions in $2.O_8^+(2)$. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@2t:= CharacterTable( "2.O8+(2)" );;|
  !gapprompt@gap>| !gapinput@invpost:= Positions( OrdersClassRepresentatives( t ), 2 );|
  [ 2, 3, 4, 5, 6 ]
  !gapprompt@gap>| !gapinput@invpos2t:= Positions( OrdersClassRepresentatives( 2t ), 2 );|
  [ 2, 3, 4, 5, 8 ]
  !gapprompt@gap>| !gapinput@GetFusionMap( 2t, t ){ invpos2t };|
  [ 1, 2, 3, 3, 6 ]
\end{Verbatim}
 

 Thus it suffices to show that the $($\texttt{2A}, \texttt{2B}, \texttt{2E}$)$ structure constant of $O_8^+(2)$ is nonzero. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ClassMultiplicationCoefficient( t, 2, 3, 6 );|
  4
\end{Verbatim}
 

 Concerning $G = 2^2.O_8^+(2)$, note that from the five involution classes of $O_8^+(2)$, exactly the first and the last lift to involutions in $2^2.O_8^+(2)$. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@v4t:= CharacterTable( "2^2.O8+(2)" );;|
  !gapprompt@gap>| !gapinput@invposv4t:= Positions( OrdersClassRepresentatives( v4t ), 2 );|
  [ 2, 3, 4, 5, 12 ]
  !gapprompt@gap>| !gapinput@GetFusionMap( v4t, t ){ invposv4t };|
  [ 1, 1, 1, 2, 6 ]
\end{Verbatim}
 

 Thus it suffices to show that a corresponding structure constant of $O_8^+(2)$ is nonzero. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ClassMultiplicationCoefficient( t, 2, 6, 6 );|
  27
\end{Verbatim}
 

 For $G = F_4(2)$, consider a maximal subgroup $2^{10}.A_8$ of a maximal subgroup $S_8(2)$ of $G$ (see \cite[p.{\nobreakspace}123 and 170]{CCN85}): Its $2$-core is elementary abelian and covers all four involution classes of $G$. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@t:= CharacterTable( "F4(2)" );;|
  !gapprompt@gap>| !gapinput@invpost:= Positions( OrdersClassRepresentatives( t ), 2 );|
  [ 2, 3, 4, 5 ]
  !gapprompt@gap>| !gapinput@"S8(2)" in Maxes( t );|
  true
  !gapprompt@gap>| !gapinput@s:= CharacterTable( "S8(2)M4" );|
  CharacterTable( "2^10.A8" )
  !gapprompt@gap>| !gapinput@corepos:= ClassPositionsOfPCore( s, 2 );|
  [ 1 .. 7 ]
  !gapprompt@gap>| !gapinput@OrdersClassRepresentatives( s ){ corepos };|
  [ 1, 2, 2, 2, 2, 2, 2 ]
  !gapprompt@gap>| !gapinput@poss:= PossibleClassFusions( s, t );;|
  !gapprompt@gap>| !gapinput@List( poss, map -> map{ corepos } );|
  [ [ 1, 4, 2, 3, 4, 5, 5 ], [ 1, 4, 2, 3, 4, 5, 5 ], 
    [ 1, 4, 3, 2, 4, 5, 5 ], [ 1, 4, 3, 2, 4, 5, 5 ] ]
\end{Verbatim}
 

 Finally, all involutions of $G$ lift to involutions in $2.F_4(2)$. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@2t:= CharacterTable( "2.F4(2)" );;|
  !gapprompt@gap>| !gapinput@invpos2t:= Positions( OrdersClassRepresentatives( 2t ), 2 );|
  [ 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
  !gapprompt@gap>| !gapinput@GetFusionMap( 2t, t ){ invpos2t };|
  [ 1, 2, 2, 3, 3, 4, 4, 5, 5 ]
\end{Verbatim}
 }

 }

 }

     
\chapter{\textcolor{Chapter }{The User Interface to the \textsf{GAP} Character Table Library}}\label{ch:interfac}
\logpage{[ 3, 0, 0 ]}
\hyperdef{L}{X7EB517EB7A50A58F}{}
{
   
\section{\textcolor{Chapter }{Accessing Data of the \textsf{CTblLib} Package}}\label{sect:accessdata}
\logpage{[ 3, 1, 0 ]}
\hyperdef{L}{X7A5EECF8853A05A0}{}
{
  
\subsection{\textcolor{Chapter }{Admissible Names for Character Tables in \textsf{CTblLib} }}\label{subsect:admissiblenames}
\logpage{[ 3, 1, 1 ]}
\hyperdef{L}{X818A9DE5799A4809}{}
{
  When you access a character table from the \textsf{GAP} Character Table Library, this table is specified by an admissible name. 

 Admissible names for the \emph{ordinary character table} $tbl$ of the group $G$ are 
\begin{itemize}
\item  an \textsf{Atlas} like name if $tbl$ is an \textsf{Atlas} table (see Section{\nobreakspace}\ref{sec:ATLAS Tables}), for example \texttt{"M22"} for the table of the Mathieu group $M_{22}$, \texttt{"L2(13).2"} for $L_2(13):2$, and \texttt{"12{\textunderscore}1.U4(3).2{\textunderscore}1"} for $12_1.U_4(3).2_1$. 

 (The difference to the name printed in the \textsf{Atlas} is that subscripts and superscripts are omitted except if they are used to
qualify integer values, and double dots are replaced by a single dot.) 
\item  the names that were admissible for tables of $G$ in the \textsf{CAS} system if the \textsf{CAS} table library contained a table of $G$, for example \texttt{sl42} for the table of the alternating group $A_8$. 

 (But note that the ordering of rows and columns of the \textsf{GAP} table may be different from that in \textsf{CAS}, see Section{\nobreakspace}\ref{sec:CAS Tables}.) 
\item  some ``relative'' names, as follows. 
\begin{itemize}
\item  If $G$ is the $n$-th maximal subgroup (in decreasing group order) of a group whose library
table $subtbl$ is available in \textsf{GAP} and stores the \texttt{Maxes} (\ref{Maxes}) value, and if \texttt{name} is an admissible name for $subtbl$ then \texttt{name}M$n$ is admissible for $tbl$. For example, the name \texttt{"J3M2"} can be used to access the second maximal subgroup of the sporadic simple Janko
group $J_3$ which has the admissible name \texttt{"J3"}. 
\item  If $G$ is a nontrivial Sylow $p$ normalizer in a sporadic simple group with admissible name \texttt{name} {\textendash}where nontrivial means that $G$ is not isomorphic to a subgroup of $p:(p-1)${\textendash} then \texttt{name}N$p$ is an admissible name of $tbl$. For example, the name \texttt{"J4N11"} can be used to access the table of the Sylow $11$ normalizer in the sporadic simple Janko group $J_4$. 
\item  In a few cases, the table of the Sylow $p$-subgroup of $G$ is accessible via the name \texttt{name}Syl$p$ where \texttt{name} is an admissible name of the table of $G$. For example, \texttt{"A11Syl2"} is an admissible name for the table of the Sylow $2$-subgroup of the alternating group $A_{11}$. 
\item  In a few cases, the table of an element centralizer in $G$ is accessible via the name \texttt{name}C$cl$ where \texttt{name} is an admissible name of the table of $G$. For example, \texttt{"M11C2"} is an admissible name for the table of an involution centralizer in the
Mathieu group $M_{11}$. 
\end{itemize}
 
\end{itemize}
 

 The recommended way to access a \emph{Brauer table} is via applying the \texttt{mod} operator to the ordinary table and the desired characteristic (see \texttt{BrauerTable} (\textbf{Reference: BrauerTable}) and Section{\nobreakspace} (\textbf{Reference: Operators for Character Tables})), so it is not necessary to define admissible names of Brauer tables. 

 A \emph{generic character table} (see Section{\nobreakspace}\ref{sec:generictables}) is accessible only by the name given by its \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value. }

 

\subsection{\textcolor{Chapter }{CharacterTable (for a string)}}
\logpage{[ 3, 1, 2 ]}\nobreak
\hyperdef{L}{X86C06F408706F27A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{CharacterTable({\mdseries\slshape tblname[, para1[, para2]]})\index{CharacterTable@\texttt{CharacterTable}!for a string}
\label{CharacterTable:for a string}
}\hfill{\scriptsize (method)}}\\


 If the only argument is a string \mbox{\texttt{\mdseries\slshape tblname}} and if this is an admissible name (see \ref{subsect:admissiblenames}) of a library character table then \texttt{CharacterTable} returns this library table, otherwise \texttt{fail}. 

 If \texttt{CharacterTable} is called with more than one argument then the first must be a string \mbox{\texttt{\mdseries\slshape tblname}} specifying a series of groups which is implemented via a generic character
table, for example \texttt{"Symmetric"} for symmetric groups; the remaining arguments specialize the desired member of
the series (see Section{\nobreakspace}\ref{sec:generictables} for a list of available generic tables). If no generic table with name \mbox{\texttt{\mdseries\slshape tblname}} is available or if the parameters are not admissible then \texttt{CharacterTable} returns \texttt{fail}. 

 A call of \texttt{CharacterTable} may cause that some library files are read and that some table objects are
constructed from the data stored in these files, so fetching a library table
may take more time than one expects. 

 Case is not significant for \mbox{\texttt{\mdseries\slshape tblname}}. For example, both \texttt{"suzm3"} and \texttt{"SuzM3"} can be entered in order to access the character table of the third class of
maximal subgroups of the sporadic simple Suzuki group. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@s5:= CharacterTable( "A5.2" );|
  CharacterTable( "A5.2" )
  !gapprompt@gap>| !gapinput@sym5:= CharacterTable( "Symmetric", 5 );|
  CharacterTable( "Sym(5)" )
  !gapprompt@gap>| !gapinput@TransformingPermutationsCharacterTables( s5, sym5 );|
  rec( columns := (2,3,4,7,5), group := Group(()), 
    rows := (1,7,3,4,6,5,2) )
\end{Verbatim}
 

 The above two tables are tables of the symmetric group on five letters; the
first is in \textsf{Atlas} format (see Section{\nobreakspace}\ref{sec:ATLAS Tables}), the second is constructed from the generic table for symmetric groups
(see{\nobreakspace}\ref{sec:generictables}). 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@CharacterTable( "J5" );|
  fail
  !gapprompt@gap>| !gapinput@CharacterTable( "A5" ) mod 2;|
  BrauerTable( "A5", 2 )
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{BrauerTable (for a string, and a prime integer)}}
\logpage{[ 3, 1, 3 ]}\nobreak
\hyperdef{L}{X7E42C22278DA4048}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{BrauerTable({\mdseries\slshape tblname, p})\index{BrauerTable@\texttt{BrauerTable}!for a string, and a prime integer}
\label{BrauerTable:for a string, and a prime integer}
}\hfill{\scriptsize (operation)}}\\


 Called with a string \mbox{\texttt{\mdseries\slshape tblname}} and a prime integer \mbox{\texttt{\mdseries\slshape p}}, \texttt{BrauerTable} returns the \mbox{\texttt{\mdseries\slshape p}}-modular character table of the ordinary character table with admissible name \mbox{\texttt{\mdseries\slshape tblname}}, if such an ordinary character table exists and if \textsf{GAP} can compute its \mbox{\texttt{\mdseries\slshape p}}-modular table. Otherwise \texttt{fail} is returned. 

 The default method delegates to \texttt{BrauerTable} (\textbf{Reference: BrauerTable for a character table, and a prime integer}) with arguments the \texttt{CharacterTable} (\ref{CharacterTable:for a string}) value of \mbox{\texttt{\mdseries\slshape tblname}} and \mbox{\texttt{\mdseries\slshape p}}. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@BrauerTable( "A5", 2 );|
  BrauerTable( "A5", 2 )
  !gapprompt@gap>| !gapinput@BrauerTable( "J5", 2 );  # no ordinary table with name J5|
  fail
  !gapprompt@gap>| !gapinput@BrauerTable( "M", 2 );   # Brauer table not known|
  fail
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{AllCharacterTableNames}}
\logpage{[ 3, 1, 4 ]}\nobreak
\hyperdef{L}{X7C091641852BB6FE}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{AllCharacterTableNames({\mdseries\slshape [func, val, ...[, OfThose, func]]: OrderedBy := func})\index{AllCharacterTableNames@\texttt{AllCharacterTableNames}}
\label{AllCharacterTableNames}
}\hfill{\scriptsize (function)}}\\


 Similar to group libraries (see Chapter{\nobreakspace} (\textbf{Reference: Group Libraries})), the \textsf{GAP} Character Table Library can be used to search for ordinary character tables
with prescribed properties. 

 A specific library table can be selected by an admissible name, see \ref{subsect:admissiblenames}. 

 \index{selection function!for character tables} The \emph{selection function} (see  (\textbf{Reference: Selection Functions})) for character tables from the \textsf{GAP} Character Table Library that have certain abstract properties is \texttt{AllCharacterTableNames}. Contrary to the situation in the case of group libraries, the selection
function returns a list not of library character tables but of their names;
using \texttt{CharacterTable} (\ref{CharacterTable:for a string}) one can then access the tables themselves. 

 \texttt{AllCharacterTableNames} takes an arbitrary even number of arguments. The argument at each odd position
must be a function, and the argument at the subsequent even position must be
either a value that this function must return when called for the character
table in question, in order to have the name of the table included in the
selection, or a list of such values, or a function that returns \texttt{true} for such a value, and \texttt{false} otherwise. For example, 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@names:= AllCharacterTableNames();;|
\end{Verbatim}
 

 returns a list containing one admissible name of each ordinary character table
in the \textsf{GAP} library, 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@simpnames:= AllCharacterTableNames( IsSimple, true,|
  !gapprompt@>| !gapinput@                                       IsAbelian, false );;|
\end{Verbatim}
 

 returns a list containing an admissible name of each ordinary character table
in the \textsf{GAP} library whose groups are nonabelian and simple, and 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@AllCharacterTableNames( IsSimple, true, IsAbelian, false,|
  !gapprompt@>| !gapinput@                           Size, [ 1 .. 100 ] );|
  [ "A5", "A6M2", "Alt(5)" ]
\end{Verbatim}
 

 returns a list containing an admissible name of each ordinary character table
in the \textsf{GAP} library whose groups are nonabelian and simple and have order at most $100$, respectively. (Note that \texttt{"A5"}, \texttt{"A6M2"}, and \texttt{"Alt(5)"} are identifiers of permutation equivalent character tables. It would be
possible to exclude duplicates, see Section{\nobreakspace}\ref{sec:duplicates}). 

 Similarly, 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@AllCharacterTableNames( Size, IsPrimeInt );|
  [ "2.Alt(2)", "Alt(3)", "C2", "C3", "Sym(2)" ]
\end{Verbatim}
 

 returns the list of all identifiers of library tables whose \texttt{Size} (\textbf{Reference: Size}) value is a prime integer, and 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@AllCharacterTableNames( Identifier,|
  !gapprompt@>| !gapinput@       x -> PositionSublist( x, "L8" ) <> fail );|
  [ "L8(2)", "P1L82", "P2L82" ]
\end{Verbatim}
 

 returns the identifiers that contain the string \texttt{"L8"} as a substring. 

 For the sake of efficiency, the attributes whose names are listed in \texttt{CTblLib.SupportedAttributes} are handled in a special way, \textsf{GAP} need not read all files of the table library in these cases in order to find
the desired names. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@CTblLib.SupportedAttributes;|
  [ "AbelianInvariants", "Identifier", "IdentifiersOfDuplicateTables", 
    "InfoText", "IsAbelian", "IsAlmostSimple", "IsDuplicateTable", 
    "IsNontrivialDirectProduct", "IsPerfect", "IsQuasisimple", 
    "IsSimple", "IsSporadicSimple", "KnowsDeligneLusztigNames", 
    "KnowsSomeGroupInfo", "Maxes", "NamesOfFusionSources", 
    "NrConjugacyClasses", "Size" ]
\end{Verbatim}
 

 If the \textsf{Browse} package (see{\nobreakspace}\cite{Browse}) is not loaded then \texttt{CTblLib.SupportedAttributes} contains only \texttt{"Identifier"}, and \texttt{AllCharacterTableNames} will be very slow when one selects character tables according to other
attributes from the list shown above. 

 The global option \texttt{OrderedBy} can be used to prescribe the ordering of the result. The value of this option,
if given, must be a function that takes a character table as its unique
argument; the result list is then sorted according to the results of this
function (w.{\nobreakspace}r.{\nobreakspace}t. the comparison by \textsf{GAP}'s \texttt{\texttt{\symbol{92}}{\textless}} operation). 

 For example, we may be interested in the tables of small sporadic simple
groups, ordered alphabetically or by size (\texttt{Size} (\textbf{Reference: Size for a character table})) or by the number of conjugacy classes (\texttt{NrConjugacyClasses} (\textbf{Reference: NrConjugacyClasses for a character table})). 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@AllCharacterTableNames( IsSporadicSimple, true,|
  !gapprompt@>| !gapinput@       Size, [ 1 .. 10^6 ],|
  !gapprompt@>| !gapinput@       IsDuplicateTable, false );|
  [ "J1", "J2", "M11", "M12", "M22" ]
  !gapprompt@gap>| !gapinput@AllCharacterTableNames( IsSporadicSimple, true,|
  !gapprompt@>| !gapinput@       Size, [ 1 .. 10^6 ],|
  !gapprompt@>| !gapinput@       IsDuplicateTable, false : OrderedBy:= Size );|
  [ "M11", "M12", "J1", "M22", "J2" ]
  !gapprompt@gap>| !gapinput@AllCharacterTableNames( IsSporadicSimple, true,|
  !gapprompt@>| !gapinput@       Size, [ 1 .. 10^6 ],|
  !gapprompt@>| !gapinput@       IsDuplicateTable, false : OrderedBy:= NrConjugacyClasses );|
  [ "M11", "M22", "J1", "M12", "J2" ]
\end{Verbatim}
 

 (Note that the alphabtical ordering could also be achieved by entering \texttt{OrderedBy:= Identifier}.) 

 If the dummy function \texttt{OfThose} is an argument at an odd position then the following argument \mbox{\texttt{\mdseries\slshape func}} must be a function that takes a character table and returns a name of a
character table or a list of names; this is interpreted as replacement of the
names computed up to this position by the union of names returned by \mbox{\texttt{\mdseries\slshape func}}. For example, \mbox{\texttt{\mdseries\slshape func}} may be \texttt{Maxes} (\ref{Maxes}) or \texttt{NamesOfFusionSources} (\textbf{Reference: NamesOfFusionSources})). 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@maxesnames:= AllCharacterTableNames( IsSporadicSimple, true,|
  !gapprompt@>| !gapinput@                                        HasMaxes, true,|
  !gapprompt@>| !gapinput@                                        OfThose, Maxes );;|
\end{Verbatim}
 

 returns the union of names of ordinary tables of those maximal subgroups of
sporadic simple groups that are contained in the table library in the sense
that the attribute \texttt{Maxes} (\ref{Maxes}) is set. 

 For the sake of efficiency, \texttt{OfThose} followed by one of the arguments \texttt{AutomorphismGroup} (\textbf{Reference: AutomorphismGroup}), \texttt{SchurCover} (\textbf{Reference: SchurCover}), \texttt{CompleteGroup} is handled in a special way. }

 

\subsection{\textcolor{Chapter }{OneCharacterTableName}}
\logpage{[ 3, 1, 5 ]}\nobreak
\hyperdef{L}{X7EC4A57E8393D75C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{OneCharacterTableName({\mdseries\slshape [func, val, ...[, OfThose, func]]: OrderedBy := func})\index{OneCharacterTableName@\texttt{OneCharacterTableName}}
\label{OneCharacterTableName}
}\hfill{\scriptsize (function)}}\\


 The example function for character tables from the \textsf{GAP} Character Table Library that have certain abstract properties is \texttt{OneCharacterTableName}. It is analogous to the selection function \texttt{AllCharacterTableNames} (\ref{AllCharacterTableNames}), the difference is that it returns one \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of a character table with the properties in question instead of the list
of all such values. If no table with the required properties is contained in
the \textsf{GAP} Character Table Library then \texttt{fail} is returned. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@OneCharacterTableName( IsSimple, true, Size, 60 );|
  "A5"
  !gapprompt@gap>| !gapinput@OneCharacterTableName( IsSimple, true, Size, 20 );|
  fail
\end{Verbatim}
 

 The global option \texttt{OrderedBy} can be used to search for a ``smallest'' example, according to the value of the option. If this function is one of the
attributes whose names are listed in \texttt{CTblLib.SupportedAttributes} then the tables are processed according to increasing values of the option,
which may speed up the search. }

 

\subsection{\textcolor{Chapter }{NameOfEquivalentLibraryCharacterTable}}
\logpage{[ 3, 1, 6 ]}\nobreak
\hyperdef{L}{X845DEEE282D4F1EB}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{NameOfEquivalentLibraryCharacterTable({\mdseries\slshape ordtbl})\index{NameOfEquivalentLibraryCharacterTable@\texttt{Name}\-\texttt{Of}\-\texttt{Equivalent}\-\texttt{Library}\-\texttt{Character}\-\texttt{Table}}
\label{NameOfEquivalentLibraryCharacterTable}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{NamesOfEquivalentLibraryCharacterTables({\mdseries\slshape ordtbl})\index{NamesOfEquivalentLibraryCharacterTables@\texttt{Names}\-\texttt{Of}\-\texttt{Equivalent}\-\texttt{Library}\-\texttt{Character}\-\texttt{Tables}}
\label{NamesOfEquivalentLibraryCharacterTables}
}\hfill{\scriptsize (function)}}\\


 Let \mbox{\texttt{\mdseries\slshape ordtbl}} be an ordinary character table. \texttt{NameOfEquivalentLibraryCharacterTable} returns the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of a character table in the \textsf{GAP} Character Table Library that is permutation equivalent to \mbox{\texttt{\mdseries\slshape ordtbl}} (see \texttt{TransformingPermutationsCharacterTables} (\textbf{Reference: TransformingPermutationsCharacterTables})) if such a character table exists, and \texttt{fail} otherwise. \texttt{NamesOfEquivalentLibraryCharacterTables} returns the list of all \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) values of character tables in the \textsf{GAP} Character Table Library that are permutation equivalent to \mbox{\texttt{\mdseries\slshape ordtbl}}; thus an empty list is returned in this case if no equivalent library table
exists. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@tbl:= CharacterTable( "Alternating", 5 );;|
  !gapprompt@gap>| !gapinput@NameOfEquivalentLibraryCharacterTable( tbl );|
  "A5"
  !gapprompt@gap>| !gapinput@NamesOfEquivalentLibraryCharacterTables( tbl );|
  [ "A5", "A6M2", "Alt(5)" ]
  !gapprompt@gap>| !gapinput@tbl:= CharacterTable( "Cyclic", 17 );;|
  !gapprompt@gap>| !gapinput@NameOfEquivalentLibraryCharacterTable( tbl );|
  fail
  !gapprompt@gap>| !gapinput@NamesOfEquivalentLibraryCharacterTables( tbl );|
  [  ]
\end{Verbatim}
 }

 }

  
\section{\textcolor{Chapter }{The Interface to the \textsf{TomLib} Package}}\label{sect:tbltom}
\logpage{[ 3, 2, 0 ]}
\hyperdef{L}{X7EED71B4827BEBFA}{}
{
  The \textsf{GAP} Character Table Library contains ordinary character tables of all groups for
which the \textsf{TomLib} package \cite{TomLib} contains the table of marks. This section describes the mapping between these
character tables and their tables of marks. 

 If the \textsf{TomLib} package is not loaded then \texttt{FusionToTom} (\ref{FusionToTom}) is the only available function from this section, but of course it is of
little interest in this situation. 

\subsection{\textcolor{Chapter }{TableOfMarks (for a character table from the library)}}
\logpage{[ 3, 2, 1 ]}\nobreak
\hyperdef{L}{X8400C0397CA2FA3C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{TableOfMarks({\mdseries\slshape tbl})\index{TableOfMarks@\texttt{TableOfMarks}!for a character table from the library}
\label{TableOfMarks:for a character table from the library}
}\hfill{\scriptsize (method)}}\\


 Let \mbox{\texttt{\mdseries\slshape tbl}} be an ordinary character table from the \textsf{GAP} Character Table Library, for the group $G$, say. If the \textsf{TomLib} package is loaded and contains the table of marks of $G$ then there is a method based on \texttt{TableOfMarks} (\textbf{Reference: TableOfMarks for a string}) that returns this table of marks. If there is no such table of marks but \mbox{\texttt{\mdseries\slshape tbl}} knows its underlying group then this method delegates to the group. Otherwise \texttt{fail} is returned. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@TableOfMarks( CharacterTable( "A5" ) );|
  TableOfMarks( "A5" )
  !gapprompt@gap>| !gapinput@TableOfMarks( CharacterTable( "M" ) );|
  fail
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{CharacterTable (for a table of marks)}}
\logpage{[ 3, 2, 2 ]}\nobreak
\hyperdef{L}{X87110C1584D09BE4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{CharacterTable({\mdseries\slshape tom})\index{CharacterTable@\texttt{CharacterTable}!for a table of marks}
\label{CharacterTable:for a table of marks}
}\hfill{\scriptsize (method)}}\\


 For a table of marks \mbox{\texttt{\mdseries\slshape tom}}, this method for \texttt{CharacterTable} (\textbf{Reference: CharacterTable for a group}) returns the character table corresponding to \mbox{\texttt{\mdseries\slshape tom}}. 

 If \mbox{\texttt{\mdseries\slshape tom}} comes from the \textsf{TomLib} package, the character table comes from the \textsf{GAP} Character Table Library. Otherwise, if \mbox{\texttt{\mdseries\slshape tom}} stores an \texttt{UnderlyingGroup} (\textbf{Reference: UnderlyingGroup for tables of marks}) value then the task is delegated to a \texttt{CharacterTable} (\textbf{Reference: CharacterTable for a group}) method for this group, and if no underlying group is available then \texttt{fail} is returned. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@CharacterTable( TableOfMarks( "A5" ) );|
  CharacterTable( "A5" )
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{FusionCharTableTom}}
\logpage{[ 3, 2, 3 ]}\nobreak
\hyperdef{L}{X7A82CB487DBDDC53}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{FusionCharTableTom({\mdseries\slshape tbl, tom})\index{FusionCharTableTom@\texttt{FusionCharTableTom}}
\label{FusionCharTableTom}
}\hfill{\scriptsize (method)}}\\


 Let \mbox{\texttt{\mdseries\slshape tbl}} be an ordinary character table from the \textsf{GAP} Character Table Library with the attribute \texttt{FusionToTom} (\ref{FusionToTom}), and let \mbox{\texttt{\mdseries\slshape tom}} be the table of marks from the \textsf{GAP} package \textsf{TomLib} that corresponds to \mbox{\texttt{\mdseries\slshape tbl}}. In this case, a method for \texttt{FusionCharTableTom} (\textbf{Reference: FusionCharTableTom}) is available that returns the fusion from \mbox{\texttt{\mdseries\slshape tbl}} to \mbox{\texttt{\mdseries\slshape tom}} that is given by the \texttt{FusionToTom} (\ref{FusionToTom}) value of \mbox{\texttt{\mdseries\slshape tbl}}. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@tbl:= CharacterTable( "A5" );|
  CharacterTable( "A5" )
  !gapprompt@gap>| !gapinput@tom:= TableOfMarks( "A5" );|
  TableOfMarks( "A5" )
  !gapprompt@gap>| !gapinput@FusionCharTableTom( tbl, tom );|
  [ 1, 2, 3, 5, 5 ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{FusionToTom}}
\logpage{[ 3, 2, 4 ]}\nobreak
\hyperdef{L}{X7B1AAED68753B1BE}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{FusionToTom({\mdseries\slshape tbl})\index{FusionToTom@\texttt{FusionToTom}}
\label{FusionToTom}
}\hfill{\scriptsize (attribute)}}\\


 If this attribute is set for an ordinary character table \mbox{\texttt{\mdseries\slshape tbl}} then the \textsf{GAP} Library of Tables of Marks contains the table of marks of the group of \mbox{\texttt{\mdseries\slshape tbl}}, and the attribute value is a record with the following components. 
\begin{description}
\item[{\texttt{name}}]  the \texttt{Identifier} (\textbf{Reference: Identifier for tables of marks}) component of the table of marks of \mbox{\texttt{\mdseries\slshape tbl}}, 
\item[{\texttt{map}}]  the fusion map, 
\item[{\texttt{text} (optional)}]  a string describing the status of the fusion, and 
\item[{\texttt{perm} (optional)}]  a permutation that establishes the bijection between the classes of maximal
subgroups in the table of marks (see \texttt{MaximalSubgroupsTom} (\textbf{Reference: MaximalSubgroupsTom})) and the \texttt{Maxes} (\ref{Maxes}) list of \mbox{\texttt{\mdseries\slshape tbl}}. Applying the permutation to the sublist of permutation characters (see \texttt{PermCharsTom} (\textbf{Reference: PermCharsTom via fusion map})) at the positions of the maximal subgroups of the table of marks yields the
list of primitive permutation characters computed from the character tables
described by the \texttt{Maxes} (\ref{Maxes}) list. Usually, there is no \texttt{perm} component, which means that the two lists of primitive permutation characters
are equal. See Section \ref{subsect:primpermchars2A6} for an example. 
\end{description}
 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@FusionToTom( CharacterTable( "2.A6" ) );|
  rec( map := [ 1, 2, 5, 4, 8, 3, 7, 11, 11, 6, 13, 6, 13 ], 
    name := "2.A6", perm := (4,5), 
    text := "fusion map is unique up to table autom." )
\end{Verbatim}
 }

 

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


 This function returns the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of the character table corresponding to the table of marks with \texttt{Identifier} (\textbf{Reference: Identifier for tables of marks}) value \mbox{\texttt{\mdseries\slshape tomname}}. If no such character table exists in the \textsf{GAP} Character Table Library or if the \textsf{TomLib} package is not loaded then \texttt{fail} is returned. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@NameOfLibraryCharacterTable( "A5" );|
  "A5"
  !gapprompt@gap>| !gapinput@NameOfLibraryCharacterTable( "S5" );|
  "A5.2"
\end{Verbatim}
 }

 }

  
\section{\textcolor{Chapter }{The Interface to \textsf{GAP}'s Group Libraries}}\label{sect:tblgrp}
\logpage{[ 3, 3, 0 ]}
\hyperdef{L}{X83D85EB2792D9D22}{}
{
  Sometimes it is useful to extend a character-theoretic computation with
computations involving a group that has the character table in question. For
many character tables in the \textsf{GAP} Character Table Library, corresponding groups can be found in the various
group libraries that are distributed with \textsf{GAP}. This section describes how one can access the library groups that belong to
a given character table. 

\subsection{\textcolor{Chapter }{GroupInfoForCharacterTable}}
\logpage{[ 3, 3, 1 ]}\nobreak
\hyperdef{L}{X78DCD38B7D96D8A4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{GroupInfoForCharacterTable({\mdseries\slshape tbl})\index{GroupInfoForCharacterTable@\texttt{GroupInfoForCharacterTable}}
\label{GroupInfoForCharacterTable}
}\hfill{\scriptsize (attribute)}}\\


 Let \mbox{\texttt{\mdseries\slshape tbl}} be an ordinary character table from the \textsf{GAP} Character Table Library. \texttt{GroupInfoForCharacterTable} returns a sorted list of pairs such that calling \texttt{GroupForGroupInfo} (\ref{GroupForGroupInfo}) with any of these pairs yields a group whose ordinary character table is \mbox{\texttt{\mdseries\slshape tbl}}, up to permutations of rows and columns. 

 Note that this group is in general \emph{not} determined up to isomorphism, since nonisomorphic groups may have the same
character table (including power maps). 

 Contrary to the attribute \texttt{UnderlyingGroup} (\textbf{Reference: UnderlyingGroup for tables of marks}), the entries of the \texttt{GroupInfoForCharacterTable} list for \mbox{\texttt{\mdseries\slshape tbl}} are not related to the ordering of the conjugacy classes in \mbox{\texttt{\mdseries\slshape tbl}}. 

 Sources for this attribute are the \textsf{GAP} databases of groups described in Chapter  (\textbf{Reference: Group Libraries}), and the packages \textsf{AtlasRep} and \textsf{TomLib}, see also \texttt{GroupForTom} (\ref{GroupForTom}) and \texttt{AtlasStabilizer} (\ref{AtlasStabilizer}). If these packages are not loaded then part of the information may be
missing. If the \textsf{Browse} package (see{\nobreakspace}\cite{Browse}) is not loaded then \texttt{GroupInfoForCharacterTable} returns always an empty list. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@GroupInfoForCharacterTable( CharacterTable( "A5" ) );|
  [ [ "AlternatingGroup", [ 5 ] ], [ "AtlasGroup", [ "A5" ] ], 
    [ "AtlasStabilizer", [ "A6", "A6G1-p6aB0" ] ], 
    [ "AtlasStabilizer", [ "A6", "A6G1-p6bB0" ] ], 
    [ "AtlasStabilizer", [ "L2(11)", "L211G1-p11aB0" ] ], 
    [ "AtlasStabilizer", [ "L2(11)", "L211G1-p11bB0" ] ], 
    [ "AtlasStabilizer", [ "L2(19)", "L219G1-p57aB0" ] ], 
    [ "AtlasStabilizer", [ "L2(19)", "L219G1-p57bB0" ] ], 
    [ "AtlasSubgroup", [ "A5.2", 1 ] ], [ "AtlasSubgroup", [ "A6", 1 ] ]
      , [ "AtlasSubgroup", [ "A6", 2 ] ], 
    [ "AtlasSubgroup", [ "J2", 9 ] ], 
    [ "AtlasSubgroup", [ "L2(109)", 4 ] ], 
    [ "AtlasSubgroup", [ "L2(109)", 5 ] ], 
    [ "AtlasSubgroup", [ "L2(11)", 1 ] ], 
    [ "AtlasSubgroup", [ "L2(11)", 2 ] ], 
    [ "AtlasSubgroup", [ "S6(3)", 11 ] ], 
    [ "GroupForTom", [ "2^4:A5", 68 ] ], 
    [ "GroupForTom", [ "2^4:A5`", 56 ] ], [ "GroupForTom", [ "A5" ] ], 
    [ "GroupForTom", [ "A5xA5", 85 ] ], [ "GroupForTom", [ "A6", 21 ] ],
    [ "GroupForTom", [ "J2", 99 ] ], 
    [ "GroupForTom", [ "L2(109)", 25 ] ], 
    [ "GroupForTom", [ "L2(11)", 15 ] ], 
    [ "GroupForTom", [ "L2(125)", 18 ] ], 
    [ "GroupForTom", [ "L2(16)", 18 ] ], 
    [ "GroupForTom", [ "L2(19)", 17 ] ], 
    [ "GroupForTom", [ "L2(29)", 19 ] ], 
    [ "GroupForTom", [ "L2(31)", 25 ] ], 
    [ "GroupForTom", [ "S5", 18 ] ], [ "PSL", [ 2, 4 ] ], 
    [ "PSL", [ 2, 5 ] ], [ "PerfectGroup", [ 60, 1 ] ], 
    [ "PrimitiveGroup", [ 5, 4 ] ], [ "PrimitiveGroup", [ 6, 1 ] ], 
    [ "PrimitiveGroup", [ 10, 1 ] ], [ "SmallGroup", [ 60, 5 ] ], 
    [ "TransitiveGroup", [ 5, 4 ] ], [ "TransitiveGroup", [ 6, 12 ] ], 
    [ "TransitiveGroup", [ 10, 7 ] ], [ "TransitiveGroup", [ 12, 33 ] ],
    [ "TransitiveGroup", [ 15, 5 ] ], [ "TransitiveGroup", [ 20, 15 ] ],
    [ "TransitiveGroup", [ 30, 9 ] ] ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{KnowsSomeGroupInfo}}
\logpage{[ 3, 3, 2 ]}\nobreak
\hyperdef{L}{X87CFDC8081767CA4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{KnowsSomeGroupInfo({\mdseries\slshape tbl})\index{KnowsSomeGroupInfo@\texttt{KnowsSomeGroupInfo}}
\label{KnowsSomeGroupInfo}
}\hfill{\scriptsize (property)}}\\


 For an ordinary character table \mbox{\texttt{\mdseries\slshape tbl}}, this function returns \texttt{true} if the list returned by \texttt{GroupInfoForCharacterTable} (\ref{GroupInfoForCharacterTable}) is nonempty, and \texttt{false} otherwise. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@KnowsSomeGroupInfo( CharacterTable( "A5" ) );|
  true
  !gapprompt@gap>| !gapinput@KnowsSomeGroupInfo( CharacterTable( "M" ) );|
  false
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{CharacterTableForGroupInfo}}
\logpage{[ 3, 3, 3 ]}\nobreak
\hyperdef{L}{X78B7A5DB87B5285C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{CharacterTableForGroupInfo({\mdseries\slshape info})\index{CharacterTableForGroupInfo@\texttt{CharacterTableForGroupInfo}}
\label{CharacterTableForGroupInfo}
}\hfill{\scriptsize (attribute)}}\\


 This function is a partial inverse of \texttt{GroupInfoForCharacterTable} (\ref{GroupInfoForCharacterTable}). If \mbox{\texttt{\mdseries\slshape info}} has the form \texttt{[ }$funcname$\texttt{, }$args$\texttt{ ]} and occurs in the list returned by \texttt{GroupInfoForCharacterTable} (\ref{GroupInfoForCharacterTable}) when called with a character table $t$, say, then \texttt{CharacterTableForGroupInfo} returns a character table from the \textsf{GAP} Character Table that is equivalent to $t$. Otherwise \texttt{fail} is returned. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@CharacterTableForGroupInfo( [ "AlternatingGroup", [ 5 ] ] );|
  CharacterTable( "A5" )
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{GroupForGroupInfo}}
\logpage{[ 3, 3, 4 ]}\nobreak
\hyperdef{L}{X804D2AC37E0D4755}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{GroupForGroupInfo({\mdseries\slshape info})\index{GroupForGroupInfo@\texttt{GroupForGroupInfo}}
\label{GroupForGroupInfo}
}\hfill{\scriptsize (attribute)}}\\


 If \mbox{\texttt{\mdseries\slshape info}} has the form \texttt{[ }$funcname$\texttt{, }$args$\texttt{ ]} and occurs in the list returned by \texttt{GroupInfoForCharacterTable} (\ref{GroupInfoForCharacterTable}) when called with a character table $tbl$, say, then \texttt{GroupForGroupInfo} returns a group that is described by \mbox{\texttt{\mdseries\slshape info}} and whose character table is equal to $tbl$, up to permutations of rows and columns. Otherwise \texttt{fail} is returned. 

 Typically, $funcname$ is a string that is the name of a global \textsf{GAP} function $fun$, say, and $args$ is a list of arguments for this function such that \texttt{CallFuncList( }$fun$\texttt{, }$args$\texttt{ )} yields the desired group. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@GroupForGroupInfo( [ "AlternatingGroup", [ 5 ] ] );|
  Alt( [ 1 .. 5 ] )
  !gapprompt@gap>| !gapinput@GroupForGroupInfo( [ "PrimitiveGroup", [ 5, 4 ] ] );|
  A(5)
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{GroupForTom}}
\logpage{[ 3, 3, 5 ]}\nobreak
\hyperdef{L}{X83B9EFB47CE0A617}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{GroupForTom({\mdseries\slshape tomidentifier[, repnr]})\index{GroupForTom@\texttt{GroupForTom}}
\label{GroupForTom}
}\hfill{\scriptsize (attribute)}}\\


 Let \mbox{\texttt{\mdseries\slshape tomidentifier}} be a string that is an admissible name for a table of marks from the \textsf{GAP} Library of Tables of Marks (the \textsf{TomLib} package \cite{TomLib}). Called with one argument, \texttt{GroupForTom} returns the \texttt{UnderlyingGroup} (\textbf{Reference: UnderlyingGroup for tables of marks}) value of this table of marks. If a positive integer \mbox{\texttt{\mdseries\slshape repnr}} is given as the second argument then a representative of the \mbox{\texttt{\mdseries\slshape repnr}}-th class of subgroups of this group is returned, see \texttt{RepresentativeTom} (\textbf{Reference: RepresentativeTom}). 

 The string\texttt{"GroupForTom"} may occur in the entries of the list returned by \texttt{GroupInfoForCharacterTable} (\ref{GroupInfoForCharacterTable}), and therefore may be called by \texttt{GroupForGroupInfo} (\ref{GroupForGroupInfo}). 

 If the \textsf{TomLib} package is not loaded or if it does not contain a table of marks with
identifier \mbox{\texttt{\mdseries\slshape tomidentifier}} then \texttt{fail} is returned. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@g:= GroupForTom( "A5" );  u:= GroupForTom( "A5", 2 );|
  Group([ (2,4)(3,5), (1,2,5) ])
  Group([ (2,3)(4,5) ])
  !gapprompt@gap>| !gapinput@IsSubset( g, u );|
  true
  !gapprompt@gap>| !gapinput@GroupForTom( "J4" );|
  fail
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{AtlasStabilizer}}
\logpage{[ 3, 3, 6 ]}\nobreak
\hyperdef{L}{X8032EF83823B1D88}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{AtlasStabilizer({\mdseries\slshape gapname, repname})\index{AtlasStabilizer@\texttt{AtlasStabilizer}}
\label{AtlasStabilizer}
}\hfill{\scriptsize (function)}}\\


 Let \mbox{\texttt{\mdseries\slshape gapname}} be an admissible name of a group $G$, say, in the sense of the \textsf{AtlasRep} package (see Section{\nobreakspace} (\textbf{AtlasRep: Group Names Used in the AtlasRep Package})), and \mbox{\texttt{\mdseries\slshape repname}} be a string that occurs as the \texttt{repname} component of a record returned by \texttt{AllAtlasGeneratingSetInfos} (\textbf{AtlasRep: AllAtlasGeneratingSetInfos}) when this function is called with first argument \mbox{\texttt{\mdseries\slshape gapname}} and further arguments \texttt{IsTransitive} (\textbf{Reference: IsTransitive}) and \texttt{true}. In this case, \mbox{\texttt{\mdseries\slshape repname}} describes a transitive permutation representation of $G$. 

 If the \textsf{AtlasRep} package is available and if the permutation group in question can be fetched
then \texttt{AtlasStabilizer} returns a point stabilizer. Otherwise \texttt{fail} is returned. 

 The string\texttt{"AtlasStabilizer"} may occur in the entries of the list returned by \texttt{GroupInfoForCharacterTable} (\ref{GroupInfoForCharacterTable}), and therefore may be called by \texttt{GroupForGroupInfo} (\ref{GroupForGroupInfo}). 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@AtlasStabilizer( "A5","A5G1-p5B0");|
  Group([ (1,2)(3,4), (2,3,4) ])
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IsNontrivialDirectProduct}}
\logpage{[ 3, 3, 7 ]}\nobreak
\hyperdef{L}{X7AADD757809DFDD5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsNontrivialDirectProduct({\mdseries\slshape tbl})\index{IsNontrivialDirectProduct@\texttt{IsNontrivialDirectProduct}}
\label{IsNontrivialDirectProduct}
}\hfill{\scriptsize (property)}}\\


 For an ordinary character table \mbox{\texttt{\mdseries\slshape tbl}} of the group $G$, say, this function returns \texttt{true} if $G$ is the direct product of smaller groups, and \texttt{false} otherwise. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@mx:= Maxes( CharacterTable( "J1" ) );|
  [ "L2(11)", "2^3.7.3", "2xA5", "19:6", "11:10", "D6xD10", "7:6" ]
  !gapprompt@gap>| !gapinput@List( mx, name -> IsNontrivialDirectProduct(|
  !gapprompt@>| !gapinput@                         CharacterTable( name ) ) );|
  [ false, false, true, false, false, true, false ]
\end{Verbatim}
 }

 }

  
\section{\textcolor{Chapter }{Unipotent Characters of Finite Groups of Lie Type}}\label{sec:unipotsec}
\logpage{[ 3, 4, 0 ]}
\hyperdef{L}{X7C1F6C01852D7933}{}
{
  \index{character!unipotent} Unipotent characters are defined for finite groups of Lie type. For most of
these groups whose character table is in the \textsf{GAP} Character Table Library, the unipotent characters are known and parametrised
by labels. This labeling is due to the work of P. Deligne and G. Lusztig, thus
the label of a unipotent character is called its Deligne-Lusztig name
(see{\nobreakspace}\cite{Cla05}). 

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


 Let \mbox{\texttt{\mdseries\slshape tbl}} be the ordinary character table of a finite group of Lie type in the \textsf{GAP} Character Table Library. \texttt{UnipotentCharacter} returns the unipotent character with Deligne-Lusztig name \mbox{\texttt{\mdseries\slshape label}}. 

 The object \mbox{\texttt{\mdseries\slshape label}} must be either a list of integers which describes a partition (if the finite
group of Lie type is of the type $A_l$ or ${}^2\!A_l$), a list of two lists of integers which describes a symbol (if the group is
of classical type other than $A_l$ and ${}^2\!A_l$) or a string (if the group is of exceptional type). 

 A call of \texttt{UnipotentCharacter} sets the attribute \texttt{DeligneLusztigNames} (\ref{DeligneLusztigNames}) for \mbox{\texttt{\mdseries\slshape tbl}}. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@tbl:= CharacterTable( "U4(2).2" );;|
  !gapprompt@gap>| !gapinput@UnipotentCharacter( tbl, [ [ 0, 1 ], [ 2 ] ] );|
  Character( CharacterTable( "U4(2).2" ),
   [ 15, 7, 3, -3, 0, 3, -1, 1, 0, 1, -2, 1, 0, 0, -1, 5, 1, 3, -1, 2, 
    -1, 1, -1, 0, 0 ] )
\end{Verbatim}
 }

  

\subsection{\textcolor{Chapter }{DeligneLusztigNames}}
\logpage{[ 3, 4, 2 ]}\nobreak
\hyperdef{L}{X803FD7F87AFBBDE4}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{DeligneLusztigNames({\mdseries\slshape obj})\index{DeligneLusztigNames@\texttt{DeligneLusztigNames}}
\label{DeligneLusztigNames}
}\hfill{\scriptsize (attribute)}}\\


 For a character table \mbox{\texttt{\mdseries\slshape obj}}, \texttt{DeligneLusztigNames} returns a list of Deligne-Lusztig names of the the unipotent characters of \mbox{\texttt{\mdseries\slshape obj}}. If the $i$-th entry is bound then it is the name of the $i$-th irreducible character of \mbox{\texttt{\mdseries\slshape obj}}, and this character is irreducible. If an irreducible character is not
unipotent the accordant position is unbound. 

 \texttt{DeligneLusztigNames} called with a string \mbox{\texttt{\mdseries\slshape obj}}, calls itself with the argument \texttt{CharacterTable( \mbox{\texttt{\mdseries\slshape obj}} )}. 

 When \texttt{DeligneLusztigNames} is called with a record \mbox{\texttt{\mdseries\slshape obj}} then this should have the components \texttt{isoc}, \texttt{isot}, \texttt{l}, and \texttt{q}, where \texttt{isoc} and \texttt{isot} are strings defining the isogeny class and isogeny type, and \texttt{l} and \texttt{q} are integers.  These components define a finite group of Lie type uniquely. Moreover this way
one can choose Deligne-Lusztig names for a prescribed type in those cases
where a group has more than one interpretation as a finite group of Lie type,
see the example below. (The first call of \texttt{DeligneLusztigNames} sets the attribute value in the character table.)  

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@DeligneLusztigNames( "L2(7)" );|
  [ [ 2 ],,,, [ 1, 1 ] ]
  !gapprompt@gap>| !gapinput@tbl:= CharacterTable( "L2(7)" );|
  CharacterTable( "L3(2)" )
  !gapprompt@gap>| !gapinput@HasDeligneLusztigNames( tbl );|
  true
  !gapprompt@gap>| !gapinput@DeligneLusztigNames( rec( isoc:= "A", isot:= "simple",|
  !gapprompt@>| !gapinput@                             l:= 2, q:= 2 ) );|
  [ [ 3 ],,, [ 2, 1 ],, [ 1, 1, 1 ] ]
\end{Verbatim}
 }

 

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


 For a unipotent character \mbox{\texttt{\mdseries\slshape chi}}, \texttt{DeligneLusztigName} returns the Deligne-Lusztig name of \mbox{\texttt{\mdseries\slshape chi}}. For that, \texttt{DeligneLusztigNames} (\ref{DeligneLusztigNames}) is called with the argument \texttt{UnderlyingCharacterTable( \mbox{\texttt{\mdseries\slshape chi}} )}. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@tbl:= CharacterTable( "F4(2)" );;|
  !gapprompt@gap>| !gapinput@DeligneLusztigName( Irr( tbl )[9] );|
  fail
  !gapprompt@gap>| !gapinput@HasDeligneLusztigNames( tbl );|
  true
  !gapprompt@gap>| !gapinput@List( [ 1 .. 8 ], i -> DeligneLusztigName( Irr( tbl )[i] ) );|
  [ "phi{1,0}", "[ [ 2 ], [  ] ]", "phi{2,4}''", "phi{2,4}'", 
    "F4^II[1]", "phi{4,1}", "F4^I[1]", "phi{9,2}" ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{KnowsDeligneLusztigNames}}
\logpage{[ 3, 4, 4 ]}\nobreak
\hyperdef{L}{X78A05C0A82E23048}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{KnowsDeligneLusztigNames({\mdseries\slshape tbl})\index{KnowsDeligneLusztigNames@\texttt{KnowsDeligneLusztigNames}}
\label{KnowsDeligneLusztigNames}
}\hfill{\scriptsize (property)}}\\


 For an ordinary character table \mbox{\texttt{\mdseries\slshape tbl}}, this function returns \texttt{true} if \texttt{DeligneLusztigNames} (\ref{DeligneLusztigNames}) returns the list of Deligne-Lusztig names of the unipotent characters of \mbox{\texttt{\mdseries\slshape tbl}}, and \texttt{false} otherwise. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@KnowsDeligneLusztigNames( CharacterTable( "A5" ) );|
  true
  !gapprompt@gap>| !gapinput@KnowsDeligneLusztigNames( CharacterTable( "M" ) );|
  false
\end{Verbatim}
 }

 }

  
\section{\textcolor{Chapter }{\textsf{Browse} Applications Provided by \textsf{CTblLib}}}\label{sect:ctbllib-browse}
\logpage{[ 3, 5, 0 ]}
\hyperdef{L}{X7900893987A89915}{}
{
  The following functions are available only if the \textsf{GAP} package \textsf{Browse} (see{\nobreakspace}\cite{Browse}) is loaded. The function \texttt{DisplayCTblLibInfo} (\ref{DisplayCTblLibInfo:for a character table}) shows details about an ordinary or modular character table in a pager, the
other functions can be used to show the following information via browse
tables. 
\begin{itemize}
\item  An overview of the \textsf{GAP} Character Table Library, and details pages about ordinary and modular
character tables (see \texttt{BrowseCTblLibInfo} (\ref{BrowseCTblLibInfo})), which allow one to navigate to related pages and to pages showing for
example decomposition matrices (cf. \texttt{BrowseDecompositionMatrix} (\textbf{Browse: BrowseDecompositionMatrix})), 
\item  an alternative display function that shows character tables from the \textsf{Atlas} of Finite Groups \cite{CCN85} and the \textsf{Atlas} of Brauer Characters \cite{JLPW95} in a format similar to the one used in these books (see \texttt{BrowseAtlasTable} (\ref{BrowseAtlasTable}), cf. \texttt{Browse (for character tables)} (\textbf{Browse: Browse for character tables}) for the default display format for character tables), 
\item  an overview of the names of simple groups for which the \textsf{Atlas} of Finite Groups \cite{CCN85} and the \textsf{Atlas} of Brauer Characters \cite{JLPW95} show the character tables and other information (see \texttt{BrowseAtlasContents} (\ref{BrowseAtlasContents}), a variant that doe not rely on \textsf{Browse} is \texttt{DisplayAtlasContents} (\ref{DisplayAtlasContents})), 
\item  a function that shows the \textsf{Atlas} map of the bicyclic extensions of a simple \textsf{Atlas} group (see \texttt{BrowseAtlasMap} (\ref{BrowseAtlasMap}), a variant that does not rely on \textsf{Browse} is \texttt{DisplayAtlasMap} (\ref{DisplayAtlasMap:for the name of a simple group})), 
\item  an overview of the ``atomic irrationalities'' that occur in \textsf{Atlas} character tables (see \texttt{BrowseCommonIrrationalities} (\ref{BrowseCommonIrrationalities})), 
\item  an overview of the lists of improvements to the \textsf{Atlas} of Finite Groups (see \texttt{BrowseAtlasImprovements} (\ref{BrowseAtlasImprovements})). 
\item  an overview of the differences between the character table data since version
1.1.3 of the \textsf{CTblLib} package (see \texttt{BrowseCTblLibDifferences} (\ref{BrowseCTblLibDifferences})), 
\end{itemize}
 The functions \texttt{BrowseCTblLibInfo} (\ref{BrowseCTblLibInfo}), \texttt{BrowseCommonIrrationalities} (\ref{BrowseCommonIrrationalities}), \texttt{BrowseCTblLibDifferences} (\ref{BrowseCTblLibDifferences}), \texttt{BrowseAtlasContents} (\ref{BrowseAtlasContents}), and \texttt{BrowseAtlasImprovements} (\ref{BrowseAtlasImprovements}) occur also in the list of choices shown by \texttt{BrowseGapData} (\textbf{Browse: BrowseGapData}). 

\subsection{\textcolor{Chapter }{DisplayCTblLibInfo (for a character table)}}
\logpage{[ 3, 5, 1 ]}\nobreak
\hyperdef{L}{X8684C73E844E7033}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{DisplayCTblLibInfo({\mdseries\slshape tbl})\index{DisplayCTblLibInfo@\texttt{DisplayCTblLibInfo}!for a character table}
\label{DisplayCTblLibInfo:for a character table}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{DisplayCTblLibInfo({\mdseries\slshape name[, p]})\index{DisplayCTblLibInfo@\texttt{DisplayCTblLibInfo}!for a name}
\label{DisplayCTblLibInfo:for a name}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{StringCTblLibInfo({\mdseries\slshape tbl})\index{StringCTblLibInfo@\texttt{StringCTblLibInfo}!for a character table}
\label{StringCTblLibInfo:for a character table}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{StringCTblLibInfo({\mdseries\slshape name[, p]})\index{StringCTblLibInfo@\texttt{StringCTblLibInfo}!for a name}
\label{StringCTblLibInfo:for a name}
}\hfill{\scriptsize (function)}}\\


 When \texttt{DisplayCTblLibInfo} is called with an ordinary or modular character table \mbox{\texttt{\mdseries\slshape tbl}} then an overview of the information available for this character table is
shown via the function that is given by the user preference \ref{subsect:displayfunction}. When \texttt{DisplayCTblLibInfo} is called with a string \mbox{\texttt{\mdseries\slshape name}} that is an admissible name for an ordinary character table then the overview
for this character table is shown. If a prime integer \mbox{\texttt{\mdseries\slshape p}} is entered in addition to \mbox{\texttt{\mdseries\slshape name}} then information about the \mbox{\texttt{\mdseries\slshape p}}-modular character table is shown instead. 

 An interactive variant of \texttt{DisplayCTblLibInfo} is \texttt{BrowseCTblLibInfo} (\ref{BrowseCTblLibInfo}). 

 The string that is shown by \texttt{DisplayCTblLibInfo} can be computed using \texttt{StringCTblLibInfo}, with the same arguments. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@StringCTblLibInfo( CharacterTable( "A5" ) );;|
  !gapprompt@gap>| !gapinput@StringCTblLibInfo( CharacterTable( "A5" ) mod 2 );;|
  !gapprompt@gap>| !gapinput@StringCTblLibInfo( "A5" );;|
  !gapprompt@gap>| !gapinput@StringCTblLibInfo( "A5", 2 );;|
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{BrowseCTblLibInfo}}
\logpage{[ 3, 5, 2 ]}\nobreak
\hyperdef{L}{X7A038A267CD17032}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{BrowseCTblLibInfo({\mdseries\slshape [func, val, ...]})\index{BrowseCTblLibInfo@\texttt{BrowseCTblLibInfo}}
\label{BrowseCTblLibInfo}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{BrowseCTblLibInfo({\mdseries\slshape tbl})\index{BrowseCTblLibInfo@\texttt{BrowseCTblLibInfo}!for a character table}
\label{BrowseCTblLibInfo:for a character table}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{BrowseCTblLibInfo({\mdseries\slshape name[, p]})\index{BrowseCTblLibInfo@\texttt{BrowseCTblLibInfo}!for a name}
\label{BrowseCTblLibInfo:for a name}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
 nothing. 



 Called without arguments, \texttt{BrowseCTblLibInfo} shows the contents of the \textsf{GAP} Character Table Library in an \emph{overview table}, see below. 

 When arguments \mbox{\texttt{\mdseries\slshape func}}, \mbox{\texttt{\mdseries\slshape val}}, \mbox{\texttt{\mdseries\slshape ...}} are given that are admissible arguments for \texttt{AllCharacterTableNames} (\ref{AllCharacterTableNames}) {\textendash}in particular, the first argument must be a function{\textendash}
then the overview is restricted to those character tables that match the
conditions. The global option \texttt{"OrderedBy"} is supported as in \texttt{AllCharacterTableNames} (\ref{AllCharacterTableNames}). 

 When \texttt{BrowseCTblLibInfo} is called with a character table \mbox{\texttt{\mdseries\slshape tbl}} then a \emph{details table} is opened that gives an overview of the information available for this
character table. When \texttt{BrowseCTblLibInfo} is called with a string \mbox{\texttt{\mdseries\slshape name}} that is an admissible name for an ordinary character table then the details
table for this character table is opened. If a prime integer \mbox{\texttt{\mdseries\slshape p}} is entered in addition to \mbox{\texttt{\mdseries\slshape name}} then information about the \mbox{\texttt{\mdseries\slshape p}}-modular character table is shown instead. 

 The overview table has the following columns. 

 
\begin{description}
\item[{\texttt{name}}]  the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of the table, 
\item[{\texttt{size}}]  the group order, 
\item[{\texttt{nccl}}]  the number of conjugacy classes, 
\item[{\texttt{fusions -{\textgreater} G}}]  the list of identifiers of tables on which a fusion to the given table is
stored, and 
\item[{\texttt{fusions G -{\textgreater}}}]  the list of identifiers of tables to which a fusion is stored on the given
table. 
\end{description}
 

 The details table for a given character table has exactly one column. Only
part of the functionality of the function \texttt{NCurses.BrowseGeneric} (\textbf{Browse: NCurses.BrowseGeneric}) is available in such a table. On the other hand, the details tables contain ``links'' to other Browse applications, for example other details tables. 

 When one ``clicks'' on a row or an entry in the overview table then the details table for the
character table in question is opened. One can navigate from this details
table to a related one, by first \emph{activating} a link (via repeatedly hitting the \textsc{Tab} key) and then \emph{following} the active link (via hitting the \textsc{Return} key). If mouse actions are enabled (by hitting the \textsc{M} key, see \texttt{NCurses.UseMouse} (\textbf{Browse: NCurses.UseMouse})) then one can alternatively activate a link and click on it via mouse
actions. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@tab:= [ 9 ];;         # hit the TAB key|
  !gapprompt@gap>| !gapinput@n:= [ 14, 14, 14 ];;  # ``do nothing'' input (means timeout)|
  !gapprompt@gap>| !gapinput@BrowseData.SetReplay( Concatenation(|
  !gapprompt@>| !gapinput@        # select the first column, search for the name A5|
  !gapprompt@>| !gapinput@        "sc/A5", [ NCurses.keys.DOWN, NCurses.keys.DOWN,|
  !gapprompt@>| !gapinput@        NCurses.keys.RIGHT, NCurses.keys.ENTER ],|
  !gapprompt@>| !gapinput@        # open the details table for A5|
  !gapprompt@>| !gapinput@        [ NCurses.keys.ENTER ], n, n,|
  !gapprompt@>| !gapinput@        # activate the link to the character table of A5|
  !gapprompt@>| !gapinput@        tab, n, n,|
  !gapprompt@>| !gapinput@        # show the character table of A5|
  !gapprompt@>| !gapinput@        [ NCurses.keys.ENTER ], n, n, "seddrr", n, n,|
  !gapprompt@>| !gapinput@        # close this character table|
  !gapprompt@>| !gapinput@        "Q",|
  !gapprompt@>| !gapinput@        # activate the link to the maximal subgroup D10|
  !gapprompt@>| !gapinput@        tab, tab, n, n,|
  !gapprompt@>| !gapinput@        # jump to the details table for D10|
  !gapprompt@>| !gapinput@        [ NCurses.keys.ENTER ], n, n,|
  !gapprompt@>| !gapinput@        # close this details table|
  !gapprompt@>| !gapinput@        "Q",|
  !gapprompt@>| !gapinput@        # activate the link to a decomposition matrix|
  !gapprompt@>| !gapinput@        tab, tab, tab, tab, tab, n, n,|
  !gapprompt@>| !gapinput@        # show the decomposition matrix|
  !gapprompt@>| !gapinput@        [ NCurses.keys.ENTER ], n, n,|
  !gapprompt@>| !gapinput@        # close this table|
  !gapprompt@>| !gapinput@        "Q",|
  !gapprompt@>| !gapinput@        # activate the link to the AtlasRep overview|
  !gapprompt@>| !gapinput@        tab, tab, tab, tab, tab, tab, tab, n, n,|
  !gapprompt@>| !gapinput@        # show the overview|
  !gapprompt@>| !gapinput@        [ NCurses.keys.ENTER ], n, n,|
  !gapprompt@>| !gapinput@        # close this table|
  !gapprompt@>| !gapinput@        "Q",|
  !gapprompt@>| !gapinput@        # and quit the applications|
  !gapprompt@>| !gapinput@        "QQ" ) );|
  !gapprompt@gap>| !gapinput@BrowseCTblLibInfo();|
  !gapprompt@gap>| !gapinput@BrowseData.SetReplay( false );|
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{BrowseCommonIrrationalities}}
\logpage{[ 3, 5, 3 ]}\nobreak
\hyperdef{L}{X83FDD44E7E0AE885}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{BrowseCommonIrrationalities({\mdseries\slshape })\index{BrowseCommonIrrationalities@\texttt{BrowseCommonIrrationalities}}
\label{BrowseCommonIrrationalities}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
 a list of info records for the irrationalities that have been ``clicked'' in visual mode. 



 This function shows the atomic irrationalities that occur in character tables
in the \textsf{Atlas} of Finite Groups{\nobreakspace}\cite{CCN85} or the \textsf{Atlas} of Brauer Characters{\nobreakspace}\cite{JLPW95}, together with descriptions of their reductions to the relevant finite fields
in a browse table with the following columns. The format is the same as in \cite[Appendix 1]{JLPW95}. 

 
\begin{description}
\item[{\texttt{name}}]  the name of the irrationality, see \texttt{AtlasIrrationality} (\textbf{Reference: AtlasIrrationality}), 
\item[{\texttt{p}}]  the characteristic, 
\item[{\texttt{value mod C{\textunderscore}n}}]  the corresponding reduction to a finite field of characteristic \texttt{p}, given by the residue modulo the \texttt{n}-th Conway polynomial (see \texttt{ConwayPolynomial} (\textbf{Reference: ConwayPolynomial})), 
\item[{\texttt{n}}]  the degree of the smallest extension of the prime field of characteristic \texttt{p} that contains the reduction. 
\end{description}
 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@n:= [ 14, 14, 14 ];;  # ``do nothing'' input (means timeout)|
  !gapprompt@gap>| !gapinput@BrowseData.SetReplay( Concatenation(|
  !gapprompt@>| !gapinput@        # categorize the table by the characteristics|
  !gapprompt@>| !gapinput@        "scrsc", n, n,|
  !gapprompt@>| !gapinput@        # expand characteristic 2|
  !gapprompt@>| !gapinput@        "srxq", n, n,|
  !gapprompt@>| !gapinput@        # scroll down|
  !gapprompt@>| !gapinput@        "DDD", n, n,|
  !gapprompt@>| !gapinput@        # and quit the application|
  !gapprompt@>| !gapinput@        "Q" ) );|
  !gapprompt@gap>| !gapinput@BrowseCommonIrrationalities();;|
  !gapprompt@gap>| !gapinput@BrowseData.SetReplay( false );|
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{BrowseCTblLibDifferences}}
\logpage{[ 3, 5, 4 ]}\nobreak
\hyperdef{L}{X87CA74CF7B533CC6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{BrowseCTblLibDifferences({\mdseries\slshape })\index{BrowseCTblLibDifferences@\texttt{BrowseCTblLibDifferences}}
\label{BrowseCTblLibDifferences}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
 nothing. 



 \texttt{BrowseCTblLibDifferences} lists the differences between the versions of the character table data in the \textsf{CTblLib} package, since version 1.1.3. 

 The overview table contains one row for each change, where ``change'' means the addition, modification, or removal of information, and has the
following columns. 

 
\begin{description}
\item[{\texttt{Identifier}}]  the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of the character table, 
\item[{\texttt{Type}}]  one of \texttt{NEW} (for the addition of previously not available information), \texttt{***} (for a bugfix), or \texttt{C} (for a change that does not really fix a bug, typically a change motivated by
a new consistency criterion), 
\item[{\texttt{What}}]  one of \texttt{class fusions} (some class fusions from or to the table in question were changed), \texttt{maxes} (the value of the attribute \texttt{Maxes} (\ref{Maxes}) was changed), \texttt{names} (incorrect admissible names were removed), \texttt{table} or \texttt{table mod }$p$ (the ordinary or $p$-modular character table was changed), \texttt{maxes} (the value of the attribute \texttt{Maxes} (\ref{Maxes}) was changed), \texttt{tom fusion} (the value of the attribute \texttt{FusionToTom} (\ref{FusionToTom}) was changed), 
\item[{\texttt{Description}}]  a description what has been changed, 
\item[{\texttt{Flag}}]  one of \texttt{Dup} (the table is a duplicate, in the sense of \texttt{IsDuplicateTable} (\ref{IsDuplicateTable})), \texttt{Der} (the row belongs to a character table that is derived from other tables), \texttt{Fus} (the row belongs to the addition of class fusions), \texttt{Max} (the row belongs to a character table that was added because its group is
maximal in another group), or \texttt{None} (in all other cases {\textendash}these rows are to some extent the interesting
ones). The information in this column can be used to restrict the overview to
interesting subsets. 
\item[{\texttt{Vers.}}]  the package version in which the change described by the row appeared first. 
\end{description}
 

 The full functionality of the function \texttt{NCurses.BrowseGeneric} (\textbf{Browse: NCurses.BrowseGeneric}) is available. 

 The following examples show the input for 

 
\begin{itemize}
\item  restricting the overview to error rows, 
\item  restricting the overview to ``None'' rows, and 
\item  restricting the overview to rows about a particular table. 
\end{itemize}
 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@n:= [ 14, 14, 14, 14, 14, 14 ];;  # ``do nothing''|
  !gapprompt@gap>| !gapinput@enter:= [ NCurses.keys.ENTER ];;|
  !gapprompt@gap>| !gapinput@down:= [ NCurses.keys.DOWN ];;|
  !gapprompt@gap>| !gapinput@right:= [ NCurses.keys.RIGHT ];;|
  !gapprompt@gap>| !gapinput@BrowseData.SetReplay( Concatenation(|
  !gapprompt@>| !gapinput@       "scr",                    # select the 'Type' column,|
  !gapprompt@>| !gapinput@       "f***", enter,            # filter rows containing '***',|
  !gapprompt@>| !gapinput@       n, "Q" ) );               # and quit|
  !gapprompt@gap>| !gapinput@BrowseCTblLibDifferences();|
  !gapprompt@gap>| !gapinput@BrowseData.SetReplay( Concatenation(|
  !gapprompt@>| !gapinput@       "scrrrr",                 # select the 'Flag' column,|
  !gapprompt@>| !gapinput@       "fNone", enter,           # filter rows containing 'None',|
  !gapprompt@>| !gapinput@       n, "Q" ) );               # and quit|
  !gapprompt@gap>| !gapinput@BrowseCTblLibDifferences();|
  !gapprompt@gap>| !gapinput@BrowseData.SetReplay( Concatenation(|
  !gapprompt@>| !gapinput@       "fM",                     # filter rows containing 'M',|
  !gapprompt@>| !gapinput@       down, down, down, right,  # but 'M' as a whole word,|
  !gapprompt@>| !gapinput@       enter,                    #|
  !gapprompt@>| !gapinput@       n, "Q" ) );               # and quit|
  !gapprompt@gap>| !gapinput@BrowseCTblLibDifferences();|
  !gapprompt@gap>| !gapinput@BrowseData.SetReplay( false );|
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{BrowseAtlasContents}}
\logpage{[ 3, 5, 5 ]}\nobreak
\hyperdef{L}{X8135745381E1C0E2}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{BrowseAtlasContents({\mdseries\slshape })\index{BrowseAtlasContents@\texttt{BrowseAtlasContents}}
\label{BrowseAtlasContents}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
 nothing. 



 \texttt{BrowseAtlasContents} shows the list of names of simple groups and the corresponding page numbers in
the \textsf{Atlas} of Finite Groups \cite{CCN85}, as given on page v of this book, plus a few groups for which \cite[Appendix 2]{JLPW95} states that their character tables in \textsf{Atlas} format have been obtained; if applicable then also the corresponding page
numbers in the \textsf{Atlas} of Brauer Characters \cite{JLPW95} are shown. 

 Clicking on a page number opens the \textsf{Atlas} map for the group in question, see \texttt{BrowseAtlasMap} (\ref{BrowseAtlasMap}). (From the map, one can open the \textsf{Atlas} style display using the input \texttt{"T"}.) 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@d:= [ NCurses.keys.DOWN ];;  r:= [ NCurses.keys.RIGHT ];;|
  !gapprompt@gap>| !gapinput@c:= [ NCurses.keys.ENTER ];;|
  !gapprompt@gap>| !gapinput@BrowseData.SetReplay( Concatenation(|
  !gapprompt@>| !gapinput@       "/J2",         # Find the string J2,|
  !gapprompt@>| !gapinput@       c,             # start the search,|
  !gapprompt@>| !gapinput@       r,             # select the page for the ordinary table,|
  !gapprompt@>| !gapinput@       c,             # click the entry,|
  !gapprompt@>| !gapinput@       "se",          # select the box of the simple group,|
  !gapprompt@>| !gapinput@       c,             # click the box,|
  !gapprompt@>| !gapinput@       "Q",           # quit the info overview for J2,|
  !gapprompt@>| !gapinput@       d,             # move down to 2.J2,|
  !gapprompt@>| !gapinput@       c,             # click the box,|
  !gapprompt@>| !gapinput@       "Q",           # quit the info overview for 2.J2,|
  !gapprompt@>| !gapinput@       "T",           # show the ATLAS table for (extensions of) J2|
  !gapprompt@>| !gapinput@       "Q",           # quit the ATLAS table,|
  !gapprompt@>| !gapinput@       "Q",           # quit the map,|
  !gapprompt@>| !gapinput@       r,             # select the page for the 2-modular table,|
  !gapprompt@>| !gapinput@       c,             # click the entry,|
  !gapprompt@>| !gapinput@       "T",           # show the 2-modular ATLAS table|
  !gapprompt@>| !gapinput@       "Q",           # quit the ATLAS table,|
  !gapprompt@>| !gapinput@       "Q",           # quit the map,|
  !gapprompt@>| !gapinput@       "Q" ) );       # and quit the application.|
  !gapprompt@gap>| !gapinput@BrowseAtlasContents();|
  !gapprompt@gap>| !gapinput@BrowseData.SetReplay( false );|
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{DisplayAtlasContents}}
\logpage{[ 3, 5, 6 ]}\nobreak
\hyperdef{L}{X810789F77F20C839}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{DisplayAtlasContents({\mdseries\slshape })\index{DisplayAtlasContents@\texttt{DisplayAtlasContents}}
\label{DisplayAtlasContents}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{StringAtlasContents({\mdseries\slshape })\index{StringAtlasContents@\texttt{StringAtlasContents}}
\label{StringAtlasContents}
}\hfill{\scriptsize (function)}}\\


 \texttt{DisplayAtlasContents} calls the function that is given by the user preference \ref{subsect:displayfunction}, in order to show the list of names of simple groups and the corresponding
page numbers in the \textsf{Atlas} of Finite Groups \cite{CCN85}, as given on page v of this book, plus a few groups for which \cite[Appendix 2]{JLPW95} states that their character tables in \textsf{Atlas} format have been obtained; if applicable then also the corresponding page
numbers in the \textsf{Atlas} of Brauer Characters \cite{JLPW95} are shown. 

 An interactive variant of \texttt{DisplayAtlasContents} is \texttt{BrowseAtlasContents} (\ref{BrowseAtlasContents}). 

 The string that is shown by \texttt{DisplayAtlasContents} can be computed using \texttt{StringAtlasContents}. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@str:= StringAtlasContents();;|
  !gapprompt@gap>| !gapinput@pos:= PositionNthOccurrence( str, '\n', 10 );;|
  !gapprompt@gap>| !gapinput@Print( str{ [ 1 .. pos ] } );|
  A5 = L2(4) = L2(5)    2       2:2, 3:2, 5:2
  L3(2) = L2(7)         3       2:3, 3:3, 7:3
  A6 = L2(9) = S4(2)'   4       2:4, 3:4, 5:5
  L2(8) = R(3)'         6       2:6, 3:6, 7:6
  L2(11)                7       2:7, 3:7, 5:8, 11:8
  L2(13)                8       2:9, 3:9, 7:10, 13:10
  L2(17)                9       2:11, 3:11, 17:12
  A7                   10       2:13, 3:13, 5:14, 7:15
  L2(19)               11       2:16, 3:16, 5:17, 19:18
  L2(16)               12       2:19, 3:20, 5:20, 17:21
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{BrowseAtlasMap}}
\logpage{[ 3, 5, 7 ]}\nobreak
\hyperdef{L}{X86AC6408815EF122}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{BrowseAtlasMap({\mdseries\slshape name[, p]})\index{BrowseAtlasMap@\texttt{BrowseAtlasMap}}
\label{BrowseAtlasMap}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
 nothing. 



 For a string \mbox{\texttt{\mdseries\slshape name}} that is the identifier of the character table of a simple group from the \textsf{Atlas} of Finite Groups \cite{CCN85}, \texttt{BrowseAtlasMap} shows the map that describes the bicyclic extensions of this group, see \cite[Chapter 6]{CCN85}. If the optional argument \mbox{\texttt{\mdseries\slshape p}} is not given or if \mbox{\texttt{\mdseries\slshape p}} is zero then the map for the ordinary character tables is shown, if \mbox{\texttt{\mdseries\slshape p}} is a prime integer then the map for the \mbox{\texttt{\mdseries\slshape p}}-modular Brauer character tables is shown, as in \cite{JLPW95}. 

 Clicking on a square of the map opens the character table information for the
extension in question, by calling \texttt{BrowseCTblLibInfo} (\ref{BrowseCTblLibInfo}). 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@d:= [ NCurses.keys.DOWN ];;  r:= [ NCurses.keys.RIGHT ];;|
  !gapprompt@gap>| !gapinput@c:= [ NCurses.keys.ENTER ];;|
  !gapprompt@gap>| !gapinput@BrowseData.SetReplay( Concatenation(|
  !gapprompt@>| !gapinput@       "T",           # show the ATLAS table for (extensions of) M12|
  !gapprompt@>| !gapinput@       "Q",           # quit the ATLAS table,|
  !gapprompt@>| !gapinput@       "se",          # select the box of the simple group,|
  !gapprompt@>| !gapinput@       c,             # click the box,|
  !gapprompt@>| !gapinput@       "Q",           # quit the info overview for M12,|
  !gapprompt@>| !gapinput@       r, d,          # select the box for the bicyclic extension,|
  !gapprompt@>| !gapinput@       c,             # click the box,|
  !gapprompt@>| !gapinput@       "Q",           # quit the info overview,|
  !gapprompt@>| !gapinput@       "Q" ) );       # and quit the application.|
  !gapprompt@gap>| !gapinput@BrowseAtlasMap( "M12" );|
  !gapprompt@gap>| !gapinput@BrowseData.SetReplay( false );|
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{DisplayAtlasMap (for the name of a simple group)}}
\logpage{[ 3, 5, 8 ]}\nobreak
\hyperdef{L}{X875A6BB485A49976}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{DisplayAtlasMap({\mdseries\slshape name[, p]})\index{DisplayAtlasMap@\texttt{DisplayAtlasMap}!for the name of a simple group}
\label{DisplayAtlasMap:for the name of a simple group}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{DisplayAtlasMap({\mdseries\slshape arec})\index{DisplayAtlasMap@\texttt{DisplayAtlasMap}!for a record}
\label{DisplayAtlasMap:for a record}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{StringsAtlasMap({\mdseries\slshape name[, p]})\index{StringsAtlasMap@\texttt{StringsAtlasMap}!for the name of a simple group}
\label{StringsAtlasMap:for the name of a simple group}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{StringsAtlasMap({\mdseries\slshape arec})\index{StringsAtlasMap@\texttt{StringsAtlasMap}!for a record}
\label{StringsAtlasMap:for a record}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
 \texttt{DisplayAtlasMap} returns nothing, \texttt{StringsAtlasMap} returns either \texttt{fail} or the list of strings that form the rows of the \textsf{Atlas} map of the group in question. 



 Let \mbox{\texttt{\mdseries\slshape name}} be an admissible name for the character table of a simple \textsf{Atlas} group, and \mbox{\texttt{\mdseries\slshape p}} be a prime integer or $0$ (which is the default). \texttt{DisplayAtlasMap} shows the map for the group and its extensions, similar to the map shown in
the \textsf{Atlas}. \texttt{StringsAtlasMap} returns the list of strings that form the rows of this map. 

 
\begin{Verbatim}[commandchars=!@B,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>B !gapinput@DisplayAtlasMap( "M12" );B
  --------- ---------   
  |       | |       |   
  |   G   | |  G.2  | 15
  |       | |       |   
  --------- ---------   
  --------- ---------   
  |       | |       |   
  |  2.G  | | 2.G.2 | 11
  |       | |       |   
  --------- ---------   
      15        9    
  !gapprompt@gap>B !gapinput@DisplayAtlasMap( "M12", 2 );B
  --------- ---------  
  |       | |       |  
  |   G   | |  G.2  | 6
  |       | |       |  
  --------- ---------  
      6         0    
  !gapprompt@gap>B !gapinput@StringsAtlasMap( "M11" );B
  [ "---------   ", "|       |   ", "|   G   | 10", "|       |   ", 
    "---------   ", "    10   " ]
\end{Verbatim}
 

 More generally, \mbox{\texttt{\mdseries\slshape name}} can be an admissible name for a character with known \texttt{ExtensionInfoCharacterTable} (\ref{ExtensionInfoCharacterTable}) value and such that the strings describing multiplier and outer automorphism
group in this value occur in the lists \texttt{CTblLib.AtlasMapMultNames} and \texttt{CTblLib.AtlasMapOutNames}, respectively. If not all character tables of bicyclic extensions of the
simple group in question are available then \texttt{StringsAtlasMap} returns \texttt{fail}, and \texttt{DisplayAtlasMap} shows nothing. 

 
\begin{Verbatim}[commandchars=!@B,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>B !gapinput@DisplayAtlasMap( "S10(2)" );B
  ---------    
  |       |    
  |   G   | 198
  |       |    
  ---------    
     198   
  !gapprompt@gap>B !gapinput@DisplayAtlasMap( "L12(27)" );B
  !gapprompt@gap>B !gapinput@StringsAtlasMap( "L12(27)" );B
  fail
\end{Verbatim}
 

 If the abovementioned requirements are not satisfied for the character tables
in question then one can provide the necessary information via a record \mbox{\texttt{\mdseries\slshape arec}}. 

 The following example shows the ``\textsf{Atlas} map'' for the alternating group on four points, viewed as an extension of the
trivial group by a Klein four group and a group of order three. 

 
\begin{Verbatim}[commandchars=!@B,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>B !gapinput@DisplayAtlasMap( rec(B
  !gapprompt@>B !gapinput@labels:= [ [ "G", "G.3" ],B
  !gapprompt@>B !gapinput@           [ "2.G", "" ],B
  !gapprompt@>B !gapinput@           [ "2'.G", "" ],B
  !gapprompt@>B !gapinput@           [ "2''.G", "" ] ],B
  !gapprompt@>B !gapinput@shapes:= [ [ "closed", "closed" ],B
  !gapprompt@>B !gapinput@           [ "closed", "empty" ],B
  !gapprompt@>B !gapinput@           [ "closed", "empty" ],B
  !gapprompt@>B !gapinput@           [ "closed", "empty" ] ],B
  !gapprompt@>B !gapinput@labelscol:= [ "1", "1" ],B
  !gapprompt@>B !gapinput@labelsrow:= [ "1", "1", "1", "1" ],B
  !gapprompt@>B !gapinput@dashedhorz:= [ false, false, true, true ],B
  !gapprompt@>B !gapinput@dashedvert:= [ false, false ],B
  !gapprompt@>B !gapinput@showdashedrows:= true ) );B
        --------- ---------  
        |       | |       |  
        |   G   | |  G.3  | 1
        |       | |       |  
        --------- ---------  
        ---------            
        |       |            
        |  2.G  |           1
        |       |            
        ---------            
   2'.G ---------          
        ---------          
  2''.G ---------          
        ---------          
            1         1    
\end{Verbatim}
 

 The next example shows the ``\textsf{Atlas} map'' for the symmetric group on three points, viewed as a bicyclic extension of the
trivial group by groups of the orders three and two, respectively. 

 
\begin{Verbatim}[commandchars=!@B,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>B !gapinput@DisplayAtlasMap( rec(B
  !gapprompt@>B !gapinput@labels:= [ [ "G", "G.2" ],B
  !gapprompt@>B !gapinput@           [ "3.G", "3.G.2" ] ],B
  !gapprompt@>B !gapinput@shapes:= [ [ "closed", "closed" ],B
  !gapprompt@>B !gapinput@           [ "closed", "open" ] ],B
  !gapprompt@>B !gapinput@labelscol:= [ "1", "1" ],B
  !gapprompt@>B !gapinput@labelsrow:= [ "1", "1" ],B
  !gapprompt@>B !gapinput@dashedhorz:= [ false, false ],B
  !gapprompt@>B !gapinput@dashedvert:= [ false, false ],B
  !gapprompt@>B !gapinput@showdashedrows:= true ) );B
  --------- ---------  
  |       | |       |  
  |   G   | |  G.2  | 1
  |       | |       |  
  --------- ---------  
  --------- --------   
  |       | |          
  |  3.G  | | 3.G.2   1
  |       | |          
  ---------            
      1         1    
\end{Verbatim}
 

 (Depending on the terminal capabilities, the results may look nicer than the ``ASCII only'' graphics shown above.) 

 The following components of \mbox{\texttt{\mdseries\slshape arec}} are supported. 

 
\begin{description}
\item[{\texttt{name}}]  a string, the name of the (simple) group; 
\item[{\texttt{char}}]  the characteristic, the default is $0$; 
\item[{\texttt{identifiers}}]  an $m$ by $n$ matrix whose entries are \texttt{fail} or the \texttt{Identifier} (\textbf{Reference: Identifier for tables of marks}) values of the character tables of the extensions in question; 
\item[{\texttt{labels}}]  an $m$ by $n$ matrix whose entries are \texttt{fail} or the strings that shall be used as the labels of the boxes; 
\item[{\texttt{shapes}}]  an $m$ by $n$ matrix whose entries are the strings \texttt{"closed"}, \texttt{"open"}, \texttt{"broken"}, and \texttt{"empty"}, describing the boxes that occur; 
\item[{\texttt{labelscol}}]  a list of length $n$ that contains the labels to be shown below the last row of boxes, intended to
show the numbers of classes in this column of boxes; 
\item[{\texttt{labelsrow}}]  a list of length $m$ that contains the labels to be shown on the right of the last column of boxes,
intended to show the numbers of characters in this row of boxes; 
\item[{\texttt{dashedhorz}}]  a list of length $m$ with entries \texttt{true} (the boxes in this row shall have small height) or \texttt{false} (the boxes in this row shall have normal height); 
\item[{\texttt{dashedvert}}]  a list of length $n$ with entries \texttt{true} (the boxes in this column shall have small width) or \texttt{false} (the boxes in this column shall have normal width); 
\item[{\texttt{showdashedrows}}]  \texttt{true} or \texttt{false}, the default is to show rows of ``dashed'' boxes in the case of ordinary tables, and to omit them in the case of Brauer
tables, as happens in the printed Atlases; 
\item[{\texttt{onlyasciiboxes}}]  \texttt{true} (show only ASCII characters when drawing the boxes) or \texttt{false} (use line drawing characters), the default is the value returned by \texttt{CTblLib.ShowOnlyASCII}; 
\item[{\texttt{onlyasciilabels}}]  \texttt{true} (show only ASCII characters in the labels inside the boxes) or \texttt{false} (default, use subscripts if applicable); the default is the value returned by \texttt{CTblLib.ShowOnlyASCII}; 
\item[{\texttt{specialshapes}}]  a list of length three that describes exceptional cases (intended for the
treatment of ``dashed names'' and ``broken boxes'', look at the values in \texttt{CTblLib.AtlasMapBoxesSpecial} where this component is actually used). 
\end{description}
 }

 

\subsection{\textcolor{Chapter }{BrowseAtlasTable}}
\logpage{[ 3, 5, 9 ]}\nobreak
\hyperdef{L}{X79DC72707B08A701}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{BrowseAtlasTable({\mdseries\slshape name[, p]})\index{BrowseAtlasTable@\texttt{BrowseAtlasTable}}
\label{BrowseAtlasTable}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
 nothing. 



 \texttt{BrowseAtlasTable} displays the character tables of bicyclic extensions of the simple group with
the name \mbox{\texttt{\mdseries\slshape name}} in a window, in the same format as the \textsf{Atlas} of Finite Groups \cite{CCN85} and the \textsf{Atlas} of Brauer Characters \cite{JLPW95} do. For that, it is necessary that these tables are known, as well as the
class fusions between them and perhaps additional information
(e.{\nobreakspace}g., about the existence of certain extensions). These
requirements are fulfilled if the tables are contained in the \textsf{Atlas}, but they may hold also in other cases. 

 If a prime \mbox{\texttt{\mdseries\slshape p}} is given as the second argument then the \mbox{\texttt{\mdseries\slshape p}}-modular Brauer tables are shown, otherwise (or if \mbox{\texttt{\mdseries\slshape p}} is zero) the ordinary tables are shown. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@d:= [ NCurses.keys.DOWN ];;  r:= [ NCurses.keys.RIGHT ];;|
  !gapprompt@gap>| !gapinput@c:= [ NCurses.keys.ENTER ];;|
  !gapprompt@gap>| !gapinput@BrowseData.SetReplay( Concatenation(|
  !gapprompt@>| !gapinput@       "/y",          # Find the string y,|
  !gapprompt@>| !gapinput@       c,             # start the search,|
  !gapprompt@>| !gapinput@       "nnnn",        # Find more occurrences,|
  !gapprompt@>| !gapinput@       "Q" ) );       # and quit the application.|
  !gapprompt@gap>| !gapinput@BrowseAtlasTable( "A6" );|
  !gapprompt@gap>| !gapinput@BrowseData.SetReplay( false );|
\end{Verbatim}
 

 The function uses \texttt{NCurses.BrowseGeneric} (\textbf{Browse: NCurses.BrowseGeneric}). The identifier of the table is used as the static header. The strings \texttt{X{\textunderscore}1}, \texttt{X{\textunderscore}2}, $\ldots$ are used as row labels for those table rows that contain character values, and
column labels are given by centralizer orders, power map information, and
class names. }

 

\subsection{\textcolor{Chapter }{BrowseAtlasImprovements}}
\logpage{[ 3, 5, 10 ]}\nobreak
\hyperdef{L}{X79E3F783818FE75A}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{BrowseAtlasImprovements({\mdseries\slshape [choice]})\index{BrowseAtlasImprovements@\texttt{BrowseAtlasImprovements}}
\label{BrowseAtlasImprovements}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
 nothing. 



 Called without argument or with the string \texttt{"ordinary"}, \texttt{BrowseAtlasImprovements} shows the lists of improvements to the \textsf{Atlas} of Finite Groups \cite{CCN85} that are contained in \cite{BN95} and \cite{AtlasImpII}. 

 Called with the string \texttt{"modular"}, \texttt{BrowseAtlasImprovements} shows the list of improvements to the \textsf{Atlas} of Brauer Characters \cite{JLPW95} that are contained in \cite{ABCImp}. 

 Called with \texttt{true}, the concatenation of the above lists are shown. 

 The overview table contains one row for each improvement, and has the
following columns. 

 
\begin{description}
\item[{\texttt{Section}}]  the part in the \textsf{Atlas} to which the entry belongs (Introduction, The Groups, Additional information,
Bibliography, Appendix 1, Appendix 2), 
\item[{\texttt{Src}}]  \texttt{1} for entries from \cite{BN95}, \texttt{2} for entries from \cite{AtlasImpII}, and \texttt{3} for entries from \cite{ABCImp}, 
\item[{\texttt{Typ}}]  the type of the improvement, one of \texttt{***} (for mathematical errors), \texttt{NEW} (for new information), \texttt{C} (for improvements concerning grammar or notational consistency), or \texttt{M} (for misprints or cases of illegibility), 
\item[{\texttt{Page}}]  the page and perhaps the line in the (ordinary or modular) \textsf{Atlas}, 
\item[{\texttt{Group}}]  the name of the simple group to which the entry belongs (empty for entries not
from the section ``The Groups''), 
\item[{\texttt{Text}}]  the description of the entry, 
\item[{\texttt{**}}]  for each entry of the type \texttt{***}, the subtype of the error to which some statements in \cite{BMO17} refer, one of \texttt{CH} (character values), \texttt{P} (power maps, element orders, and class names), \texttt{FI} (fusions and indicators), \texttt{I} (Introduction, Bibliography, the list showing the orders of multipliers and
outer automorphism group, and the list of Conway polynomials), \texttt{MP} (maps), \texttt{MX} (descriptions of maximal subgroups), and \texttt{G} (other information about the group). 
\end{description}
 

 The full functionality of the function \texttt{NCurses.BrowseGeneric} (\textbf{Browse: NCurses.BrowseGeneric}) is available. 

 The following example shows the input for first restricting the list to errors
(type \texttt{***}), then categorizing the filtered list by the subtype of the error, and then
expanding the category for the subtype \texttt{CH}. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@n:= [ 14, 14, 14, 14, 14, 14 ];;  # ``do nothing''|
  !gapprompt@gap>| !gapinput@enter:= [ NCurses.keys.ENTER ];;|
  !gapprompt@gap>| !gapinput@BrowseData.SetReplay( Concatenation(|
  !gapprompt@>| !gapinput@       "scrr",                   # select the 'Typ' column,|
  !gapprompt@>| !gapinput@       "f***", enter,            # filter rows containing '***',|
  !gapprompt@>| !gapinput@       "scrrrrrrsc", enter,      # categorize by the error kind|
  !gapprompt@>| !gapinput@       "sr", enter,              # expand the 'CH' category|
  !gapprompt@>| !gapinput@       n, "Q" ) );               # and quit|
  !gapprompt@gap>| !gapinput@BrowseAtlasImprovements();|
  !gapprompt@gap>| !gapinput@BrowseData.SetReplay( false );|
\end{Verbatim}
 }

 }

  
\section{\textcolor{Chapter }{Duplicates of Library Character Tables}}\label{sec:duplicates}
\logpage{[ 3, 6, 0 ]}
\hyperdef{L}{X7E5CFB187E313B11}{}
{
  It can be useful to deal with different instances of ``the same'' character table. An example is the situation that a group $G$, say, contains several classes of isomorphic maximal subgroups that have
different class fusions; the attribute \texttt{Maxes} (\ref{Maxes}) of the character table of $G$ then contains several entries that belong to the same group, but the
identifiers of the character tables are different. 

 On the other hand, it can be useful to consider only one of the different
instances when one searches for character tables with certain properties, for
example using \texttt{OneCharacterTableName} (\ref{OneCharacterTableName}). 

 \index{duplicate character table} For that, we introduce the following concept. A character table $t_1$ is said to be a \emph{duplicate} of another character table $t_2$ if the attribute \texttt{IdentifierOfMainTable} (\ref{IdentifierOfMainTable}) returns the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of $t_2$ when it is called with $t_1$, and we call $t_2$ the \emph{main table} of $t_1$. In this case, \texttt{IsDuplicateTable} (\ref{IsDuplicateTable}) returns \texttt{true} for $t_1$. 

 If the character table $t_1$ is not a duplicate of any other library table then \texttt{IdentifierOfMainTable} (\ref{IdentifierOfMainTable}) returns \texttt{fail} for $t_1$ and \texttt{IsDuplicateTable} (\ref{IsDuplicateTable}) returns \texttt{false}. 

 See \texttt{AllCharacterTableNames} (\ref{AllCharacterTableNames}) for examples how to apply \texttt{IsDuplicateTable} (\ref{IsDuplicateTable}) in practice. 

 We do \emph{not} promise that two library tables for which \texttt{IsDuplicateTable} (\ref{IsDuplicateTable}) returns \texttt{false} are necessarily different. (And since nonisomorphic groups may have the same
character table, it would not make sense to think about restricting a search
to a subset of library tables that belong to pairwise nonisomorphic groups.) 

 Currently \texttt{IdentifierOfMainTable} (\ref{IdentifierOfMainTable}) does not return \texttt{fail} for $t_1$ if \texttt{ConstructionInfoCharacterTable} (\ref{ConstructionInfoCharacterTable}) is set in $t_1$, the first entry of the attribute value is \texttt{"ConstructPermuted"}, and one of the following holds. 

 
\begin{itemize}
\item  The second entry of the \texttt{ConstructionInfoCharacterTable} (\ref{ConstructionInfoCharacterTable}) value is a list of length $1$ that contains the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of $t_2$. 
\item  The \textsf{SpinSym} package is loaded and $t_1$ is one of the character tables provided by this package. These tables are not
declared as permuted tables of library tables, but we \emph{want} to regard them as duplicates. 
\end{itemize}
 

\subsection{\textcolor{Chapter }{IsDuplicateTable}}
\logpage{[ 3, 6, 1 ]}\nobreak
\hyperdef{L}{X7FD4A9DF7CBAA418}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IsDuplicateTable({\mdseries\slshape tbl})\index{IsDuplicateTable@\texttt{IsDuplicateTable}}
\label{IsDuplicateTable}
}\hfill{\scriptsize (property)}}\\


 For an ordinary character table \mbox{\texttt{\mdseries\slshape tbl}} from the \textsf{GAP} Character Table Library, this function returns \texttt{true} if \mbox{\texttt{\mdseries\slshape tbl}} was constructed from another library character table by permuting rows and
columns, via the attribute \texttt{ConstructionInfoCharacterTable} (\ref{ConstructionInfoCharacterTable}). Otherwise \texttt{false} is returned, in particular if \mbox{\texttt{\mdseries\slshape tbl}} is not a character table from the \textsf{GAP} Character Table Library. 

 One application of this function is to restrict the search with \texttt{AllCharacterTableNames} (\ref{AllCharacterTableNames}) to only one library character table for each class of permutation equivalent
tables. Note that this does property of the search result cannot be guaranteed
if private character tables have been added to the library, see \texttt{NotifyCharacterTable} (\ref{NotifyCharacterTable}). 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@Maxes( CharacterTable( "A6" ) );|
  [ "A5", "A6M2", "3^2:4", "s4", "A6M5" ]
  !gapprompt@gap>| !gapinput@IsDuplicateTable( CharacterTable( "A5" ) );|
  false
  !gapprompt@gap>| !gapinput@IsDuplicateTable( CharacterTable( "A6M2" ) );|
  true
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IdentifierOfMainTable}}
\logpage{[ 3, 6, 2 ]}\nobreak
\hyperdef{L}{X860F49407882658F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IdentifierOfMainTable({\mdseries\slshape tbl})\index{IdentifierOfMainTable@\texttt{IdentifierOfMainTable}}
\label{IdentifierOfMainTable}
}\hfill{\scriptsize (attribute)}}\\


 If \mbox{\texttt{\mdseries\slshape tbl}} is an ordinary character table that is a duplicate in the sense of the
introduction to Section{\nobreakspace}\ref{sec:duplicates} then this function returns the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of the main table of \mbox{\texttt{\mdseries\slshape tbl}}. Otherwise \texttt{fail} is returned. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@Maxes( CharacterTable( "A6" ) );|
  [ "A5", "A6M2", "3^2:4", "s4", "A6M5" ]
  !gapprompt@gap>| !gapinput@IdentifierOfMainTable( CharacterTable( "A5" ) );|
  fail
  !gapprompt@gap>| !gapinput@IdentifierOfMainTable( CharacterTable( "A6M2" ) );|
  "A5"
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{IdentifiersOfDuplicateTables}}
\logpage{[ 3, 6, 3 ]}\nobreak
\hyperdef{L}{X7C83435B78DE62F6}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IdentifiersOfDuplicateTables({\mdseries\slshape tbl})\index{IdentifiersOfDuplicateTables@\texttt{IdentifiersOfDuplicateTables}}
\label{IdentifiersOfDuplicateTables}
}\hfill{\scriptsize (attribute)}}\\


 For an ordinary character table \mbox{\texttt{\mdseries\slshape tbl}}, this function returns the list of \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) values of those character tables from the \textsf{GAP} Character Table Library that are duplicates of \mbox{\texttt{\mdseries\slshape tbl}}, in the sense of the introduction to Section{\nobreakspace}\ref{sec:duplicates}. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@Maxes( CharacterTable( "A6" ) );|
  [ "A5", "A6M2", "3^2:4", "s4", "A6M5" ]
  !gapprompt@gap>| !gapinput@IdentifiersOfDuplicateTables( CharacterTable( "A5" ) );|
  [ "A6M2", "Alt(5)" ]
  !gapprompt@gap>| !gapinput@IdentifiersOfDuplicateTables( CharacterTable( "A6M2" ) );|
  [  ]
\end{Verbatim}
 }

 }

  
\section{\textcolor{Chapter }{Attributes for Library Character Tables}}\label{sec:attributes}
\logpage{[ 3, 7, 0 ]}
\hyperdef{L}{X7CCFEC998135F6FA}{}
{
  This section describes certain attributes which are set only for certain (not
necessarily all) character tables from the \textsf{GAP} Character Table Library. The attribute values are part of the database, there
are no methods for \emph{computing} them, except for \texttt{InfoText} (\ref{InfoText}). 

 Other such attributes and properties are described in manual sections because
the context fits better. These attributes are \texttt{FusionToTom} (\ref{FusionToTom}), \texttt{GroupInfoForCharacterTable} (\ref{GroupInfoForCharacterTable}), \texttt{KnowsSomeGroupInfo} (\ref{KnowsSomeGroupInfo}), \texttt{IsNontrivialDirectProduct} (\ref{IsNontrivialDirectProduct}), \texttt{DeligneLusztigNames} (\ref{DeligneLusztigNames}), \texttt{DeligneLusztigName} (\ref{DeligneLusztigName}), \texttt{KnowsDeligneLusztigNames} (\ref{KnowsDeligneLusztigNames}), \texttt{IsDuplicateTable} (\ref{IsDuplicateTable}), and \texttt{CASInfo} (\ref{CASInfo}). 

\subsection{\textcolor{Chapter }{Maxes}}
\logpage{[ 3, 7, 1 ]}\nobreak
\hyperdef{L}{X8150E63F7DBDF252}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{Maxes({\mdseries\slshape tbl})\index{Maxes@\texttt{Maxes}}
\label{Maxes}
}\hfill{\scriptsize (attribute)}}\\


 If this attribute is set for an ordinary character table \mbox{\texttt{\mdseries\slshape tbl}} then the value is a list of identifiers of the ordinary character tables of
all maximal subgroups of \mbox{\texttt{\mdseries\slshape tbl}}. There is no default method to \emph{compute} this value from \mbox{\texttt{\mdseries\slshape tbl}}. 

 If the \texttt{Maxes} value of \mbox{\texttt{\mdseries\slshape tbl}} is stored then it lists exactly one representative for each conjugacy class of
maximal subgroups of the group of \mbox{\texttt{\mdseries\slshape tbl}}, and the character tables of these maximal subgroups are available in the \textsf{GAP} Character Table Library, and compatible class fusions to \mbox{\texttt{\mdseries\slshape tbl}} are stored on these tables (see the example in Section \ref{subsect:primpermchars2A6}). 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@tbl:= CharacterTable( "M11" );;|
  !gapprompt@gap>| !gapinput@HasMaxes( tbl );|
  true
  !gapprompt@gap>| !gapinput@maxes:= Maxes( tbl );|
  [ "A6.2_3", "L2(11)", "3^2:Q8.2", "A5.2", "2.S4" ]
  !gapprompt@gap>| !gapinput@CharacterTable( maxes[1] );|
  CharacterTable( "A6.2_3" )
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{ProjectivesInfo}}
\logpage{[ 3, 7, 2 ]}\nobreak
\hyperdef{L}{X82DC2E7779322DA8}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ProjectivesInfo({\mdseries\slshape tbl})\index{ProjectivesInfo@\texttt{ProjectivesInfo}}
\label{ProjectivesInfo}
}\hfill{\scriptsize (attribute)}}\\


 If this attribute is set for an ordinary character table \mbox{\texttt{\mdseries\slshape tbl}} then the value is a list of records, each with the following components. 
\begin{description}
\item[{\texttt{name}}]  the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of the character table of the covering whose faithful irreducible
characters are described by the record, 
\item[{\texttt{chars}}]  a list of values lists of faithful projective irreducibles; only one
representative of each family of Galois conjugates is contained in this list.
and 
\end{description}
 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ProjectivesInfo( CharacterTable( "A5" ) );|
  [ rec( 
        chars := [ [ 2, 0, -1, E(5)+E(5)^4, E(5)^2+E(5)^3 ], 
            [ 2, 0, -1, E(5)^2+E(5)^3, E(5)+E(5)^4 ], 
            [ 4, 0, 1, -1, -1 ], [ 6, 0, 0, 1, 1 ] ], name := "2.A5" ) ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{ExtensionInfoCharacterTable}}
\logpage{[ 3, 7, 3 ]}\nobreak
\hyperdef{L}{X82A008987DB887C2}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ExtensionInfoCharacterTable({\mdseries\slshape tbl})\index{ExtensionInfoCharacterTable@\texttt{ExtensionInfoCharacterTable}}
\label{ExtensionInfoCharacterTable}
}\hfill{\scriptsize (attribute)}}\\


 Let \mbox{\texttt{\mdseries\slshape tbl}} be the ordinary character table of a group $G$, say. If this attribute is set for \mbox{\texttt{\mdseries\slshape tbl}} then the value is a list of length two, the first entry being a string \texttt{M} that describes the Schur multiplier of $G$ and the second entry being a string \texttt{A} that describes the outer automorphism group of $G$. Trivial multiplier or outer automorphism group are denoted by an empty
string. 

 If \mbox{\texttt{\mdseries\slshape tbl}} is a table from the \textsf{GAP} Character Table Library and $G$ is (nonabelian and) simple then the value is set. In this case, an admissible
name for the character table of a universal covering group of $G$ (if this table is available and different from \mbox{\texttt{\mdseries\slshape tbl}}) is given by the concatenation of \texttt{M}, \texttt{"."}, and the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of \mbox{\texttt{\mdseries\slshape tbl}}. Analogously, an admissible name for the character table of the automorphism
group of $G$ (if this table is available and different from \mbox{\texttt{\mdseries\slshape tbl}}) is given by the concatenation of the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of \mbox{\texttt{\mdseries\slshape tbl}}, \texttt{"."}, and \texttt{A}. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ExtensionInfoCharacterTable( CharacterTable( "A5" ) );|
  [ "2", "2" ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{ConstructionInfoCharacterTable}}
\logpage{[ 3, 7, 4 ]}\nobreak
\hyperdef{L}{X851118377D1D6EC9}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructionInfoCharacterTable({\mdseries\slshape tbl})\index{ConstructionInfoCharacterTable@\texttt{ConstructionInfoCharacterTable}}
\label{ConstructionInfoCharacterTable}
}\hfill{\scriptsize (attribute)}}\\


 If this attribute is set for an ordinary character table \mbox{\texttt{\mdseries\slshape tbl}} then the value is a list that describes how this table was constructed. The
first entry is a string that is the identifier of the function that was
applied to the pre-table record; the remaining entries are the arguments for
that function, except that the pre-table record must be prepended to these
arguments. }

 

\subsection{\textcolor{Chapter }{InfoText}}
\logpage{[ 3, 7, 5 ]}\nobreak
\hyperdef{L}{X871562FD7F982C12}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{InfoText({\mdseries\slshape tbl})\index{InfoText@\texttt{InfoText}}
\label{InfoText}
}\hfill{\scriptsize (method)}}\\


 This method for library character tables returns an empty string if no \texttt{InfoText} value is stored on the table \mbox{\texttt{\mdseries\slshape tbl}}. 

 Without this method, it would be impossible to use \texttt{InfoText} in calls to \texttt{AllCharacterTableNames} (\ref{AllCharacterTableNames}), as in the following example. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@AllCharacterTableNames( InfoText,|
  !gapprompt@>| !gapinput@       s -> PositionSublist( s, "tests:" ) <> fail );;|
\end{Verbatim}
 }

 }

 }

     
\chapter{\textcolor{Chapter }{Contents of the \textsf{GAP} Character Table Library}}\label{ch:ctbllibr}
\logpage{[ 4, 0, 0 ]}
\hyperdef{L}{X85854AF07F2F8745}{}
{
  \index{character tables!library of} \index{tables!library of} \index{library tables} \index{generic character tables} This chapter informs you about 
\begin{itemize}
\item  the currently available character tables (see Section{\nobreakspace}\ref{sec:contents}), 
\item  generic character tables (see Section{\nobreakspace}\ref{sec:generictables}), 
\item  the subsets of \textsf{Atlas} tables (see Section{\nobreakspace}\ref{sec:ATLAS Tables}) and \textsf{CAS} tables (see Section{\nobreakspace}\ref{sec:CAS Tables}), 
\item  installing the library, and related user preferences (see
Section{\nobreakspace}\ref{sec:customize}). 
\end{itemize}
 

 The following rather technical sections are thought for those who want to
maintain or extend the Character Table Library. 

 
\begin{itemize}
\item  the technicalities of the access to library tables (see Section{\nobreakspace}\ref{sec:technicalities}), 
\item  how to extend the library (see Section{\nobreakspace}\ref{sec:extending}), and 
\item  sanity checks (see Section{\nobreakspace}\ref{sec:CTblLib Sanity Checks}). 
\end{itemize}
  
\section{\textcolor{Chapter }{Ordinary and Brauer Tables in the \textsf{GAP} Character Table Library }}\label{sec:contents}
\logpage{[ 4, 1, 0 ]}
\hyperdef{L}{X80EEFF8B79856A75}{}
{
  \index{character tables!library of} \index{tables!library of} \index{library of character tables} This section gives a brief overview of the contents of the \textsf{GAP} character table library. For the details about, e.{\nobreakspace}g., the
structure of data files, see Section{\nobreakspace}\ref{sec:technicalities}. 

 The changes in the character table library since the first release of \textsf{GAP}{\nobreakspace}4 are listed in a file that can be fetched from 

 \href{https://www.math.rwth-aachen.de/~Thomas.Breuer/ctbllib/htm/ctbldiff.htm } {\texttt{https://www.math.rwth-aachen.de/\texttt{\symbol{126}}Thomas.Breuer/ctbllib/htm/ctbldiff.htm }}. 

 There are three different kinds of character tables in the \textsf{GAP} library, namely \emph{ordinary character tables}, \emph{Brauer tables}, and \emph{generic character tables}. Note that the Brauer table and the corresponding ordinary table of a group
determine the \emph{decomposition matrix} of the group (and the decomposition matrices of its blocks). These
decomposition matrices can be computed from the ordinary and modular
irreducibles with \textsf{GAP}, see Section{\nobreakspace} (\textbf{Reference: Operations Concerning Blocks}) for details. A collection of PDF files of the known decomposition matrices of \textsf{Atlas} tables in the \textsf{GAP} Character Table Library can also be found at 

 \href{https://www.math.rwth-aachen.de/~MOC/decomposition/} {\texttt{https://www.math.rwth-aachen.de/\texttt{\symbol{126}}MOC/decomposition/}}. 

  
\subsection{\textcolor{Chapter }{Ordinary Character Tables}}\label{subsec:contents-ordinary}
\logpage{[ 4, 1, 1 ]}
\hyperdef{L}{X8569BC8E7A9D4BCE}{}
{
  Two different aspects are useful to list the ordinary character tables
available in \textsf{GAP}, namely the aspect of the \emph{source} of the tables and that of \emph{relations} between the tables. 

 As for the source, there are first of all two big sources, namely the \textsf{Atlas} of Finite Groups (see Section{\nobreakspace}\ref{sec:ATLAS Tables}) and the \textsf{CAS} library of character tables (see{\nobreakspace}\cite{NPP84}). Many \textsf{Atlas} tables are contained in the \textsf{CAS} library, and difficulties may arise because the succession of characters and
classes in \textsf{CAS} tables and \textsf{Atlas} tables are in general different, so see Section{\nobreakspace}\ref{sec:CAS Tables} for the relations between these two variants of character tables of the same
group. A subset of the \textsf{CAS} tables is the set of tables of Sylow normalizers of sporadic simple groups as
published in{\nobreakspace}\cite{Ost86} {\nobreakspace}this may be viewed as another source of character tables. The
library also contains the character tables of factor groups of space groups
(computed by W.{\nobreakspace}Hanrath, see{\nobreakspace}\cite{Han88}) that are part of{\nobreakspace}\cite{HP89}, in the form of two microfiches; these tables are given in \textsf{CAS} format (see Section{\nobreakspace}\ref{sec:CAS Tables}) on the microfiches, but they had not been part of the ``official'' \textsf{CAS} library. 

 To avoid confusion about the ordering of classes and characters in a given
table, authorship and so on, the \texttt{InfoText} (\textbf{Reference: InfoText}) value of the table contains the information 
\begin{description}
\item[{\texttt{origin:{\nobreakspace}ATLAS of finite groups}}]  for \textsf{Atlas} tables (see Section{\nobreakspace}\ref{sec:ATLAS Tables}), 
\item[{\texttt{origin:{\nobreakspace}Ostermann}}]  for tables contained in{\nobreakspace}\cite{Ost86}, 
\item[{\texttt{origin:{\nobreakspace}CAS library}}]  for any table of the \textsf{CAS} table library that is contained neither in the \textsf{Atlas} nor in{\nobreakspace}\cite{Ost86}, and 
\item[{\texttt{origin:{\nobreakspace}Hanrath library}}]  for tables contained in the microfiches in{\nobreakspace}\cite{HP89}. 
\end{description}
 The \texttt{InfoText} (\textbf{Reference: InfoText}) value usually contains more detailed information, for example that the table
in question is the character table of a maximal subgroup of an almost simple
group. If the table was contained in the \textsf{CAS} library then additional information may be available via the \texttt{CASInfo} (\ref{CASInfo}) value. 

 If one is interested in the aspect of relations between the tables,
i.{\nobreakspace}e., the internal structure of the library of ordinary tables,
the contents can be listed up the following way. 

 We have 
\begin{itemize}
\item  all \textsf{Atlas} tables (see Section{\nobreakspace}\ref{sec:ATLAS Tables}), i.{\nobreakspace}e., the tables of the simple groups which are contained in
the \textsf{Atlas} of Finite Groups, and the tables of cyclic and bicyclic extensions of these
groups, 
\item  most tables of maximal subgroups of sporadic simple groups (\emph{not all} for the Monster group), 
\item  many tables of maximal subgroups of other \textsf{Atlas} tables; the \texttt{Maxes} (\ref{Maxes}) value for the table is set if all tables of maximal subgroups are available, 
\item  the tables of many Sylow $p$-normalizers of sporadic simple groups; this includes the tables printed
in{\nobreakspace}\cite{Ost86} except $J_4N2$, $Co_1N2$, $Fi_{22}N2$, but also other tables are available; more generally, several tables of
normalizers of other radical $p$-subgroups are available, such as normalizers of defect groups of $p$-blocks, 
\item  some tables of element centralizers, 
\item  some tables of Sylow $p$-subgroups, 
\item  and a few other tables, e.{\nobreakspace}g.{\nobreakspace}\texttt{W(F4)}  
\end{itemize}
 

 \emph{Note} that class fusions stored on library tables are not guaranteed to be
compatible for any two subgroups of a group and their intersection, and they
are not guaranteed to be consistent
w.{\nobreakspace}r.{\nobreakspace}t.{\nobreakspace}the composition of maps. }

  
\subsection{\textcolor{Chapter }{Brauer Tables}}\label{subsec:contents-modular}
\logpage{[ 4, 1, 2 ]}
\hyperdef{L}{X7AD048607A08C6FF}{}
{
  The library contains all tables of the \textsf{Atlas} of Brauer Tables (\cite{JLPW95}), and many other Brauer tables of bicyclic extensions of simple groups which
are known yet. The Brauer tables in the library contain the information 
\begin{verbatim}  
  origin: modular ATLAS of finite groups
\end{verbatim}
 in their \texttt{InfoText} (\textbf{Reference: InfoText}) string. }

 }

  
\section{\textcolor{Chapter }{Generic Character Tables}}\label{sec:generictables}
\logpage{[ 4, 2, 0 ]}
\hyperdef{L}{X81E3F9A384365282}{}
{
  \index{character tables!generic} \index{tables!generic} \index{library tables!generic} \index{spin groups!character table} \index{symmetric groups!character table} \index{alternating groups!character table} \index{dihedral groups!character table} \index{Suzuki groups!character table} \index{Weyl groups!character table} \index{cyclic groups!character table} Generic character tables provide a means for writing down the character tables
of all groups in a (usually infinite) series of similar groups,
e.{\nobreakspace}g., cyclic groups, or symmetric groups, or the general linear
groups GL$(2,q)$ where $q$ ranges over certain prime powers. 

 Let $\{ G_q | q \in I \}$ be such a series, where $I$ is an index set. The character table of one fixed member $G_q$ could be computed using a function that takes $q$ as only argument and constructs the table of $G_q$. It is, however, often desirable to compute not only the whole table but to
access just one specific character, or to compute just one character value,
without computing the whole character table. 

 For example, both the conjugacy classes and the irreducible characters of the
symmetric group $S_n$ are in bijection with the partitions of $n$. Thus for given $n$ it makes sense to ask for the character corresponding to a particular
partition, or just for its character value at another partition. 

 A generic character table in \textsf{GAP} allows one such local evaluations. In this sense, \textsf{GAP} can deal also with character tables that are too big to be computed and stored
as a whole. 

 Currently the only operations for generic tables supported by \textsf{GAP} are the specialisation of the parameter $q$ in order to compute the whole character table of $G_q$, and local evaluation (see{\nobreakspace}\texttt{ClassParameters} (\textbf{Reference: ClassParameters}) for an example). \textsf{GAP} does \emph{not} support the computation of, e.{\nobreakspace}g., generic scalar products. 

 While the numbers of conjugacy classes for the members of a series of groups
are usually not bounded, there is always a fixed finite number of \emph{types} (equivalence classes) of conjugacy classes; very often the equivalence
relation is isomorphism of the centralizers of the representatives. 

 For each type $t$ of classes and a fixed $q \in I$, a \emph{parametrisation} of the classes in $t$ is a function that assigns to each conjugacy class of $G_q$ in $t$ a \emph{parameter} by which it is uniquely determined. Thus the classes are indexed by pairs $[t,p_t]$ consisting of a type $t$ and a parameter $p_t$ for that type. 

 For any generic table, there has to be a fixed number of types of irreducible
characters of $G_q$, too. Like the classes, the characters of each type are parametrised. 

 In \textsf{GAP}, the parametrisations of classes and characters for tables computed from
generic tables is stored using the attributes \texttt{ClassParameters} (\textbf{Reference: ClassParameters}) and \texttt{CharacterParameters} (\textbf{Reference: CharacterParameters}).  
\subsection{\textcolor{Chapter }{Available generic character tables}}\label{subsec:generictablesavailable}
\logpage{[ 4, 2, 1 ]}
\hyperdef{L}{X78CD9A2D8680506B}{}
{
  Currently, generic tables of the following groups {\textendash}in alphabetical
order{\textendash} are available in \textsf{GAP}. (A list of the names of generic tables known to \textsf{GAP} is \texttt{LIBTABLE.GENERIC.firstnames}.) We list the function calls needed to get a specialized table, the generic
table itself can be accessed by calling \texttt{CharacterTable} (\textbf{Reference: CharacterTable}) with the first argument only; for example, \texttt{CharacterTable( "Cyclic" )} yields the generic table of cyclic groups. 
\begin{description}
\item[{\texttt{CharacterTable( "Alternating", }$n$\texttt{ )}}]  the table of the \emph{alternating} group on $n$ letters, 
\item[{\texttt{CharacterTable( "Cyclic", }$n$\texttt{ )}}]  the table of the \emph{cyclic} group of order $n$, 
\item[{\texttt{CharacterTable( "Dihedral", }$2n$\texttt{ )}}]  the table of the \emph{dihedral} group of order $2n$, 
\item[{\texttt{CharacterTable( "DoubleCoverAlternating", }$n$\texttt{ )}}]  the table of the \emph{Schur double cover of the alternating} group on $n$ letters (see{\nobreakspace}\cite{Noe02}), 
\item[{\texttt{CharacterTable( "DoubleCoverSymmetric", }$n$\texttt{ )}}]  the table of the \emph{standard Schur double cover of the symmetric} group on $n$ letters (see{\nobreakspace}\cite{Noe02}), 
\item[{\texttt{CharacterTable( "GL", 2, }$q$\texttt{ )}}]  the table of the \emph{general linear} group \texttt{GL(2,}$q$\texttt{)}, for a prime power $q$, 
\item[{\texttt{CharacterTable( "GU", 3, }$q$\texttt{ )}}]  the table of the \emph{general unitary} group \texttt{GU(3,}$q$\texttt{)}, for a prime power $q$, 
\item[{\texttt{CharacterTable( "P:Q", }$[ p, q ]$\texttt{ )} and \texttt{CharacterTable( "P:Q", }$[ p, q, k ]$\texttt{ )}}]  the table of the \emph{Frobenius extension} of the nontrivial cyclic group of odd order $p$ by the nontrivial cyclic group of order $q$ where $q$ divides $p_i-1$ for all prime divisors $p_i$ of $p$; if $p$ is a prime power then $q$ determines the group uniquely and thus the first version can be used,
otherwise the action of the residue class of $k$ modulo $p$ is taken for forming orbits of length $q$ each on the nonidentity elements of the group of order $p$, 
\item[{\texttt{CharacterTable( "PSL", 2, }$q$\texttt{ )}}]  the table of the \emph{projective special linear} group \texttt{PSL(2,}$q$\texttt{)}, for a prime power $q$, 
\item[{\texttt{CharacterTable( "SL", 2, }$q$\texttt{ )}}]  the table of the \emph{special linear} group \texttt{SL(2,}$q$\texttt{)}, for a prime power $q$, 
\item[{\texttt{CharacterTable( "SU", 3, }$q$\texttt{ )}}]  the table of the \emph{special unitary} group \texttt{SU(3,}$q$\texttt{)}, for a prime power $q$, 
\item[{\texttt{CharacterTable( "Suzuki", }$q$\texttt{ )}}]  the table of the \emph{Suzuki} group \texttt{Sz(}$q$\texttt{)} $= {}^2B_2(q)$, for $q$ an odd power of $2$, 
\item[{\texttt{CharacterTable( "Symmetric", }$n$\texttt{ )}}]  the table of the \emph{symmetric} group on $n$ letters, 
\item[{\texttt{CharacterTable( "WeylB", }$n$\texttt{ )}}]  the table of the \emph{Weyl} group of type $B_n$, 
\item[{\texttt{CharacterTable( "WeylD", }$n$\texttt{ )}}]  the table of the \emph{Weyl} group of type $D_n$. 
\end{description}
 In addition to the above calls that really use generic tables, the following
calls to \texttt{CharacterTable} (\textbf{Reference: CharacterTable}) are to some extent ``generic'' constructions. But note that no local evaluation is possible in these cases,
as no generic table object exists in \textsf{GAP} that can be asked for local information. 
\begin{description}
\item[{\texttt{CharacterTable( "Quaternionic", }$4n$\texttt{ )}}]  the table of the \emph{generalized quaternionic} group of order $4n$, 
\item[{\texttt{CharacterTableWreathSymmetric( tbl, }$n$\texttt{ )}}]  the character table of the wreath product of the group whose table is \texttt{tbl} with the symmetric group on $n$ letters, see{\nobreakspace}\texttt{CharacterTableWreathSymmetric} (\textbf{Reference: CharacterTableWreathSymmetric}). 
\end{description}
 }

 

\subsection{\textcolor{Chapter }{CharacterTableSpecialized}}
\logpage{[ 4, 2, 2 ]}\nobreak
\hyperdef{L}{X78DA225F78F381C9}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{CharacterTableSpecialized({\mdseries\slshape gentbl, q})\index{CharacterTableSpecialized@\texttt{CharacterTableSpecialized}}
\label{CharacterTableSpecialized}
}\hfill{\scriptsize (function)}}\\


 For a record \mbox{\texttt{\mdseries\slshape gentbl}} representing a generic character table, and a parameter value \mbox{\texttt{\mdseries\slshape q}}, \texttt{CharacterTableSpecialized} returns a character table object computed by evaluating \mbox{\texttt{\mdseries\slshape gentbl}} at \mbox{\texttt{\mdseries\slshape q}}. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@c5:= CharacterTableSpecialized( CharacterTable( "Cyclic" ), 5 );|
  CharacterTable( "C5" )
  !gapprompt@gap>| !gapinput@Display( c5 );|
  C5
  
       5  1  1  1  1  1
  
         1a 5a 5b 5c 5d
      5P 1a 1a 1a 1a 1a
  
  X.1     1  1  1  1  1
  X.2     1  A  B /B /A
  X.3     1  B /A  A /B
  X.4     1 /B  A /A  B
  X.5     1 /A /B  B  A
  
  A = E(5)
  B = E(5)^2
\end{Verbatim}
 

 (Also \texttt{CharacterTable( "Cyclic", 5 )} could have been used to construct the above table.) 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@HasClassParameters( c5 );  HasCharacterParameters( c5 );|
  true
  true
  !gapprompt@gap>| !gapinput@ClassParameters( c5 );  CharacterParameters( c5 );|
  [ [ 1, 0 ], [ 1, 1 ], [ 1, 2 ], [ 1, 3 ], [ 1, 4 ] ]
  [ [ 1, 0 ], [ 1, 1 ], [ 1, 2 ], [ 1, 3 ], [ 1, 4 ] ]
  !gapprompt@gap>| !gapinput@ClassParameters( CharacterTable( "Symmetric", 3 ) );|
  [ [ 1, [ 1, 1, 1 ] ], [ 1, [ 2, 1 ] ], [ 1, [ 3 ] ] ]
\end{Verbatim}
 

 Here are examples for the ``local evaluation'' of generic character tables, first a character value of the cyclic group shown
above, then a character value and a representative order of a symmetric group. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@CharacterTable( "Cyclic" ).irreducibles[1][1]( 5, 2, 3 );|
  E(5)
  !gapprompt@gap>| !gapinput@tbl:= CharacterTable( "Symmetric" );;|
  !gapprompt@gap>| !gapinput@tbl.irreducibles[1][1]( 5, [ 3, 2 ], [ 2, 2, 1 ] );|
  1
  !gapprompt@gap>| !gapinput@tbl.orders[1]( 5, [ 2, 1, 1, 1 ] );|
  2
\end{Verbatim}
 }

  
\subsection{\textcolor{Chapter }{Components of generic character tables}}\label{subsec:generictablecomponents}
\logpage{[ 4, 2, 3 ]}
\hyperdef{L}{X7C2CB9E07990B63D}{}
{
  Any generic table in \textsf{GAP} is represented by a record. The following components are supported for generic
character table records. 
\begin{description}
\item[{\texttt{centralizers}}]  list of functions, one for each class type $t$, with arguments $q$ and $p_t$, returning the centralizer order of the class $[t,p_t]$, 
\item[{\texttt{charparam}}]  list of functions, one for each character type $t$, with argument $q$, returning the list of character parameters of type $t$, 
\item[{\texttt{classparam}}]  list of functions, one for each class type $t$, with argument $q$, returning the list of class parameters of type $t$, 
\item[{\texttt{classtext}}]  list of functions, one for each class type $t$, with arguments $q$ and $p_t$, returning a representative of the class with parameter $[t,p_t]$ (note that this element need \emph{not} actually lie in the group in question, for example it may be a diagonal matrix
but the characteristic polynomial in the group s irreducible), 
\item[{\texttt{domain}}]  function of $q$ returning \texttt{true} if $q$ is a valid parameter, and \texttt{false} otherwise, 
\item[{\texttt{identifier}}]  identifier string of the generic table, 
\item[{\texttt{irreducibles}}]  list of list of functions, in row $i$ and column $j$ the function of three arguments, namely $q$ and the parameters $p_t$ and $p_s$ of the class type $t$ and the character type $s$, 
\item[{\texttt{isGenericTable}}]  always \texttt{true} 
\item[{\texttt{libinfo}}]  record with components \texttt{firstname} (\texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of the table) and \texttt{othernames} (list of other admissible names) 
\item[{\texttt{matrix}}]  function of $q$ returning the matrix of irreducibles of $G_q$, 
\item[{\texttt{orders}}]  list of functions, one for each class type $t$, with arguments $q$ and $p_t$, returning the representative order of elements of type $t$ and parameter $p_t$, 
\item[{\texttt{powermap}}]  list of functions, one for each class type $t$, each with three arguments $q$, $p_t$, and $k$, returning the pair $[s,p_s]$ of type and parameter for the $k$-th power of the class with parameter $[t,p_t]$, 
\item[{\texttt{size}}]  function of $q$ returning the order of $G_q$, 
\item[{\texttt{specializedname}}]  function of $q$ returning the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of the table of $G_q$, 
\item[{\texttt{text}}]  string informing about the generic table 
\end{description}
 

 In the specialized table, the \texttt{ClassParameters} (\textbf{Reference: ClassParameters}) and \texttt{CharacterParameters} (\textbf{Reference: CharacterParameters}) values are the lists of parameters $[t,p_t]$ of classes and characters, respectively. 

 If the \texttt{matrix} component is present then its value implements a method to compute the
complete table of small members $G_q$ more efficiently than via local evaluation; this method will be called when
the generic table is used to compute the whole character table for a given $q$ (see{\nobreakspace}\texttt{CharacterTableSpecialized} (\ref{CharacterTableSpecialized})). }

  
\subsection{\textcolor{Chapter }{Example: The generic table of cyclic groups}}\label{subsec:generictableCn}
\logpage{[ 4, 2, 4 ]}
\hyperdef{L}{X7D693E9787073E30}{}
{
  For the cyclic group $C_q = \langle x \rangle$ of order $q$, there is one type of classes. The class parameters are integers $k \in \{ 0, \ldots, q-1 \}$, the class with parameter $k$ consists of the group element $x^k$. Group order and centralizer orders are the identity function $q \mapsto q$, independent of the parameter $k$. The representative order function maps the parameter pair $[q,k]$ to $q / \gcd(q,k)$, which is the order of $x^k$ in $C_q$; the $p$-th power map is the function mapping the triple $(q,k,p)$ to the parameter $[1,(kp \bmod q)]$. 

 There is one type of characters, with parameters $l \in \{ 0, \ldots, q-1 \}$; for $e_q$ a primitive complex $q$-th root of unity, the character values are $\chi_l(x^k) = e_q^{kl}$. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@Print( CharacterTable( "Cyclic" ), "\n" );|
  rec(
    centralizers := [ function ( n, k )
              return n;
          end ],
    charparam := [ function ( n )
              return [ 0 .. n - 1 ];
          end ],
    classparam := [ function ( n )
              return [ 0 .. n - 1 ];
          end ],
    domain := <Category "(IsInt and IsPosRat)">,
    identifier := "Cyclic",
    irreducibles := [ [ function ( n, k, l )
                  return E( n ) ^ (k * l);
              end ] ],
    isGenericTable := true,
    libinfo := rec(
        firstname := "Cyclic",
        othernames := [  ] ),
    orders := [ function ( n, k )
              return n / Gcd( n, k );
          end ],
    powermap := [ function ( n, k, pow )
              return [ 1, k * pow mod n ];
          end ],
    size := function ( n )
          return n;
      end,
    specializedname := function ( q )
          return Concatenation( "C", String( q ) );
      end,
    text := "generic character table for cyclic groups" )
\end{Verbatim}
 }

  
\subsection{\textcolor{Chapter }{Example: The generic table of the general linear group GL$(2,q)$ }}\label{subsec:generictableGL2}
\logpage{[ 4, 2, 5 ]}
\hyperdef{L}{X81231BCE79486FA3}{}
{
  We have four types $t_1, t_2, t_3, t_4$ of classes, according to the rational canonical form of the elements. $t_1$ describes scalar matrices, $t_2$ nonscalar diagonal matrices, $t_3$ companion matrices of $(X - \rho)^2$ for nonzero elements $\rho \in F_q$, and $t_4$ companion matrices of irreducible polynomials of degree $2$ over $F_q$. 

 The sets of class parameters of the types are in bijection with nonzero
elements in $F_q$ for $t_1$ and $t_3$, with the set 
\[ \{ \{ \rho, \tau \}; \rho, \tau \in F_q, \rho {{\not=}} 0, \tau {{\not=}} 0, \rho {{\not=}} \tau \} \]
 for $t_2$, and with the set $\{ \{ \epsilon, \epsilon^q \}; \epsilon \in F_{{q^2}} \setminus F_q \}$ for $t_4$. 

 The centralizer order functions are $q \mapsto (q^2-1)(q^2-q)$ for type $t_1$, $q \mapsto (q-1)^2$ for type $t_2$, $q \mapsto q(q-1)$ for type $t_3$, and $q \mapsto q^2-1$ for type $t_4$. 

 The representative order function of $t_1$ maps $(q, \rho)$ to the order of $\rho$ in $F_q$, that of $t_2$ maps $(q, \{ \rho, \tau \})$ to the least common multiple of the orders of $\rho$ and $\tau$. 

 The file contains something similar to the following table. 

 
\begin{Verbatim}[fontsize=\small,frame=single,label=]
  rec(
  identifier := "GL2",
  specializedname := ( q -> Concatenation( "GL(2,", String(q), ")" ) ),
  size := ( q -> (q^2-1)*(q^2-q) ),
  text := "generic character table of GL(2,q), see Robert Steinberg: ...",
  centralizers := [ function( q, k ) return (q^2-1) * (q^2-q); end,
                    ..., ..., ... ],
  classparam := [ ( q -> [ 0 .. q-2 ] ), ..., ..., ... ],
  charparam := [ ( q -> [ 0 .. q-2 ] ), ..., ..., ... ],
  powermap := [ function( q, k, pow ) return [ 1, (k*pow) mod (q-1) ]; end,
                ..., ..., ... ],
  orders:= [ function( q, k ) return (q-1)/Gcd( q-1, k ); end,
             ..., ..., ... ],
  irreducibles := [ [ function( q, k, l ) return E(q-1)^(2*k*l); end,
                      ..., ..., ... ],
                    [ ..., ..., ..., ... ],
                    [ ..., ..., ..., ... ],
                    [ ..., ..., ..., ... ] ],
  classtext := [ ..., ..., ..., ... ],
  domain := IsPrimePowerInt,
  isGenericTable := true )
\end{Verbatim}
 }

 }

  
\section{\textcolor{Chapter }{\textsf{Atlas} Tables}}\label{sec:ATLAS Tables}
\logpage{[ 4, 3, 0 ]}
\hyperdef{L}{X7F44BD4B79473085}{}
{
  \index{character tables!ATLAS} \index{tables!library} \index{library of character tables} The \textsf{GAP} character table library contains all character tables of bicyclic extensions
of simple groups that are included in the \textsf{Atlas} of Finite Groups (\cite{CCN85}, from now on called \textsf{Atlas}), and the Brauer tables contained in the \textsf{Atlas} of Brauer Characters (\cite{JLPW95}). 

 These tables have the information 
\begin{verbatim}  
  origin: ATLAS of finite groups
\end{verbatim}
 or 
\begin{verbatim}  
  origin: modular ATLAS of finite groups
\end{verbatim}
 in their \texttt{InfoText} (\textbf{Reference: InfoText}) value, they are simply called \textsf{Atlas} tables further on. 

 For displaying \textsf{Atlas} tables with the row labels used in the \textsf{Atlas}, or for displaying decomposition matrices, see{\nobreakspace}\texttt{LaTeXStringDecompositionMatrix} (\textbf{Reference: LaTeXStringDecompositionMatrix}) and{\nobreakspace}\texttt{AtlasLabelsOfIrreducibles} (\ref{AtlasLabelsOfIrreducibles}). 

 In addition to the information given in Chapters{\nobreakspace}6
to{\nobreakspace}8 of the \textsf{Atlas} which tell you how to read the printed tables, there are some rules relating
these to the corresponding \textsf{GAP} tables.  
\subsection{\textcolor{Chapter }{Improvements to the \textsf{Atlas}}}\label{subsec:Improvements}
\logpage{[ 4, 3, 1 ]}
\hyperdef{L}{X7CC608CD8690F9B1}{}
{
  For the \textsf{GAP} Character Table Library not the printed versions of the \textsf{Atlas} of Finite Groups and the \textsf{Atlas} of Brauer Characters are relevant but the revised versions given by the
currently three lists of improvements that are maintained by Simon Norton. The
first such list is contained in{\nobreakspace}\cite{BN95}, and is printed in the Appendix of{\nobreakspace}\cite{JLPW95}; it contains the improvements that had been known until the ``\textsf{Atlas} of Brauer Characters'' was published. The second list contains the improvements to the \textsf{Atlas} of Finite Groups that were found since the publication of{\nobreakspace}\cite{JLPW95}. It can be found in the internet, an HTML version at 

 \href{http://web.mat.bham.ac.uk/atlas/html/atlasmods.html} {\texttt{http://web.mat.bham.ac.uk/atlas/html/atlasmods.html}} 

 and a DVI version at 

 \href{http://web.mat.bham.ac.uk/atlas/html/atlasmods.dvi} {\texttt{http://web.mat.bham.ac.uk/atlas/html/atlasmods.dvi}}.  

 The third list contains the improvements to the \textsf{Atlas} of Brauer Characters, HTML and PDF versions can be found in the internet at 

 \href{https://www.math.rwth-aachen.de/~MOC/ABCerr.html} {\texttt{https://www.math.rwth-aachen.de/\texttt{\symbol{126}}MOC/ABCerr.html}} 

 and 

 \href{https://www.math.rwth-aachen.de/~MOC/ABCerr.pdf} {\texttt{https://www.math.rwth-aachen.de/\texttt{\symbol{126}}MOC/ABCerr.pdf}}, 

 respectively. 

 Also some tables are regarded as \textsf{Atlas} tables that are not printed in the \textsf{Atlas} but available in \textsf{Atlas} format, according to the lists of improvements mentioned above. Currently
these are the tables related to $L_2(49)$, $L_2(81)$, $L_6(2)$, $O_8^-(3)$, $O_8^+(3)$, $S_{10}(2)$, and ${}^2E_6(2).3$. }

  
\subsection{\textcolor{Chapter }{Power Maps}}\label{subsec:Power Maps}
\logpage{[ 4, 3, 2 ]}
\hyperdef{L}{X7FED949A86575949}{}
{
  For the tables of $3.McL$, $3_2.U_4(3)$ and its covers, and $3_2.U_4(3).2_3$ and its covers, the power maps are not uniquely determined by the information
from the \textsf{Atlas} but determined only up to matrix automorphisms (see{\nobreakspace}\texttt{MatrixAutomorphisms} (\textbf{Reference: MatrixAutomorphisms})) of the irreducible characters. In these cases, the first possible map
according to lexicographical ordering was chosen, and the automorphisms are
listed in the \texttt{InfoText} (\textbf{Reference: InfoText}) strings of the tables. }

  
\subsection{\textcolor{Chapter }{Projective Characters and Projections}}\label{subsec:Projective Characters and Projections}
\logpage{[ 4, 3, 3 ]}
\hyperdef{L}{X824823F47BB6AD6C}{}
{
  If $G$ (or $G.a$) has a nontrivial Schur multiplier then the attribute \texttt{ProjectivesInfo} (\ref{ProjectivesInfo}) of the \textsf{GAP} table object of $G$ (or $G.a$) is set; the \texttt{chars} component of the record in question is the list of values lists of those
faithful projective irreducibles that are printed in the \textsf{Atlas} (so-called \emph{proxy character}), and the \texttt{map} component lists the positions of columns in the covering for which the column
is printed in the \textsf{Atlas} (a so-called \emph{proxy class}, this preimage is denoted by $g_0$ in Chapter{\nobreakspace}7, Section{\nobreakspace}14 of the \textsf{Atlas}). }

  
\subsection{\textcolor{Chapter }{Tables of Isoclinic Groups}}\label{subsec:Tables of Isoclinic Groups}
\logpage{[ 4, 3, 4 ]}
\hyperdef{L}{X78732CDF85FB6774}{}
{
  As described in Chapter{\nobreakspace}6, Section{\nobreakspace}7 and in
Chapter{\nobreakspace}7, Section{\nobreakspace}18 of the \textsf{Atlas}, there exist two (often nonisomorphic) groups of structure $2.G.2$ for a simple group $G$, which are isoclinic. The table in the \textsf{GAP} Character Table Library is the one printed in the \textsf{Atlas}, the table of the isoclinic variant can be constructed using \texttt{CharacterTableIsoclinic} (\textbf{Reference: CharacterTableIsoclinic}). }

  
\subsection{\textcolor{Chapter }{Ordering of Characters and Classes}}\label{subsec:Ordering of Characters and Classes}
\logpage{[ 4, 3, 5 ]}
\hyperdef{L}{X7C4B91CD84D5CDCC}{}
{
  (Throughout this section, $G$ always means the simple group involved.) 
\begin{enumerate}
\item  For $G$ itself, the ordering of classes and characters in the \textsf{GAP} table coincides with the one in the \textsf{Atlas}. 
\item  For an automorphic extension $G.a$, there are three types of characters. 
\begin{itemize}
\item  If a character $\chi$ of $G$ extends to $G.a$ then the different extensions $\chi^0, \chi^1, \ldots, \chi^{{a-1}}$ are consecutive in the table of $G.a$ (see \cite[Chapter{\nobreakspace}7, Section{\nobreakspace}16]{CCN85}). 
\item  If some characters of $G$ fuse to give a single character of $G.a$ then the position of that character in the table of $G.a$ is given by the position of the first involved character of $G$. 
\item  If both extension and fusion occur for a character then the resulting
characters are consecutive in the table of $G.a$, and each replaces the first involved character of $G$. 
\end{itemize}
 
\item  Similarly, there are different types of classes for an automorphic extension $G.a$, as follows. 
\begin{itemize}
\item  If some classes collapse then the resulting class replaces the first involved
class of $G$. 
\item  For $a > 2$, any proxy class and its algebraic conjugates that are not printed in the \textsf{Atlas} are consecutive in the table of $G.a$; if more than two classes of $G.a$ have the same proxy class (the only case that actually occurs is for $a = 5$) then the ordering of non-printed classes is the natural one of corresponding
Galois conjugacy operators $*k$ (see \cite[Chapter{\nobreakspace}7, Section{\nobreakspace}19]{CCN85}). 
\item  For $a_1$, $a_2$ dividing $a$ such that $a_1 \leq a_2$, the classes of $G.a_1$ in $G.a$ precede the classes of $G.a_2$ not contained in $G.a_1$. This ordering is the same as in the \textsf{Atlas}, with the only exception $U_3(8).6$. 
\end{itemize}
 
\item  For a central extension $M.G$, there are two different types of characters, as follows. 
\begin{itemize}
\item  Each character can be regarded as a faithful character of a factor group $m.G$, where $m$ divides $M$. Characters with the same kernel are consecutive as in the \textsf{Atlas}, the ordering of characters with different kernels is given by the order of
precedence $1, 2, 4, 3, 6, 12$ for the different values of $m$. 
\item  If $m > 2$, a faithful character of $m.G$ that is printed in the \textsf{Atlas} (a so-called \emph{proxy character}) represents two or more Galois conjugates. In each \textsf{Atlas} table in \textsf{GAP}, a proxy character always precedes the non-printed characters with this
proxy. The case $m = 12$ is the only one that actually occurs where more than one character for a proxy
is not printed. In this case, the non-printed characters are ordered according
to the corresponding Galois conjugacy operators $*5$, $*7$, $*11$ (in this order). 
\end{itemize}
 
\item  For the classes of a central extension we have the following. 
\begin{itemize}
\item  The preimages of a $G$-class in $M.G$ are subsequent, the ordering is the same as that of the lifting order rows in \cite[Chapter{\nobreakspace}7, Section{\nobreakspace}7]{CCN85}. 
\item  The primitive roots of unity chosen to represent the generating central
element (i.{\nobreakspace}e., the element in the second class of the \textsf{GAP} table) are \texttt{E(3)}, \texttt{E(4)}, \texttt{E(6)\texttt{\symbol{94}}5} (\texttt{= E(2)*E(3)}), and \texttt{E(12)\texttt{\symbol{94}}7} (\texttt{= E(3)*E(4)}), for $m = 3$, $4$, $6$, and $12$, respectively. 
\end{itemize}
 
\item  For tables of bicyclic extensions $m.G.a$, both the rules for automorphic and central extensions hold. Additionally we
have the following three rules. 
\begin{itemize}
\item  Whenever classes of the subgroup $m.G$ collapse in $m.G.a$ then the resulting class replaces the first involved class. 
\item  Whenever characters of the subgroup $m.G$ collapse fuse in $m.G.a$ then the result character replaces the first involved character. 
\item  Extensions of a character are subsequent, and the extensions of a proxy
character precede the extensions of characters with this proxy that are not
printed. 
\item  Preimages of a class of $G.a$ in $m.G.a$ are subsequent, and the preimages of a proxy class precede the preimages of
non-printed classes with this proxy. 
\end{itemize}
 
\end{enumerate}
 }

 

\subsection{\textcolor{Chapter }{AtlasLabelsOfIrreducibles}}
\logpage{[ 4, 3, 6 ]}\nobreak
\hyperdef{L}{X7ADC9DC980CF0685}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{AtlasLabelsOfIrreducibles({\mdseries\slshape tbl[, short]})\index{AtlasLabelsOfIrreducibles@\texttt{AtlasLabelsOfIrreducibles}}
\label{AtlasLabelsOfIrreducibles}
}\hfill{\scriptsize (function)}}\\


 Let \mbox{\texttt{\mdseries\slshape tbl}} be the (ordinary or Brauer) character table of a bicyclic extension of a
simple group that occurs in the \textsf{Atlas} of Finite Groups{\nobreakspace}\cite{CCN85} or the \textsf{Atlas} of Brauer Characters{\nobreakspace}\cite{JLPW95}. \texttt{AtlasLabelsOfIrreducibles} returns a list of strings, the $i$-th entry being a label for the $i$-th irreducible character of \mbox{\texttt{\mdseries\slshape tbl}}. 

 The labels have the following form. We state the rules only for ordinary
characters, the rules for Brauer characters are obtained by replacing $\chi$ by $\varphi$. 

 First consider only downward extensions $m.G$ of a simple group $G$. If $m \leq 2$ then only labels of the form $\chi_i$ occur, which denotes the $i$-th ordinary character shown in the \textsf{Atlas}. 

 The labels of faithful ordinary characters of groups $m.G$ with $m \geq 3$ are of the form $\chi_i$, $\chi_i^*$, or $\chi_i^{{*k}}$, which means the $i$-th character printed in the \textsf{Atlas}, the unique character that is not printed and for which $\chi_i$ acts as proxy (see \cite[Chapter{\nobreakspace}7, Sections{\nobreakspace}8 and{\nobreakspace}19]{CCN85}), and the image of the printed character $\chi_i$ under the algebraic conjugacy operator $*k$, respectively. 

 For groups $m.G.a$ with $a > 1$, the labels of the irreducible characters are derived from the labels of the
irreducible constituents of their restrictions to $m.G$, as follows. 

 
\begin{enumerate}
\item  If the ordinary irreducible character $\chi_i$ of $m.G$ extends to $m.G.a$ then the $a^\prime$ extensions are denoted by $\chi_{{i,0}}, \chi_{{i,1}}, \ldots, \chi_{{i,a^\prime}}$, where $\chi_{{i,0}}$ is the character whose values are printed in the \textsf{Atlas}. 
\item  The label $\chi_{{i_1 + i_2 + \cdots + i_a}}$ means that $a$ different characters $\chi_{{i_1}}, \chi_{{i_2}}, \ldots, \chi_{{i_a}}$ of $m.G$ induce to an irreducible character of $m.G.a$ with this label. 

 If either \texttt{true} or the string \texttt{"short"} is entered as the second argument then the label has the short form $\chi_{{i_1+}}$. Note that $i_2, i_3, \ldots, i_a$ can be read off from the fusion signs in the \textsf{Atlas}. 
\item  Finally, the label $\chi_{{i_1,j_1 + i_2,j_2 + \cdots + i_{{a^\prime}},j_{{a^\prime}}}}$ means that the characters $\chi_{{i_1}}, \chi_{{i_2}}, \ldots, \chi_{{i_{{a^\prime}}}}$ of $m.G$ extend to a group that lies properly between $m.G$ and $m.G.a$, and the extensions $\chi_{{i_1, j_1}}, \chi_{{i_2, j_2}}, \ldots
\chi_{{i_{{a^\prime}},j_{{a^\prime}}}}$ induce to an irreducible character of $m.G.a$ with this label. 

 If \texttt{true} or the string \texttt{"short"} was entered as the second argument then the label has the short form $\chi_{{i,j+}}$. 
\end{enumerate}
 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@AtlasLabelsOfIrreducibles( CharacterTable( "3.A7.2" ) );|
  [ "\\chi_{1,0}", "\\chi_{1,1}", "\\chi_{2,0}", "\\chi_{2,1}", 
    "\\chi_{3+4}", "\\chi_{5,0}", "\\chi_{5,1}", "\\chi_{6,0}", 
    "\\chi_{6,1}", "\\chi_{7,0}", "\\chi_{7,1}", "\\chi_{8,0}", 
    "\\chi_{8,1}", "\\chi_{9,0}", "\\chi_{9,1}", "\\chi_{17+17\\ast 2}",
    "\\chi_{18+18\\ast 2}", "\\chi_{19+19\\ast 2}", 
    "\\chi_{20+20\\ast 2}", "\\chi_{21+21\\ast 2}", 
    "\\chi_{22+23\\ast 8}", "\\chi_{22\\ast 8+23}" ]
  !gapprompt@gap>| !gapinput@AtlasLabelsOfIrreducibles( CharacterTable( "3.A7.2" ), "short" );|
  [ "\\chi_{1,0}", "\\chi_{1,1}", "\\chi_{2,0}", "\\chi_{2,1}", 
    "\\chi_{3+}", "\\chi_{5,0}", "\\chi_{5,1}", "\\chi_{6,0}", 
    "\\chi_{6,1}", "\\chi_{7,0}", "\\chi_{7,1}", "\\chi_{8,0}", 
    "\\chi_{8,1}", "\\chi_{9,0}", "\\chi_{9,1}", "\\chi_{17+}", 
    "\\chi_{18+}", "\\chi_{19+}", "\\chi_{20+}", "\\chi_{21+}", 
    "\\chi_{22+}", "\\chi_{23+}" ]
\end{Verbatim}
 }

  
\subsection{\textcolor{Chapter }{Examples of the \textsf{Atlas} Format for \textsf{GAP} Tables}}\label{subsect:explsATLAS}
\logpage{[ 4, 3, 7 ]}
\hyperdef{L}{X827044A37C04C0D1}{}
{
  \index{character tables!CAS} \index{tables!library} \index{library of character tables} We give three little examples for the conventions stated in
Section{\nobreakspace}\ref{sec:ATLAS Tables}, listing both the \textsf{Atlas} format and the table displayed by \textsf{GAP}. 

 First, let $G$ be the trivial group. We consider the cyclic group $C_6$ of order $6$. It can be viewed in several ways, namely 
\begin{itemize}
\item  as a downward extension of the factor group $C_2$ which contains $G$ as a subgroup, or equivalently, as an upward extension of the subgroup $C_3$ which has a factor group isomorphic to $G$: 
\end{itemize}
 

\setlength{\unitlength}{0.1cm}
\begin{picture}(110,67)
\put(8,36){
\begin{picture}(29,29)
\put(0,29){\line(1,0){14}}
\put(0,15){\line(1,0){14}}
\put(0,14){\line(1,0){14}}
\put(0,0){\line(1,0){14}}
\put(15,29){\line(1,0){14}}
\put(15,15){\line(1,0){14}}
\put(15,14){\line(1,0){14}}
\put(15,0){\line(1,0){14}}
\put(0,15){\line(0,1){14}}
\put(0,0){\line(0,1){14}}
\put(14,15){\line(0,1){14}}
\put(15,15){\line(0,1){14}}
\put(29,15){\line(0,1){14}}
\put(14,0){\line(0,1){14}}
\put(15,0){\line(0,1){14}}
\put(29,0){\line(0,1){14}}
\put(7,7){\makebox(0,0){3.G}}
\put(22,7){\makebox(0,0){3.G.2}}
\put(7,22){\makebox(0,0){G}}
\put(22,22){\makebox(0,0){G.2}}
\end{picture}}

\put(50,65){\makebox(0,0)[tl]{
\small\tt
\begin{minipage}{2in}
\baselineskip2.7ex
\parskip0ex

\ \ \ \ ;\ \ \ @\ \ \ ;\ \ \ ;\ \ \ @\ \par
\ \par
\ \ \ \ \ \ \ \ 1\ \ \ \ \ \ \ \ \ \ \ 1\ \par
\ \ p\ power\ \ \ \ \ \ \ \ \ \ \ A\ \par
\ \ p'\ part\ \ \ \ \ \ \ \ \ \ \ A\ \par
\ \ ind\ \ 1A\ fus\ ind\ \ 2A\ \par
\ \par
$\chi_1$\ \ +\ \ \ 1\ \ \ :\ \ ++\ \ \ 1\ \par
\ \par
\ \ ind\ \ \ 1\ fus\ ind\ \ \ 2\ \par
\ \ \ \ \ \ \ \ 3\ \ \ \ \ \ \ \ \ \ \ 6\ \par
\ \ \ \ \ \ \ \ 3\ \ \ \ \ \ \ \ \ \ \ 6\ \par
\ \par
$\chi_2$\ o2\ \ \ 1\ \ \ :\ oo2\ \ \ 1\ 
\end{minipage}}}

\put(99,65){\makebox(0,0)[tl]{
\small\tt
\begin{minipage}{2.2in}
\baselineskip2.7ex
\parskip0ex

\ \ \ 2\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1 \par
\ \ \ 3\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1 \par
\ \par
\ \ \ \ \ \ 1a\ \ 3a\ \ 3b\ \ 2a\ \ 6a\ \ 6b \par
\ \ 2P\ \ 1a\ \ 3b\ \ 3a\ \ 1a\ \ 3b\ \ 3a \par
\ \ 3P\ \ 1a\ \ 1a\ \ 1a\ \ 2a\ \ 2a\ \ 2a \par
\ \par
X.1\ \ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1 \par
X.2\ \ \ \ 1\ \ \ 1\ \ \ 1\ \ -1\ \ -1\ \ -1 \par
X.3\ \ \ \ 1\ \ \ A\ \ /A\ \ \ 1\ \ \ A\ \ /A \par
X.4\ \ \ \ 1\ \ \ A\ \ /A\ \ -1\ \ -A\ -/A \par
X.5\ \ \ \ 1\ \ /A\ \ \ A\ \ \ 1\ \ /A\ \ \ A \par
X.6\ \ \ \ 1\ \ /A\ \ \ A\ \ -1\ -/A\ \ -A \par
\ \par
A\ =\ E(3) \par
\ \ =\ (-1+ER(-3))/2\ =\ b3 \par

\end{minipage}}}
\end{picture}

  
\begin{description}
\item[{}]  \texttt{X.1}, \texttt{X.2} extend $\chi_1$. \texttt{X.3}, \texttt{X.4} extend the proxy character $\chi_2$. \texttt{X.5}, \texttt{X.6} extend the not printed character with proxy $\chi_2$. The classes \texttt{1a}, \texttt{3a}, \texttt{3b} are preimages of \texttt{1A}, and \texttt{2a}, \texttt{6a}, \texttt{6b} are preimages of \texttt{2A}. 
\end{description}
 
\begin{itemize}
\item  as a downward extension of the factor group $C_3$ which contains $G$ as a subgroup, or equivalently, as an upward extension of the subgroup $C_2$ which has a factor group isomorphic to $G$: 
\end{itemize}
 

\begin{picture}(110,67)
\put(8,36){
\begin{picture}(29,29)
\put(0,29){\line(1,0){14}}
\put(0,15){\line(1,0){14}}
\put(0,14){\line(1,0){14}}
\put(0,0){\line(1,0){14}}
\put(15,29){\line(1,0){14}}
\put(15,15){\line(1,0){14}}
\put(15,14){\line(1,0){14}}
\put(15,0){\line(1,0){14}}
\put(0,15){\line(0,1){14}}
\put(0,0){\line(0,1){14}}
\put(14,15){\line(0,1){14}}
\put(15,15){\line(0,1){14}}
\put(29,15){\line(0,1){14}}
\put(14,0){\line(0,1){14}}
\put(15,0){\line(0,1){14}}
\put(29,0){\line(0,1){14}}
\put(7,7){\makebox(0,0){2.G}}
\put(22,7){\makebox(0,0){2.G.3}}
\put(7,22){\makebox(0,0){G}}
\put(22,22){\makebox(0,0){G.3}}
\end{picture}}

\put(50,65){\makebox(0,0)[tl]{
\small\tt
\begin{minipage}{2in}
\baselineskip2.7ex
\parskip0ex

\ \ \ \ ;\ \ \ @\ \ \ ;\ \ \ ;\ \ \ @ \par
\ \par
\ \ \ \ \ \ \ \ 1\ \ \ \ \ \ \ \ \ \ \ 1 \par
\ \ p\ power\ \ \ \ \ \ \ \ \ \ \ A \par
\ \ p'\ part\ \ \ \ \ \ \ \ \ \ \ A \par
\ \ ind\ \ 1A\ fus\ ind\ \ 3A \par
\ \par
$\chi_1$\ \ +\ \ \ 1\ \ \ :\ +oo\ \ \ 1 \par
\ \par
\ \ ind\ \ \ 1\ fus\ ind\ \ \ 3 \par
\ \ \ \ \ \ \ \ 2\ \ \ \ \ \ \ \ \ \ \ 6 \par
\ \par
$\chi_2$\ \ +\ \ \ 1\ \ \ :\ +oo\ \ \ 1 \par
\end{minipage}}}

\put(99,65){\makebox(0,0)[tl]{
\small\tt
\begin{minipage}{2.2in}
\baselineskip2.7ex
\parskip0ex

\ \ \ 2\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1 \par
\ \ \ 3\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1 \par
\ \par
\ \ \ \ \ \ 1a\ \ 2a\ \ 3a\ \ 6a\ \ 3b\ \ 6b \par
\ \ 2P\ \ 1a\ \ 1a\ \ 3b\ \ 3b\ \ 3a\ \ 3a \par
\ \ 3P\ \ 1a\ \ 2a\ \ 1a\ \ 2a\ \ 1a\ \ 2a \par
\ \par
X.1\ \ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1 \par
X.2\ \ \ \ 1\ \ \ 1\ \ \ A\ \ \ A\ \ /A\ \ /A \par
X.3\ \ \ \ 1\ \ \ 1\ \ /A\ \ /A\ \ \ A\ \ \ A \par
X.4\ \ \ \ 1\ \ -1\ \ \ 1\ \ -1\ \ \ 1\ \ -1 \par
X.5\ \ \ \ 1\ \ -1\ \ \ A\ \ -A\ \ /A\ -/A \par
X.6\ \ \ \ 1\ \ -1\ \ /A\ -/A\ \ \ A\ \ -A \par
\ \par
A\ =\ E(3) \par
\ \ =\ (-1+ER(-3))/2\ =\ b3 \par
\end{minipage}}}
\end{picture}

  
\begin{description}
\item[{}]  \texttt{X.1} to \texttt{X.3} extend $\chi_1$, \texttt{X.4} to \texttt{X.6} extend $\chi_2$. The classes \texttt{1a} and \texttt{2a} are preimages of \texttt{1A}, \texttt{3a} and \texttt{6a} are preimages of the proxy class \texttt{3A}, and \texttt{3b} and \texttt{6b} are preimages of the not printed class with proxy \texttt{3A}. 
\end{description}
 
\begin{itemize}
\item  as a downward extension of the factor groups $C_3$ and $C_2$ which have $G$ as a factor group: 
\end{itemize}
 

\begin{picture}(110,120)
\put(8,58){
\begin{picture}(14,59)
\put(0,59){\line(1,0){14}}
\put(0,45){\line(1,0){14}}
\put(0,44){\line(1,0){14}}
\put(0,30){\line(1,0){14}}
\put(0,29){\line(1,0){14}}
\put(0,15){\line(1,0){14}}
\put(0,14){\line(1,0){14}}
\put(0,0){\line(1,0){14}}
\put(0,45){\line(0,1){14}}
\put(0,30){\line(0,1){14}}
\put(0,15){\line(0,1){14}}
\put(0,0){\line(0,1){14}}
\put(14,45){\line(0,1){14}}
\put(14,30){\line(0,1){14}}
\put(14,15){\line(0,1){14}}
\put(14,0){\line(0,1){14}}
\put(7,7){\makebox(0,0){6.G}}
\put(7,22){\makebox(0,0){3.G}}
\put(7,37){\makebox(0,0){2.G}}
\put(7,52){\makebox(0,0){G}}
\end{picture}}

\put(50,117){\makebox(0,0)[tl]{
\small\tt
\begin{minipage}{2in}
\baselineskip2.7ex
\parskip0ex

\ \ \ \ ;\ \ \ @ \par
\ \  \par
\ \ \ \ \ \ \ \ 1 \par
\ \ p\ power \par
\ \ p'\ part \par
\ \ ind\ \ 1A \par
\ \  \par
$\chi_1$\ \ +\ \ \ 1 \par
\ \  \par
\ \ ind\ \ \ 1 \par
\ \ \ \ \ \ \ \ 2 \par
\ \  \par
$\chi_2$\ \ +\ \ \ 1 \par
\ \  \par
\ \ ind\ \ \ 1 \par
\ \ \ \ \ \ \ \ 3 \par
\ \ \ \ \ \ \ \ 3 \par
\ \  \par
$\chi_3$\ o2\ \ \ 1 \par
\ \  \par
\ \ ind\ \ \ 1 \par
\ \ \ \ \ \ \ \ 6 \par
\ \ \ \ \ \ \ \ 3 \par
\ \ \ \ \ \ \ \ 2 \par
\ \ \ \ \ \ \ \ 3 \par
\ \ \ \ \ \ \ \ 6 \par
\ \  \par
$\chi_4$\ o2\ \ \ 1 \par
\end{minipage}}}

\put(99,117){\makebox(0,0)[tl]{
\small\tt
\begin{minipage}{2.2in}
\baselineskip2.7ex
\parskip0ex

\ \ \ 2\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1 \par
\ \ \ 3\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1 \par
\ \par
\ \ \ \ \ \ 1a\ \ 6a\ \ 3a\ \ 2a\ \ 3b\ \ 6b \par
\ \ 2P\ \ 1a\ \ 3a\ \ 3b\ \ 1a\ \ 3a\ \ 3b \par
\ \ 3P\ \ 1a\ \ 2a\ \ 1a\ \ 2a\ \ 1a\ \ 2a \par
\ \par
X.1\ \ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1 \par
X.2\ \ \ \ 1\ \ -1\ \ \ 1\ \ -1\ \ \ 1\ \ -1 \par
X.3\ \ \ \ 1\ \ \ A\ \ /A\ \ \ 1\ \ \ A\ \ /A \par
X.4\ \ \ \ 1\ \ /A\ \ \ A\ \ \ 1\ \ /A\ \ \ A \par
X.5\ \ \ \ 1\ \ -A\ \ /A\ \ -1\ \ \ A\ -/A \par
X.6\ \ \ \ 1\ -/A\ \ \ A\ \ -1\ \ /A\ \ -A \par
\ \par
A\ =\ E(3) \par
\ \ =\ (-1+ER(-3))/2\ =\ b3 \par
\end{minipage}}}
\end{picture}

  
\begin{description}
\item[{}]  \texttt{X.1}, \texttt{X.2} correspond to $\chi_1, \chi_2$, respectively; \texttt{X.3}, \texttt{X.5} correspond to the proxies $\chi_3$, $\chi_4$, and \texttt{X.4}, \texttt{X.6} to the not printed characters with these proxies. The factor fusion onto $3.G$ is given by \texttt{[ 1, 2, 3, 1, 2, 3 ]}, that onto $G.2$ by \texttt{[ 1, 2, 1, 2, 1, 2 ]}. 
\end{description}
 
\begin{itemize}
\item  as an upward extension of the subgroups $C_3$ or $C_2$ which both contain a subgroup isomorphic to $G$: 
\end{itemize}
 

\begin{picture}(110,65)
\put(8,49){
\begin{picture}(59,14)
\put(0,0){\line(1,0){14}}
\put(0,0){\line(0,1){14}}
\put(0,14){\line(1,0){14}}
\put(14,0){\line(0,1){14}}
\put(7,7){\makebox(0,0){G}}
\put(15,0){\line(1,0){14}}
\put(15,0){\line(0,1){14}}
\put(15,14){\line(1,0){14}}
\put(29,0){\line(0,1){14}}
\put(22,7){\makebox(0,0){G.2}}
\put(30,0){\line(1,0){14}}
\put(30,0){\line(0,1){14}}
\put(30,14){\line(1,0){14}}
\put(44,0){\line(0,1){14}}
\put(37,7){\makebox(0,0){G.3}}
\put(45,0){\line(1,0){14}}
\put(45,0){\line(0,1){14}}
\put(45,14){\line(1,0){14}}
\put(59,0){\line(0,1){14}}
\put(52,7){\makebox(0,0){G.6}}
\end{picture}}

\put(8,41){\makebox(0,0)[tl]{
\small\tt
\begin{minipage}{4in}
\baselineskip2.7ex
\parskip0ex

\ \ \ \ ;\ \ \ @\ \ \ ;\ \ \ ;\ \ \ @\ \ \ ;\ \ \ ;\ \ \ @\ \ \ ;\ \ \ \ \ ;\ \ \ @\ \par
\ \par
\ \ \ \ \ \ \ \ 1\ \ \ \ \ \ \ \ \ \ \ 1\ \ \ \ \ \ \ \ \ \ \ 1\ \ \ \ \ \ \ \ \ \ \ \ \ 1\ \par
\ \ p\ power\ \ \ \ \ \ \ \ \ \ \ A\ \ \ \ \ \ \ \ \ \ \ A\ \ \ \ \ \ \ \ \ \ \ \ AA\ \par
\ \ p'\ part\ \ \ \ \ \ \ \ \ \ \ A\ \ \ \ \ \ \ \ \ \ \ A\ \ \ \ \ \ \ \ \ \ \ \ AA\ \par
\ \ ind\ \ 1A\ fus\ ind\ \ 2A\ fus\ ind\ \ 3A\ fus\ \ \ ind\ \ 6A\ \par
\ \par
$\chi_1$\ \ +\ \ \ 1\ \ \ :\ \ ++\ \ \ 1\ \ \ :\ +oo\ \ \ 1\ \ \ :+oo+oo\ \ \ 1\ \par
\end{minipage}}}

\put(103,63){\makebox(0,0)[tl]{
\small\tt
\begin{minipage}{2.2in}
\baselineskip2.7ex
\parskip0ex

\ \ \ 2\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1 \par
\ \ \ 3\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1 \par
\ \par
\ \ \ \ \ \ 1a\ \ 2a\ \ 3a\ \ 3b\ \ 6a\ \ 6b \par
\ \ 2P\ \ 1a\ \ 1a\ \ 3b\ \ 3a\ \ 3b\ \ 3a \par
\ \ 3P\ \ 1a\ \ 2a\ \ 1a\ \ 1a\ \ 2a\ \ 2a \par
\ \par
X.1\ \ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1 \par
X.2\ \ \ \ 1\ \ -1\ \ \ A\ \ /A\ \ -A\ -/A \par
X.3\ \ \ \ 1\ \ \ 1\ \ /A\ \ \ A\ \ /A\ \ \ A \par
X.4\ \ \ \ 1\ \ -1\ \ \ 1\ \ \ 1\ \ -1\ \ -1 \par
X.5\ \ \ \ 1\ \ \ 1\ \ \ A\ \ /A\ \ \ A\ \ /A \par
X.6\ \ \ \ 1\ \ -1\ \ /A\ \ \ A\ -/A\ \ -A \par
\ \par
A\ =\ E(3) \par
\ \ =\ (-1+ER(-3))/2\ =\ b3 \par
\end{minipage}}}
\end{picture}

  
\begin{description}
\item[{}]  The classes \texttt{1a}, \texttt{2a} correspond to $1A$, $2A$, respectively. \texttt{3a}, \texttt{6a} correspond to the proxies $3A$, $6A$, and \texttt{3b}, \texttt{6b} to the not printed classes with these proxies. 
\end{description}
 

 The second example explains the fusion case. Again, $G$ is the trivial group. 

 

\setlength{\unitlength}{0.1cm}
\begin{picture}(110,125)
\put(0,63){
\begin{picture}(29,59)
\put(0,59){\line(1,0){14}}
\put(0,45){\line(1,0){14}}
\put(0,44){\line(1,0){14}}
\put(0,30){\line(1,0){14}}
\put(0,29){\line(1,0){14}}
\put(0,15){\line(1,0){14}}
\put(0,14){\line(1,0){14}}
\put(0,0){\line(1,0){14}}
\put(0,45){\line(0,1){14}}
\put(0,30){\line(0,1){14}}
\put(0,15){\line(0,1){14}}
\put(0,0){\line(0,1){14}}
\put(14,45){\line(0,1){14}}
\put(14,30){\line(0,1){14}}
\put(14,15){\line(0,1){14}}
\put(14,0){\line(0,1){14}}
\put(15,59){\line(1,0){14}}
\put(15,45){\line(1,0){14}}
\put(15,44){\line(1,0){14}}
\put(15,30){\line(1,0){14}}
\put(15,29){\line(1,0){14}}
\put(15,14){\line(1,0){14}}
\put(15,45){\line(0,1){14}}
\put(15,30){\line(0,1){14}}
\put(15,15){\line(0,1){14}}
\put(15,0){\line(0,1){14}}
\put(29,45){\line(0,1){14}}
\put(29,30){\line(0,1){14}}
\put(7,7){\makebox(0,0){6.G}}
\put(7,22){\makebox(0,0){3.G}}
\put(7,37){\makebox(0,0){2.G}}
\put(7,52){\makebox(0,0){G}}
\put(22,7){\makebox(0,0){6.G.2}}
\put(22,22){\makebox(0,0){3.G.2}}
\put(22,37){\makebox(0,0){2.G.2}}
\put(22,52){\makebox(0,0){G.2}}
\end{picture}}

\put(44,122){\makebox(0,0)[tl]{
\small\tt
\begin{minipage}{2in}
\baselineskip2.7ex
\parskip0ex

\ \ \ \ ;\ \ \ @\ \ \ ;\ \ \ ;\ \ @\ \par
\ \ \ \par
\ \ \ \ \ \ \ \ 1\ \ \ \ \ \ \ \ \ \ 1\ \par
\ \ p\ power\ \ \ \ \ \ \ \ \ \ A\ \par
\ \ p'\ part\ \ \ \ \ \ \ \ \ \ A\ \par
\ \ ind\ \ 1A\ fus\ ind\ 2A\ \par
\ \ \ \par
$\chi_1$\ \ +\ \ \ 1\ \ \ :\ \ ++\ \ 1\ \par
\ \ \ \par
\ \ ind\ \ \ 1\ fus\ ind\ \ 2\ \par
\ \ \ \ \ \ \ \ 2\ \ \ \ \ \ \ \ \ \ 2\ \par
\ \ \ \par
$\chi_2$\ \ +\ \ \ 1\ \ \ :\ \ ++\ \ 1\ \par
\ \ \ \par
\ \ ind\ \ \ 1\ fus\ ind\ \ 2\ \par
\ \ \ \ \ \ \ \ 3\ \par
\ \ \ \ \ \ \ \ 3\ \par
\ \ \ \par
$\chi_3$\ o2\ \ \ 1\ \ \ *\ \ \ +\ \par
\ \ \ \par
\ \ ind\ \ \ 1\ fus\ ind\ \ 2\ \par
\ \ \ \ \ \ \ \ 6\ \ \ \ \ \ \ \ \ \ 2\par
\ \ \ \ \ \ \ \ 3\ \par
\ \ \ \ \ \ \ \ 2\ \par
\ \ \ \ \ \ \ \ 3\ \par
\ \ \ \ \ \ \ \ 6\ \par
\ \ \ \par
$\chi_4$\ o2\ \ \ 1\ \ \ *\ \ \ +\ \par
\end{minipage}}}

\put(95,122){\makebox(0,0)[tl]{
\small\tt
\begin{minipage}{2.2in}
\baselineskip2.7ex
\parskip0ex

$3.G.2$ \par
\ \par
\ \ \ 2\ \ \ 1\ \ \ .\ \ \ 1 \par
\ \ \ 3\ \ \ 1\ \ \ 1\ \ \ . \par
\ \par
\ \ \ \ \ \ 1a\ \ 3a\ \ 2a \par
\ \ 2P\ \ 1a\ \ 3a\ \ 1a \par
\ \ 3P\ \ 1a\ \ 1a\ \ 2a \par
\ \par
X.1\ \ \ \ 1\ \ \ 1\ \ \ 1 \par
X.2\ \ \ \ 1\ \ \ 1\ \ -1 \par
X.3\ \ \ \ 2\ \ -1\ \ \ . \par
\ \par
\ 
\ \par
$6.G.2$ \par
\ \par
\ \ \ 2\ \ \ 2\ \ \ 1\ \ \ 1\ \ \ 2\ \ \ 2\ \ \ 2 \par
\ \ \ 3\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ .\ \ \ . \par
\ \par
\ \ \ \ \ \ 1a\ \ 6a\ \ 3a\ \ 2a\ \ 2b\ \ 2c \par
\ \ 2P\ \ 1a\ \ 3a\ \ 3a\ \ 1a\ \ 1a\ \ 1a \par
\ \ 3P\ \ 1a\ \ 2a\ \ 1a\ \ 2a\ \ 2b\ \ 2c \par
\ \par
Y.1\ \ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1 \par
Y.2\ \ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ -1\ \ -1 \par
Y.3\ \ \ \ 1\ \ -1\ \ \ 1\ \ -1\ \ \ 1\ \ -1 \par
Y.4\ \ \ \ 1\ \ -1\ \ \ 1\ \ -1\ \ -1\ \ \ 1 \par
Y.5\ \ \ \ 2\ \ -1\ \ -1\ \ \ 2\ \ \ .\ \ \ . \par
Y.6\ \ \ \ 2\ \ \ 1\ \ -1\ \ -2\ \ \ .\ \ \ . \par

\end{minipage}}}
\end{picture}

  

 The tables of $G$, $2.G$, $3.G$, $6.G$ and $G.2$ are known from the first example, that of $2.G.2$ will be given in the next one. So here we print only the \textsf{GAP} tables of $3.G.2 \cong D_6$ and $6.G.2 \cong D_{12}$. 

 In $3.G.2$, the characters \texttt{X.1}, \texttt{X.2} extend $\chi_1$; $\chi_3$ and its non-printed partner fuse to give \texttt{X.3}, and the two preimages of \texttt{1A} of order $3$ collapse. 

 In $6.G.2$, \texttt{Y.1} to \texttt{Y.4} are extensions of $\chi_1$, $\chi_2$, so these characters are the inflated characters from $2.G.2$ (with respect to the factor fusion \texttt{[ 1, 2, 1, 2, 3, 4 ]}). \texttt{Y.5} is inflated from $3.G.2$ (with respect to the factor fusion \texttt{[ 1, 2, 2, 1, 3, 3 ]}), and \texttt{Y.6} is the result of the fusion of $\chi_4$ and its non-printed partner. 

 For the last example, let $G$ be the elementary abelian group $2^2$ of order $4$. Consider the following tables. 

 

\begin{picture}(110,175)
\put(0,143){
\begin{picture}(29,29)
\put(0,29){\line(1,0){14}}
\put(0,15){\line(1,0){14}}
\put(0,14){\line(1,0){14}}
\put(0,0){\line(1,0){14}}
\put(15,29){\line(1,0){14}}
\put(15,15){\line(1,0){14}}
\put(15,14){\line(1,0){14}}
\put(15,0){\line(1,0){14}}
\put(0,15){\line(0,1){14}}
\put(0,0){\line(0,1){14}}
\put(14,15){\line(0,1){14}}
\put(15,15){\line(0,1){14}}
\put(29,15){\line(0,1){14}}
\put(14,0){\line(0,1){14}}
\put(15,0){\line(0,1){14}}
\put(29,0){\line(0,1){14}}
\put(7,7){\makebox(0,0){2.G}}
\put(22,7){\makebox(0,0){2.G.3}}
\put(7,22){\makebox(0,0){G}}
\put(22,22){\makebox(0,0){G.3}}
\end{picture}}

\put(84.9,116.8){\line(0,1){16.4}}  % fusion sign in picture

\put(39,172){\makebox(0,0)[tl]{
\small\tt
\begin{minipage}{3in}
\baselineskip2.7ex
\parskip0ex

\ \ \ \ ;\ \ \ @\ \ \ @\ \ \ @\ \ \ @\ \ \ ;\ \ \ ;\ \ \ @\ \par
\ \par
\ \ \ \ \ \ \ \ 4\ \ \ 4\ \ \ 4\ \ \ 4\ \ \ \ \ \ \ \ \ \ \ 1\ \par
\ \ p\ power\ \ \ A\ \ \ A\ \ \ A\ \ \ \ \ \ \ \ \ \ \ A\ \par
\ \ p'\ part\ \ \ A\ \ \ A\ \ \ A\ \ \ \ \ \ \ \ \ \ \ A\ \par
\ \ ind\ \ 1A\ \ 2A\ \ 2B\ \ 2C\ fus\ ind\ \ 3A\ \par
\ \par
$\chi_1$\ \ +\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ :\ +oo\ \ \ 1\ \par
\ \par
$\chi_2$\ \ +\ \ \ 1\ \ \ 1\ \ -1\ \ -1\ \ \ .\ \ \ +\ \ \ 0\ \par
\ \par
$\chi_3$\ \ +\ \ \ 1\ \ -1\ \ \ 1\ \ -1\ \ \ .\ \par
\ \par
$\chi_4$\ \ +\ \ \ 1\ \ -1\ \ -1\ \ \ 1\ \ \ .\ \par
\ \par
\ \ ind\ \ \ 1\ \ \ 4\ \ \ 4\ \ \ 4\ fus\ ind\ \ \ 3\ \par
\ \ \ \ \ \ \ \ 2\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 6\ \par
\ \par
$\chi_5$\ \ -\ \ \ 2\ \ \ 0\ \ \ 0\ \ \ 0\ \ \ :\ -oo\ \ \ 1\ \par
\end{minipage}}}

\put(107,172){\makebox(0,0)[tl]{
\small\tt
\begin{minipage}{3in}
\baselineskip2.7ex
\parskip0ex
$G.3$\par
\ \par
\ \ \ 2\ \ \ 2\ \ \ 2\ \ \ .\ \ \ . \par
\ \ \ 3\ \ \ 1\ \ \ .\ \ \ 1\ \ \ 1 \par
\ \par
\ \ \ \ \ \ 1a\ \ 2a\ \ 3a\ \ 3b \par
\ \ 2P\ \ 1a\ \ 1a\ \ 3b\ \ 3a \par
\ \ 3P\ \ 1a\ \ 2a\ \ 1a\ \ 1a \par
\ \par
X.1\ \ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1 \par
X.2\ \ \ \ 1\ \ \ 1\ \ \ A\ \ /A \par
X.3\ \ \ \ 1\ \ \ 1\ \ /A\ \ \ A \par
X.4\ \ \ \ 3\ \ -1\ \ \ .\ \ \ . \par
\ \par
A\ =\ E(3) \par
\ \ =\ (-1+ER(-3))/2\ =\ b3 \par
\end{minipage}}}

\put(0,81){\makebox(0,0)[tl]{
\small\tt
\begin{minipage}{3in}
\baselineskip2.7ex
\parskip0ex
$2.G$\par
\ \par
\ \ \ 2\ \ \ 3\ \ \ 3\ \ \ 2\ \ \ 2\ \ \ 2\par
\ \par
\ \ \ \ \ \ 1a\ \ 2a\ \ 4a\ \ 4b\ \ 4c\par
\ \ 2P\ \ 1a\ \ 1a\ \ 2a\ \ 1a\ \ 1a\par
\ \ 3P\ \ 1a\ \ 2a\ \ 4a\ \ 4b\ \ 4c\par
\ \par
X.1\ \ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\par
X.2\ \ \ \ 1\ \ \ 1\ \ \ 1\ \ -1\ \ -1\par
X.3\ \ \ \ 1\ \ \ 1\ \ -1\ \ \ 1\ \ -1\par
X.4\ \ \ \ 1\ \ \ 1\ \ -1\ \ -1\ \ \ 1\par
X.5\ \ \ \ 2\ \ -2\ \ \ .\ \ \ .\ \ \ .\par
\end{minipage}}}

\put(70,81){\makebox(0,0)[tl]{
\small\tt
\begin{minipage}{3in}
\baselineskip2.7ex
\parskip0ex
$2.G.3$\par
\ \par
\ \ \ 2\ \ \ 3\ \ \ 3\ \ \ 2\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\par
\ \ \ 3\ \ \ 1\ \ \ 1\ \ \ .\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\par
\ \par
\ \ \ \ \ \ 1a\ \ 2a\ \ 4a\ \ 3a\ \ 6a\ \ 3b\ \ 6b\par
\ \ 2P\ \ 1a\ \ 1a\ \ 2a\ \ 3b\ \ 3b\ \ 3a\ \ 3a\par
\ \ 3P\ \ 1a\ \ 2a\ \ 4a\ \ 1a\ \ 2a\ \ 1a\ \ 2a\par
\ \par
X.1\ \ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\par
X.2\ \ \ \ 1\ \ \ 1\ \ \ 1\ \ \ A\ \ \ A\ \ /A\ \ /A\par
X.3\ \ \ \ 1\ \ \ 1\ \ \ 1\ \ /A\ \ /A\ \ \ A\ \ \ A\par
X.4\ \ \ \ 3\ \ \ 3\ \ -1\ \ \ .\ \ \ .\ \ \ .\ \ \ .\par
X.5\ \ \ \ 2\ \ -2\ \ \ .\ \ \ 1\ \ \ 1\ \ \ 1\ \ \ 1\par
X.6\ \ \ \ 2\ \ -2\ \ \ .\ \ \ A\ \ -A\ \ /A\ -/A\par
X.7\ \ \ \ 2\ \ -2\ \ \ .\ \ /A\ -/A\ \ \ A\ \ -A\par
\ \par
A\ =\ E(3) \par
\ \ =\ (-1+ER(-3))/2\ =\ b3 \par
\end{minipage}}}
\end{picture}

  

 In the table of $G.3 \cong A_4$, the characters $\chi_2$, $\chi_3$, and $\chi_4$ fuse, and the classes \texttt{2A}, \texttt{2B} and \texttt{2C} collapse. For getting the table of $2.G \cong Q_8$, one just has to split the class \texttt{2A} and adjust the representative orders. Finally, the table of $2.G.3 \cong SL_2(3)$ is given; the class fusion corresponding to the injection $2.G \hookrightarrow 2.G.3$ is \texttt{[ 1, 2, 3, 3, 3 ]}, and the factor fusion corresponding to the epimorphism $2.G.3 \rightarrow G.3$ is \texttt{[ 1, 1, 2, 3, 3, 4, 4 ]}. }

 }

  
\section{\textcolor{Chapter }{\textsf{CAS} Tables}}\label{sec:CAS Tables}
\logpage{[ 4, 4, 0 ]}
\hyperdef{L}{X7BC3F0B0814D5B67}{}
{
  \index{character tables!CAS} \index{tables!library} \index{library of character tables} One of the predecessors of \textsf{GAP} was \textsf{CAS} (\emph{C}haracter \emph{A}lgorithm \emph{S}ystem, see{\nobreakspace}\cite{NPP84}), which had also a library of character tables. All these character tables
are available in \textsf{GAP} except if stated otherwise in the file \texttt{doc/ctbldiff.pdf}. This sublibrary has been completely revised before it was included in \textsf{GAP}, for example, errors have been corrected and power maps have been completed. 

 Any \textsf{CAS} table is accessible by each of its \textsf{CAS} names (except if stated otherwise in \texttt{doc/ctbldiff.pdf}), that is, the table name or the filename used in \textsf{CAS}. 

 

\subsection{\textcolor{Chapter }{CASInfo}}
\logpage{[ 4, 4, 1 ]}\nobreak
\hyperdef{L}{X786A80A279674E91}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{CASInfo({\mdseries\slshape tbl})\index{CASInfo@\texttt{CASInfo}}
\label{CASInfo}
}\hfill{\scriptsize (attribute)}}\\


 Let \mbox{\texttt{\mdseries\slshape tbl}} be an ordinary character table in the \textsf{GAP} library that was (up to permutations of classes and characters) contained
already in the \textsf{CAS} table library. When one fetches \mbox{\texttt{\mdseries\slshape tbl}} from the library, one does in general not get the original \textsf{CAS} table. Namely, in many cases (mostly \textsf{Atlas} tables, see Section{\nobreakspace}\ref{sec:ATLAS Tables}), the identifier of the table (see{\nobreakspace}\texttt{Identifier} (\textbf{Reference: Identifier for character tables})) as well as the ordering of classes and characters are different for the \textsf{CAS} table and its \textsf{GAP} version. 

 Note that in several cases, the \textsf{CAS} library contains different tables of the same group, in particular these
tables may have different names and orderings of classes and characters. 

 The \texttt{CASInfo} value of \mbox{\texttt{\mdseries\slshape tbl}}, if stored, is a list of records, each describing the relation between \mbox{\texttt{\mdseries\slshape tbl}} and a character table in the \textsf{CAS} library. The records have the components 
\begin{description}
\item[{\texttt{name}}]  the name of the \textsf{CAS} table, 
\item[{\texttt{permchars} and \texttt{permclasses}}]  permutations of the \texttt{Irr} (\textbf{Reference: Irr}) values and the classes of \mbox{\texttt{\mdseries\slshape tbl}}, respectively, that must be applied in order to get the orderings in the
original \textsf{CAS} table, and 
\item[{\texttt{text}}]  the text that was stored on the \textsf{CAS} table (which may contain incorrect statements). 
\end{description}
 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@tbl:= CharacterTable( "m10" );|
  CharacterTable( "A6.2_3" )
  !gapprompt@gap>| !gapinput@HasCASInfo( tbl );|
  true
  !gapprompt@gap>| !gapinput@CASInfo( tbl );|
  [ rec( name := "m10", permchars := (3,5)(4,8,7,6), permclasses := (), 
        text := "names:     m10\norder:     2^4.3^2.5 = 720\nnumber of c\
  lasses: 8\nsource:    cambridge atlas\ncomments:  point stabilizer of \
  mathieu-group m11\ntest:      orth, min, sym[3]\n" ) ]
\end{Verbatim}
 

 The class fusions stored on tables from the \textsf{CAS} library have been computed anew with \textsf{GAP}; the \texttt{text} component of such a fusion record tells if the fusion map is equal to that in
the \textsf{CAS} library, up to the permutation of classes between the table in \textsf{CAS} and its \textsf{GAP} version. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@First( ComputedClassFusions( tbl ), x -> x.name = "M11" );|
  rec( map := [ 1, 2, 3, 4, 5, 4, 7, 8 ], name := "M11", 
    text := "fusion is unique up to table automorphisms,\nthe representa\
  tive is equal to the fusion map on the CAS table" )
\end{Verbatim}
 }

 }

  
\section{\textcolor{Chapter }{Customizations of the \textsf{GAP} Character Table Library}}\label{sec:customize}
\logpage{[ 4, 5, 0 ]}
\hyperdef{L}{X835811C279FB1E56}{}
{
   
\subsection{\textcolor{Chapter }{Installing the \textsf{GAP} Character Table Library}}\label{subsect:install}
\logpage{[ 4, 5, 1 ]}
\hyperdef{L}{X8202ACD57ACD5CAC}{}
{
  To install the package unpack the archive file in a directory in the \texttt{pkg} directory of your local copy of \textsf{GAP}{\nobreakspace}4. This might be the \texttt{pkg} directory of the \textsf{GAP}{\nobreakspace}4 home directory, see Section{\nobreakspace} (\textbf{Reference: Installing a GAP Package}) for details. It is however also possible to keep an additional \texttt{pkg} directory in your private directories, see{\nobreakspace} (\textbf{Reference: GAP Root Directories}). The latter possibility \emph{must} be chosen if you do not have write access to the \textsf{GAP} root directory. 

 The package consists entirely of \textsf{GAP} code, no external binaries need to be compiled. 

 For checking the installation of the package, you should start \textsf{GAP} and call 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@ReadPackage( "ctbllib", "tst/testinst.g" );|
\end{Verbatim}
 

 If the installation is o.{\nobreakspace}k. then \texttt{true} is printed, and the \textsf{GAP} prompt appears again; otherwise the output lines tell you what should be
changed. 

 More testfiles are available in the \texttt{tst} directory of the package. 

 PDF and HTML versions of the package manual are available in the \texttt{doc} directory of the package. }

 
\subsection{\textcolor{Chapter }{Unloading Character Table Data}}\label{subsect:unloadfiles}
\logpage{[ 4, 5, 2 ]}
\hyperdef{L}{X83FA9D6B86150501}{}
{
  \index{user preferences!UnloadCTblLibFiles} Data files from the \textsf{GAP} Character Table Library may be read only once during a \textsf{GAP} session {\textendash}this is efficient but requires memory{\textendash} or the
cached data may be erased as soon as a second data file is to be read
{\textendash}this requires less memory but is usually less efficient. 

 One can choose between these two possibilities via the user preference \texttt{"UnloadCTblLibFiles"} of the \textsf{CTblLib} package, see \texttt{UserPreference} (\textbf{Reference: UserPreference}). The default value of this preference is \texttt{true}, that is, the contents of only one data file is kept in memory. Call \texttt{SetUserPreference( "CTblLib", "UnloadCTblLibFiles", false );} if you want to change this behaviour. }

 
\subsection{\textcolor{Chapter }{Changing the display format of several functions}}\label{subsect:displayfunction}
\logpage{[ 4, 5, 3 ]}
\hyperdef{L}{X7E859C3482F27089}{}
{
  \index{user preferences!DisplayFunction} The way how the functions \texttt{DisplayAtlasContents} (\ref{DisplayAtlasContents}), \texttt{DisplayAtlasInfo} (\textbf{AtlasRep: DisplayAtlasInfo}), \texttt{DisplayAtlasMap} (\ref{DisplayAtlasMap:for the name of a simple group}),  and \texttt{DisplayCTblLibInfo} (\ref{DisplayCTblLibInfo:for a character table}) show tabular information can be customized via the user preference \texttt{"DisplayFunction"} of the \textsf{AtlasRep} package, see Section  (\textbf{AtlasRep: User preference DisplayFunction}). }

 
\subsection{\textcolor{Chapter }{The path for calling \textsf{MAGMA}}}\label{subsect:magmapath}
\logpage{[ 4, 5, 4 ]}
\hyperdef{L}{X7E7132CD831FF419}{}
{
  \index{user preferences!MagmaPath} This preference describes the path for calling \textsf{MAGMA}. An empty string (the default) means that Magma is not available. 

 This preference is used by \texttt{CharacterTableComputedByMagma} (\ref{CharacterTableComputedByMagma}). }

 }

  
\section{\textcolor{Chapter }{Technicalities of the Access to Character Tables from the Library }}\label{sec:technicalities}
\logpage{[ 4, 6, 0 ]}
\hyperdef{L}{X8782716579A1B993}{}
{
  
\subsection{\textcolor{Chapter }{Data Files of the \textsf{GAP} Character Table Library}}\label{subsec:CTblLib data files}
\logpage{[ 4, 6, 1 ]}
\hyperdef{L}{X84E18B0B84F50B1E}{}
{
  The data files of the \textsf{GAP} Character Table Library reside in the \texttt{data} directory of the package \textsf{CTblLib}. 

 The filenames start with \texttt{ct} (for ``character table''), followed by either \texttt{o} (for ``ordinary''), \texttt{b} (for ``Brauer''), or \texttt{g} (for ``generic''), then a description of the contents (up to $5$ characters, e.{\nobreakspace}g., \texttt{alter} for the tables of alternating and related groups), and the suffix \texttt{.tbl}. 

 The file \texttt{ctb}$descr$\texttt{.tbl} contains the known Brauer tables corresponding to the ordinary tables in the
file \texttt{cto}$descr$\texttt{.tbl}. 

 Each data file of the table library is supposed to consist of 
\begin{enumerate}
\item  comment lines, starting with a hash character \texttt{\#} in the first column, 
\item  an assignment to a component of \texttt{LIBTABLE.LOADSTATUS}, at the end of the file, and 
\item  function calls of the form 
\begin{itemize}
\item  \texttt{MBT( }$name, data$\texttt{ )} (``make Brauer table''), 
\item  \texttt{MOT( }$name, data$\texttt{ )} (``make ordinary table''), 
\item  \texttt{ALF( }$from, to, map$\texttt{ )}, \texttt{ALF( }$from, to, map, textlines$\texttt{ )} (``add library fusion''), 
\item  \texttt{ALN( }$name, listofnames$\texttt{ )} (``add library name''), and 
\item  \texttt{ARC( }$name, component, compdata$\texttt{ )} (``add record component''). 
\end{itemize}
 

 Here $name$ must be the identifier value of the ordinary character table corresponding to
the table to which the command refers; $data$ must be a comma separated sequence of \textsf{GAP} objects; $from$ and $to$ must be identifier values of ordinary character tables, $map$ a list of positive integers, $textlines$ and $listofnames$ lists list of strings, $component$ a string, and $compdata$ any \textsf{GAP} object. 

 \texttt{MOT}, \texttt{ALF}, \texttt{ALN}, and \texttt{ARC} occur only in files containing ordinary character tables, and \texttt{MBT} occurs only in files containing Brauer tables. 
\end{enumerate}
 

 Besides the above calls, the data in files containing ordinary and Brauer
tables may contain only the following \textsf{GAP} functions. (Files containing generic character tables may contain calls to
arbitrary \textsf{GAP} library functions.) 

 \texttt{ACM}, \texttt{Concatenation} (\textbf{Reference: concatenation of lists}), \texttt{E} (\textbf{Reference: E}), \texttt{EvalChars}, \texttt{GALOIS}, \texttt{Length} (\textbf{Reference: Length}), \texttt{ShallowCopy} (\textbf{Reference: ShallowCopy}), \texttt{TENSOR}, and \texttt{TransposedMat} (\textbf{Reference: TransposedMat}). 

 The function \texttt{CTblLib.RecomputeTOC} in the file \texttt{gap4/maketbl.g} of the \textsf{CTblLib} package expects the file format described above, and to some extent it checks
this format. 

 The function calls may be continued over several lines of a file. A semicolon
is assumed to be the last character in its line if and only if it terminates a
function call. 

 Names of character tables are strings (see Chapter{\nobreakspace} (\textbf{Reference: Strings and Characters})), i.{\nobreakspace}e., they are enclosed in double quotes; \emph{strings in table library files must not be split over several lines}, because otherwise the function \texttt{CTblLib.RecomputeTOC} may get confused. Additionally, no character table name is allowed to contain
double quotes. 

 There are three different ways how the table data can be stored in the file. 

 
\begin{description}
\item[{Full ordinary tables}]  are encoded by a call to the function \texttt{MOT}, where the arguments correspond to the relevant attribute values; each fusion
into another library table is added by a call to \texttt{ALF}, values to be stored in components of the table object are added with \texttt{ARC}, and admissible names are notified with \texttt{ALN}. The argument of \texttt{MOT} that encodes the irreducible characters is abbreviated as follows. For each
subset of characters that differ just by multiplication with a linear
character or by Galois conjugacy, only the first one is given by its values,
the others are replaced by \texttt{[TENSOR,[i,j]]} (which means that the character is the tensor product of the \texttt{i}-th and the \texttt{j}-th character in the list) or \texttt{[GALOIS,[i,j]]} (which means that the character is obtained from the \texttt{i}-th character by applying \texttt{GaloisCyc( ., j )} to it). 
\item[{Brauer tables}]  are stored relative to the corresponding ordinary tables; attribute values
that can be computed by restricting from the ordinary table to $p$-regular classes are not stored, and instead of the irreducible characters the
files contain (inverses of) decomposition matrices or Brauer trees for the
blocks of nonzero defect. 
\item[{Ordinary construction tables}]  have the attribute \texttt{ConstructionInfoCharacterTable} (\ref{ConstructionInfoCharacterTable}) set, with value a list that contains the name of the construction function
used and the arguments for a call to this function; the function call is
performed by \texttt{CharacterTable} (\textbf{Reference: CharacterTable}) when the table is constructed (\emph{not} when the file containing the table is read). One aim of this mechanism is to
store structured character tables such as tables of direct products and tables
of central extensions of other tables in a compact way, see Chapter \ref{chap:constructions}. 
\end{description}
 }

 

\subsection{\textcolor{Chapter }{LIBLIST}}
\logpage{[ 4, 6, 2 ]}\nobreak
\hyperdef{L}{X84E728FD860CAC0F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{LIBLIST\index{LIBLIST@\texttt{LIBLIST}}
\label{LIBLIST}
}\hfill{\scriptsize (global variable)}}\\


 \textsf{GAP}'s knowledge about the ordinary character tables in the \textsf{GAP} Character Table Library is given by several JSON format files that get
evaluated when the file \texttt{gap4/ctprimar.g} (the ``primary file'' of the character table library) is read. These files can be produced from the
data files, see Section \ref{subsec:CTblLib data files}. 

 The information is stored in the global variable \texttt{LIBLIST}, which is a record with the following components. 

 
\begin{description}
\item[{\texttt{firstnames}}]  the list of \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) values of the ordinary tables, 
\item[{\texttt{files}}]  the list of filenames containing the data of ordinary tables, 
\item[{\texttt{filenames}}]  a list of positive integers, value $j$ at position $i$ means that the table whose identifier is the $i$-th in the \texttt{firstnames} list is contained in the $j$-th file of the \texttt{files} component, 
\item[{\texttt{fusionsource}}]  a list containing at position $i$ the list of names of tables that store a fusion into the table whose
identifier is the $i$-th in the \texttt{firstnames} list, 
\item[{\texttt{allnames}}]  a list of all admissible names of ordinary library tables, 
\item[{\texttt{position}}]  a list that stores at position $i$ the position in \texttt{firstnames} of the identifier of the table with the $i$-th admissible name in \texttt{allnames}, 
\item[{\texttt{simpleinfo}}]  a list of triples $[ m, name, a ]$ describing the tables of simple groups in the library; $name$ is the identifier of the table, $m$\texttt{.}$name$ and $name$\texttt{.}$a$ are admissible names for its Schur multiplier and automorphism group,
respectively, if these tables are available at all, 
\item[{\texttt{sporadicSimple}}]  a list of identifiers of the tables of the $26$ sporadic simple groups, and 
\item[{\texttt{GENERIC}}]  a record with information about generic tables (see Section{\nobreakspace}\ref{sec:generictables}). 
\end{description}
 }

 

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


 is a record with the components 

 
\begin{description}
\item[{\texttt{firstName}}]  the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of the library table for which \mbox{\texttt{\mdseries\slshape tblname}} is an admissible name, and 
\item[{\texttt{fileName}}]  the name of the file in which the table data is stored. 
\end{description}
 

 If no such table exists in the \textsf{GAP} library then \texttt{fail} is returned. 

 If \mbox{\texttt{\mdseries\slshape tblname}} contains the substring \texttt{"mod"} then it is regarded as the name of a Brauer table. In this case the result is
computed from that for the corresponding ordinary table and the
characteristic. So if the ordinary table exists then the result is a record
although the Brauer table in question need not be contained in the \textsf{GAP} library. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@LibInfoCharacterTable( "S5" );|
  rec( fileName := "ctoalter", firstName := "A5.2" )
  !gapprompt@gap>| !gapinput@LibInfoCharacterTable( "S5mod2" );|
  rec( fileName := "ctbalter", firstName := "A5.2mod2" )
  !gapprompt@gap>| !gapinput@LibInfoCharacterTable( "J5" );|
  fail
\end{Verbatim}
 }

 }

  
\section{\textcolor{Chapter }{How to Extend the \textsf{GAP} Character Table Library}}\label{sec:extending}
\logpage{[ 4, 7, 0 ]}
\hyperdef{L}{X78FFDF0F83E7EB0D}{}
{
  \index{library tables!add} \index{tables!add to the library} \textsf{GAP} users may want to extend the character table library in different respects. 

 
\begin{itemize}
\item  Probably the easiest change is to \emph{add new admissible names} to library tables, in order to use these names in calls of \texttt{CharacterTable} (\ref{CharacterTable:for a string}). This can be done using \texttt{NotifyNameOfCharacterTable} (\ref{NotifyNameOfCharacterTable}). 
\item  The next kind of changes is the \emph{addition of new fusions} between library tables. Once a fusion map is known, it can be added to the
library file containing the table of the subgroup, using the format produced
by \texttt{LibraryFusion} (\ref{LibraryFusion}). 
\item  The last kind of changes is the \emph{addition of new character tables} to the \textsf{GAP} character table library. Data files containing tables in library format
(i.{\nobreakspace}e., in the form of calls to \texttt{MOT} or \texttt{MBT}) can be produced using \texttt{PrintToLib} (\ref{PrintToLib}). 

 If you have an ordinary character table in library format which you want to
add to the table library, for example because it shall be accessible via \texttt{CharacterTable} (\ref{CharacterTable:for a string}), you must notify this table, i.{\nobreakspace}e., tell \textsf{GAP} in which file it can be found, and which names shall be admissible for it.
This can be done using \texttt{NotifyCharacterTable} (\ref{NotifyCharacterTable}). 
\end{itemize}
 

\subsection{\textcolor{Chapter }{NotifyNameOfCharacterTable}}
\logpage{[ 4, 7, 1 ]}\nobreak
\hyperdef{L}{X7A3B010A8790DD6E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{NotifyNameOfCharacterTable({\mdseries\slshape firstname, newnames})\index{NotifyNameOfCharacterTable@\texttt{NotifyNameOfCharacterTable}}
\label{NotifyNameOfCharacterTable}
}\hfill{\scriptsize (function)}}\\


 notifies the strings in the list \mbox{\texttt{\mdseries\slshape newnames}} as new admissible names for the library table with \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value \mbox{\texttt{\mdseries\slshape firstname}}. If there is already another library table for which some of these names are
admissible then an error is signaled. 

 \texttt{NotifyNameOfCharacterTable} modifies the global variable \texttt{LIBLIST} (\ref{LIBLIST}). 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@CharacterTable( "private" );|
  fail
  !gapprompt@gap>| !gapinput@NotifyNameOfCharacterTable( "A5", [ "private" ] );|
  !gapprompt@gap>| !gapinput@a5:= CharacterTable( "private" );|
  CharacterTable( "A5" )
\end{Verbatim}
 

 One can notify alternative names for character tables inside data files, using
the function \texttt{ALN} instead of \texttt{NotifyNameOfCharacterTable}. The idea is that the additional names of tables from those files can be
ignored which are controlled by \texttt{CTblLib.RecomputeTOC}. Therefore, \texttt{ALN} is set to \texttt{Ignore} before the file is read with \texttt{CTblLib.ReadTbl}, otherwise \texttt{ALN} is set to \texttt{NotifyNameOfCharacterTable}. }

 

\subsection{\textcolor{Chapter }{LibraryFusion}}
\logpage{[ 4, 7, 2 ]}\nobreak
\hyperdef{L}{X8160EA7C85DCB485}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{LibraryFusion({\mdseries\slshape name, fus})\index{LibraryFusion@\texttt{LibraryFusion}}
\label{LibraryFusion}
}\hfill{\scriptsize (function)}}\\


 For a string \mbox{\texttt{\mdseries\slshape name}} that is an \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of an ordinary character table in the \textsf{GAP} library, and a record \mbox{\texttt{\mdseries\slshape fus}} with the components 
\begin{description}
\item[{\texttt{name}}]  the identifier of the destination table, or this table itself, 
\item[{\texttt{map}}]  the fusion map, a list of image positions, 
\item[{\texttt{text} (optional)}]  a string describing properties of the fusion, and 
\item[{\texttt{specification} (optional)}]  a string or an integer, 
\end{description}
 \texttt{LibraryFusion} returns a string whose printed value can be used to add the fusion in question
to the library file containing the data for the table with identifier \mbox{\texttt{\mdseries\slshape name}}. 

 If \mbox{\texttt{\mdseries\slshape name}} is a character table then its \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value is used as the corresponding string. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@s5:= CharacterTable( "S5" );|
  CharacterTable( "A5.2" )
  !gapprompt@gap>| !gapinput@fus:= PossibleClassFusions( a5, s5 );|
  [ [ 1, 2, 3, 4, 4 ] ]
  !gapprompt@gap>| !gapinput@fusion:= rec( name:= s5, map:= fus[1], text:= "unique" );;|
  !gapprompt@gap>| !gapinput@Print( LibraryFusion( "A5", fusion ) );|
  ALF("A5","A5.2",[1,2,3,4,4],[
  "unique"
  ]);
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{LibraryFusionTblToTom}}
\logpage{[ 4, 7, 3 ]}\nobreak
\hyperdef{L}{X79E06BD67F6BC3A5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{LibraryFusionTblToTom({\mdseries\slshape name, fus})\index{LibraryFusionTblToTom@\texttt{LibraryFusionTblToTom}}
\label{LibraryFusionTblToTom}
}\hfill{\scriptsize (function)}}\\


 For a string \mbox{\texttt{\mdseries\slshape name}} that is an \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of an ordinary character table in the \textsf{GAP} library, and a record \mbox{\texttt{\mdseries\slshape fus}} with the components 
\begin{description}
\item[{\texttt{name}}]  the identifier of the destination table of marks, or this table itself, 
\item[{\texttt{map}}]  the fusion map, a list of image positions, 
\item[{\texttt{text} (optional)}]  a string describing properties of the fusion, and 
\item[{\texttt{perm} (optional)}]  a permutation, 
\end{description}
 \texttt{LibraryFusionTblToTom} returns a string whose printed value can be used to add the fusion in question
to the library file containing the data for the table with identifier \mbox{\texttt{\mdseries\slshape name}}. 

 The meaning of the component \texttt{perm} is as follows. Let \mbox{\texttt{\mdseries\slshape prim}} be the primitive permutation characters obtained by computing the \texttt{PermCharsTom} (\textbf{Reference: PermCharsTom via fusion map}) value of the tables of marks, taking the sublist at the positions in the first
component of the \texttt{MaximalSubgroupsTom} (\textbf{Reference: MaximalSubgroupsTom}) value of the tables of marks, and restricting these lists via the \texttt{map} component. Permuting \mbox{\texttt{\mdseries\slshape prim}} with the \texttt{perm} component via \texttt{Permuted} (\textbf{Reference: Permuted}) yields the list of permutation characters obtained by inducing the trivial
characters of the subgroups given by the \texttt{Maxes} (\ref{Maxes}) value of the character table. If the component \texttt{perm} is not present and if the character table has the attribute \texttt{Maxes} (\ref{Maxes}) set then the two ways of computing the primitive permutation characters yield
the same list. 

 If \mbox{\texttt{\mdseries\slshape name}} is a character table then its \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value is used as the corresponding string. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@tbl:= CharacterTable( "A5" );     |
  CharacterTable( "A5" )
  !gapprompt@gap>| !gapinput@tom:= TableOfMarks( "A5" );|
  TableOfMarks( "A5" )
  !gapprompt@gap>| !gapinput@fus:= PossibleFusionsCharTableTom( tbl, tom );|
  [ [ 1, 2, 3, 5, 5 ] ]
  !gapprompt@gap>| !gapinput@fusion:= rec( name:= tom, map:= fus[1], text:= "unique" );;|
  !gapprompt@gap>| !gapinput@Print( LibraryFusionTblToTom( "A5", fusion ) );|
  ARC("A5","tomfusion",rec(name:="A5",map:=[1,2,3,5,5],text:=[
  "unique"
  ]));
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{PrintToLib}}
\logpage{[ 4, 7, 4 ]}\nobreak
\hyperdef{L}{X780CBC347876A54B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{PrintToLib({\mdseries\slshape file, tbl})\index{PrintToLib@\texttt{PrintToLib}}
\label{PrintToLib}
}\hfill{\scriptsize (function)}}\\


 prints the (ordinary or Brauer) character table \mbox{\texttt{\mdseries\slshape tbl}} in library format to the file \mbox{\texttt{\mdseries\slshape file}}\texttt{.tbl} (or to \mbox{\texttt{\mdseries\slshape file}} if this has already the suffix \texttt{.tbl}). 

 If \mbox{\texttt{\mdseries\slshape tbl}} is an ordinary table then the value of the attribute \texttt{NamesOfFusionSources} (\textbf{Reference: NamesOfFusionSources}) is ignored by \texttt{PrintToLib}, since for library tables this information is extracted from the source files
(see Section \ref{subsec:CTblLib data files}). 

 The names of data files in the \textsf{GAP} Character Table Library begin with \texttt{cto} (for ordinary tables) or \texttt{ctb} (for corresponding Brauer tables), see Section{\nobreakspace}\ref{sec:technicalities}. This is supported also for private extensions of the library, that is, if
the filenames are chosen this way and the ordinary tables in the \texttt{cto} files are notified via \texttt{NotifyCharacterTable} (\ref{NotifyCharacterTable}) then the Brauer tables will be found in the \texttt{ctb} files. Alternatively, if the filenames of the files with the ordinary tables
do not start with \texttt{cto} then \textsf{GAP} expects the corresponding Brauer tables in the same file as the ordinary
tables. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@PrintToLib( "private", a5 );|
\end{Verbatim}
 

 The above command appends the data of the table \texttt{a5} to the file \texttt{private.tbl}; the first lines printed to this file are 

 
\begin{Verbatim}[fontsize=\small,frame=single,label=]
  MOT("A5",
  [
  "origin: ATLAS of finite groups, tests: 1.o.r., pow[2,3,5]"
  ],
  [60,4,3,5,5],
  [,[1,1,3,5,4],[1,2,1,5,4],,[1,2,3,1,1]],
  [[1,1,1,1,1],[3,-1,0,-E(5)-E(5)^4,-E(5)^2-E(5)^3],
  [GALOIS,[2,2]],[4,0,1,-1,-1],[5,1,-1,0,0]],
  [(4,5)]);
  ARC("A5","projectives",["2.A5",[[2,0,-1,E(5)+E(5)^4,E(5)^2+E(5)^3],
  [GALOIS,[1,2]],[4,0,1,-1,-1],[6,0,0,1,1]],]);
  ARC("A5","extInfo",["2","2"]);
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{NotifyCharacterTable}}
\logpage{[ 4, 7, 5 ]}\nobreak
\hyperdef{L}{X79366F797CD02DAF}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{NotifyCharacterTable({\mdseries\slshape firstname, filename, othernames})\index{NotifyCharacterTable@\texttt{NotifyCharacterTable}}
\label{NotifyCharacterTable}
}\hfill{\scriptsize (function)}}\\


 notifies a new ordinary table to the library. This table has \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value \mbox{\texttt{\mdseries\slshape firstname}}, it is contained (in library format, see{\nobreakspace}\texttt{PrintToLib} (\ref{PrintToLib})) in the file with name \mbox{\texttt{\mdseries\slshape filename}} (without suffix \texttt{.tbl}), and the names contained in the list \mbox{\texttt{\mdseries\slshape othernames}} are admissible for it. 

 If the initial part of \mbox{\texttt{\mdseries\slshape filename}} is one of \texttt{\texttt{\symbol{126}}/}, \texttt{/} or \texttt{./} then it is interpreted as an \emph{absolute} path. Otherwise it is interpreted \emph{relative} to the \texttt{data} directory of the \textsf{CTblLib} package. 

 \texttt{NotifyCharacterTable} modifies the global variable \texttt{LIBLIST} (\ref{LIBLIST}) for the current \textsf{GAP} session, after having checked that there is no other library table yet with an
admissible name equal to \mbox{\texttt{\mdseries\slshape firstname}} or contained in \mbox{\texttt{\mdseries\slshape othernames}}. 

 For example, let us change the name \texttt{A5} to \texttt{icos} wherever it occurs in the file \texttt{private.tbl} that was produced above, and then notify the ``new'' table in this file as follows. (The name change is needed because \textsf{GAP} knows already a table with name \texttt{A5} and would not accept to add another table with this name.) 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@NotifyCharacterTable( "icos", "private", [] );|
  !gapprompt@gap>| !gapinput@icos:= CharacterTable( "icos" );|
  CharacterTable( "icos" )
  !gapprompt@gap>| !gapinput@Display( icos );|
  icos
  
       2  2  2  .  .  .
       3  1  .  1  .  .
       5  1  .  .  1  1
  
         1a 2a 3a 5a 5b
      2P 1a 1a 3a 5b 5a
      3P 1a 2a 1a 5b 5a
      5P 1a 2a 3a 1a 1a
  
  X.1     1  1  1  1  1
  X.2     3 -1  .  A *A
  X.3     3 -1  . *A  A
  X.4     4  .  1 -1 -1
  X.5     5  1 -1  .  .
  
  A = -E(5)-E(5)^4
    = (1-ER(5))/2 = -b5
\end{Verbatim}
 

 So the private table is treated as a library table. Note that the table can be
accessed only if it has been notified in the current \textsf{GAP} session. For frequently used private tables, it may be reasonable to put the \texttt{NotifyCharacterTable} statements into your \texttt{gaprc} file (see{\nobreakspace} (\textbf{Reference: The gap.ini and gaprc files})), or into a file that is read via the \texttt{gaprc} file. }

 

\subsection{\textcolor{Chapter }{NotifyCharacterTables}}
\logpage{[ 4, 7, 6 ]}\nobreak
\hyperdef{L}{X8374B5D081F85DBC}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{NotifyCharacterTables({\mdseries\slshape list})\index{NotifyCharacterTables@\texttt{NotifyCharacterTables}}
\label{NotifyCharacterTables}
}\hfill{\scriptsize (function)}}\\


 notifies several new ordinary tables to the library. The argument \mbox{\texttt{\mdseries\slshape list}} must be a dense list in which each entry is a lists of the form \texttt{[ firstname, filename, othernames ]}, with the same meaning as the arguments of \texttt{NotifyCharacterTable} (\ref{NotifyCharacterTable}). }

 }

  
\section{\textcolor{Chapter }{Sanity Checks for the \textsf{GAP} Character Table Library}}\label{sec:CTblLib Sanity Checks}
\logpage{[ 4, 8, 0 ]}
\hyperdef{L}{X7E3235FD7864A672}{}
{
  The fact that the \textsf{GAP} Character Table Library is designed as an open database (see
Chapter{\nobreakspace}\ref{ch:introduction}) makes it especially desirable to have consistency checks available which can
be run automatically whenever new data get added. 

 The file \texttt{tst/testall.g} of the package contains \texttt{Test} (\textbf{Reference: Test}) statements for executing a collection of such sanity checks; one can run them
by calling \texttt{ReadPackage( "CTblLib", "tst/testall.g" )}. If no problem occurs then \textsf{GAP} prints only lines starting with one of the following. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  + Input file:
  + GAP4stones:
\end{Verbatim}
 

 The examples in the package manual form a part of the tests, they are
collected in the file \texttt{tst/docxpl.tst} of the package. 

 The following tests concern only \emph{ordinary} character tables. In all cases, let $tbl$ be the ordinary character table of a group $G$, say. The return value is \texttt{false} if an error occurred, and \texttt{true} otherwise. 

 
\begin{description}
\item[{\texttt{CTblLib.Test.InfoText( }$tbl$\texttt{ )}}]  checks some properties of the \texttt{InfoText} (\textbf{Reference: InfoText}) value of $tbl$, if available. Currently it is not recommended to use this value
programmatically. However, one can rely on the following structure of this
value for tables in the \textsf{GAP} Character Table Library. 

 
\begin{itemize}
\item  The value is a string that consists of \texttt{\texttt{\symbol{92}}n} separated lines. 
\item  If a line of the form ``maximal subgroup of $grpname$'' occurs, where $grpname$ is the name of a character table, then a class fusion from the table in
question to that with name $grpname$ is stored. 
\item  If a line of the form ``$n$th maximal subgroup of $grpname$'' occurs then additionally the name $grpname$\texttt{M}$n$ is admissible for $tbl$. Furthermore, if the table with name $grpname$ has a \texttt{Maxes} (\ref{Maxes}) value then $tbl$ is referenced in position $n$ of this list. 
\end{itemize}
 
\item[{\texttt{CTblLib.Test.RelativeNames( }$tbl$\texttt{[, }$tblname$\texttt{] )}}]  checks some properties of those admissible names for $tbl$ that refer to a related group $H$, say. Let $name$ be an admissible name for the character table of $H$. (In particular, $name$ is not an empty string.) Then the following relative names are considered. 

 
\begin{description}
\item[{$name$\texttt{M}$n$}]  $G$ is isomorphic with the groups in the $n$-th class of maximal subgroups of $H$. An example is \texttt{"M12M1"} for the Mathieu group $M_{11}$. We consider only cases where $name$ does \emph{not} contain the letter \texttt{x}. For example, \texttt{2xM12} denotes the direct product of a cyclic group of order two and the Mathieu
group $M_{12}$ but \emph{not} a maximal subgroup of ``\texttt{2x}''. Similarly, \texttt{3x2.M22M5} denotes the direct product of a cyclic group of order three and a group in the
fifth class of maximal subgroups of $2.M_{22}$ but \emph{not} a maximal subgroup of ``\texttt{3x2.M22}''. 
\item[{$name$\texttt{N}$p$}]  $G$ is isomorphic with the normalizers of the Sylow $p$-subgroups of $H$. An example is \texttt{"M24N2"} for the (self-normalizing) Sylow $2$-subgroup in the Mathieu group $M_{24}$. 
\item[{$name$\texttt{N}$cnam$}]  $G$ is isomorphic with the normalizers of the cyclic subgroups generated by the
elements in the class with the name $cnam$ of $H$. An example is \texttt{"O7(3)N3A"} for the normalizer of an element in the class \texttt{3A} of the simple group $O_7(3)$. 
\item[{$name$\texttt{C}$cnam$}]  $G$ is isomorphic with the groups in the centralizers of the elements in the class
with the name $cnam$ of $H$. An example is \texttt{"M24C2A"} for the centralizer of an element in the class \texttt{2A} in the Mathieu group $M_{24}$. 
\end{description}
 

 In these cases, \texttt{CTblLib.Test.RelativeNames} checks whether a library table with the admissible name $name$ exists and a class fusion to $tbl$ is stored on this table. 

 In the case of Sylow $p$-normalizers, it is also checked whether $G$ contains a normal Sylow $p$-subgroup of the same order as the Sylow $p$-subgroups in $H$. If the normal Sylow $p$-subgroup of $G$ is cyclic then it is also checked whether $G$ is the full Sylow $p$-normalizer in $H$. (In general this information cannot be read off from the character table of $H$). 

 In the case of normalizers (centralizers) of cyclic subgroups, it is also
checked whether $H$ really normalizes (centralizes) a subgroup of the given order, and whether the
class fusion from $tbl$ to the table of $H$ is compatible with the relative name. 

 If the optional argument $tblname$ is given then only this name is tested. If there is only one argument then all
admissible names for $tbl$ are tested. 
\item[{\texttt{CTblLib.Test.FindRelativeNames( }$tbl$\texttt{ )}}]  runs over the class fusions stored on $tbl$. If $tbl$ is the full centralizer/normalizer of a cyclic subgroup in the table to which
the class fusion points then the function proposes to make the corresponding
relative name an admissible name for $tbl$. 
\item[{\texttt{CTblLib.Test.PowerMaps( }$tbl$\texttt{ )}}]  checks whether all $p$-th power maps are stored on $tbl$, for prime divisors $p$ of the order of $G$, and whether they are correct. (This includes the information about
uniqueness of the power maps.) 
\item[{\texttt{CTblLib.Test.TableAutomorphisms( }$tbl$\texttt{ )}}]  checks whether the table automorphisms are stored on $tbl$, and whether they are correct. Also all available Brauer tables of $tbl$ are checked. 
\item[{\texttt{CTblLib.Test.CompatibleFactorFusions( }$tbl$\texttt{ )}}]  checks whether triangles and quadrangles of factor fusions from $tbl$ to other library tables commute (where the entries in the list \texttt{CTblLib.IgnoreFactorFusionsCompatibility} are excluded from the tests), and whether the factor fusions commute with the
actions of corresponding outer automorphisms. 
\item[{\texttt{CTblLib.Test.FactorsModPCore( }$tbl$\texttt{ )}}]  checks, for all those prime divisors $p$ of the order of $G$ such that $G$ is not $p$-solvable, whether the factor fusion to the character table of $G/O_p(G)$ is stored on $tbl$. 

 Note that if $G$ is not $p$-solvable and $O_p(G)$ is nontrivial then we can compute the $p$-modular Brauer table of $G$ if that of the factor group $G/O_p(G)$ is available. The availability of this table is indicated via the availability
of the factor fusion from $tbl$. 
\item[{\texttt{CTblLib.Test.Fusions( }$tbl$\texttt{ )}}]  checks the class fusions that are stored on the table $tbl$: No duplicates shall occur, each subgroup fusion or factor fusion is tested
using \texttt{CTblLib.Test.SubgroupFusion} or \texttt{CTblLib.Test.FactorFusion}, respectively, and a fusion to the table of marks for $tbl$ is tested using \texttt{CTblLib.Test.FusionToTom}. 
\item[{\texttt{CTblLib.Test.Maxes( }$tbl$\texttt{ )}}]  checks for those character tables $tbl$ that have the \texttt{Maxes} (\ref{Maxes}) set whether the character tables with the given names are really available,
that they are ordered w.r.t. non-increasing group order, and that the fusions
into $tbl$ are stored. 
\item[{\texttt{CTblLib.Test.ClassParameters( }$tbl$\texttt{ )}}]  checks the compatibility of class parameters of alternating and symmetric
groups (partitions describing cycle structures), using the underlying group
stored in the corresponding table of marks. 
\item[{\texttt{CTblLib.Test.Constructions( }$tbl$\texttt{ )}}]  checks the \texttt{ConstructionInfoCharacterTable} (\ref{ConstructionInfoCharacterTable}) status for the table $tbl$: If this attribute value is set then tests depending on this value are
executed; if this attribute is not set then it is checked whether a
description of $tbl$ via a construction would be appropriate. 
\item[{\texttt{CTblLib.Test.ExtensionInfo( }$tbl$\texttt{ )}}]  checks whether the attribute \texttt{ExtensionInfoCharacterTable} (\ref{ExtensionInfoCharacterTable}) is known for all nonabelian simple character tables that are not duplicates. 
\item[{\texttt{CTblLib.Test.GroupForGroupInfo( }$tbl$\texttt{ )}}]  checks that the entries in the list returned by \texttt{GroupInfoForCharacterTable} (\ref{GroupInfoForCharacterTable}) fit to the character table $tbl$. 
\end{description}
 

 The following tests concern only \emph{modular} character tables. In all cases, let $modtbl$ be a Brauer character table of a group $G$, say. 

 
\begin{description}
\item[{\texttt{CTblLib.Test.BlocksInfo( }$modtbl$\texttt{ )}}]  checks whether the decomposition matrices of all blocks of the Brauer table $modtbl$ are integral, as well as the inverses of their restrictions to basic sets. 
\item[{\texttt{CTblLib.Test.TensorDecomposition( }$modtbl$\texttt{ )}}]  checks whether the tensor products of irreducible Brauer characters of the
Brauer table $modtbl$ decompose into Brauer characters. 
\item[{\texttt{CTblLib.Test.Indicators( }$modtbl$\texttt{ )}}]  checks the $2$-nd indicators of the Brauer table $modtbl$: The indicator of a Brauer character is zero iff it has at least one nonreal
value. In odd characteristic, the indicator of an irreducible Brauer character
is equal to the indicator of any ordinary irreducible character that contains
it as a constituent, with odd multiplicity. In characteristic two, we test
that all nontrivial real irreducible Brauer characters have even degree, and
that irreducible Brauer characters with indicator $-1$ lie in the principal block. 
\item[{\texttt{CTblLib.Test.FactorBlocks( }$modtbl$\texttt{ )}}]  If the Brauer table $modtbl$ is encoded using references to tables of factor groups then we must make sure
that the irreducible characters of the underlying ordinary table and the
factors in question are sorted compatibly. (Note that we simply take over the
block information about the factors, without applying an explicit mapping.) 
\end{description}
 }

  
\section{\textcolor{Chapter }{Maintenance of the \textsf{GAP} Character Table Library}}\label{sec:CTblLib Maintenance}
\logpage{[ 4, 9, 0 ]}
\hyperdef{L}{X7D24C9D17DAB50D0}{}
{
  It is of course desirable that the information in the \textsf{GAP} Character Table Library is consistent with related data. For example, the
ordering of the classes of maximal subgroups stored in the \texttt{Maxes} (\ref{Maxes}) list of the character table of a group $G$, say, should correspond to the ordering shown for $G$ in the \textsf{Atlas} of Finite Groups \cite{CCN85}, to the ordering of maximal subgroups used for $G$ in the \textsf{AtlasRep}, and to the ordering of maximal subgroups in the table of marks of $G$. The fact that the related data collections are developed independently makes
it difficult to achieve this kind of consistency. Sometimes it is unavoidable
to ``adjust'' data of the \textsf{GAP} Character Table Library to external data. 

 An important issue is the consistency of class fusions. Usually such fusions
are determined only up to table automorphisms, and one candidate can be
chosen. However, other conditions such as known Brauer tables may restrict the
choice. The point is that there are class fusions which predate the
availability of Brauer tables in the Character Table Library (in fact many of
them have been inherited from the table library of the \textsf{CAS} system), but they are not compatible with the Brauer tables. For example,
there are four possible class fusion from $M_{23}$ into $Co_3$, which lie in one orbit under the relevant groups of table automorphisms; two
of these maps are not compatible with the $3$-modular Brauer tables of $M_{23}$ and $Co_3$, and unfortunately the class fusion that was stored on the \textsf{CAS} tables {\textendash}and that was available in version 1.0 of the \textsf{GAP} Character Table Library{\textendash} was one of the \emph{not} compatible maps. One could argue that the class fusion has older rights, and
that the Brauer tables should be adjusted to them, but the Brauer tables are
published in the \textsf{Atlas} of Brauer Characters \cite{JLPW95}, which is an accepted standard. }

 }

    
\chapter{\textcolor{Chapter }{Functions for Character Table Constructions}}\label{chap:constructions}
\logpage{[ 5, 0, 0 ]}
\hyperdef{L}{X7B915AD178236991}{}
{
  The functions described in this chapter deal with the construction of
character tables from other character tables. So they fit to the functions in
Section{\nobreakspace} (\textbf{Reference: Constructing Character Tables from Others}). But since they are used in situations that are typical for the \textsf{GAP} Character Table Library, they are described here. 

 An important ingredient of the constructions is the description of the action
of a group automorphism on the classes by a permutation. In practice, these
permutations are usually chosen from the group of table automorphisms of the
character table in question, see{\nobreakspace}\texttt{AutomorphismsOfTable} (\textbf{Reference: AutomorphismsOfTable}). 

 Section{\nobreakspace}\ref{sec:construc:MGA} deals with groups of the structure $M.G.A$, where the upwards extension $G.A$ acts suitably on the central extension $M.G$. Section{\nobreakspace}\ref{sec:construc:GS3} deals with groups that have a factor group of type $S_3$. Section{\nobreakspace}\ref{sec:construc:GV4} deals with upward extensions of a group by a Klein four group.
Section{\nobreakspace}\ref{sec:construc:V4G} deals with downward extensions of a group by a Klein four group.
Section{\nobreakspace}\ref{sec:construc:preg} describes the construction of certain Brauer tables. Section{\nobreakspace}\ref{sec:construc:cenex} deals with special cases of the construction of character tables of central
extensions from known character tables of suitable factor groups.
Section{\nobreakspace}\ref{sec:construc:functions} documents the functions used to encode certain tables in the \textsf{GAP} Character Table Library. 

 Examples can be found in \cite{CCE} and \cite{Auto}.  
\section{\textcolor{Chapter }{Character Tables of Groups of Structure $M.G.A$}}\label{sec:construc:MGA}
\logpage{[ 5, 1, 0 ]}
\hyperdef{L}{X7C32AA0784A79D53}{}
{
  For the functions in this section, let $H$ be a group with normal subgroups $N$ and $M$ such that $H/N$ is cyclic, $M \leq N$ holds, and such that each irreducible character of $N$ that does not contain $M$ in its kernel induces irreducibly to $H$. (This is satisfied for example if $N$ has prime index in $H$ and $M$ is a group of prime order that is central in $N$ but not in $H$.) Let $G = N/M$ and $A = H/N$, so $H$ has the structure $M.G.A$. For some examples, see \cite{Bre11}. 

\subsection{\textcolor{Chapter }{PossibleCharacterTablesOfTypeMGA}}
\logpage{[ 5, 1, 1 ]}\nobreak
\hyperdef{L}{X78F82DD67E083B88}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{PossibleCharacterTablesOfTypeMGA({\mdseries\slshape tblMG, tblG, tblGA, orbs, identifier})\index{PossibleCharacterTablesOfTypeMGA@\texttt{PossibleCharacterTablesOfTypeMGA}}
\label{PossibleCharacterTablesOfTypeMGA}
}\hfill{\scriptsize (function)}}\\


 Let $H$, $N$, and $M$ be as described at the beginning of the section. 

 Let \mbox{\texttt{\mdseries\slshape tblMG}}, \mbox{\texttt{\mdseries\slshape tblG}}, \mbox{\texttt{\mdseries\slshape tblGA}} be the ordinary character tables of the groups $M.G = N$, $G$, and $G.A = H/M$, respectively, and \mbox{\texttt{\mdseries\slshape orbs}} be the list of orbits on the class positions of \mbox{\texttt{\mdseries\slshape tblMG}} that is induced by the action of $H$ on $M.G$. Furthermore, let the class fusions from \mbox{\texttt{\mdseries\slshape tblMG}} to \mbox{\texttt{\mdseries\slshape tblG}} and from \mbox{\texttt{\mdseries\slshape tblG}} to \mbox{\texttt{\mdseries\slshape tblGA}} be stored on \mbox{\texttt{\mdseries\slshape tblMG}} and \mbox{\texttt{\mdseries\slshape tblG}}, respectively (see{\nobreakspace}\texttt{StoreFusion} (\textbf{Reference: StoreFusion})). 

 \texttt{PossibleCharacterTablesOfTypeMGA} returns a list of records describing all possible ordinary character tables
for groups $H$ that are compatible with the arguments. Note that in general there may be
several possible groups $H$, and it may also be that ``character tables'' are constructed for which no group exists. 

 Each of the records in the result has the following components. 
\begin{description}
\item[{\texttt{table}}]  a possible ordinary character table for $H$, and 
\item[{\texttt{MGfusMGA}}]  the fusion map from \mbox{\texttt{\mdseries\slshape tblMG}} into the table stored in \texttt{table}. 
\end{description}
 The possible tables differ w.{\nobreakspace}r.{\nobreakspace}t. some power
maps, and perhaps element orders and table automorphisms; in particular, the \texttt{MGfusMGA} component is the same in all records. 

 The returned tables have the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value \mbox{\texttt{\mdseries\slshape identifier}}. The classes of these tables are sorted as follows. First come the classes
contained in $M.G$, sorted compatibly with the classes in \mbox{\texttt{\mdseries\slshape tblMG}}, then the classes in $H \setminus M.G$ follow, in the same ordering as the classes of $G.A \setminus G$. }

 

\subsection{\textcolor{Chapter }{BrauerTableOfTypeMGA}}
\logpage{[ 5, 1, 2 ]}\nobreak
\hyperdef{L}{X83BE977185ADC24B}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{BrauerTableOfTypeMGA({\mdseries\slshape modtblMG, modtblGA, ordtblMGA})\index{BrauerTableOfTypeMGA@\texttt{BrauerTableOfTypeMGA}}
\label{BrauerTableOfTypeMGA}
}\hfill{\scriptsize (function)}}\\


 Let $H$, $N$, and $M$ be as described at the beginning of the section, let \mbox{\texttt{\mdseries\slshape modtblMG}} and \mbox{\texttt{\mdseries\slshape modtblGA}} be the $p$-modular character tables of the groups $N$ and $H/M$, respectively, and let \mbox{\texttt{\mdseries\slshape ordtblMGA}} be the $p$-modular Brauer table of $H$, for some prime integer $p$. Furthermore, let the class fusions from the ordinary character table of \mbox{\texttt{\mdseries\slshape modtblMG}} to \mbox{\texttt{\mdseries\slshape ordtblMGA}} and from \mbox{\texttt{\mdseries\slshape ordtblMGA}} to the ordinary character table of \mbox{\texttt{\mdseries\slshape modtblGA}} be stored. 

 \texttt{BrauerTableOfTypeMGA} returns the $p$-modular character table of $H$. }

 

\subsection{\textcolor{Chapter }{PossibleActionsForTypeMGA}}
\logpage{[ 5, 1, 3 ]}\nobreak
\hyperdef{L}{X7899AA12836EEF8F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{PossibleActionsForTypeMGA({\mdseries\slshape tblMG, tblG, tblGA})\index{PossibleActionsForTypeMGA@\texttt{PossibleActionsForTypeMGA}}
\label{PossibleActionsForTypeMGA}
}\hfill{\scriptsize (function)}}\\


 Let the arguments be as described for \texttt{PossibleCharacterTablesOfTypeMGA} (\ref{PossibleCharacterTablesOfTypeMGA}). \texttt{PossibleActionsForTypeMGA} returns the set of orbit structures $\Omega$ on the class positions of \mbox{\texttt{\mdseries\slshape tblMG}} that can be induced by the action of $H$ on the classes of $M.G$ in the sense that $\Omega$ is the set of orbits of a table automorphism of \mbox{\texttt{\mdseries\slshape tblMG}} (see{\nobreakspace}\texttt{AutomorphismsOfTable} (\textbf{Reference: AutomorphismsOfTable})) that is compatible with the stored class fusions from \mbox{\texttt{\mdseries\slshape tblMG}} to \mbox{\texttt{\mdseries\slshape tblG}} and from \mbox{\texttt{\mdseries\slshape tblG}} to \mbox{\texttt{\mdseries\slshape tblGA}}. Note that the number of such orbit structures can be smaller than the number
of the underlying table automorphisms. 

 Information about the progress is reported if the info level of \texttt{InfoCharacterTable} (\textbf{Reference: InfoCharacterTable}) is at least $1$ (see{\nobreakspace}\texttt{SetInfoLevel} (\textbf{Reference: InfoLevel})). }

 }

  
\section{\textcolor{Chapter }{Character Tables of Groups of Structure $G.S_3$}}\label{sec:construc:GS3}
\logpage{[ 5, 2, 0 ]}
\hyperdef{L}{X821F4CB186913250}{}
{
  
\subsection{\textcolor{Chapter }{CharacterTableOfTypeGS3}}\logpage{[ 5, 2, 1 ]}
\hyperdef{L}{X7E06095E7CB3316D}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{CharacterTableOfTypeGS3({\mdseries\slshape tbl, tbl2, tbl3, aut, identifier})\index{CharacterTableOfTypeGS3@\texttt{CharacterTableOfTypeGS3}}
\label{CharacterTableOfTypeGS3}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{CharacterTableOfTypeGS3({\mdseries\slshape modtbl, modtbl2, modtbl3, ordtbls3, identifier})\index{CharacterTableOfTypeGS3@\texttt{CharacterTableOfTypeGS3}!for Brauer tables}
\label{CharacterTableOfTypeGS3:for Brauer tables}
}\hfill{\scriptsize (function)}}\\


 Let $H$ be a group with a normal subgroup $G$ such that $H/G \cong S_3$, the symmetric group on three points, and let $G.2$ and $G.3$ be preimages of subgroups of order $2$ and $3$, respectively, under the natural projection onto this factor group. 

 In the first form, let \mbox{\texttt{\mdseries\slshape tbl}}, \mbox{\texttt{\mdseries\slshape tbl2}}, \mbox{\texttt{\mdseries\slshape tbl3}} be the ordinary character tables of the groups $G$, $G.2$, and $G.3$, respectively, and \mbox{\texttt{\mdseries\slshape aut}} be the permutation of classes of \mbox{\texttt{\mdseries\slshape tbl3}} induced by the action of $H$ on $G.3$. Furthermore assume that the class fusions from \mbox{\texttt{\mdseries\slshape tbl}} to \mbox{\texttt{\mdseries\slshape tbl2}} and \mbox{\texttt{\mdseries\slshape tbl3}} are stored on \mbox{\texttt{\mdseries\slshape tbl}} (see{\nobreakspace}\texttt{StoreFusion} (\textbf{Reference: StoreFusion})). In particular, the two class fusions must be compatible in the sense that
the induced action on the classes of \mbox{\texttt{\mdseries\slshape tbl}} describes an action of $S_3$. 

 In the second form, let \mbox{\texttt{\mdseries\slshape modtbl}}, \mbox{\texttt{\mdseries\slshape modtbl2}}, \mbox{\texttt{\mdseries\slshape modtbl3}} be the $p$-modular character tables of the groups $G$, $G.2$, and $G.3$, respectively, and \mbox{\texttt{\mdseries\slshape ordtbls3}} be the ordinary character table of $H$. 

 \texttt{CharacterTableOfTypeGS3} returns a record with the following components. 
\begin{description}
\item[{\texttt{table}}]  the ordinary or $p$-modular character table of $H$, respectively, 
\item[{\texttt{tbl2fustbls3}}]  the fusion map from \mbox{\texttt{\mdseries\slshape tbl2}} into the table of $H$, and 
\item[{\texttt{tbl3fustbls3}}]  the fusion map from \mbox{\texttt{\mdseries\slshape tbl3}} into the table of $H$. 
\end{description}
 

 The returned table of $H$ has the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value \mbox{\texttt{\mdseries\slshape identifier}}. The classes of the table of $H$ are sorted as follows. First come the classes contained in $G.3$, sorted compatibly with the classes in \mbox{\texttt{\mdseries\slshape tbl3}}, then the classes in $H \setminus G.3$ follow, in the same ordering as the classes of $G.2 \setminus G$. 

 In fact the code is applicable in the more general case that $H/G$ is a Frobenius group $F = K C$ with abelian kernel $K$ and cyclic complement $C$ of prime order, see{\nobreakspace}\cite{Auto}. Besides $F = S_3$, e.{\nobreakspace}g., the case $F = A_4$ is interesting. }

 

\subsection{\textcolor{Chapter }{PossibleActionsForTypeGS3}}
\logpage{[ 5, 2, 2 ]}\nobreak
\hyperdef{L}{X82FC6C377BEF0139}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{PossibleActionsForTypeGS3({\mdseries\slshape tbl, tbl2, tbl3})\index{PossibleActionsForTypeGS3@\texttt{PossibleActionsForTypeGS3}}
\label{PossibleActionsForTypeGS3}
}\hfill{\scriptsize (function)}}\\


 Let the arguments be as described for \texttt{CharacterTableOfTypeGS3} (\ref{CharacterTableOfTypeGS3}). \texttt{PossibleActionsForTypeGS3} returns the set of those table automorphisms (see{\nobreakspace}\texttt{AutomorphismsOfTable} (\textbf{Reference: AutomorphismsOfTable})) of \mbox{\texttt{\mdseries\slshape tbl3}} that can be induced by the action of $H$ on the classes of \mbox{\texttt{\mdseries\slshape tbl3}}. 

 Information about the progress is reported if the info level of \texttt{InfoCharacterTable} (\textbf{Reference: InfoCharacterTable}) is at least $1$ (see{\nobreakspace}\texttt{SetInfoLevel} (\textbf{Reference: InfoLevel})). }

 }

  
\section{\textcolor{Chapter }{Character Tables of Groups of Structure $G.2^2$}}\label{sec:construc:GV4}
\logpage{[ 5, 3, 0 ]}
\hyperdef{L}{X83EB02D38624821C}{}
{
  The following functions are thought for constructing the possible ordinary
character tables of a group of structure $G.2^2$ from the known tables of the three normal subgroups of type $G.2$. 
\subsection{\textcolor{Chapter }{PossibleCharacterTablesOfTypeGV4}}\logpage{[ 5, 3, 1 ]}
\hyperdef{L}{X7CACDDED7A8C1CF9}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{PossibleCharacterTablesOfTypeGV4({\mdseries\slshape tblG, tblsG2, acts, identifier[, tblGfustblsG2]})\index{PossibleCharacterTablesOfTypeGV4@\texttt{PossibleCharacterTablesOfTypeGV4}}
\label{PossibleCharacterTablesOfTypeGV4}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{PossibleCharacterTablesOfTypeGV4({\mdseries\slshape modtblG, modtblsG2, ordtblGV4[, ordtblsG2fusordtblG4]})\index{PossibleCharacterTablesOfTypeGV4@\texttt{PossibleCharacterTablesOfTypeGV4}!for Brauer tables}
\label{PossibleCharacterTablesOfTypeGV4:for Brauer tables}
}\hfill{\scriptsize (function)}}\\


 Let $H$ be a group with a normal subgroup $G$ such that $H/G$ is a Klein four group, and let $G.2_1$, $G.2_2$, and $G.2_3$ be the three subgroups of index two in $H$ that contain $G$. 

 In the first version, let \mbox{\texttt{\mdseries\slshape tblG}} be the ordinary character table of $G$, let \mbox{\texttt{\mdseries\slshape tblsG2}} be a list containing the three character tables of the groups $G.2_i$, and let \mbox{\texttt{\mdseries\slshape acts}} be a list of three permutations describing the action of $H$ on the conjugacy classes of the corresponding tables in \mbox{\texttt{\mdseries\slshape tblsG2}}. If the class fusions from \mbox{\texttt{\mdseries\slshape tblG}} into the tables in \mbox{\texttt{\mdseries\slshape tblsG2}} are not stored on \mbox{\texttt{\mdseries\slshape tblG}} (for example, because the three tables are equal) then the three maps must be
entered in the list \mbox{\texttt{\mdseries\slshape tblGfustblsG2}}. 

 In the second version, let \mbox{\texttt{\mdseries\slshape modtblG}} be the $p$-modular character table of $G$, \mbox{\texttt{\mdseries\slshape modtblsG}} be the list of $p$-modular Brauer tables of the groups $G.2_i$, and \mbox{\texttt{\mdseries\slshape ordtblGV4}} be the ordinary character table of $H$. In this case, the class fusions from the ordinary character tables of the
groups $G.2_i$ to \mbox{\texttt{\mdseries\slshape ordtblGV4}} can be entered in the list \mbox{\texttt{\mdseries\slshape ordtblsG2fusordtblG4}}. 

 \texttt{PossibleCharacterTablesOfTypeGV4} returns a list of records describing all possible (ordinary or $p$-modular) character tables for groups $H$ that are compatible with the arguments. Note that in general there may be
several possible groups $H$, and it may also be that ``character tables'' are constructed for which no group exists. Each of the records in the result
has the following components. 

 
\begin{description}
\item[{\texttt{table}}]  a possible (ordinary or $p$-modular) character table for $H$, and 
\item[{\texttt{G2fusGV4}}]  the list of fusion maps from the tables in \mbox{\texttt{\mdseries\slshape tblsG2}} into the \texttt{table} component. 
\end{description}
 

 The possible tables differ w.r.t. the irreducible characters and perhaps the
table automorphisms; in particular, the \texttt{G2fusGV4} component is the same in all records. 

 The returned tables have the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value \mbox{\texttt{\mdseries\slshape identifier}}. The classes of these tables are sorted as follows. First come the classes
contained in $G$, sorted compatibly with the classes in \mbox{\texttt{\mdseries\slshape tblG}}, then the outer classes in the tables in \mbox{\texttt{\mdseries\slshape tblsG2}} follow, in the same ordering as in these tables. }

 

\subsection{\textcolor{Chapter }{PossibleActionsForTypeGV4}}
\logpage{[ 5, 3, 2 ]}\nobreak
\hyperdef{L}{X7CCD5A2979883144}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{PossibleActionsForTypeGV4({\mdseries\slshape tblG, tblsG2})\index{PossibleActionsForTypeGV4@\texttt{PossibleActionsForTypeGV4}}
\label{PossibleActionsForTypeGV4}
}\hfill{\scriptsize (function)}}\\


 Let the arguments be as described for \texttt{PossibleCharacterTablesOfTypeGV4} (\ref{PossibleCharacterTablesOfTypeGV4}). \texttt{PossibleActionsForTypeGV4} returns the list of those triples $[ \pi_1, \pi_2, \pi_3 ]$ of permutations for which a group $H$ may exist that contains $G.2_1$, $G.2_2$, $G.2_3$ as index $2$ subgroups which intersect in the index $4$ subgroup $G$. 

 Information about the progress is reported if the level of \texttt{InfoCharacterTable} (\textbf{Reference: InfoCharacterTable}) is at least $1$ (see{\nobreakspace}\texttt{SetInfoLevel} (\textbf{Reference: InfoLevel})). }

 }

  
\section{\textcolor{Chapter }{Character Tables of Groups of Structure $2^2.G$}}\label{sec:construc:V4G}
\logpage{[ 5, 4, 0 ]}
\hyperdef{L}{X79142119791673EF}{}
{
  The following functions are thought for constructing the possible ordinary or
Brauer character tables of a group of structure $2^2.G$ from the known tables of the three factor groups modulo the normal order two
subgroups in the central Klein four group. 

 Note that in the ordinary case, only a list of possibilities can be computed
whereas in the modular case, where the ordinary character table is assumed to
be known, the desired table is uniquely determined. 
\subsection{\textcolor{Chapter }{PossibleCharacterTablesOfTypeV4G}}\logpage{[ 5, 4, 1 ]}
\hyperdef{L}{X7E7043A5857B9240}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{PossibleCharacterTablesOfTypeV4G({\mdseries\slshape tblG, tbls2G, id[, fusions]})\index{PossibleCharacterTablesOfTypeV4G@\texttt{PossibleCharacterTablesOfTypeV4G}}
\label{PossibleCharacterTablesOfTypeV4G}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{PossibleCharacterTablesOfTypeV4G({\mdseries\slshape tblG, tbl2G, aut, id})\index{PossibleCharacterTablesOfTypeV4G@\texttt{PossibleCharacterTablesOfTypeV4G}!for conj. ordinary tables, and an autom.}
\label{PossibleCharacterTablesOfTypeV4G:for conj. ordinary tables, and an autom.}
}\hfill{\scriptsize (function)}}\\


 Let $H$ be a group with a central subgroup $N$ of type $2^2$, and let $Z_1$, $Z_2$, $Z_3$ be the order $2$ subgroups of $N$. 

 In the first form, let \mbox{\texttt{\mdseries\slshape tblG}} be the ordinary character table of $H/N$, and \mbox{\texttt{\mdseries\slshape tbls2G}} be a list of length three, the entries being the ordinary character tables of
the groups $H/Z_i$. In the second form, let \mbox{\texttt{\mdseries\slshape tbl2G}} be the ordinary character table of $H/Z_1$ and \mbox{\texttt{\mdseries\slshape aut}} be a permutation; here it is assumed that the groups $Z_i$ are permuted under an automorphism $\sigma$ of order $3$ of $H$, and that $\sigma$ induces the permutation \mbox{\texttt{\mdseries\slshape aut}} on the classes of \mbox{\texttt{\mdseries\slshape tblG}}. 

 The class fusions onto \mbox{\texttt{\mdseries\slshape tblG}} are assumed to be stored on the tables in \mbox{\texttt{\mdseries\slshape tbls2G}} or \mbox{\texttt{\mdseries\slshape tbl2G}}, respectively, except if they are explicitly entered via the optional
argument \mbox{\texttt{\mdseries\slshape fusions}}. 

 \texttt{PossibleCharacterTablesOfTypeV4G} returns the list of all possible character tables for $H$ in this situation. The returned tables have the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value \mbox{\texttt{\mdseries\slshape id}}. }

 
\subsection{\textcolor{Chapter }{BrauerTableOfTypeV4G}}\logpage{[ 5, 4, 2 ]}
\hyperdef{L}{X8536F9027F097C79}{}
{
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{BrauerTableOfTypeV4G({\mdseries\slshape ordtblV4G, modtbls2G})\index{BrauerTableOfTypeV4G@\texttt{BrauerTableOfTypeV4G}!for three factors}
\label{BrauerTableOfTypeV4G:for three factors}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{BrauerTableOfTypeV4G({\mdseries\slshape ordtblV4G, modtbl2G, aut})\index{BrauerTableOfTypeV4G@\texttt{BrauerTableOfTypeV4G}!for one factor and an autom.}
\label{BrauerTableOfTypeV4G:for one factor and an autom.}
}\hfill{\scriptsize (function)}}\\


 Let $H$ be a group with a central subgroup $N$ of type $2^2$, and let \mbox{\texttt{\mdseries\slshape ordtblV4G}} be the ordinary character table of $H$. Let $Z_1$, $Z_2$, $Z_3$ be the order $2$ subgroups of $N$. In the first form, let \mbox{\texttt{\mdseries\slshape modtbls2G}} be the list of the $p$-modular Brauer tables of the factor groups $H/Z_1$, $H/Z_2$, and $H/Z_3$, for some prime integer $p$. In the second form, let \mbox{\texttt{\mdseries\slshape modtbl2G}} be the $p$-modular Brauer table of $H/Z_1$ and \mbox{\texttt{\mdseries\slshape aut}} be a permutation; here it is assumed that the groups $Z_i$ are permuted under an automorphism $\sigma$ of order $3$ of $H$, and that $\sigma$ induces the permutation \mbox{\texttt{\mdseries\slshape aut}} on the classes of the ordinary character table of $H$ that is stored in \mbox{\texttt{\mdseries\slshape ordtblV4G}}. 

 The class fusions from \mbox{\texttt{\mdseries\slshape ordtblV4G}} to the ordinary character tables of the tables in \mbox{\texttt{\mdseries\slshape modtbls2G}} or \mbox{\texttt{\mdseries\slshape modtbl2G}} are assumed to be stored. 

 \texttt{BrauerTableOfTypeV4G} returns the $p$-modular character table of $H$. }

 }

  
\section{\textcolor{Chapter }{Character Tables of Subdirect Products of Index Two}}\label{sec:construc:subdirindex2}
\logpage{[ 5, 5, 0 ]}
\hyperdef{L}{X7B7282A37F293B36}{}
{
  The following function is thought for constructing the (ordinary or Brauer)
character tables of certain subdirect products from the known tables of the
factor groups and normal subgroups involved. 

\subsection{\textcolor{Chapter }{CharacterTableOfIndexTwoSubdirectProduct}}
\logpage{[ 5, 5, 1 ]}\nobreak
\hyperdef{L}{X7D0207B07B48FD06}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{CharacterTableOfIndexTwoSubdirectProduct({\mdseries\slshape tblH1, tblG1, tblH2, tblG2, identifier})\index{CharacterTableOfIndexTwoSubdirectProduct@\texttt{Character}\-\texttt{Table}\-\texttt{Of}\-\texttt{Index}\-\texttt{Two}\-\texttt{Subdirect}\-\texttt{Product}}
\label{CharacterTableOfIndexTwoSubdirectProduct}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
 a record containing the character table of the subdirect product $G$ that is described by the first four arguments. 



 Let \mbox{\texttt{\mdseries\slshape tblH1}}, \mbox{\texttt{\mdseries\slshape tblG1}}, \mbox{\texttt{\mdseries\slshape tblH2}}, \mbox{\texttt{\mdseries\slshape tblG2}} be the character tables of groups $H_1$, $G_1$, $H_2$, $G_2$, such that $H_1$ and $H_2$ have index two in $G_1$ and $G_2$, respectively, and such that the class fusions corresponding to these
embeddings are stored on \mbox{\texttt{\mdseries\slshape tblH1}} and \mbox{\texttt{\mdseries\slshape tblH1}}, respectively. 

 In this situation, the direct product of $G_1$ and $G_2$ contains a unique subgroup $G$ of index two that contains the direct product of $H_1$ and $H_2$ but does not contain any of the groups $G_1$, $G_2$. 

 The function \texttt{CharacterTableOfIndexTwoSubdirectProduct} returns a record with the following components. 
\begin{description}
\item[{\texttt{table}}]  the character table of $G$, 
\item[{\texttt{H1fusG}}]  the class fusion from \mbox{\texttt{\mdseries\slshape tblH1}} into the table of $G$, and 
\item[{\texttt{H2fusG}}]  the class fusion from \mbox{\texttt{\mdseries\slshape tblH2}} into the table of $G$. 
\end{description}
 

 If the first four arguments are \emph{ordinary} character tables then the fifth argument \mbox{\texttt{\mdseries\slshape identifier}} must be a string; this is used as the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of the result table. 

 If the first four arguments are \emph{Brauer} character tables for the same characteristic then the fifth argument must be
the ordinary character table of the desired subdirect product. }

 

\subsection{\textcolor{Chapter }{ConstructIndexTwoSubdirectProduct}}
\logpage{[ 5, 5, 2 ]}\nobreak
\hyperdef{L}{X8714D24B802DA949}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructIndexTwoSubdirectProduct({\mdseries\slshape tbl, tblH1, tblG1, tblH2, tblG2, permclasses, permchars})\index{ConstructIndexTwoSubdirectProduct@\texttt{ConstructIndexTwoSubdirectProduct}}
\label{ConstructIndexTwoSubdirectProduct}
}\hfill{\scriptsize (function)}}\\


 \texttt{ConstructIndexTwoSubdirectProduct} constructs the irreducible characters of the ordinary character table \mbox{\texttt{\mdseries\slshape tbl}} of the subdirect product of index two in the direct product of \mbox{\texttt{\mdseries\slshape tblG1}} and \mbox{\texttt{\mdseries\slshape tblG2}}, which contains the direct product of \mbox{\texttt{\mdseries\slshape tblH1}} and \mbox{\texttt{\mdseries\slshape tblH2}} but does not contain any of the direct factors \mbox{\texttt{\mdseries\slshape tblG1}}, \mbox{\texttt{\mdseries\slshape tblG2}}. W.{\nobreakspace}r.{\nobreakspace}t.{\nobreakspace}the default ordering
obtained from that given by \texttt{CharacterTableDirectProduct} (\textbf{Reference: CharacterTableDirectProduct}), the columns and the rows of the matrix of irreducibles are permuted with the
permutations \mbox{\texttt{\mdseries\slshape permclasses}} and \mbox{\texttt{\mdseries\slshape permchars}}, respectively. }

 

\subsection{\textcolor{Chapter }{ConstructIndexTwoSubdirectProductInfo}}
\logpage{[ 5, 5, 3 ]}\nobreak
\hyperdef{L}{X8254CA95814DF613}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructIndexTwoSubdirectProductInfo({\mdseries\slshape tbl[, tblH1, tblG1, tblH2, tblG2]})\index{ConstructIndexTwoSubdirectProductInfo@\texttt{Construct}\-\texttt{Index}\-\texttt{Two}\-\texttt{Subdirect}\-\texttt{Product}\-\texttt{Info}}
\label{ConstructIndexTwoSubdirectProductInfo}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
 a list of constriction descriptions, or a construction description, or \texttt{fail}. 



 Called with one argument \mbox{\texttt{\mdseries\slshape tbl}}, an ordinary character table of the group $G$, say, \texttt{ConstructIndexTwoSubdirectProductInfo} analyzes the possibilities to construct \mbox{\texttt{\mdseries\slshape tbl}} from character tables of subgroups $H_1$, $H_2$ and factor groups $G_1$, $G_2$, using \texttt{CharacterTableOfIndexTwoSubdirectProduct} (\ref{CharacterTableOfIndexTwoSubdirectProduct}). The return value is a list of records with the following components. 
\begin{description}
\item[{\texttt{kernels}}]  the list of class positions of $H_1$, $H_2$ in \mbox{\texttt{\mdseries\slshape tbl}}, 
\item[{\texttt{kernelsizes}}]  the list of orders of $H_1$, $H_2$, 
\item[{\texttt{factors}}]  the list of \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) values of the \textsf{GAP} library tables of the factors $G_2$, $G_1$ of $G$ by $H_1$, $H_2$; if no such table is available then the entry is \texttt{fail}, and 
\item[{\texttt{subgroups}}]  the list of \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) values of the \textsf{GAP} library tables of the subgroups $H_2$, $H_1$ of $G$; if no such tables are available then the entries are \texttt{fail}. 
\end{description}
 

 If the returned list is empty then either \mbox{\texttt{\mdseries\slshape tbl}} does not have the desired structure as a subdirect product, \emph{or} \mbox{\texttt{\mdseries\slshape tbl}} is in fact a nontrivial direct product. 

 Called with five arguments, the ordinary character tables of $G$, $H_1$, $G_1$, $H_2$, $G_2$, \texttt{ConstructIndexTwoSubdirectProductInfo} returns a list that can be used as the \texttt{ConstructionInfoCharacterTable} (\ref{ConstructionInfoCharacterTable}) value for the character table of $G$ from the other four character tables using \texttt{CharacterTableOfIndexTwoSubdirectProduct} (\ref{CharacterTableOfIndexTwoSubdirectProduct}); if this is not possible then \texttt{fail} is returned. }

 }

  
\section{\textcolor{Chapter }{Brauer Tables of Extensions by $p$-regular Automorphisms }}\label{sec:construc:preg}
\logpage{[ 5, 6, 0 ]}
\hyperdef{L}{X81255DAA7AB13278}{}
{
  As for the construction of Brauer character tables from known tables, the
functions \texttt{PossibleCharacterTablesOfTypeMGA} (\ref{PossibleCharacterTablesOfTypeMGA}), \texttt{CharacterTableOfTypeGS3} (\ref{CharacterTableOfTypeGS3}), and \texttt{PossibleCharacterTablesOfTypeGV4} (\ref{PossibleCharacterTablesOfTypeGV4}) work for both ordinary and Brauer tables. The following function is designed
specially for Brauer tables. 

\subsection{\textcolor{Chapter }{IBrOfExtensionBySingularAutomorphism}}
\logpage{[ 5, 6, 1 ]}\nobreak
\hyperdef{L}{X7AF3EA6C783FCFF9}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{IBrOfExtensionBySingularAutomorphism({\mdseries\slshape modtbl, act})\index{IBrOfExtensionBySingularAutomorphism@\texttt{IBr}\-\texttt{Of}\-\texttt{Extension}\-\texttt{By}\-\texttt{Singular}\-\texttt{Automorphism}}
\label{IBrOfExtensionBySingularAutomorphism}
}\hfill{\scriptsize (function)}}\\


 Let \mbox{\texttt{\mdseries\slshape modtbl}} be a $p$-modular Brauer table of the group $G$, say, and suppose that the group $H$, say, is an upward extension of $G$ by an automorphism of order $p$. 

 The second argument \mbox{\texttt{\mdseries\slshape act}} describes the action of this automorphism. It can be either a permutation of
the columns of \mbox{\texttt{\mdseries\slshape modtbl}}, or a list of the $H$-orbits on the columns of \mbox{\texttt{\mdseries\slshape modtbl}}, or the ordinary character table of $H$ such that the class fusion from the ordinary table of \mbox{\texttt{\mdseries\slshape modtbl}} into this table is stored. In all these cases, \texttt{IBrOfExtensionBySingularAutomorphism} returns the values lists of the irreducible $p$-modular Brauer characters of $H$. 

 Note that the table head of the $p$-modular Brauer table of $H$, in general without the \texttt{Irr} (\textbf{Reference: Irr}) attribute, can be obtained by applying \texttt{CharacterTableRegular} (\textbf{Reference: CharacterTableRegular}) to the ordinary character table of $H$, but \texttt{IBrOfExtensionBySingularAutomorphism} can be used also if the ordinary character table of $H$ is not known, and just the $p$-modular character table of $G$ and the action of $H$ on the classes of $G$ are given. }

 }

  
\section{\textcolor{Chapter }{Character Tables of Coprime Central Extensions}}\label{sec:construc:cenex}
\logpage{[ 5, 7, 0 ]}
\hyperdef{L}{X844C69217B80537A}{}
{
  

\subsection{\textcolor{Chapter }{CharacterTableOfCommonCentralExtension}}
\logpage{[ 5, 7, 1 ]}\nobreak
\hyperdef{L}{X82CEF31D7815C53D}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{CharacterTableOfCommonCentralExtension({\mdseries\slshape tblG, tblmG, tblnG, id})\index{CharacterTableOfCommonCentralExtension@\texttt{Character}\-\texttt{Table}\-\texttt{Of}\-\texttt{Common}\-\texttt{Central}\-\texttt{Extension}}
\label{CharacterTableOfCommonCentralExtension}
}\hfill{\scriptsize (function)}}\\


 Let \mbox{\texttt{\mdseries\slshape tblG}} be the ordinary character table of a group $G$, say, and let \mbox{\texttt{\mdseries\slshape tblmG}} and \mbox{\texttt{\mdseries\slshape tblnG}} be the ordinary character tables of central extensions $m.G$ and $n.G$ of $G$ by cyclic groups of prime orders $m$ and $n$, respectively, with $m \not= n$. We assume that the factor fusions from \mbox{\texttt{\mdseries\slshape tblmG}} and \mbox{\texttt{\mdseries\slshape tblnG}} to \mbox{\texttt{\mdseries\slshape tblG}} are stored on the tables. \texttt{CharacterTableOfCommonCentralExtension} returns a record with the following components. 

 
\begin{description}
\item[{\texttt{tblmnG}}]  the character table $t$, say, of the corresponding central extension of $G$ by a cyclic group of order $m n$ that factors through $m.G$ and $n.G$; the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of this table is \mbox{\texttt{\mdseries\slshape id}}, 
\item[{\texttt{IsComplete}}]  \texttt{true} if the \texttt{Irr} (\textbf{Reference: Irr}) value is stored in $t$, and \texttt{false} otherwise, 
\item[{\texttt{irreducibles}}]  the list of irreducibles of $t$ that are known; it contains the inflated characters of the factor groups $m.G$ and $n.G$, plus those irreducibles that were found in tensor products of characters of
these groups. 
\end{description}
 

 Note that the conjugacy classes and the power maps of $t$ are uniquely determined by the input data. Concerning the irreducible
characters, we try to extract them from the tensor products of characters of
the given factor groups by reducing with known irreducibles and applying the
LLL algorithm (see{\nobreakspace}\texttt{ReducedClassFunctions} (\textbf{Reference: ReducedClassFunctions}) and{\nobreakspace}\texttt{LLL} (\textbf{Reference: LLL})). }

 }

  
\section{\textcolor{Chapter }{Construction Functions used in the Character Table Library}}\label{sec:construc:functions}
\logpage{[ 5, 8, 0 ]}
\hyperdef{L}{X874C19D079CE0BE0}{}
{
  The following functions are used in the \textsf{GAP} Character Table Library, for encoding table constructions via the mechanism
that is based on the attribute \texttt{ConstructionInfoCharacterTable} (\ref{ConstructionInfoCharacterTable}). All construction functions take as their first argument a record that
describes the table to be constructed, and the function adds only those
components that are not yet contained in this record. 

\subsection{\textcolor{Chapter }{ConstructMGA}}
\logpage{[ 5, 8, 1 ]}\nobreak
\hyperdef{L}{X7A948B397B5BC0AD}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructMGA({\mdseries\slshape tbl, subname, factname, plan, perm})\index{ConstructMGA@\texttt{ConstructMGA}}
\label{ConstructMGA}
}\hfill{\scriptsize (function)}}\\


 \texttt{ConstructMGA} constructs the irreducible characters of the ordinary character table \mbox{\texttt{\mdseries\slshape tbl}} of a group $m.G.a$ where the automorphism $a$ (a group of prime order) of $m.G$ acts nontrivially on the central subgroup $m$ of $m.G$. \mbox{\texttt{\mdseries\slshape subname}} is the name of the subgroup $m.G$ which is a (not necessarily cyclic) central extension of the (not necessarily
simple) group $G$, \mbox{\texttt{\mdseries\slshape factname}} is the name of the factor group $G.a$. Then the faithful characters of \mbox{\texttt{\mdseries\slshape tbl}} are induced from $m.G$. 

 \mbox{\texttt{\mdseries\slshape plan}} is a list, each entry being a list containing positions of characters of $m.G$ that form an orbit under the action of $a$ (the induction of characters is encoded this way). 

 \mbox{\texttt{\mdseries\slshape perm}} is the permutation that must be applied to the list of characters that is
obtained on appending the faithful characters to the inflated characters of
the factor group. A nonidentity permutation occurs for example for groups of
structure $12.G.2$ that are encoded via the subgroup $12.G$ and the factor group $6.G.2$, where the faithful characters of $4.G.2$ shall precede those of $6.G.2$, as in the \textsf{Atlas}. 

 Examples where \texttt{ConstructMGA} is used to encode library tables are the tables of $3.F_{{3+}}.2$ (subgroup $3.F_{{3+}}$, factor group $F_{{3+}}.2$) and $12_1.U_4(3).2_2$ (subgroup $12_1.U_4(3)$, factor group $6_1.U_4(3).2_2$). }

 

\subsection{\textcolor{Chapter }{ConstructMGAInfo}}
\logpage{[ 5, 8, 2 ]}\nobreak
\hyperdef{L}{X84DE92E579BA7171}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructMGAInfo({\mdseries\slshape tblmGa, tblmG, tblGa})\index{ConstructMGAInfo@\texttt{ConstructMGAInfo}}
\label{ConstructMGAInfo}
}\hfill{\scriptsize (function)}}\\


 Let \mbox{\texttt{\mdseries\slshape tblmGa}} be the ordinary character table of a group of structure $m.G.a$ where the factor group of prime order $a$ acts nontrivially on the normal subgroup of order $m$ that is central in $m.G$, \mbox{\texttt{\mdseries\slshape tblmG}} be the character table of $m.G$, and \mbox{\texttt{\mdseries\slshape tblGa}} be the character table of the factor group $G.a$. 

 \texttt{ConstructMGAInfo} returns the list that is to be stored in the library version of \mbox{\texttt{\mdseries\slshape tblmGa}}: the first entry is the string \texttt{"ConstructMGA"}, the remaining four entries are the last four arguments for the call to \texttt{ConstructMGA} (\ref{ConstructMGA}). }

 

\subsection{\textcolor{Chapter }{ConstructGS3}}
\logpage{[ 5, 8, 3 ]}\nobreak
\hyperdef{L}{X80F14D1C86CF1E9C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructGS3({\mdseries\slshape tbls3, tbl2, tbl3, ind2, ind3, ext, perm})\index{ConstructGS3@\texttt{ConstructGS3}}
\label{ConstructGS3}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructGS3Info({\mdseries\slshape tbl2, tbl3, tbls3})\index{ConstructGS3Info@\texttt{ConstructGS3Info}}
\label{ConstructGS3Info}
}\hfill{\scriptsize (function)}}\\


 \texttt{ConstructGS3} constructs the irreducibles of an ordinary character table \mbox{\texttt{\mdseries\slshape tbls3}} of type $G.S_3$ from the tables with names \mbox{\texttt{\mdseries\slshape tbl2}} and \mbox{\texttt{\mdseries\slshape tbl3}}, which correspond to the groups $G.2$ and $G.3$, respectively. \mbox{\texttt{\mdseries\slshape ind2}} is a list of numbers referring to irreducibles of \mbox{\texttt{\mdseries\slshape tbl2}}. \mbox{\texttt{\mdseries\slshape ind3}} is a list of pairs, each referring to irreducibles of \mbox{\texttt{\mdseries\slshape tbl3}}. \mbox{\texttt{\mdseries\slshape ext}} is a list of pairs, each referring to one irreducible character of \mbox{\texttt{\mdseries\slshape tbl2}} and one of \mbox{\texttt{\mdseries\slshape tbl3}}. \mbox{\texttt{\mdseries\slshape perm}} is a permutation that must be applied to the irreducibles after the
construction. 

 \texttt{ConstructGS3Info} returns a record with the components \texttt{ind2}, \texttt{ind3}, \texttt{ext}, \texttt{perm}, and \texttt{list}, as are needed for \texttt{ConstructGS3}. }

 

\subsection{\textcolor{Chapter }{ConstructV4G}}
\logpage{[ 5, 8, 4 ]}\nobreak
\hyperdef{L}{X7C1CE54A864936E0}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructV4G({\mdseries\slshape tbl, facttbl, aut})\index{ConstructV4G@\texttt{ConstructV4G}}
\label{ConstructV4G}
}\hfill{\scriptsize (function)}}\\


 Let \mbox{\texttt{\mdseries\slshape tbl}} be the character table of a group of type $2^2.G$ where an outer automorphism of order $3$ permutes the three involutions in the central $2^2$. Let \mbox{\texttt{\mdseries\slshape aut}} be the permutation of classes of \mbox{\texttt{\mdseries\slshape tbl}} induced by that automorphism, and \mbox{\texttt{\mdseries\slshape facttbl}} be the name of the character table of the factor group $2.G$. Then \texttt{ConstructV4G} constructs the irreducible characters of \mbox{\texttt{\mdseries\slshape tbl}} from that information. }

 

\subsection{\textcolor{Chapter }{ConstructProj}}
\logpage{[ 5, 8, 5 ]}\nobreak
\hyperdef{L}{X8726ADCC7BCEA96F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructProj({\mdseries\slshape tbl, irrinfo})\index{ConstructProj@\texttt{ConstructProj}}
\label{ConstructProj}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructProjInfo({\mdseries\slshape tbl, kernel})\index{ConstructProjInfo@\texttt{ConstructProjInfo}}
\label{ConstructProjInfo}
}\hfill{\scriptsize (function)}}\\


 \texttt{ConstructProj} constructs the irreducible characters of the record encoding the ordinary
character table \mbox{\texttt{\mdseries\slshape tbl}} from projective characters of tables of factor groups, which are stored in the \texttt{ProjectivesInfo} (\ref{ProjectivesInfo}) value of the smallest factor; the information about the name of this factor
and the projectives to take is stored in \mbox{\texttt{\mdseries\slshape irrinfo}}. 

 \texttt{ConstructProjInfo} takes an ordinary character table \mbox{\texttt{\mdseries\slshape tbl}} and a list \mbox{\texttt{\mdseries\slshape kernel}} of class positions of a cyclic kernel of order dividing $12$, and returns a record with the components 

 
\begin{description}
\item[{\texttt{tbl}}]  a character table that is permutation isomorphic with \mbox{\texttt{\mdseries\slshape tbl}}, and sorted such that classes that differ only by multiplication with
elements in the classes of \mbox{\texttt{\mdseries\slshape kernel}} are consecutive, 
\item[{\texttt{projectives}}]  a record being the entry for the \texttt{projectives} list of the table of the factor of \mbox{\texttt{\mdseries\slshape tbl}} by \mbox{\texttt{\mdseries\slshape kernel}}, describing this part of the irreducibles of \mbox{\texttt{\mdseries\slshape tbl}}, and 
\item[{\texttt{info}}]  the value of \mbox{\texttt{\mdseries\slshape irrinfo}} that is needed for constructing the irreducibles of the \texttt{tbl} component of the result (\emph{not} the irreducibles of the argument \mbox{\texttt{\mdseries\slshape tbl}}!) via \texttt{ConstructProj}. 
\end{description}
 }

 

\subsection{\textcolor{Chapter }{ConstructDirectProduct}}
\logpage{[ 5, 8, 6 ]}\nobreak
\hyperdef{L}{X7EF9996082140544}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructDirectProduct({\mdseries\slshape tbl, factors[, permclasses, permchars]})\index{ConstructDirectProduct@\texttt{ConstructDirectProduct}}
\label{ConstructDirectProduct}
}\hfill{\scriptsize (function)}}\\


 The direct product of the library character tables described by the list \mbox{\texttt{\mdseries\slshape factors}} of table names is constructed using \texttt{CharacterTableDirectProduct} (\textbf{Reference: CharacterTableDirectProduct}), and all its components that are not yet stored on \mbox{\texttt{\mdseries\slshape tbl}} are added to \mbox{\texttt{\mdseries\slshape tbl}}. 

 The \texttt{ComputedClassFusions} (\textbf{Reference: ComputedClassFusions}) value of \mbox{\texttt{\mdseries\slshape tbl}} is enlarged by the factor fusions from the direct product to the factors. 

 If the optional arguments \mbox{\texttt{\mdseries\slshape permclasses}}, \mbox{\texttt{\mdseries\slshape permchars}} are given then the classes and characters of the result are sorted
accordingly. 

 \mbox{\texttt{\mdseries\slshape factors}} must have length at least two; use \texttt{ConstructPermuted} (\ref{ConstructPermuted}) in the case of only one factor. }

 

\subsection{\textcolor{Chapter }{ConstructCentralProduct}}
\logpage{[ 5, 8, 7 ]}\nobreak
\hyperdef{L}{X781EAFEB80EC1ED8}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructCentralProduct({\mdseries\slshape tbl, factors, Dclasses[, permclasses, permchars]})\index{ConstructCentralProduct@\texttt{ConstructCentralProduct}}
\label{ConstructCentralProduct}
}\hfill{\scriptsize (function)}}\\


 The library table \mbox{\texttt{\mdseries\slshape tbl}} is completed with help of the table obtained by taking the direct product of
the tables with names in the list \mbox{\texttt{\mdseries\slshape factors}}, and then factoring out the normal subgroup that is given by the list \mbox{\texttt{\mdseries\slshape Dclasses}} of class positions. 

 If the optional arguments \mbox{\texttt{\mdseries\slshape permclasses}}, \mbox{\texttt{\mdseries\slshape permchars}} are given then the classes and characters of the result are sorted
accordingly. }

 

\subsection{\textcolor{Chapter }{ConstructSubdirect}}
\logpage{[ 5, 8, 8 ]}\nobreak
\hyperdef{L}{X84F6BB30845D75E1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructSubdirect({\mdseries\slshape tbl, factors, choice})\index{ConstructSubdirect@\texttt{ConstructSubdirect}}
\label{ConstructSubdirect}
}\hfill{\scriptsize (function)}}\\


 The library table \mbox{\texttt{\mdseries\slshape tbl}} is completed with help of the table obtained by taking the direct product of
the tables with names in the list \mbox{\texttt{\mdseries\slshape factors}}, and then taking the table consisting of the classes in the list \mbox{\texttt{\mdseries\slshape choice}}. 

 Note that in general, the restriction to the classes of a normal subgroup is
not sufficient for describing the irreducible characters of this normal
subgroup. }

 

\subsection{\textcolor{Chapter }{ConstructWreathSymmetric}}
\logpage{[ 5, 8, 9 ]}\nobreak
\hyperdef{L}{X7F26BEC67B744999}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructWreathSymmetric({\mdseries\slshape tbl, subname, n[, permclasses, permchars]})\index{ConstructWreathSymmetric@\texttt{ConstructWreathSymmetric}}
\label{ConstructWreathSymmetric}
}\hfill{\scriptsize (function)}}\\


 The wreath product of the library character table with identifier value \mbox{\texttt{\mdseries\slshape subname}} with the symmetric group on \mbox{\texttt{\mdseries\slshape n}} points is constructed using \texttt{CharacterTableWreathSymmetric} (\textbf{Reference: CharacterTableWreathSymmetric}), and all its components that are not yet stored on \mbox{\texttt{\mdseries\slshape tbl}} are added to \mbox{\texttt{\mdseries\slshape tbl}}. 

 If the optional arguments \mbox{\texttt{\mdseries\slshape permclasses}}, \mbox{\texttt{\mdseries\slshape permchars}} are given then the classes and characters of the result are sorted
accordingly. }

 

\subsection{\textcolor{Chapter }{ConstructIsoclinic}}
\logpage{[ 5, 8, 10 ]}\nobreak
\hyperdef{L}{X7F6A9FE57C77D778}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructIsoclinic({\mdseries\slshape tbl, factors[, nsg[, centre]][, permclasses, permchars]})\index{ConstructIsoclinic@\texttt{ConstructIsoclinic}}
\label{ConstructIsoclinic}
}\hfill{\scriptsize (function)}}\\


 constructs first the direct product of library tables as given by the list \mbox{\texttt{\mdseries\slshape factors}} of admissible character table names, and then constructs the isoclinic table
of the result. 

 If the argument \mbox{\texttt{\mdseries\slshape nsg}} is present and a record or a list then \texttt{CharacterTableIsoclinic} (\textbf{Reference: CharacterTableIsoclinic}) gets called, and \mbox{\texttt{\mdseries\slshape nsg}} (as well as \mbox{\texttt{\mdseries\slshape centre}} if present) is passed to this function. 

 In both cases, if the optional arguments \mbox{\texttt{\mdseries\slshape permclasses}}, \mbox{\texttt{\mdseries\slshape permchars}} are given then the classes and characters of the result are sorted
accordingly. }

 

\subsection{\textcolor{Chapter }{ConstructPermuted}}
\logpage{[ 5, 8, 11 ]}\nobreak
\hyperdef{L}{X7D3F0AC2825C8CA1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructPermuted({\mdseries\slshape tbl, libnam[, permclasses, permchars]})\index{ConstructPermuted@\texttt{ConstructPermuted}}
\label{ConstructPermuted}
}\hfill{\scriptsize (function)}}\\


 The library table \mbox{\texttt{\mdseries\slshape tbl}} is computed from the library table with the name \mbox{\texttt{\mdseries\slshape libnam}}, by permuting the classes and the characters by the permutations \mbox{\texttt{\mdseries\slshape permclasses}} and \mbox{\texttt{\mdseries\slshape permchars}}, respectively. 

 So \mbox{\texttt{\mdseries\slshape tbl}} and the library table with the name \mbox{\texttt{\mdseries\slshape libnam}} are permutation equivalent. With the more general function \texttt{ConstructAdjusted} (\ref{ConstructAdjusted}), one can derive character tables that are not necessarily permutation
equivalent, by additionally replacing some defining data. 

 The two permutations are optional. If they are missing then the lists of
irreducible characters and the power maps of the two character tables
coincide. However, different class fusions may be stored on the two tables.
This is used for example in situations where a group has several classes of
isomorphic maximal subgroups whose class fusions are different; different
character tables (with different identifiers) are stored for the different
classes, each with appropriate class fusions, and all these tables except the
one for the first class of subgroups can be derived from this table via \texttt{ConstructPermuted}. }

 

\subsection{\textcolor{Chapter }{ConstructAdjusted}}
\logpage{[ 5, 8, 12 ]}\nobreak
\hyperdef{L}{X85FE8954830F85A0}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructAdjusted({\mdseries\slshape tbl, libnam, pairs[, permclasses, permchars]})\index{ConstructAdjusted@\texttt{ConstructAdjusted}}
\label{ConstructAdjusted}
}\hfill{\scriptsize (function)}}\\


 The defining attribute values of the library table \mbox{\texttt{\mdseries\slshape tbl}} are given by the attribute values described by the list \mbox{\texttt{\mdseries\slshape pairs}} and {\textendash}for those attributes which do not appear in \mbox{\texttt{\mdseries\slshape pairs}}{\textendash} by the attribute values of the library table with the name \mbox{\texttt{\mdseries\slshape libnam}}, whose classes and characters have been permuted by the optional permutations \mbox{\texttt{\mdseries\slshape permclasses}} and \mbox{\texttt{\mdseries\slshape permchars}}, respectively. 

 This construction can be used to derive a character table from another library
table (the one with the name \mbox{\texttt{\mdseries\slshape libnam}}) that is \emph{not} permutation equivalent to this table. For example, it may happen that the
character tables of a split and a nonsplit extension differ only by some power
maps and element orders. In this case, one can encode one of the tables via \texttt{ConstructAdjusted}, by prescribing just the power maps in the list \mbox{\texttt{\mdseries\slshape pairs}}. 

 If no replacement of components is needed then one should better use \texttt{ConstructPermuted} (\ref{ConstructPermuted}), because the system can then exploit the fact that the two tables are
permutation equivalent. }

 

\subsection{\textcolor{Chapter }{ConstructFactor}}
\logpage{[ 5, 8, 13 ]}\nobreak
\hyperdef{L}{X803FE1FF82790290}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ConstructFactor({\mdseries\slshape tbl, libnam, kernel})\index{ConstructFactor@\texttt{ConstructFactor}}
\label{ConstructFactor}
}\hfill{\scriptsize (function)}}\\


 The library table \mbox{\texttt{\mdseries\slshape tbl}} is completed with help of the library table with name \mbox{\texttt{\mdseries\slshape libnam}}, by factoring out the classes in the list \mbox{\texttt{\mdseries\slshape kernel}}. }

  }

    }

    
\chapter{\textcolor{Chapter }{Interfaces to Other Data Formats for Character Tables}}\label{chap:interfaces}
\logpage{[ 6, 0, 0 ]}
\hyperdef{L}{X81C250407B91443F}{}
{
  This chapter describes data formats for character tables that can be read or
created by \textsf{GAP}. Currently these are the formats used by 
\begin{itemize}
\item  the \textsf{CAS} system (see{\nobreakspace}\ref{sec:interface-cas}), 
\item  the \textsf{MOC} system (see{\nobreakspace}\ref{sec:interface-moc}), 
\item  \textsf{GAP}{\nobreakspace}3 (see{\nobreakspace}\ref{sec:interface-gap3}), 
\item  the so-called \emph{Cambridge format} (see{\nobreakspace}\ref{sec:interface-cambridge}), and 
\item  the \textsf{MAGMA} system (see{\nobreakspace}\ref{sec:interface-magma}). 
\end{itemize}
  
\section{\textcolor{Chapter }{Interface to the \textsf{CAS} System}}\label{sec:interface-cas}
\logpage{[ 6, 1, 0 ]}
\hyperdef{L}{X79F5E5A283E0D190}{}
{
  \index{CAS!tables} \index{CAS!format} The interface to \textsf{CAS} (see{\nobreakspace}\cite{NPP84}) is thought just for printing the \textsf{CAS} data to a file. The function \texttt{CASString} (\ref{CASString}) is available mainly in order to document the data format. \emph{Reading} \textsf{CAS} tables is not supported; note that the tables contained in the \textsf{CAS} Character Table Library have been migrated to \textsf{GAP} using a few \texttt{sed} scripts and \texttt{C} programs. 

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


 is a string that encodes the \textsf{CAS} library format of the character table \mbox{\texttt{\mdseries\slshape tbl}}. This string can be printed to a file which then can be read into the \textsf{CAS} system using its \texttt{get} command (see{\nobreakspace}\cite{NPP84}). 

 The used line length is the first entry in the list returned by \texttt{SizeScreen} (\textbf{Reference: SizeScreen}). 

 Only the known values of the following attributes are used. \texttt{ClassParameters} (\textbf{Reference: ClassParameters}) (for partitions only), \texttt{ComputedClassFusions} (\textbf{Reference: ComputedClassFusions}), \texttt{ComputedIndicators} (\textbf{Reference: ComputedIndicators}), \texttt{ComputedPowerMaps} (\textbf{Reference: ComputedPowerMaps}), \texttt{ComputedPrimeBlocks} (\textbf{Reference: ComputedPrimeBlockss}), \texttt{Identifier} (\textbf{Reference: Identifier for character tables}), \texttt{InfoText} (\textbf{Reference: InfoText}), \texttt{Irr} (\textbf{Reference: Irr}), \texttt{OrdersClassRepresentatives} (\textbf{Reference: OrdersClassRepresentatives}), \texttt{Size} (\textbf{Reference: Size}), \texttt{SizesCentralizers} (\textbf{Reference: SizesCentralisers}). 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@Print( CASString( CharacterTable( "Cyclic", 2 ) ), "\n" );|
  'C2'
  00/00/00. 00.00.00.
  (2,2,0,2,-1,0)
  text:
  (#computed using generic character table for cyclic groups#),
  order=2,
  centralizers:(
  2,2
  ),
  reps:(
  1,2
  ),
  powermap:2(
  1,1
  ),
  characters:
  (1,1
  ,0:0)
  (1,-1
  ,0:0);
  /// converted from GAP
\end{Verbatim}
 }

 }

  
\section{\textcolor{Chapter }{Interface to the \textsf{MOC} System}}\label{sec:interface-moc}
\logpage{[ 6, 2, 0 ]}
\hyperdef{L}{X835EE8028539BB63}{}
{
  The interface to \textsf{MOC} (see{\nobreakspace}\cite{HJLP92}) can be used to print \textsf{MOC} input. Additionally it provides an alternative representation of (virtual)
characters. 

 The \textsf{MOC}{\nobreakspace}3 code of a $5$ digit number in \textsf{MOC}{\nobreakspace}2 code is given by the following list. (Note that the code must
contain only lower case letters.) 

 
\begin{verbatim}  
  ABCD    for  0ABCD
  a       for  10000
  b       for  10001          k       for  20001
  c       for  10002          l       for  20002
  d       for  10003          m       for  20003
  e       for  10004          n       for  20004
  f       for  10005          o       for  20005
  g       for  10006          p       for  20006
  h       for  10007          q       for  20007
  i       for  10008          r       for  20008
  j       for  10009          s       for  20009
  tAB     for  100AB
  uAB     for  200AB
  vABCD   for  1ABCD
  wABCD   for  2ABCD
  yABC    for  30ABC
  z       for  31000
\end{verbatim}
 

 \emph{Note} that any long number in \textsf{MOC}{\nobreakspace}2 format is divided into packages of length $4$, the first (!) one filled with leading zeros if necessary. Such a number with
decimals $d_1, d_2, \ldots, d_{{4n+k}}$ is the sequence $0 d_1 d_2 d_3 d_4 \ldots 0 d_{{4n-3}} d_{{4n-2}} d_{{4n-1}} d_{4n} d_{{4n+1}}
\ldots d_{{4n+k}}$ where $0 \leq k \leq 3$, the first digit of $x$ is $1$ if the number is positive and $2$ if the number is negative, and then follow $(4-k)$ zeros. 

 Details about the \textsf{MOC} system are explained in{\nobreakspace}\cite{HJLP92}, a brief description can be found in{\nobreakspace}\cite{LP91}. 

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


 For a list \mbox{\texttt{\mdseries\slshape listofns}} of positive integers, \texttt{MAKElb11} prints field information for all number fields with conductor in this list. 

 The output of \texttt{MAKElb11} is used by the \textsf{MOC} system; Calling \texttt{MAKElb11( [ 3 .. 189 ] )} will print something very similar to Richard Parker's file \texttt{lb11}. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@MAKElb11( [ 3, 4 ] );|
     3   2   0   1   0
     4   2   0   1   0
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{MOCTable}}
\logpage{[ 6, 2, 2 ]}\nobreak
\hyperdef{L}{X832005B37F0A2872}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{MOCTable({\mdseries\slshape gaptbl[, basicset]})\index{MOCTable@\texttt{MOCTable}}
\label{MOCTable}
}\hfill{\scriptsize (function)}}\\


 \texttt{MOCTable} returns the \textsf{MOC} table record of the \textsf{GAP} character table \mbox{\texttt{\mdseries\slshape gaptbl}}. 

 The one argument version can be used only if \mbox{\texttt{\mdseries\slshape gaptbl}} is an ordinary ($G.0$) table. For Brauer ($G.p$) tables, one has to specify a basic set \mbox{\texttt{\mdseries\slshape basicset}} of ordinary irreducibles. \mbox{\texttt{\mdseries\slshape basicset}} must then be a list of positions of the basic set characters in the \texttt{Irr} (\textbf{Reference: Irr}) list of the ordinary table of \mbox{\texttt{\mdseries\slshape gaptbl}}. 

 The result is a record that contains the information of \mbox{\texttt{\mdseries\slshape gaptbl}} in a format similar to the \textsf{MOC}{\nobreakspace}3 format. This record can, e.{\nobreakspace}g., easily be
printed out or be used to print out characters using \texttt{MOCString} (\ref{MOCString}). 

 The components of the result are 
\begin{description}
\item[{\texttt{identifier}}]  the string \texttt{MOCTable( }$name$\texttt{ )} where $name$ is the \texttt{Identifier} (\textbf{Reference: Identifier for character tables}) value of \mbox{\texttt{\mdseries\slshape gaptbl}}, 
\item[{\texttt{GAPtbl}}]  \mbox{\texttt{\mdseries\slshape gaptbl}}, 
\item[{\texttt{prime}}]  the characteristic of the field (label \texttt{30105} in \textsf{MOC}), 
\item[{\texttt{centralizers}}]  centralizer orders for cyclic subgroups (label \texttt{30130}) 
\item[{\texttt{orders}}]  element orders for cyclic subgroups (label \texttt{30140}) 
\item[{\texttt{fieldbases}}]  at position $i$ the Parker basis of the number field generated by the character values of the $i$-th cyclic subgroup. The length of \texttt{fieldbases} is equal to the value of label \texttt{30110} in \textsf{MOC}. 
\item[{\texttt{cycsubgps}}]  \texttt{cycsubgps[i] = j} means that class \texttt{i} of the \textsf{GAP} table belongs to the \texttt{j}-th cyclic subgroup of the \textsf{GAP} table, 
\item[{\texttt{repcycsub}}]  \texttt{repcycsub[j] = i} means that class \texttt{i} of the \textsf{GAP} table is the representative of the \texttt{j}-th cyclic subgroup of the \textsf{GAP} table. \emph{Note} that the representatives of \textsf{GAP} table and \textsf{MOC} table need not agree! 
\item[{\texttt{galconjinfo}}]  a list $[ r_1, c_1, r_2, c_2, \ldots, r_n, c_n ]$ which means that the $i$-th class of the \textsf{GAP} table is the $c_i$-th conjugate of the representative of the $r_i$-th cyclic subgroup on the \textsf{MOC} table. (This is used to translate back to \textsf{GAP} format, stored under label \texttt{30160}) 
\item[{\texttt{30170}}]  (power maps) for each cyclic subgroup (except the trivial one) and each prime
divisor of the representative order store four values, namely the number of
the subgroup, the power, the number of the cyclic subgroup containing the
image, and the power to which the representative must be raised to yield the
image class. (This is used only to construct the \texttt{30230} power map/embedding information.) In \texttt{30170} only a list of lists (one for each cyclic subgroup) of all these values is
stored, it will not be used by \textsf{GAP}. 
\item[{\texttt{tensinfo}}]  tensor product information, used to compute the coefficients of the Parker
base for tensor products of characters (label \texttt{30210} in \textsf{MOC}). For a field with vector space basis $(v_1, v_2, \ldots, v_n)$, the tensor product information of a cyclic subgroup in \textsf{MOC} (as computed by \texttt{fct}) is either $1$ (for rational classes) or a sequence 
\[ n x_{1,1} y_{1,1} z_{1,1} x_{1,2} y_{1,2} z_{1,2} \ldots x_{1,m_1} y_{1,m_1}
z_{1,m_1} 0 x_{2,1} y_{2,1} z_{2,1} x_{2,2} y_{2,2} z_{2,2} \ldots x_{2,m_2}
y_{2,m_2} z_{2,m_2} 0 \ldots z_{n,m_n} 0 \]
 which means that the coefficient of $v_k$ in the product 
\[ \left( \sum_{i=1}^{n} a_i v_i \right) \left( \sum_{j=1}^{n} b_j v_j \right) \]
 is equal to 
\[ \sum_{i=1}^{m_k} x_{k,i} a_{y_{k,i}} b_{z_{k,i}} . \]
 On a \textsf{MOC} table in \textsf{GAP}, the \texttt{tensinfo} component is a list of lists, each containing exactly the sequence mentioned
above. 
\item[{\texttt{invmap}}]  inverse map to compute complex conjugate characters, label \texttt{30220} in \textsf{MOC}. 
\item[{\texttt{powerinfo}}]  field embeddings for $p$-th symmetrizations, $p$ a prime integer not larger than the largest element order, label \texttt{30230} in \textsf{MOC}. 
\item[{\texttt{30900}}]  basic set of restricted ordinary irreducibles in the case of nonzero
characteristic, all ordinary irreducibles otherwise. 
\end{description}
 }

 

\subsection{\textcolor{Chapter }{MOCString}}
\logpage{[ 6, 2, 3 ]}\nobreak
\hyperdef{L}{X7FBC528C7818814C}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{MOCString({\mdseries\slshape moctbl[, chars]})\index{MOCString@\texttt{MOCString}}
\label{MOCString}
}\hfill{\scriptsize (function)}}\\


 Let \mbox{\texttt{\mdseries\slshape moctbl}} be a \textsf{MOC} table record, as returned by \texttt{MOCTable} (\ref{MOCTable}). \texttt{MOCString} returns a string describing the \textsf{MOC}{\nobreakspace}3 format of \mbox{\texttt{\mdseries\slshape moctbl}}. 

 If a second argument \mbox{\texttt{\mdseries\slshape chars}} is specified, it must be a list of \textsf{MOC} format characters as returned by \texttt{MOCChars} (\ref{MOCChars}). In this case, these characters are stored under label \texttt{30900}. If the second argument is missing then the basic set of ordinary
irreducibles is stored under this label. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@moca5:= MOCTable( CharacterTable( "A5" ) );|
  rec( 30170 := [ [  ], [ 2, 2, 1, 1 ], [ 3, 3, 1, 1 ], [ 4, 5, 1, 1 ] ]
      , 
    30900 := [ [ 1, 1, 1, 1, 0 ], [ 3, -1, 0, 0, -1 ], 
        [ 3, -1, 0, 1, 1 ], [ 4, 0, 1, -1, 0 ], [ 5, 1, -1, 0, 0 ] ], 
    GAPtbl := CharacterTable( "A5" ), centralizers := [ 60, 4, 3, 5 ], 
    cycsubgps := [ 1, 2, 3, 4, 4 ], 
    fieldbases := 
      [ CanonicalBasis( Rationals ), CanonicalBasis( Rationals ), 
        CanonicalBasis( Rationals ), 
        Basis( NF(5,[ 1, 4 ]), [ 1, E(5)+E(5)^4 ] ) ], fields := [  ], 
    galconjinfo := [ 1, 1, 2, 1, 3, 1, 4, 1, 4, 2 ], 
    identifier := "MOCTable(A5)", 
    invmap := [ [ 1, 1, 0 ], [ 1, 2, 0 ], [ 1, 3, 0 ], 
        [ 1, 4, 0, 1, 5, 0 ] ], orders := [ 1, 2, 3, 5 ], 
    powerinfo := 
      [ , 
        [ [ 1, 1, 0 ], [ 1, 1, 0 ], [ 1, 3, 0 ], 
            [ 1, 4, -1, 5, 0, -1, 5, 0 ] ], 
        [ [ 1, 1, 0 ], [ 1, 2, 0 ], [ 1, 1, 0 ], 
            [ 1, 4, -1, 5, 0, -1, 5, 0 ] ],, 
        [ [ 1, 1, 0 ], [ 1, 2, 0 ], [ 1, 3, 0 ], [ 1, 1, 0, 0 ] ] ], 
    prime := 0, repcycsub := [ 1, 2, 3, 4 ], 
    tensinfo := 
      [ [ 1 ], [ 1 ], [ 1 ], 
        [ 2, 1, 1, 1, 1, 2, 2, 0, 1, 1, 2, 1, 2, 1, -1, 2, 2, 0 ] ] )
  !gapprompt@gap>| !gapinput@str:= MOCString( moca5 );;|
  !gapprompt@gap>| !gapinput@str{[1..68]};|
  "y100y105ay110fey130t60edfy140bcdfy150bbbfcabbey160bbcbdbebecy170ccbb"
  !gapprompt@gap>| !gapinput@moca5mod3:= MOCTable( CharacterTable( "A5" ) mod 3, [ 1 .. 4 ] );;|
  !gapprompt@gap>| !gapinput@MOCString( moca5mod3 ){ [ 1 .. 68 ] };|
  "y100y105dy110edy130t60efy140bcfy150bbfcabbey160bbcbdbdcy170ccbbdfbby"
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{ScanMOC}}
\logpage{[ 6, 2, 4 ]}\nobreak
\hyperdef{L}{X7F17B82879C8F953}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{ScanMOC({\mdseries\slshape list})\index{ScanMOC@\texttt{ScanMOC}}
\label{ScanMOC}
}\hfill{\scriptsize (function)}}\\


 returns a record containing the information encoded in the list \mbox{\texttt{\mdseries\slshape list}}. The components of the result are the labels that occur in \mbox{\texttt{\mdseries\slshape list}}. If \mbox{\texttt{\mdseries\slshape list}} is in \textsf{MOC}{\nobreakspace}2 format (10000-format), the names of components are
30000-numbers; if it is in \textsf{MOC}{\nobreakspace}3 format the names of components have \texttt{yABC}-format. }

 

\subsection{\textcolor{Chapter }{GAPChars}}
\logpage{[ 6, 2, 5 ]}\nobreak
\hyperdef{L}{X7FBA67C585BEBFE5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{GAPChars({\mdseries\slshape tbl, mocchars})\index{GAPChars@\texttt{GAPChars}}
\label{GAPChars}
}\hfill{\scriptsize (function)}}\\


 Let \mbox{\texttt{\mdseries\slshape tbl}} be a character table or a \textsf{MOC} table record, and \mbox{\texttt{\mdseries\slshape mocchars}} be either a list of \textsf{MOC} format characters (as returned by \texttt{MOCChars} (\ref{MOCChars})) or a list of positive integers such as a record component encoding
characters, in a record produced by \texttt{ScanMOC} (\ref{ScanMOC}). 

 \texttt{GAPChars} returns translations of \mbox{\texttt{\mdseries\slshape mocchars}} to \textsf{GAP} character values lists. }

 

\subsection{\textcolor{Chapter }{MOCChars}}
\logpage{[ 6, 2, 6 ]}\nobreak
\hyperdef{L}{X7BF1B6BF83BDD27E}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{MOCChars({\mdseries\slshape tbl, gapchars})\index{MOCChars@\texttt{MOCChars}}
\label{MOCChars}
}\hfill{\scriptsize (function)}}\\


 Let \mbox{\texttt{\mdseries\slshape tbl}} be a character table or a \textsf{MOC} table record, and \mbox{\texttt{\mdseries\slshape gapchars}} be a list of (\textsf{GAP} format) characters. \texttt{MOCChars} returns translations of \mbox{\texttt{\mdseries\slshape gapchars}} to \textsf{MOC} format. 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@scan:= ScanMOC( str );|
  rec( y050 := [ 5, 1, 1, 0, 1, 2, 0, 1, 3, 0, 1, 1, 0, 0 ], 
    y105 := [ 0 ], y110 := [ 5, 4 ], y130 := [ 60, 4, 3, 5 ], 
    y140 := [ 1, 2, 3, 5 ], y150 := [ 1, 1, 1, 5, 2, 0, 1, 1, 4 ], 
    y160 := [ 1, 1, 2, 1, 3, 1, 4, 1, 4, 2 ], 
    y170 := [ 2, 2, 1, 1, 3, 3, 1, 1, 4, 5, 1, 1 ], 
    y210 := [ 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 0, 1, 1, 2, 1, 2, 1, -1, 2, 
        2, 0 ], y220 := [ 1, 1, 0, 1, 2, 0, 1, 3, 0, 1, 4, 0, 1, 5, 0 ],
    y230 := [ 2, 1, 1, 0, 1, 1, 0, 1, 3, 0, 1, 4, -1, 5, 0, -1, 5, 0 ], 
    y900 := [ 1, 1, 1, 1, 0, 3, -1, 0, 0, -1, 3, -1, 0, 1, 1, 4, 0, 1, 
        -1, 0, 5, 1, -1, 0, 0 ] )
  !gapprompt@gap>| !gapinput@gapchars:= GAPChars( moca5, scan.y900 );|
  [ [ 1, 1, 1, 1, 1 ], [ 3, -1, 0, -E(5)-E(5)^4, -E(5)^2-E(5)^3 ], 
    [ 3, -1, 0, -E(5)^2-E(5)^3, -E(5)-E(5)^4 ], [ 4, 0, 1, -1, -1 ], 
    [ 5, 1, -1, 0, 0 ] ]
  !gapprompt@gap>| !gapinput@mocchars:= MOCChars( moca5, gapchars );|
  [ [ 1, 1, 1, 1, 0 ], [ 3, -1, 0, 0, -1 ], [ 3, -1, 0, 1, 1 ], 
    [ 4, 0, 1, -1, 0 ], [ 5, 1, -1, 0, 0 ] ]
  !gapprompt@gap>| !gapinput@Concatenation( mocchars ) = scan.y900;|
  true
\end{Verbatim}
 }

 }

  
\section{\textcolor{Chapter }{Interface to \textsf{GAP}{\nobreakspace}3}}\label{sec:interface-gap3}
\logpage{[ 6, 3, 0 ]}
\hyperdef{L}{X80E1850F7DCED030}{}
{
  The following functions are used to read and write character tables in \textsf{GAP}{\nobreakspace}3 format. 

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


 Let \mbox{\texttt{\mdseries\slshape string}} be a string that contains the output of the \textsf{GAP}{\nobreakspace}3 function \texttt{PrintCharTable}. In other words, \mbox{\texttt{\mdseries\slshape string}} describes a \textsf{GAP} record whose components define an ordinary character table object in \textsf{GAP}{\nobreakspace}3. \texttt{GAP3CharacterTableScan} returns the corresponding \textsf{GAP}{\nobreakspace}4 character table object. 

 The supported record components are given by the list \texttt{GAP3CharacterTableData} (\ref{GAP3CharacterTableData}). }

 

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


 For an ordinary character table \mbox{\texttt{\mdseries\slshape tbl}}, \texttt{GAP3CharacterTableString} returns a string that when read into \textsf{GAP}{\nobreakspace}3 evaluates to a character table corresponding to \mbox{\texttt{\mdseries\slshape tbl}}. A similar format is printed by the \textsf{GAP}{\nobreakspace}3 function \texttt{PrintCharTable}. 

 The supported record components are given by the list \texttt{GAP3CharacterTableData} (\ref{GAP3CharacterTableData}). 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@tbl:= CharacterTable( "Alternating", 5 );;|
  !gapprompt@gap>| !gapinput@str:= GAP3CharacterTableString( tbl );;|
  !gapprompt@gap>| !gapinput@Print( str );|
  rec(
  centralizers := [ 60, 4, 3, 5, 5 ],
  fusions := [ rec( map := [ 1, 3, 4, 7, 7 ], name := "Sym(5)" ) ],
  identifier := "Alt(5)",
  irreducibles := [
  [ 1, 1, 1, 1, 1 ],
  [ 4, 0, 1, -1, -1 ],
  [ 5, 1, -1, 0, 0 ],
  [ 3, -1, 0, -E(5)-E(5)^4, -E(5)^2-E(5)^3 ],
  [ 3, -1, 0, -E(5)^2-E(5)^3, -E(5)-E(5)^4 ]
  ],
  orders := [ 1, 2, 3, 5, 5 ],
  powermap := [ , [ 1, 1, 3, 5, 4 ], [ 1, 2, 1, 5, 4 ], , [ 1, 2, 3, 1, \
  1 ] ],
  size := 60,
  text := "computed using generic character table for alternating groups\
  ",
  operations := CharTableOps )
  !gapprompt@gap>| !gapinput@scan:= GAP3CharacterTableScan( str );|
  CharacterTable( "Alt(5)" )
  !gapprompt@gap>| !gapinput@TransformingPermutationsCharacterTables( tbl, scan );|
  rec( columns := (), group := Group([ (4,5) ]), rows := () )
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{GAP3CharacterTableData}}
\logpage{[ 6, 3, 3 ]}\nobreak
\hyperdef{L}{X7B2725D2789A9D85}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{GAP3CharacterTableData\index{GAP3CharacterTableData@\texttt{GAP3CharacterTableData}}
\label{GAP3CharacterTableData}
}\hfill{\scriptsize (global variable)}}\\


 This is a list of pairs, the first entry being the name of a component in a \textsf{GAP}{\nobreakspace}3 character table and the second entry being the corresponding
attribute name in \textsf{GAP}{\nobreakspace}4. The variable is used by \texttt{GAP3CharacterTableScan} (\ref{GAP3CharacterTableScan}) and \texttt{GAP3CharacterTableString} (\ref{GAP3CharacterTableString}). }

 }

  
\section{\textcolor{Chapter }{Interface to the Cambridge Format}}\label{sec:interface-cambridge}
\logpage{[ 6, 4, 0 ]}
\hyperdef{L}{X7806073380076800}{}
{
  The following functions deal with the so-called Cambridge format, in which the
source data of the character tables in the \textsf{Atlas} of Finite Groups{\nobreakspace}\cite{CCN85} and in the \textsf{Atlas} of Brauer Characters{\nobreakspace}\cite{JLPW95} are stored. Each such table is stored on a file of its own. The line length is
at most $78$, and each item of the table starts in a new line, behind one of the following
prefixes. 

 
\begin{description}
\item[{\texttt{\#23}}]  a description and the name(s) of the simple group 
\item[{\texttt{\#7}}]  integers describing the column widths 
\item[{\texttt{\#9}}]  the symbols \texttt{;} and \texttt{@}, denoting columns between tables and columns that belong to conjugacy
classes, respectively 
\item[{\texttt{\#1}}]  the symbol \texttt{|} in columns between tables, and centralizer orders otherwise 
\item[{\texttt{\#2}}]  the symbols \texttt{p} (in the first column only), \texttt{power} (in the second column only, which belongs to the class of the identity
element), \texttt{|} in other columns between tables, and descriptions of the powers of classes
otherwise 
\item[{\texttt{\#3}}]  the symbols \texttt{p'} (in the first column only), \texttt{part} (in the second column only, which belongs to the class of the identity
element), \texttt{|} in other columns between tables, and descriptions of the $p$-prime parts of classes otherwise 
\item[{\texttt{\#4}}]  the symbols \texttt{ind} and \texttt{fus} in columns between tables, and class names otherwise 
\item[{\texttt{\#5}}]  either \texttt{|} or strings composed from the symbols \texttt{+}, \texttt{-}, \texttt{o}, and integers in columns where the lines starting with \texttt{\#4} contain \texttt{ind}; the symbols \texttt{:}, \texttt{.}, \texttt{?} in columns where these lines contain \texttt{fus}; character values or \texttt{|} otherwise 
\item[{\texttt{\#6}}]  the symbols \texttt{|}, \texttt{ind}, \texttt{and}, and \texttt{fus} in columns between tables; the symbol \texttt{|} and element orders of preimage classes in downward extensions otherwise 
\item[{\texttt{\#8}}]  the last line of the data, may contain the date of the last change 
\item[{\texttt{\#C}}]  comments. 
\end{description}
 

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


 For a character table \mbox{\texttt{\mdseries\slshape tbl}}, \texttt{CambridgeMaps} returns a record with the following components. 

 
\begin{description}
\item[{\texttt{names}}]  a list of strings denoting class names, 
\item[{\texttt{power}}]  a list of strings, the $i$-th entry encodes the $p$-th powers of the $i$-th class, for all prime divisors $p$ of the group order, 
\item[{\texttt{prime}}]  a list of strings, the $i$-th entry encodes the $p$-prime parts of the $i$-th class, for all prime divisors $p$ of the group order. 
\end{description}
 

 The meaning of the entries of the lists is defined in \cite[Chapter{\nobreakspace}7, Sections{\nobreakspace}3{\textendash}5]{CCN85}). 

 \texttt{CambridgeMaps} is used for example by \texttt{Display} (\textbf{Reference: Display for a character table}) in the case that the \texttt{powermap} option has the value \texttt{"ATLAS"}. 

 Note that the value of the \texttt{names} component may differ from the class names of the character table shown in the \textsf{Atlas} of Finite Groups; an example is the character table of the group $J_1$. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@CambridgeMaps( CharacterTable( "A5" ) );|
  rec( names := [ "1A", "2A", "3A", "5A", "B*" ], 
    power := [ "", "A", "A", "A", "A" ], 
    prime := [ "", "A", "A", "A", "A" ] )
  !gapprompt@gap>| !gapinput@CambridgeMaps( CharacterTable( "A5" ) mod 2 );|
  rec( names := [ "1A", "3A", "5A", "B*" ], 
    power := [ "", "A", "A", "A" ], prime := [ "", "A", "A", "A" ] )
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{StringOfCambridgeFormat}}
\logpage{[ 6, 4, 2 ]}\nobreak
\hyperdef{L}{X8209063C813240E5}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{StringOfCambridgeFormat({\mdseries\slshape tblnames[, p]})\index{StringOfCambridgeFormat@\texttt{StringOfCambridgeFormat}}
\label{StringOfCambridgeFormat}
}\hfill{\scriptsize (function)}}\\


 Let \mbox{\texttt{\mdseries\slshape tblnames}} be a matrix of identifiers of ordinary character tables, which describe the
bicyclic extensions of a simple group from the \textsf{Atlas} of Finite Groups. The class fusions between the character tables must be
stored on the tables. 

 If the required information is available then \texttt{StringOfCambridgeFormat} returns a string that encodes an approximation of the Cambridge format file
for the simple group in question (whose identifier occurs in the upper left
corner of \mbox{\texttt{\mdseries\slshape tblnames}}). Otherwise, that is, if some character table or class fusion is missing, \texttt{fail} is returned. 

 If a prime integer \mbox{\texttt{\mdseries\slshape p}} is given as a second argument then the result describes \mbox{\texttt{\mdseries\slshape p}}-modular character tables, otherwise the ordinary character tables are
described by the result. 

 Differences to the original format may occur for irrational character values;
the descriptions of these values have been chosen deliberately for the
original files, it is not obvious how to compute these descriptions from the
character tables in question. 

 
\begin{Verbatim}[commandchars=!DE,fontsize=\small,frame=single,label=Example]
  !gappromptDgap>E !gapinputDstr:= StringOfCambridgeFormat( [ [   "A5",   "A5.2" ],E
  !gappromptD>E !gapinputD                                    [ "2.A5", "2.A5.2" ] ] );;E
  !gappromptDgap>E !gapinputDPrint( str );E
  #23 ? A5
  #7 4 4 4 4 4 4 4 4 4 4 4 
  #9 ; @ @ @ @ @ ; ; @ @ @ 
  #1 | 60 4 3 5 5 | | 6 2 3 
  #2 p power A A A A | | A A AB 
  #3 p' part A A A A | | A A AB 
  #4 ind 1A 2A 3A 5A B* fus ind 2B 4A 6A 
  #5 + 1 1 1 1 1 : ++ 1 1 1 
  #5 + 3 -1 0 -b5 * . + 0 0 0 
  #5 + 3 -1 0 * -b5 . | | | | 
  #5 + 4 0 1 -1 -1 : ++ 2 0 -1 
  #5 + 5 1 -1 0 0 : ++ 1 -1 1 
  #6 ind 1 4 3 5 5 fus ind 2 8 6 
  #6 | 2 | 6 10 10 | | | 8 6 
  #5 - 2 0 -1 b5 * . - 0 0 0 
  #5 - 2 0 -1 * b5 . | | | | 
  #5 - 4 0 1 -1 -1 : oo 0 0 i3 
  #5 - 6 0 0 1 1 : oo 0 i2 0 
  #8
  !gappromptDgap>E !gapinputDstr:= StringOfCambridgeFormat( [ [   "A5",   "A5.2" ],E
  !gappromptD>E !gapinputD                                    [ "2.A5", "2.A5.2" ] ], 3 );;E
  !gappromptDgap>E !gapinputDPrint( str );E
  #23 A5 (Mod 3)
  #7 4 4 4 4 4 4 4 4 4 
  #9 ; @ @ @ @ ; ; @ @ 
  #1 | 60 4 5 5 | | 6 2 
  #2 p power A A A | | A A 
  #3 p' part A A A | | A A 
  #4 ind 1A 2A 5A B* fus ind 2B 4A 
  #5 + 1 1 1 1 : ++ 1 1 
  #5 + 3 -1 -b5 * . + 0 0 
  #5 + 3 -1 * -b5 . | | | 
  #5 + 4 0 -1 -1 : ++ 2 0 
  #6 ind 1 4 5 5 fus ind 2 8 
  #6 | 2 | 10 10 | | | 8 
  #5 - 2 0 b5 * . - 0 0 
  #5 - 2 0 * b5 . | | | 
  #5 - 6 0 1 1 : oo 0 i2 
  #8
  !gappromptDgap>E !gapinputDStringOfCambridgeFormat( [ [ "L10(11)" ] ], 0 );E
  fail
\end{Verbatim}
 

 The global option \texttt{OmitDashedRows} can be used to control whether the two-line description of ``dashed'' row portions (concerning tables of, e. g., $2'.Sz(8)$) are omitted (value \texttt{true}) or shown (value \texttt{false}). The default is to show information about dashed row portions in the case of
ordinary tables, and to omit this information for Brauer tables. }

 }

  
\section{\textcolor{Chapter }{Interface to the \textsf{MAGMA} System}}\label{sec:interface-magma}
\logpage{[ 6, 5, 0 ]}
\hyperdef{L}{X8676916F81F40A0F}{}
{
  This interface is intended to convert character tables given in \textsf{MAGMA}'s (see{\nobreakspace}\cite{CP96}) display format into \textsf{GAP} character tables. 

 The function \texttt{BosmaBase} (\ref{BosmaBase}) is used for the translation of irrational values; this function may be of
interest independent of the conversion of character tables. 

\subsection{\textcolor{Chapter }{BosmaBase}}
\logpage{[ 6, 5, 1 ]}\nobreak
\hyperdef{L}{X79D160BD7ECA6D2F}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{BosmaBase({\mdseries\slshape n})\index{BosmaBase@\texttt{BosmaBase}}
\label{BosmaBase}
}\hfill{\scriptsize (function)}}\\


 For a positive integer \mbox{\texttt{\mdseries\slshape n}} that is not congruent to $2$ modulo $4$, \texttt{BosmaBase} returns the list of exponents $i$ for which \texttt{E(\mbox{\texttt{\mdseries\slshape n}})\texttt{\symbol{94}}}$i$ belongs to the canonical basis of the \mbox{\texttt{\mdseries\slshape n}}-th cyclotomic field that is defined in \cite[Section{\nobreakspace}5]{Bos90}. 

 As a set, this basis is defined as follows. Let $P$ denote the set of prime divisors of \mbox{\texttt{\mdseries\slshape n}} and \mbox{\texttt{\mdseries\slshape n}} $= \prod_{{p \in P}} n_p$. Let $e_l =$ \texttt{E}$(l)$ for any positive integer $l$, and $\{ e_{{m_1}}^j \}_{{j \in J}} \otimes \{ e_{{m_2}}^k \}_{{k \in K}} = \{
e_{{m_1}}^j \cdot e_{{m_2}}^k \}_{{j \in J, k \in K}}$ for any positive integers $m_1$, $m_2$. (This notation is the same as the one used in the description of \texttt{ZumbroichBase} (\textbf{Reference: ZumbroichBase}).) 

 Then the basis is 
\[ B_n = \bigotimes_{{p \in P}} B_{{n_p}} \]
 where 
\[ B_{{n_p}} = \{ e_{{n_p}}^k; 0 \leq k \leq \varphi(n_p)-1 \}; \]
 here $\varphi$ denotes Euler's function, see \texttt{Phi} (\textbf{Reference: Phi}). 

 $B_n$ consists of roots of unity, it is an integral basis (that is, exactly the
integral elements in ${\ensuremath{\mathbb Q}}_n$ have integral coefficients w.r.t.{\nobreakspace}$B_n$, cf.{\nobreakspace}\texttt{IsIntegralCyclotomic} (\textbf{Reference: IsIntegralCyclotomic})), and for any divisor $m$ of \mbox{\texttt{\mdseries\slshape n}} that is not congruent to $2$ modulo $4$, $B_m$ is a subset of $B_n$. 

 Note that the list $l$, say, that is returned by \texttt{BosmaBase} is in general not a set. The ordering of the elements in $l$ fits to the coefficient lists for irrational values used by \textsf{MAGMA}'s display format. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@b:= BosmaBase( 8 );|
  [ 0, 1, 2, 3 ]
  !gapprompt@gap>| !gapinput@b:= Basis( CF(8), List( b, i -> E(8)^i ) );|
  Basis( CF(8), [ 1, E(8), E(4), E(8)^3 ] )
  !gapprompt@gap>| !gapinput@Coefficients( b, Sqrt(2) );|
  [ 0, 1, 0, -1 ]
  !gapprompt@gap>| !gapinput@Coefficients( b, Sqrt(-2) );|
  [ 0, 1, 0, 1 ]
  !gapprompt@gap>| !gapinput@b:= BosmaBase( 15 );|
  [ 0, 5, 3, 8, 6, 11, 9, 14 ]
  !gapprompt@gap>| !gapinput@b:= List( b, i -> E(15)^i );|
  [ 1, E(3), E(5), E(15)^8, E(5)^2, E(15)^11, E(5)^3, E(15)^14 ]
  !gapprompt@gap>| !gapinput@Coefficients( Basis( CF(15), b ), EB(15) );|
  [ -1, -1, 0, 0, -1, -2, -1, -2 ]
  !gapprompt@gap>| !gapinput@BosmaBase( 48 );|
  [ 0, 3, 6, 9, 12, 15, 18, 21, 16, 19, 22, 25, 28, 31, 34, 37 ]
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{GAPTableOfMagmaFile (for a file)}}
\logpage{[ 6, 5, 2 ]}\nobreak
\hyperdef{L}{X7B1FAE1A7FD5D5A1}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{GAPTableOfMagmaFile({\mdseries\slshape file, identifier})\index{GAPTableOfMagmaFile@\texttt{GAPTableOfMagmaFile}!for a file}
\label{GAPTableOfMagmaFile:for a file}
}\hfill{\scriptsize (function)}}\\
\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{GAPTableOfMagmaFile({\mdseries\slshape str, identifier[, "string"]})\index{GAPTableOfMagmaFile@\texttt{GAPTableOfMagmaFile}!for a string}
\label{GAPTableOfMagmaFile:for a string}
}\hfill{\scriptsize (function)}}\\


 In the first form, let \mbox{\texttt{\mdseries\slshape file}} be the name of a file that contains a character table in \textsf{MAGMA}'s display format, and \mbox{\texttt{\mdseries\slshape identifier}} be a string. \texttt{GAPTableOfMagmaFile} returns the corresponding \textsf{GAP} character table, with \texttt{Identifier} (\textbf{Reference: Identifier for tables of marks}) value \mbox{\texttt{\mdseries\slshape identifier}}. 

 In the second form, \mbox{\texttt{\mdseries\slshape str}} must be a string that describes the contents of a file as described for the
first form, and the third argument must be the string \texttt{"string"}. 

 
\begin{Verbatim}[commandchars=@BH,fontsize=\small,frame=single,label=Example]
  @gappromptBgap>H @gapinputBtmpdir:= DirectoryTemporary();;H
  @gappromptBgap>H @gapinputBfile:= Filename( tmpdir, "magmatable" );;H
  @gappromptBgap>H @gapinputBstr:= "\H
  @gappromptB>H @gapinputBCharacter Table of Group G\n\H
  @gappromptB>H @gapinputB--------------------------\n\H
  @gappromptB>H @gapinputB\n\H
  @gappromptB>H @gapinputB---------------------------\n\H
  @gappromptB>H @gapinputBClass |   1  2  3    4    5\n\H
  @gappromptB>H @gapinputBSize  |   1 15 20   12   12\n\H
  @gappromptB>H @gapinputBOrder |   1  2  3    5    5\n\H
  @gappromptB>H @gapinputB---------------------------\n\H
  @gappromptB>H @gapinputBp  =  2   1  1  3    5    4\n\H
  @gappromptB>H @gapinputBp  =  3   1  2  1    5    4\n\H
  @gappromptB>H @gapinputBp  =  5   1  2  3    1    1\n\H
  @gappromptB>H @gapinputB---------------------------\n\H
  @gappromptB>H @gapinputBX.1   +   1  1  1    1    1\n\H
  @gappromptB>H @gapinputBX.2   +   3 -1  0   Z1 Z1#2\n\H
  @gappromptB>H @gapinputBX.3   +   3 -1  0 Z1#2   Z1\n\H
  @gappromptB>H @gapinputBX.4   +   4  0  1   -1   -1\n\H
  @gappromptB>H @gapinputBX.5   +   5  1 -1    0    0\n\H
  @gappromptB>H @gapinputB\n\H
  @gappromptB>H @gapinputBExplanation of Character Value Symbols\n\H
  @gappromptB>H @gapinputB--------------------------------------\n\H
  @gappromptB>H @gapinputB\n\H
  @gappromptB>H @gapinputB# denotes algebraic conjugation, that is,\n\H
  @gappromptB>H @gapinputB#k indicates replacing the root of unity w by w^k\n\H
  @gappromptB>H @gapinputB\n\H
  @gappromptB>H @gapinputBZ1     = (CyclotomicField(5: Sparse := true)) ! [\n\H
  @gappromptB>H @gapinputBRationalField() | 1, 0, 1, 1 ]\n\H
  @gappromptB>H @gapinputB";;H
  @gappromptBgap>H @gapinputBFileString( file, str );;H
  @gappromptBgap>H @gapinputBtbl:= GAPTableOfMagmaFile( file, "MagmaA5" );;H
  @gappromptBgap>H @gapinputBDisplay( tbl );H
  MagmaA5
  
       2  2  2  .  .  .
       3  1  .  1  .  .
       5  1  .  .  1  1
  
         1a 2a 3a 5a 5b
      2P 1a 1a 3a 5b 5a
      3P 1a 2a 1a 5b 5a
      5P 1a 2a 3a 1a 1a
  
  X.1     1  1  1  1  1
  X.2     3 -1  .  A *A
  X.3     3 -1  . *A  A
  X.4     4  .  1 -1 -1
  X.5     5  1 -1  .  .
  
  A = -E(5)-E(5)^4
    = (1-Sqrt(5))/2 = -b5
  @gappromptBgap>H @gapinputBtbl2:= GAPTableOfMagmaFile( str, "MagmaA5", "string" );;H
  @gappromptBgap>H @gapinputBIrr( tbl ) = Irr( tbl2 );H
  true
  @gappromptBgap>H @gapinputBstr:= "\H
  @gappromptB>H @gapinputBCharacter Table of Group G\n\H
  @gappromptB>H @gapinputB--------------------------\n\H
  @gappromptB>H @gapinputB\n\H
  @gappromptB>H @gapinputB------------------------------\n\H
  @gappromptB>H @gapinputBClass |   1  2   3   4   5   6\n\H
  @gappromptB>H @gapinputBSize  |   1  1   1   1   1   1\n\H
  @gappromptB>H @gapinputBOrder |   1  2   3   3   6   6\n\H
  @gappromptB>H @gapinputB------------------------------\n\H
  @gappromptB>H @gapinputBp  =  2   1  1   4   3   3   4\n\H
  @gappromptB>H @gapinputBp  =  3   1  2   1   1   2   2\n\H
  @gappromptB>H @gapinputB------------------------------\n\H
  @gappromptB>H @gapinputBX.1   +   1  1   1   1   1   1\n\H
  @gappromptB>H @gapinputBX.2   +   1 -1   1   1  -1  -1\n\H
  @gappromptB>H @gapinputBX.3   0   1  1   J-1-J-1-J   J\n\H
  @gappromptB>H @gapinputBX.4   0   1 -1   J-1-J 1+J  -J\n\H
  @gappromptB>H @gapinputBX.5   0   1  1-1-J   J   J-1-J\n\H
  @gappromptB>H @gapinputBX.6   0   1 -1-1-J   J  -J 1+J\n\H
  @gappromptB>H @gapinputB\n\H
  @gappromptB>H @gapinputB\n\H
  @gappromptB>H @gapinputBExplanation of Character Value Symbols\n\H
  @gappromptB>H @gapinputB--------------------------------------\n\H
  @gappromptB>H @gapinputB\n\H
  @gappromptB>H @gapinputBJ = RootOfUnity(3)\n\H
  @gappromptB>H @gapinputB";;H
  @gappromptBgap>H @gapinputBFileString( file, str );;H
  @gappromptBgap>H @gapinputBtbl:= GAPTableOfMagmaFile( file, "MagmaC6" );;H
  @gappromptBgap>H @gapinputBDisplay( tbl );H
  MagmaC6
  
       2  1  1  1  1   1   1
       3  1  1  1  1   1   1
  
         1a 2a 3a 3b  6a  6b
      2P 1a 1a 3b 3a  3a  3b
      3P 1a 2a 1a 1a  2a  2a
  
  X.1     1  1  1  1   1   1
  X.2     1 -1  1  1  -1  -1
  X.3     1  1  A /A  /A   A
  X.4     1 -1  A /A -/A  -A
  X.5     1  1 /A  A   A  /A
  X.6     1 -1 /A  A  -A -/A
  
  A = E(3)
    = (-1+Sqrt(-3))/2 = b3
\end{Verbatim}
 

 The \textsf{MAGMA} output for the above two examples is obtained by the following commands. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@>| !gapinput@G1 := Alt(5);|
  !gapprompt@>| !gapinput@CT1 := CharacterTable(G1);|
  !gapprompt@>| !gapinput@CT1;|
  !gapprompt@>| !gapinput@G2:= CyclicGroup(6);|
  !gapprompt@>| !gapinput@CT2:= CharacterTable(G2);|
  !gapprompt@>| !gapinput@CT2;|
\end{Verbatim}
 }

 

\subsection{\textcolor{Chapter }{CharacterTableComputedByMagma}}
\logpage{[ 6, 5, 3 ]}\nobreak
\hyperdef{L}{X824D2B4A79A9E5AE}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{CharacterTableComputedByMagma({\mdseries\slshape G, identifier})\index{CharacterTableComputedByMagma@\texttt{CharacterTableComputedByMagma}}
\label{CharacterTableComputedByMagma}
}\hfill{\scriptsize (function)}}\\


 For a permutation group \mbox{\texttt{\mdseries\slshape G}} and a string \mbox{\texttt{\mdseries\slshape identifier}}, \texttt{CharacterTableComputedByMagma} calls the \textsf{MAGMA} system for computing the character table of \mbox{\texttt{\mdseries\slshape G}}, and converts the output into \textsf{GAP} format (see \texttt{GAPTableOfMagmaFile} (\ref{GAPTableOfMagmaFile:for a string})). The returned character table has the \texttt{Identifier} (\textbf{Reference: Identifier for tables of marks}) value \mbox{\texttt{\mdseries\slshape identifier}}. 

 If the \textsf{MAGMA} system is not available then \texttt{fail} is returned. The availability of \textsf{MAGMA} is determined by calling \textsf{MAGMA} where the path for this call is given by the user preference \texttt{MagmaPath} of the package \textsf{CTblLib}; if the value of this preference is empty or if \textsf{MAGMA} cannot be called via this path then \textsf{MAGMA} is regarded as not available. 

 If the attribute \texttt{ConjugacyClasses} (\textbf{Reference: ConjugacyClasses attribute}) of \mbox{\texttt{\mdseries\slshape G}} is set before the call of \texttt{CharacterTableComputedByMagma} then the columns of the returned character table fit to the conjugacy classes
that are stored in \mbox{\texttt{\mdseries\slshape G}}. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@if CTblLib.IsMagmaAvailable() then|
  !gapprompt@>| !gapinput@     g:= MathieuGroup( 24 );|
  !gapprompt@>| !gapinput@     ccl:= ConjugacyClasses( g );|
  !gapprompt@>| !gapinput@     t:= CharacterTableComputedByMagma( g, "testM24" );|
  !gapprompt@>| !gapinput@     if t = fail then|
  !gapprompt@>| !gapinput@       Print( "#E  Magma did not compute a character table.\n" );|
  !gapprompt@>| !gapinput@     elif ( not HasConjugacyClasses( t ) ) or|
  !gapprompt@>| !gapinput@          ( ConjugacyClasses( t ) <> ccl ) then|
  !gapprompt@>| !gapinput@       Print( "#E  The conjugacy classes do not fit.\n" );|
  !gapprompt@>| !gapinput@     elif TransformingPermutationsCharacterTables( t,|
  !gapprompt@>| !gapinput@              CharacterTable( "M24" ) ) = fail then|
  !gapprompt@>| !gapinput@       Print( "#E  Inconsistency of character tables?\n" );|
  !gapprompt@>| !gapinput@     fi;|
  !gapprompt@>| !gapinput@   fi;|
\end{Verbatim}
 }

 }

 }

    
\chapter{\textcolor{Chapter }{Utility Functions Provided by the \textsf{CTblLib} Package}}\label{chap:utilities}
\logpage{[ 7, 0, 0 ]}
\hyperdef{L}{X797E1693780F1093}{}
{
  This chapter describes \textsf{GAP} functions that are provided by the \textsf{CTblLib} package but that might be of general interest. 

 For the moment, there are just two features to describe, the generation of \textsf{Atlas} irrationalities from cyclotomic integers (see Section{\nobreakspace}\ref{sect:CTblLib.StringOfAtlasIrrationality}), and the generation of information about the group structure from
identifiers of character tables (see Section{\nobreakspace}\ref{sect:StructureDescriptionCharacterTableName}).  
\section{\textcolor{Chapter }{Write Character Values in Terms of Atomic \textsf{Atlas} Irrationalities}}\label{sect:CTblLib.StringOfAtlasIrrationality}
\logpage{[ 7, 1, 0 ]}
\hyperdef{L}{X7BC89F7C8460E979}{}
{
  

\subsection{\textcolor{Chapter }{CTblLib.StringOfAtlasIrrationality}}
\logpage{[ 7, 1, 1 ]}\nobreak
\hyperdef{L}{X874167957FD2B7EA}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{CTblLib.StringOfAtlasIrrationality({\mdseries\slshape cyc})\index{CTblLib.StringOfAtlasIrrationality@\texttt{CTblLib.StringOfAtlasIrrationality}}
\label{CTblLib.StringOfAtlasIrrationality}
}\hfill{\scriptsize (function)}}\\
\textbf{\indent Returns:\ }
 a string that describes the cyclotomic integer \mbox{\texttt{\mdseries\slshape cyc}}. 



 This function is intended for expressing the cyclotomic integer \mbox{\texttt{\mdseries\slshape cyc}} as a linear combination of so-called ``atomic \textsf{Atlas} irrationalities'' (see \cite[p. xxvii]{CCN85}), with integer coefficients. 

 Often there is no ``optimal'' expression of that kind for \mbox{\texttt{\mdseries\slshape cyc}}, and this function uses certain heuristics for finding a not too bad
expression. Concerning the character tables in the \textsf{Atlas} of Finite Groups \cite{CCN85}, an explicit mapping between the values which are computed by this function
and the descriptions that are shown in the book is available, see \texttt{CTblLib.IrrationalityMapping}. Such a mapping is not yet available for the character tables from the \textsf{Atlas} of Brauer Characters \cite{JLPW95}, \emph{this function is only experimental} for these tables, it is likely to be changed in the future. 

 \texttt{CTblLib.StringOfAtlasIrrationality} is used by \texttt{BrowseAtlasTable} (\ref{BrowseAtlasTable}). 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@values:= List( [ "e31", "y'24+3", "r2+i", "r2+i2" ],|
  !gapprompt@>| !gapinput@                  AtlasIrrationality );;|
  !gapprompt@gap>| !gapinput@List( values, CTblLib.StringOfAtlasIrrationality );|
  [ "e31", "y'24+3", "z8-&3+i", "2z8" ]
\end{Verbatim}
 

 The implementation uses the following heuristics for computing a description
of the cyclotomic integer \mbox{\texttt{\mdseries\slshape cyc}} with conductor $N$, say. 

 
\begin{itemize}
\item  If $N$ is not squarefree the let $N_0$ be the squarefree part of $N$, split \mbox{\texttt{\mdseries\slshape cyc}} into the sum of its odd squarefree part and its non-squarefree part, and
consider the two values separately; note that the odd squarefree part is
well-defined by the fact that the basis of the $N$-th cyclotomic field given by \texttt{ZumbroichBase} (\textbf{Reference: ZumbroichBase}) contains all primitive $N_0$-th roots of unity. Also note that except for quadratic irrationalities (where $N$ is squarefree), all roots of unity that are involved in the representation of
atomic irrationalities w.{\nobreakspace}r.{\nobreakspace}t.{\nobreakspace}this
basis have the same multiplicative order. 
\item  If \mbox{\texttt{\mdseries\slshape cyc}} is a multiple of a root of unity then write it as such, i. e., as a string
involving $z_N$. 
\item  Otherwise, if \mbox{\texttt{\mdseries\slshape cyc}} lies in a quadratic number field then write it as a linear combination of an
integer. Usually the string involves $r_N$, $i_N$, or $b_N$, but also multiples of $b_M$ may occur, where $M$ is a {\textendash}not squarefree{\textendash} multiple of $N$. 
\item  Otherwise, find a large cyclic subgroup of the stabilizer of \mbox{\texttt{\mdseries\slshape cyc}} inside the Galois group over the Rationals {\textendash}this subgroup defines
an atomic irrationality{\textendash} and express \mbox{\texttt{\mdseries\slshape cyc}} as a linear combination of the orbit sums. In the worst case, there is no
nontrivial stabilizer, and we find only a description as a sum of roots of
unity. 
\end{itemize}
 

 There is of course a lot of space for improvements. For example, one could use
the Bosma basis representation (see \texttt{BosmaBase} (\ref{BosmaBase})) of \mbox{\texttt{\mdseries\slshape cyc}} for splitting the value into a sum of values from strictly smaller cyclotomic
fields, which would be useful at least if their conductors are coprime. Note
that the Bosma basis of the $N$-th cyclotomic field has the property that it is a union of bases for the
cyclotomic fields with conductor dividing $N$. Thus one can easily find out that $\sqrt{{5}} + \sqrt{{7}}$ can be written as a sum of two values in terms of $5$-th and $7$-th roots of unity. In non-coprime situations, this argument fails. For
example, one can still detect that $\sqrt{{15}} + \sqrt{{21}}$ involves only $15$-th and $21$-th roots of unity, but it is not obvious how to split the value into the two
parts. }

 }

  
\section{\textcolor{Chapter }{Create a String that Describes the Group Structure}}\label{sect:StructureDescriptionCharacterTableName}
\logpage{[ 7, 2, 0 ]}
\hyperdef{L}{X7D867FE08240B83B}{}
{
  

\subsection{\textcolor{Chapter }{StructureDescriptionCharacterTableName}}
\logpage{[ 7, 2, 1 ]}\nobreak
\hyperdef{L}{X816807E4874585FD}{}
{\noindent\textcolor{FuncColor}{$\triangleright$\enspace\texttt{StructureDescriptionCharacterTableName({\mdseries\slshape name})\index{StructureDescriptionCharacterTableName@\texttt{Structure}\-\texttt{Description}\-\texttt{Character}\-\texttt{Table}\-\texttt{Name}}
\label{StructureDescriptionCharacterTableName}
}\hfill{\scriptsize (function)}}\\


 For a string \mbox{\texttt{\mdseries\slshape name}} that is an admissible name of a character table, \texttt{StructureDescriptionCharacterTableName} returns a string that is intended as a description of the structure of the
underlying group. 

 Note that many identifiers of character tables (see \texttt{Identifier} (\textbf{Reference: Identifier for character tables})) do not describe the group structure in an appropriate way. One reason for
choosing such identifiers on purpose is that several character tables for
isomorphic groups can be contained in the library, because the groups have
different class fusions into another group. For example, the Mathieu group $M_{12}$ contains two classes of subgroups isomorphic with $M_{11}$, and the identifiers of the character tables corresponding to these subgroups
are \texttt{"M11"} and \texttt{"M12M2"}, respectively. 

 
\begin{Verbatim}[commandchars=!@|,fontsize=\small,frame=single,label=Example]
  !gapprompt@gap>| !gapinput@StructureDescriptionCharacterTableName( "M12M2" );|
  "M11"
\end{Verbatim}
 }

 }

  }

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

\bibliographystyle{alpha}
\bibliography{manualbib.xml,gapmanualbib.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}
