**Tutorial on the GAP package 'catreps' for handling representations of categories.
**

March 2011

The package has been designed and is maintained by

Peter Webb

School of Mathematics

University of Minnesota

Minneapolis MN 55455

webb@math.umn.edu

http://www.math.umn.edu/~webb

The GAP code is available at: http://www.math.umn.edu/~webb/

The code has been written by Peter Webb, with a contribution from Fan Zhang.

Read P.J. Webb,

In this package a category is stored as a concrete category (i.e. a category where the objects are sets and morphisms are maps of sets) in the same way as for the package 'categories' which computes the homology of nerves of categories. A category is stored as a record (cat, say) with fields cat.objects, cat.generators, cat.domain, cat.codomain. Each object in the list cat.objects is a set, and each morphism in the list of generator morphisms cat.generators is stored as a mapping of sets, which we notate as the list of its values. The numbers of the objects which are the domain and codomain of each generator morphism are listed in cat.domain and cat.codomain.

A representation of a category is stored as a record with a name such as rep, and fields which include rep.category, rep.genimages, rep.field and rep.dimension. The first of these is the category being represented. The second is a list of matrices over rep.field which represent the action of the generator morphisms in the list rep.category.generators.

We need to work with elements of the 'representation space' of the representation, which we take to be the direct sum of the vector spaces associated to the objects of the category, taken in the fixed order in which the objects are always listed. Some of the commands below take as arguments or return a list of lists of vectors. In such a list the nth entry is a list of vectors in the vector space associated to object n and it is frequently a basis for the space it spans.

Commands currently available

gap> Read("catreps");

gap> c3c3:=ConcreteCategory([[2,3,1],[4,5,6],[,,,5,6,4]]);

rec( generators := [ [ 2, 3, 1 ], [ 4, 5, 6 ], [ ,,, 5, 6, 4 ] ],

operations := rec( ), objects := [ [ 1, 2, 3 ], [ 4, 5, 6 ] ],

domain := [ 1, 1, 2 ], codomain := [ 1, 2, 2 ] )

gap> one:=One(GF(3));;

gap> d:=[[1,1,0,0,0],[0,1,1,0,0],[0,0,1,0,0],[0,0,0,1,1],[0,0,0,0,1]]*one;;

gap> e:=[[0,1,0,0],[0,0,1,0],[0,0,0,0],[0,1,0,1],[0,0,1,0]]*one;;

gap> f:=[[1,1,0,0],[0,1,1,0],[0,0,1,0],[0,0,0,1]]*one;;

gap> nine:=CatRep(c3c3,[d,e,f],GF(3));

rec(

category := rec( generators := [ [ 2, 3, 1 ], [ 4, 5, 6 ], [ ,,, 5, 6, 4 ] ]

, operations := rec( ), objects := [ [ 1, 2, 3 ], [ 4, 5, 6 ] ],

domain := [ 1, 1, 2 ], codomain := [ 1, 2, 2 ] ),

genimages := [ [ [ Z(3)^0, Z(3)^0, 0*Z(3), 0*Z(3), 0*Z(3) ],

[ 0*Z(3), Z(3)^0, Z(3)^0, 0*Z(3), 0*Z(3) ],

[ 0*Z(3), 0*Z(3), Z(3)^0, 0*Z(3), 0*Z(3) ],

[ 0*Z(3), 0*Z(3), 0*Z(3), Z(3)^0, Z(3)^0 ],

[ 0*Z(3), 0*Z(3), 0*Z(3), 0*Z(3), Z(3)^0 ] ],

[ [ 0*Z(3), Z(3)^0, 0*Z(3), 0*Z(3) ], [ 0*Z(3), 0*Z(3), Z(3)^0, 0*Z(3) ]

, [ 0*Z(3), 0*Z(3), 0*Z(3), 0*Z(3) ],

[ 0*Z(3), Z(3)^0, 0*Z(3), Z(3)^0 ],

[ 0*Z(3), 0*Z(3), Z(3)^0, 0*Z(3) ] ],

[ [ Z(3)^0, Z(3)^0, 0*Z(3), 0*Z(3) ], [ 0*Z(3), Z(3)^0, Z(3)^0, 0*Z(3) ]

, [ 0*Z(3), 0*Z(3), Z(3)^0, 0*Z(3) ],

[ 0*Z(3), 0*Z(3), 0*Z(3), Z(3)^0 ] ] ], field := GF(3),

dimension := [ 5, 4 ] )

gap> Length(Decompose(nine));

1

gap> fortyone:=TensorProductRep(nine,nine);;

gap> d:=Decompose(fortyone);;

gap> List(d,x->List(x,Length));

[ [ 3, 0 ], [ 3, 1 ], [ 3, 3 ], [ 3, 3 ], [ 0, 3 ], [ 3, 0 ], [ 3, 0 ],

[ 3, 0 ], [ 1, 3 ], [ 3, 3 ] ]

