|
|
|
|
Quelle chap2.html
Sprache: HTML
|
|
| products/sources/formale Sprachen/GAP/pkg/linearalgebraforcap/doc/chap2.html |
 |
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>GAP (LinearAlgebraForCAP) - Chapter 2: Examples and Tests</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta name="generator" content="GAPDoc2HTML" />
<link rel="stylesheet" type="text/css" href="manual.css" />
<script src="manual.js" type="text/javascript"></script>
<script type="text/javascript">overwriteStyle();</script>
</head>
<body class="chap2" onload="jscontent()">
<div class="chlinktop"><span class="chlink1">Goto Chapter: </span><a href="chap0.html">Top</a> <a href="chap1.html">1</a> <a href="chap2.html">2</a> <a href="chapInd.html">Ind</a> </div>
<div class="chlinkprevnexttop"> <a href="chap0.html">[Top of Book]</a> <a href="chap0.html#contents">[Contents]</a> <a href="chap1.html">[Previous Chapter]</a> <a href="chapInd.html">[Next Chapter]</a> </div>
<p id="mathjaxlink" class="pcenter"><a href="chap2_mj.html">[MathJax on]</a></p>
<p><a id="X7967FE8E7BBDF485" name="X7967FE8E7BBDF485"></a></p>
<div class="ChapSects"><a href="chap2.html#X7967FE8E7BBDF485">2 <span class="Heading">Examples and Tests</span></a>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap2.html#X8104A77D7B5CCD4F">2.1 <span class="Heading">Basic Commands</span></a>
</span>
</div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap2.html#X78D1062D78BE08C1">2.2 <span class="Heading">Functors</span></a>
</span>
</div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap2.html#X85B1F5077BE75340">2.3 <span class="Heading">Solving (Homogeneous) Linear Systems</span></a>
</span>
</div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap2.html#X852F59737EC57965">2.4 <span class="Heading">Homology object</span></a>
</span>
</div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap2.html#X7CDB7FF27D734D2D">2.5 <span class="Heading">Liftable</span></a>
</span>
</div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap2.html#X797080CE873BB56D">2.6 <span class="Heading">Monoidal structure</span></a>
</span>
</div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap2.html#X8218390A785F1EDB">2.7 <span class="Heading">MorphismFromSourceToPushout and MorphismFromFiberProductToSink</span></a>
</span>
</div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap2.html#X84410C637B3C1D0E">2.8 <span class="Heading">Opposite category</span></a>
</span>
</div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap2.html#X7F34E29281DF3FCE">2.9 <span class="Heading">PreComposeList and PostComposeList</span></a>
</span>
</div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap2.html#X87F5609A7B33C58C">2.10 <span class="Heading">Split epi summand</span></a>
</span>
</div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap2.html#X7DCD99628504B810">2.11 <span class="Heading">Kernel</span></a>
</span>
</div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap2.html#X7DE20941803BFBD9">2.12 <span class="Heading">FiberProduct</span></a>
</span>
</div>
<div class="ContSect"><span class="tocline"><span class="nocss"> </span><a href="chap2.html#X8245BF297DF9A3E7">2.13 <span class="Heading">WrapperCategory</span></a>
</span>
</div>
</div>
<h3>2 <span class="Heading">Examples and Tests</span></h3>
<p><a id="X8104A77D7B5CCD4F" name="X8104A77D7B5CCD4F"></a></p>
<h4>2.1 <span class="Heading">Basic Commands</span></h4>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">LoadPackage( "LinearAlgebraForCAP", false );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">Q := HomalgFieldOfRationals();;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">vec := MatrixCategory( Q );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">a := MatrixCategoryObject( vec, 3 );</span>
<A vector space object over Q of dimension 3>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsProjective( a );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">ap := 3/vec;;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsEqualForObjects( a, ap );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">b := MatrixCategoryObject( vec, 4 );</span>
<A vector space object over Q of dimension 4>
<span class="GAPprompt">gap></span> <span class="GAPinput">homalg_matrix := HomalgMatrix( [ [ 1, 0, 0, 0 ],</span>
<span class="GAPprompt">></span> <span class="GAPinput"> [ 0, 1, 0, -1 ],</span>
<span class="GAPprompt">></span> <span class="GAPinput"> [ -1, 0, 2, 1 ] ], 3, 4, Q );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha := VectorSpaceMorphism( a, homalg_matrix, b );</span>
<A morphism in Category of matrices over Q>
</pre></div>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput"># @drop_example_in_Julia: view/print/display strings of matrices differ between GAP and Julia, see https://github.com/homalg-project/MatricesForHomalg.jl/issues/41</span>
<span class="GAPprompt">></span> <span class="GAPinput">Display( alpha );</span>
[ [ 1, 0, 0, 0 ],
[ 0, 1, 0, -1 ],
[ -1, 0, 2, 1 ] ]
A morphism in Category of matrices over Q
</pre></div>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">alphap := homalg_matrix/vec;;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms( alpha, alphap );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">homalg_matrix := HomalgMatrix( [ [ 1, 1, 0, 0 ],</span>
<span class="GAPprompt">></span> <span class="GAPinput"> [ 0, 1, 0, -1 ],</span>
<span class="GAPprompt">></span> <span class="GAPinput"> [ -1, 0, 2, 1 ] ], 3, 4, Q );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">beta := VectorSpaceMorphism( a, homalg_matrix, b );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">CokernelObject( alpha );</span>
<A vector space object over Q of dimension 1>
<span class="GAPprompt">gap></span> <span class="GAPinput">c := CokernelProjection( alpha );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Display( EntriesOfHomalgMatrixAsListList( UnderlyingMatrix( c ) ) );</span>
[ [ 0 ], [ 1 ], [ -1/2 ], [ 1 ] ]
<span class="GAPprompt">gap></span> <span class="GAPinput">gamma := UniversalMorphismIntoDirectSum( [ c, c ] );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Display( EntriesOfHomalgMatrixAsListList( UnderlyingMatrix( gamma ) ) );</span>
[ [ 0, 0 ], [ 1, 1 ], [ -1/2, -1/2 ], [ 1, 1 ] ]
<span class="GAPprompt">gap></span> <span class="GAPinput">colift := CokernelColift( alpha, gamma );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsEqualForMorphisms( PreCompose( c, colift ), gamma );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">FiberProduct( alpha, beta );</span>
<A vector space object over Q of dimension 2>
<span class="GAPprompt">gap></span> <span class="GAPinput">F := FiberProduct( alpha, beta );</span>
<A vector space object over Q of dimension 2>
<span class="GAPprompt">gap></span> <span class="GAPinput">p1 := ProjectionInFactorOfFiberProduct( [ alpha, beta ], 1 );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">Display( EntriesOfHomalgMatrixAsListList( UnderlyingMatrix( PreCompose( p1, alpha ) ) ) );</span>
[ [ 0, 1, 0, -1 ], [ -1, 0, 2, 1 ] ]
<span class="GAPprompt">gap></span> <span class="GAPinput">Pushout( alpha, beta );</span>
<A vector space object over Q of dimension 5>
<span class="GAPprompt">gap></span> <span class="GAPinput">i1 := InjectionOfCofactorOfPushout( [ alpha, beta ], 1 );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">i2 := InjectionOfCofactorOfPushout( [ alpha, beta ], 2 );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">u := UniversalMorphismFromDirectSum( [ b, b ], [ i1, i2 ] );</span>
<A morphism in Category of matrices over Q>
</pre></div>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput"># @drop_example_in_Julia: differences in the output of SyzygiesOfRows, see https://github.com/homalg-project/MatricesForHomalg.jl/issues/50</span>
<span class="GAPprompt">></span> <span class="GAPinput">Display( EntriesOfHomalgMatrixAsListList( UnderlyingMatrix( u ) ) );</span>
[ [ 0, 1, 1, 0, 0 ],\
[ 1, 0, 1, 0, -1 ],\
[ -1/2, 0, 1/2, 1, 1/2 ],\
[ 1, 0, 0, 0, 0 ],\
[ 0, 1, 0, 0, 0 ],\
[ 0, 0, 1, 0, 0 ],\
[ 0, 0, 0, 1, 0 ],\
[ 0, 0, 0, 0, 1 ] ]
</pre></div>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">KernelObjectFunctorial( u, IdentityMorphism( Source( u ) ), u ) = IdentityMorphism( MatrixCategoryObject( vec, 3 ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsZeroForMorphisms( CokernelObjectFunctorial( u, IdentityMorphism( Range( u ) ), u ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">DirectProductFunctorial( [ u, u ] ) = DirectSumFunctorial( [ u, u ] );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">CoproductFunctorial( [ u, u ] ) = DirectSumFunctorial( [ u, u ] );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> FiberProductFunctorial( [ u, u ], [ IdentityMorphism( Source( u ) ), IdentityMorphism( Source( u ) ) ], [ u, u ] ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> IdentityMorphism( FiberProduct( [ u, u ] ) )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> PushoutFunctorial( [ u, u ], [ IdentityMorphism( Range( u ) ), IdentityMorphism( Range( u ) ) ], [ u, u ] ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> IdentityMorphism( Pushout( [ u, u ] ) )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms( ((1/2) / Q) * alpha, alpha * ((1/2) / Q) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">Dimension( HomomorphismStructureOnObjects( a, b ) ) = Dimension( a ) * Dimension( b );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> PreCompose( [ u, DualOnMorphisms( i1 ), DualOnMorphisms( alpha ) ] ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> InterpretMorphismFromDistinguishedObjectToHomomorphismStructureAsMorphism( Source( u ), Source( alpha ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> PreCompose(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> InterpretMorphismAsMorphismFromDistinguishedObjectToHomomorphismStructure( DualOnMorphisms( i1 ) ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> HomomorphismStructureOnMorphisms( u, DualOnMorphisms( alpha ) )</span>
<span class="GAPprompt">></span> <span class="GAPinput"> )</span>
<span class="GAPprompt">></span> <span class="GAPinput"> )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">op := Opposite( vec );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha_op := Opposite( op, alpha );</span>
<A morphism in Opposite( Category of matrices over Q )>
<span class="GAPprompt">gap></span> <span class="GAPinput">basis := BasisOfExternalHom( Source( alpha_op ), Range( alpha_op ) );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">coeffs := CoefficientsOfMorphism( alpha_op );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Display( coeffs );</span>
[ 1, 0, 0, 0, 0, 1, 0, -1, -1, 0, 2, 1 ]
<span class="GAPprompt">gap></span> <span class="GAPinput">IsEqualForMorphisms( alpha_op, LinearCombinationOfMorphisms( Source( alpha_op ), coeffs, basis, Range( alpha_op ) ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">vec := CapCategory( alpha );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">t := TensorUnit( vec );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">z := ZeroObject( vec );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> ZeroObjectFunctorial( vec ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> InterpretMorphismFromDistinguishedObjectToHomomorphismStructureAsMorphism( z, z, ZeroMorphism( t, z ) )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> ZeroObjectFunctorial( vec ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> InterpretMorphismFromDistinguishedObjectToHomomorphismStructureAsMorphism(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> z, z,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> InterpretMorphismAsMorphismFromDistinguishedObjectToHomomorphismStructure( ZeroObjectFunctorial( vec ) )</span>
<span class="GAPprompt">></span> <span class="GAPinput"> )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">right_side := PreCompose( [ i1, DualOnMorphisms( u ), u ] );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">x := SolveLinearSystemInAbCategory( [ [ i1 ] ], [ [ u ] ], [ right_side ] )[1];;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms( PreCompose( [ i1, x, u ] ), right_side );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">a_otimes_b := TensorProductOnObjects( a, b );</span>
<A vector space object over Q of dimension 12>
<span class="GAPprompt">gap></span> <span class="GAPinput">hom_ab := InternalHomOnObjects( a, b );</span>
<A vector space object over Q of dimension 12>
<span class="GAPprompt">gap></span> <span class="GAPinput">cohom_ab := InternalCoHomOnObjects( a, b );</span>
<A vector space object over Q of dimension 12>
<span class="GAPprompt">gap></span> <span class="GAPinput">hom_ab = cohom_ab;</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">unit_ab := VectorSpaceMorphism(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> a_otimes_b,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> HomalgIdentityMatrix( Dimension( a_otimes_b ), Q ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> a_otimes_b</span>
<span class="GAPprompt">></span> <span class="GAPinput"> );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">unit_hom_ab := VectorSpaceMorphism(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> hom_ab,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> HomalgIdentityMatrix( Dimension( hom_ab ), Q ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> hom_ab</span>
<span class="GAPprompt">></span> <span class="GAPinput"> );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">unit_cohom_ab := VectorSpaceMorphism(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> cohom_ab,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> HomalgIdentityMatrix( Dimension( cohom_ab ), Q ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> cohom_ab</span>
<span class="GAPprompt">></span> <span class="GAPinput"> );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">ev_ab := ClosedMonoidalLeftEvaluationMorphism( a, b );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">coev_ab := ClosedMonoidalLeftCoevaluationMorphism( a, b );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">coev_ba := ClosedMonoidalLeftCoevaluationMorphism( b, a );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">cocl_ev_ab := CoclosedMonoidalLeftEvaluationMorphism( a, b );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">cocl_ev_ba := CoclosedMonoidalLeftEvaluationMorphism( b, a );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">cocl_coev_ab := CoclosedMonoidalLeftCoevaluationMorphism( a, b );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">cocl_coev_ba := CoclosedMonoidalLeftCoevaluationMorphism( b, a );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">UnderlyingMatrix( ev_ab ) = TransposedMatrix( UnderlyingMatrix( cocl_ev_ab ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">UnderlyingMatrix( coev_ab ) = TransposedMatrix( UnderlyingMatrix( cocl_coev_ab ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">UnderlyingMatrix( coev_ba ) = TransposedMatrix( UnderlyingMatrix( cocl_coev_ba ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">tensor_hom_adj_1_hom_ab := InternalHomToTensorProductLeftAdjunctMorphism( a, b, unit_hom_ab );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">cohom_tensor_adj_1_cohom_ab := InternalCoHomToTensorProductLeftAdjunctMorphism( a, b, unit_cohom_ab );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">tensor_hom_adj_1_ab := TensorProductToInternalHomLeftAdjunctMorphism( a, b, unit_ab );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">cohom_tensor_adj_1_ab := TensorProductToInternalCoHomLeftAdjunctMorphism( a, b, unit_ab );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">ev_ab = tensor_hom_adj_1_hom_ab;</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">cocl_ev_ba = cohom_tensor_adj_1_cohom_ab;</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">coev_ba = tensor_hom_adj_1_ab;</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">cocl_coev_ba = cohom_tensor_adj_1_ab;</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">c := MatrixCategoryObject( vec, 2 );</span>
<A vector space object over Q of dimension 2>
<span class="GAPprompt">gap></span> <span class="GAPinput">d := MatrixCategoryObject( vec, 1 );</span>
<A vector space object over Q of dimension 1>
</pre></div>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">pre_compose := MonoidalPreComposeMorphism( a, b, c );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">post_compose := MonoidalPostComposeMorphism( a, b, c );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">pre_cocompose := MonoidalPreCoComposeMorphism( c, b, a );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">post_cocompose := MonoidalPostCoComposeMorphism( c, b, a );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">UnderlyingMatrix( pre_compose ) = TransposedMatrix( UnderlyingMatrix( pre_cocompose ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">UnderlyingMatrix( post_compose ) = TransposedMatrix( UnderlyingMatrix( post_cocompose ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">tp_hom_comp := TensorProductInternalHomCompatibilityMorphism( [ a, b, c, d ] );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">cohom_tp_comp := InternalCoHomTensorProductCompatibilityMorphism( [ b, d, a, c ] );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">UnderlyingMatrix( tp_hom_comp ) = TransposedMatrix( UnderlyingMatrix( cohom_tp_comp ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">lambda := LambdaIntroduction( alpha );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">lambda_elim := LambdaElimination( a, b, lambda );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha = lambda_elim;</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha_op := VectorSpaceMorphism( b, TransposedMatrix( UnderlyingMatrix( alpha ) ), a );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">colambda := CoLambdaIntroduction( alpha_op );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">colambda_elim := CoLambdaElimination( b, a, colambda );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha_op = colambda_elim;</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">UnderlyingMatrix( lambda ) = TransposedMatrix( UnderlyingMatrix( colambda ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">delta := PreCompose( colambda, lambda);</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">Display( EntriesOfHomalgMatrixAsListList( UnderlyingMatrix( TraceMap( delta ) ) ) );</span>
[ [ 9 ] ]
<span class="GAPprompt">gap></span> <span class="GAPinput">Display( EntriesOfHomalgMatrixAsListList( UnderlyingMatrix( CoTraceMap( delta ) ) ) );</span>
[ [ 9 ] ]
<span class="GAPprompt">gap></span> <span class="GAPinput">TraceMap( delta ) = CoTraceMap( delta );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">RankMorphism( a ) = CoRankMorphism( a );</span>
true
</pre></div>
<p><a id="X78D1062D78BE08C1" name="X78D1062D78BE08C1"></a></p>
<h4>2.2 <span class="Heading">Functors</span></h4>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">LoadPackage( "LinearAlgebraForCAP", false );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">ring := HomalgFieldOfRationals( );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">vec := MatrixCategory( ring );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">F := CapFunctor( "CohomForVec", [ vec, [ vec, true ] ], vec );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">obj_func := function( A, B ) return TensorProductOnObjects( A, DualOnObjects( B ) ); end;;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">mor_func := function( source, alpha, beta, range ) return TensorProductOnMorphismsWithGivenTensorProducts( source, alpha, DualOnMorphisms( beta ), range ); end;;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">AddObjectFunction( F, obj_func );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">AddMorphismFunction( F, mor_func );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Display( InputSignature( F ) );</span>
[ [ Category of matrices over Q, false ], [ Category of matrices over Q, true ] ]
<span class="GAPprompt">gap></span> <span class="GAPinput">V1 := TensorUnit( vec );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">V3 := DirectSum( V1, V1, V1 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">pi1 := ProjectionInFactorOfDirectSum( [ V1, V1 ], 1 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">pi2 := ProjectionInFactorOfDirectSum( [ V3, V1 ], 1 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">value1 := ApplyFunctor( F, pi1, pi2 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">input := ProductCategoryMorphism( SourceOfFunctor( F ), [ pi1, Opposite( pi2 ) ] );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">value2 := ApplyFunctor( F, input );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms( value1, value2 );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">InstallFunctor( F, "F_installation" );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">F_installation( pi1, pi2 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">F_installation( input );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">F_installationOnObjects( V1, V1 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">F_installationOnObjects( ProductCategoryObject( SourceOfFunctor( F ), [ V1, Opposite( V1 ) ] ) );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">F_installationOnMorphisms( pi1, pi2 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">F_installationOnMorphisms( input );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">F2 := CapFunctor( "CohomForVec2", ProductCategory( [ vec, Opposite( vec ) ] ), vec );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">AddObjectFunction( F2, a -> obj_func( a[1], Opposite( a[2] ) ) );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">AddMorphismFunction( F2, function( source, datum, range ) return mor_func( source, datum[1], Opposite( datum[2] ), range ); end );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">input := ProductCategoryMorphism( SourceOfFunctor( F2 ), [ pi1, Opposite( pi2 ) ] );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">value3 := ApplyFunctor( F2, input );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms( value1, value3 );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">Display( InputSignature( F2 ) );</span>
[ [ Product of: Category of matrices over Q, Opposite( Category of matrices over Q ), false ] ]
<span class="GAPprompt">gap></span> <span class="GAPinput">InstallFunctor( F2, "F_installation2" );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">F_installation2( input );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">F_installation2OnObjects( ProductCategoryObject( SourceOfFunctor( F2 ), [ V1, Opposite( V1 ) ] ) );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">F_installation2OnMorphisms( input );;</span>
</pre></div>
<p><a id="X85B1F5077BE75340" name="X85B1F5077BE75340"></a></p>
<h4>2.3 <span class="Heading">Solving (Homogeneous) Linear Systems</span></h4>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">LoadPackage( "LinearAlgebraForCAP", false );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">QQ := HomalgFieldOfRationals();;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">QQ_mat := MatrixCategory( QQ );</span>
Category of matrices over Q
<span class="GAPprompt">gap></span> <span class="GAPinput">t := TensorUnit( QQ_mat );</span>
<A vector space object over Q of dimension 1>
<span class="GAPprompt">gap></span> <span class="GAPinput">id_t := IdentityMorphism( t );</span>
<An identity morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">1*(11)*7 + 2*(12)*8 + 3*(13)*9;</span>
620
<span class="GAPprompt">gap></span> <span class="GAPinput">4*(11)*3 + 5*(12)*4 + 6*(13)*1;</span>
450
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha := [ [ 1/QQ * id_t, 2/QQ * id_t, 3/QQ * id_t ], [ 4/QQ * id_t, 5/QQ * id_t, 6/QQ * id_t ] ];;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">beta := [ [ 7/QQ * id_t, 8/QQ * id_t, 9/QQ * id_t ], [ 3/QQ * id_t, 4/QQ * id_t, 1/QQ * id_t ] ];;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">gamma := [ 620/QQ * id_t, 450/QQ * id_t ];;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">MereExistenceOfSolutionOfLinearSystemInAbCategory(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> QQ_mat, alpha, beta, gamma );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">MereExistenceOfUniqueSolutionOfLinearSystemInAbCategory(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> QQ_mat, alpha, beta, gamma );</span>
false
<span class="GAPprompt">gap></span> <span class="GAPinput">x := SolveLinearSystemInAbCategory( QQ_mat, alpha, beta, gamma );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">(1*7)/QQ * x[1] + (2*8)/QQ * x[2] + (3*9)/QQ * x[3] = gamma[1];</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">(4*3)/QQ * x[1] + (5*4)/QQ * x[2] + (6*1)/QQ * x[3] = gamma[2];</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">MereExistenceOfUniqueSolutionOfHomogeneousLinearSystemInAbCategory(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> QQ_mat, alpha, beta );</span>
false
<span class="GAPprompt">gap></span> <span class="GAPinput">B := BasisOfSolutionsOfHomogeneousLinearSystemInLinearCategory(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> QQ_mat, alpha, beta );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Length( B );</span>
1
<span class="GAPprompt">gap></span> <span class="GAPinput">(1*7)/QQ * B[1][1] + (2*8)/QQ * B[1][2] + (3*9)/QQ * B[1][3] = 0/QQ * id_t;</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">(4*3)/QQ * B[1][1] + (5*4)/QQ * B[1][2] + (6*1)/QQ * B[1][3] = 0/QQ * id_t;</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">2*(11)*5 + 3*(12)*7 + 9*(13)*2;</span>
596
<span class="GAPprompt">gap></span> <span class="GAPinput">Add( alpha, [ 2/QQ * id_t, 3/QQ * id_t, 9/QQ * id_t ] );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Add( beta, [ 5/QQ * id_t, 7/QQ * id_t, 2/QQ * id_t ] );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Add( gamma, 596/QQ * id_t );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">MereExistenceOfSolutionOfLinearSystemInAbCategory(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> QQ_mat, alpha, beta, gamma );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">MereExistenceOfUniqueSolutionOfLinearSystemInAbCategory(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> QQ_mat, alpha, beta, gamma );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">x := SolveLinearSystemInAbCategory( QQ_mat, alpha, beta, gamma );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">(1*7)/QQ * x[1] + (2*8)/QQ * x[2] + (3*9)/QQ * x[3] = gamma[1];</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">(4*3)/QQ * x[1] + (5*4)/QQ * x[2] + (6*1)/QQ * x[3] = gamma[2];</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">(2*5)/QQ * x[1] + (3*7)/QQ * x[2] + (9*2)/QQ * x[3] = gamma[3];</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">MereExistenceOfUniqueSolutionOfHomogeneousLinearSystemInAbCategory(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> QQ_mat, alpha, beta );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">B := BasisOfSolutionsOfHomogeneousLinearSystemInLinearCategory(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> QQ_mat, alpha, beta );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Length( B );</span>
0
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha := [ [ 2/QQ * id_t, 3/QQ * id_t ] ];;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">delta := [ [ 3/QQ * id_t, 3/QQ * id_t ] ];;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">B := BasisOfSolutionsOfHomogeneousDoubleLinearSystemInLinearCategory( alpha, delta );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Length( B );</span>
1
<span class="GAPprompt">gap></span> <span class="GAPinput">mor1 := PreCompose( alpha[1][1], B[1][1] ) + PreCompose( alpha[1][2], B[1][2] );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">mor2 := PreCompose( B[1][1], delta[1][1] ) + PreCompose( B[1][2], delta[1][2] );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">mor1 = mor2;</span>
true
</pre></div>
<p><a id="X852F59737EC57965" name="X852F59737EC57965"></a></p>
<h4>2.4 <span class="Heading">Homology object</span></h4>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">field := HomalgFieldOfRationals( );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">vec := MatrixCategory( field );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">A := MatrixCategoryObject( vec, 1 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">B := MatrixCategoryObject( vec, 2 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">C := MatrixCategoryObject( vec, 3 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha := VectorSpaceMorphism( A, HomalgMatrix( [ [ 1, 0, 0 ] ], 1, 3, field ), C );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">beta := VectorSpaceMorphism( C, HomalgMatrix( [ [ 1, 0 ], [ 1, 1 ], [ 1, 2 ] ], 3, 2, field ), B );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsZeroForMorphisms( PreCompose( alpha, beta ) );</span>
false
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> IdentityMorphism( HomologyObject( alpha, beta ) ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> HomologyObjectFunctorial( alpha, beta, IdentityMorphism( C ), alpha, beta )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">kernel_beta := KernelEmbedding( beta );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">K := Source( kernel_beta );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsIsomorphism(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> HomologyObjectFunctorial( </span>
<span class="GAPprompt">></span> <span class="GAPinput"> MorphismFromZeroObject( K ), </span>
<span class="GAPprompt">></span> <span class="GAPinput"> MorphismIntoZeroObject( K ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> kernel_beta,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> MorphismFromZeroObject( Source( beta ) ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> beta</span>
<span class="GAPprompt">></span> <span class="GAPinput"> )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">cokernel_alpha := CokernelProjection( alpha );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Co := Range( cokernel_alpha );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsIsomorphism(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> HomologyObjectFunctorial( </span>
<span class="GAPprompt">></span> <span class="GAPinput"> alpha,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> MorphismIntoZeroObject( Range( alpha ) ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> cokernel_alpha,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> MorphismFromZeroObject( Co ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> MorphismIntoZeroObject( Co )</span>
<span class="GAPprompt">></span> <span class="GAPinput"> )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">op := Opposite( vec );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha_op := Opposite( op, alpha );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">beta_op := Opposite( op, beta );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> IdentityMorphism( HomologyObject( beta_op, alpha_op ) ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> HomologyObjectFunctorial( beta_op, alpha_op, IdentityMorphism( Opposite( C ) ), beta_op, alpha_op )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">kernel_beta := KernelEmbedding( beta_op );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">K := Source( kernel_beta );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsIsomorphism(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> HomologyObjectFunctorial( </span>
<span class="GAPprompt">></span> <span class="GAPinput"> MorphismFromZeroObject( K ), </span>
<span class="GAPprompt">></span> <span class="GAPinput"> MorphismIntoZeroObject( K ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> kernel_beta,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> MorphismFromZeroObject( Source( beta_op ) ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> beta_op</span>
<span class="GAPprompt">></span> <span class="GAPinput"> )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">cokernel_alpha := CokernelProjection( alpha_op );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Co := Range( cokernel_alpha );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsIsomorphism(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> HomologyObjectFunctorial( </span>
<span class="GAPprompt">></span> <span class="GAPinput"> alpha_op,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> MorphismIntoZeroObject( Range( alpha_op ) ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> cokernel_alpha,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> MorphismFromZeroObject( Co ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> MorphismIntoZeroObject( Co )</span>
<span class="GAPprompt">></span> <span class="GAPinput"> )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
</pre></div>
<p><a id="X7CDB7FF27D734D2D" name="X7CDB7FF27D734D2D"></a></p>
<h4>2.5 <span class="Heading">Liftable</span></h4>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">field := HomalgFieldOfRationals( );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">vec := MatrixCategory( field );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">V := MatrixCategoryObject( vec, 1 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">W := MatrixCategoryObject( vec, 2 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha := VectorSpaceMorphism( V, HomalgMatrix( [ [ 1, -1 ] ], 1, 2, field ), W );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">beta := VectorSpaceMorphism( W, HomalgMatrix( [ [ 1, 2 ], [ 3, 4 ] ], 2, 2, field ), W );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsLiftable( alpha, beta );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsLiftable( beta, alpha );</span>
false
<span class="GAPprompt">gap></span> <span class="GAPinput">IsLiftableAlongMonomorphism( beta, alpha );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">gamma := VectorSpaceMorphism( W, HomalgMatrix( [ [ 1 ], [ 1 ] ], 2, 1, field ), V );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsColiftable( beta, gamma );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsColiftable( gamma, beta );</span>
false
<span class="GAPprompt">gap></span> <span class="GAPinput">IsColiftableAlongEpimorphism( beta, gamma );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">PreCompose( PreInverseForMorphisms( gamma ), gamma ) = IdentityMorphism( V );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">PreCompose( alpha, PostInverseForMorphisms( alpha ) ) = IdentityMorphism( V );</span>
true
</pre></div>
<p><a id="X797080CE873BB56D" name="X797080CE873BB56D"></a></p>
<h4>2.6 <span class="Heading">Monoidal structure</span></h4>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">LoadPackage( "LinearAlgebraForCAP", false );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">Q := HomalgFieldOfRationals();;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">vec := MatrixCategory( Q );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">a := MatrixCategoryObject( vec, 1 );</span>
<A vector space object over Q of dimension 1>
<span class="GAPprompt">gap></span> <span class="GAPinput">b := MatrixCategoryObject( vec, 2 );</span>
<A vector space object over Q of dimension 2>
<span class="GAPprompt">gap></span> <span class="GAPinput">c := MatrixCategoryObject( vec, 3 );</span>
<A vector space object over Q of dimension 3>
<span class="GAPprompt">gap></span> <span class="GAPinput">z := ZeroObject( vec );</span>
<A vector space object over Q of dimension 0>
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha := VectorSpaceMorphism( a, [ [ 1, 0 ] ], b );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">beta := VectorSpaceMorphism( b,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> [ [ 1, 0, 0 ], [ 0, 1, 0 ] ], c );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">gamma := VectorSpaceMorphism( c,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> [ [ 0, 1, 1 ], [ 1, 0, 1 ], [ 1, 1, 0 ] ], c );</span>
<A morphism in Category of matrices over Q>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> TensorProductOnMorphisms( alpha, beta ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> TensorProductOnMorphisms( beta, alpha )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
false
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> AssociatorRightToLeft( a, b, c ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> IdentityMorphism( TensorProductOnObjects( a, TensorProductOnObjects( b, c ) ) )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> gamma,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> LambdaElimination( c, c, LambdaIntroduction( gamma ) )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsZeroForMorphisms( TraceMap( gamma ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> RankMorphism( DirectSum( a, b ) ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> RankMorphism( c )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> Braiding( b, c ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> IdentityMorphism( TensorProductOnObjects( b, c ) )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
false
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> PreCompose( Braiding( b, c ), Braiding( c, b ) ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> IdentityMorphism( TensorProductOnObjects( b, c ) )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
</pre></div>
<p><a id="X8218390A785F1EDB" name="X8218390A785F1EDB"></a></p>
<h4>2.7 <span class="Heading">MorphismFromSourceToPushout and MorphismFromFiberProductToSink</span></h4>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">field := HomalgFieldOfRationals( );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">vec := MatrixCategory( field );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">A := MatrixCategoryObject( vec, 3 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">B := MatrixCategoryObject( vec, 2 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha := VectorSpaceMorphism( B, HomalgMatrix( [ [ 1, -1, 1 ], [ 1, 1, 1 ] ], 2, 3, field ), A );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">beta := VectorSpaceMorphism( B, HomalgMatrix( [ [ 1, 2, 1 ], [ 2, 1, 1 ] ], 2, 3, field ), A );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">m := MorphismFromFiberProductToSink( [ alpha, beta ] );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> m,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> PreCompose( ProjectionInFactorOfFiberProduct( [ alpha, beta ], 1 ), alpha )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> m,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> PreCompose( ProjectionInFactorOfFiberProduct( [ alpha, beta ], 2 ), beta )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput">MorphismFromKernelObjectToSink( alpha ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> PreCompose( KernelEmbedding( alpha ), alpha )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha_p := DualOnMorphisms( alpha );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">beta_p := DualOnMorphisms( beta );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">m_p := MorphismFromSourceToPushout( [ alpha_p, beta_p ] );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> m_p,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> PreCompose( alpha_p, InjectionOfCofactorOfPushout( [ alpha_p, beta_p ], 1 ) )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> m_p,</span>
<span class="GAPprompt">></span> <span class="GAPinput"> PreCompose( beta_p, InjectionOfCofactorOfPushout( [ alpha_p, beta_p ], 2 ) )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> MorphismFromSourceToCokernelObject( alpha_p ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> PreCompose( alpha_p, CokernelProjection( alpha_p ) )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
</pre></div>
<p><a id="X84410C637B3C1D0E" name="X84410C637B3C1D0E"></a></p>
<h4>2.8 <span class="Heading">Opposite category</span></h4>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">LoadPackage( "LinearAlgebraForCAP", ">= 2024.01-04", false );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">QQ := HomalgFieldOfRationals();;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">vec := MatrixCategory( QQ );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">op := Opposite( vec );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Perform( ListKnownCategoricalProperties( op ), Display );</span>
IsAbCategory
IsAbelianCategory
IsAbelianCategoryWithEnoughInjectives
IsAbelianCategoryWithEnoughProjectives
IsAdditiveCategory
IsAdditiveMonoidalCategory
IsBraidedMonoidalCategory
IsCategoryWithCoequalizers
IsCategoryWithCokernels
IsCategoryWithEqualizers
IsCategoryWithInitialObject
IsCategoryWithKernels
IsCategoryWithTerminalObject
IsCategoryWithZeroObject
IsClosedMonoidalCategory
IsCoclosedMonoidalCategory
IsEnrichedOverCommutativeRegularSemigroup
IsEquippedWithHomomorphismStructure
IsLinearCategoryOverCommutativeRing
IsLinearCategoryOverCommutativeRingWithFinitelyGeneratedFreeExternalHoms
IsMonoidalCategory
IsPreAbelianCategory
IsRigidSymmetricClosedMonoidalCategory
IsRigidSymmetricCoclosedMonoidalCategory
IsSkeletalCategory
IsStrictMonoidalCategory
IsSymmetricClosedMonoidalCategory
IsSymmetricCoclosedMonoidalCategory
IsSymmetricMonoidalCategory
<span class="GAPprompt">gap></span> <span class="GAPinput">V1 := Opposite( TensorUnit( vec ) );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">V2 := DirectSum( V1, V1 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">V3 := DirectSum( V1, V2 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">V4 := DirectSum( V1, V3 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">V5 := DirectSum( V1, V4 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsWellDefined( MorphismBetweenDirectSums( op, [ ], [ ], [ V1 ] ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsWellDefined( MorphismBetweenDirectSums( op, [ V1 ], [ [ ] ], [ ] ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha13 := InjectionOfCofactorOfDirectSum( [ V1, V2 ], 1 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha14 := InjectionOfCofactorOfDirectSum( [ V1, V2, V1 ], 3 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha15 := InjectionOfCofactorOfDirectSum( [ V2, V1, V2 ], 2 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha23 := InjectionOfCofactorOfDirectSum( [ V2, V1 ], 1 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha24 := InjectionOfCofactorOfDirectSum( [ V1, V2, V1 ], 2 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha25 := InjectionOfCofactorOfDirectSum( [ V2, V2, V1 ], 1 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">mat := [</span>
<span class="GAPprompt">></span> <span class="GAPinput"> [ alpha13, alpha14, alpha15 ],</span>
<span class="GAPprompt">></span> <span class="GAPinput"> [ alpha23, alpha24, alpha25 ]</span>
<span class="GAPprompt">></span> <span class="GAPinput">];;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">mor := MorphismBetweenDirectSums( mat );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsWellDefined( mor );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsWellDefined( Opposite( mor ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms(</span>
<span class="GAPprompt">></span> <span class="GAPinput"> UniversalMorphismFromImage( mor, [ CoastrictionToImage( mor ), ImageEmbedding( mor ) ] ),</span>
<span class="GAPprompt">></span> <span class="GAPinput"> IdentityMorphism( ImageObject( mor ) )</span>
<span class="GAPprompt">></span> <span class="GAPinput">);</span>
true
</pre></div>
<p><a id="X7F34E29281DF3FCE" name="X7F34E29281DF3FCE"></a></p>
<h4>2.9 <span class="Heading">PreComposeList and PostComposeList</span></h4>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">field := HomalgFieldOfRationals( );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">vec := MatrixCategory( field );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">A := MatrixCategoryObject( vec, 1 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">B := MatrixCategoryObject( vec, 2 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">C := MatrixCategoryObject( vec, 3 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha := VectorSpaceMorphism( A, HomalgMatrix( [ [ 1, 0, 0 ] ], 1, 3, field ), C );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">beta := VectorSpaceMorphism( C, HomalgMatrix( [ [ 1, 0 ], [ 1, 1 ], [ 1, 2 ] ], 3, 2, field ), B );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms( PreCompose( alpha, beta ), PostCompose( beta, alpha ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms( PreComposeList( A, [ ], A ), IdentityMorphism( A ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms( PreComposeList( A, [ alpha ], C ), alpha );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms( PreComposeList( A, [ alpha, beta ], B ), PreCompose( alpha, beta ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms( PostComposeList( A, [ ], A ), IdentityMorphism( A ) );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms( PostComposeList( A, [ alpha ], C ), alpha );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCongruentForMorphisms( PostComposeList( A, [ beta, alpha ], B ), PostCompose( beta, alpha ) );</span>
true
</pre></div>
<p><a id="X87F5609A7B33C58C" name="X87F5609A7B33C58C"></a></p>
<h4>2.10 <span class="Heading">Split epi summand</span></h4>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">LoadPackage( "LinearAlgebraForCAP", false );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">Q := HomalgFieldOfRationals();;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Qmat := MatrixCategory( Q );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">a := MatrixCategoryObject( Qmat, 3 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">b := MatrixCategoryObject( Qmat, 4 );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">homalg_matrix := HomalgMatrix( [ [ 1, 0, 0, 0 ],</span>
<span class="GAPprompt">></span> <span class="GAPinput"> [ 0, 1, 0, -1 ],</span>
<span class="GAPprompt">></span> <span class="GAPinput"> [ -1, 0, 2, 1 ] ], 3, 4, Q );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">alpha := VectorSpaceMorphism( a, homalg_matrix, b );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">beta := SomeReductionBySplitEpiSummand( alpha );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsWellDefinedForMorphisms( beta );</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">Dimension( Source( beta ) );</span>
0
<span class="GAPprompt">gap></span> <span class="GAPinput">Dimension( Range( beta ) );</span>
1
<span class="GAPprompt">gap></span> <span class="GAPinput">gamma := SomeReductionBySplitEpiSummand_MorphismFromInputRange( alpha );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Display( EntriesOfHomalgMatrixAsListList( UnderlyingMatrix( gamma ) ) );</span>
[ [ 0 ], [ 1 ], [ -1/2 ], [ 1 ] ]
</pre></div>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput"># @drop_example_in_Julia: differences in the output of (Safe)RightDivide, see https://github.com/homalg-project/MatricesForHomalg.jl/issues/50</span>
<span class="GAPprompt">></span> <span class="GAPinput">delta := SomeReductionBySplitEpiSummand_MorphismToInputRange( alpha );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">Display( EntriesOfHomalgMatrixAsListList( UnderlyingMatrix( delta ) ) );</span>
[ [ 0, 1, 0, 0 ] ]
</pre></div>
<p><a id="X7DCD99628504B810" name="X7DCD99628504B810"></a></p>
<h4>2.11 <span class="Heading">Kernel</span></h4>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">Q := HomalgFieldOfRationals();;</s | | |