4 Contents of the **GAP** Character Table Library

This chapter informs you about

the currently available character tables (see Section 4.1),

generic character tables (see Section 4.2),

the subsets of

**Atlas**tables (see Section 4.3) and**CAS**tables (see Section 4.4),installing the library, and related user preferences (see Section 4.5).

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

the technicalities of the access to library tables (see Section 4.6),

how to extend the library (see Section 4.7), and

sanity checks (see Section 4.8).

This section gives a brief overview of the contents of the **GAP** character table library. For the details about, e. g., the structure of data files, see Section 4.6.

The changes in the character table library since the first release of **GAP** 4 are listed in a file that can be fetched from

https://www.math.rwth-aachen.de/~Thomas.Breuer/ctbllib/htm/ctbldiff.htm .

There are three different kinds of character tables in the **GAP** library, namely *ordinary character tables*, *Brauer tables*, and *generic character tables*. Note that the Brauer table and the corresponding ordinary table of a group determine the *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 **GAP**, see Section Reference: Operations Concerning Blocks for details. A collection of PDF files of the known decomposition matrices of **Atlas** tables in the **GAP** Character Table Library can also be found at

https://www.math.rwth-aachen.de/~MOC/decomposition/.

Two different aspects are useful to list the ordinary character tables available in **GAP**, namely the aspect of the *source* of the tables and that of *relations* between the tables.

As for the source, there are first of all two big sources, namely the **Atlas** of Finite Groups (see Section 4.3) and the **CAS** library of character tables (see [NPP84]). Many **Atlas** tables are contained in the **CAS** library, and difficulties may arise because the succession of characters and classes in **CAS** tables and **Atlas** tables are in general different, so see Section 4.4 for the relations between these two variants of character tables of the same group. A subset of the **CAS** tables is the set of tables of Sylow normalizers of sporadic simple groups as published in [Ost86] 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. Hanrath, see [Han88]) that are part of [HP89], in the form of two microfiches; these tables are given in **CAS** format (see Section 4.4) on the microfiches, but they had not been part of the "official" **CAS** library.

To avoid confusion about the ordering of classes and characters in a given table, authorship and so on, the `InfoText`

(Reference: InfoText) value of the table contains the information

`origin: ATLAS of finite groups`

for

**Atlas**tables (see Section 4.3),`origin: Ostermann`

for tables contained in [Ost86],

`origin: CAS library`

for any table of the

**CAS**table library that is contained neither in the**Atlas**nor in [Ost86], and`origin: Hanrath library`

for tables contained in the microfiches in [HP89].

The `InfoText`

