Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Bib Ind
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 

7 Functions and operations for SCNormalSurface
 7.1 Creating an SCNormalSurface object
 7.2 Generating new objects from discrete normal surfaces
 7.3 Properties of SCNormalSurface objects

7 Functions and operations for SCNormalSurface

7.1 Creating an SCNormalSurface object

This section contains functions to construct discrete normal surfaces that are slicings from a list of \(2\)-dimensional facets (triangles and quadrilaterals) or combinatorial \(3\)-manifolds.

For a very short introduction to the theory of discrete normal surfaces and slicings see Section 2.4 and Section 2.5, for an introduction to the GAP object type SCNormalSurface see 5.4, for more information see the article [Spr11b].

7.1-1 SCNSEmpty
‣ SCNSEmpty( )( function )

Returns: discrete normal surface of type SCNormalSurface upon success, fail otherwise.

Generates an empty complex (of dimension \(-1\)), i. e. an object of type SCNormalSurface with empty facet list.

 gap> SCNSEmpty();
 <NormalSurface: empty normal surface | dim = -1>
 

7.1-2 SCNSFromFacets
‣ SCNSFromFacets( facets )( method )

Returns: discrete normal surface of type SCNormalSurface upon success, fail otherwise.

Constructor for a discrete normal surface from a facet list, see SCFromFacets (6.1-1) for details.

 gap> sl:=SCNSFromFacets([[1,2,3],[1,2,4,5],[1,3,4,6],[2,3,5,6],[4,5,6]]);
 <NormalSurface: unnamed complex 114 | dim = 2>
 

7.1-3 SCNS
‣ SCNS( facets )( method )

Returns: discrete normal surface of type SCNormalSurface upon success, fail otherwise.

Internally calls SCNSFromFacets (7.1-2).

 gap> sl:=SCNS([[1,2,3],[1,2,4,5],[1,3,4,6],[2,3,5,6],[4,5,6]]);
 <NormalSurface: unnamed complex 115 | dim = 2>
 

7.1-4 SCNSSlicing
‣ SCNSSlicing( complex, slicing )( function )

Returns: discrete normal surface of type SCNormalSurface upon success, fail otherwise.

