Skip to content

Commit 2a92f32

Browse files
feat(Algebra/Homology): second step of a factorization lemma (#36931)
This is the second in a series of three PRs towards #35813 which shall show that if `f : K ⟶ L` is a morphism between bounded below cochain complexes in an abelian category with enough injectives, then there exists a factorization `ι ≫ π = f` with `ι : K ⟶ K'` a monomorphism that is also a quasi-isomorphism and `π : K' ⟶ L` a morphism which degreewise is an epimorphism with an injective kernel, while `K'` is also bounded below (with precise bounds depending on the available bounds for `K` and `L`). The construction of the intermediate object `K'` is obtained by taking a degreewise eventually constant projective limit of cochain complexes, where the complexes in the projective system are constructed step by step. Each step decomposes further into two lemmas `step₁` and `step₂`. In this PR, we prove `step₂`. Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
1 parent 078b884 commit 2a92f32

File tree

1 file changed

+206
-8
lines changed
  • Mathlib/Algebra/Homology/Factorizations

1 file changed

+206
-8
lines changed

Mathlib/Algebra/Homology/Factorizations/CM5a.lean

Lines changed: 206 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ if `f` is a monomorphism which is a quasi-isomorphism in degrees `≤ n₀` and
3434
where `ι` is a monomorphism that is a quasi-isomorphism in degrees `≤ n₁`,
3535
and `π` is an isomorphism in degrees `≤ n₀` that is also a degreewise
3636
epimorphism with an injective kernel. The proof of `step` decomposes
37-
a two separate lemmas `step₁` and `step₂` (TODO): we first ensure that `ι`
37+
a two separate lemmas `step₁` and `step₂`: we first ensure that `ι`
3838
induces a monomorphism in homology in degree `n₁`, and we proceed further
3939
in `step₂`.
4040
@@ -197,10 +197,8 @@ instance : Mono (homologyMap (ι f n₁) n₁) := by
197197

198198
end step₁
199199

200-
-- This lemma and a few definitions above are made public only in order to please CI.
201-
-- They will be made private again when the proofs of `cm5a_cof` and `cm5a` are added.
202200
open step₁ in
203-
public lemma step₁ [EnoughInjectives C] [Mono f] (n₀ n₁ : ℤ)
201+
lemma step₁ [EnoughInjectives C] [Mono f] (n₀ n₁ : ℤ)
204202
(hf : ∀ i ≤ n₀, QuasiIsoAt f i) (hn₁ : n₀ + 1 = n₁ := by lia) :
205203
∃ (F : (cofFib f).FullSubcategory), quasiIsoLE n₀ F ∧ isIsoLE n₀ F ∧
206204
Mono (homologyMap F.obj.ι n₁) :=
@@ -210,13 +208,213 @@ public lemma step₁ [EnoughInjectives C] [Mono f] (n₀ n₁ : ℤ)
210208
fun i hi ↦ isIso_π_f K L n₁ i (by lia),
211209
inferInstance⟩
212210

213-
proof_wanted step₂ [EnoughInjectives C] [Mono f] (n₀ n₁ : ℤ)
211+
namespace step₂
212+
213+
/-!
214+
This section provides the material in order to prove the lemma `step₂` below.
215+
Given a monomorphism `f : K ⟶ L` that is a quasi-isomorphism in degrees `< n`
216+
and which induces a monomorphism in homology in degree `n`, we construct
217+
a factorisation of `f` as `ι f n ≫ π f n = f` where
218+
`ι f n : K ⟶ mid f n` is a monomorphism which is a quasi-isomorphism
219+
in degrees `≤ n`, `π f n` is a degreewise epimorphism with an injective kernel
220+
which also induces isomorphisms in degrees `≤ n`.
221+
-/
222+
223+
224+
open HomComplex
225+
226+
variable [EnoughInjectives C] (n : ℤ)
227+
228+
/-- Given a morphism `f : K ⟶ L`, this is the single cochain complex in degree `n`
229+
which is given an injective object which contains `((cokernel f).truncGE n).X n`,
230+
i.e. the object in degree `n` of the canonical truncation `≥ n` of `cokernel f`. -/
231+
noncomputable abbrev S :=
232+
(single C (.up ℤ) n).obj (Injective.under (((cokernel f).truncGE n).X n))
233+
234+
/-- The morphism `(cokernel f).truncGE n ⟶ S f n` which in degree `n` is
235+
given by `Injective.ι _`. -/
236+
noncomputable def p : (cokernel f).truncGE n ⟶ S f n :=
237+
mkHomToSingle (Injective.ι _) (fun i hi ↦ by
238+
simp only [ComplexShape.up_Rel] at hi
239+
exact (isZero_of_isStrictlyGE _ n _).eq_of_src _ _)
240+
241+
instance : Mono ((p f n).f n) := by
242+
simp only [p, mkHomToSingle_f, mono_comp_iff_of_mono]
243+
infer_instance
244+
245+
/-- The obvious morphism `L ⟶ S f n`. -/
246+
noncomputable def α : L ⟶ S f n := cokernel.π f ≫ (cokernel f).πTruncGE n ≫ p f n
247+
248+
@[reassoc (attr := simp)]
249+
lemma comp_α : f ≫ α f n = 0 := by simp [α]
250+
251+
@[reassoc (attr := simp)]
252+
lemma comp_α_f (i : ℤ) : f.f i ≫ (α f n).f i = 0 := by simp [← comp_f]
253+
254+
/-- The intermediate object in the factorisation. -/
255+
noncomputable abbrev mid := mappingCocone (α f n)
256+
257+
/-- The first morphism of the factorisation. -/
258+
noncomputable abbrev ι : K ⟶ mid f n := mappingCocone.lift (α f n) f 0 (by simp)
259+
260+
/-- The second morphism of the factorisation. -/
261+
noncomputable abbrev π : mid f n ⟶ L := mappingCocone.fst (α f n)
262+
263+
@[reassoc]
264+
lemma ι : ι f n ≫ π f n = f := by simp
265+
266+
instance [Mono f] : Mono (ι f n) := mono_of_mono_fac (ι_π f n)
267+
268+
lemma degreewiseEpiWithInjectiveKernel_π :
269+
degreewiseEpiWithInjectiveKernel (π f n) := by
270+
intro i
271+
rw [epiWithInjectiveKernel_iff]
272+
exact ⟨_, inferInstance, (mappingCocone.inr (α f n)).1.v (i - 1) i (by lia), by simp,
273+
⟨{r := (mappingCocone.snd (α f n)).v _ _ (by lia)
274+
s := (mappingCocone.inl (α f n)).v _ _ (by lia)
275+
id := (add_comm _ _).trans (by simp [mappingCocone.id_X]) }⟩⟩
276+
277+
lemma isIso_π_f (i : ℤ) (hi : i ≤ n) : IsIso ((π f n).f i) := by
278+
refine ⟨(mappingCocone.inl (α f n)).v i i (add_zero i), ?_, by simp⟩
279+
simp [← mappingCocone.id_X (α f n) i (i - 1) (by lia),
280+
(isZero_single_obj_X _ _ _ _ (by lia)).eq_of_src
281+
((mappingCocone.inr (α f n)).1.v (i - 1) i (by lia)) 0]
282+
283+
section
284+
285+
attribute [local instance] HasDerivedCategory.standard
286+
287+
lemma mono_homologyMap_π (q : ℤ) (hq : q ≤ n) : Mono (homologyMap (π f n) q) :=
288+
(CochainComplex.homologyMap_exact₁_of_distTriang _
289+
(DerivedCategory.mappingCocone_triangle_distinguished (α f n)) (q - 1) q (by lia)).mono_g
290+
((ExactAt.isZero_homology (exactAt_single_obj _ _ _ _ (by lia))).eq_of_src _ _)
291+
292+
lemma epi_homologyMap_π (q : ℤ) (hq : q < n) : Epi (homologyMap (π f n) q) :=
293+
(CochainComplex.homologyMap_exact₂_of_distTriang _
294+
(DerivedCategory.mappingCocone_triangle_distinguished (α f n)) q).epi_f
295+
((ExactAt.isZero_homology (exactAt_single_obj _ _ _ _ (by lia))).eq_of_tgt _ _)
296+
297+
end
298+
299+
lemma quasiIsoAt_π (q : ℤ) (hq : q < n) : QuasiIsoAt (π f n) q := by
300+
have := mono_homologyMap_π f n q (by lia)
301+
have := epi_homologyMap_π f n q hq
302+
rw [quasiIsoAt_iff_isIso_homologyMap]
303+
apply Balanced.isIso_of_mono_of_epi
304+
305+
/-- The (exact) short complex `K.homology n ⟶ L.homology n ⟶ (S f n).homology n`. -/
306+
@[simps]
307+
noncomputable def homologyShortComplex : ShortComplex C :=
308+
ShortComplex.mk (homologyMap f n) (homologyMap (α f n) n) (by
309+
rw [← homologyMap_comp, comp_α, homologyMap_zero])
310+
311+
instance [Mono (homologyMap f n)] :
312+
Mono (homologyShortComplex f n).f := by
313+
assumption
314+
315+
instance : Mono (homologyMap (p f n) n) := by
316+
have := (S f n).isIso_homologyπ (n - 1) n (by simp) (by simp)
317+
have : Mono ((truncGE (cokernel f) n).homologyπ n ≫ homologyMap (p f n) n) := by
318+
rw [homologyπ_naturality (p f n) n]
319+
infer_instance
320+
have := (truncGE (cokernel f) n).isIso_homologyπ (n - 1) n (by simp)
321+
((isZero_of_isStrictlyGE _ n _ (by lia)).eq_of_src _ _)
322+
rw [← IsIso.inv_hom_id_assoc ((truncGE (cokernel f) n).homologyπ n) (homologyMap (p f n) n)]
323+
infer_instance
324+
325+
omit [EnoughInjectives C] in
326+
lemma shortExact [Mono f] : (ShortComplex.mk _ _ (cokernel.condition f)).ShortExact where
327+
exact := ShortComplex.exact_of_g_is_cokernel _ (cokernelIsCokernel f)
328+
329+
lemma exact_homologyShortComplex [Mono f] :
330+
(homologyShortComplex f n).Exact := by
331+
let T := ShortComplex.mk (homologyMap f n) (homologyMap (cokernel.π f) n)
332+
(by rw [← homologyMap_comp, cokernel.condition, homologyMap_zero])
333+
let φ : T ⟶ homologyShortComplex f n :=
334+
{ τ₁ := 𝟙 _
335+
τ₂ := 𝟙 _
336+
τ₃ := homologyMap ((cokernel f).πTruncGE n ≫ p f n) n
337+
comm₂₃ := by
338+
dsimp
339+
rw [Category.id_comp, ← homologyMap_comp, α] }
340+
obtain ⟨_, _, _⟩ : Mono φ.τ₃ ∧ IsIso φ.τ₂ ∧ Epi φ.τ₁ := by
341+
dsimp [φ]
342+
rw [homologyMap_comp]
343+
exact ⟨inferInstance, inferInstance, inferInstance⟩
344+
rw [← ShortComplex.exact_iff_of_epi_of_isIso_of_mono φ]
345+
exact (shortExact f).homology_exact₂ n
346+
347+
variable (hf : ∀ i < n, QuasiIsoAt f i)
348+
349+
include hf
350+
351+
omit [EnoughInjectives C] in
352+
lemma isGE_cokernel [Mono f] [Mono (homologyMap f n)] : (cokernel f).IsGE n := by
353+
rw [isGE_iff]
354+
intro i hi
355+
rw [exactAt_iff_isZero_homology]
356+
refine ((shortExact f).homology_exact₃ i (i + 1) (by simp)).isZero_X₂ ?_ ?_
357+
· have := hf i hi
358+
rw [← ((shortExact f).homology_exact₂ i).epi_f_iff]
359+
infer_instance
360+
· rw [← ((shortExact f).homology_exact₁ i (i + 1) (by simp)).mono_g_iff]
361+
by_cases hi' : i + 1 < n
362+
· have := hf (i + 1) (by lia)
363+
infer_instance
364+
· obtain rfl : n = i + 1 := by lia
365+
infer_instance
366+
367+
omit [EnoughInjectives C] in
368+
lemma quasiIso_truncGEπ [Mono f] [Mono (homologyMap f n)] :
369+
QuasiIso ((cokernel f).πTruncGE n) := by
370+
rw [quasiIso_πTruncGE_iff]
371+
exact isGE_cokernel f n hf
372+
373+
attribute [local instance] HasDerivedCategory.standard in
374+
lemma quasiIsoAt_ι [Mono f] [Mono (homologyMap f n)] (q : ℤ) (hq : q ≤ n) :
375+
QuasiIsoAt (ι f n) q := by
376+
obtain hq | rfl := hq.lt_or_eq'
377+
· have := quasiIsoAt_π f n q hq
378+
rw [← quasiIsoAt_iff_comp_right _ (π f n), mappingCocone.lift_fst]
379+
exact hf q hq
380+
· have := mono_homologyMap_π f n n (by lia)
381+
have : Mono (homologyMap (mappingCocone.triangle (α f n)).mor₁ n) :=
382+
by dsimp; infer_instance
383+
have h₁ := (exact_homologyShortComplex f n).fIsKernel
384+
have h₂ := (CochainComplex.homologyMap_exact₂_of_distTriang _
385+
(DerivedCategory.mappingCocone_triangle_distinguished (α f n)) n).fIsKernel
386+
have : homologyMap (ι f n) n = (IsLimit.conePointUniqueUpToIso h₁ h₂).hom := by
387+
simp [← cancel_mono (homologyMap (π f n) n),
388+
dsimp% IsLimit.conePointUniqueUpToIso_hom_comp h₁ h₂ .zero,
389+
← homologyMap_comp, mappingCocone.lift_fst]
390+
rw [quasiIsoAt_iff_isIso_homologyMap, this]
391+
infer_instance
392+
393+
end step₂
394+
395+
-- This lemma and a few definitions above are made public only in order to please CI.
396+
-- They will be made private again when the proofs of `cm5a_cof` and `cm5a` are added.
397+
open step₂ in
398+
lemma step₂ [EnoughInjectives C] [Mono f] (n₀ n₁ : ℤ)
214399
(hf : ∀ i ≤ n₀, QuasiIsoAt f i) [Mono (homologyMap f n₁)] (hn₁ : n₀ + 1 = n₁ := by lia) :
215-
∃ (F : (cofFib f).FullSubcategory), quasiIsoLE n₁ F ∧ isIsoLE n₁ F
400+
∃ (F : (cofFib f).FullSubcategory), quasiIsoLE n₁ F ∧ isIsoLE n₁ F :=
401+
⟨.mk { mid := mid f n₁, ι := ι f n₁, π := π f n₁}
402+
⟨inferInstance, degreewiseEpiWithInjectiveKernel_π f n₁⟩,
403+
fun i hi ↦ quasiIsoAt_ι f n₁ (fun j hj ↦ hf j (by lia)) _ hi,
404+
isIso_π_f f n₁⟩
216405

217-
proof_wanted step [EnoughInjectives C] [Mono f] (n₀ n₁ : ℤ) (hn₁ : n₀ + 1 = n₁)
406+
public lemma step [EnoughInjectives C] [Mono f] (n₀ n₁ : ℤ) (hn₁ : n₀ + 1 = n₁)
218407
(hf : ∀ i ≤ n₀, QuasiIsoAt f i) (hn₁ : n₀ + 1 = n₁ := by lia) :
219-
∃ (F : (cofFib f).FullSubcategory), quasiIsoLE n₁ F ∧ isIsoLE n₀ F
408+
∃ (F : (cofFib f).FullSubcategory), quasiIsoLE n₁ F ∧ isIsoLE n₀ F := by
409+
obtain ⟨F₁, h₁, h₂, _⟩ := step₁ f n₀ n₁ hf
410+
obtain ⟨F₂, h₃, h₄⟩ := step₂ F₁.obj.ι n₀ n₁ h₁
411+
refine ⟨.mk { mid := F₂.obj.mid, ι := F₂.obj.ι, π := F₂.obj.π ≫ F₁.obj.π }
412+
by dsimp; infer_instance, MorphismProperty.comp_mem _ _ _ F₂.property.2 F₁.property.2⟩,
413+
⟨h₃, fun i hi ↦ ?_⟩⟩
414+
have := h₂ i hi
415+
have := h₄ i (by lia)
416+
dsimp
417+
infer_instance
220418

221419
end cm5a_cof
222420

0 commit comments

Comments
 (0)