(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 **CAS** library then additional information may be available via the `CASInfo`

(4.4-1) value.

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

We have

all

**Atlas**tables (see Section 4.3), i. e., the tables of the simple groups which are contained in the**Atlas**of Finite Groups, and the tables of cyclic and bicyclic extensions of these groups,most tables of maximal subgroups of sporadic simple groups (

*not all*for the Monster group),many tables of maximal subgroups of other

**Atlas**tables; the`Maxes`

(3.7-1) value for the table is set if all tables of maximal subgroups are available,the tables of many Sylow \(p\)-normalizers of sporadic simple groups; this includes the tables printed in [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,

some tables of element centralizers,

some tables of Sylow \(p\)-subgroups,

and a few other tables, e. g.

`W(F4)`

*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. r. t. the composition of maps.

The library contains all tables of the **Atlas** of Brauer Tables ([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

origin: modular ATLAS of finite groups

in their `InfoText`

(Reference: InfoText) string.

Generic character tables provide a means for writing down the character tables of all groups in a (usually infinite) series of similar groups, e. 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 **GAP** allows one such local evaluations. In this sense, **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 **GAP** are the specialisation of the parameter \(q\) in order to compute the whole character table of \(G_q\), and local evaluation (see `ClassParameters`

(Reference: ClassParameters) for an example). **GAP** does *not* support the computation of, e. 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 *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 *parametrisation* of the classes in \(t\) is a function that assigns to each conjugacy class of \(G_q\) in \(t\) a *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 **GAP**, the parametrisations of classes and characters for tables computed from generic tables is stored using the attributes `ClassParameters`

(Reference: ClassParameters) and `CharacterParameters`

(Reference: CharacterParameters).

Currently, generic tables of the following groups –in alphabetical order– are available in **GAP**. (A list of the names of generic tables known to **GAP** is `LIBTABLE.GENERIC.firstnames`

.) We list the function calls needed to get a specialized table, the generic table itself can be accessed by calling `CharacterTable`

(Reference: CharacterTable) with the first argument only; for example, `CharacterTable( "Cyclic" )`

yields the generic table of cyclic groups.

`CharacterTable( "Alternating",`

\(n\)`)`

the table of the

*alternating*group on \(n\) letters,`CharacterTable( "Cyclic",`

\(n\)`)`

the table of the

*cyclic*group of order \(n\),`CharacterTable( "Dihedral",`

\(2n\)`)`

the table of the

*dihedral*group of order \(2n\),`CharacterTable( "DoubleCoverAlternating",`

\(n\)`)`

the table of the

*Schur double cover of the alternating*group on \(n\) letters (see [Noe02]),`CharacterTable( "DoubleCoverSymmetric",`

\(n\)`)`

the table of the

*standard Schur double cover of the symmetric*group on \(n\) letters (see [Noe02]),`CharacterTable( "GL", 2,`

\(q\)`)`

the table of the

*general linear*group`GL(2,`

\(q\)`)`

, for a prime power \(q\),`CharacterTable( "GU", 3,`

\(q\)`)`

the table of the

*general unitary*group`GU(3,`

\(q\)`)`

, for a prime power \(q\),`CharacterTable( "P:Q",`

\([ p, q ]\)`)`

and`CharacterTable( "P:Q",`

\([ p, q, k ]\)`)`

the table of the

*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\),`CharacterTable( "PSL", 2,`

\(q\)`)`

the table of the

*projective special linear*group`PSL(2,`

\(q\)`)`

, for a prime power \(q\),`CharacterTable( "SL", 2,`

\(q\)`)`

the table of the

*special linear*group`SL(2,`

\(q\)`)`

, for a prime power \(q\),`CharacterTable( "SU", 3,`

\(q\)`)`

the table of the

*special unitary*group`SU(3,`

\(q\)`)`

, for a prime power \(q\),`CharacterTable( "Suzuki",`

\(q\)`)`

the table of the

*Suzuki*group`Sz(`

\(q\)`)`

\(= {}^2B_2(q)\), for \(q\) an odd power of \(2\),`CharacterTable( "Symmetric",`

\(n\)`)`

the table of the

*symmetric*group on \(n\) letters,`CharacterTable( "WeylB",`

\(n\)`)`

the table of the

*Weyl*group of type \(B_n\),`CharacterTable( "WeylD",`

\(n\)`)`

the table of the

*Weyl*group of type \(D_n\).

In addition to the above calls that really use generic tables, the following calls to `CharacterTable`

(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 **GAP** that can be asked for local information.

`CharacterTable( "Quaternionic",`

\(4n\)`)`

the table of the

*generalized quaternionic*group of order \(4n\),`CharacterTableWreathSymmetric( tbl,`

\(n\)`)`

the character table of the wreath product of the group whose table is

`tbl`

with the symmetric group on \(n\) letters, see`CharacterTableWreathSymmetric`

(Reference: CharacterTableWreathSymmetric).

`‣ CharacterTableSpecialized` ( gentbl, q ) | ( function ) |

For a record `gentbl` representing a generic character table, and a parameter value `q`, `CharacterTableSpecialized`

returns a character table object computed by evaluating `gentbl` at `q`.

gap> c5:= CharacterTableSpecialized( CharacterTable( "Cyclic" ), 5 ); CharacterTable( "C5" ) gap> 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

(Also `CharacterTable( "Cyclic", 5 )`

could have been used to construct the above table.)

gap> HasClassParameters( c5 ); HasCharacterParameters( c5 ); true true gap> ClassParameters( c5 ); CharacterParameters( c5 ); [ [ 1, 0 ], [ 1, 1 ], [ 1, 2 ], [ 1, 3 ], [ 1, 4 ] ] [ [ 1, 0 ], [ 1, 1 ], [ 1, 2 ], [ 1, 3 ], [ 1, 4 ] ] gap> ClassParameters( CharacterTable( "Symmetric", 3 ) ); [ [ 1, [ 1, 1, 1 ] ], [ 1, [ 2, 1 ] ], [ 1, [ 3 ] ] ]

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.

gap> CharacterTable( "Cyclic" ).irreducibles[1][1]( 5, 2, 3 ); E(5) gap> tbl:= CharacterTable( "Symmetric" );; gap> tbl.irreducibles[1][1]( 5, [ 3, 2 ], [ 2, 2, 1 ] ); 1 gap> tbl.orders[1]( 5, [ 2, 1, 1, 1 ] ); 2

Any generic table in **GAP** is represented by a record. The following components are supported for generic character table records.

`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]\),

`charparam`

list of functions, one for each character type \(t\), with argument \(q\), returning the list of character parameters of type \(t\),

`classparam`

list of functions, one for each class type \(t\), with argument \(q\), returning the list of class parameters of type \(t\),

`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

*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),`domain`

function of \(q\) returning

`true`

if \(q\) is a valid parameter, and`false`

otherwise,`identifier`

identifier string of the generic table,

`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\),

`isGenericTable`

always

`true`

`libinfo`

record with components

`firstname`

(`Identifier`

(Reference: Identifier for character tables) value of the table) and`othernames`

(list of other admissible names)`matrix`

function of \(q\) returning the matrix of irreducibles of \(G_q\),

`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\),

`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]\),

`size`

function of \(q\) returning the order of \(G_q\),

`specializedname`

function of \(q\) returning the

`Identifier`

(Reference: Identifier for character tables) value of the table of \(G_q\),`text`

string informing about the generic table

In the specialized table, the `ClassParameters`

(Reference: ClassParameters) and `CharacterParameters`

(Reference: CharacterParameters) values are the lists of parameters \([t,p_t]\) of classes and characters, respectively.

If the `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 `CharacterTableSpecialized`

(4.2-2)).

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}\).

gap> 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" )

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 ≠ 0, \tau ≠ 0, \rho ≠ \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.

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 )

The **GAP** character table library contains all character tables of bicyclic extensions of simple groups that are included in the **Atlas** of Finite Groups ([CCN+85], from now on called **Atlas**), and the Brauer tables contained in the **Atlas** of Brauer Characters ([JLPW95]).

These tables have the information

origin: ATLAS of finite groups

or

origin: modular ATLAS of finite groups

in their `InfoText`

(Reference: InfoText) value, they are simply called **Atlas** tables further on.

For displaying **Atlas** tables with the row labels used in the **Atlas**, or for displaying decomposition matrices, see `LaTeXStringDecompositionMatrix`

(Reference: LaTeXStringDecompositionMatrix) and `AtlasLabelsOfIrreducibles`

(4.3-6).

In addition to the information given in Chapters 6 to 8 of the **Atlas** which tell you how to read the printed tables, there are some rules relating these to the corresponding **GAP** tables.

For the **GAP** Character Table Library not the printed versions of the **Atlas** of Finite Groups and the **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 [BN95], and is printed in the Appendix of [JLPW95]; it contains the improvements that had been known until the "**Atlas** of Brauer Characters" was published. The second list contains the improvements to the **Atlas** of Finite Groups that were found since the publication of [JLPW95]. It can be found in the internet, an HTML version at

http://web.mat.bham.ac.uk/atlas/html/atlasmods.html

and a DVI version at

http://web.mat.bham.ac.uk/atlas/html/atlasmods.dvi.

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

https://www.math.rwth-aachen.de/~MOC/ABCerr.html

and

https://www.math.rwth-aachen.de/~MOC/ABCerr.pdf,

respectively.

