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

12 Examples and Tests
 12.1 Monoidal structure of AdditiveClosure
 12.2 Basics based on category of rows
 12.3 Basics based on category of columns
 12.4 Homomorphism structure
 12.5 Opposite( CategoryOfRow ) as CategoryOfColumns
 12.6 Tests
 12.7 Rings as Ab-categories

12 Examples and Tests

12.1 Monoidal structure of AdditiveClosure

gap> LoadPackage( "AdditiveClosuresForCAP", false );
true
gap> Q := HomalgFieldOfRationals();;
gap> R := RingAsCategory( Q );
RingAsCategory( Q )
gap> A := AdditiveClosure( R );
AdditiveClosure( RingAsCategory( Q ) )
gap> u := TensorUnit( A );
<An object in AdditiveClosure( RingAsCategory( Q ) )\
 defined by 1 underlying objects>
gap> mor1 := [ [ 1 / R, 2 / R ] ] / A;
<A morphism in AdditiveClosure( RingAsCategory( Q ) )\
 defined by a 1 x 2 matrix of underlying morphisms>
gap> mor2 := [ [ 3 / R, 4 / R ] ] / A;
<A morphism in AdditiveClosure( RingAsCategory( Q ) )\
 defined by a 1 x 2 matrix of underlying morphisms>
gap> T := TensorProduct( mor1, mor2 );
<A morphism in AdditiveClosure( RingAsCategory( Q ) )\
 defined by a 1 x 4 matrix of underlying morphisms>
gap> Display( T );
A 1 x 4 matrix with entries in RingAsCategory( Q )

[1,1]: <3>
[1,2]: <4>
[1,3]: <6>
[1,4]: <8>
gap> Display( Range( T ) );
A formal direct sum consisting of 4 objects.
*
*
*
*
gap> LoadPackage( "AdditiveClosuresForCAP", false );
true
gap> T := TerminalCategoryWithMultipleObjects( );
TerminalCategoryWithMultipleObjects( )
gap> A := "A" / T;
<A zero object in TerminalCategoryWithMultipleObjects( )>
gap> B := "B" / T;
<A zero object in TerminalCategoryWithMultipleObjects( )>
gap> AT := AdditiveClosure( T );
AdditiveClosure( TerminalCategoryWithMultipleObjects( ) )
gap> ABAA := [ A, B, A, A ] / AT;
<An object in AdditiveClosure( TerminalCategoryWithMultipleObjects( ) )\
 defined by 4 underlying objects>
gap> BAB := [ B, A, B ] / AT;
<An object in AdditiveClosure( TerminalCategoryWithMultipleObjects( ) )\
 defined by 3 underlying objects>
gap> AB := [ A, B ] / AT;
<An object in AdditiveClosure( TerminalCategoryWithMultipleObjects( ) )\
 defined by 2 underlying objects>
gap> mor_AB := MorphismConstructor( A, "A -> B", B );
<A zero, isomorphism in TerminalCategoryWithMultipleObjects( )>
gap> mor_BA := MorphismConstructor( B, "B -> A", A );
<A zero, isomorphism in TerminalCategoryWithMultipleObjects( )>
gap> id_A := IdentityMorphism( A );
<A zero, identity morphism in TerminalCategoryWithMultipleObjects( )>
gap> id_B := IdentityMorphism( B );
<A zero, identity morphism in TerminalCategoryWithMultipleObjects( )>
gap> alpha := MorphismConstructor( ABAA,
>   [ [ mor_AB, id_A, mor_AB ],
>     [ id_B, mor_BA, id_B ],
>     [ mor_AB, id_A, mor_AB ],
>     [ mor_AB, id_A, mor_AB ] ],
>     BAB );
<A morphism in AdditiveClosure( TerminalCategoryWithMultipleObjects( ) )\
 defined by a 4 x 3 matrix of underlying morphisms>
gap> IsWellDefined( alpha );
true
gap> alpha2 := TensorProduct( alpha, alpha );
<A morphism in AdditiveClosure( TerminalCategoryWithMultipleObjects( ) )\
 defined by a 16 x 9 matrix of underlying morphisms>
gap> IsWellDefined( alpha2 );
true
gap> IsIsomorphism( alpha2 );
true
gap> left := LeftUnitor( ABAA );
<A morphism in AdditiveClosure( TerminalCategoryWithMultipleObjects( ) )\
 defined by a 4 x 4 matrix of underlying morphisms>
