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

1 Category of functors of a finitely presented (linear) category
 1.1 Constructors
 1.2 Attributes
 1.3 Operations
 1.4 GAP Categories
 1.5 Examples

1 Category of functors of a finitely presented (linear) category

1.1 Constructors

1.1-1 FunctorCategory
‣ FunctorCategory( B, C )( operation )
‣ FunctorCategory( B, k )( operation )
‣ FunctorCategory( B )( operation )
‣ Hom( B, C )( operation )
‣ Hom( B, k )( operation )

Returns: a CAP category

Construct the category FunctorCategory( B, C )= Hom( B, C ) of functors from the small category B to the category C as objects and their natural transformations as morphisms.

1.1-2 AsObjectInFunctorCategory
‣ AsObjectInFunctorCategory( F )( attribute )
‣ AsObjectInFunctorCategory( B, rec_images_of_objects, rec_images_of_morphisms )( operation )
‣ AsObjectInFunctorCategory( B, images_of_objects, images_of_morphisms )( operation )

Returns: an object in a CAP category

Turn the functor F:B \to C into an object in the category of functors Hom := Hom( B, C ). An alternative input is the source category B and two defining records rec_images_of_objects and rec_images_of_morphisms of F. Another alternative input is the source category B and two defining lists images_of_objects and images_of_morphisms of F. The order of their entries must correspond to that of the vertices and arrows of the underlying quiver.

For the convenience of the user the following input is also valid: If images_of_objects is a list of nonnegative integers, images_of_morphisms is a list of matrices, and k:= CommutativeRingOfLinearCategory( B ) is a field then the two lists are interpreted as objects and morphisms in a matrix category or a category of rows over k, respectively.

1.1-3 AsMorphismInFunctorCategoryByValues
‣ AsMorphismInFunctorCategoryByValues( arg1, arg2, arg3, arg4 )( operation )
‣ AsMorphismInFunctorCategory( eta )( attribute )
‣ AsMorphismInFunctorCategory( U, e, V )( operation )
‣ AsMorphismInFunctorCategory( U, e, V )( operation )
‣ AsMorphismInFunctorCategory( arg1, arg2, arg3 )( operation )

Returns: a morphism in a CAP category

Turn the natrual transformation eta:F \to G into a morphism U := AsObjectInFunctorCategory( F ) \to V := AsObjectInFunctorCategory( G ) in the category of functors Hom := Hom( B, C ), where B := Source( F ) = Source( G ) and C := Range( F ) = Range( G ).

An alternative input is the triple (U, e, V), where e is a defining record of eta.

Another alternative input is the triple (U, e, V), where e is a defining list of eta.

1.2 Attributes

1.2-1 Source
‣ Source( Hom )( attribute )

Returns: a CAP category

The source category of the functor category cat.

1.2-2 Range
‣ Range( Hom )( attribute )

Returns: a CAP category

The range category of the functor category cat.

1.2-3 Source
‣ Source( F )( attribute )

Returns: a CAP category

The source of the functor underlying functor object F.

1.2-4 Range
‣ Range( F )( attribute )

Returns: a CAP category

The target of the functor underlying the functor object F.

1.2-5 OppositeOfSource
‣ OppositeOfSource( Hom )( attribute )

Returns: a CAP category

The opposite of the source category of the functor category Hom.

1.2-6 ValuesOfFunctor
‣ ValuesOfFunctor( F )( attribute )

Returns: a pair of lists

The input is functor F in a functor category Hom. The output is pair of lists. The first is the list of values of the functor F on all objects of the source category of Hom. The second is the list of values of the functor F on all *generating* morphisms of the source category of Hom.

1.2-7 ValuesOnAllObjects
‣ ValuesOnAllObjects( eta )( attribute )

Returns: a list

Returns the values of the natural transformation eta in a functor category Hom on all objects of the source category of Hom.

The 2-cell underlying the functor object F_or_eta.

1.2-8 UnderlyingCapTwoCategoryCell
‣ UnderlyingCapTwoCategoryCell( F_or_eta )( attribute )

Returns: a CAP functor or natural transformation

1.2-9 YonedaEmbeddingInFunctorCategory
‣ YonedaEmbeddingInFunctorCategory( B )( attribute )

Returns: a CAP functor

1.2-10 YonedaEmbeddingOfOppositeOfSourceCategory
‣ YonedaEmbeddingOfOppositeOfSourceCategory( Hom )( attribute )

Returns: a CAP functor

1.2-11 YonedaFibration
‣ YonedaFibration( B )( attribute )

Returns: a morphism in a CAP category

The input is a finitely presented category B. The output is an epimorphism in the category of functors from B into H :=RangeCategoryOfHomomorphismStructure( B ). Its source is the functor B \to H, c \mapsto \sqcup_{a\in B} \mathrm{Hom}(a,c), \psi \mapsto \sqcup_{a\in B} \mathrm{Hom}(a,\psi). Its target is the constant functor of 0-cells B \to H, c \mapsto B_0, \psi \mapsto \mathrm{id}_{B_0}.

1.2-12 YonedaProjection
‣ YonedaProjection( B )( attribute )

Returns: a morphism in a CAP category

The input is a finitely presented category B. The output is an epimorphism in the category of functors from B into H :=RangeCategoryOfHomomorphismStructure( B ). Its source is the functor B \to H, c \mapsto \sqcup_{a,b\in B} \mathrm{Hom}(a,b) \times \mathrm{Hom}(b,c), \psi \mapsto \sqcup_{a,b\in B} \mathrm{Hom}(1_a,1_b) \times \mathrm{Hom}(b,\psi). Its target is the functor B \to H, c \mapsto \sqcup_{a\in B} \mathrm{Hom}(a,c), \psi \mapsto \sqcup_{a\in B} \mathrm{Hom}(a,\psi).

1.2-13 YonedaComposition
‣ YonedaComposition( B )( attribute )

Returns: a morphism in a CAP category