Also some tables are regarded as **Atlas** tables that are not printed in the **Atlas** but available in **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\).

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 **Atlas** but determined only up to matrix automorphisms (see `MatrixAutomorphisms`

(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 `InfoText`

(Reference: InfoText) strings of the tables.

If \(G\) (or \(G.a\)) has a nontrivial Schur multiplier then the attribute `ProjectivesInfo`

(3.7-2) of the **GAP** table object of \(G\) (or \(G.a\)) is set; the `chars`

component of the record in question is the list of values lists of those faithful projective irreducibles that are printed in the **Atlas** (so-called *proxy character*), and the `map`

component lists the positions of columns in the covering for which the column is printed in the **Atlas** (a so-called *proxy class*, this preimage is denoted by \(g_0\) in Chapter 7, Section 14 of the **Atlas**).

As described in Chapter 6, Section 7 and in Chapter 7, Section 18 of the **Atlas**, there exist two (often nonisomorphic) groups of structure \(2.G.2\) for a simple group \(G\), which are isoclinic. The table in the **GAP** Character Table Library is the one printed in the **Atlas**, the table of the isoclinic variant can be constructed using `CharacterTableIsoclinic`

(Reference: CharacterTableIsoclinic).

(Throughout this section, \(G\) always means the simple group involved.)

For \(G\) itself, the ordering of classes and characters in the

**GAP**table coincides with the one in the**Atlas**.For an automorphic extension \(G.a\), there are three types of characters.

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 [CCN+85, Chapter 7, Section 16]).

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\).

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\).

Similarly, there are different types of classes for an automorphic extension \(G.a\), as follows.

If some classes collapse then the resulting class replaces the first involved class of \(G\).

For \(a > 2\), any proxy class and its algebraic conjugates that are not printed in the

**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 [CCN+85, Chapter 7, Section 19]).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

**Atlas**, with the only exception \(U_3(8).6\).

For a central extension \(M.G\), there are two different types of characters, as follows.

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

**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\).If \(m > 2\), a faithful character of \(m.G\) that is printed in the

**Atlas**(a so-called*proxy character*) represents two or more Galois conjugates. In each**Atlas**table in**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).

For the classes of a central extension we have the following.

The preimages of a \(G\)-class in \(M.G\) are subsequent, the ordering is the same as that of the lifting order rows in [CCN+85, Chapter 7, Section 7].

The primitive roots of unity chosen to represent the generating central element (i. e., the element in the second class of the

**GAP**table) are`E(3)`

,`E(4)`

,`E(6)^5`

(`= E(2)*E(3)`

), and`E(12)^7`

(`= E(3)*E(4)`

), for \(m = 3\), \(4\), \(6\), and \(12\), respectively.

For tables of bicyclic extensions \(m.G.a\), both the rules for automorphic and central extensions hold. Additionally we have the following three rules.

Whenever classes of the subgroup \(m.G\) collapse in \(m.G.a\) then the resulting class replaces the first involved class.

Whenever characters of the subgroup \(m.G\) collapse fuse in \(m.G.a\) then the result character replaces the first involved character.

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.

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.

`‣ AtlasLabelsOfIrreducibles` ( tbl[, short] ) | ( function ) |

Let `tbl` be the (ordinary or Brauer) character table of a bicyclic extension of a simple group that occurs in the **Atlas** of Finite Groups [CCN+85] or the **Atlas** of Brauer Characters [JLPW95]. `AtlasLabelsOfIrreducibles`

returns a list of strings, the \(i\)-th entry being a label for the \(i\)-th irreducible character of `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 **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 **Atlas**, the unique character that is not printed and for which \(\chi_i\) acts as proxy (see [CCN+85, Chapter 7, Sections 8 and 19]), 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.

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

**Atlas**.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

`true`

or the string`"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**Atlas**.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

`true`

or the string`"short"`

was entered as the second argument then the label has the short form \(\chi_{{i,j+}}\).

gap> 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}" ] gap> 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+}" ]

We give three little examples for the conventions stated in Section 4.3, listing both the **Atlas** format and the table displayed by **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

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\):

┌───────┐ ┌───────┐ ; @ ; ; @ 2 1 1 1 1 1 1 │ │ │ │ 1 1 3 1 1 1 1 1 1 │ G │ │ G.2 │ p power A │ │ │ │ p' part A 1a 3a 3b 2a 6a 6b └───────┘ └───────┘ ind 1A fus ind 2A 2P 1a 3b 3a 1a 3b 3a ┌───────┐ ┌───────┐ 3P 1a 1a 1a 2a 2a 2a │ │ │ │ χ_1 + 1 : ++ 1 │ 3.G │ │ 3.G.2 │ X.1 1 1 1 1 1 1 │ │ │ │ ind 1 fus ind 2 X.2 1 1 1 -1 -1 -1 └───────┘ └───────┘ 3 6 X.3 1 A /A 1 A /A 3 6 X.4 1 A /A -1 -A -/A X.5 1 /A A 1 /A A χ_2 o2 1 : oo2 1 X.6 1 /A A -1 -/A -A A = E(3) = (-1+ER(-3))/2 = b3

`X.1`

,`X.2`

extend \(\chi_1\).`X.3`

,`X.4`

extend the proxy character \(\chi_2\).`X.5`

,`X.6`

extend the not printed character with proxy \(\chi_2\). The classes`1a`

,`3a`

,`3b`

are preimages of`1A`

, and`2a`

,`6a`

,`6b`

are preimages of`2A`

.

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\):

┌───────┐ ┌───────┐ ; @ ; ; @ 2 1 1 1 1 1 1 │ │ │ │ 1 1 3 1 1 1 1 1 1 │ G │ │ G.3 │ p power A │ │ │ │ p' part A 1a 2a 3a 6a 3b 6b └───────┘ └───────┘ ind 1A fus ind 3A 2P 1a 1a 3b 3b 3a 3a ┌───────┐ ┌───────┐ 3P 1a 2a 1a 2a 1a 2a │ │ │ │ χ_1 + 1 : +oo 1 │ 2.G │ │ 2.G.3 │ X.1 1 1 1 1 1 1 │ │ │ │ ind 1 fus ind 3 X.2 1 1 A A /A /A └───────┘ └───────┘ 2 6 X.3 1 1 /A /A A A X.4 1 -1 1 -1 1 -1 χ_2 + 1 : +oo 1 X.5 1 -1 A -A /A -/A X.6 1 -1 /A -/A A -A A = E(3) = (-1+ER(-3))/2 = b3

