Let A be an algebroid over a commutative ring k, given by finite data tables, and let I be the two-sided ideal generated by morphisms \alpha_i:t_i\to u_i, where t_i and u_i are objects of A. The aim of this construction is to realize the quotient algebroid A/I as a quotient of a presheaf associated with A. More precisely, the ideal I gives rise to a subpresheaf F_I\subseteq F_A, and the Hom-bifunctor of A/I is realized as the quotient presheaf F_A/F_I.
More precisely, regard the Hom-bifunctor of A as the presheaf
F_A \in \mathrm{PSh}(A^{\mathrm{op}}\otimes_k A)
determined by its values on the objects and generating morphisms of A^{\mathrm{op}}\otimes_k A: For two objects u and t of A, we have
F_A(u^{\mathrm{op}}\otimes t)=\operatorname{Hom}_A(t,u).
For objects s,t,u,v of A and morphisms f:s\to t and g:u\to v, the elementary tensor g^{\mathrm{op}}\otimes f:v^{\mathrm{op}}\otimes s\to u^{\mathrm{op}}\otimes t is mapped contravariantly to
\operatorname{Hom}_A(t,u)\longrightarrow\operatorname{Hom}_A(s,v), \qquad h\longmapsto g\circ h\circ f.
The left and right actions commute by associativity, as displayed in the following diagram. Thus F_A is A, through its Hom-modules and composition maps, regarded as a module over the enveloping algebroid A^{\mathrm{op}}\otimes_k A.
For an object x of A^{\mathrm{op}}\otimes_k A, let P_x denote its image under the Yoneda embedding. Such representable presheaves are projective objects. By the Yoneda lemma, every relation \alpha_i determines a morphism
\lambda_{\alpha_i}:P_{u_i^{\mathrm{op}}\otimes t_i}\longrightarrow F_A.
The family of morphisms \lambda_{\alpha_i} induces a morphism from the direct sum of their source objects,
\tau:\bigoplus_i P_{u_i^{\mathrm{op}}\otimes t_i}\longrightarrow F_A.
Define the ideal presheaf F_I and the quotient presheaf F_{A/I} by
F_I:=\operatorname{im}(\tau),\qquad F_{A/I}:=F_A/F_I=\operatorname{coker}(\tau).
For x=v^{\mathrm{op}}\otimes s, the quotient sequence and its evaluation at x fit into the following commutative diagram with exact rows. At v^{\mathrm{op}}\otimes s, the value of F_I is precisely the submodule I(s,v)\subseteq\operatorname{Hom}_A(s,v) spanned by all compatible two-sided composites of the \alpha_i. Hence
F_{A/I}(v^{\mathrm{op}}\otimes s) =\operatorname{Hom}_A(s,v)/I(s,v) =\operatorname{Hom}_{A/I}(s,v).
Thus F_{A/I} is the Hom-bifunctor of the quotient algebroid, regarded as a presheaf on A^{\mathrm{op}}\otimes_k A via the quotient functor A\to A/I.
This description is the mathematical basis of the method QuotientCategory for algebroids defined by data tables in the package FpLinearCategories. Indeed, for a morphism m:s\to v in A, set x:=v^{\mathrm{op}}\otimes s and let \pi:F_A\to F_{A/I} be the cokernel projection. Membership in the ideal is characterized by
m\in I(s,v) \quad\Longleftrightarrow\quad \lambda_m(x)\text{ factors through }\tau(x) \quad\Longleftrightarrow\quad \pi(x)\circ\lambda_m(x)=0.
When these equivalent conditions hold, the factorization is represented by the dashed lift in the following commutative diagram. Since composition in A is encoded by finite matrices, this criterion is decided by linear algebra. Over a field, the quotient Hom-modules are computed as cokernels. Over a more general computable ring, membership is decided by a lift through \tau, and quotient Hom-modules are represented in the corresponding Freyd category. Thus taking a further quotient of an algebroid already given by data tables is computed directly by linear algebra, without computing a noncommutative Groebner basis or applying a path-reduction algorithm. Constructing those data tables from an earlier path presentation may, of course, have required a Groebner basis.
‣ AlgebroidAsObjectInPreSheavesCategory( A ) | ( attribute ) |
Returns: a CAP category object
The argument is an algebroid A over a commutative ring k, defined by data tables. The output is the presheaf F_A defined in the introduction: the Hom-bifunctor of A, regarded as a module over its enveloping algebroid A^{\mathrm{op}}\otimes_k A.
‣ AssociatedMorphismIntoAlgebroidAsObjectInPreSheavesCategory( alpha ) | ( attribute ) |
Returns: a CAP category morphism
The argument is a morphism \alpha:t\to u in an algebroid A over a commutative ring k, where t and u are objects of A. The output is the morphism of presheaves
\lambda_\alpha:P_{u^{\mathrm{op}}\otimes t}\longrightarrow F_A
corresponding to \alpha under the Yoneda isomorphism
\operatorname{Hom}_A(t,u)=F_A(u^{\mathrm{op}}\otimes t) \cong\operatorname{Hom}_{\mathrm{PSh}(A^{\mathrm{op}}\otimes_k A)} (P_{u^{\mathrm{op}}\otimes t},F_A).
Here P_{u^{\mathrm{op}}\otimes t} is the representable presheaf given by the Yoneda embedding. Pointwise, the image of \lambda_\alpha at v^{\mathrm{op}}\otimes s consists of the linear combinations of all compatible composites g\circ\alpha\circ f:s\to v, where s,v are objects and f,g are morphisms in A. This is exactly the (s,v)-component of the two-sided ideal generated by \alpha.
gap> LoadPackage( "FunctorCategories", false ); true gap> q := FinQuiver( "q(0,1,2,3)[a:0->1,b:1->3,c:0->2,d:2->3,e:3->3]" ); FinQuiver( "q(0,1,2,3)[a:0→1,b:1→3,c:0→2,d:2→3,e:3→3]" ) gap> k := HomalgFieldOfRationals(); Q gap> C := PathCategory( q ); PathCategory( FinQuiver( "q(0,1,2,3)[a:0→1,b:1→3,c:0→2,d:2→3,e:3→3]" ) ) gap> kC := k[C]; Q-LinearClosure( PathCategory( FinQuiver( "q(0,1,2,3)[a:0→1,b:1→3,c:0→2, d:2→3,e:3→3]" ) ) ) gap> quo_kC := kC / [ kC.e^3 ]; Q-LinearClosure( PathCategory( FinQuiver( "q(0,1,2,3)[a:0→1,b:1→3,c:0→2, d:2→3,e:3→3]" ) ) ) / [ 1*e^3 ] gap> A := AlgebroidFromDataTables( quo_kC ); Q-algebroid( {0,1,2,3}[a:0→1,b:1→3,c:0→2,d:2→3,e:3→3] ) defined by 4 objects and 5 generating morphisms gap> e := AssociatedMorphismIntoAlgebroidAsObjectInPreSheavesCategory( A.("e") );; gap> IsWellDefined( e ); true gap> qA := QuotientCategory( A, [ A.ab - A.cd, 2*A.be ] ); QuotientCategory( Q-algebroid( {0,1,2,3}[a:0→1,b:1→3,c:0→2,d:2→3,e:3→3] ) defined by 4 objects and 5 generating morphisms, 2-sided ideal generated by 2 morphisms ) gap> qA.0; <(0)> gap> RangeCategoryOfHomomorphismStructure( qA ); Rows( Q ) gap> IsZero( qA.cde ); true gap> f := RandomMorphism( qA, 20 );; gap> 1/2 * HomStructure( Source( f ), Target( f ), 2 * HomStructure( f ) ) = f; true gap> qA := QuotientCategory( A, [ A.id_0, A.id_1, A.id_2 ] ); QuotientCategory( Q-algebroid( {0,1,2,3}[a:0→1,b:1→3,c:0→2,d:2→3,e:3→3] ) defined by 4 objects and 5 generating morphisms, 2-sided ideal generated by 3 morphisms ) gap> ForAll( [ qA.0, qA.1, qA.2 ], IsZeroForObjects ); true gap> IsZero( qA.3 ); false gap> D := AlgebroidFromDataTables( qA ); Q-algebroid( {3}[e:3→3] ) defined by 1 object and 1 generating morphism gap> BasisOfExternalHom( D.3, D.3 ); [ <1*id(3):(3) → (3)>, <1*e:(3) → (3)>, <1*e^2:(3) → (3)> ] gap> data_tables := DataTablesOfLinearCategory( quo_kC );; gap> data_tables_Z := ShallowCopy( data_tables );; gap> data_tables_Z[1] := HomalgRingOfIntegers();; gap> B := AlgebroidFromDataTables( data_tables_Z ); Z-algebroid( {0,1,2,3}[a:0→1,b:1→3,c:0→2,d:2→3,e:3→3] ) defined by 4 objects and 5 generating morphisms gap> RangeCategoryOfHomomorphismStructure( B ); Rows( Z ) gap> qB := QuotientCategory( B, [ B.ab - B.cd, 2*B.be ] ); QuotientCategory( Z-algebroid( {0,1,2,3}[a:0→1,b:1→3,c:0→2,d:2→3,e:3→3] ) defined by 4 objects and 5 generating morphisms, 2-sided ideal generated by 2 morphisms ) gap> RangeCategoryOfHomomorphismStructure( qB ); Freyd( Rows( Z ) ) gap> IsZero( qB.cde ); false gap> IsZero( 2*qB.cde ); true gap> add_qB := AdditiveClosure( qB ); AdditiveClosure( QuotientCategory( Z-algebroid( {0,1,2,3}[a:0→1,b:1→3, c:0→2,d:2→3,e:3→3] ) defined by 4 objects and 5 generating morphisms, 2-sided ideal generated by 2 morphisms ) ) gap> T := RandomObject( add_qB, [[10],[1]] );; gap> u := RandomMorphism( T, T, 5 );; gap> v := RandomMorphism( T, T, 5 );; gap> w := RandomMorphism( T, T, 5 );; gap> HomStructure( PreCompose( [ u, v, w ] ) ) > = PreCompose( HomStructure( v ), HomStructure( u, w ) ); true gap> HomStructure( T, T, 2 * HomStructure( u ) ) = 2 * u; true gap> # @drop_example_in_Julia
gap> LoadPackage( "FunctorCategories", false ); true gap> q := FinQuiver( "q(0,1,2)[x:0->1,y:1->2,z:0->2]" ); FinQuiver( "q(0,1,2)[x:0→1,y:1→2,z:0→2]" ) gap> C := PathCategory( q ); PathCategory( FinQuiver( "q(0,1,2)[x:0→1,y:1→2,z:0→2]" ) ) gap> k := HomalgFieldOfRationals( ); Q gap> kC := k[C]; Q-LinearClosure( PathCategory( FinQuiver( "q(0,1,2)[x:0→1, y:1→2,z:0→2]" ) ) ) gap> A := kC / [ kC.xy - kC.z ]; Q-LinearClosure( PathCategory( FinQuiver( "q(0,1,2)[x:0→1, y:1→2,z:0→2]" ) ) ) / [ 1*x⋅y + (-1)*z ] gap> B := AlgebroidFromDataTables( A ); Q-algebroid( {0,1,2}[x:0→1,y:1→2,z:0→2] ) defined by 3 objects and 3 generating morphisms gap> IsAdmissibleAlgebroid( B ); false gap> q := FinQuiver( "q(o)[x:o->o,y:o->o]" ); FinQuiver( "q(o)[x:o→o,y:o→o]" ) gap> C := PathCategory( q ); PathCategory( FinQuiver( "q(o)[x:o→o,y:o→o]" ) ) gap> kC := k[C]; Q-LinearClosure( PathCategory( FinQuiver( "q(o)[x:o→o,y:o→o]" ) ) ) gap> A := kC / [ kC.xy - kC.yx, kC.x^3, kC.y^3 ]; Q-LinearClosure( PathCategory( FinQuiver( "q(o)[x:o→o,y:o→o]" ) ) ) / [ (-1)*y⋅x + 1*x⋅y, 1*x^3, 1*y^3 ] gap> B := AlgebroidFromDataTables( A ); Q-algebroid( {o}[x:o→o,y:o→o] ) defined by 1 object and 2 generating morphisms gap> IsAdmissibleAlgebroid( B ); true gap> A := kC / [ kC.xy - kC.yx, kC.x^3 - kC.x, kC.y^3 ]; Q-LinearClosure( PathCategory( FinQuiver( "q(o)[x:o→o,y:o→o]" ) ) ) / [ (-1)*y⋅x + 1*x⋅y, 1*x^3 + (-1)*x, 1*y^3 ] gap> B := AlgebroidFromDataTables( A ); Q-algebroid( {o}[x:o→o,y:o→o] ) defined by 1 object and 2 generating morphisms gap> IsAdmissibleAlgebroid( B ); false gap> # @drop_example_in_Julia
generated by GAPDoc2HTML