Computes a slicing defined by a partition slicing of the set of vertices of the \(3\)-dimensional combinatorial pseudomanifold complex. In particular, slicing has to be a pair of lists of vertex labels and has to contain all vertex labels of complex.

 gap> SCLib.SearchByAttribute("F=[ 10, 35, 50, 25 ]");
 [ [ 19, "S^3 (VT)" ] ]
 gap> c:=SCLib.Load(last[1][1]);;                       
 gap> sl:=SCNSSlicing(c,[[1..5],[6..10]]);    
 <NormalSurface: slicing [ [ 1, 2, 3, 4, 5 ], [ 6, 7, 8, 9, 10 ] ] of S^3 (VT) \
 | dim = 2>
 gap> sl.Facets;
 [ [ [ 1, 6 ], [ 1, 8 ], [ 1, 9 ] ], [ [ 1, 6 ], [ 1, 8 ], [ 3, 6 ], [ 3, 8 ] ]
     , [ [ 1, 6 ], [ 1, 9 ], [ 4, 6 ], [ 4, 9 ] ], 
   [ [ 1, 6 ], [ 3, 6 ], [ 4, 6 ] ], [ [ 1, 8 ], [ 1, 9 ], [ 1, 10 ] ], 
   [ [ 1, 8 ], [ 1, 10 ], [ 3, 8 ], [ 3, 10 ] ], 
   [ [ 1, 9 ], [ 1, 10 ], [ 2, 9 ], [ 2, 10 ] ], 
   [ [ 1, 9 ], [ 2, 9 ], [ 4, 9 ] ], [ [ 1, 10 ], [ 2, 10 ], [ 3, 10 ] ], 
   [ [ 2, 7 ], [ 2, 9 ], [ 2, 10 ] ], 
   [ [ 2, 7 ], [ 2, 9 ], [ 4, 7 ], [ 4, 9 ] ], 
   [ [ 2, 7 ], [ 2, 10 ], [ 5, 7 ], [ 5, 10 ] ], 
   [ [ 2, 7 ], [ 4, 7 ], [ 5, 7 ] ], [ [ 2, 10 ], [ 3, 10 ], [ 5, 10 ] ], 
   [ [ 3, 6 ], [ 3, 8 ], [ 5, 6 ], [ 5, 8 ] ], [ [ 3, 6 ], [ 4, 6 ], [ 5, 6 ] ]
     , [ [ 3, 8 ], [ 3, 10 ], [ 5, 8 ], [ 5, 10 ] ], 
   [ [ 4, 6 ], [ 4, 7 ], [ 4, 9 ] ], [ [ 4, 6 ], [ 4, 7 ], [ 5, 6 ], [ 5, 7 ] ]
     , [ [ 5, 6 ], [ 5, 7 ], [ 5, 8 ] ], [ [ 5, 7 ], [ 5, 8 ], [ 5, 10 ] ] ]
 gap> sl:=SCNSSlicing(c,[[1,3,5,7,9],[2,4,6,8,10]]);    
 <NormalSurface: slicing [ [ 1, 3, 5, 7, 9 ], [ 2, 4, 6, 8, 10 ] ] of S^3 (VT) \
 | dim = 2>
 gap> sl.Facets;                           
 [ [ [ 1, 2 ], [ 1, 4 ], [ 3, 2 ], [ 3, 4 ] ], 
   [ [ 1, 2 ], [ 1, 4 ], [ 9, 2 ], [ 9, 4 ] ], 
   [ [ 1, 2 ], [ 1, 10 ], [ 3, 2 ], [ 3, 10 ] ], 
   [ [ 1, 2 ], [ 1, 10 ], [ 9, 2 ], [ 9, 10 ] ], 
   [ [ 1, 4 ], [ 1, 6 ], [ 3, 4 ], [ 3, 6 ] ], 
   [ [ 1, 4 ], [ 1, 6 ], [ 9, 4 ], [ 9, 6 ] ], 
   [ [ 1, 6 ], [ 1, 8 ], [ 3, 6 ], [ 3, 8 ] ], 
   [ [ 1, 6 ], [ 1, 8 ], [ 9, 6 ], [ 9, 8 ] ], 
   [ [ 1, 8 ], [ 1, 10 ], [ 3, 8 ], [ 3, 10 ] ], 
   [ [ 1, 8 ], [ 1, 10 ], [ 9, 8 ], [ 9, 10 ] ], 
   [ [ 3, 2 ], [ 3, 4 ], [ 5, 2 ], [ 5, 4 ] ], 
   [ [ 3, 2 ], [ 3, 10 ], [ 5, 2 ], [ 5, 10 ] ], 
   [ [ 3, 4 ], [ 3, 6 ], [ 5, 4 ], [ 5, 6 ] ], 
   [ [ 3, 6 ], [ 3, 8 ], [ 5, 6 ], [ 5, 8 ] ], 
   [ [ 3, 8 ], [ 3, 10 ], [ 5, 8 ], [ 5, 10 ] ], 
   [ [ 5, 2 ], [ 5, 4 ], [ 7, 2 ], [ 7, 4 ] ], 
   [ [ 5, 2 ], [ 5, 10 ], [ 7, 2 ], [ 7, 10 ] ], 
   [ [ 5, 4 ], [ 5, 6 ], [ 7, 4 ], [ 7, 6 ] ], 
   [ [ 5, 6 ], [ 5, 8 ], [ 7, 6 ], [ 7, 8 ] ], 
   [ [ 5, 8 ], [ 5, 10 ], [ 7, 8 ], [ 7, 10 ] ], 
   [ [ 7, 2 ], [ 7, 4 ], [ 9, 2 ], [ 9, 4 ] ], 
   [ [ 7, 2 ], [ 7, 10 ], [ 9, 2 ], [ 9, 10 ] ], 
   [ [ 7, 4 ], [ 7, 6 ], [ 9, 4 ], [ 9, 6 ] ], 
   [ [ 7, 6 ], [ 7, 8 ], [ 9, 6 ], [ 9, 8 ] ], 
   [ [ 7, 8 ], [ 7, 10 ], [ 9, 8 ], [ 9, 10 ] ] ]
 

7.2 Generating new objects from discrete normal surfaces