`X.1`

to`X.3`

extend \(\chi_1\),`X.4`

to`X.6`

extend \(\chi_2\). The classes`1a`

and`2a`

are preimages of`1A`

,`3a`

and`6a`

are preimages of the proxy class`3A`

, and`3b`

and`6b`

are preimages of the not printed class with proxy`3A`

.

as a downward extension of the factor groups \(C_3\) and \(C_2\) which have \(G\) as a factor group:

┌───────┐ ; @ 2 1 1 1 1 1 1 │ │ 1 3 1 1 1 1 1 1 │ G │ p power │ │ p' part 1a 6a 3a 2a 3b 6b └───────┘ ind 1A 2P 1a 3a 3b 1a 3a 3b ┌───────┐ 3P 1a 2a 1a 2a 1a 2a │ │ χ_1 + 1 │ 2.G │ X.1 1 1 1 1 1 1 │ │ ind 1 X.2 1 ─1 1 ─1 1 ─1 └───────┘ 2 X.3 1 A /A 1 A /A ┌───────┐ X.4 1 /A A 1 /A A │ │ χ_2 + 1 X.5 1 ─A /A ─1 A ─/A │ 3.G │ X.6 1 ─/A A ─1 /A ─A │ │ ind 1 └───────┘ 3 A = E(3) ┌───────┐ 3 = (─1+ER(─3))/2 = b3 │ │ │ 6.G │ χ_3 o2 1 │ │ └───────┘ ind 1 6 3 2 3 6 χ_4 o2 1

`X.1`

,`X.2`

correspond to \(\chi_1, \chi_2\), respectively;`X.3`

,`X.5`

correspond to the proxies \(\chi_3\), \(\chi_4\), and`X.4`

,`X.6`

to the not printed characters with these proxies. The factor fusion onto \(3.G\) is given by`[ 1, 2, 3, 1, 2, 3 ]`

, that onto \(G.2\) by`[ 1, 2, 1, 2, 1, 2 ]`

.

as an upward extension of the subgroups \(C_3\) or \(C_2\) which both contain a subgroup isomorphic to \(G\):

┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │ │ │ │ │ │ │ │ │ G │ │ G.2 │ │ G.3 │ │ G.6 │ │ │ │ │ │ │ │ │ └───────┘ └───────┘ └───────┘ └───────┘ ; @ ; ; @ ; ; @ ; ; @ 1 1 1 1 p power A A AA p' part A A AA ind 1A fus ind 2A fus ind 3A fus ind 6A χ_1 + 1 : ++ 1 : +oo 1 :+oo+oo 1 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 3b 3a 3P 1a 2a 1a 1a 2a 2a X.1 1 1 1 1 1 1 X.2 1 -1 A /A -A -/A X.3 1 1 /A A /A A X.4 1 -1 1 1 -1 -1 X.5 1 1 A /A A /A X.6 1 -1 /A A -/A -A A = E(3) = (-1+ER(-3))/2 = b3

The classes

`1a`

,`2a`

correspond to \(1A\), \(2A\), respectively.`3a`

,`6a`

correspond to the proxies \(3A\), \(6A\), and`3b`

,`6b`

to the not printed classes with these proxies.

The second example explains the fusion case. Again, \(G\) is the trivial group.

┌───────┐ ┌───────┐ ; @ ; ; @ 3.G.2 │ │ │ │ 1 1 │ G │ │ G.2 │ p power A 2 1 . 1 │ │ │ │ p' part A 3 1 1 . └───────┘ └───────┘ ind 1A fus ind 2A ┌───────┐ ┌───────┐ 1a 3a 2a │ │ │ │ χ_1 + 1 : ++ 1 2P 1a 3a 1a │ 2.G │ │ 2.G.2 │ 3P 1a 1a 2a │ │ │ │ ind 1 fus ind 2 └───────┘ └───────┘ 2 2 X.1 1 1 1 ┌───────┐ ┌─────── X.2 1 1 ─1 │ │ │ χ_2 + 1 : ++ 1 X.3 2 ─1 . │ 3.G │ │ 3.G.2 │ │ │ ind 1 fus ind 2 └───────┘ 3 6.G.2 ┌───────┐ ┌─────── 3 │ │ │ 2 2 1 1 2 2 2 │ 6.G │ │ 6.G.2 χ_3 o2 1 * + 3 1 1 1 1 . . │ │ │ └───────┘ ind 1 fus ind 2 1a 6a 3a 2a 2b 2c 6 2 2P 1a 3a 3a 1a 1a 1a 3 3P 1a 2a 1a 2a 2b 2c 2 3 Y.1 1 1 1 1 1 1 6 Y.2 1 1 1 1 -1 -1 Y.3 1 -1 1 -1 1 -1 χ_4 o2 1 * + Y.4 1 -1 1 -1 -1 1 Y.5 2 -1 -1 2 . . Y.6 2 1 -1 -2 . .

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 **GAP** tables of \(3.G.2 \cong D_6\) and \(6.G.2 \cong D_{12}\).

In \(3.G.2\), the characters `X.1`

, `X.2`

extend \(\chi_1\); \(\chi_3\) and its non-printed partner fuse to give `X.3`

, and the two preimages of `1A`

of order \(3\) collapse.

In \(6.G.2\), `Y.1`

to `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 `[ 1, 2, 1, 2, 3, 4 ]`

). `Y.5`

is inflated from \(3.G.2\) (with respect to the factor fusion `[ 1, 2, 2, 1, 3, 3 ]`

), and `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.

