GAP (XModAlg) - Chapter 2: Cat1-algebras

Goto Chapter: Top 1 2 3 4 Bib Ind
[Top of Book] [Contents] [Previous Chapter] [Next Chapter]

[MathJax off]

2 Cat1-algebras
2.1 Definitions and examples
2.1-1 Cat1Algebra
2.1-2 Source
2.1-3 Cat1AlgebraSelect
2.1-4 SubCat1Algebra
2.2 Cat\(^{1}-\)algebra morphisms
2.2-1 Cat1AlgebraMorphism
2.2-2 Source

### 2 Cat1-algebras

#### 2.1 Definitions and examples

Algebraic structures which are equivalent to crossed modules of algebras include :

- cat\(^{1}\)-algebras, (Ellis, [Ell88]);

- simplicial algebras with Moore complex of length 1, (Z. Arvasi and T.Porter, [AP96]);

- algebra-algebroids, (Gaffar Musa's Ph.D. thesis, [Mos86]).

In this section we describe an implementation of cat\(^{1}\)-algebras and their morphisms.

The notion of cat\(^{1}\)-groups was defined as an algebraic model of \(2\)-types by Loday in [Lod82]. Then Ellis defined the cat\(^{1}\)-algebras in [Ell88].

Let \(A\) and \(R\) be \(k\)-algebras, let \(t,h:A\rightarrow R\) be surjections, and let \(e:R\rightarrow A\) be an inclusion.

\[ \xymatrix@R=50pt@C=50pt{ A \ar@{->}@<-1.5pt>[d]_{t} \ar@{->}@<1.5pt>[d]^{h} \\ R \ar@/^1.5pc/[u]^{e} } \]

If the conditions,

\[ \mathbf{Cat1Alg1:} \quad te = id_{R} = he, \qquad \mathbf{Cat1Alg2:} \quad (\ker t)(\ker h) = \{0_{A}\} \]

are satisfied, then the algebraic system \(\mathcal{C} := (e;t,h : A \rightarrow R)\) is called a cat\(^{1}\)-algebra. A system which satisfies the condition \(\mathbf{Cat1Alg1}\) is called a precat\(^{1}\)-algebra. The homomorphisms \(t,h\) and \(e\) are called the tail map, head map and range embedding homomorphisms, respectively.

##### 2.1-1 Cat1Algebra

`‣ Cat1Algebra`( args ) | ( function )

`‣ PreCat1AlgebraByEndomorphisms`( t, h ) | ( operation )

`‣ PreCat1AlgebraByTailHeadEmbedding`( t, h, e ) | ( operation )

`‣ PreCat1Algebra`( args ) | ( operation )

`‣ IsIdentityCat1Algebra`( C ) | ( property )

`‣ IsCat1Algebra`( C ) | ( property )

`‣ IsPreCat1Algebra`( C ) | ( property )

The operations listed above are used for construction of precat\(^{1}\)- and cat\(^{1}\)-algebra structures. The function `Cat1Algebra` selects the operation from the above implementations up to user's input. The operations `PreCat1AlgebraByEndomorphisms` and `PreCat1AlgebraByTailHeadEmbedding` are used with particular choices of algebra homomorphisms.

##### 2.1-2 Source

`‣ Source`( C ) | ( attribute )

`‣ Range`( C ) | ( attribute )

`‣ TailMap`( C ) | ( attribute )

`‣ HeadMap`( C ) | ( attribute )

`‣ RangeEmbedding`( C ) | ( attribute )

`‣ Kernel`( C ) | ( method )

`‣ Boundary`( C ) | ( attribute )

These are the seven main attributes of a pre-cat\(^{1}\)-algebra.

    gap> Ac6 := GroupRing( GF(2), Group( (1,2,3)(4,5) ) );;
    gap> Rc3 := GroupRing( GF(2), Group( (1,2,3) ) );;
    gap> homAR := AllHomsOfAlgebras( Ac6, Rc3 );;
    gap> mgiAR := List( homAR, h -> MappingGeneratorsImages(h) );;
    gap> Print( mgiAR, "\n" );
    [ [ [ (Z(2)^0)*(1,3,2)(4,5) ], [ <zero> of ... ] ],
      [ [ (Z(2)^0)*(1,3,2)(4,5) ], [ (Z(2)^0)*() ] ],
      [ [ (Z(2)^0)*(1,3,2)(4,5) ], [ (Z(2)^0)*()+(Z(2)^0)*(1,2,3) ] ],
      [ [ (Z(2)^0)*(1,3,2)(4,5) ],
          [ (Z(2)^0)*()+(Z(2)^0)*(1,2,3)+(Z(2)^0)*(1,3,2) ] ],
      [ [ (Z(2)^0)*(1,3,2)(4,5) ], [ (Z(2)^0)*()+(Z(2)^0)*(1,3,2) ] ],
      [ [ (Z(2)^0)*(1,3,2)(4,5) ], [ (Z(2)^0)*(1,2,3) ] ],
      [ [ (Z(2)^0)*(1,3,2)(4,5) ], [ (Z(2)^0)*(1,2,3)+(Z(2)^0)*(1,3,2) ] ],
      [ [ (Z(2)^0)*(1,3,2)(4,5) ], [ (Z(2)^0)*(1,3,2) ] ] ]
    gap> homRA := AllHomsOfAlgebras( Rc3, Ac6 );;
    gap> mgiRA := List( homRA, h -> MappingGeneratorsImages(h) );;
    gap> Print( mgiRA, "\n" );
    [ [ [ (Z(2)^0)*(1,2,3) ], [ <zero> of ... ] ],
      [ [ (Z(2)^0)*(1,2,3) ], [ (Z(2)^0)*() ] ],
      [ [ (Z(2)^0)*(1,2,3) ], [ (Z(2)^0)*()+(Z(2)^0)*(1,2,3) ] ],
      [ [ (Z(2)^0)*(1,2,3) ], [ (Z(2)^0)*()+(Z(2)^0)*(1,2,3)+(Z(2)^0)*(1,3,2) ] ],
      [ [ (Z(2)^0)*(1,2,3) ], [ (Z(2)^0)*()+(Z(2)^0)*(1,3,2) ] ],
      [ [ (Z(2)^0)*(1,2,3) ], [ (Z(2)^0)*(1,2,3) ] ],
      [ [ (Z(2)^0)*(1,2,3) ], [ (Z(2)^0)*(1,2,3)+(Z(2)^0)*(1,3,2) ] ],
      [ [ (Z(2)^0)*(1,2,3) ], [ (Z(2)^0)*(1,3,2) ] ] ]
    gap> C4 := PreCat1AlgebraByTailHeadEmbedding( homAR[6], homAR[6], homRA[8] );
    [AlgebraWithOne( GF(2), [ (Z(2)^0)*(1,2,3)(4,5) ] ) -> AlgebraWithOne( GF(2),
    [ (Z(2)^0)*(1,2,3) ] )]
    gap> IsCat1Algebra( C4 );
    true
    gap> Size( C4 );
    [ 64, 8 ]
    gap> Display( C4 );

    Cat1-algebra [..=>..] :-
    : source algebra has generators:
      [ (Z(2)^0)*(), (Z(2)^0)*(1,2,3)(4,5) ]
    :  range algebra has generators:
      [ (Z(2)^0)*(), (Z(2)^0)*(1,2,3) ]
    : tail homomorphism maps source generators to:
      [ (Z(2)^0)*(), (Z(2)^0)*(1,3,2) ]
    : head homomorphism maps source generators to:
      [ (Z(2)^0)*(), (Z(2)^0)*(1,3,2) ]
    : range embedding maps range generators to:
      [ (Z(2)^0)*(), (Z(2)^0)*(1,3,2) ]
    : kernel has generators:
      [ (Z(2)^0)*()+(Z(2)^0)*(4,5), (Z(2)^0)*(1,2,3)+(Z(2)^0)*(1,2,3)(4,5),
      (Z(2)^0)*(1,3,2)+(Z(2)^0)*(1,3,2)(4,5) ]
    : boundary homomorphism maps generators of kernel to:
      [ <zero> of ..., <zero> of ..., <zero> of ... ]
    : kernel embedding maps generators of kernel to:
      [ (Z(2)^0)*()+(Z(2)^0)*(4,5), (Z(2)^0)*(1,2,3)+(Z(2)^0)*(1,2,3)(4,5),
      (Z(2)^0)*(1,3,2)+(Z(2)^0)*(1,3,2)(4,5) ]

##### 2.1-3 Cat1AlgebraSelect

`‣ Cat1AlgebraSelect`( n, gpsize, gpnum, num ) | ( operation )

The `Cat1Algebra` (2.1-1) function may also be used to select a cat\(^{1}\)-algebra from a data file. All cat\(^{1}\)-structures on commutative algebras are stored in a list in file `cat1algdata.g`. The data is read into the list `CAT1ALG_LIST` only when this function is called.

The function `Cat1AlgebraSelect` may be used in four ways:

- `Cat1AlgebraSelect( n )` returns the list of possible sizes of groups for group algebras with Galois field \(GF(n)\).

- `Cat1AlgebraSelect( n, m )` returns the list of allowable group numbers with given Galois field \(GF(n)\) and groups of size \(m\).

- `Cat1AlgebraSelect( n, m, k )` returns the list of possible cat\(^{1}\)-algebra structures with given Galois field \(GF(n)\) and group number \(k\) of size \(m\).

- `Cat1AlgebraSelect( n, m, k, j )` (or simply `Cat1Algebra( n, m, k, j )`) returns the \(j\)-th cat\(^{1}\)-algebra structure with these other parameters.

Now, we give examples of the use of this function.

    gap> C := Cat1AlgebraSelect( 11 );
    |--------------------------------------------------------|
    | 11 is invalid number for Galois Field (GFnum)             |
    | Possible numbers for GFnum in the Data :              |
    |--------------------------------------------------------|
     [ 2, 3, 4, 5, 7 ]
    Usage: Cat1Algebra( GFnum, gpsize, gpnum, num );
    fail
    gap> C := Cat1AlgebraSelect( 4, 12 );
    |--------------------------------------------------------|
    | 12 is invalid number for size of group (gpsize)        |
    | Possible numbers for the gpsize for GF(4) in the Data: |
    |--------------------------------------------------------|
     [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
    Usage: Cat1Algebra( GFnum, gpsize, gpnum, num );
    fail
    gap> C := Cat1AlgebraSelect( 2, 6, 3 );
    |--------------------------------------------------------|
    | 3 is invalid number for group of order 6               |
    | Possible numbers for the gpnum in the Data :           |
    |--------------------------------------------------------|
     [ 1, 2 ]
    Usage: Cat1Algebra( GFnum, gpsize, gpnum, num );
    fail
    gap> C := Cat1AlgebraSelect( 2, 6, 2 );
    There are 4 cat1-structures for the algebra GF(2)_c6.
     Range Alg      Tail                    Head
    |--------------------------------------------------------|
    | GF(2)_c6      identity map            identity map     |
    | -----         [ 2, 10 ]               [ 2, 10 ]        |
    | -----         [ 2, 14 ]               [ 2, 14 ]        |
    | -----         [ 2, 50 ]               [ 2, 50 ]        |
    |--------------------------------------------------------|
    Usage: Cat1Algebra( GFnum, gpsize, gpnum, num );
    Algebra has generators [ (Z(2)^0)*(), (Z(2)^0)*(1,2,3)(4,5) ]
    4
    gap> C0 := Cat1AlgebraSelect( 4, 6, 2, 2 );
    [GF(2^2)_c6 -> Algebra( GF(2^2),
    [ (Z(2)^0)*(), (Z(2)^0)*()+(Z(2)^0)*(1,3,5)(2,4,6)+(Z(2)^0)*(1,4)(2,5)(3,6)+(
        Z(2)^0)*(1,5,3)(2,6,4)+(Z(2)^0)*(1,6,5,4,3,2) ] )]
    gap> Size( C0 );
    [ 4096, 1024 ]
    gap> Display( C0 );

    Cat1-algebra [GF(2^2)_c6=>..] :-
    : source algebra has generators:
      [ (Z(2)^0)*(), (Z(2)^0)*(1,2,3,4,5,6) ]
    :  range algebra has generators:
      [ (Z(2)^0)*(), (Z(2)^0)*()+(Z(2)^0)*(1,3,5)(2,4,6)+(Z(2)^0)*(1,4)(2,5)
        (3,6)+(Z(2)^0)*(1,5,3)(2,6,4)+(Z(2)^0)*(1,6,5,4,3,2) ]
    : tail homomorphism maps source generators to:
      [ (Z(2)^0)*(), (Z(2)^0)*()+(Z(2)^0)*(1,3,5)(2,4,6)+(Z(2)^0)*(1,4)(2,5)
        (3,6)+(Z(2)^0)*(1,5,3)(2,6,4)+(Z(2)^0)*(1,6,5,4,3,2) ]
    : head homomorphism maps source generators to:
      [ (Z(2)^0)*(), (Z(2)^0)*()+(Z(2)^0)*(1,3,5)(2,4,6)+(Z(2)^0)*(1,4)(2,5)
        (3,6)+(Z(2)^0)*(1,5,3)(2,6,4)+(Z(2)^0)*(1,6,5,4,3,2) ]
    : range embedding maps range generators to:
      [ (Z(2)^0)*(), (Z(2)^0)*()+(Z(2)^0)*(1,3,5)(2,4,6)+(Z(2)^0)*(1,4)(2,5)
        (3,6)+(Z(2)^0)*(1,5,3)(2,6,4)+(Z(2)^0)*(1,6,5,4,3,2) ]
    : kernel has generators:
      [ (Z(2)^0)*()+(Z(2)^0)*(1,2,3,4,5,6)+(Z(2)^0)*(1,3,5)(2,4,6)+(Z(2)^0)*(1,4)
        (2,5)(3,6)+(Z(2)^0)*(1,5,3)(2,6,4)+(Z(2)^0)*(1,6,5,4,3,2) ]
    : boundary homomorphism maps generators of kernel to:
      [ <zero> of ... ]
    : kernel embedding maps generators of kernel to:
      [ (Z(2)^0)*()+(Z(2)^0)*(1,2,3,4,5,6)+(Z(2)^0)*(1,3,5)(2,4,6)+(Z(2)^0)*(1,4)
        (2,5)(3,6)+(Z(2)^0)*(1,5,3)(2,6,4)+(Z(2)^0)*(1,6,5,4,3,2) ]

##### 2.1-4 SubCat1Algebra

`‣ SubCat1Algebra`( arg ) | ( operation )

`‣ SubPreCat1Algebra`( arg ) | ( operation )

`‣ IsSubCat1Algebra`( arg ) | ( property )

`‣ IsSubPreCat1Algebra`( arg ) | ( property )

Let \(\mathcal{C} = (e;t,h:A\rightarrow R)\) be a cat\(^{1}\)-algebra, and let \(A^{\prime}\), \(R^{\prime}\) be subalgebras of \(A\) and \(R\) respectively. If the restriction morphisms

\[ t^{\prime} = t|_{A^{\prime}} : A^{\prime}\rightarrow R^{\prime}, \qquad h^{\prime} = h|_{A^{\prime}} : A^{\prime}\rightarrow R^{\prime}, \qquad e^{\prime} = e|_{R^{\prime}} : R^{\prime}\rightarrow A^{\prime} \]

satisfy the \(\mathbf{Cat1Alg1}\) and \(\mathbf{Cat1Alg2}\) conditions, then the system \(\mathcal{C}^{\prime } = (e^{\prime};t^{\prime},h^{\prime} : A^{\prime} \rightarrow R^{\prime})\) is called a subcat\(^{1}\)-algebra of \(\mathcal{C} = (e;t,h:A\rightarrow R)\).

If the morphisms satisfy only the \(\mathbf{Cat1Alg1}\) condition then \(\mathcal{C}^{\prime }\) is called a sub-precat\(^{1}\)-algebra of \(\mathcal{C}\).

The operations in this subsection are used for constructing subcat\(^{1}\)-algebras of a given cat\(^{1}\)-algebra.

    gap> C3 := Cat1AlgebraSelect( 2, 6, 2, 4 );;
    gap> A3 := Source( C3 );
    GF(2)_c6
    gap> B3 := Range( C3 );
    GF(2)_c3
    gap> eA3 := Elements( A3 );;
    gap> eB3 := Elements( B3 );;
    gap> AA3 := Subalgebra( A3, [ eA3[1], eA3[2], eA3[3] ] );
    <algebra over GF(2), with 3 generators>
    gap> [ Size(A3), Size(AA3) ];
    [ 64, 4 ]
    gap> BB3 := Subalgebra( B3, [ eB3[1], eB3[2] ] );
    <algebra over GF(2), with 2 generators>
    gap> [ Size(B3), Size(BB3) ];
    [ 8, 2 ]
    gap> CC3 := SubCat1Algebra( C3, AA3, BB3 );
    [Algebra( GF(2), [ <zero> of ..., (Z(2)^0)*(), (Z(2)^0)*()+(Z(2)^0)*(4,5)
     ] ) -> Algebra( GF(2), [ <zero> of ..., (Z(2)^0)*() ] )]
    gap> Display( CC3 );

    Cat1-algebra [..=>..] :-
    : source algebra has generators:
      [ <zero> of ..., (Z(2)^0)*(), (Z(2)^0)*()+(Z(2)^0)*(4,5) ]
    :  range algebra has generators:
      [ <zero> of ..., (Z(2)^0)*() ]
    : tail homomorphism maps source generators to:
      [ <zero> of ..., (Z(2)^0)*(), <zero> of ... ]
    : head homomorphism maps source generators to:
      [ <zero> of ..., (Z(2)^0)*(), <zero> of ... ]
    : range embedding maps range generators to:
      [ <zero> of ..., (Z(2)^0)*() ]
    : kernel has generators:
      [ <zero> of ..., (Z(2)^0)*()+(Z(2)^0)*(4,5) ]
    : boundary homomorphism maps generators of kernel to:
      [ <zero> of ..., <zero> of ... ]
    : kernel embedding maps generators of kernel to:
      [ <zero> of ..., (Z(2)^0)*()+(Z(2)^0)*(4,5) ]

#### 2.2 Cat\(^{1}-\)algebra morphisms

Let \(\mathcal{C} = (e;t,h:A\rightarrow R)\), \(\mathcal{C}^{\prime } = (e^{\prime}; t^{\prime }, h^{\prime } : A^{\prime} \rightarrow R^{\prime})\) be cat\(^{1}\)-algebras, and let \(\phi : A\rightarrow A^{\prime}\) and \(\varphi : R \rightarrow R^{\prime}\) be algebra homomorphisms. If the diagram

\[ \xymatrix@R=50pt@C=50pt{ A \ar@{->}@<-1.5pt>[d]_{t} \ar@{->}@<1.5pt>[d]^{h} \ar@{->}[r]^{\phi} & A' \ar@{->}@<-1.5pt>[d]_{t'} \ar@{->}@<1.5pt>[d]^{h'} \\ R \ar@/^1.5pc/[u]^{e} \ar@{->}[r]_{\varphi} & R' \ar@/_1.5pc/[u]_{e'} } \]

commutes, (i.e. \(t^{\prime} \circ \phi = \varphi \circ t\), \(h^{\prime} \circ \phi = \varphi \circ h\) and \(e^{\prime } \circ \varphi = \phi \circ e\)), then the pair \((\phi ,\varphi )\) is called a cat\(^{1}\)-algebra morphism.

##### 2.2-1 Cat1AlgebraMorphism

`‣ Cat1AlgebraMorphism`( arg ) | ( operation )

`‣ IdentityMapping`( C ) | ( method )

`‣ PreCat1AlgebraMorphismByHoms`( f, g ) | ( operation )

`‣ Cat1AlgebraMorphismByHoms`( f, g ) | ( operation )

`‣ IsPreCat1AlgebraMorphism`( C ) | ( property )

`‣ IsCat1AlgebraMorphism`( arg ) | ( property )

These operations are used for constructing cat\(^{1}\)-algebra morphisms. Details of the implementations can be found in [Oda09].

##### 2.2-2 Source

`‣ Source`( m ) | ( attribute )

`‣ Range`( m ) | ( attribute )

`‣ IsTotal`( m ) | ( method )

`‣ IsSingleValued`( m ) | ( method )

`‣ Name`( m ) | ( method )

`‣ Boundary`( m ) | ( attribute )

These are the six main attributes of a cat\(^{1}\)-algebra morphism.

    gap> C1 := Cat1Algebra( 2, 1, 1, 1 );
    [GF(2)_triv -> GF(2)_triv]
    gap> Display( C1 );

    Cat1-algebra [GF(2)_triv=>GF(2)_triv] :-
    : source algebra has generators:
      [ (Z(2)^0)*(), (Z(2)^0)*() ]
    :  range algebra has generators:
      [ (Z(2)^0)*(), (Z(2)^0)*() ]
    : tail homomorphism maps source generators to:
      [ (Z(2)^0)*(), (Z(2)^0)*() ]
    : head homomorphism maps source generators to:
      [ (Z(2)^0)*(), (Z(2)^0)*() ]
    : range embedding maps range generators to:
      [ (Z(2)^0)*(), (Z(2)^0)*() ]
    : the kernel is trivial.

    gap> C2 := Cat1Algebra( 2, 2, 1, 2 );
    [GF(2)_c2 -> GF(2)_triv]
    gap> Display( C2 );

    Cat1-algebra [GF(2)_c2=>GF(2)_triv] :-
    : source algebra has generators:
      [ (Z(2)^0)*(), (Z(2)^0)*(1,2) ]
    :  range algebra has generators:
      [ (Z(2)^0)*(), (Z(2)^0)*() ]
    : tail homomorphism maps source generators to:
      [ (Z(2)^0)*(), (Z(2)^0)*() ]
    : head homomorphism maps source generators to:
      [ (Z(2)^0)*(), (Z(2)^0)*() ]
    : range embedding maps range generators to:
      [ (Z(2)^0)*(), (Z(2)^0)*() ]
    : kernel has generators:
      [ (Z(2)^0)*()+(Z(2)^0)*(1,2) ]
    : boundary homomorphism maps generators of kernel to:
      [ <zero> of ... ]
    : kernel embedding maps generators of kernel to:
      [ (Z(2)^0)*()+(Z(2)^0)*(1,2) ]

    gap> C1 = C2;
    false
    gap> R1 := Source( C1 );;
    gap> R2 := Source( C2 );;
    gap> S1 := Range( C1 );;
    gap> S2 := Range( C2 );;
    gap> gR1 := GeneratorsOfAlgebra( R1 );
    [ (Z(2)^0)*(), (Z(2)^0)*() ]
    gap> gR2 := GeneratorsOfAlgebra( R2 );
    [ (Z(2)^0)*(), (Z(2)^0)*(1,2) ]
    gap> gS1 := GeneratorsOfAlgebra( S1 );
    [ (Z(2)^0)*(), (Z(2)^0)*() ]
    gap> gS2 := GeneratorsOfAlgebra( S2 );
    [ (Z(2)^0)*(), (Z(2)^0)*() ]
    gap> im1 := [ gR2[1], gR2[1] ];
    [ (Z(2)^0)*(), (Z(2)^0)*() ]
    gap> f1 := AlgebraHomomorphismByImages( R1, R2, gR1, im1 );
    [ (Z(2)^0)*(), (Z(2)^0)*() ] -> [ (Z(2)^0)*(), (Z(2)^0)*() ]
    gap> im2 := [ gS2[1], gS2[1] ];
    [ (Z(2)^0)*(), (Z(2)^0)*() ]
    gap> f2 := AlgebraHomomorphismByImages( S1, S2, gS1, im2 );
    [ (Z(2)^0)*(), (Z(2)^0)*() ] -> [ (Z(2)^0)*(), (Z(2)^0)*() ]
    gap> m := Cat1AlgebraMorphism( C1, C2, f1, f2 );
    [[GF(2)_triv=>GF(2)_triv] => [GF(2)_c2=>GF(2)_triv]]
    gap> Display( m );
    Morphism of cat1-algebras :-
    : Source = [GF(2)_triv=>GF(2)_triv] with generating sets:
      [ (Z(2)^0)*(), (Z(2)^0)*() ]
      [ (Z(2)^0)*(), (Z(2)^0)*() ]
    :  Range = [GF(2)_c2=>GF(2)_triv] with generating sets:
      [ (Z(2)^0)*(), (Z(2)^0)*(1,2) ]
      [ (Z(2)^0)*(), (Z(2)^0)*() ]
    : Source Homomorphism maps source generators to:
      [ (Z(2)^0)*(), (Z(2)^0)*() ]
    : Range Homomorphism maps range generators to:
      [ (Z(2)^0)*(), (Z(2)^0)*() ]
    gap> IsSurjective( m );
    false
    gap> IsInjective( m );
    true
    gap> IsBijective( m );
    false

[Top of Book] [Contents] [Previous Chapter] [Next Chapter]
Goto Chapter: Top 1 2 3 4 Bib Ind

generated by GAPDoc2HTML