gap> IsWellDefined( left );
true
gap> left_inv := LeftUnitorInverse( ABAA );
<A morphism in AdditiveClosure( TerminalCategoryWithMultipleObjects( ) )\
 defined by a 4 x 4 matrix of underlying morphisms>
gap> PreCompose( left, left_inv ) = IdentityMorphism( Source( left ) );
true
gap> PreCompose( left_inv, left ) = IdentityMorphism( Range( left ) );
true
gap> right := RightUnitor( BAB );
<A morphism in AdditiveClosure( TerminalCategoryWithMultipleObjects( ) )\
 defined by a 3 x 3 matrix of underlying morphisms>
gap> IsWellDefined( right );
true
gap> right_inv := RightUnitorInverse( BAB );
<A morphism in AdditiveClosure( TerminalCategoryWithMultipleObjects( ) )\
 defined by a 3 x 3 matrix of underlying morphisms>
gap> PreCompose( right, right_inv ) = IdentityMorphism( Source( right ) );
true
gap> PreCompose( right_inv, right ) = IdentityMorphism( Range( right ) );
true
gap> aslr := AssociatorLeftToRight( AB, BAB, AB );
<A morphism in AdditiveClosure( TerminalCategoryWithMultipleObjects( ) )\
 defined by a 12 x 12 matrix of underlying morphisms>
gap> IsWellDefined( aslr );
true
gap> asrl := AssociatorRightToLeft( AB, BAB, AB );
<A morphism in AdditiveClosure( TerminalCategoryWithMultipleObjects( ) )\
 defined by a 12 x 12 matrix of underlying morphisms>
gap> PreCompose( aslr, asrl ) = IdentityMorphism( Source( aslr ) );
true
gap> PreCompose( asrl, aslr ) = IdentityMorphism( Range( aslr ) );
true

12.2 Basics based on category of rows