┌───────┐ ┌───────┐ ; @ @ @ @ ; ; @ │ │ │ │ 4 4 4 4 1 │ G │ │ G.3 │ p power A A A A │ │ │ │ p' part A A A A └───────┘ └───────┘ ind 1A 2A 2B 2C fus ind 3A ┌───────┐ ┌───────┐ │ │ │ │ χ_1 + 1 1 1 1 : +oo 1 │ 2.G │ │ 2.G.3 │ χ_2 + 1 1 ─1 ─1 . + 0 │ │ │ │ χ_3 + 1 ─1 1 ─1 | └───────┘ └───────┘ χ_4 + 1 ─1 ─1 1 | ind 1 4 4 4 fus ind 3 2 6 χ_5 - 2 0 0 0 : -oo 1 G.3 2 2 2 . . 3 1 . 1 1 1a 2a 3a 3b 2P 1a 1a 3b 3a 3P 1a 2a 1a 1a X.1 1 1 1 1 X.2 1 1 A /A X.3 1 1 /A A 2.G.3 X.4 3 -1 . . 2 3 3 2 1 1 1 1 A = E(3) 3 1 1 . 1 1 1 1 = (-1+ER(-3))/2 = b3 1a 2a 4a 3a 6a 3b 6b 2.G 2P 1a 1a 2a 3b 3b 3a 3a 3P 1a 2a 4a 1a 2a 1a 2a 2 3 3 2 2 2 X.1 1 1 1 1 1 1 1 1a 2a 4a 4b 4c X.2 1 1 1 A A /A /A 2P 1a 1a 2a 1a 1a X.3 1 1 1 /A /A A A 3P 1a 2a 4a 4b 4c X.4 3 3 -1 . . . . X.5 2 -2 . 1 1 1 1 X.1 1 1 1 1 1 X.6 2 -2 . A -A /A -/A X.2 1 1 1 -1 -1 X.7 2 -2 . /A -/A A -A X.3 1 1 -1 1 -1 X.4 1 1 -1 -1 1 A = E(3) X.5 2 -2 . . . = (-1+ER(-3))/2 = b3

In the table of \(G.3 \cong A_4\), the characters \(\chi_2\), \(\chi_3\), and \(\chi_4\) fuse, and the classes `2A`

, `2B`

and `2C`

collapse. For getting the table of \(2.G \cong Q_8\), one just has to split the class `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 `[ 1, 2, 3, 3, 3 ]`

, and the factor fusion corresponding to the epimorphism \(2.G.3 \rightarrow G.3\) is `[ 1, 1, 2, 3, 3, 4, 4 ]`

.

One of the predecessors of **GAP** was **CAS** (*C*haracter *A*lgorithm *S*ystem, see [NPP84]), which had also a library of character tables. All these character tables are available in **GAP** except if stated otherwise in the file `doc/ctbldiff.pdf`

. This sublibrary has been completely revised before it was included in **GAP**, for example, errors have been corrected and power maps have been completed.

Any **CAS** table is accessible by each of its **CAS** names (except if stated otherwise in `doc/ctbldiff.pdf`

), that is, the table name or the filename used in **CAS**.

`‣ CASInfo` ( tbl ) | ( attribute ) |

Let `tbl` be an ordinary character table in the **GAP** library that was (up to permutations of classes and characters) contained already in the **CAS** table library. When one fetches `tbl` from the library, one does in general not get the original **CAS** table. Namely, in many cases (mostly **Atlas** tables, see Section 4.3), the identifier of the table (see `Identifier`

(Reference: Identifier for character tables)) as well as the ordering of classes and characters are different for the **CAS** table and its **GAP** version.

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

The `CASInfo`

value of `tbl`, if stored, is a list of records, each describing the relation between `tbl` and a character table in the **CAS** library. The records have the components

`name`

the name of the

**CAS**table,`permchars`

and`permclasses`

permutations of the

`Irr`

(Reference: Irr) values and the classes of`tbl`, respectively, that must be applied in order to get the orderings in the original**CAS**table, and`text`

the text that was stored on the

**CAS**table (which may contain incorrect statements).

gap> tbl:= CharacterTable( "m10" ); CharacterTable( "A6.2_3" ) gap> HasCASInfo( tbl ); true gap> 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" ) ]

The class fusions stored on tables from the **CAS** library have been computed anew with **GAP**; the `text`

component of such a fusion record tells if the fusion map is equal to that in the **CAS** library, up to the permutation of classes between the table in **CAS** and its **GAP** version.

gap> 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" )

To install the package unpack the archive file in a directory in the `pkg`

directory of your local copy of **GAP** 4. This might be the `pkg`

directory of the **GAP** 4 home directory, see Section Reference: Installing a GAP Package for details. It is however also possible to keep an additional `pkg`

directory in your private directories, see Reference: GAP Root Directories. The latter possibility *must* be chosen if you do not have write access to the **GAP** root directory.

The package consists entirely of **GAP** code, no external binaries need to be compiled.

For checking the installation of the package, you should start **GAP** and call

gap> ReadPackage( "ctbllib", "tst/testinst.g" );

If the installation is o. k. then `true`

is printed, and the **GAP** prompt appears again; otherwise the output lines tell you what should be changed.

More testfiles are available in the `tst`

directory of the package.

PDF and HTML versions of the package manual are available in the `doc`

directory of the package.

Data files from the **GAP** Character Table Library may be read only once during a **GAP** session –this is efficient but requires memory– or the cached data may be erased as soon as a second data file is to be read –this requires less memory but is usually less efficient.

One can choose between these two possibilities via the user preference `"UnloadCTblLibFiles"`

of the **CTblLib** package, see `UserPreference`

(Reference: UserPreference). The default value of this preference is `true`

, that is, the contents of only one data file is kept in memory. Call `SetUserPreference( "CTblLib", "UnloadCTblLibFiles", false );`

if you want to change this behaviour.

The way how the functions `DisplayAtlasContents`

(3.5-6), `DisplayAtlasInfo`

(AtlasRep: DisplayAtlasInfo), `DisplayAtlasMap`

(3.5-8), and `DisplayCTblLibInfo`

(3.5-1) show tabular information can be customized via the user preference `"DisplayFunction"`

of the **AtlasRep** package, see Section AtlasRep: User preference DisplayFunction.

`MagmaPath`

This preference describes the path for calling **MAGMA**. An empty string (the default) means that **MAGMA** is not available.

This preference is used by `CharacterTableComputedByMagma`

(6.5-3).

The data files of the **GAP** Character Table Library reside in the `data`

directory of the package **CTblLib**.

The filenames start with `ct`

(for "character table"), followed by either `o`

(for "ordinary"), `b`

(for "Brauer"), or `g`

(for "generic"), then a description of the contents (up to \(5\) characters, e. g., `alter`

for the tables of alternating and related groups), and the suffix `.tbl`

.

The file `ctb`

\(descr\)`.tbl`

contains the known Brauer tables corresponding to the ordinary tables in the file `cto`

\(descr\)`.tbl`

.

Each data file of the table library is supposed to consist of

comment lines, starting with a hash character

`#`