gap> six:=SubmoduleRep(fortyone,d[3]);

rec(

category := rec( generators := [ [ 2, 3, 1 ], [ 4, 5, 6 ], [ ,,, 5, 6, 4 ] ]

, operations := rec( ), objects := [ [ 1, 2, 3 ], [ 4, 5, 6 ] ],

domain := [ 1, 1, 2 ], codomain := [ 1, 2, 2 ] ),

genimages := [ [ [ Z(3)^0, Z(3)^0, 0*Z(3) ], [ 0*Z(3), Z(3)^0, Z(3)^0 ],

[ 0*Z(3), 0*Z(3), Z(3)^0 ] ],

[ [ 0*Z(3), Z(3), 0*Z(3) ], [ 0*Z(3), 0*Z(3), Z(3) ],

[ 0*Z(3), 0*Z(3), 0*Z(3) ] ],

[ [ Z(3)^0, Z(3)^0, 0*Z(3) ], [ 0*Z(3), Z(3)^0, Z(3)^0 ],

[ 0*Z(3), 0*Z(3), Z(3)^0 ] ] ], field := GF(3),

dimension := [ 3, 3 ], isRepresentation := true )

gap> SumOfImages(ConstantRep(c3c3,GF(3)),six);

[ [ [ 0*Z(3), 0*Z(3), Z(3)^0 ] ], [ ] ]

gap> y:=YonedaRep(c3c3,1,GF(3));;

gap> SumOfImages(ConstantRep(c3c3,GF(3)),y);

[ [ [ Z(3)^0, Z(3)^0, Z(3)^0 ] ], [ [ Z(3)^0, Z(3)^0, Z(3)^0 ] ] ]

gap> s1:=SubmoduleRep(six,[ [ [ 0*Z(3), 0*Z(3), Z(3)^0 ] ], [ ] ]);

rec(

category := rec( generators := [ [ 2, 3, 1 ], [ 4, 5, 6 ], [ ,,, 5, 6, 4 ] ]

, operations := rec( ), objects := [ [ 1, 2, 3 ], [ 4, 5, 6 ] ],

domain := [ 1, 1, 2 ], codomain := [ 1, 2, 2 ],

morphisms := [ [ [ [ 1, 2, 3 ], [ 2, 3, 1 ], [ 3, 1, 2 ] ],

[ [ 4, 5, 6 ], [ 5, 6, 4 ], [ 6, 4, 5 ] ] ],

[ [ ], [ [ ,,, 4, 5, 6 ], [ ,,, 5, 6, 4 ], [ ,,, 6, 4, 5 ] ] ] ] ),

genimages := [ [ [ Z(3)^0 ] ], [ [ ] ], [ ] ], field := GF(3),

dimension := [ 1, 0 ], isRepresentation := true )

gap> five:=QuotientRep(six,[ [ [ 0*Z(3), 0*Z(3), Z(3)^0 ] ], [ ] ]);

rec(

category := rec( generators := [ [ 2, 3, 1 ], [ 4, 5, 6 ], [ ,,, 5, 6, 4 ] ]

, operations := rec( ), objects := [ [ 1, 2, 3 ], [ 4, 5, 6 ] ],

domain := [ 1, 1, 2 ], codomain := [ 1, 2, 2 ],

morphisms := [ [ [ [ 1, 2, 3 ], [ 2, 3, 1 ], [ 3, 1, 2 ] ],

[ [ 4, 5, 6 ], [ 5, 6, 4 ], [ 6, 4, 5 ] ] ],

[ [ ], [ [ ,,, 4, 5, 6 ], [ ,,, 5, 6, 4 ], [ ,,, 6, 4, 5 ] ] ] ] ),

genimages := [ [ [ Z(3)^0, Z(3)^0 ], [ 0*Z(3), Z(3)^0 ] ],

[ [ 0*Z(3), Z(3), 0*Z(3) ], [ 0*Z(3), 0*Z(3), Z(3) ] ],

[ [ Z(3)^0, Z(3)^0, 0*Z(3) ], [ 0*Z(3), Z(3)^0, Z(3)^0 ],

[ 0*Z(3), 0*Z(3), Z(3)^0 ] ] ], field := GF(3),

dimension := [ 2, 3 ], isRepresentation := true )

gap> SumOfImages(s1,six);

[ [ [ 0*Z(3), 0*Z(3), Z(3)^0 ] ], [ ] ]

gap> SumOfImages(s1,five);

[ [ ], [ ] ]

gap> SumOfImages(ConstantRep(c3c3,GF(3)),five);

[ [ [ 0*Z(3), Z(3)^0 ] ], [ [ 0*Z(3), 0*Z(3), Z(3)^0 ] ] ]

The final calculation shows that the module at object 2 for six is indecomposable of dimension 3. We now have sufficient information to describe six completely.

gap> SumOfImages(six,ConstantRep(c3c3,GF(3)));

[ [ ], [ [ Z(3)^0 ] ] ]