gap> LoadPackage( "RingsForHomalg", false );
true
gap> LoadPackage( "AdditiveClosuresForCAP", false );
true
gap> R := HomalgRingOfIntegers();;
gap> cat := CategoryOfRows( R );;
gap> obj1 := CategoryOfRowsObject( 1, cat );;
gap> obj2 := CategoryOfRowsObject( 2, cat );;
gap> IsIsomorphicForObjects( obj1, obj2 );
false
gap> IsIsomorphicForObjects( obj2, obj2 );
true
gap> IsIsomorphism( SomeIsomorphismBetweenObjects( obj2, obj2 ) );
true
gap> id := IdentityMorphism( obj2 );;
gap> alpha := CategoryOfRowsMorphism( obj1, HomalgMatrix( [ [ 1, 2 ] ], 1, 2, R ), obj2 );;
gap> beta := CategoryOfRowsMorphism( obj2, HomalgMatrix( [ [ 1, 2 ], [ 3, 4 ] ], 2, 2, R ), obj2 );;
gap> comp := PreCompose( alpha, beta );;
gap> IsZeroForMorphisms( comp );;
gap> zero := ZeroMorphism( obj1, obj2 );;
gap> IsZeroForMorphisms( zero );;
gap> ZeroObject( cat );;
gap> UniversalMorphismIntoZeroObject( obj2 );;
gap> UniversalMorphismFromZeroObject( obj1 );;
gap> IsCongruentForMorphisms(
>     SumOfMorphisms( obj1, [ alpha, alpha, alpha ], obj2 ),
>     AdditionForMorphisms( alpha, AdditionForMorphisms( alpha, alpha ) )
> );
true
gap> IsCongruentForMorphisms(
>     SumOfMorphisms( obj1, [ ], obj2 ),
>     ZeroMorphism( obj1, obj2 )
> );
true
gap> DirectSum( obj1, obj2 );;
gap> DirectSumFunctorial( [ alpha, beta, id ] );;
gap> proj := ProjectionInFactorOfDirectSum( [ obj2, obj1, obj2 ], 2 );;
gap> IsZeroForMorphisms( ComponentOfMorphismFromDirectSum( proj, [ obj2, obj1, obj2 ], 1 ) );
true
gap> IsOne( ComponentOfMorphismFromDirectSum( proj, [ obj2, obj1, obj2 ], 2 ) );
true
gap> IsZeroForMorphisms( ComponentOfMorphismFromDirectSum( proj, [ obj2, obj1, obj2 ], 3 ) );
true
gap> IsZeroForMorphisms( ComponentOfMorphismFromCoproduct( proj, [ obj2, obj1, obj2 ], 1 ) );
true
gap> IsOne( ComponentOfMorphismFromCoproduct( proj, [ obj2, obj1, obj2 ], 2 ) );
true
gap> IsZeroForMorphisms( ComponentOfMorphismFromCoproduct( proj, [ obj2, obj1, obj2 ], 3 ) );
true
gap> UniversalMorphismIntoDirectSum( [ alpha, alpha, alpha ] );;
gap> inj := InjectionOfCofactorOfDirectSum( [ obj2, obj2, obj1 ], 2 );;
gap> IsZeroForMorphisms( ComponentOfMorphismIntoDirectSum( inj, [ obj2, obj2, obj1 ], 1 ) );
true
gap> IsOne( ComponentOfMorphismIntoDirectSum( inj, [ obj2, obj2, obj1 ], 2 ) );
true
gap> IsZeroForMorphisms( ComponentOfMorphismIntoDirectSum( inj, [ obj2, obj2, obj1 ], 3 ) );
true
gap> IsZeroForMorphisms( ComponentOfMorphismIntoDirectProduct( inj, [ obj2, obj2, obj1 ], 1 ) );
true
gap> IsOne( ComponentOfMorphismIntoDirectProduct( inj, [ obj2, obj2, obj1 ], 2 ) );
true
gap> IsZeroForMorphisms( ComponentOfMorphismIntoDirectProduct( inj, [ obj2, obj2, obj1 ], 3 ) );
true
gap> gamma := CategoryOfRowsMorphism( obj2, HomalgMatrix( [ [ 1, 1 ], [ 1, 1 ] ], 2, 2, R ), obj2 );;
gap> IsColiftable( beta, gamma );
true
gap> IsColiftable( gamma, beta );
false
gap> ProjectionInFirstFactorOfWeakBiFiberProduct( gamma, gamma );;
gap> ProjectionInFirstFactorOfWeakBiFiberProduct( gamma, ZeroMorphism( Range( gamma ), Range( gamma ) ) );;
gap> lift_arg_1 := PreCompose( ProjectionInFirstFactorOfWeakBiFiberProduct( gamma, gamma + gamma ), gamma );;
gap> lift_arg_2 := gamma + gamma;;
gap> IsLiftable( lift_arg_1, lift_arg_2 );;
gap> Lift( lift_arg_1, lift_arg_2 );;
gap> pi1 := ProjectionInFirstFactorOfWeakBiFiberProduct( alpha, beta );;
gap> pi2 := ProjectionInSecondFactorOfWeakBiFiberProduct( alpha, beta );;
gap> IsEqualForMorphisms( PreCompose( pi1, alpha ), PreCompose( pi2, beta ) );;
gap> inj1 := InjectionOfFirstCofactorOfWeakBiPushout( gamma + gamma, gamma );;
gap> inj2 := InjectionOfSecondCofactorOfWeakBiPushout( gamma + gamma, gamma );;
gap> IsEqualForMorphisms( PreCompose( gamma + gamma, inj1 ), PreCompose( gamma, inj2 ) );;
gap> WeakKernelLift( WeakCokernelProjection( gamma ), gamma );;
gap> pi1 := InjectionOfFirstCofactorOfWeakBiPushout( alpha, alpha );;
gap> pi2 := InjectionOfSecondCofactorOfWeakBiPushout( alpha, alpha );;
gap> UniversalMorphismFromWeakBiPushout( alpha, alpha, pi1, pi2 );;
gap> S := HomalgFieldOfRationalsInSingular() * "x,y,z";;
gap> Rows_S := CategoryOfRows( S );;
gap> S3 := CategoryOfRowsObject( 3, Rows_S );;
gap> S1 := CategoryOfRowsObject( 1, Rows_S );;
gap> mor := CategoryOfRowsMorphism( S3, HomalgMatrix( "[x,y,z]", 3, 1, S ), S1 );;
gap> biased_w := CategoryOfRowsMorphism( S3, HomalgMatrix( "[x,0,0,0,x,0,0,0,x]", 3, 3, S ), S3 );;
gap> biased_h := CategoryOfRowsMorphism( S3, HomalgMatrix( "[x*y, x*z, y^2]", 3, 3, S ), S3 );;
gap> BiasedWeakFiberProduct( biased_h, biased_w );;
gap> ProjectionOfBiasedWeakFiberProduct( biased_h, biased_w );;
gap> IsCongruentForMorphisms(
>    PreCompose( UniversalMorphismIntoBiasedWeakFiberProduct( biased_h, biased_w, biased_h ), ProjectionOfBiasedWeakFiberProduct( biased_h, biased_w ) ),
>    biased_h
> );
true
gap> IsCongruentForMorphisms(
>   PreCompose( InjectionOfBiasedWeakPushout( biased_h, biased_w ), UniversalMorphismFromBiasedWeakPushout( biased_h, biased_w, biased_h )),
>   biased_h
> );
true
gap> ## Homomorphism structures
> a := InterpretMorphismAsMorphismFromDistinguishedObjectToHomomorphismStructure( gamma );;
gap> IsCongruentForMorphisms( InterpretMorphismFromDistinguishedObjectToHomomorphismStructureAsMorphism( Source( a ), Range( a ), InterpretMorphismAsMorphismFromDistinguishedObjectToHomomorphismStructure( a ) ), a );;
gap> a := ZeroObjectFunctorial( cat );;
gap> IsCongruentForMorphisms( InterpretMorphismFromDistinguishedObjectToHomomorphismStructureAsMorphism( Source( a ), Range( a ), InterpretMorphismAsMorphismFromDistinguishedObjectToHomomorphismStructure( a ) ), a );;