in the first column,an assignment to a component of

`LIBTABLE.LOADSTATUS`

, at the end of the file, andfunction calls of the form

`MBT(`

\(name, data\)`)`

("make Brauer table"),`MOT(`

\(name, data\)`)`

("make ordinary table"),`ALF(`

\(from, to, map\)`)`

,`ALF(`

\(from, to, map, textlines\)`)`

("add library fusion"),`ALN(`

\(name, listofnames\)`)`

("add library name"), and`ARC(`

\(name, component, compdata\)`)`

("add record component").

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

**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**GAP**object.`MOT`

,`ALF`

,`ALN`

, and`ARC`

occur only in files containing ordinary character tables, and`MBT`

occurs only in files containing Brauer tables.

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

`ACM`

, `Concatenation`

(Reference: concatenation of lists), `E`

(Reference: E), `EvalChars`

, `GALOIS`

, `Length`

(Reference: Length), `ShallowCopy`

(Reference: ShallowCopy), `TENSOR`

, and `TransposedMat`

(Reference: TransposedMat).

The function `CTblLib.RecomputeTOC`

in the file `gap4/maketbl.g`

of the **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 Reference: Strings and Characters), i. e., they are enclosed in double quotes; *strings in table library files must not be split over several lines*, because otherwise the function `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.

**Full ordinary tables**are encoded by a call to the function

`MOT`

, where the arguments correspond to the relevant attribute values; each fusion into another library table is added by a call to`ALF`

, values to be stored in components of the table object are added with`ARC`

, and admissible names are notified with`ALN`

. The argument of`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`[TENSOR,[i,j]]`

(which means that the character is the tensor product of the`i`

-th and the`j`

-th character in the list) or`[GALOIS,[i,j]]`

(which means that the character is obtained from the`i`

-th character by applying`GaloisCyc( ., j )`

to it).**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.

**Ordinary construction tables**have the attribute

`ConstructionInfoCharacterTable`

(3.7-4) 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`CharacterTable`

(Reference: CharacterTable) when the table is constructed (*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 5.

`‣ LIBLIST` | ( global variable ) |

**GAP**'s knowledge about the ordinary character tables in the **GAP** Character Table Library is given by several JSON format files that get evaluated when the file `gap4/ctprimar.g`

(the "primary file" of the character table library) is read. These files can be produced from the data files, see Section 4.6-1.

The information is stored in the global variable `LIBLIST`

, which is a record with the following components.

`firstnames`

the list of

`Identifier`

(Reference: Identifier for character tables) values of the ordinary tables,`files`

the list of filenames containing the data of ordinary tables,

`filenames`

a list of positive integers, value \(j\) at position \(i\) means that the table whose identifier is the \(i\)-th in the

`firstnames`

list is contained in the \(j\)-th file of the`files`

component,`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

`firstnames`

list,`allnames`

a list of all admissible names of ordinary library tables,

`position`

a list that stores at position \(i\) the position in

`firstnames`

of the identifier of the table with the \(i\)-th admissible name in`allnames`

,`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\)

`.`

\(name\) and \(name\)`.`

\(a\) are admissible names for its Schur multiplier and automorphism group, respectively, if these tables are available at all,`sporadicSimple`

a list of identifiers of the tables of the \(26\) sporadic simple groups, and

`GENERIC`

a record with information about generic tables (see Section 4.2).

`‣ LibInfoCharacterTable` ( tblname ) | ( function ) |

is a record with the components

`firstName`

the

`Identifier`

(Reference: Identifier for character tables) value of the library table for which`tblname`is an admissible name, and`fileName`

the name of the file in which the table data is stored.

If no such table exists in the **GAP** library then `fail`

is returned.

If `tblname` contains the substring `"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 **GAP** library.

gap> LibInfoCharacterTable( "S5" ); rec( fileName := "ctoalter", firstName := "A5.2" ) gap> LibInfoCharacterTable( "S5mod2" ); rec( fileName := "ctbalter", firstName := "A5.2mod2" ) gap> LibInfoCharacterTable( "J5" ); fail

**GAP** users may want to extend the character table library in different respects.

Probably the easiest change is to

*add new admissible names*to library tables, in order to use these names in calls of`CharacterTable`

(3.1-2). This can be done using`NotifyNameOfCharacterTable`

(4.7-1).The next kind of changes is the

*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`LibraryFusion`

(4.7-2).The last kind of changes is the

*addition of new character tables*to the**GAP**character table library. Data files containing tables in library format (i. e., in the form of calls to`MOT`

or`MBT`

) can be produced using`PrintToLib`

(4.7-4).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

`CharacterTable`

(3.1-2), you must notify this table, i. e., tell**GAP**in which file it can be found, and which names shall be admissible for it. This can be done using`NotifyCharacterTable`

(4.7-5).

`‣ NotifyNameOfCharacterTable` ( firstname, newnames ) | ( function ) |

notifies the strings in the list `newnames` as new admissible names for the library table with `Identifier`

(Reference: Identifier for character tables) value `firstname`. If there is already another library table for which some of these names are admissible then an error is signaled.

`NotifyNameOfCharacterTable`

modifies the global variable `LIBLIST`

(4.6-2).

gap> CharacterTable( "private" ); fail gap> NotifyNameOfCharacterTable( "A5", [ "private" ] ); gap> a5:= CharacterTable( "private" ); CharacterTable( "A5" )

One can notify alternative names for character tables inside data files, using the function `ALN`

instead of `NotifyNameOfCharacterTable`

. The idea is that the additional names of tables from those files can be ignored which are controlled by `CTblLib.RecomputeTOC`

. Therefore, `ALN`

is set to `Ignore`

before the file is read with `CTblLib.ReadTbl`

, otherwise `ALN`

is set to `NotifyNameOfCharacterTable`

.

`‣ LibraryFusion` ( name, fus ) | ( function ) |

For a string `name` that is an `Identifier`

(Reference: Identifier for character tables) value of an ordinary character table in the **GAP** library, and a record `fus` with the components

`name`

the identifier of the destination table, or this table itself,

`map`

the fusion map, a list of image positions,

`text`

(optional)a string describing properties of the fusion, and

`specification`

(optional)a string or an integer,

`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 `name`.

