@@ -1057,7 +1057,7 @@ end );
1057
1057
1058
1058
end );
1059
1059
1060
- @InstallGlobalFunction ( ADD_LIFT_AND_COLIFT_LEFT,
1060
+ @InstallGlobalFunction ( ADD_LIFT_AND_COLIFT_LEFT,
1061
1061
1062
1062
function ( category )
1063
1063
local homalg_ring, lift_via_compiled_linear_system_func, colift_via_compiled_linear_system_func;
@@ -1088,20 +1088,11 @@ end );
1088
1088
M = UnderlyingMatrix ( Source ( morphism_2 ) );
1089
1089
1090
1090
v = NrColumns ( M );
1091
-
1091
+
1092
1092
s = NrColumns ( P );
1093
1093
1094
1094
N = UnderlyingMatrix ( Range ( morphism_1 ) );
1095
1095
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 || s == 0 )
1098
- return ZeroMorphism ( Source ( morphism_1 ), Source ( morphism_2 ) );
1099
- end ;
1100
-
1101
- # if NrColumns(M)=0 then M is zero, hence lift exists iff morphism_1 is zero.
1102
- if (NrColumns ( M ) == 0 && IsZeroForMorphisms ( morphism_1 ))
1103
- return ZeroMorphism ( Source ( morphism_1 ), Source ( morphism_2 ) );
1104
- end ;
1105
1096
A = UnderlyingMatrix ( morphism_1 );
1106
1097
1107
1098
B = UnderlyingMatrix ( morphism_2 );
@@ -1110,31 +1101,23 @@ end );
1110
1101
1111
1102
N_tr_I = KroneckerMat ( TransposedMatrix ( N ), HomalgIdentityMatrix ( NrColumns ( P ) ,homalg_ring ) );
1112
1103
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 );
1114
1105
1115
1106
mat1 = UnionOfColumns ( B_tr_I, N_tr_I, zero_1 );
1116
1107
1117
1108
I_P = KroneckerMat ( HomalgIdentityMatrix ( NrColumns ( M ) ,homalg_ring ), P );
1118
1109
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 );
1120
1111
1121
- M_tr_I = KroneckerMat ( TransposedMatrix ( M ), HomalgIdentityMatrix ( NrRows ( P ) , homalg_ring ) );
1112
+ M_tr_I = KroneckerMat ( TransposedMatrix ( M ), HomalgIdentityMatrix ( NrRows ( P ), homalg_ring ) );
1122
1113
1123
1114
mat2 = UnionOfColumns ( I_P, zero_2, M_tr_I );
1124
1115
1125
1116
mat = UnionOfRows ( mat1, mat2 );
1126
1117
1127
- if (NrColumns ( A ) <= 1 )
1128
-
1129
- vec_A = A;
1130
-
1131
- else
1132
-
1133
- vec_A = UnionOfRows ( List ( (1 ): (NrColumns ( A )), i-> CertainColumns ( A, [ i ] ) ) );
1134
-
1135
- end ;
1118
+ vec_A = ConvertMatrixToColumn ( A );
1136
1119
1137
- vec_zero = HomalgZeroMatrix ( NrRows ( P )* NrColumns ( M ), 1 , homalg_ring );
1120
+ vec_zero = HomalgZeroMatrix ( NrRows ( P ) * NrColumns ( M ), NrColumns ( vec_A ) , homalg_ring );
1138
1121
1139
1122
vec = UnionOfRows ( vec_A, vec_zero );
1140
1123
@@ -1155,11 +1138,7 @@ end );
1155
1138
1156
1139
sol = CallFuncList ( LeftDivide, lift_via_compiled_linear_system_func ( morphism_1, morphism_2 ) );
1157
1140
1158
- if (v <= 1 )
1159
- XX = CertainRows ( sol, [ 1 .. s ] );
1160
- else
1161
- XX = UnionOfColumns ( List ( (1 ): (v), i-> CertainRows ( sol, [ (i- 1 )* s+ 1 .. i* s ] ) ) );
1162
- end ;
1141
+ XX = ConvertColumnToMatrix ( CertainRows ( sol, (1 ): (s * v) ), s, v );
1163
1142
1164
1143
return PresentationMorphism ( cat, Source ( morphism_1 ), XX, Source ( morphism_2 ) );
1165
1144
@@ -1195,21 +1174,11 @@ end );
1195
1174
M = UnderlyingMatrix ( Range ( morphism_1 ) );
1196
1175
1197
1176
v = NrColumns ( M );
1198
-
1177
+
1199
1178
s = NrColumns ( I );
1200
1179
1201
1180
N = UnderlyingMatrix ( Source ( morphism_1 ) );
1202
1181
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 || s == 0 )
1205
- return ZeroMorphism ( Range ( morphism_1 ), Range ( morphism_2 ) );
1206
- end ;
1207
-
1208
- # if NrColumns(M)=0 then M is zero, hence colift exists iff morphism_2 is zero.
1209
- if (NrColumns ( M ) == 0 && IsZeroForMorphisms ( morphism_2 ))
1210
- return ZeroMorphism ( Range ( morphism_1 ), Range ( morphism_2 ) );
1211
- end ;
1212
-
1213
1182
B = UnderlyingMatrix ( morphism_1 );
1214
1183
1215
1184
A = UnderlyingMatrix ( morphism_2 );
@@ -1226,12 +1195,8 @@ end );
1226
1195
1227
1196
A_over_zero = UnionOfRows ( A, zero_mat );
1228
1197
1229
- if (NrColumns ( A ) <= 1 )
1230
- vec = A_over_zero;
1231
- else
1232
- vec = UnionOfRows ( List ( (1 ): (NrColumns ( A )), i-> CertainColumns ( A_over_zero, [ i ] ) ) );
1233
- end ;
1234
-
1198
+ vec = ConvertMatrixToColumn ( A_over_zero );
1199
+
1235
1200
return [ mat, vec ];
1236
1201
1237
1202
end ;
@@ -1249,15 +1214,7 @@ end );
1249
1214
1250
1215
sol = CallFuncList ( LeftDivide, colift_via_compiled_linear_system_func ( morphism_1, morphism_2 ) );
1251
1216
1252
- v = NrColumns ( M );
1253
-
1254
- s = NrColumns ( I );
1255
-
1256
- if (s <= 1 )
1257
- XX = CertainRows ( sol, [ 1 .. v ] );
1258
- else
1259
- XX = UnionOfColumns ( List ( (1 ): (s), i-> CertainRows ( sol, [ (i- 1 )* v+ 1 .. i* v ] ) ) );
1260
- end ;
1217
+ XX = ConvertColumnToMatrix ( CertainRows ( sol, (1 ): (v * s) ), v, s );
1261
1218
1262
1219
return PresentationMorphism ( cat, Range ( morphism_1 ), XX, Range ( morphism_2 ) );
1263
1220
@@ -1272,21 +1229,21 @@ end );
1272
1229
end );
1273
1230
1274
1231
# #
1275
- @InstallGlobalFunction ( ADD_LIFT_AND_COLIFT_RIGHT,
1232
+ @InstallGlobalFunction ( ADD_LIFT_AND_COLIFT_RIGHT,
1276
1233
1277
1234
function ( category )
1278
1235
local homalg_ring, lift_via_compiled_linear_system_func, colift_via_compiled_linear_system_func;
1279
1236
1280
1237
homalg_ring = category. ring_for_representation_category;
1281
1238
1282
1239
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,
1284
1241
mat1, mat2, I_P, zero_2, M_tr_I, mat, vec_A, vec_zero, vec, v, s;
1285
1242
# rxs
1286
1243
# P
1287
1244
# |
1288
- # uxr | mxr
1289
- # X (A)
1245
+ # uxr | mxr
1246
+ # X (A)
1290
1247
# |
1291
1248
# V
1292
1249
# uxv mxu mxn
@@ -1296,10 +1253,10 @@ end );
1296
1253
# We need to solve the system
1297
1254
# B*X == A mod N
1298
1255
# 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
1300
1257
# B*X + N*Y == A
1301
1258
# X*P + M*Z == 0
1302
- # which is equivalent to
1259
+ # which is equivalent to
1303
1260
# XX*B^t + YY*N^t == A^t
1304
1261
# P^t*XX + ZZ*M^t == 0
1305
1262
# which can be solved exactly as Lift in left presentations case.
@@ -1314,47 +1271,31 @@ end );
1314
1271
1315
1272
Nt = TransposedMatrix ( UnderlyingMatrix ( Range ( morphism_1 ) ) );
1316
1273
1317
- if (NrRows ( Nt ) == 0 || s == 0 )
1318
- return ZeroMorphism ( Source ( morphism_1 ), Source ( morphism_2 ) );
1319
- end ;
1320
-
1321
- if (NrRows ( Mt ) == 0 && IsZeroForMorphisms ( morphism_1 ))
1322
- return ZeroMorphism ( Source ( morphism_1 ), Source ( morphism_2 ) );
1323
- end ;
1324
-
1325
1274
At = TransposedMatrix ( UnderlyingMatrix ( morphism_1 ) );
1326
1275
1327
1276
Bt = TransposedMatrix ( UnderlyingMatrix ( morphism_2 ) );
1328
1277
1329
1278
B_tr_I = KroneckerMat ( TransposedMatrix ( Bt ), HomalgIdentityMatrix ( NrColumns ( Pt ), homalg_ring ) );
1330
1279
1331
- N_tr_I = KroneckerMat ( TransposedMatrix ( Nt ), HomalgIdentityMatrix ( NrColumns ( Pt ) , homalg_ring ) );
1280
+ N_tr_I = KroneckerMat ( TransposedMatrix ( Nt ), HomalgIdentityMatrix ( NrColumns ( Pt ), homalg_ring ) );
1332
1281
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 );
1334
1283
1335
1284
mat1 = UnionOfColumns ( B_tr_I, N_tr_I, zero_1 );
1336
1285
1337
- I_P = KroneckerMat ( HomalgIdentityMatrix ( NrColumns ( Mt ) , homalg_ring ), Pt );
1286
+ I_P = KroneckerMat ( HomalgIdentityMatrix ( NrColumns ( Mt ), homalg_ring ), Pt );
1338
1287
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 );
1340
1289
1341
- M_tr_I = KroneckerMat ( TransposedMatrix ( Mt ), HomalgIdentityMatrix ( NrRows ( Pt ) , homalg_ring ) );
1290
+ M_tr_I = KroneckerMat ( TransposedMatrix ( Mt ), HomalgIdentityMatrix ( NrRows ( Pt ), homalg_ring ) );
1342
1291
1343
1292
mat2 = UnionOfColumns ( I_P, zero_2, M_tr_I );
1344
1293
1345
1294
mat = UnionOfRows ( mat1, mat2 );
1346
1295
1347
- if (NrColumns ( At ) <= 1 )
1348
-
1349
- vec_A = At;
1350
-
1351
- else
1352
-
1353
- vec_A = UnionOfRows ( List ( (1 ): (NrColumns ( At )), i-> CertainColumns ( At, [ i ] ) ) );
1354
-
1355
- end ;
1296
+ vec_A = ConvertMatrixToColumn ( At );
1356
1297
1357
- vec_zero = HomalgZeroMatrix ( NrRows ( Pt )* NrColumns ( Mt ), 1 , homalg_ring );
1298
+ vec_zero = HomalgZeroMatrix ( NrRows ( Pt ) * NrColumns ( Mt ), NrColumns ( vec_A ) , homalg_ring );
1358
1299
1359
1300
vec = UnionOfRows ( vec_A, vec_zero );
1360
1301
@@ -1363,7 +1304,7 @@ end );
1363
1304
end ;
1364
1305
1365
1306
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 ;
1367
1308
1368
1309
Pt = TransposedMatrix ( UnderlyingMatrix ( Source ( morphism_1 ) ) );
1369
1310
Mt = TransposedMatrix ( UnderlyingMatrix ( Source ( morphism_2 ) ) );
@@ -1374,13 +1315,9 @@ end );
1374
1315
1375
1316
sol = CallFuncList ( LeftDivide, lift_via_compiled_linear_system_func ( morphism_1, morphism_2 ) );
1376
1317
1377
- if (v <= 1 )
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
- end ;
1318
+ XX_tr = ConvertColumnToMatrix ( CertainRows ( sol, (1 ): (s * v) ), s, v );
1382
1319
1383
- return PresentationMorphism ( cat, Source ( morphism_1 ), XX , Source ( morphism_2 ) );
1320
+ return PresentationMorphism ( cat, Source ( morphism_1 ), TransposedMatrix ( XX_tr ) , Source ( morphism_2 ) );
1384
1321
1385
1322
end );
1386
1323
@@ -1398,19 +1335,11 @@ end );
1398
1335
Mt = TransposedMatrix ( UnderlyingMatrix ( Range ( morphism_1 ) ) );
1399
1336
1400
1337
v = NrColumns ( Mt );
1401
-
1338
+
1402
1339
s = NrColumns ( It );
1403
-
1404
- Nt = TransposedMatrix ( UnderlyingMatrix ( Source ( morphism_1 ) ) );
1405
1340
1406
- if (NrRows ( Nt ) == 0 || s == 0 )
1407
- return ZeroMorphism ( Range ( morphism_1 ), Range ( morphism_2 ) );
1408
- end ;
1341
+ Nt = TransposedMatrix ( UnderlyingMatrix ( Source ( morphism_1 ) ) );
1409
1342
1410
- if (NrRows ( Mt ) == 0 && IsZeroForMorphisms ( morphism_2 ))
1411
- return ZeroMorphism ( Range ( morphism_1 ), Range ( morphism_2 ) );
1412
- end ;
1413
-
1414
1343
Bt = TransposedMatrix ( UnderlyingMatrix ( morphism_1 ) );
1415
1344
1416
1345
At = TransposedMatrix ( UnderlyingMatrix ( morphism_2 ) );
@@ -1427,18 +1356,14 @@ end );
1427
1356
1428
1357
A_over_zero = UnionOfRows ( At, zero_mat );
1429
1358
1430
- if (NrColumns ( At ) <= 1 )
1431
- vec = A_over_zero;
1432
- else
1433
- vec = UnionOfRows ( List ( (1 ): (NrColumns ( At )), i-> CertainColumns ( A_over_zero, [ i ] ) ) );
1434
- end ;
1435
-
1359
+ vec = ConvertMatrixToColumn ( A_over_zero );
1360
+
1436
1361
return [ mat, vec ];
1437
1362
1438
1363
end ;
1439
1364
1440
1365
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 ;
1442
1367
1443
1368
It = TransposedMatrix ( UnderlyingMatrix ( Range ( morphism_2 ) ) );
1444
1369
@@ -1450,17 +1375,9 @@ end );
1450
1375
1451
1376
sol = CallFuncList ( LeftDivide, colift_via_compiled_linear_system_func ( morphism_1, morphism_2 ) );
1452
1377
1453
- v = NrColumns ( Mt );
1454
-
1455
- s = NrColumns ( It );
1456
-
1457
- if (s <= 1 )
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
- end ;
1378
+ XX_tr = ConvertColumnToMatrix ( CertainRows ( sol, (1 ): (v * s) ), v, s );
1462
1379
1463
- return PresentationMorphism ( cat, Range ( morphism_1 ), XX , Range ( morphism_2 ) );
1380
+ return PresentationMorphism ( cat, Range ( morphism_1 ), TransposedMatrix ( XX_tr ) , Range ( morphism_2 ) );
1464
1381
1465
1382
end , 1000 );
1466
1383
0 commit comments