‣ 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.
‣ 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.
‣ 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.
‣ Source( Hom ) | ( attribute ) |
Returns: a CAP category
The source category of the functor category Hom.
‣ Target( Hom ) | ( attribute ) |
Returns: a CAP category
The target category of the functor category Hom.
‣ Source( F ) | ( attribute ) |
Returns: a CAP category
The source of the functor underlying functor object F.
‣ Target( 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.
‣ AddAdditionalMonoidalStructureToFunctorCategory( Hom, B, D ) | ( operation ) |
Installs optional monoidal structure on the functor category Hom depending on the source category B and target category D.
‣ 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 ); 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
‣ 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 ) | ( category ) |
Returns: true or false
The GAP category of Hom-categories of functors between two fixed categories.
‣ IsCellInFunctorCategory( cell ) | ( category ) |
Returns: true or false
The GAP category of cells in a Hom-category of functors between two fixed categories.
‣ IsObjectInFunctorCategory( obj ) | ( category ) |
Returns: true or false
The GAP category of objects in a Hom-category of functors between two fixed categories.
‣ IsMorphismInFunctorCategory( mor ) | ( category ) |
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] 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
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
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
generated by GAPDoc2HTML