If `name` is a character table then its `Identifier`

(Reference: Identifier for character tables) value is used as the corresponding string.

gap> s5:= CharacterTable( "S5" ); CharacterTable( "A5.2" ) gap> fus:= PossibleClassFusions( a5, s5 ); [ [ 1, 2, 3, 4, 4 ] ] gap> fusion:= rec( name:= s5, map:= fus[1], text:= "unique" );; gap> Print( LibraryFusion( "A5", fusion ) ); ALF("A5","A5.2",[1,2,3,4,4],[ "unique" ]);

`‣ LibraryFusionTblToTom` ( name, fus ) | ( function ) |

For a string `name` that is an `Identifier`

(Reference: Identifier for character tables) value of an ordinary character table in the **GAP** library, and a record `fus` with the components

`name`

the identifier of the destination table of marks, or this table itself,

`map`

the fusion map, a list of image positions,

`text`

(optional)a string describing properties of the fusion, and

`perm`

(optional)a permutation,

`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 `name`.

The meaning of the component `perm`

is as follows. Let `prim` be the primitive permutation characters obtained by computing the `PermCharsTom`

(Reference: PermCharsTom via fusion map) value of the tables of marks, taking the sublist at the positions in the first component of the `MaximalSubgroupsTom`

(Reference: MaximalSubgroupsTom) value of the tables of marks, and restricting these lists via the `map`

component. Permuting `prim` with the `perm`

component via `Permuted`

(Reference: Permuted) yields the list of permutation characters obtained by inducing the trivial characters of the subgroups given by the `Maxes`

(3.7-1) value of the character table. If the component `perm`

is not present and if the character table has the attribute `Maxes`

(3.7-1) set then the two ways of computing the primitive permutation characters yield the same list.

If `name` is a character table then its `Identifier`

(Reference: Identifier for character tables) value is used as the corresponding string.

gap> tbl:= CharacterTable( "A5" ); CharacterTable( "A5" ) gap> tom:= TableOfMarks( "A5" ); TableOfMarks( "A5" ) gap> fus:= PossibleFusionsCharTableTom( tbl, tom ); [ [ 1, 2, 3, 5, 5 ] ] gap> fusion:= rec( name:= tom, map:= fus[1], text:= "unique" );; gap> Print( LibraryFusionTblToTom( "A5", fusion ) ); ARC("A5","tomfusion",rec(name:="A5",map:=[1,2,3,5,5],text:=[ "unique" ]));

`‣ PrintToLib` ( file, tbl ) | ( function ) |

prints the (ordinary or Brauer) character table `tbl` in library format to the file `file``.tbl`

(or to `file` if this has already the suffix `.tbl`

).

If `tbl` is an ordinary table then the value of the attribute `NamesOfFusionSources`

(Reference: NamesOfFusionSources) is ignored by `PrintToLib`

, since for library tables this information is extracted from the source files (see Section 4.6-1).

The names of data files in the **GAP** Character Table Library begin with `cto`

(for ordinary tables) or `ctb`

(for corresponding Brauer tables), see Section 4.6. 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 `cto`

files are notified via `NotifyCharacterTable`

(4.7-5) then the Brauer tables will be found in the `ctb`

files. Alternatively, if the filenames of the files with the ordinary tables do not start with `cto`

then **GAP** expects the corresponding Brauer tables in the same file as the ordinary tables.

gap> PrintToLib( "private", a5 );

The above command appends the data of the table `a5`

to the file `private.tbl`

; the first lines printed to this file are

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"]);

`‣ NotifyCharacterTable` ( firstname, filename, othernames ) | ( function ) |

notifies a new ordinary table to the library. This table has `Identifier`

(Reference: Identifier for character tables) value `firstname`, it is contained (in library format, see `PrintToLib`

(4.7-4)) in the file with name `filename` (without suffix `.tbl`

), and the names contained in the list `othernames` are admissible for it.

If the initial part of `filename` is one of `~/`

, `/`

or `./`

then it is interpreted as an *absolute* path. Otherwise it is interpreted *relative* to the `data`

directory of the **CTblLib** package.

`NotifyCharacterTable`

modifies the global variable `LIBLIST`

(4.6-2) for the current **GAP** session, after having checked that there is no other library table yet with an admissible name equal to `firstname` or contained in `othernames`.

For example, let us change the name `A5`

to `icos`

wherever it occurs in the file `private.tbl`

that was produced above, and then notify the "new" table in this file as follows. (The name change is needed because **GAP** knows already a table with name `A5`

and would not accept to add another table with this name.)

gap> NotifyCharacterTable( "icos", "private", [] ); gap> icos:= CharacterTable( "icos" ); CharacterTable( "icos" ) gap> 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

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 **GAP** session. For frequently used private tables, it may be reasonable to put the `NotifyCharacterTable`

statements into your `gaprc`

file (see Reference: The gap.ini and gaprc files), or into a file that is read via the `gaprc`

file.

`‣ NotifyCharacterTables` ( list ) | ( function ) |

notifies several new ordinary tables to the library. The argument `list` must be a dense list in which each entry is a lists of the form `[ firstname, filename, othernames ]`

, with the same meaning as the arguments of `NotifyCharacterTable`

(4.7-5).

The fact that the **GAP** Character Table Library is designed as an open database (see Chapter 1) makes it especially desirable to have consistency checks available which can be run automatically whenever new data get added.

The file `tst/testall.g`

of the package contains `Test`

(Reference: Test) statements for executing a collection of such sanity checks; one can run them by calling `ReadPackage( "CTblLib", "tst/testall.g" )`

. If no problem occurs then **GAP** prints only lines starting with one of the following.

+ Input file: + GAP4stones:

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

of the package.

The following tests concern only *ordinary* character tables. In all cases, let \(tbl\) be the ordinary character table of a group \(G\), say. The return value is `false`

if an error occurred, and `true`

otherwise.

`CTblLib.Test.InfoText(`

\(tbl\)`)`

checks some properties of the

`InfoText`

(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**GAP**Character Table Library.The value is a string that consists of

`\n`

separated lines.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.

If a line of the form "\(n\)th maximal subgroup of \(grpname\)" occurs then additionally the name \(grpname\)

`M`

\(n\) is admissible for \(tbl\). Furthermore, if the table with name \(grpname\) has a`Maxes`

(3.7-1) value then \(tbl\) is referenced in position \(n\) of this list.

`CTblLib.Test.RelativeNames(`

\(tbl\)`[,`

\(tblname\)`] )`

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.

**\(name\)**`M`

\(n\)\(G\) is isomorphic with the groups in the \(n\)-th class of maximal subgroups of \(H\). An example is

`"M12M1"`

for the Mathieu group \(M_{11}\). We consider only cases where \(name\) does*not*contain the letter`x`

. For example,`2xM12`

denotes the direct product of a cyclic group of order two and the Mathieu group \(M_{12}\) but*not*a maximal subgroup of "`2x`

". Similarly,`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*not*a maximal subgroup of "`3x2.M22`