12.3 Basics based on category of columns

gap> R := HomalgRingOfIntegers();;
gap> cat := CategoryOfColumns( R );;
gap> obj1 := CategoryOfColumnsObject( 1, cat );;
gap> obj2 := CategoryOfColumnsObject( 2, cat );;
gap> id := IdentityMorphism( obj2 );;
gap> alpha := CategoryOfColumnsMorphism( obj1, HomalgMatrix( [ [ 1 ], [ 2 ] ], 1, 2, R ), obj2 );;
gap> beta := CategoryOfColumnsMorphism( obj2, HomalgMatrix( [ [ 1, 2 ], [ 3, 4 ] ], 2, 2, R ), obj2 );;
gap> comp := PreCompose( alpha, beta );;
gap> IsZeroForMorphisms( comp );;
gap> zero := ZeroMorphism( obj1, obj2 );;
gap> IsZeroForMorphisms( zero );;
gap> ZeroObject( cat );;
gap> UniversalMorphismIntoZeroObject( obj2 );;
gap> UniversalMorphismFromZeroObject( obj1 );;
gap> DirectSum( obj1, obj2 );;
gap> DirectSumFunctorial( [ alpha, beta, id ] );;
gap> proj := ProjectionInFactorOfDirectSum( [ obj2, obj1, obj2 ], 2 );;
gap> IsZeroForMorphisms( ComponentOfMorphismFromDirectSum( proj, [ obj2, obj1, obj2 ], 1 ) );
true
gap> IsOne( ComponentOfMorphismFromDirectSum( proj, [ obj2, obj1, obj2 ], 2 ) );
true
gap> IsZeroForMorphisms( ComponentOfMorphismFromDirectSum( proj, [ obj2, obj1, obj2 ], 3 ) );
true
gap> UniversalMorphismIntoDirectSum( [ alpha, alpha, alpha ] );;
gap> inj := InjectionOfCofactorOfDirectSum( [ obj2, obj2, obj1 ], 2 );;
gap> IsZeroForMorphisms( ComponentOfMorphismIntoDirectSum( inj, [ obj2, obj2, obj1 ], 1 ) );
true
gap> IsOne( ComponentOfMorphismIntoDirectSum( inj, [ obj2, obj2, obj1 ], 2 ) );
true
gap> IsZeroForMorphisms( ComponentOfMorphismIntoDirectSum( inj, [ obj2, obj2, obj1 ], 3 ) );
true
gap> gamma := CategoryOfColumnsMorphism( obj2, HomalgMatrix( [ [ 1, 1 ], [ 1, 1 ] ], 2, 2, R ), obj2 );;
gap> IsColiftable( beta, gamma );
false
gap> IsColiftable( gamma, beta );
false
gap> ProjectionInFirstFactorOfWeakBiFiberProduct( gamma, gamma );;
gap> ProjectionInFirstFactorOfWeakBiFiberProduct( gamma, ZeroMorphism( Range( gamma ), Range( gamma ) ) );;
gap> lift_arg_1 := PreCompose( ProjectionInFirstFactorOfWeakBiFiberProduct( gamma, gamma + gamma ), gamma );;
gap> lift_arg_2 := gamma + gamma;;
gap> IsLiftable( lift_arg_1, lift_arg_2 );;
gap> Lift( lift_arg_1, lift_arg_2 );;
gap> pi1 := ProjectionInFirstFactorOfWeakBiFiberProduct( alpha, beta );;
gap> pi2 := ProjectionInSecondFactorOfWeakBiFiberProduct( alpha, beta );;
gap> IsEqualForMorphisms( PreCompose( pi1, alpha ), PreCompose( pi2, beta ) );;
gap> inj1 := InjectionOfFirstCofactorOfWeakBiPushout( gamma + gamma, gamma );;
gap> inj2 := InjectionOfSecondCofactorOfWeakBiPushout( gamma + gamma, gamma );;
gap> IsEqualForMorphisms( PreCompose( gamma + gamma, inj1 ), PreCompose( gamma, inj2 ) );;
gap> WeakKernelLift( WeakCokernelProjection( gamma ), gamma );;
gap> pi1 := InjectionOfFirstCofactorOfWeakBiPushout( alpha, alpha );;
gap> pi2 := InjectionOfSecondCofactorOfWeakBiPushout( alpha, alpha );;
gap> UniversalMorphismFromWeakBiPushout( alpha, alpha, pi1, pi2 );;
gap> S := HomalgFieldOfRationalsInSingular() * "x,y,z";;
gap> Cols_S := CategoryOfColumns( S );;
gap> S3 := CategoryOfColumnsObject( 3, Cols_S );;
gap> S1 := CategoryOfColumnsObject( 1, Cols_S );;
gap> mor := CategoryOfColumnsMorphism( S3, HomalgMatrix( "[x,y,z]", 1, 3, S ), S1 );;
gap> biased_w := CategoryOfColumnsMorphism( S3, HomalgMatrix( "[x,0,0,0,x,0,0,0,x]", 3, 3, S ), S3 );;
gap> biased_h := CategoryOfColumnsMorphism( S3, HomalgMatrix( "[x*y, x*z, y^2]", 3, 3, S ), S3 );;
gap> BiasedWeakFiberProduct( biased_h, biased_w );;
gap> ProjectionOfBiasedWeakFiberProduct( biased_h, biased_w );;
gap> IsCongruentForMorphisms(
>    PreCompose( UniversalMorphismIntoBiasedWeakFiberProduct( biased_h, biased_w, biased_h ), ProjectionOfBiasedWeakFiberProduct( biased_h, biased_w ) ),
>    biased_h
> );
true
gap> IsCongruentForMorphisms(
>   PreCompose( InjectionOfBiasedWeakPushout( biased_h, biased_w ), UniversalMorphismFromBiasedWeakPushout( biased_h, biased_w, biased_h )),
>   biased_h
> );
true
gap> ## Homomorphism structures
> a := InterpretMorphismAsMorphismFromDistinguishedObjectToHomomorphismStructure( gamma );;
gap> IsCongruentForMorphisms( InterpretMorphismFromDistinguishedObjectToHomomorphismStructureAsMorphism( Source( a ), Range( a ), InterpretMorphismAsMorphismFromDistinguishedObjectToHomomorphismStructure( a ) ), a );;
gap> a := ZeroObjectFunctorial( cat );;
gap> IsCongruentForMorphisms( InterpretMorphismFromDistinguishedObjectToHomomorphismStructureAsMorphism( Source( a ), Range( a ), InterpretMorphismAsMorphismFromDistinguishedObjectToHomomorphismStructure( a ) ), a );;

