Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 956af7c

Browse files
Amelia Livingstonjoelriou
andcommitted
feat(representation_theory/group_cohomology_resolution): add projective resolution (#17443)
Co-authored-by: Joël Riou <joel.riou@universite-paris-saclay.fr>
1 parent 41cf0cc commit 956af7c

File tree

11 files changed

+492
-59
lines changed

11 files changed

+492
-59
lines changed

src/algebra/homology/quasi_iso.lean

Lines changed: 148 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ Copyright (c) 2021 Scott Morrison. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Scott Morrison, Joël Riou
55
-/
6-
import algebra.homology.homology
76
import algebra.homology.homotopy
7+
import category_theory.abelian.homology
88

99
/-!
1010
# Quasi-isomorphisms
@@ -55,14 +55,158 @@ lemma quasi_iso_of_comp_right (f : C ⟶ D) (g : D ⟶ E) [quasi_iso g] [quasi_i
5555
quasi_iso f :=
5656
{ is_iso := λ i, is_iso.of_is_iso_fac_right ((homology_functor V c i).map_comp f g).symm }
5757

58+
namespace homotopy_equiv
59+
60+
section
61+
variables {W : Type*} [category W] [preadditive W] [has_cokernels W] [has_images W]
62+
[has_equalizers W] [has_zero_object W] [has_image_maps W]
63+
5864
/-- An homotopy equivalence is a quasi-isomorphism. -/
59-
lemma homotopy_equiv.to_quasi_iso {W : Type*} [category W] [preadditive W]
60-
[has_cokernels W] [has_images W] [has_equalizers W] [has_zero_object W]
61-
[has_image_maps W] {C D : homological_complex W c} (e : homotopy_equiv C D) :
65+
lemma to_quasi_iso {C D : homological_complex W c} (e : homotopy_equiv C D) :
6266
quasi_iso e.hom :=
6367
⟨λ i, begin
6468
refine ⟨⟨(homology_functor W c i).map e.inv, _⟩⟩,
6569
simp only [← functor.map_comp, ← (homology_functor W c i).map_id],
6670
split; apply homology_map_eq_of_homotopy,
6771
exacts [e.homotopy_hom_inv_id, e.homotopy_inv_hom_id],
6872
end
73+
74+
lemma to_quasi_iso_inv {C D : homological_complex W c} (e : homotopy_equiv C D) (i : ι) :
75+
(@as_iso _ _ _ _ _ (e.to_quasi_iso.1 i)).inv = (homology_functor W c i).map e.inv :=
76+
begin
77+
symmetry,
78+
simp only [←iso.hom_comp_eq_id, as_iso_hom, ←functor.map_comp, ←(homology_functor W c i).map_id,
79+
homology_map_eq_of_homotopy e.homotopy_hom_inv_id _],
80+
end
81+
82+
end
83+
end homotopy_equiv
84+
namespace homological_complex.hom
85+
section to_single₀
86+
variables {W : Type*} [category W] [abelian W]
87+
88+
section
89+
variables {X : chain_complex W ℕ} {Y : W} (f : X ⟶ ((chain_complex.single₀ _).obj Y))
90+
[hf : quasi_iso f]
91+
92+
/-- If a chain map `f : X ⟶ Y[0]` is a quasi-isomorphism, then the cokernel of the differential
93+
`d : X₁ → X₀` is isomorphic to `Y.` -/
94+
noncomputable def to_single₀_cokernel_at_zero_iso : cokernel (X.d 1 0) ≅ Y :=
95+
(X.homology_zero_iso.symm.trans ((@as_iso _ _ _ _ _ (hf.1 0)).trans
96+
((chain_complex.homology_functor_0_single₀ W).app Y)))
97+
98+
lemma to_single₀_cokernel_at_zero_iso_hom_eq [hf : quasi_iso f] :
99+
f.to_single₀_cokernel_at_zero_iso.hom = cokernel.desc (X.d 1 0) (f.f 0)
100+
(by rw ←f.2 1 0 rfl; exact comp_zero) :=
101+
begin
102+
ext,
103+
dunfold to_single₀_cokernel_at_zero_iso chain_complex.homology_zero_iso homology_of_zero_right
104+
homology.map_iso chain_complex.homology_functor_0_single₀ cokernel.map,
105+
dsimp,
106+
simp only [cokernel.π_desc, category.assoc, homology.map_desc, cokernel.π_desc_assoc],
107+
simp [homology.desc, iso.refl_inv (X.X 0)],
108+
end
109+
110+
lemma to_single₀_epi_at_zero [hf : quasi_iso f] :
111+
epi (f.f 0) :=
112+
begin
113+
constructor,
114+
intros Z g h Hgh,
115+
rw [←cokernel.π_desc (X.d 1 0) (f.f 0) (by rw ←f.2 1 0 rfl; exact comp_zero),
116+
←to_single₀_cokernel_at_zero_iso_hom_eq] at Hgh,
117+
rw (@cancel_epi _ _ _ _ _ _ (epi_comp _ _) _ _).1 Hgh,
118+
end
119+
120+
lemma to_single₀_exact_d_f_at_zero [hf : quasi_iso f] :
121+
exact (X.d 1 0) (f.f 0) :=
122+
begin
123+
rw preadditive.exact_iff_homology_zero,
124+
have h : X.d 1 0 ≫ f.f 0 = 0,
125+
{ simp only [← f.2 1 0 rfl, chain_complex.single₀_obj_X_d, comp_zero], },
126+
refine ⟨h, nonempty.intro (homology_iso_kernel_desc _ _ _ ≪≫ _)⟩,
127+
{ suffices : is_iso (cokernel.desc _ _ h),
128+
{ haveI := this, apply kernel.of_mono, },
129+
rw ←to_single₀_cokernel_at_zero_iso_hom_eq,
130+
apply_instance }
131+
end
132+
133+
lemma to_single₀_exact_at_succ [hf : quasi_iso f] (n : ℕ) :
134+
exact (X.d (n + 2) (n + 1)) (X.d (n + 1) n) :=
135+
(preadditive.exact_iff_homology_zero _ _).2 ⟨X.d_comp_d _ _ _,
136+
⟨(chain_complex.homology_succ_iso _ _).symm.trans
137+
((@as_iso _ _ _ _ _ (hf.1 (n + 1))).trans homology_zero_zero)⟩⟩
138+
139+
end
140+
section
141+
variables {X : cochain_complex W ℕ} {Y : W}
142+
(f : (cochain_complex.single₀ _).obj Y ⟶ X)
143+
144+
/-- If a cochain map `f : Y[0] ⟶ X` is a quasi-isomorphism, then the kernel of the differential
145+
`d : X₀ → X₁` is isomorphic to `Y.` -/
146+
noncomputable def from_single₀_kernel_at_zero_iso [hf : quasi_iso f] : kernel (X.d 0 1) ≅ Y :=
147+
(X.homology_zero_iso.symm.trans ((@as_iso _ _ _ _ _ (hf.1 0)).symm.trans
148+
((cochain_complex.homology_functor_0_single₀ W).app Y)))
149+
150+
lemma from_single₀_kernel_at_zero_iso_inv_eq [hf : quasi_iso f] :
151+
f.from_single₀_kernel_at_zero_iso.inv = kernel.lift (X.d 0 1) (f.f 0)
152+
(by rw f.2 0 1 rfl; exact zero_comp) :=
153+
begin
154+
ext,
155+
dunfold from_single₀_kernel_at_zero_iso cochain_complex.homology_zero_iso homology_of_zero_left
156+
homology.map_iso cochain_complex.homology_functor_0_single₀ kernel.map,
157+
simp only [iso.trans_inv, iso.app_inv, iso.symm_inv, category.assoc,
158+
equalizer_as_kernel, kernel.lift_ι],
159+
dsimp,
160+
simp only [category.assoc, homology.π_map, cokernel_zero_iso_target_hom,
161+
cokernel_iso_of_eq_hom_comp_desc, kernel_subobject_arrow, homology.π_map_assoc,
162+
is_iso.inv_comp_eq],
163+
simp [homology.π, kernel_subobject_map_comp, iso.refl_hom (X.X 0), category.comp_id],
164+
end
165+
166+
lemma from_single₀_mono_at_zero [hf : quasi_iso f] :
167+
mono (f.f 0) :=
168+
begin
169+
constructor,
170+
intros Z g h Hgh,
171+
rw [←kernel.lift_ι (X.d 0 1) (f.f 0) (by rw f.2 0 1 rfl; exact zero_comp),
172+
←from_single₀_kernel_at_zero_iso_inv_eq] at Hgh,
173+
rw (@cancel_mono _ _ _ _ _ _ (mono_comp _ _) _ _).1 Hgh,
174+
end
175+
176+
lemma from_single₀_exact_f_d_at_zero [hf : quasi_iso f] :
177+
exact (f.f 0) (X.d 0 1) :=
178+
begin
179+
rw preadditive.exact_iff_homology_zero,
180+
have h : f.f 0 ≫ X.d 0 1 = 0,
181+
{ simp only [homological_complex.hom.comm, cochain_complex.single₀_obj_X_d, zero_comp] },
182+
refine ⟨h, nonempty.intro (homology_iso_cokernel_lift _ _ _ ≪≫ _)⟩,
183+
{ suffices : is_iso (kernel.lift (X.d 0 1) (f.f 0) h),
184+
{ haveI := this, apply cokernel.of_epi },
185+
rw ←from_single₀_kernel_at_zero_iso_inv_eq f,
186+
apply_instance },
187+
end
188+
189+
lemma from_single₀_exact_at_succ [hf : quasi_iso f] (n : ℕ) :
190+
exact (X.d n (n + 1)) (X.d (n + 1) (n + 2)) :=
191+
(preadditive.exact_iff_homology_zero _ _).2
192+
⟨X.d_comp_d _ _ _, ⟨(cochain_complex.homology_succ_iso _ _).symm.trans
193+
((@as_iso _ _ _ _ _ (hf.1 (n + 1))).symm.trans homology_zero_zero)⟩⟩
194+
195+
end
196+
end to_single₀
197+
end homological_complex.hom
198+
199+
variables {A : Type*} [category A] [abelian A] {B : Type*} [category B] [abelian B]
200+
(F : A ⥤ B) [functor.additive F] [preserves_finite_limits F] [preserves_finite_colimits F]
201+
[faithful F]
202+
203+
lemma category_theory.functor.quasi_iso_of_map_quasi_iso
204+
{C D : homological_complex A c} (f : C ⟶ D)
205+
(hf : quasi_iso ((F.map_homological_complex _).map f)) : quasi_iso f :=
206+
⟨λ i, begin
207+
haveI : is_iso (F.map ((homology_functor A c i).map f)),
208+
{ rw [← functor.comp_map, ← nat_iso.naturality_2 (F.homology_functor_iso i) f,
209+
functor.comp_map],
210+
apply_instance, },
211+
exact is_iso_of_reflects_iso _ F,
212+
end

src/algebraic_geometry/open_immersion.lean

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ variables {X Y : PresheafedSpace.{v} C} {f : X ⟶ Y} (H : is_open_immersion f)
110110
abbreviation open_functor := H.base_open.is_open_map.functor
111111

112112
/-- An open immersion `f : X ⟶ Y` induces an isomorphism `X ≅ Y|_{f(X)}`. -/
113-
@[simps] noncomputable
113+
@[simps hom_c_app] noncomputable
114114
def iso_restrict : X ≅ Y.restrict H.base_open :=
115115
PresheafedSpace.iso_of_components (iso.refl _)
116116
begin
@@ -140,11 +140,11 @@ begin
140140
transitivity f.c.app x ≫ X.presheaf.map (𝟙 _),
141141
{ congr },
142142
{ erw [X.presheaf.map_id, category.comp_id] } },
143-
{ simp }
143+
{ refl, }
144144
end
145145

146146
@[simp] lemma iso_restrict_inv_of_restrict : H.iso_restrict.inv ≫ f = Y.of_restrict _ :=
147-
by { rw iso.inv_comp_eq, simp }
147+
by { rw [iso.inv_comp_eq, iso_restrict_hom_of_restrict] }
148148

149149
instance mono [H : is_open_immersion f] : mono f :=
150150
by { rw ← H.iso_restrict_hom_of_restrict, apply mono_comp }

src/category_theory/abelian/homology.lean

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
/-
22
Copyright (c) 2022 Adam Topaz. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
4-
Authors: Adam Topaz
4+
Authors: Adam Topaz, Amelia Livingston
55
-/
6-
import category_theory.abelian.exact
6+
import algebra.homology.additive
77
import category_theory.abelian.pseudoelements
8+
import category_theory.limits.preserves.shapes.kernels
9+
import category_theory.limits.preserves.shapes.images
810

911
/-!
1012
@@ -261,5 +263,49 @@ begin
261263
end
262264

263265
end
264-
265266
end homology
267+
268+
namespace category_theory.functor
269+
270+
variables {ι : Type*} {c : complex_shape ι} {B : Type*} [category B] [abelian B] (F : A ⥤ B)
271+
[functor.additive F] [preserves_finite_limits F] [preserves_finite_colimits F]
272+
273+
/-- When `F` is an exact additive functor, `F(Hᵢ(X)) ≅ Hᵢ(F(X))` for `X` a complex. -/
274+
noncomputable def homology_iso (C : homological_complex A c) (j : ι) :
275+
F.obj (C.homology j) ≅ ((F.map_homological_complex _).obj C).homology j :=
276+
(preserves_cokernel.iso _ _).trans (cokernel.map_iso _ _ ((F.map_iso (image_subobject_iso _)).trans
277+
((preserves_image.iso _ _).symm.trans (image_subobject_iso _).symm))
278+
((F.map_iso (kernel_subobject_iso _)).trans ((preserves_kernel.iso _ _).trans
279+
(kernel_subobject_iso _).symm))
280+
begin
281+
dsimp,
282+
ext,
283+
simp only [category.assoc, image_to_kernel_arrow],
284+
erw [kernel_subobject_arrow', kernel_comparison_comp_ι, image_subobject_arrow'],
285+
simp [←F.map_comp],
286+
end)
287+
288+
/-- If `F` is an exact additive functor, then `F` commutes with `Hᵢ` (up to natural isomorphism). -/
289+
noncomputable def homology_functor_iso (i : ι) :
290+
homology_functor A c i ⋙ F ≅ F.map_homological_complex c ⋙ homology_functor B c i :=
291+
nat_iso.of_components (λ X, homology_iso F X i)
292+
begin
293+
intros X Y f,
294+
dsimp,
295+
rw [←iso.inv_comp_eq, ←category.assoc, ←iso.eq_comp_inv],
296+
refine coequalizer.hom_ext _,
297+
dsimp [homology_iso],
298+
simp only [homology.map, ←category.assoc, cokernel.π_desc],
299+
simp only [category.assoc, cokernel_comparison_map_desc, cokernel.π_desc,
300+
π_comp_cokernel_comparison, ←F.map_comp],
301+
erw ←kernel_subobject_iso_comp_kernel_map_assoc,
302+
simp only [homological_complex.hom.sq_from_right,
303+
homological_complex.hom.sq_from_left, F.map_homological_complex_map_f, F.map_comp],
304+
dunfold homological_complex.d_from homological_complex.hom.next,
305+
dsimp,
306+
rw [kernel_map_comp_preserves_kernel_iso_inv_assoc, ←F.map_comp_assoc,
307+
←kernel_map_comp_kernel_subobject_iso_inv],
308+
any_goals { simp },
309+
end
310+
311+
end category_theory.functor

src/category_theory/abelian/injective_resolution.lean

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ Copyright (c) 2022 Jujian Zhang. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Jujian Zhang, Scott Morrison
55
-/
6+
import algebra.homology.quasi_iso
67
import category_theory.preadditive.injective_resolution
7-
import category_theory.abelian.exact
8+
import category_theory.abelian.homology
89
import algebra.homology.homotopy_category
910

1011
/-!
@@ -276,5 +277,22 @@ instance : has_injective_resolutions C :=
276277
{ out := λ _, infer_instance }
277278

278279
end InjectiveResolution
279-
280280
end category_theory
281+
namespace homological_complex.hom
282+
283+
variables {C : Type u} [category.{v} C] [abelian C]
284+
285+
/-- If `X` is a cochain complex of injective objects and we have a quasi-isomorphism
286+
`f : Y[0] ⟶ X`, then `X` is an injective resolution of `Y.` -/
287+
def homological_complex.hom.from_single₀_InjectiveResolution (X : cochain_complex C ℕ) (Y : C)
288+
(f : (cochain_complex.single₀ C).obj Y ⟶ X) [quasi_iso f]
289+
(H : ∀ n, injective (X.X n)) :
290+
InjectiveResolution Y :=
291+
{ cocomplex := X,
292+
ι := f,
293+
injective := H,
294+
exact₀ := f.from_single₀_exact_f_d_at_zero,
295+
exact := f.from_single₀_exact_at_succ,
296+
mono := f.from_single₀_mono_at_zero }
297+
298+
end homological_complex.hom

src/category_theory/abelian/projective.lean

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ Copyright (c) 2020 Markus Himmel. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Markus Himmel, Scott Morrison, Jakob von Raumer
55
-/
6-
import category_theory.abelian.exact
6+
import algebra.homology.quasi_iso
7+
import category_theory.abelian.homology
78
import category_theory.preadditive.projective_resolution
89

910
/-!
@@ -20,7 +21,7 @@ open category_theory
2021
open category_theory.limits
2122
open opposite
2223

23-
universes v u
24+
universes v u v' u'
2425

2526
namespace category_theory
2627

@@ -93,5 +94,22 @@ instance : has_projective_resolutions C :=
9394
{ out := λ Z, by apply_instance }
9495

9596
end ProjectiveResolution
96-
9797
end category_theory
98+
namespace homological_complex.hom
99+
100+
variables {C : Type u} [category.{v} C] [abelian C]
101+
102+
/-- If `X` is a chain complex of projective objects and we have a quasi-isomorphism `f : X ⟶ Y[0]`,
103+
then `X` is a projective resolution of `Y.` -/
104+
def to_single₀_ProjectiveResolution {X : chain_complex C ℕ} {Y : C}
105+
(f : X ⟶ (chain_complex.single₀ C).obj Y) [quasi_iso f]
106+
(H : ∀ n, projective (X.X n)) :
107+
ProjectiveResolution Y :=
108+
{ complex := X,
109+
π := f,
110+
projective := H,
111+
exact₀ := f.to_single₀_exact_d_f_at_zero,
112+
exact := f.to_single₀_exact_at_succ,
113+
epi := f.to_single₀_epi_at_zero }
114+
115+
end homological_complex.hom

src/category_theory/limits/preserves/shapes/kernels.lean

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,17 @@ begin
114114
apply_instance
115115
end
116116

117+
@[reassoc] lemma kernel_map_comp_preserves_kernel_iso_inv {X' Y' : C} (g : X' ⟶ Y') [has_kernel g]
118+
[has_kernel (G.map g)] [preserves_limit (parallel_pair g 0) G] (p : X ⟶ X') (q : Y ⟶ Y')
119+
(hpq : f ≫ q = p ≫ g) :
120+
kernel.map (G.map f) (G.map g) (G.map p) (G.map q)
121+
(by rw [←G.map_comp, hpq, G.map_comp]) ≫ (preserves_kernel.iso G _).inv
122+
= (preserves_kernel.iso G _).inv ≫ G.map (kernel.map f g p q hpq) :=
123+
begin
124+
rw [iso.comp_inv_eq, category.assoc, preserves_kernel.iso_hom, iso.eq_inv_comp],
125+
exact kernel_comparison_comp_kernel_map _ _ _ _ _ _,
126+
end
127+
117128
end kernels
118129

119130
section cokernels
@@ -206,6 +217,17 @@ begin
206217
apply_instance
207218
end
208219

220+
@[reassoc] lemma preserves_cokernel_iso_comp_cokernel_map {X' Y' : C} (g : X' ⟶ Y')
221+
[has_cokernel g] [has_cokernel (G.map g)] [preserves_colimit (parallel_pair g 0) G]
222+
(p : X ⟶ X') (q : Y ⟶ Y') (hpq : f ≫ q = p ≫ g) :
223+
(preserves_cokernel.iso G _).hom ≫ cokernel.map (G.map f) (G.map g) (G.map p) (G.map q)
224+
(by rw [←G.map_comp, hpq, G.map_comp]) =
225+
G.map (cokernel.map f g p q hpq) ≫ (preserves_cokernel.iso G _).hom :=
226+
begin
227+
rw [←iso.comp_inv_eq, category.assoc, ←iso.eq_inv_comp],
228+
exact cokernel_map_comp_cokernel_comparison _ _ _ _ _ _,
229+
end
230+
209231
end cokernels
210232

211233
end category_theory.limits

0 commit comments

Comments
 (0)