‣ 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.
‣ 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.
‣ 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.
‣ Source ( Hom ) | ( attribute ) |
Returns: a CAP category
The source category of the functor category cat.
‣ Range ( Hom ) | ( attribute ) |
Returns: a CAP category
The range category of the functor category cat.
‣ Source ( F ) | ( attribute ) |
Returns: a CAP category
The source of the functor underlying functor object F.
‣ Range ( F ) | ( attribute ) |
Returns: a CAP category
The target of the functor underlying the functor object F.
‣ OppositeOfSource ( Hom ) | ( attribute ) |
Returns: a CAP category
The opposite of the source category of the functor category Hom.
‣ 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.
‣ 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.
‣ UnderlyingCapTwoCategoryCell ( F_or_eta ) | ( attribute ) |
Returns: a CAP functor or natural transformation
‣ YonedaEmbeddingInFunctorCategory ( B ) | ( attribute ) |
Returns: a CAP functor
‣ YonedaEmbeddingOfOppositeOfSourceCategory ( Hom ) | ( attribute ) |
Returns: a CAP functor
‣ 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}.
‣ 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).
‣ 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
‣ 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.
‣ 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.
‣ ApplyObjectInFunctorCategoryToObject ( F, obj ) | ( operation ) |
Returns: a CAP object
Apply the functor F to the object obj. The shorthand is F(obj).
‣ ApplyObjectInFunctorCategoryToMorphism ( F, mor ) | ( operation ) |
Returns: a CAP morphism
Apply the functor F to the morphism mor. The shorthand is F(mor).
‣ ApplyMorphismInFunctorCategoryToObject ( eta, obj ) | ( operation ) |
Returns: a CAP morphism
Apply the natural transformation eta to the object obj. The shorthand is eta(o).
‣ IsFunctorCategory ( category ) | ( filter ) |
Returns: true
or false
The GAP category of Hom-categories of functors between two fixed categories.
‣ IsCellInFunctorCategory ( cell ) | ( filter ) |
Returns: true
or false
The GAP category of cells in a Hom-category of functors between two fixed categories.
‣ IsObjectInFunctorCategory ( obj ) | ( filter ) |
Returns: true
or false
The GAP category of objects in a Hom-category of functors between two fixed categories.
‣ IsMorphismInFunctorCategory ( mor ) | ( filter ) |
Returns: true
or false
The GAP category of morphisms in a Hom-category of functors between two fixed categories.
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
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
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
generated by GAPDoc2HTML