The input is a finitely presented category B. The output is an epimorphism in the category of functors from B into H :=RangeCategoryOfHomomorphismStructure( B ). Its source is the functor B \to H, c \mapsto \sqcup_{a,b\in B} \mathrm{Hom}(a,b) \times \mathrm{Hom}(b,c), \psi \mapsto \sqcup_{a,b\in B} \mathrm{Hom}(1_a,1_b) \times \mathrm{Hom}(b,\psi). Its target is the functor B \to H, c \mapsto \sqcup_{a\in B} \mathrm{Hom}(a,c), \psi \mapsto \sqcup_{a\in B} \mathrm{Hom}(a,\psi).

We compute part of the nerve of the full subcategory of the simplicial category \Delta on the objects [0], [1], [2].

gap> Delta2 := SimplicialCategoryTruncatedInDegree( 2 );
FreeCategory( RightQuiver(
  "Delta(C0,C1,C2)[id:C1->C0,s:C0->C1,t:C0->C1,
                   is:C2->C1,it:C2->C1,
                   ps:C1->C2,pt:C1->C2,mu:C1->C2]" ) ) / relations
gap> RelationsOfFpCategory( Delta2 );
[ [ (s*id), (C0) ], [ (t*id), (C0) ],
  [ (ps*is), (C1) ], [ (pt*it), (C1) ],
  [ (is*id), (it*id) ], [ (pt*is), (id*t) ],
  [ (ps*it), (id*s) ], [ (s*pt), (t*ps) ],
  [ (s*mu), (s*ps) ], [ (t*mu), (t*pt) ],
  [ (mu*is), (C1) ], [ (mu*it), (C1) ] ]
gap> Size( Delta2 );
31
gap> Ypt := YonedaProjection( Delta2 );
<An epimorphism in FunctorCategory( FreeCategory( RightQuiver(
  "Delta(C0,C1,C2)[id:C1->C0,s:C0->C1,t:C0->C1,
                   is:C2->C1,it:C2->C1,
                   ps:C1->C2,pt:C1->C2,mu:C1->C2]" ) ) / relations,
 SkeletalFinSets )>
gap> IsWellDefined( Ypt );
true
gap> Ymu := YonedaComposition( Delta2 );
<An epimorphism in FunctorCategory( FreeCategory( RightQuiver(
   "Delta(C0,C1,C2)[id:C1->C0,s:C0->C1,t:C0->C1,
                   is:C2->C1,it:C2->C1,
                   ps:C1->C2,pt:C1->C2,mu:C1->C2]" ) ) / relations,
 SkeletalFinSets )>
gap> IsWellDefined( Ymu );
true
gap> Ys := YonedaFibration( Delta2 );
<A morphism in FunctorCategory( FreeCategory( RightQuiver(
   "Delta(C0,C1,C2)[id:C1->C0,s:C0->C1,t:C0->C1,
                   is:C2->C1,it:C2->C1,
                   ps:C1->C2,pt:C1->C2,mu:C1->C2]" ) ) / relations,
 SkeletalFinSets )>
gap> IsWellDefined( Ys );
true
gap> Display( Ys );
Image of <(C0)>:
{ 0, 1, 2 } ⱶ[ 0, 1, 2 ]→ { 0, 1, 2 }

Image of <(C1)>:
{ 0,..., 8 } ⱶ[ 0, 0, 1, 1, 1, 2, 2, 2, 2 ]→ { 0, 1, 2 }

Image of <(C2)>:
{ 0,..., 18 } ⱶ[ 0, 0, 0, 1, 1, 1, 1, 1, 1,
                 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ]→ { 0, 1, 2 }

A morphism in FunctorCategory( FreeCategory( RightQuiver(
  "Delta(C0,C1,C2)[id:C1->C0,s:C0->C1,t:C0->C1,
                   is:C2->C1,it:C2->C1,
                   ps:C1->C2,pt:C1->C2,mu:C1->C2]" ) ) / relations,
SkeletalFinSets ) given by the above data

1.3 Operations

1.3-1 DecomposeOnceByRandomEndomorphism
‣ DecomposeOnceByRandomEndomorphism( F )( operation )

Returns: a list

Return a pair of monomorphisms describing the embeddings of two direct summands of the representation F, the direct sum thereof is isomorphic to F.

1.3-2 WeakDirectSumDecomposition
‣ WeakDirectSumDecomposition( F )( operation )

Returns: a list

Return a list of monomorphisms describing the embeddings of a list of direct summands of the representation F, the direct sum thereof is isomorphic to F.

1.3-3 ApplyObjectInFunctorCategoryToObject
‣ ApplyObjectInFunctorCategoryToObject( F, obj )( operation )

Returns: a CAP object

Apply the functor F to the object obj. The shorthand is F(obj).

1.3-4 ApplyObjectInFunctorCategoryToMorphism
‣ ApplyObjectInFunctorCategoryToMorphism( F, mor )( operation )

Returns: a CAP morphism

Apply the functor F to the morphism mor. The shorthand is F(mor).

1.3-5 ApplyMorphismInFunctorCategoryToObject
‣ ApplyMorphismInFunctorCategoryToObject( eta, obj )( operation )

Returns: a CAP morphism

Apply the natural transformation eta to the object obj. The shorthand is eta(o).

1.4 GAP Categories

1.4-1 IsFunctorCategory
‣ IsFunctorCategory( category )( filter )

Returns: true or false

The GAP category of Hom-categories of functors between two fixed categories.

1.4-2 IsCellInFunctorCategory
‣ IsCellInFunctorCategory( cell )( filter )

Returns: true or false

The GAP category of cells in a Hom-category of functors between two fixed categories.

1.4-3 IsObjectInFunctorCategory
‣ IsObjectInFunctorCategory( obj )( filter )

Returns: true or false

The GAP category of objects in a Hom-category of functors between two fixed categories.

1.4-4 IsMorphismInFunctorCategory
‣ IsMorphismInFunctorCategory( mor )( filter )

Returns: true or false

The GAP category of morphisms in a Hom-category of functors between two fixed categories.

1.5 Examples

1.5-1 Representations of the cyclic groups of order 3 as a category of functors

To illustrate our implementation of the category of functors, we consider the following example. First, create a quiver q with one vertex 1 and one edge t.

gap> q := RightQuiver( "q(1)[t:1->1]" );
q(1)[t:1->1]

Construct the free \mathbb{Q}-algebra A of q. It is isomorphic to the polynomial algebra \mathbb{Q}[t].

gap> F := FreeCategory( q );
FreeCategory( RightQuiver( "q(1)[t:1->1]" ) )
gap> Q := HomalgFieldOfRationals( );
Q
gap> QF := Q[F];
Algebra( Q, FreeCategory( RightQuiver( "q(1)[t:1->1]" ) ) )

Out of this path algebra construct the algebra B that is obtained as the quotient modulo the ideal \langle t^3 - 1 \rangle.

gap> B := QuotientCategory( QF, [ QF.t^3 - IdentityMorphism( QF.1 ) ]
>              : range_of_HomStructure := MatrixCategory( Q ) );
Algebra( Q, FreeCategory( RightQuiver( "q(1)[t:1->1]" ) ) ) / relations
gap> RelationsOfAlgebroid( B );
[ (1)-[1*(t*t*t) - 1*(1)]->(1) ]

We define a record that will be used to construct the \mathbb{Q}-linear morphism \epsilon \colon B \to \mathbb{Q} defined by \epsilon(t)=1.

gap> counit := rec( t := 1 );
rec( t := 1 )

Next we want to construct the \mathbb{Q}-linear morphism \Delta \colon B \to B \otimes_{\mathbb{Q}} B defined by \Delta(t)= t \otimes t. In order to do so, we first need B \otimes_\mathbb{Q} B.

gap> B2 := B^2;
Algebra( Q, FreeCategory( RightQuiver(
"qxq(1x1)[1xt:1x1->1x1,tx1:1x1->1x1]" ) ) ) / relations

We define a record that will be used to construct \Delta. Note that we obtain t \otimes t as the product of the generators t \otimes 1 and 1 \otimes t of B \otimes_\mathbb{Q} B. The order does not matter.

gap> comult := rec( t := PreCompose( B2.tx1, B2.1xt ) );
rec( t := (1x1)-[{ 1*(1xt*tx1) }]->(1x1) )
gap> PreCompose(B2.1xt, B2.tx1) = PreCompose(B2.tx1, B2.1xt);
true

Use the records comult and counit to define a bialgebroid (actually a bialgebra) structure on B.

gap> AddBialgebroidStructure( B, counit, comult );
Bialgebra( Q, FreeCategory( RightQuiver( "q(1)[t:1->1]" ) ) ) / relations

Extract comultiplication and counit from B, now as functors.

gap> counit := Counit( B );
Functor from
Bialgebra( Q, FreeCategory( RightQuiver( "q(1)[t:1->1]" ) ) ) / relations
->
Algebra( Q, FreeCategory( RightQuiver( "*(1)[]" ) ) )
gap> comult := Comultiplication( B );
Functor from
Bialgebra( Q, FreeCategory( RightQuiver( "q(1)[t:1->1]" ) ) ) / relations
->
Algebra( Q, FreeCategory( RightQuiver(
"qxq(1x1)[1xt:1x1->1x1,tx1:1x1->1x1]" ) ) ) / relations

We can apply the comultiplication and counit to objects and morphisms of B.

gap> ApplyFunctor( counit, B.1 );
<(1)>
gap> ApplyFunctor( counit, B.t );
(1)-[1*(1)]->(1)
gap> ApplyFunctor( comult, B.1 );
<(1x1)>
gap> ApplyFunctor( comult, B.t );
(1x1)-[{ 1*(1xt*tx1) }]->(1x1)

Next we define an antipode on B as the (anti)endomorphism on B that sends t to t^2. This corresponds to the (anti)endomorphism of the cyclic group of order 3 that sends an element to its inverse.

gap> antipode := rec( t := PreCompose( B.t, B.t ) );
rec( t := (1)-[{ 1*(t*t) }]->(1) )
gap> AddAntipode( B, antipode );
gap> antipode := Antipode( B );
Contravariant functor from
HopfAlgebra( Q, FreeCategory( RightQuiver( "q(1)[t:1->1]" ) ) ) / relations
->
HopfAlgebra( Q, FreeCategory( RightQuiver( "q(1)[t:1->1]" ) ) ) / relations
gap> ApplyFunctor( antipode, B.1 );
<(1)>
gap> ApplyFunctor( antipode, B.t );
(1)-[{ 1*(t*t) }]->(1)

Let A be the range category of the homomorphism structure of B. It is the matrix category over \mathbb{Q}. Its objects are natural numbers and its morphisms the matrices with coefficients in \mathbb{Q}. We use it as a skeletal model of the category of finite dimension vector spaces.

gap> A := RangeCategoryOfHomomorphismStructure( B );
Category of matrices over Q

Construct the category H of functors from B to A. An object in this category is a pair consisting of a finite-dimensional vector space, specified by its dimension, together with an endomorphism of this vector space, specified by a square matrix.

gap> H := FunctorCategory( B, A :
>        doctrines := [ "IsRigidSymmetricClosedMonoidalCategory" ] );
FunctorCategory( HopfAlgebra( Q, FreeCategory(
RightQuiver( "q(1)[t:1->1]" ) ) ) / relations, Category of matrices over Q )

Verify that its zero object z behaves as expected.

gap> z := ZeroObject( H );
<(1)->0; (t)->0x0>
gap> z( B.1 );
<A vector space object over Q of dimension 0>
gap> z.1;
<A vector space object over Q of dimension 0>
gap> z( B.t );
<A morphism in Category of matrices over Q>
gap> z.t = z( B.t );
true
gap> idz := IdentityMorphism( z );
<(1)->0x0>
gap> idz( B.1 );
<A zero, identity morphism in Category of matrices over Q>
gap> idz.1 = idz( B.1 );
true
gap> DirectSum( z, z );
<(1)->0; (t)->0x0>
gap> DirectSum( z, z ) = z;
true

Now we construct an object in H, i.e. a functor from B to A. To this end we need a finite dimensional vector space V_0

gap> V0 := 3 / A;
<A vector space object over Q of dimension 3>

and an endomorphism \varphi on V_0.

gap> phi := HomalgMatrix( [ 0, 1, 0,  0, 0, 1,  1, 0, 0 ], 3, 3, Q );
<A 3 x 3 matrix over an internal ring>
gap> V_obj := rec( 1 := V0 );
rec( 1 := <A vector space object over Q of dimension 3> )
gap> V_mor := rec( t := phi / A );
rec( t := <A morphism in Category of matrices over Q> )
gap> V := AsObjectInFunctorCategory( B, V_obj, V_mor );
<(1)->3; (t)->3x3>

This functor is indeed well defined.

gap> IsWellDefined( V );
true

Let us see how such a functor can fail to be well defined:

gap> psi := HomalgMatrix( [ 1, 0, 0,  0, 0, 1,  0, 1, 0 ], 3, 3, Q );
<A 3 x 3 matrix over an internal ring>
gap> W_obj := rec( 1 := V0 );
rec( 1 := <A vector space object over Q of dimension 3> )
gap> W_mor := rec( t := psi / A );
rec( t := <A morphism in Category of matrices over Q> )
gap> W := AsObjectInFunctorCategory( B, W_obj, W_mor );
<(1)->3; (t)->3x3>
gap> IsWellDefined( W );
false

Display some of the properties of this functor.

gap> V.1;
<A vector space object over Q of dimension 3>
gap> V.1 = V( B.1 );
true
gap> V.t;
<A morphism in Category of matrices over Q>
gap> V.t = V( B.t );
true
gap> Display( V( B.t ) );
[ [  0,  1,  0 ],
  [  0,  0,  1 ],
  [  1,  0,  0 ] ]

A morphism in Category of matrices over Q
gap> IsZero( V );
false

Costruct the direct sum of V with itself.

gap> VoplusV := DirectSum( V, V );
<(1)->6; (t)->6x6>
gap> VoplusV( B.1 );
<A vector space object over Q of dimension 6>
gap> VoplusV( B.t );
<A morphism in Category of matrices over Q>
gap> Display( VoplusV( B.t ) );
[ [  0,  1,  0,  0,  0,  0 ],
  [  0,  0,  1,  0,  0,  0 ],
  [  1,  0,  0,  0,  0,  0 ],
  [  0,  0,  0,  0,  1,  0 ],
  [  0,  0,  0,  0,  0,  1 ],
  [  0,  0,  0,  1,  0,  0 ] ]

A morphism in Category of matrices over Q

Construct the projection \pi_1 from V \oplus V to the first summand and study some of its properties.

gap> pi1 := ProjectionInFactorOfDirectSum( [ V, V ], 1 );
<(1)->6x3>
gap> pi1 = -pi1;
false
gap> pi1( B.1 );
<A morphism in Category of matrices over Q>
gap> Display( pi1( B.1 ) );
[ [  1,  0,  0 ],
  [  0,  1,  0 ],
  [  0,  0,  1 ],
  [  0,  0,  0 ],
  [  0,  0,  0 ],
  [  0,  0,  0 ] ]

A morphism in Category of matrices over Q
gap> IsWellDefined( pi1 );
true
gap> IsEpimorphism( pi1 );
true
gap> IsMonomorphism( pi1 );
false

Construct the kernel object V1 of \pi_1 and check that it is V.

gap> V1 := KernelObject( pi1 );
<(1)->3; (t)->3x3>
gap> IsWellDefined( V1 );
true
gap> V1 = V;
true

Construct the projection \pi_2 from V \oplus V to the second summand and check that it is not equal to \pi_1.

gap> pi2 := ProjectionInFactorOfDirectSum( [ V, V ], 2 );
<(1)->6x3>
gap> pi1 = pi2;
false

Construct another object U in the category of functors from B to A.

gap> psi := HomalgMatrix( [ 0, 1,  -1, -1 ], 2, 2, Q );
<A 2 x 2 matrix over an internal ring>
gap> U := 2 / A;
<A vector space object over Q of dimension 2>
gap> U_obj := rec( 1 := U );
rec( 1 := <A vector space object over Q of dimension 2> )
gap> U_mor := rec( t := psi / A );
rec( t := <A morphism in Category of matrices over Q> )
gap> U := CapFunctor( B, U_obj, U_mor );
Functor from
HopfAlgebra( Q, FreeCategory( RightQuiver( "q(1)[t:1->1]" ) ) ) / relations
->
Category of matrices over Q
gap> U := AsObjectInFunctorCategory( U );
<(1)->2; (t)->2x2>
gap> IsWellDefined( U );
true
gap> U( B.1 );
<A vector space object over Q of dimension 2>
gap> U( B.t );
<A morphism in Category of matrices over Q>
gap> Display( U( B.t ) );
[ [   0,   1 ],
  [  -1,  -1 ] ]

A morphism in Category of matrices over Q
gap> IsZero( U );
false

To construct a morphism \eta from V to U in H (i.e. a natural transformation from the functor V to U), we first define a HomAlg matrix.

gap> eta := HomalgMatrix( [ 1, 0,  0, 1,  -1, -1 ], 3, 2, Q );
<A 3 x 2 matrix over an internal ring>

Then we define a record that will be used to define the natural transformation \eta. Here 1 is the string representation of the only object of B and the vector space morphism induced by the above matrix is the component of \eta at this object.

gap> eta := rec( 1 := eta / A );
rec( 1 := <A morphism in Category of matrices over Q> )

Finally we construct the natural transformation \eta from V to U as a morphism in the category of functors from B to A.

gap> eta := AsMorphismInFunctorCategory( V, eta, U );
<(1)->3x2>

We check that \eta is well defined.

gap> IsWellDefined( eta );
true

We retrieve the component of \eta at the object 1 of B.

gap> eta( B.1 );
<A morphism in Category of matrices over Q>
gap> Display( eta( B.1 ) );
[ [   1,   0 ],
  [   0,   1 ],
  [  -1,  -1 ] ]

A morphism in Category of matrices over Q

We study some of the properties of \eta.

gap> IsEpimorphism( eta );
true
gap> IsMonomorphism( eta );
false

Construct the kernel object of \eta.

gap> K := KernelObject( eta );
<(1)->1; (t)->1x1>
gap> K( B.1 );
<A vector space object over Q of dimension 1>
gap> K( B.t );
<A morphism in Category of matrices over Q>
gap> Display( K( B.t ) );
[ [  1 ] ]

A morphism in Category of matrices over Q
gap> iota := KernelEmbedding( eta );
<(1)->1x3>
gap> C := CokernelObject( iota );
<(1)->2; (t)->2x2>
gap> C = U;
true

Since B is a bialgebra, H becomes a monoidal category. First we obtain the unit object I of this monoidal category.

gap> I := TensorUnit( H );
<(1)->1; (t)->1x1>
gap> I( B.1 );
<A vector space object over Q of dimension 1>
gap> I( B.t );
<A morphism in Category of matrices over Q>
gap> Display( I( B.t ) );
[ [  1 ] ]

A morphism in Category of matrices over Q

It turns out that I is equal to K.

gap> I = K;
true

Construct the tensor product V \otimes V.

gap> VV := TensorProductOnObjects( V, V );
<(1)->9; (t)->9x9>
gap> VV( B.1 );
<A vector space object over Q of dimension 9>
gap> VV( B.t );
<A morphism in Category of matrices over Q>
gap> Display( VV( B.t ) );
[ [  0,  0,  0,  0,  1,  0,  0,  0,  0 ],
  [  0,  0,  0,  0,  0,  1,  0,  0,  0 ],
  [  0,  0,  0,  1,  0,  0,  0,  0,  0 ],
  [  0,  0,  0,  0,  0,  0,  0,  1,  0 ],
  [  0,  0,  0,  0,  0,  0,  0,  0,  1 ],
  [  0,  0,  0,  0,  0,  0,  1,  0,  0 ],
  [  0,  1,  0,  0,  0,  0,  0,  0,  0 ],
  [  0,  0,  1,  0,  0,  0,  0,  0,  0 ],
  [  1,  0,  0,  0,  0,  0,  0,  0,  0 ] ]

A morphism in Category of matrices over Q

Compute the dual object of U.

gap> Us := DualOnObjects( U );
<(1)->2; (t)->2x2>
gap> Us( B.1 );
<A vector space object over Q of dimension 2>
gap> Us( B.t );
<A morphism in Category of matrices over Q>
gap> Display( Us( B.t ) );
[ [  -1,   1 ],
  [  -1,   0 ] ]

A morphism in Category of matrices over Q
gap> epsilon := MorphismToBidual( U );
<(1)->2x2>
gap> Source( epsilon ) = U;
true
gap> Range( epsilon ) = U;
true
gap> EndU := InternalHom( U, U );
<(1)->4; (t)->4x4>
gap> UsU := TensorProductOnObjects( Us, U );
<(1)->4; (t)->4x4>
gap> UUs := TensorProductOnObjects( U, Us );
<(1)->4; (t)->4x4>
gap> EndU = UsU;
true
gap> EndU = UUs;
false
gap> beta := Braiding( Us, U );
<(1)->4x4>
gap> Source( beta ) = UsU;
true
gap> Range( beta ) = UUs;
true

1.5-2 Differential modules as a category of functors

We illustrate how the category of functors can be used to model differential modules. First, create a quiver q with one vertex 1 and one edge t.

gap> q := RightQuiver( "q(1)[t:1->1]" );
q(1)[t:1->1]

Construct the free \mathbb{Q}-algebra B of q. It is isomorphic to the polynomial algebra \mathbb{Q}[t].

gap> F := FreeCategory( q );
FreeCategory( RightQuiver( "q(1)[t:1->1]" ) )
gap> Q := HomalgFieldOfRationals( );
Q
gap> B := Q[F];
Algebra( Q, FreeCategory( RightQuiver( "q(1)[t:1->1]" ) ) )

Define a record that described the \mathbb{Q}-linear morphism \epsilon \colon B \to \mathbb{Q} defined by \epsilon(t) = 0.

gap> counit := rec( t := 0 );
rec( t := 0 )

Construct the tensor product B \otimes_{\mathbb{Q}} B.

gap> B2 := B^2;
Algebra( Q, FreeCategory(
RightQuiver( "qxq(1x1)[1xt:1x1->1x1,tx1:1x1->1x1]" ) ) ) / relations

Define a record that describes the \mathbb{Q}-linear morphism \Delta \colon B \to B \otimes_{\mathbb{Q}} B defined by \Delta(t) \coloneqq t \otimes 1 + 1 \otimes t.

gap> comult := rec( t := B2.tx1 + B2.1xt );
rec( t := (1x1)-[{ 1*(tx1) + 1*(1xt) }]->(1x1) )

Consider B as a bialgebroid (which is actually a bialgebra) with respect to the counit \epsilon and comultiplication \Delta.

gap> AddBialgebroidStructure( B, counit, comult );
Bialgebra( Q, FreeCategory( RightQuiver( "q(1)[t:1->1]" ) ) )

Retrieve the counit of B as a functor

gap> counit := Counit( B );
Functor from Bialgebra( Q, FreeCategory( RightQuiver( "q(1)[t:1->1]" ) ) )
->
Algebra( Q, FreeCategory( RightQuiver( "*(1)[]" ) ) )

Apply the functor counit to the (unique) object 1 of B.

gap> ApplyFunctor( counit, B.1 );
<(1)>

When we apply the functor counit to the morphism t of B, we obtain the zero endomorphism of the object 1 of B^0.

gap> ApplyFunctor( counit, B.t );
(1)-[0]->(1)

Retrieve the comultiplication of B as a functor.

gap> comult := Comultiplication( B );
Functor from Bialgebra( Q, FreeCategory( RightQuiver( "q(1)[t:1->1]" ) ) )
->
Algebra( Q, FreeCategory(
RightQuiver( "qxq(1x1)[1xt:1x1->1x1,tx1:1x1->1x1]" ) ) ) / relations
gap> ApplyFunctor( comult, B.1 );
<(1x1)>

When we apply the functor comult to the morphism t of B, we obtain the endomorphism t \otimes 1 + 1 \otimes t on the object 1 \times 1 of B^2.

gap> ApplyFunctor( comult, B.t );
(1x1)-[{ 1*(tx1) + 1*(1xt) }]->(1x1)

Define the underlying record for the antipode S \colon B \to B. It sends t to -t.

gap> antipode := rec( t := -B.t );
rec( t := (1)-[-1*(t)]->(1) )

Add the antipode to B.

gap> AddAntipode( B, antipode );

Get the antipode back as a contravariant functor from B to B.

gap> antipode := Antipode( B );
Contravariant functor from
HopfAlgebra( Q, FreeCategory( RightQuiver( "q(1)[t:1->1]" ) ) )
->
HopfAlgebra( Q, FreeCategory( RightQuiver( "q(1)[t:1->1]" ) ) )
gap> ApplyFunctor( antipode, B.1 );
<(1)>
gap> ApplyFunctor( antipode, B.t );
(1)-[-1*(t)]->(1)

Let A be the category with objects the natural numbers and morphisms the matrices with coefficients in \mathbb{Q}. We use it as a skeletal model of the category of finite dimension vector spaces.

gap> A := MatrixCategory( Q );
Category of matrices over Q

Let H be the category of functors from B to A.

gap> H := FunctorCategory( B, A :
>        doctrines := [ "IsRigidSymmetricClosedMonoidalCategory" ] );
FunctorCategory( HopfAlgebra( Q, FreeCategory(
RightQuiver( "q(1)[t:1->1]" ) ) ), Category of matrices over Q )

Let z be the zero object in H.

gap> z := ZeroObject( H );
<(1)->0; (t)->0x0>
gap> z( B.1 );
<A vector space object over Q of dimension 0>
gap> z( B.t );
<A morphism in Category of matrices over Q>

Let id_z be the identity morphism on z.

gap> idz := IdentityMorphism( z );
<(1)->0x0>
gap> idz( B.1 );
<A zero, identity morphism in Category of matrices over Q>
gap> DirectSum( z, z );
<(1)->0; (t)->0x0>
gap> z = DirectSum(z,z);
true

Define a HomAlg matrix \varphi.

gap> phi := HomalgMatrix( [ 0, 1, 0,  0, 0, 1,  1, 0, 0 ], 3, 3, Q );
<A 3 x 3 matrix over an internal ring>

Finally construct a functor from B to A that sends the unique object 1 of B to the natural number 3 (representing a \mathbb{Q}-vector space of dimension 3) and the morphism t in B to the morphism induced by \varphi. We call this functor again V.

gap> V := AsObjectInFunctorCategory( H, [ 3 ], [ phi ] );
<(1)->3; (t)->3x3>

Check whether V is well-defined.

gap> IsWellDefined( V );
true

The image of the object 1 is the 3-dimensional \mathbb{Q}-vector space.

gap> V( B.1 );
<A vector space object over Q of dimension 3>

The image of the morphism t is the morphism induced by the matrix \varphi.

gap> V( B.t );
<A morphism in Category of matrices over Q>
gap> Display( V( B.t ) );
[ [  0,  1,  0 ],
  [  0,  0,  1 ],
  [  1,  0,  0 ] ]

A morphism in Category of matrices over Q

Verify that V is not zero.

gap> IsZero( V );
false

Compute the direct sum W \coloneqq V \oplus V.

gap> W := DirectSum( V, V );
<(1)->6; (t)->6x6>
gap> W( B.1 );
<A vector space object over Q of dimension 6>
gap> W( B.t );
<A morphism in Category of matrices over Q>
gap> Display( W( B.t ) );
[ [  0,  1,  0,  0,  0,  0 ],
  [  0,  0,  1,  0,  0,  0 ],
  [  1,  0,  0,  0,  0,  0 ],
  [  0,  0,  0,  0,  1,  0 ],
  [  0,  0,  0,  0,  0,  1 ],
  [  0,  0,  0,  1,  0,  0 ] ]

A morphism in Category of matrices over Q

Compute the projection \pi_1 from V \oplus V to the first summand.

gap> pi1 := ProjectionInFactorOfDirectSum( [ V, V ], 1 );
<(1)->6x3>
gap> pi1 = -pi1;
false
gap> pi1( B.1 );
<A morphism in Category of matrices over Q>
gap> Display( pi1( B.1 ) );
[ [  1,  0,  0 ],
  [  0,  1,  0 ],
  [  0,  0,  1 ],
  [  0,  0,  0 ],
  [  0,  0,  0 ],
  [  0,  0,  0 ] ]

A morphism in Category of matrices over Q
gap> IsWellDefined( pi1 );
true
gap> IsEpimorphism( pi1 );
true
gap> IsMonomorphism( pi1 );
false

Compute the kernel object of the projection of \pi_1.

gap> V1 := KernelObject( pi1 );
<(1)->3; (t)->3x3>
gap> IsWellDefined( V1 );
true
gap> V1 = V;
true

Compute the projection \pi_2 from V \oplus V to the second summand.

gap> pi2 := ProjectionInFactorOfDirectSum( [ V, V ], 2 );
<(1)->6x3>
gap> pi1 = pi2;
false

Next we consider the monoidal structure on the category of functors from B to A. First we compute the unit object of this monoidal structure.

gap> I := TensorUnit( H );
<(1)->1; (t)->1x1>
gap> I( B.1 );
<A vector space object over Q of dimension 1>
gap> I( B.t );
<A morphism in Category of matrices over Q>
gap> Display( I( B.t ) );
[ [  0 ] ]

A morphism in Category of matrices over Q

Compute the tensor product V \otimes V.

gap> VV := TensorProductOnObjects( V, V );
<(1)->9; (t)->9x9>
gap> VV( B.1 );
<A vector space object over Q of dimension 9>
gap> VV( B.t );
<A morphism in Category of matrices over Q>
gap> Display( VV( B.t ) );
[ [  0,  1,  0,  1,  0,  0,  0,  0,  0 ],
  [  0,  0,  1,  0,  1,  0,  0,  0,  0 ],
  [  1,  0,  0,  0,  0,  1,  0,  0,  0 ],
  [  0,  0,  0,  0,  1,  0,  1,  0,  0 ],
  [  0,  0,  0,  0,  0,  1,  0,  1,  0 ],
  [  0,  0,  0,  1,  0,  0,  0,  0,  1 ],
  [  1,  0,  0,  0,  0,  0,  0,  1,  0 ],
  [  0,  1,  0,  0,  0,  0,  0,  0,  1 ],
  [  0,  0,  1,  0,  0,  0,  1,  0,  0 ] ]

A morphism in Category of matrices over Q

Compute the dual V^{\ast} of V.

gap> Vs := DualOnObjects( V );
<(1)->3; (t)->3x3>
gap> Vs( B.1 );
<A vector space object over Q of dimension 3>
gap> Vs( B.t );
<A morphism in Category of matrices over Q>
gap> Display( Vs( B.t ) );
[ [   0,   0,  -1 ],
  [  -1,   0,   0 ],
  [   0,  -1,   0 ] ]

A morphism in Category of matrices over Q

Compute the morphism V \to V^{\ast\ast}.

gap> epsilon := MorphismToBidual( V );
<(1)->3x3>

Clearly the source of this morphism is (isomorphic to) V.

gap> Source( epsilon ) = V;
true

But its range is also isomorphic to V.

gap> Range( epsilon ) = V;
true

Compute the internal hom object \operatorname{Hom}(V,V).

gap> EndV := InternalHom( V, V );
<(1)->9; (t)->9x9>

Compute V^{\ast} \otimes V.

gap> VsV := TensorProductOnObjects( Vs, V );
<(1)->9; (t)->9x9>

Compute V \otimes V^{\ast}.

gap> VVs := TensorProductOnObjects( V, Vs );
<(1)->9; (t)->9x9>

We have \operatorname{Hom}(V,V) = V^{\ast} \otimes V, but not \operatorname{Hom}(V,V) = V \otimes V^{\ast}.

gap> EndV = VsV;
true
gap> EndV = VVs;
false

Construct an isomorphism V^{\ast} \otimes V \to V \otimes V^{\ast}.

gap> beta := Braiding( Vs, V );
<(1)->9x9>
gap> Source( beta ) = VsV;
true
gap> Range( beta ) = VVs;
true

1.5-3 The category of equivariant maps as a category of functors
gap> q := RightQuiver( "q(2)[a:1->1,b:1->2,c:2->2]" );
q(2)[a:1->1,b:1->2,c:2->2]
gap> C3C3 := Category( q, [ [ q.a^3, q.1 ], [ q.ab, q.bc ], [ q.c^3, q.2 ] ] );
FreeCategory( RightQuiver(
  "q(2)[a:1->1,b:1->2,c:2->2]" ) ) / [ a*a*a = 1, a*b = b*c, c*c*c = 2 ]
gap> GF3 := HomalgRingOfIntegers( 3 );
GF(3)
gap> PushOptions( rec( range_of_HomStructure := MatrixCategory( GF3 ) ) );
gap> A := GF3[C3C3];
Algebroid( GF(3), FreeCategory(
RightQuiver( "q(2)[a:1->1,b:1->2,c:2->2]" ) ) ) / relations
gap> PopOptions( );

A representation of the category C3C3 is another way to encode a module homomorphism between two modules over the cyclic group C_3 of order 3: The vector space underlying the first module is the given by the value of (1). The action of C_3 on the first module is given by the value of (a). The vector space underlying the second module is the given by the value of (2). The action on the second module is given by the value of (c). The above relation of the quiver states that the value of (b) is a module homomorphism from the first to the second C_3-module. Now we add the bialgebroid structure:

gap> counit := rec( a := 1, b := 1, c := 1 );
rec( a := 1, b := 1, c := 1 )
gap> A2 := A^2;
Algebroid( GF(3), FreeCategory(
RightQuiver( "qxq(1x1,1x2,2x1,2x2)[1xa:1x1->1x1,1xb:1x1->1x2,1xc:1x2->1x2,
2xa:2x1->2x1,2xb:2x1->2x2,2xc:2x2->2x2,ax1:1x1->1x1,ax2:1x2->1x2,
bx1:1x1->2x1,bx2:1x2->2x2,cx1:2x1->2x1,cx2:2x2->2x2]" ) ) ) / relations
gap> PreCompose( A2.ax1, A2.1xa ) = PreCompose( A2.1xa, A2.ax1 );
true
gap> PreCompose( A2.bx1, A2.2xb ) = PreCompose( A2.1xb, A2.bx2 );
true
gap> PreCompose( A2.cx2, A2.2xc ) = PreCompose( A2.2xc, A2.cx2 );
true
gap> comult := rec( a := PreCompose( A2.ax1, A2.1xa ),
>                b := PreCompose( A2.1xb, A2.bx2 ),
>                c := PreCompose( A2.cx2, A2.2xc ) );
rec( a := (1x1)-[{ Z(3)^0*(1xa*ax1) }]->(1x1),
     b := (1x1)-[{ Z(3)^0*(1xb*bx2) }]->(2x2),
     c := (2x2)-[{ Z(3)^0*(2xc*cx2) }]->(2x2) )
gap> AddBialgebroidStructure( A, counit, comult );
Bialgebroid( GF(3), FreeCategory(
RightQuiver( "q(2)[a:1->1,b:1->2,c:2->2]" ) ) ) / relations
gap> counit := Counit( A );
Functor from
Bialgebroid( GF(3), FreeCategory(
RightQuiver( "q(2)[a:1->1,b:1->2,c:2->2]" ) ) ) / relations
->
Algebra( GF(3), FreeCategory( RightQuiver( "*(1)[]" ) ) )
gap> comult := Comultiplication( A );
Functor from
Bialgebroid( GF(3), FreeCategory(
RightQuiver( "q(2)[a:1->1,b:1->2,c:2->2]" ) ) ) / relations
->
Algebroid( GF(3), FreeCategory(
RightQuiver( "qxq(1x1,1x2,2x1,2x2)[1xa:1x1->1x1,1xb:1x1->1x2,1xc:1x2->1x2,
2xa:2x1->2x1,2xb:2x1->2x2,2xc:2x2->2x2,ax1:1x1->1x1,ax2:1x2->1x2,
bx1:1x1->2x1,bx2:1x2->2x2,cx1:2x1->2x1,cx2:2x2->2x2]" ) ) ) / relations
gap> kmat := MatrixCategory( GF3 );
Category of matrices over GF(3)
gap> FunCat := FunctorCategory( A, kmat );
FunctorCategory( Bialgebroid( GF(3), FreeCategory(
RightQuiver( "q(2)[a:1->1,b:1->2,c:2->2]" ) ) ) / relations,
Category of matrices over GF(3) )
gap> CommutativeRingOfLinearCategory( FunCat );
GF(3)
gap> zero := ZeroObject( FunCat );
<(1)->0, (2)->0; (a)->0x0, (b)->0x0, (c)->0x0>
gap> Display( zero );
Image of <(1)>:
A vector space object over GF(3) of dimension 0

Image of <(2)>:
A vector space object over GF(3) of dimension 0

Image of (1)-[{ Z(3)^0*(a) }]->(1):
(an empty 0 x 0 matrix)

A morphism in Category of matrices over GF(3)

Image of (1)-[{ Z(3)^0*(b) }]->(2):
(an empty 0 x 0 matrix)

A morphism in Category of matrices over GF(3)

Image of (2)-[{ Z(3)^0*(c) }]->(2):
(an empty 0 x 0 matrix)

A morphism in Category of matrices over GF(3)

An object in FunctorCategory( Bialgebroid( GF(3), FreeCategory(
RightQuiver( "q(2)[a:1->1,b:1->2,c:2->2]" ) ) ) / relations,
Category of matrices over GF(3) ) given by the above data
gap> const := TensorUnit( FunCat );
<(1)->1, (2)->1; (a)->1x1, (b)->1x1, (c)->1x1>
gap> Display( const );
Image of <(1)>:
A vector space object over GF(3) of dimension 1

Image of <(2)>:
A vector space object over GF(3) of dimension 1

Image of (1)-[{ Z(3)^0*(a) }]->(1):
 1

A morphism in Category of matrices over GF(3)

Image of (1)-[{ Z(3)^0*(b) }]->(2):
 1

A morphism in Category of matrices over GF(3)

Image of (2)-[{ Z(3)^0*(c) }]->(2):
 1

A morphism in Category of matrices over GF(3)

An object in FunctorCategory( Bialgebroid( GF(3), FreeCategory(
RightQuiver( "q(2)[a:1->1,b:1->2,c:2->2]" ) ) ) / relations,
Category of matrices over GF(3) ) given by the above data
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]];;
gap> e := [[0,1,0,0],[0,0,1,0],[0,0,0,0],[0,1,0,1],[0,0,1,0]];;
gap> f := [[1,1,0,0],[0,1,1,0],[0,0,1,0],[0,0,0,1]];;
gap> nine := AsObjectInFunctorCategory( FunCat, [ 5, 4 ], [ d, e, f ] );
<(1)->5, (2)->4; (a)->5x5, (b)->5x4, (c)->4x4>
gap> Display( nine );
Image of <(1)>:
A vector space object over GF(3) of dimension 5

Image of <(2)>:
A vector space object over GF(3) of dimension 4

Image of (1)-[{ Z(3)^0*(a) }]->(1):
 1 1 . . .
 . 1 1 . .
 . . 1 . .
 . . . 1 1
 . . . . 1

A morphism in Category of matrices over GF(3)

Image of (1)-[{ Z(3)^0*(b) }]->(2):
 . 1 . .
 . . 1 .
 . . . .
 . 1 . 1
 . . 1 .

A morphism in Category of matrices over GF(3)

Image of (2)-[{ Z(3)^0*(c) }]->(2):
 1 1 . .
 . 1 1 .
 . . 1 .
 . . . 1

A morphism in Category of matrices over GF(3)

An object in FunctorCategory( Bialgebroid( GF(3), FreeCategory(
RightQuiver( "q(2)[a:1->1,b:1->2,c:2->2]" ) ) ) / relations,
Category of matrices over GF(3) ) given by the above data
gap> nine(A.1);
<A vector space object over GF(3) of dimension 5>
gap> nine(A.2);
<A vector space object over GF(3) of dimension 4>
gap> nine(A.b);
<A morphism in Category of matrices over GF(3)>
gap> Display( nine(A.b) );
 . 1 . .
 . . 1 .
 . . . .
 . 1 . 1
 . . 1 .

A morphism in Category of matrices over GF(3)
gap> IsWellDefined( nine );
true
gap> fortyone := TensorProductOnObjects( nine, nine );
<(1)->25, (2)->16; (a)->25x25, (b)->25x16, (c)->16x16>
gap> IsWellDefined( fortyone );
true
gap> fortyone( A.1 );
<A vector space object over GF(3) of dimension 25>
gap> fortyone( A.2 );
<A vector space object over GF(3) of dimension 16>
gap> fortyone(A.a) = TensorProductOnMorphisms( nine(A.a), nine(A.a) );
true
gap> fortyone(A.b) = TensorProductOnMorphisms( nine(A.b), nine(A.b) );
true
gap> fortyone(A.c) = TensorProductOnMorphisms( nine(A.c), nine(A.c) );
true
 [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 Ind

generated by GAPDoc2HTML