Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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, D )( operation )
‣ FunctorCategory( B, k )( operation )
‣ FunctorCategory( B )( operation )
‣ Hom( B, D )( operation )
‣ Hom( B, k )( operation )

Returns: a CAP category

Construct the category FunctorCategory( B, D )= Hom( B, D ) of functors from the small category B to the category D 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 D into an object in the category of functors Hom := Hom( B, D ). 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:= CommutativeSemiringOfLinearCategory( 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, D ), where B := Source( F ) = Source( G ) and C := Target( F ) = Target( 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 Hom.

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

Returns: a CAP category

The target category of the functor category Hom.

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

Returns: a CAP category

The source of the functor underlying functor object F.

1.2-4 Target
‣ Target( 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 AddAdditionalMonoidalStructureToFunctorCategory
‣ AddAdditionalMonoidalStructureToFunctorCategory( Hom, B, D )( operation )

Installs optional monoidal structure on the functor category Hom depending on the source category B and target category D.

1.2-7 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-8 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-9 UnderlyingCapTwoCategoryCell
‣ UnderlyingCapTwoCategoryCell( F_or_eta )( attribute )

Returns: a CAP functor or natural transformation

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

Returns: a CAP functor

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

Returns: a CAP functor

1.2-12 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-13 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-14 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 );
PathCategory( FinQuiver(
  "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]" ) )
/ [ s⋅id = id(C0), t⋅id = id(C0), ps⋅is = id(C1), ... ]
gap> DefiningRelations( Delta2 );
[ [ s⋅id:(C0) → (C0), id(C0):(C0) → (C0) ],
  [ t⋅id:(C0) → (C0), id(C0):(C0) → (C0) ],
  [ ps⋅is:(C1) → (C1), id(C1):(C1) → (C1) ],
  [ pt⋅it:(C1) → (C1), id(C1):(C1) → (C1) ],
  [ is⋅id:(C2) → (C0), it⋅id:(C2) → (C0) ],
  [ pt⋅is:(C1) → (C1), id⋅t:(C1) → (C1) ],
  [ ps⋅it:(C1) → (C1), id⋅s:(C1) → (C1) ],
  [ s⋅pt:(C0) → (C2), t⋅ps:(C0) → (C2) ],
  [ s⋅mu:(C0) → (C2), s⋅ps:(C0) → (C2) ],
  [ t⋅mu:(C0) → (C2), t⋅pt:(C0) → (C2) ],
  [ mu⋅is:(C1) → (C1), id(C1):(C1) → (C1) ],
  [ mu⋅it:(C1) → (C1), id(C1):(C1) → (C1) ] ]
gap> Size( Delta2 );
31
gap> Ypt := YonedaProjection( Delta2 );
<An epimorphism in FunctorCategory( PathCategory( FinQuiver(
  "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]" ) )
/ [ s⋅id = id(C0), t⋅id = id(C0), ps⋅is = id(C1), ... ],
 SkeletalFinSets )>
gap> IsWellDefined( Ypt );
true
gap> Ymu := YonedaComposition( Delta2 );
<An epimorphism in FunctorCategory( PathCategory( FinQuiver(
   "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]" ) )
/ [ s⋅id = id(C0), t⋅id = id(C0), ps⋅is = id(C1), ... ],
 SkeletalFinSets )>
gap> IsWellDefined( Ymu );
true
gap> Ys := YonedaFibration( Delta2 );
<A morphism in FunctorCategory( PathCategory( FinQuiver(
   "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]" ) )
/ [ s⋅id = id(C0), t⋅id = id(C0), ps⋅is = id(C1), ... ],
 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( PathCategory( FinQuiver(
  "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]" ) )
/ [ s⋅id = id(C0), t⋅id = id(C0), ps⋅is = id(C1), ... ],
SkeletalFinSets ) given by the above data
gap> # @drop_example_in_Julia

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 )( category )

Returns: true or false

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

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

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 )( category )

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 )( category )

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]
gap> # @drop_example_in_Julia

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]" ) ) )
gap> # @drop_example_in_Julia

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) ]
gap> # @drop_example_in_Julia

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 )
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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)
gap> # @drop_example_in_Julia

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)
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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 )
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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>
gap> # @drop_example_in_Julia

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>
gap> # @drop_example_in_Julia

This functor is indeed well defined.

gap> IsWellDefined( V );
true
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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>
gap> # @drop_example_in_Julia

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> )
gap> # @drop_example_in_Julia

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>
gap> # @drop_example_in_Julia

We check that \eta is well defined.

gap> IsWellDefined( eta );
true
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

We study some of the properties of \eta.

gap> IsEpimorphism( eta );
true
gap> IsMonomorphism( eta );
false
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

It turns out that I is equal to K.

gap> I = K;
true
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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> Target( 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> Target( beta ) = UUs;
true
gap> # @drop_example_in_Julia

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]
gap> # @drop_example_in_Julia

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]" ) ) )
gap> # @drop_example_in_Julia

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 )
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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) )
gap> # @drop_example_in_Julia

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]" ) ) )
gap> # @drop_example_in_Julia

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)[]" ) ) )
gap> # @drop_example_in_Julia

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

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

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)
gap> # @drop_example_in_Julia

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)>
gap> # @drop_example_in_Julia

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)
gap> # @drop_example_in_Julia

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) )
gap> # @drop_example_in_Julia

Add the antipode to B.

gap> AddAntipode( B, antipode );
gap> # @drop_example_in_Julia

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)
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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 )
gap> # @drop_example_in_Julia

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>
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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>
gap> # @drop_example_in_Julia

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>
gap> # @drop_example_in_Julia

Check whether V is well-defined.

gap> IsWellDefined( V );
true
gap> # @drop_example_in_Julia

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>
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

Verify that V is not zero.

gap> IsZero( V );
false
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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
gap> # @drop_example_in_Julia

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

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

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

gap> Source( epsilon ) = V;
true
gap> # @drop_example_in_Julia

But its range is also isomorphic to V.

gap> Target( epsilon ) = V;
true
gap> # @drop_example_in_Julia

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

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

Compute V^{\ast} \otimes V.

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

Compute V \otimes V^{\ast}.

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

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
gap> # @drop_example_in_Julia

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> Target( beta ) = VVs;
true
gap> # @drop_example_in_Julia

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( );
gap> # @drop_example_in_Julia

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> # @drop_example_in_Julia
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> CommutativeSemiringOfLinearCategory( 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
gap> # @drop_example_in_Julia
 [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 Ind

generated by GAPDoc2HTML