simpcomp provides the possibility to copy and / or triangulate normal surfaces. Note that other constructions like the connected sum or the cartesian product do not make sense for (embedded) normal surfaces in general.

7.2-1 SCCopy
‣ SCCopy( complex )( method )

Returns: discrete normal surface of type SCNormalSurface upon success, fail otherwise.

Copies a GAP object of type SCNormalSurface (cf. SCCopy).

 gap> sl:=SCNSSlicing(SCBdSimplex(4),[[1],[2..5]]);
 <NormalSurface: slicing [ [ 1 ], [ 2, 3, 4, 5 ] ] of S^3_5 | dim = 2>
 gap> sl_2:=SCCopy(sl);                          
 <NormalSurface: slicing [ [ 1 ], [ 2, 3, 4, 5 ] ] of S^3_5 | dim = 2>
 gap> IsIdenticalObj(sl,sl_2);                     
 false
 

7.2-2 SCNSTriangulation
‣ SCNSTriangulation( sl )( method )

Returns: simplicial complex of type SCSimplicialComplex upon success, fail otherwise.

Computes a simplicial subdivision of a slicing sl without introducing new vertices. The subdivision is stored as a property of sl and thus is returned as an immutable object. Note that symmetry may be lost during the computation.

 gap> SCLib.SearchByAttribute("F=[ 10, 35, 50, 25 ]");
 [ [ 19, "S^3 (VT)" ] ]
 gap> c:=SCLib.Load(last[1][1]);;
 gap> sl:=SCNSSlicing(c,[[1,3,5,7,9],[2,4,6,8,10]]);;
 gap> sl.F; 
 [ 25, 50, 0, 25 ]
 gap> sc:=SCNSTriangulation(sl);;
 gap> sc.F;
 [ 25, 75, 50 ]
 

7.3 Properties of SCNormalSurface objects

Although some properties of a discrete normal surface can be computed by using the functions for simplicial complexes, there is a variety of properties needing specially designed functions. See below for a list.

7.3-1 SCConnectedComponents
‣ SCConnectedComponents( complex )( method )

Returns: a list of simplicial complexes of type SCNormalSurface upon success, fail otherwise.

Computes all connected components of an arbitrary normal surface.

 gap> sl:=SCNSSlicing(SCBdCrossPolytope(4),[[1,2],[3..8]]);
 <NormalSurface: slicing [ [ 1, 2 ], [ 3, 4, 5, 6, 7, 8 ] ] of Bd(\beta^4) | di\
 m = 2>
 gap> cc:=SCConnectedComponents(sl);
 [ <NormalSurface: Connected component #1 of slicing [ [ 1, 2 ], [ 3, 4, 5, 6, \
 7, 8 ] ] of Bd(\beta^4) | dim = 2>, 
   <NormalSurface: Connected component #2 of slicing [ [ 1, 2 ], [ 3, 4, 5, 6, \
 7, 8 ] ] of Bd(\beta^4) | dim = 2> ]
 

7.3-2 SCDim
‣ SCDim( sl )( method )

Returns: an integer upon success, fail otherwise.

Computes the dimension of a discrete normal surface (which is always \(2\) if the slicing sl is not empty).

 gap> sl:=SCNSEmpty();;                                                    
 gap> SCDim(sl);                                                         
 -1
 gap> sl:=SCNSFromFacets([[1,2,3],[1,2,4,5],[1,3,4,6],[2,3,5,6],[4,5,6]]);;
 gap> SCDim(sl);                                                         
 2
 

7.3-3 SCEulerCharacteristic
‣ SCEulerCharacteristic( sl )( method )

Returns: an integer upon success, fail otherwise.

Computes the Euler characteristic of a discrete normal surface sl, cf. SCEulerCharacteristic.

 gap> list:=SCLib.SearchByName("S^2xS^1");;  
 gap> c:=SCLib.Load(list[1][1]);;             
 gap> sl:=SCNSSlicing(c,[[1..5],[6..10]]);;
 gap> SCEulerCharacteristic(sl);                 
 4
 

7.3-4 SCFVector
‣ SCFVector( sl )( method )

Returns: a \(1\), \(3\) or \(4\) tuple of (non-negative) integer values upon success, fail otherwise.

