For a complex map $f : C \to D$ of degree $d$, this method checks whether, for all $i$, we have $dd^D_{i+d} * f_i = (-1)^d * (f_{i-1} * dd^C_i)$.
We first construct a random complex map which commutes with the differential.
i1 : S = ZZ/101[a,b,c]; |
i2 : C = freeResolution coker vars S 1 3 3 1 o2 = S <-- S <-- S <-- S 0 1 2 3 o2 : Complex |
i3 : D = C ** C 1 6 15 20 15 6 1 o3 = S <-- S <-- S <-- S <-- S <-- S <-- S 0 1 2 3 4 5 6 o3 : Complex |
i4 : f1 = randomComplexMap(D, C, Boundary => true, InternalDegree => 1) 1 1 o4 = 0 : S <------------------- S : 0 | -5a-17b-11c | 6 3 1 : S <-------------------------------------------------- S : 1 {1} | 2a-28b+50c -28a+39b-13c -23a-b-48c | {1} | 26a-16b+42c 41a-20b-19c 23a-11b-16c | {1} | 18a+31b+19c -5a-23b-48c 50a-38b-19c | {1} | -7a-25b-38c 28a-36b+16c 23a-b-4c | {1} | 10a+16b-21c -49a+3b-41c -21a+11b+32c | {1} | -41a+49b-19c 2a-29b+48c -3a+5b+8c | 15 3 2 : S <-------------------------------------------------- S : 2 {2} | 33a+7b-12c 16a-20b+41c -39a-42b+11c | {2} | 30a+40b-7c -2a+46b+14c 4a+20b+35c | {2} | -3a-39b+2c -39a-30b+47c 22a-34b-43c | {2} | -28a+39b+9c -23a+32b+46c 47b-47c | {2} | 8a-25b+14c 7a-33b+16c 39a+3b-11c | {2} | -35a+8b+10c -49a-20b+7c -4a+33b+22c | {2} | 31a+35b-8c -17a-20b-19c -8a-43b+4c | {2} | -28a+16b-29c 42a+43c -39a-11b-37c | {2} | 15a+8b-39c -25a+30b -25a-4b-16c | {2} | 8a-14b-7c 3a+33b-36c -22a+41b+48c | {2} | -24a+49b+2c -37a+44b+5c -19a+7b-24c | {2} | 50a+18b 43a+23b-19c 49a-38b+48c | {2} | -18a+42c -38a+33b+34c -8a-2b-22c | {2} | 10a-b-10c 46b-45c -22a-32b-6c | {2} | -25a+39c -45a+44b-21c -50a+12b-25c | 20 1 3 : S <------------------------ S : 3 {3} | 9a+22b+11c | {3} | -39a-32b+46c | {3} | 4a+9b-28c | {3} | 13a+32b+c | {3} | -26a+20b-3c | {3} | 22a-24b+22c | {3} | -49a+30b-47c | {3} | -11a+48b-23c | {3} | -8a+15b-7c | {3} | 43a-39b+2c | {3} | -8a+29c | {3} | 36a-33b-47c | {3} | -3a+49b+15c | {3} | -22a+33b-37c | {3} | -30a+19b-13c | {3} | 41a-17b-10c | {3} | 16a+20b+30c | {3} | -28a-44b-18c | {3} | -6a+39b+39c | {3} | 35a-36b+27c | o4 : ComplexMap |
i5 : isCommutative f1 o5 = true |
i6 : assert(degree f1 == 0) |
i7 : assert isNullHomotopic f1 |
i8 : assert(source f1 == C and target f1 == D) |
We next generate a complex map that is commutative and (likely) induces a nontrivial map on homology.
i9 : f2 = randomComplexMap(D, C, Cycle => true) 1 1 o9 = 0 : S <----------- S : 0 | -40 | 6 3 1 : S <----------------------- S : 1 {1} | -44 -48 22 | {1} | 41 2 1 | {1} | 18 -1 -9 | {1} | 4 48 -22 | {1} | -41 -42 -1 | {1} | -18 1 -31 | 15 3 2 : S <----------------------- S : 2 {2} | -11 -3 -35 | {2} | -41 22 6 | {2} | -49 -25 31 | {2} | -48 22 0 | {2} | 13 4 35 | {2} | 40 -31 -6 | {2} | 33 -3 -13 | {2} | -41 0 1 | {2} | 31 25 -40 | {2} | -41 -35 -47 | {2} | -49 35 29 | {2} | 0 -18 1 | {2} | -9 -4 -13 | {2} | -40 35 -47 | {2} | -31 35 -2 | 20 1 3 : S <--------------- S : 3 {3} | -9 | {3} | -35 | {3} | 6 | {3} | 40 | {3} | 3 | {3} | -31 | {3} | 25 | {3} | -2 | {3} | -41 | {3} | -49 | {3} | -13 | {3} | 4 | {3} | 30 | {3} | -47 | {3} | 27 | {3} | -40 | {3} | 37 | {3} | -35 | {3} | -31 | {3} | -39 | o9 : ComplexMap |
i10 : isCommutative f2 o10 = true |
i11 : assert(degree f2 == 0) |
i12 : assert isComplexMorphism f2 |
When the degree of the complex map is odd, isCommutative determines whether the map is anti-commutative. We illustrate this for one square.
i13 : f3 = randomComplexMap(D, C, Cycle => true, Degree=>1, InternalDegree => 1) 6 1 o13 = 1 : S <--------------- S : 0 {1} | -26 | {1} | -50 | {1} | 1 | {1} | 26 | {1} | 50 | {1} | -1 | 15 3 2 : S <----------------------- S : 1 {2} | 35 -16 -48 | {2} | 17 49 -40 | {2} | 1 44 11 | {2} | 26 0 0 | {2} | 15 16 48 | {2} | -18 -49 40 | {2} | 35 10 -48 | {2} | 0 50 0 | {2} | -1 -45 -11 | {2} | 17 49 -14 | {2} | 1 44 -40 | {2} | 0 0 -1 | {2} | -15 10 -48 | {2} | 18 49 -14 | {2} | 1 45 -40 | 20 3 3 : S <----------------------- S : 2 {3} | 29 -48 31 | {3} | 16 48 0 | {3} | -49 40 0 | {3} | 28 37 -31 | {3} | 35 0 48 | {3} | 46 -48 -30 | {3} | 1 0 -11 | {3} | -29 -18 -47 | {3} | 0 17 49 | {3} | 0 1 44 | {3} | -10 48 0 | {3} | -15 0 48 | {3} | -10 -37 -30 | {3} | -49 14 0 | {3} | 28 22 -47 | {3} | 0 18 49 | {3} | 46 18 -40 | {3} | 1 0 40 | {3} | 0 1 45 | {3} | 10 22 40 | 15 1 4 : S <--------------- S : 3 {4} | -31 | {4} | -48 | {4} | -29 | {4} | -48 | {4} | 30 | {4} | -37 | {4} | 47 | {4} | -49 | {4} | 28 | {4} | -18 | {4} | 46 | {4} | 1 | {4} | 40 | {4} | -22 | {4} | 10 | o13 : ComplexMap |
i14 : isCommutative f3 o14 = true |
i15 : assert(degree f3 == 1) |
i16 : part1 = dd^D_3 * f3_2 o16 = {2} | 16a+35b 48a+35c 48b-16c | {2} | -49a+17b 40a+17c 40b+49c | {2} | -44a+b -11a+c -11b+44c | {2} | 26b 26c 0 | {2} | -16a+15b -48a+15c -48b+16c | {2} | 49a-18b -40a-18c -40b-49c | {2} | -10a+35b 48a+35c 48b+10c | {2} | -50a 0 50c | {2} | 45a-b 11a-c 11b-45c | {2} | -49a+17b 14a+17c 14b+49c | {2} | -44a+b 40a+c 40b+44c | {2} | 0 a b | {2} | -10a-15b 48a-15c 48b+10c | {2} | -49a+18b 14a+18c 14b+49c | {2} | -45a+b 40a+c 40b+45c | 15 3 o16 : Matrix S <--- S |
i17 : part2 = f3_1 * dd^C_2 o17 = {2} | -16a-35b -48a-35c -48b+16c | {2} | 49a-17b -40a-17c -40b-49c | {2} | 44a-b 11a-c 11b-44c | {2} | -26b -26c 0 | {2} | 16a-15b 48a-15c 48b-16c | {2} | -49a+18b 40a+18c 40b+49c | {2} | 10a-35b -48a-35c -48b-10c | {2} | 50a 0 -50c | {2} | -45a+b -11a+c -11b+45c | {2} | 49a-17b -14a-17c -14b-49c | {2} | 44a-b -40a-c -40b-44c | {2} | 0 -a -b | {2} | 10a+15b -48a+15c -48b-10c | {2} | 49a-18b -14a-18c -14b-49c | {2} | 45a-b -40a-c -40b-45c | 15 3 o17 : Matrix S <--- S |
i18 : assert(part1 + part2 == 0) |
If the debugLevel is greater than zero, then the location of the first failure of commutativity is displayed.
i19 : f4 = randomComplexMap(D, C) 1 1 o19 = 0 : S <--------- S : 0 | 7 | 6 3 1 : S <----------------------- S : 1 {1} | 30 8 -18 | {1} | 13 8 42 | {1} | -17 -29 23 | {1} | -13 30 -28 | {1} | 3 -46 15 | {1} | -41 49 18 | 15 3 2 : S <----------------------- S : 2 {2} | -16 -28 30 | {2} | -46 47 4 | {2} | 12 -28 22 | {2} | -18 6 5 | {2} | 27 -9 -20 | {2} | -21 -33 -13 | {2} | 23 28 -29 | {2} | -37 -29 15 | {2} | -23 26 -4 | {2} | 44 5 12 | {2} | -39 -37 3 | {2} | 20 -33 9 | {2} | 19 -28 -2 | {2} | 0 42 20 | {2} | -47 44 -26 | 20 1 3 : S <--------------- S : 3 {3} | 33 | {3} | 16 | {3} | 10 | {3} | 31 | {3} | 28 | {3} | -6 | {3} | 21 | {3} | -30 | {3} | -4 | {3} | -14 | {3} | -33 | {3} | -42 | {3} | -44 | {3} | -5 | {3} | -16 | {3} | -35 | {3} | -39 | {3} | -4 | {3} | -24 | {3} | -32 | o19 : ComplexMap |
i20 : isCommutative f4 o20 = false |
i21 : debugLevel = 1 o21 = 1 |
i22 : isCommutative f4 -- block (1, 0) fails to commute o22 = false |