12.4 Homomorphism structure

gap> LoadPackage( "RingsForHomalg", false );
true
gap> LoadPackage( "AdditiveClosuresForCAP", false );
true
gap> EEE := KoszulDualRing( HomalgFieldOfRationalsInSingular( ) * "x,y" );;
gap> Eoid := RingAsCategory( EEE );;
gap> a := RingAsCategoryMorphism( Eoid, 1/2 );;
gap> b := RingAsCategoryMorphism( Eoid, -2/3 );;
gap> u := RingAsCategoryUniqueObject( Eoid );;
gap> IsCongruentForMorphisms( a,
>     InterpretMorphismFromDistinguishedObjectToHomomorphismStructureAsMorphism(
>         u,u,
>         InterpretMorphismAsMorphismFromDistinguishedObjectToHomomorphismStructure(
>             a
>         )
>     )
> );
true
gap> a = HomStructure( u, u, HomStructure( a ) );
true
gap> IsEqualForObjects( HomStructure( Eoid ), DistinguishedObjectOfHomomorphismStructure( Eoid ) );
true
gap> c := RingAsCategoryMorphism( Eoid, 3 );;
gap> d := RingAsCategoryMorphism( Eoid, 0 );;
gap> left_coeffs := [ [ a, b ], [ c, d ] ];;
gap> right_coeffs := [ [ PreCompose( a, b ), PreCompose( b, c ) ], [ c, PreCompose( a, a ) ] ];;
gap> right_side := [ a, b ];;
gap> MereExistenceOfSolutionOfLinearSystemInAbCategory( left_coeffs, right_coeffs, right_side );
true
gap> solution := 
>     SolveLinearSystemInAbCategory(
>     left_coeffs,
>     right_coeffs,
>     right_side
> );;
gap> ForAll( [ 1, 2 ], i ->
>     IsCongruentForMorphisms(
>         Sum( List( [ 1, 2 ], j -> PreCompose( [ left_coeffs[i][j], solution[j], right_coeffs[i][j] ] ) ) ),
>         right_side[i]
>     )
> );
true
gap> IsLiftable( c, d );
false
gap> LiftOrFail( c, d );
fail
gap> IsLiftable( d, c );
true
gap> LiftOrFail( d, c );
<0>
gap> Lift( d, c );
<0>
gap> IsColiftable( c, d );
true
gap> ColiftOrFail( c, d );
<0>
gap> Colift( c, d );
<0>
gap> IsColiftable( d, c );
false
gap> ColiftOrFail( d, c );
fail