Computes the \(f\)-vector of a discrete normal surface, i. e. the number of vertices, edges, triangles and quadrilaterals of sl, cf. SCFVector.

 gap> list:=SCLib.SearchByName("S^2xS^1");;
 gap> c:=SCLib.Load(list[1][1]);;             
 gap> sl:=SCNSSlicing(c,[[1..5],[6..10]]);;
 gap> SCFVector(sl);                 
 [ 20, 40, 16, 8 ]
 

7.3-5 SCFaceLattice
‣ SCFaceLattice( complex )( method )

Returns: a list of facet lists upon success, fail otherwise.

Computes the face lattice of a discrete normal surface sl in the original labeling. Triangles and quadrilaterals are stored separately (cf. SCSkel (6.9-54)).

 gap> c:=SCBdSimplex(4);;              
 gap> sl:=SCNSSlicing(c,[[1,2],[3..5]]);;
 gap> SCFaceLattice(sl);                            
 [ [ [ [ 1, 3 ] ], [ [ 1, 4 ] ], [ [ 1, 5 ] ], [ [ 2, 3 ] ], [ [ 2, 4 ] ], 
       [ [ 2, 5 ] ] ], 
   [ [ [ 1, 3 ], [ 1, 4 ] ], [ [ 1, 3 ], [ 1, 5 ] ], [ [ 1, 3 ], [ 2, 3 ] ], 
       [ [ 1, 4 ], [ 1, 5 ] ], [ [ 1, 4 ], [ 2, 4 ] ], [ [ 1, 5 ], [ 2, 5 ] ], 
       [ [ 2, 3 ], [ 2, 4 ] ], [ [ 2, 3 ], [ 2, 5 ] ], [ [ 2, 4 ], [ 2, 5 ] ] ]
     , [ [ [ 1, 3 ], [ 1, 4 ], [ 1, 5 ] ], [ [ 2, 3 ], [ 2, 4 ], [ 2, 5 ] ] ], 
   [ [ [ 1, 3 ], [ 1, 4 ], [ 2, 3 ], [ 2, 4 ] ], 
       [ [ 1, 3 ], [ 1, 5 ], [ 2, 3 ], [ 2, 5 ] ], 
       [ [ 1, 4 ], [ 1, 5 ], [ 2, 4 ], [ 2, 5 ] ] ] ]
 gap> sl.F;
 [ 6, 9, 2, 3 ]
 

7.3-6 SCFaceLatticeEx
‣ SCFaceLatticeEx( complex )( method )

Returns: a list of face lists upon success, fail otherwise.

Computes the face lattice of a discrete normal surface sl in the standard labeling. Triangles and quadrilaterals are stored separately (cf. SCSkelEx (6.9-55)).

 gap> c:=SCBdSimplex(4);;              
 gap> sl:=SCNSSlicing(c,[[1,2],[3..5]]);;
 gap> SCFaceLatticeEx(sl);                            
 [ [ [ 1 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ], [ 6 ] ], 
   [ [ 1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 2, 3 ], [ 2, 5 ], [ 3, 6 ], [ 4, 5 ], 
       [ 4, 6 ], [ 5, 6 ] ], [ [ 1, 2, 3 ], [ 4, 5, 6 ] ], 
   [ [ 1, 2, 4, 5 ], [ 1, 3, 4, 6 ], [ 2, 3, 5, 6 ] ] ]
 gap> sl.F;
 [ 6, 9, 2, 3 ]
 

7.3-7 SCFpBettiNumbers
‣ SCFpBettiNumbers( sl, p )( method )

Returns: a list of non-negative integers upon success, fail otherwise.

Computes the Betti numbers modulo p of a slicing sl. Internally, sl is triangulated (using SCNSTriangulation (7.2-2)) and the Betti numbers are computed via SCFpBettiNumbers using the triangulation.

 gap> SCLib.SearchByName("(S^2xS^1)#20");       
 [ [ 633, "(S^2xS^1)#20" ] ]
 gap> c:=SCLib.Load(last[1][1]);;
 gap> c.F;
 [ 27, 298, 542, 271 ]
 gap> sl:=SCNSSlicing(c,[[1..13],[14..27]]);;
 gap> SCFpBettiNumbers(sl,2);
 [ 2, 14, 2 ]
 

