Skip to content

Commit 95b192f

Browse files
committed
feat(Algebra/Homology): K-projective cochain complexes (#32741)
We define the notion of K-projective cochain complex in an abelian category, and show that bounded above complexes of projective objects are K-projective. This is the dual results to #31941: the main lemma is obtained by dualising the corresponding lemma for K-injective complexes. We also dualise the result from #31900: morphisms in the derived category from a K-projective cochain complex identify to homotopy classes of morphisms.
1 parent f62eba1 commit 95b192f

File tree

5 files changed

+172
-1
lines changed

5 files changed

+172
-1
lines changed

Mathlib.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,7 @@ public import Mathlib.Algebra.Homology.DerivedCategory.Fractions
551551
public import Mathlib.Algebra.Homology.DerivedCategory.FullyFaithful
552552
public import Mathlib.Algebra.Homology.DerivedCategory.HomologySequence
553553
public import Mathlib.Algebra.Homology.DerivedCategory.KInjective
554+
public import Mathlib.Algebra.Homology.DerivedCategory.KProjective
554555
public import Mathlib.Algebra.Homology.DerivedCategory.Linear
555556
public import Mathlib.Algebra.Homology.DerivedCategory.ShortExact
556557
public import Mathlib.Algebra.Homology.DerivedCategory.SingleTriangle
@@ -599,6 +600,7 @@ public import Mathlib.Algebra.Homology.HomotopyCategory.HomComplexShift
599600
public import Mathlib.Algebra.Homology.HomotopyCategory.HomComplexSingle
600601
public import Mathlib.Algebra.Homology.HomotopyCategory.HomologicalFunctor
601602
public import Mathlib.Algebra.Homology.HomotopyCategory.KInjective
603+
public import Mathlib.Algebra.Homology.HomotopyCategory.KProjective
602604
public import Mathlib.Algebra.Homology.HomotopyCategory.MappingCone
603605
public import Mathlib.Algebra.Homology.HomotopyCategory.Pretriangulated
604606
public import Mathlib.Algebra.Homology.HomotopyCategory.Shift

Mathlib/Algebra/Homology/CochainComplexOpposite.lean

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,4 +178,17 @@ def homotopyOpEquiv {K L : CochainComplex C ℤ} {f g : K ⟶ L} :
178178
simp [homotopyOp_hom_eq _ p q (-p) (-q),
179179
homotopyUnop_hom_eq _ (-q) (-p) q p]
180180

181+
lemma exactAt_op {K : CochainComplex C ℤ} {n : ℤ} (hK : K.ExactAt n)
182+
(m : ℤ) (hm : n + m = 0 := by lia) :
183+
((opEquivalence C).functor.obj (op K)).ExactAt m := by
184+
obtain rfl : n = -m := by lia
185+
rw [HomologicalComplex.exactAt_iff' _ (m - 1) m (m + 1) (by simp) (by simp),
186+
← ShortComplex.exact_unop_iff]
187+
rwa [HomologicalComplex.exactAt_iff' _ (-(m + 1)) (-m) (-(m - 1)) (by grind [prev])
188+
(by grind [next])] at hK
189+
190+
lemma acyclic_op {K : CochainComplex C ℤ} (hK : K.Acyclic) :
191+
((opEquivalence C).functor.obj (op K)).Acyclic :=
192+
fun n ↦ exactAt_op (hK (-n)) n
193+
181194
end CochainComplex
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/-
2+
Copyright (c) 2025 Joël Riou. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Joël Riou
5+
-/
6+
module
7+
8+
public import Mathlib.Algebra.Homology.DerivedCategory.Basic
9+
public import Mathlib.Algebra.Homology.HomotopyCategory.KProjective
10+
11+
/-!
12+
# Morphisms from K-projective complexes in the derived category
13+
14+
In this file, we show that if `K : CochainComplex C ℤ` is K-projective,
15+
then for any `L : HomotopyCategory C (.up ℤ)`, the functor `DerivedCategory.Qh`
16+
induces a bijection from the type of morphisms `(HomotopyCategory.quotient _ _).obj K) ⟶ L`
17+
(i.e. homotopy classes of morphisms of cochain complexes) to the type of
18+
morphisms in the derived category.
19+
20+
-/
21+
22+
@[expose] public section
23+
24+
universe w v u
25+
26+
open CategoryTheory
27+
28+
variable {C : Type u} [Category.{v} C] [Abelian C]
29+
30+
lemma CochainComplex.IsKProjective.Qh_map_bijective [HasDerivedCategory C]
31+
(K : CochainComplex C ℤ) (L : HomotopyCategory C (ComplexShape.up ℤ))
32+
[K.IsKProjective] :
33+
Function.Bijective (DerivedCategory.Qh.map :
34+
((HomotopyCategory.quotient _ _).obj K ⟶ L) → _ ) :=
35+
(CochainComplex.IsKProjective.leftOrthogonal K).map_bijective_of_isTriangulated _ _

Mathlib/Algebra/Homology/HomotopyCategory/KInjective.lean

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ and show that bounded below complexes of injective objects are K-injective.
1818
1919
## TODO (@joelriou)
2020
* Provide an API for computing `Ext`-groups using an injective resolution
21-
* Dualize everything
2221
2322
## References
2423
* [N. Spaltenstein, *Resolutions of unbounded complexes*][spaltenstein1998]
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
/-
2+
Copyright (c) 2025 Joël Riou. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Joël Riou
5+
-/
6+
module
7+
8+
public import Mathlib.Algebra.Homology.HomotopyCategory.KInjective
9+
public import Mathlib.Algebra.Homology.CochainComplexOpposite
10+
11+
/-!
12+
# K-projective cochain complexes
13+
14+
We define the notion of K-projective cochain complex in an abelian category,
15+
and show that bounded above complexes of projective objects are K-projective.
16+
17+
## TODO (@joelriou)
18+
* Provide an API for computing `Ext`-groups using a projective resolution
19+
20+
## References
21+
* [N. Spaltenstein, *Resolutions of unbounded complexes*][spaltenstein1998]
22+
23+
-/
24+
25+
@[expose] public section
26+
27+
namespace CochainComplex
28+
29+
open CategoryTheory Limits HomComplex Preadditive Opposite
30+
31+
variable {C : Type*} [Category C] [Abelian C]
32+
33+
-- TODO (@joelriou): show that this definition is equivalent to the
34+
-- original definition by Spaltenstein saying that whenever `L`
35+
-- is acyclic, then `HomComplex K L` is acyclic. (The condition below
36+
-- is equivalent to the acyclicity of `HomComplex K L` in degree
37+
-- `0`, and the general case follows by shifting `L`.)
38+
/-- A cochain complex `K` is K-projective if any morphism `K ⟶ L`
39+
with `L` acyclic is homotopic to zero. -/
40+
class IsKProjective (K : CochainComplex C ℤ) : Prop where
41+
nonempty_homotopy_zero {L : CochainComplex C ℤ} (f : K ⟶ L) :
42+
L.Acyclic → Nonempty (Homotopy f 0)
43+
44+
/-- A choice of homotopy to zero for a morphism from a
45+
K-projective cochain complex to an acyclic cochain complex. -/
46+
noncomputable irreducible_def IsKProjective.homotopyZero
47+
{K L : CochainComplex C ℤ} (f : K ⟶ L)
48+
(hL : L.Acyclic) [K.IsKProjective] :
49+
Homotopy f 0 :=
50+
(IsKProjective.nonempty_homotopy_zero f hL).some
51+
52+
lemma _root_.HomotopyEquiv.isKProjective {K₁ K₂ : CochainComplex C ℤ}
53+
(e : HomotopyEquiv K₁ K₂)
54+
[K₁.IsKProjective] : K₂.IsKProjective where
55+
nonempty_homotopy_zero {L} f hL :=
56+
⟨Homotopy.trans (Homotopy.trans (.ofEq (by simp))
57+
((e.homotopyInvHomId.symm.compRight f).trans (.ofEq (by simp))))
58+
(((IsKProjective.homotopyZero (e.hom ≫ f) hL).compLeft e.inv).trans (.ofEq (by simp)))⟩
59+
60+
lemma isKProjective_of_iso {K₁ K₂ : CochainComplex C ℤ} (e : K₁ ≅ K₂)
61+
[K₁.IsKProjective] :
62+
K₂.IsKProjective :=
63+
(HomotopyEquiv.ofIso e).isKProjective
64+
65+
lemma isKProjective_iff_of_iso {K₁ K₂ : CochainComplex C ℤ} (e : K₁ ≅ K₂) :
66+
K₁.IsKProjective ↔ K₂.IsKProjective :=
67+
fun _ ↦ isKProjective_of_iso e, fun _ ↦ isKProjective_of_iso e.symm⟩
68+
69+
lemma isKProjective_iff_leftOrthogonal (K : CochainComplex C ℤ) :
70+
K.IsKProjective ↔
71+
(HomotopyCategory.subcategoryAcyclic C).leftOrthogonal
72+
((HomotopyCategory.quotient _ _).obj K) := by
73+
refine ⟨fun _ L f hL ↦ ?_,
74+
fun hK ↦ ⟨fun {L} f hL ↦ ⟨HomotopyCategory.homotopyOfEq _ _ ?_⟩⟩⟩
75+
· obtain ⟨L, rfl⟩ := HomotopyCategory.quotient_obj_surjective L
76+
obtain ⟨f, rfl⟩ := (HomotopyCategory.quotient _ _).map_surjective f
77+
rw [HomotopyCategory.quotient_obj_mem_subcategoryAcyclic_iff_acyclic] at hL
78+
rw [HomotopyCategory.eq_of_homotopy f 0 (IsKProjective.homotopyZero f hL), Functor.map_zero]
79+
· rw [← HomotopyCategory.quotient_obj_mem_subcategoryAcyclic_iff_acyclic] at hL
80+
rw [hK ((HomotopyCategory.quotient _ _).map f) hL, Functor.map_zero]
81+
82+
lemma IsKProjective.leftOrthogonal (K : CochainComplex C ℤ) [K.IsKProjective] :
83+
(HomotopyCategory.subcategoryAcyclic C).leftOrthogonal
84+
((HomotopyCategory.quotient _ _).obj K) := by
85+
rwa [← isKProjective_iff_leftOrthogonal]
86+
87+
instance (K : CochainComplex C ℤ) [hK : K.IsKProjective] (n : ℤ) :
88+
(K⟦n⟧).IsKProjective := by
89+
rw [isKProjective_iff_leftOrthogonal] at hK ⊢
90+
exact ObjectProperty.prop_of_iso _
91+
(((HomotopyCategory.quotient C (.up ℤ)).commShiftIso n).symm.app K)
92+
((HomotopyCategory.subcategoryAcyclic C).leftOrthogonal.le_shift n _ hK)
93+
94+
lemma isKProjective_shift_iff (K : CochainComplex C ℤ) (n : ℤ) :
95+
(K⟦n⟧).IsKProjective ↔ K.IsKProjective :=
96+
fun _ ↦ isKProjective_of_iso (show K⟦n⟧⟦-n⟧ ≅ K from (shiftEquiv _ n).unitIso.symm.app K),
97+
fun _ ↦ inferInstance⟩
98+
99+
lemma isKProjective_of_op {K : CochainComplex C ℤ}
100+
(hK : IsKInjective ((opEquivalence C).functor.obj (op K))) :
101+
K.IsKProjective where
102+
nonempty_homotopy_zero {L} f hL :=
103+
⟨homotopyUnop ((IsKInjective.homotopyZero
104+
((opEquivalence C).functor.map f.op) (acyclic_op hL)).trans
105+
(.ofEq (by simp)))⟩
106+
107+
attribute [local simp] opEquivalence ChainComplex.cochainComplexEquivalence in
108+
open Cochain.InductionUp in
109+
lemma isKProjective_of_projective (K : CochainComplex C ℤ) (d : ℤ)
110+
[K.IsStrictlyLE d] [∀ (n : ℤ), Projective (K.X n)] :
111+
K.IsKProjective := by
112+
let L := ((opEquivalence C).functor.obj (op K))
113+
have (n : ℤ) : Injective (L.X n) := by
114+
dsimp [L]
115+
infer_instance
116+
have : L.IsStrictlyGE (-d) := by
117+
rw [isStrictlyGE_iff]
118+
intro i hi
119+
exact (K.isZero_of_isStrictlyLE d _ (by dsimp; lia)).op
120+
exact isKProjective_of_op (isKInjective_of_injective L (-d))
121+
122+
end CochainComplex

0 commit comments

Comments
 (0)