@@ -1057,7 +1057,7 @@ InstallGlobalFunction( ADD_COEVALUATION_MORPHISM_RIGHT,
10571057
10581058end );
10591059
1060- InstallGlobalFunction( ADD_LIFT_AND_COLIFT_LEFT,
1060+ InstallGlobalFunction( ADD_LIFT_AND_COLIFT_LEFT,
10611061
10621062 function ( category )
10631063 local homalg_ring, lift_via_compiled_linear_system_func, colift_via_compiled_linear_system_func;
@@ -1088,20 +1088,11 @@ InstallGlobalFunction( ADD_LIFT_AND_COLIFT_LEFT,
10881088 M := UnderlyingMatrix( Source( morphism_2 ) );
10891089
10901090 v := NrColumns( M );
1091-
1091+
10921092 s := NrColumns( P );
10931093
10941094 N := UnderlyingMatrix( Range( morphism_1 ) );
10951095
1096- # NrColumns( N ) = 0 implies coker(N)=0 and s = 0 implies coker(P)=0, hence morphism_1 is zero, and the zero morphism can always be lifted.
1097- if NrColumns( N ) = 0 or s = 0 then
1098- return ZeroMorphism( Source( morphism_1 ), Source( morphism_2 ) );
1099- fi ;
1100-
1101- # if NrColumns(M)=0 then M is zero, hence lift exists iff morphism_1 is zero.
1102- if NrColumns( M ) = 0 and IsZeroForMorphisms( morphism_1 ) then
1103- return ZeroMorphism( Source( morphism_1 ), Source( morphism_2 ) );
1104- fi ;
11051096 A := UnderlyingMatrix( morphism_1 );
11061097
11071098 B := UnderlyingMatrix( morphism_2 );
@@ -1110,31 +1101,23 @@ InstallGlobalFunction( ADD_LIFT_AND_COLIFT_LEFT,
11101101
11111102 N_tr_I := KroneckerMat( TransposedMatrix( N ), HomalgIdentityMatrix( NrColumns( P ) ,homalg_ring ) );
11121103
1113- zero_1 := HomalgZeroMatrix( NrRows( A )* NrColumns( A ), NrRows( P )* NrRows( M ), homalg_ring );
1104+ zero_1 := HomalgZeroMatrix( NrRows( A ) * NrColumns( A ), NrRows( P ) * NrRows( M ), homalg_ring );
11141105
11151106 mat1 := UnionOfColumns( B_tr_I, N_tr_I, zero_1 );
11161107
11171108 I_P := KroneckerMat( HomalgIdentityMatrix( NrColumns( M ) ,homalg_ring ), P );
11181109
1119- zero_2 := HomalgZeroMatrix( NrRows( P )* NrColumns( M ), NrRows( A )* NrRows( N ), homalg_ring );
1110+ zero_2 := HomalgZeroMatrix( NrRows( P ) * NrColumns( M ), NrRows( A ) * NrRows( N ), homalg_ring );
11201111
1121- M_tr_I := KroneckerMat( TransposedMatrix( M ), HomalgIdentityMatrix( NrRows( P ) , homalg_ring ) );
1112+ M_tr_I := KroneckerMat( TransposedMatrix( M ), HomalgIdentityMatrix( NrRows( P ), homalg_ring ) );
11221113
11231114 mat2 := UnionOfColumns( I_P, zero_2, M_tr_I );
11241115
11251116 mat := UnionOfRows( mat1, mat2 );
11261117
1127- if NrColumns( A ) <= 1 then
1128-
1129- vec_A := A;
1130-
1131- else
1132-
1133- vec_A := UnionOfRows( List( [ 1 .. NrColumns( A ) ] , i-> CertainColumns( A, [ i ] ) ) );
1134-
1135- fi ;
1118+ vec_A := ConvertMatrixToColumn( A );
11361119
1137- vec_zero := HomalgZeroMatrix( NrRows( P )* NrColumns( M ), 1 , homalg_ring );
1120+ vec_zero := HomalgZeroMatrix( NrRows( P ) * NrColumns( M ), NrColumns( vec_A ) , homalg_ring );
11381121
11391122 vec := UnionOfRows( vec_A, vec_zero );
11401123
@@ -1155,11 +1138,7 @@ InstallGlobalFunction( ADD_LIFT_AND_COLIFT_LEFT,
11551138
11561139 sol := CallFuncList( LeftDivide, lift_via_compiled_linear_system_func( morphism_1, morphism_2 ) );
11571140
1158- if v <= 1 then
1159- XX := CertainRows( sol, [ 1 .. s ] );
1160- else
1161- XX := UnionOfColumns( List( [ 1 .. v ] , i-> CertainRows( sol, [ (i- 1 )* s+ 1 .. i* s ] ) ) );
1162- fi ;
1141+ XX := ConvertColumnToMatrix( CertainRows( sol, [ 1 .. s * v ] ), s, v );
11631142
11641143 return PresentationMorphism( cat, Source( morphism_1 ), XX, Source( morphism_2 ) );
11651144
@@ -1195,21 +1174,11 @@ InstallGlobalFunction( ADD_LIFT_AND_COLIFT_LEFT,
11951174 M := UnderlyingMatrix( Range( morphism_1 ) );
11961175
11971176 v := NrColumns( M );
1198-
1177+
11991178 s := NrColumns( I );
12001179
12011180 N := UnderlyingMatrix( Source( morphism_1 ) );
12021181
1203- # NrColumns( N ) = 0 implies coker(N)=0 and s = 0 implies coker(I)=0, hence morphism_2 is zero, and the zero morphism can always be colifted.
1204- if NrColumns( N ) = 0 or s = 0 then
1205- return ZeroMorphism( Range( morphism_1 ), Range( morphism_2 ) );
1206- fi ;
1207-
1208- # if NrColumns(M)=0 then M is zero, hence colift exists iff morphism_2 is zero.
1209- if NrColumns( M ) = 0 and IsZeroForMorphisms( morphism_2 ) then
1210- return ZeroMorphism( Range( morphism_1 ), Range( morphism_2 ) );
1211- fi ;
1212-
12131182 B := UnderlyingMatrix( morphism_1 );
12141183
12151184 A := UnderlyingMatrix( morphism_2 );
@@ -1226,12 +1195,8 @@ InstallGlobalFunction( ADD_LIFT_AND_COLIFT_LEFT,
12261195
12271196 A_over_zero := UnionOfRows( A, zero_mat );
12281197
1229- if NrColumns( A ) <= 1 then
1230- vec := A_over_zero;
1231- else
1232- vec := UnionOfRows( List( [ 1 .. NrColumns( A ) ] , i-> CertainColumns( A_over_zero, [ i ] ) ) );
1233- fi ;
1234-
1198+ vec := ConvertMatrixToColumn( A_over_zero );
1199+
12351200 return [ mat, vec ] ;
12361201
12371202 end ;
@@ -1249,15 +1214,7 @@ InstallGlobalFunction( ADD_LIFT_AND_COLIFT_LEFT,
12491214
12501215 sol := CallFuncList( LeftDivide, colift_via_compiled_linear_system_func( morphism_1, morphism_2 ) );
12511216
1252- v := NrColumns( M );
1253-
1254- s := NrColumns( I );
1255-
1256- if s <= 1 then
1257- XX := CertainRows( sol, [ 1 .. v ] );
1258- else
1259- XX := UnionOfColumns( List( [ 1 .. s ] , i-> CertainRows( sol, [ (i- 1 )* v+ 1 .. i* v ] ) ) );
1260- fi ;
1217+ XX := ConvertColumnToMatrix( CertainRows( sol, [ 1 .. v * s ] ), v, s );
12611218
12621219 return PresentationMorphism( cat, Range( morphism_1 ), XX, Range( morphism_2 ) );
12631220
@@ -1272,21 +1229,21 @@ InstallGlobalFunction( ADD_LIFT_AND_COLIFT_LEFT,
12721229end );
12731230
12741231# #
1275- InstallGlobalFunction( ADD_LIFT_AND_COLIFT_RIGHT,
1232+ InstallGlobalFunction( ADD_LIFT_AND_COLIFT_RIGHT,
12761233
12771234 function ( category )
12781235 local homalg_ring, lift_via_compiled_linear_system_func, colift_via_compiled_linear_system_func;
12791236
12801237 homalg_ring := category!. ring_for_representation_category;
12811238
12821239 lift_via_compiled_linear_system_func := function ( morphism_1, morphism_2 )
1283- local Pt, Nt, Mt, At, Bt, B_tr_I, N_tr_I, zero_1,
1240+ local Pt, Nt, Mt, At, Bt, B_tr_I, N_tr_I, zero_1,
12841241 mat1, mat2, I_P, zero_2, M_tr_I, mat, vec_A, vec_zero, vec, v, s;
12851242 # rxs
12861243 # P
12871244 # |
1288- # uxr | mxr
1289- # X (A)
1245+ # uxr | mxr
1246+ # X (A)
12901247 # |
12911248 # V
12921249 # uxv mxu mxn
@@ -1296,10 +1253,10 @@ InstallGlobalFunction( ADD_LIFT_AND_COLIFT_RIGHT,
12961253 # We need to solve the system
12971254 # B*X = A mod N
12981255 # X*P + M*Y = 0
1299- # I.e., looking for X, Y, Z such that
1256+ # I.e., looking for X, Y, Z such that
13001257 # B*X + N*Y = A
13011258 # X*P + M*Z = 0
1302- # which is equivalent to
1259+ # which is equivalent to
13031260 # XX*B^t + YY*N^t = A^t
13041261 # P^t*XX + ZZ*M^t = 0
13051262 # which can be solved exactly as Lift in left presentations case.
@@ -1314,47 +1271,31 @@ InstallGlobalFunction( ADD_LIFT_AND_COLIFT_RIGHT,
13141271
13151272 Nt := TransposedMatrix( UnderlyingMatrix( Range( morphism_1 ) ) );
13161273
1317- if NrRows( Nt ) = 0 or s = 0 then
1318- return ZeroMorphism( Source( morphism_1 ), Source( morphism_2 ) );
1319- fi ;
1320-
1321- if NrRows( Mt ) = 0 and IsZeroForMorphisms( morphism_1 ) then
1322- return ZeroMorphism( Source( morphism_1 ), Source( morphism_2 ) );
1323- fi ;
1324-
13251274 At := TransposedMatrix( UnderlyingMatrix( morphism_1 ) );
13261275
13271276 Bt := TransposedMatrix( UnderlyingMatrix( morphism_2 ) );
13281277
13291278 B_tr_I := KroneckerMat( TransposedMatrix( Bt ), HomalgIdentityMatrix( NrColumns( Pt ), homalg_ring ) );
13301279
1331- N_tr_I := KroneckerMat( TransposedMatrix( Nt ), HomalgIdentityMatrix( NrColumns( Pt ) , homalg_ring ) );
1280+ N_tr_I := KroneckerMat( TransposedMatrix( Nt ), HomalgIdentityMatrix( NrColumns( Pt ), homalg_ring ) );
13321281
1333- zero_1 := HomalgZeroMatrix( NrRows( At )* NrColumns( At ), NrRows( Pt )* NrRows( Mt ), homalg_ring );
1282+ zero_1 := HomalgZeroMatrix( NrRows( At ) * NrColumns( At ), NrRows( Pt ) * NrRows( Mt ), homalg_ring );
13341283
13351284 mat1 := UnionOfColumns( B_tr_I, N_tr_I, zero_1 );
13361285
1337- I_P := KroneckerMat( HomalgIdentityMatrix( NrColumns( Mt ) , homalg_ring ), Pt );
1286+ I_P := KroneckerMat( HomalgIdentityMatrix( NrColumns( Mt ), homalg_ring ), Pt );
13381287
1339- zero_2 := HomalgZeroMatrix( NrRows( Pt )* NrColumns( Mt ), NrRows( At )* NrRows( Nt ), homalg_ring );
1288+ zero_2 := HomalgZeroMatrix( NrRows( Pt ) * NrColumns( Mt ), NrRows( At ) * NrRows( Nt ), homalg_ring );
13401289
1341- M_tr_I := KroneckerMat( TransposedMatrix( Mt ), HomalgIdentityMatrix( NrRows( Pt ) , homalg_ring ) );
1290+ M_tr_I := KroneckerMat( TransposedMatrix( Mt ), HomalgIdentityMatrix( NrRows( Pt ), homalg_ring ) );
13421291
13431292 mat2 := UnionOfColumns( I_P, zero_2, M_tr_I );
13441293
13451294 mat := UnionOfRows( mat1, mat2 );
13461295
1347- if NrColumns( At ) <= 1 then
1348-
1349- vec_A := At;
1350-
1351- else
1352-
1353- vec_A := UnionOfRows( List( [ 1 .. NrColumns( At ) ] , i-> CertainColumns( At, [ i ] ) ) );
1354-
1355- fi ;
1296+ vec_A := ConvertMatrixToColumn( At );
13561297
1357- vec_zero := HomalgZeroMatrix( NrRows( Pt )* NrColumns( Mt ), 1 , homalg_ring );
1298+ vec_zero := HomalgZeroMatrix( NrRows( Pt ) * NrColumns( Mt ), NrColumns( vec_A ) , homalg_ring );
13581299
13591300 vec := UnionOfRows( vec_A, vec_zero );
13601301
@@ -1363,7 +1304,7 @@ InstallGlobalFunction( ADD_LIFT_AND_COLIFT_RIGHT,
13631304 end ;
13641305
13651306 AddLift( category, function ( cat, morphism_1, morphism_2 )
1366- local Pt, Mt, v, s, sol, XX ;
1307+ local Pt, Mt, v, s, sol, XX_tr ;
13671308
13681309 Pt := TransposedMatrix( UnderlyingMatrix( Source( morphism_1 ) ) );
13691310 Mt := TransposedMatrix( UnderlyingMatrix( Source( morphism_2 ) ) );
@@ -1374,13 +1315,9 @@ InstallGlobalFunction( ADD_LIFT_AND_COLIFT_RIGHT,
13741315
13751316 sol := CallFuncList( LeftDivide, lift_via_compiled_linear_system_func( morphism_1, morphism_2 ) );
13761317
1377- if v <= 1 then
1378- XX := TransposedMatrix( CertainRows( sol, [ 1 .. s ] ) );
1379- else
1380- XX := TransposedMatrix( UnionOfColumns( List( [ 1 .. v ] , i-> CertainRows( sol, [ (i- 1 )* s+ 1 .. i* s ] ) ) ) );
1381- fi ;
1318+ XX_tr := ConvertColumnToMatrix( CertainRows( sol, [ 1 .. s * v ] ), s, v );
13821319
1383- return PresentationMorphism( cat, Source( morphism_1 ), XX , Source( morphism_2 ) );
1320+ return PresentationMorphism( cat, Source( morphism_1 ), TransposedMatrix( XX_tr ) , Source( morphism_2 ) );
13841321
13851322 end );
13861323
@@ -1398,19 +1335,11 @@ InstallGlobalFunction( ADD_LIFT_AND_COLIFT_RIGHT,
13981335 Mt := TransposedMatrix( UnderlyingMatrix( Range( morphism_1 ) ) );
13991336
14001337 v := NrColumns( Mt );
1401-
1338+
14021339 s := NrColumns( It );
1403-
1404- Nt := TransposedMatrix( UnderlyingMatrix( Source( morphism_1 ) ) );
14051340
1406- if NrRows( Nt ) = 0 or s = 0 then
1407- return ZeroMorphism( Range( morphism_1 ), Range( morphism_2 ) );
1408- fi ;
1341+ Nt := TransposedMatrix( UnderlyingMatrix( Source( morphism_1 ) ) );
14091342
1410- if NrRows( Mt ) = 0 and IsZeroForMorphisms( morphism_2 ) then
1411- return ZeroMorphism( Range( morphism_1 ), Range( morphism_2 ) );
1412- fi ;
1413-
14141343 Bt := TransposedMatrix( UnderlyingMatrix( morphism_1 ) );
14151344
14161345 At := TransposedMatrix( UnderlyingMatrix( morphism_2 ) );
@@ -1427,18 +1356,14 @@ InstallGlobalFunction( ADD_LIFT_AND_COLIFT_RIGHT,
14271356
14281357 A_over_zero := UnionOfRows( At, zero_mat );
14291358
1430- if NrColumns( At ) <= 1 then
1431- vec := A_over_zero;
1432- else
1433- vec := UnionOfRows( List( [ 1 .. NrColumns( At ) ] , i-> CertainColumns( A_over_zero, [ i ] ) ) );
1434- fi ;
1435-
1359+ vec := ConvertMatrixToColumn( A_over_zero );
1360+
14361361 return [ mat, vec ] ;
14371362
14381363 end ;
14391364
14401365 AddColift( category, function ( cat, morphism_1, morphism_2 )
1441- local It, Mt, v, s, sol, XX ;
1366+ local It, Mt, v, s, sol, XX_tr ;
14421367
14431368 It := TransposedMatrix( UnderlyingMatrix( Range( morphism_2 ) ) );
14441369
@@ -1450,17 +1375,9 @@ InstallGlobalFunction( ADD_LIFT_AND_COLIFT_RIGHT,
14501375
14511376 sol := CallFuncList( LeftDivide, colift_via_compiled_linear_system_func( morphism_1, morphism_2 ) );
14521377
1453- v := NrColumns( Mt );
1454-
1455- s := NrColumns( It );
1456-
1457- if s <= 1 then
1458- XX := TransposedMatrix( CertainRows( sol, [ 1 .. v ] ) );
1459- else
1460- XX := TransposedMatrix( UnionOfColumns( List( [ 1 .. s ] , i-> CertainRows( sol, [ (i- 1 )* v+ 1 .. i* v ] ) ) ) );
1461- fi ;
1378+ XX_tr := ConvertColumnToMatrix( CertainRows( sol, [ 1 .. v * s ] ), v, s );
14621379
1463- return PresentationMorphism( cat, Range( morphism_1 ), XX , Range( morphism_2 ) );
1380+ return PresentationMorphism( cat, Range( morphism_1 ), TransposedMatrix( XX_tr ) , Range( morphism_2 ) );
14641381
14651382 end , 1000 );
14661383
0 commit comments