# liftMapAlongQuasiIsomorphism(ComplexMap,ComplexMap) -- lift a map of chain complexes along a quasi-isomorphism

## Synopsis

• Function: liftMapAlongQuasiIsomorphism
• Usage:
f' = liftMapAlongQuasiIsomorphism(f, g)
f' = f // g
• Inputs:
• f, , where each term in the source of $f$ is a free module
• g, , a quasi-isomorphism having the same target as $f$
• Outputs:
• f', , a map from the source of $f$ to the source of $g$
• Consequences:
• the homotopy relating $f$ and $g \circ f'$ is available as homotopyMap f'.

## Description

Let $f \colon P \to C$ be a morphism of chain complexes, where each term in $P$ is a free module. Given a quasi-isomorphism $g \colon B \to C$, this method produces a morphism $f' \colon P \to B$ such that there exists a map $h \colon P \to C$ of chain complexes having degree $1$ satisfying

$f - g \circ f' = h \circ \operatorname{dd}^P + \operatorname{dd}^C \circ h$.

Given a morphism between complexes, we can construct the corresponding map between their free resolutions using this method.

To be more precise, given a morphism $\phi \colon B \to C$ of complexes, let $\alpha \colon P \to B$ and $\beta \colon F \to C$ denote the free resolutions of the source and target complexes. Lifting the composite map $\phi \circ \alpha$ along the quasi-isomorphism $\beta$ gives a commutative diagram $\phantom{WWWW} \begin{array}{ccc} P & \!\!\rightarrow\!\! & F \\ \downarrow \, {\scriptstyle \alpha} & & \downarrow \, {\scriptstyle \beta} \\ B & \xrightarrow{\phi} & C \end{array}$

 i1 : S = ZZ/101[a,b,c,d]; i2 : J = ideal(a*b, a*d, b*c); o2 : Ideal of S i3 : I = J + ideal(c^3); o3 : Ideal of S i4 : C = prune Hom(S^{2} ** freeResolution I, S^1/I) o4 = cokernel {-4} | ad bc ab c3 | <-- cokernel {-1} | 0 0 0 0 0 0 0 ad bc ab 0 0 0 0 c3 0 | <-- cokernel {0} | 0 0 0 ad bc ab 0 0 0 0 0 0 0 c3 0 0 | <-- cokernel {2} | ad bc ab c3 | {-1} | 0 0 0 0 0 0 0 0 0 0 ad bc ab 0 0 c3 | {0} | 0 0 0 0 0 0 ad bc ab 0 0 0 0 0 c3 0 | -3 {-2} | 0 0 0 ad bc ab 0 0 0 0 0 0 0 c3 0 0 | {0} | 0 0 0 0 0 0 0 0 0 ad bc ab 0 0 0 c3 | 0 {-3} | ad bc ab 0 0 0 c3 0 0 0 0 0 0 0 0 0 | {-1} | ad bc ab 0 0 0 0 0 0 0 0 0 c3 0 0 0 | -2 -1 o4 : Complex i5 : D = prune Hom(freeResolution J, S^1/J) o5 = cokernel {-3} | ad bc ab 0 0 0 | <-- cokernel {-2} | ad bc ab 0 0 0 0 0 0 | <-- cokernel | ad bc ab | {-3} | 0 0 0 ad bc ab | {-2} | 0 0 0 ad bc ab 0 0 0 | {-2} | 0 0 0 0 0 0 ad bc ab | 0 -2 -1 o5 : Complex i6 : r = randomComplexMap(D,C,Cycle=>true) o6 = -3 : 0 <----- cokernel {-4} | ad bc ab c3 | : -3 0 -2 : cokernel {-3} | ad bc ab 0 0 0 | <----------------------------------------- cokernel {-1} | 0 0 0 0 0 0 0 ad bc ab 0 0 0 0 c3 0 | : -2 {-3} | 0 0 0 ad bc ab | {-3} | 24b2-36bd 0 0 0 | {-1} | 0 0 0 0 0 0 0 0 0 0 ad bc ab 0 0 c3 | {-3} | -30b2-29bd -29b2+43bd -47b 0 | {-2} | 0 0 0 ad bc ab 0 0 0 0 0 0 0 c3 0 0 | {-3} | ad bc ab 0 0 0 c3 0 0 0 0 0 0 0 0 0 | -1 : cokernel {-2} | ad bc ab 0 0 0 0 0 0 | <------------------------------------------------- cokernel {0} | 0 0 0 ad bc ab 0 0 0 0 0 0 0 c3 0 0 | : -1 {-2} | 0 0 0 ad bc ab 0 0 0 | {-2} | 10b2+43bd 21b2 34b2 0 | {0} | 0 0 0 0 0 0 ad bc ab 0 0 0 0 0 c3 0 | {-2} | 0 0 0 0 0 0 ad bc ab | {-2} | 19b2+19bd -10b2-29bd -8b2-22bd 19b | {0} | 0 0 0 0 0 0 0 0 0 ad bc ab 0 0 0 c3 | {-2} | 39bd 21bd -29b2-24bd -47b | {-1} | ad bc ab 0 0 0 0 0 0 0 0 0 c3 0 0 0 | 0 : cokernel | ad bc ab | <------------------ cokernel {2} | ad bc ab c3 | : 0 | -38b2-16bd | o6 : ComplexMap i7 : f = r * resolutionMap C 8 o7 = -2 : cokernel {-3} | ad bc ab 0 0 0 | <----------------------------------------------- S : -2 {-3} | 0 0 0 ad bc ab | {-3} | 0 0 0 0 0 0 24b2-36bd 0 | {-3} | 0 0 47b 0 0 0 -30b2-29bd 29b2-43bd | 24 -1 : cokernel {-2} | ad bc ab 0 0 0 0 0 0 | <------------------------------------------------------------------------------------------------------------------ S : -1 {-2} | 0 0 0 ad bc ab 0 0 0 | {-2} | 0 0 0 0 0 0 0 0 0 -10b2-43bd 21b2 -34b2 0 0 0 0 0 0 -21b3 -10b3+24b2d 0 0 0 0 | {-2} | 0 0 0 0 0 0 ad bc ab | {-2} | 0 0 0 0 0 -19b 0 0 0 -19b2-19bd -10b2-29bd 8b2+22bd 0 0 0 0 0 0 10b3+29b2d -19b3-11b2d+22bd2 0 0 0 0 | {-2} | 0 0 0 0 0 47b 0 0 0 -39bd 21bd 29b2+24bd 0 0 0 0 0 0 -21b2d -10b2d+24bd2 0 0 0 0 | 34 0 : cokernel | ad bc ab | <----------------------------------------------------------------------------------- S : 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38b2+16bd 0 0 0 0 0 0 0 0 | o7 : ComplexMap i8 : g = resolutionMap D 2 o8 = -2 : cokernel {-3} | ad bc ab 0 0 0 | <------------------ S : -2 {-3} | 0 0 0 ad bc ab | {-3} | -1 0 | {-3} | 0 -1 | 9 -1 : cokernel {-2} | ad bc ab 0 0 0 0 0 0 | <-------------------------------------- S : -1 {-2} | 0 0 0 ad bc ab 0 0 0 | {-2} | 1 0 0 0 -a 0 -b 0 0 | {-2} | 0 0 0 0 0 0 ad bc ab | {-2} | 0 -1 0 -d -c -b 0 0 0 | {-2} | 0 0 -1 0 0 0 -d -c -a | 14 0 : cokernel | ad bc ab | <------------------------------------ S : 0 | 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 | o8 : ComplexMap i9 : assert isQuasiIsomorphism g i10 : f' = liftMapAlongQuasiIsomorphism(f, g) 1 o10 = -3 : 0 <----- S : -3 0 2 8 -2 : S <------------------------------------------------- S : -2 {-3} | 0 0 0 0 0 0 -24b2+36bd 0 | {-3} | 0 0 -47b 0 0 0 30b2+29bd -29b2+43bd | 9 24 -1 : S <--------------------------------------------------------------------------------------------------------------------------------------------------------------------- S : -1 {-2} | 0 0 0 0 0 0 0 0 0 -24b2+36bd 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {-2} | 0 0 0 0 0 0 0 0 0 0 -24b2+36bd 0 0 0 0 24b2d-36bd2 0 0 0 0 0 0 0 0 | {-2} | 0 0 0 0 0 -47b -47ad 0 0 30bc-48bd+29cd+22d2 30ab-47c2+29ad -29b2+43bd 0 0 0 -30abd-29ad2 -29abd+43ad2 0 0 0 0 0 -29bc3+43c3d -29bc2d+43c2d2 | {-1} | 0 0 0 0 0 0 0 0 0 19b -7b -22b 0 0 0 -24b2+36bd 0 0 -29b2 11b2-22bd 0 0 0 0 | {-1} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {-1} | 0 0 0 0 0 19 0 0 0 19b 34b -8b 0 0 0 0 0 0 -10b2 19b2 0 0 0 0 | {-1} | 0 0 0 0 0 0 0 0 0 -14b-22d -21b 34b 0 0 0 0 0 0 21b2 10b2-24bd 0 0 0 0 | {-1} | 0 0 0 0 0 0 0 0 0 -30b-29d 47c 0 0 0 0 0 0 0 0 0 0 0 29bc2-43c2d 29bcd-43cd2 | {-1} | 0 0 0 0 0 0 47d 0 0 0 -30b-29d 0 0 0 0 30bd+29d2 29bd-43d2 0 0 0 0 0 0 0 | 14 34 0 : S <----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- S : 0 | 0 0 0 0 0 0 0 0 0 0 0 0 -24bd+36d2 0 -24b2+36bd 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 -24b2+36bd 0 7b2 0 0 -29b2 0 0 11b2-22bd 0 0 0 0 0 0 0 -22bc2 0 -22bcd 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 -24bd+36d2 0 7bd 0 0 -29bd 0 0 11bd-22d2 0 0 0 0 0 0 0 -22c2d 0 -22cd2 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 24ab-29ad 19ad -22ad 19ab 0 24b2 0 -29ab 11ab-22ad 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -34b2+19c2 0 19cd -10b2 0 0 19b2 0 0 0 0 0 0 0 -8bc2 0 -8bcd 0 0 0 | | 0 0 19d 0 0 0 0 0 0 0 0 -10bd-29d2 19bd+19d2 -8bd-22d2 19b2+19bd 0 0 0 -10b2-29bd 19b2+11bd-22d2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 21bd -14bd-22d2 34bd -14b2-22bd 0 0 0 21b2 10b2-24bd 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21b2 0 0 21b2 0 0 10b2-24bd 0 0 0 0 0 0 0 34bc2 0 34bcd 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 -30ad 0 -30ab-47c2-29ad+21bd 0 -47cd 21bd 0 0 10bd-24d2 0 0 0 0 0 0 0 -29bc2-24c2d 0 -29bcd-24cd2 29acd 0 0 | | 0 0 -47b 0 0 0 0 0 0 0 0 0 30bc+29bd-43d2 -29b2+43bd 29b2+29bc-43bd 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -29bc2 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 -47cd -29d2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -43cd2 -29bc2d+43c2d2 -29bcd2+43cd3 | | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30bc 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -38b2-16bd 0 0 0 0 0 0 0 0 | 9 24 1 : S <-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- S : 1 {1} | 0 0 0 0 -24b2 0 -29ab 11ab-22ad 0 0 0 0 0 0 0 0 0 -22acd 0 0 22ac2d 0 0 0 | {1} | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | {1} | 0 0 0 0 0 19cd -10b2-29bd 19b2+11bd-22d2 0 0 -19c2d 0 0 0 0 0 0 -8bcd-22cd2 0 0 8bc2d+22c2d2 0 0 0 | {1} | 0 0 0 0 0 0 21b2 10b2-24bd 0 0 0 0 0 0 0 0 0 34bcd 0 0 -34bc2d 0 0 0 | {1} | 0 0 0 0 30bc-29cd 47c2 -21bc -10bc+24cd 0 0 -47c3 0 0 0 0 0 0 24c2d 0 29bc3 -29bc3-24c3d 0 29bc2d 29ac2d | {1} | 0 0 0 0 29d2 -47cd 21bd 10bd-24d2 0 0 47c2d 0 0 0 0 0 0 -24cd2 0 -29bc2d 29bc2d+24c2d2 0 -29bcd2 -29acd2 | {2} | 0 0 0 0 0 0 0 0 0 0 0 -38b2-16bd 0 0 0 0 0 0 0 0 0 0 0 0 | {2} | 0 0 0 0 0 0 0 0 0 0 0 0 -38b2-16bd 0 0 0 0 0 -38bc2-16c2d 0 0 0 0 0 | {2} | 0 0 0 0 0 0 0 0 0 0 0 0 0 -38b2-16bd 0 0 0 0 0 0 0 0 0 0 | 2 8 2 : S <--------------------------------------------------------- S : 2 {3} | 0 -38b2-16bd 0 0 0 0 0 -38bc3-16c3d | {3} | 0 0 -38b2-16bd 0 0 0 0 38bc2d+16c2d2 | 1 3 : 0 <----- S : 3 0 o10 : ComplexMap i11 : assert(f' == f//g) i12 : assert isWellDefined f' i13 : assert isComplexMorphism f' i14 : h = homotopyMap f' 1 o14 = -2 : cokernel {-3} | ad bc ab 0 0 0 | <----- S : -3 {-3} | 0 0 0 ad bc ab | 0 8 -1 : cokernel {-2} | ad bc ab 0 0 0 0 0 0 | <----- S : -2 {-2} | 0 0 0 ad bc ab 0 0 0 | 0 {-2} | 0 0 0 0 0 0 ad bc ab | 24 0 : cokernel | ad bc ab | <----- S : -1 0 34 1 : 0 <----- S : 0 0 24 2 : 0 <----- S : 1 0 8 3 : 0 <----- S : 2 0 1 4 : 0 <----- S : 3 0 o14 : ComplexMap i15 : isNullHomotopyOf(h, g * (f//g) - f) o15 = true

## Caveat

The following three assumptions are not checked: $f$ is a morphism, the source of $f$ is semifree, and $g$ is a quasi-isomorphism.