12.5 Opposite( CategoryOfRow ) as CategoryOfColumns

Assume that we have the constructors CategoryOfRows and CategoryOfColumns but no constructor Opposite. Then we can still model Opposite( CategoryOfRows ) as CategoryOfColumns using ReinterpretationOfCategory. This can be achieved up to minor modifications by swapping object_constructor and modeling_tower_object_constructor and so on in CategoryOfColums_as_Opposite_CategoryOfRows. With this, objects and morphisms indeed have the attribute Opposite as desired. Getting ObjectDatum and MorphismDatum to return this attribute would also be possible, but would require more effort than simply swapping object_constructor and modeling_tower_object_constructor and so.

gap> LoadPackage( "AdditiveClosuresForCAP", false );
true
gap> QQ := HomalgFieldOfRationals( );;
gap> cols := CategoryOfColumns( QQ );;
gap> rows := CategoryOfRows( QQ );;
gap> object_constructor :=
>     { cat, rank } -> CreateCapCategoryObjectWithAttributes( cat,
>                                                             Opposite, CategoryOfRowsObject( Opposite( cat ), rank )
>     );;
gap> modeling_tower_object_constructor :=
>     { cat, rank } -> CreateCapCategoryObjectWithAttributes( ModelingCategory( cat ),
>                                                             RankOfObject, rank
>     );;
gap> object_datum := { cat, obj } -> RankOfObject( Opposite( obj ) );;
gap> modeling_tower_object_datum := { cat, obj } -> RankOfObject( obj );;
gap> morphism_constructor :=
>     { cat, source, underlying_matrix, range } ->
>         CreateCapCategoryMorphismWithAttributes(
>             cat,
>             source, range,
>             Opposite, CategoryOfRowsMorphism(
>                 Opposite( cat ),
>                 Opposite( range ),
>                 underlying_matrix,
>                 Opposite( source )
>             )
>         );;
gap> modeling_tower_morphism_constructor :=
>     { cat, source, underlying_matrix, range } ->
>         CreateCapCategoryMorphismWithAttributes(
>             ModelingCategory( cat ),
>             source, range,
>             UnderlyingMatrix, underlying_matrix
>         );;
gap> morphism_datum := { cat, mor } -> UnderlyingMatrix( Opposite( mor ) );;
gap> modeling_tower_morphism_datum := { cat, mor } -> UnderlyingMatrix( mor );;
gap> op := ReinterpretationOfCategory( cols, rec(
>     name := Concatenation( "Opposite( ", Name( rows )," )" ),
>     category_filter := WasCreatedAsOppositeCategory,
>     category_object_filter := IsCapCategoryOppositeObject,
>     category_morphism_filter := IsCapCategoryOppositeMorphism,
>     object_constructor := object_constructor,
>     object_datum := object_datum,
>     morphism_constructor := morphism_constructor,
>     morphism_datum := morphism_datum,
>     modeling_tower_object_constructor := modeling_tower_object_constructor,
>     modeling_tower_object_datum := modeling_tower_object_datum,
>     modeling_tower_morphism_constructor := modeling_tower_morphism_constructor,
>     modeling_tower_morphism_datum := modeling_tower_morphism_datum,
>     only_primitive_operations := true,
> ) );
Opposite( Rows( Q ) )
gap> SetOpposite( op, rows );
gap> source := ObjectConstructor( op, 1 );
<An object in Opposite( Rows( Q ) )>
gap> range := ObjectConstructor( op, 2 );
<An object in Opposite( Rows( Q ) )>
gap> zero := ZeroMorphism( source, range );
<A zero morphism in Opposite( Rows( Q ) )>
gap> sum := AdditionForMorphisms( zero, zero );
<A morphism in Opposite( Rows( Q ) )>
gap> # notice that source and range are indeed swapped compared to the above
> Display( Source( Opposite( sum ) ) );
A row module over Q of rank 2
gap> Display( Range( Opposite( sum ) ) );
A row module over Q of rank 1