7.3-8 SCGenus
‣ SCGenus( sl )( method )

Returns: a non-negative integer upon success, fail otherwise.

Computes the genus of a discrete normal surface sl.

 gap> SCLib.SearchByName("(S^2xS^1)#20");
 [ [ 633, "(S^2xS^1)#20" ] ]
 gap> c:=SCLib.Load(last[1][1]);;               
 gap> c.F;                               
 [ 27, 298, 542, 271 ]
 gap> sl:=SCNSSlicing(c,[[1..12],[13..27]]);;
 gap> SCIsConnected(sl);
 true
 gap> SCGenus(sl);                     
 7
 

7.3-9 SCHomology
‣ SCHomology( sl )( method )

Returns: a list of homology groups upon success, fail otherwise.

Computes the homology of a slicing sl. Internally, sl is triangulated (cf. SCNSTriangulation (7.2-2)) and simplicial homology is computed via SCHomology using the triangulation.

 gap> SCLib.SearchByName("(S^2xS^1)#20");       
 [ [ 633, "(S^2xS^1)#20" ] ]
 gap> c:=SCLib.Load(last[1][1]);;
 gap> c.F;
 [ 27, 298, 542, 271 ]
 gap> sl:=SCNSSlicing(c,[[1..12],[13..27]]);;   
 gap> sl.Homology;
 [ [ 0, [  ] ], [ 14, [  ] ], [ 1, [  ] ] ]
 gap> sl:=SCNSSlicing(c,[[1..13],[14..27]]);;
 gap> sl.Homology;                       
 [ [ 1, [  ] ], [ 14, [  ] ], [ 2, [  ] ] ]
 

7.3-10 SCIsConnected
‣ SCIsConnected( complex )( method )

Returns: true or false upon success, fail otherwise.

Checks if a normal surface complex is connected.

 gap> list:=SCLib.SearchByAttribute("Dim=3 and F[1]=10");;
 gap> c:=SCLib.Load(list[1][1]);
 <SimplicialComplex: S^3 (VT) | dim = 3 | n = 10>
 gap> sl:=SCNSSlicing(c,[[1..5],[6..10]]);
 <NormalSurface: slicing [ [ 1, 2, 3, 4, 5 ], [ 6, 7, 8, 9, 10 ] ] of S^3 (VT) \
 | dim = 2>
 gap> SCIsConnected(sl);
 true
 

7.3-11 SCIsEmpty
‣ SCIsEmpty( complex )( method )

Returns: true or false upon success, fail otherwise.

Checks if a normal surface complex is the empty complex, i. e. a SCNormalSurface object with empty facet list.

 gap> sl:=SCNS([]);;
 gap> SCIsEmpty(sl);
 true
 

7.3-12 SCIsOrientable
‣ SCIsOrientable( sl )( method )

Returns: true or false upon success, fail otherwise.

Checks if a discrete normal surface sl is orientable.

 gap> c:=SCBdSimplex(4);;
 gap> sl:=SCNSSlicing(c,[[1,2],[3,4,5]]);
 <NormalSurface: slicing [ [ 1, 2 ], [ 3, 4, 5 ] ] of S^3_5 | dim = 2>
 gap> SCIsOrientable(sl);
 true
 

7.3-13 SCSkel
‣ SCSkel( sl, k )( method )

Returns: a face list (of k+1tuples) or a list of face lists upon success, fail otherwise.

Computes all faces of cardinality k+1 in the original labeling: k \(= 0\) computes the vertices, k \(= 1\) computes the edges, k \(= 2\) computes the triangles, k \(= 3\) computes the quadrilaterals.