".**\(name\)**`N`

\(p\)\(G\) is isomorphic with the normalizers of the Sylow \(p\)-subgroups of \(H\). An example is

`"M24N2"`

for the (self-normalizing) Sylow \(2\)-subgroup in the Mathieu group \(M_{24}\).**\(name\)**`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

`"O7(3)N3A"`

for the normalizer of an element in the class`3A`

of the simple group \(O_7(3)\).**\(name\)**`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

`"M24C2A"`

for the centralizer of an element in the class`2A`

in the Mathieu group \(M_{24}\).

In these cases,

`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.

`CTblLib.Test.FindRelativeNames(`

\(tbl\)`)`

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\).

`CTblLib.Test.PowerMaps(`

\(tbl\)`)`

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.)

`CTblLib.Test.TableAutomorphisms(`

\(tbl\)`)`

checks whether the table automorphisms are stored on \(tbl\), and whether they are correct. Also all available Brauer tables of \(tbl\) are checked.

`CTblLib.Test.CompatibleFactorFusions(`

\(tbl\)`)`

checks whether triangles and quadrangles of factor fusions from \(tbl\) to other library tables commute (where the entries in the list

`CTblLib.IgnoreFactorFusionsCompatibility`

are excluded from the tests), and whether the factor fusions commute with the actions of corresponding outer automorphisms.`CTblLib.Test.FactorsModPCore(`

\(tbl\)`)`

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\).

`CTblLib.Test.Fusions(`

\(tbl\)`)`

checks the class fusions that are stored on the table \(tbl\): No duplicates shall occur, each subgroup fusion or factor fusion is tested using

`CTblLib.Test.SubgroupFusion`

or`CTblLib.Test.FactorFusion`

, respectively, and a fusion to the table of marks for \(tbl\) is tested using`CTblLib.Test.FusionToTom`

.`CTblLib.Test.Maxes(`

\(tbl\)`)`

checks for those character tables \(tbl\) that have the

`Maxes`

(3.7-1) 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.`CTblLib.Test.ClassParameters(`

\(tbl\)`)`

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.

`CTblLib.Test.TablesOfSymmetricGroup(`

\(n\)`)`

checks that the class parameters and character parameters of the two character tables of the symmetric group of degree \(n\) (from the

**Atlas**and from the**SpinSym**package) are consistent. The interesting values of`n`are in`[ 5 .. 13 ]`

.`CTblLib.Test.Constructions(`

\(tbl\)`)`

checks the

`ConstructionInfoCharacterTable`

(3.7-4) 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.`CTblLib.Test.ExtensionInfo(`

\(tbl\)`)`

checks whether the attribute

`ExtensionInfoCharacterTable`

(3.7-3) is known for all nonabelian simple character tables that are not duplicates.`CTblLib.Test.GroupForGroupInfo(`

\(tbl\)`)`

checks that the entries in the list returned by

`GroupInfoForCharacterTable`

(3.3-1) fit to the character table \(tbl\).

The following tests concern only *modular* character tables. In all cases, let \(modtbl\) be a Brauer character table of a group \(G\), say.

`CTblLib.Test.BlocksInfo(`

\(modtbl\)`)`

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.

`CTblLib.Test.TensorDecomposition(`

\(modtbl\)`)`

checks whether the tensor products of irreducible Brauer characters of the Brauer table \(modtbl\) decompose into Brauer characters.

`CTblLib.Test.Indicators(`

\(modtbl\)`)`

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.

`CTblLib.Test.FactorBlocks(`

\(modtbl\)`)`

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.)

It is of course desirable that the information in the **GAP** Character Table Library is consistent with related data. For example, the ordering of the classes of maximal subgroups stored in the `Maxes`

(3.7-1) list of the character table of a group \(G\), say, should correspond to the ordering shown for \(G\) in the **Atlas** of Finite Groups [CCN+85], to the ordering of maximal subgroups used for \(G\) in the **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 **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 **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 **CAS** tables –and that was available in version 1.0 of the **GAP** Character Table Library– was one of the *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 **Atlas** of Brauer Characters [JLPW95], which is an accepted standard.

generated by GAPDoc2HTML