12.6 Tests

gap> LoadPackage( "AdditiveClosuresForCAP", false );
true
gap> R := HomalgRingOfIntegers( ) ;;
gap> cat := CategoryOfColumns( R );;
gap> A := RandomObjectByInteger( cat, 2 );;
gap> B := RandomObjectByInteger( cat, 2 );;
gap> mor1 := RandomMorphismByInteger( cat, 2 );;
gap> mor2 := RandomMorphismWithFixedSourceByInteger( cat, CategoryOfColumnsObject( cat, 3 ), 2 );;
gap> mor3 := RandomMorphismWithFixedRangeByInteger( cat, CategoryOfColumnsObject( cat, 3 ), 2 );;
gap> mor4 := RandomMorphismWithFixedSourceAndRangeByInteger( cat, CategoryOfColumnsObject( cat, 3 ), CategoryOfColumnsObject( cat, 4 ), 2 );;
gap> RankOfObject( Source( mor2 ) ) = 3;
true
gap> RankOfObject( Range( mor3 ) ) = 3;
true
gap> RankOfObject( Source( mor4 ) ) = 3;
true
gap> RankOfObject( Range( mor4 ) ) = 4;
true
gap> LoadPackage( "AdditiveClosuresForCAP", false );
true
gap> QQ := HomalgFieldOfRationalsInSingular( );;
gap> QQxy := QQ * "x,y";;
gap> EQQxy := KoszulDualRing( QQxy );;
gap> R := KoszulDualRing( HomalgRingOfIntegersInSingular( ) * "x,y" );;
gap> CAP_INTERNAL_GENERATE_DOCUMENTATION_FOR_CATEGORY_INSTANCES(
>     [
>         [ CategoryOfRows( R ), "CategoryOfRows of an arbitrary ring", 0 ],
>         [ CategoryOfRows( EQQxy ), "CategoryOfRows of an exterior algebra over a field", 1 ],
>         [ CategoryOfRows( QQxy ), "CategoryOfRows of a commutative ring", 1 ],
>         [ CategoryOfRows( QQ ), "CategoryOfRows of a field", 3 ],
>     ],
>     "AdditiveClosuresForCAP",
>     "CategoryOfRows.autogen.gd",
>     "Category of rows",
>     "Supported CAP operations"
> );

12.7 Rings as Ab-categories

