The map $f : C \to D$ of chain complexes over the ring $S$ induces the map $h = Hom(f, S^1) : Hom(D, S^1) \to Hom(C,S^1)$ defined by $\phi \mapsto \phi f$.
i1 : S = ZZ/101[a..c] o1 = S o1 : PolynomialRing |
i2 : C = freeResolution coker vars S 1 3 3 1 o2 = S <-- S <-- S <-- S 0 1 2 3 o2 : Complex |
i3 : D = (freeResolution coker matrix{{a^2,a*b,b^3}})[-1] 1 3 2 o3 = S <-- S <-- S 1 2 3 o3 : Complex |
i4 : f = randomComplexMap(D,C) 1 o4 = 0 : 0 <----- S : 0 0 1 3 1 : S <-------------------------------------------- S : 1 | 24a-36b-30c -29a+19b+19c -10a-29b-8c | 3 3 2 : S <----------------------- S : 2 {2} | -22 -24 -16 | {2} | -29 -38 39 | {3} | 0 0 0 | 2 1 3 : S <-------------- S : 3 {3} | 21 | {4} | 0 | o4 : ComplexMap |
i5 : h = dual f 1 2 o5 = -3 : S <----------------- S : -3 {-3} | 21 0 | 3 3 -2 : S <---------------------- S : -2 {-2} | -22 -29 0 | {-2} | -24 -38 0 | {-2} | -16 39 0 | 3 1 -1 : S <------------------------- S : -1 {-1} | 24a-36b-30c | {-1} | -29a+19b+19c | {-1} | -10a-29b-8c | o5 : ComplexMap |
i6 : assert isWellDefined h |
i7 : assert(h == Hom(f, S^1)) |
i8 : assert(source h == Hom(D,S^1)) |
i9 : assert(target h == Hom(C,S^1)) |
This routine is functorial.
i10 : D' = (freeResolution coker matrix{{a^2,a*b,c^3}})[-1] 1 3 3 1 o10 = S <-- S <-- S <-- S 1 2 3 4 o10 : Complex |
i11 : f' = randomComplexMap(D', D) 1 1 o11 = 1 : S <---------- S : 1 | 34 | 3 3 2 : S <-------------------------------- S : 2 {2} | 19 -39 -13a-43b-15c | {2} | -47 -18 -28a-47b+38c | {3} | 0 0 2 | 3 2 3 : S <-------------------------- S : 3 {3} | 16 22a+45b-34c | {5} | 0 0 | {5} | 0 0 | o11 : ComplexMap |
i12 : dual(f' * f) == dual f * dual f' o12 = true |