If k is a list (necessarily a sublist of [ 0,1,2,3 ]) all faces of all cardinalities contained in k are computed.

 gap> c:=SCBdSimplex(4);;              
 gap> sl:=SCNSSlicing(c,[[1],[2..5]]);;
 gap> SCSkel(sl,1);                            
 [ [ [ 1, 2 ], [ 1, 3 ] ], [ [ 1, 2 ], [ 1, 4 ] ], [ [ 1, 2 ], [ 1, 5 ] ], 
   [ [ 1, 3 ], [ 1, 4 ] ], [ [ 1, 3 ], [ 1, 5 ] ], [ [ 1, 4 ], [ 1, 5 ] ] ]
 
 gap> c:=SCBdSimplex(4);;              
 gap> sl:=SCNSSlicing(c,[[1],[2..5]]);;
 gap> SCSkel(sl,3);                            
 [  ]
 gap> sl:=SCNSSlicing(c,[[1,2],[3..5]]);;
 gap> SCSkelEx(sl,3);                            
 [ [ 1, 2, 4, 5 ], [ 1, 3, 4, 6 ], [ 2, 3, 5, 6 ] ]
 

7.3-14 SCSkelEx
‣ SCSkelEx( sl, k )( method )

Returns: a face list (of k+1tuples) or a list of face lists upon success, fail otherwise.

Computes all faces of cardinality k+1 in the standard labeling: k \(= 0\) computes the vertices, k \(= 1\) computes the edges, k \(= 2\) computes the triangles, k \(= 3\) computes the quadrilaterals.

If k is a list (necessarily a sublist of [ 0,1,2,3 ]) all faces of all cardinalities contained in k are computed.

 gap> c:=SCBdSimplex(4);;              
 gap> sl:=SCNSSlicing(c,[[1],[2..5]]);;
 gap> SCSkelEx(sl,1);                            
 [ [ 1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 2, 3 ], [ 2, 4 ], [ 3, 4 ] ]
 
 gap> c:=SCBdSimplex(4);;              
 gap> sl:=SCNSSlicing(c,[[1],[2..5]]);;
 gap> SCSkelEx(sl,3);                            
 [  ]
 gap> sl:=SCNSSlicing(c,[[1,2],[3..5]]);;
 gap> SCSkelEx(sl,3);                            
 [ [ 1, 2, 4, 5 ], [ 1, 3, 4, 6 ], [ 2, 3, 5, 6 ] ]
 

7.3-15 SCTopologicalType
‣ SCTopologicalType( sl )( method )

Returns: a string upon success, fail otherwise.

Determines the topological type of sl via the classification theorem for closed compact surfaces. If sl is not connected, the topological type of each connected component is computed.

 gap> SCLib.SearchByName("(S^2xS^1)#20");      
 [ [ 633, "(S^2xS^1)#20" ] ]
 gap> c:=SCLib.Load(last[1][1]);;
 gap> c.F;
 [ 27, 298, 542, 271 ]
 gap> for i in [1..26] do sl:=SCNSSlicing(c,[[1..i],[i+1..27]]); Print(sl.TopologicalType,"\n"); od;                                           
 S^2
 S^2
 S^2
 S^2
 S^2 U S^2
 S^2 U S^2
 S^2
 (T^2)#3
 (T^2)#5
 (T^2)#4
 (T^2)#3
 (T^2)#7
 (T^2)#7 U S^2
 (T^2)#7 U S^2
 (T^2)#7 U S^2
 (T^2)#8 U S^2
 (T^2)#7 U S^2
 (T^2)#8
 (T^2)#6
 (T^2)#6
 (T^2)#5
 (T^2)#3
 (T^2)#2
 T^2
 S^2
 S^2
 

7.3-16 SCUnion
‣ SCUnion( complex1, complex2 )( method )

Returns: normal surface of type SCNormalSurface upon success, fail otherwise.

Forms the union of two normal surfaces complex1 and complex2 as the normal surface formed by the union of their facet sets. The two arguments are not altered. Note: for the union process the vertex labelings of the complexes are taken into account, see also Operation Union (SCNormalSurface, SCNormalSurface) (5.6-1). Facets occurring in both arguments are treated as one facet in the new complex.

 gap> list:=SCLib.SearchByAttribute("Dim=3 and F[1]=10");;
 gap> c:=SCLib.Load(list[1][1]);
 <SimplicialComplex: S^3 (VT) | dim = 3 | n = 10>
 gap> sl1:=SCNSSlicing(c,[[1..5],[6..10]]);;
 gap> sl2:=sl1+10;;
 gap> sl3:=SCUnion(sl1,sl2);;
 gap> SCTopologicalType(sl3);
 "S^2 U S^2"
 
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Bib Ind

generated by GAPDoc2HTML