gap> CR := RingAsCategory( Integers );;
gap> u := RingAsCategoryUniqueObject( CR );;
gap> IsObjectFiniteCategory( CR );
true
gap> SetOfObjectsOfCategory( CR ) = [ u ];
true
gap> alpha := 2 / CR;
<2>
gap> IsOne( alpha );
false
gap> MorphismDatum( alpha );
2
gap> IsZeroForMorphisms( alpha );
false
gap> alpha * alpha;
<4>
gap> -alpha;
<-2>
gap> IsZeroForMorphisms( alpha + AdditiveInverse( alpha ) );
true
gap> beta := RingAsCategoryMorphism( 1/2, CR );;
gap> IsWellDefined( beta );
false
gap> gamma := IdentityMorphism( u );
<1>
gap> IsOne( gamma );
true
gap> delta := ZeroMorphism( u, u );
<0>
gap> IsZeroForMorphisms( delta );
true
gap> 2 * alpha;
<4>
gap> Lift( alpha * alpha, alpha );
<2>
gap> Colift( alpha, alpha * alpha );
<2>
gap> BasisOfExternalHom( u, u );
[ <1> ]
gap> CoefficientsOfMorphism( alpha );
[ 2 ]
gap> IsCongruentForMorphisms( alpha, LinearCombinationOfMorphisms( u, CoefficientsOfMorphism( alpha ), BasisOfExternalHom( u, u ), u ) );
true
gap> TensorUnit( CR );
*
gap> TensorUnit( CR ) = u;
true
gap> TensorProductOnObjects( u, u );
*
gap> TensorProductOnObjects( u, u ) = u;
true
gap> TensorProductOnMorphisms( alpha, beta );
<1>
gap> Braiding( u, u );
<1>
gap> DualOnObjects( u ) = u;
true
gap> DualOnMorphisms( alpha ) = alpha;
true
gap> EvaluationForDual( u );
<1>
gap> CoevaluationForDual( u );
<1>
gap> CoDualOnObjects( u ) = u;
true
gap> CoDualOnMorphisms( beta ) = beta;
true
gap> CoclosedEvaluationForCoDual( u );
<1>
gap> CoclosedCoevaluationForCoDual( u );
<1>
gap> EEE := KoszulDualRing( HomalgFieldOfRationalsInSingular( ) * "x,y" );;
gap> CE := RingAsCategory( EEE );;
gap> u := RingAsCategoryUniqueObject( CE );;
gap> alpha := ("2 + 3 * e0 + 4 * e1 + 5 * e0*e1" / EEE) / CE;
<5*e0*e1+3*e0+4*e1+2>
gap> IsOne( alpha );
false
gap> IsZeroForMorphisms( alpha );
false
gap> alpha * alpha;
<20*e0*e1+12*e0+16*e1+4>
gap> -alpha;
<-5*e0*e1-3*e0-4*e1-2>
gap> IsZeroForMorphisms( alpha + AdditiveInverse( alpha ) );
true
gap> gamma := IdentityMorphism( u );
<1>
gap> IsOne( gamma );
true
gap> delta := ZeroMorphism( u, u );
<0>
gap> IsZeroForMorphisms( delta );
true
gap> 2 * alpha;
<10*e0*e1+6*e0+8*e1+4>
gap> Lift( alpha * alpha, alpha );
<5*e0*e1+3*e0+4*e1+2>
gap> Colift( alpha, alpha * alpha );
<5*e0*e1+3*e0+4*e1+2>
gap> basis := BasisOfExternalHom( u, u );
[ <1>, <e0>, <e1>, <e0*e1> ]
gap> coeffs := CoefficientsOfMorphism( alpha );
[ 2, 3, 4, 5 ]
gap> IsCongruentForMorphisms( alpha, LinearCombinationOfMorphisms( u, coeffs, basis, u ) );
true
gap> u_op := Opposite( u );
<An object in Opposite( RingAsCategory( Q{e0,e1} ) )>
gap> alpha_op := Opposite( alpha );
<A morphism in Opposite( RingAsCategory( Q{e0,e1} ) )>
gap> basis := BasisOfExternalHom( u_op, u_op );;
gap> coeffs := CoefficientsOfMorphism( alpha_op );
[ 2, 3, 4, 5 ]
gap> IsCongruentForMorphisms( alpha_op, LinearCombinationOfMorphisms( u_op, coeffs, basis, u_op ) );
true
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 13 Ind

generated by GAPDoc2HTML