i1 : S = ZZ/101[a,b,c]
o1 = S
o1 : PolynomialRing
|
i2 : kRes = res coker vars S
1 3 3 1
o2 = S <-- S <-- S <-- S <-- 0
0 1 2 3 4
o2 : ChainComplex
|
i3 : multBya = extend(kRes,kRes,matrix{{a}})
1 1
o3 = 0 : S <--------- S : 0
| a |
3 3
1 : S <----------------- S : 1
{1} | a b c |
{1} | 0 0 0 |
{1} | 0 0 0 |
3 3
2 : S <----- S : 2
0
1 1
3 : S <----- S : 3
0
4 : 0 <----- 0 : 4
0
o3 : ChainComplexMap
|
i4 : isChainComplexMap(multBya)
o4 = true
|
i5 : T = chainComplex(map(S^1,S^1,a))
1 1
o5 = S <-- S
0 1
o5 : ChainComplex
|
i6 : T' = chainComplex{map(S^1/(ideal a),S^1, 1), map(S^1,S^1, -a)}[1]
1 1
o6 = cokernel | a | <-- S <-- S
-1 0 1
o6 : ChainComplex
|
i7 : phi = chainComplexMap(T',T,apply(toList(min T..max T), i->id_(T_i)))
1 1
o7 = 0 : S <--------- S : 0
| 1 |
1 1
1 : S <--------- S : 1
| 1 |
o7 : ChainComplexMap
|
i8 : isChainComplexMap phi
o8 = true
|
Caveat: The script uses trivialHomologicalTruncation to truncates the source and target of the map phi to include only the indices for which phi has matrices. This eliminates the problem of complexes of different lengths seen in an earlier version, which would have made the last line in the example return false.