@@ -12,27 +12,26 @@ import Mathlib.RingTheory.Regular.Category
1212import Mathlib.RingTheory.Regular.RegularSequence
1313import Mathlib.Algebra.Module.LocalizedModule.AtPrime
1414import Mathlib.RingTheory.LocalRing.ResidueField.Basic
15+ import Mathlib.LinearAlgebra.Dimension.Finite
16+ import Mathlib.Algebra.Category.ModuleCat.Projective
17+ import Mathlib.RingTheory.Localization.Module
18+ import Mathlib.Algebra.Module.LocalizedModule.Exact
19+ import Mathlib.RingTheory.LocalProperties.Projective
20+ import Mathlib.Algebra.Category.Grp.Zero
21+ import Mathlib.Algebra.Homology.DerivedCategory.Ext.EnoughInjectives
22+ import Mathlib.Algebra.Category.ModuleCat.EnoughInjectives
1523/-!
1624# The Global Dimension of a Ring
1725-/
1826
1927--set_option pp.universes true
2028
21- universe u v
29+ universe v u
2230
2331variable (R : Type u) [CommRing R]
2432
2533open CategoryTheory IsLocalRing RingTheory.Sequence
2634
27- def HasGlobalDimensionLE (n : ℕ) : Prop :=
28- ∀ (M : ModuleCat.{v} R), HasProjectiveDimensionLE M n
29-
30- noncomputable def globalDimension : ℕ∞ :=
31- sInf (({(n : ℕ) | HasGlobalDimensionLE.{u, v} R n}).image WithTop.some)
32-
33- lemma HasGlobalDimensionLE_iff (n : ℕ) : HasGlobalDimensionLE R n ↔ globalDimension R ≤ n := by
34- sorry
35-
3635section ProjectiveDimension
3736
3837variable {C : Type u} [Category.{v, u} C] [Abelian C]
@@ -42,31 +41,157 @@ variable {C : Type u} [Category.{v, u} C] [Abelian C]
4241noncomputable def projectiveDimension (X : C) : WithBot ℕ∞ :=
4342 sInf {n : WithBot ℕ∞ | ∀ (i : ℕ), n < i → HasProjectiveDimensionLT X i}
4443
44+ /-
4545noncomputable def nonnegProjectiveDimension (X : C) : ℕ∞ :=
4646 sInf (({(n : ℕ) | HasProjectiveDimensionLT X n}).image WithTop.some)
47+ -/
4748
48- lemma projectiveDimension_eq_of_iso ( X Y : C) (e : X ≅ Y) :
49+ lemma projectiveDimension_eq_of_iso { X Y : C} (e : X ≅ Y) :
4950 projectiveDimension X = projectiveDimension Y := by
50- sorry
51+ simp only [projectiveDimension]
52+ congr! 5
53+ exact ⟨fun h ↦ hasProjectiveDimensionLT_of_iso e _,
54+ fun h ↦ hasProjectiveDimensionLT_of_iso e.symm _⟩
55+
56+ lemma hasProjectiveDimensionLT_of_projectiveDimension_lt (X : C) (n : ℕ)
57+ (h : projectiveDimension X < n) : HasProjectiveDimensionLT X n := by
58+ have : projectiveDimension X ∈ _ := csInf_mem (by
59+ use ⊤
60+ simp)
61+ simp only [Set.mem_setOf_eq] at this
62+ exact this n h
5163
5264lemma projectiveDimension_le_iff (X : C) (n : ℕ) : projectiveDimension X ≤ n ↔
5365 HasProjectiveDimensionLE X n := by
54- sorry
66+ refine ⟨fun h ↦ ?_, fun h ↦ ?_⟩
67+ · apply hasProjectiveDimensionLT_of_projectiveDimension_lt X (n + 1 )
68+ exact lt_of_le_of_lt h (Nat.cast_lt.mpr (lt_add_one n))
69+ · apply sInf_le
70+ simp only [Set.mem_setOf_eq, Nat.cast_lt]
71+ intro i hi
72+ exact hasProjectiveDimensionLT_of_ge X (n + 1 ) i hi
73+
74+ lemma projectiveDimension_ge_iff (X : C) (n : ℕ) : n ≤ projectiveDimension X ↔
75+ ¬ HasProjectiveDimensionLT X n := by
76+ refine ⟨fun h ↦ ?_, fun h ↦ ?_⟩
77+ · simp only [projectiveDimension, le_sInf_iff, Set.mem_setOf_eq] at h
78+ by_contra lt
79+ by_cases eq0 : n = 0
80+ · have := h ⊥ (fun i _ ↦ (hasProjectiveDimensionLT_of_ge X n i (by simp [eq0])))
81+ simp [eq0] at this
82+ · have : ∀ (i : ℕ), (n - 1 : ℕ) < (i : WithBot ℕ∞) → HasProjectiveDimensionLT X i := by
83+ intro i hi
84+ exact hasProjectiveDimensionLT_of_ge X n i (Nat.le_of_pred_lt (Nat.cast_lt.mp hi))
85+ have not := Nat.cast_le.mp (h (n - 1 : ℕ) this)
86+ omega
87+ · simp only [projectiveDimension, le_sInf_iff, Set.mem_setOf_eq]
88+ intro m hm
89+ by_contra nle
90+ exact h (hm _ (lt_of_not_ge nle))
5591
5692lemma projectiveDimension_eq_bot_iff (X : C) : projectiveDimension X = ⊥ ↔
5793 Limits.IsZero X := by
58- sorry
94+ refine ⟨fun h ↦ ?_, fun h ↦ ?_⟩
95+ · have : HasProjectiveDimensionLT X 0 := by
96+ apply hasProjectiveDimensionLT_of_projectiveDimension_lt X 0
97+ simp [h, bot_lt_iff_ne_bot]
98+ exact isZero_of_hasProjectiveDimensionLT_zero X
99+ · rw [eq_bot_iff]
100+ apply sInf_le
101+ intro i _
102+ have := h.hasProjectiveDimensionLT_zero
103+ apply hasProjectiveDimensionLT_of_ge X 0 i (Nat.zero_le i)
104+
105+ lemma projectiveDimension_eq_find (X : C) (h : ∃ n, HasProjectiveDimensionLE X n)
106+ (nzero : ¬ Limits.IsZero X) [DecidablePred (HasProjectiveDimensionLE X)] :
107+ projectiveDimension X = Nat.find h := by
108+ apply le_antisymm ((projectiveDimension_le_iff _ _).mpr (Nat.find_spec h))
109+ apply (projectiveDimension_ge_iff _ _).mpr
110+ by_cases eq0 : Nat.find h = 0
111+ · simp only [eq0]
112+ by_contra
113+ exact nzero (isZero_of_hasProjectiveDimensionLT_zero X)
114+ · rw [← Nat.succ_pred_eq_of_ne_zero eq0]
115+ exact (Nat.find_min h (Nat.sub_one_lt eq0))
59116
117+ /-
60118lemma projectiveDimension_eq_nonnegProjectiveDimension_of_not_zero (X : C) (h : ¬ Limits.IsZero X) :
61119 nonnegProjectiveDimension X = projectiveDimension X := by
62120 sorry
121+ -/
63122
64123lemma projectiveDimension_ne_top_iff (X : C) : projectiveDimension X ≠ ⊤ ↔
65124 ∃ n, HasProjectiveDimensionLE X n := by
66- sorry
125+ simp only [projectiveDimension, ne_eq, sInf_eq_top, Set.mem_setOf_eq, not_forall]
126+ refine ⟨fun ⟨x, hx, ne⟩ ↦ ?_, fun ⟨n, hn⟩ ↦ ?_⟩
127+ · by_cases eqbot : x = ⊥
128+ · use 0
129+ have := hx 0 (by simp [eqbot, bot_lt_iff_ne_bot])
130+ exact instHasProjectiveDimensionLTSucc X 0
131+ · have : x.unbot eqbot ≠ ⊤ := by
132+ by_contra eq
133+ rw [← WithBot.coe_inj, WithBot.coe_unbot, WithBot.coe_top] at eq
134+ exact ne eq
135+ use (x.unbot eqbot).toNat
136+ have eq : x = (x.unbot eqbot).toNat := (WithBot.coe_unbot x eqbot).symm.trans
137+ (WithBot.coe_inj.mpr (ENat.coe_toNat this).symm)
138+ have : x < ((x.unbot eqbot).toNat + 1 : ℕ) := by
139+ nth_rw 1 [eq]
140+ exact Nat.cast_lt.mpr (lt_add_one _)
141+ exact hx ((x.unbot eqbot).toNat + 1 : ℕ) this
142+ · use n
143+ simpa using ⟨fun i hi ↦ hasProjectiveDimensionLT_of_ge X (n + 1 ) i hi,
144+ WithBot.coe_inj.not.mpr (ENat.coe_ne_top n)⟩
67145
146+ /-
68147lemma nonnegProjectiveDimension_ne_top_iff (X : C) : nonnegProjectiveDimension X ≠ ⊤ ↔
69148 ∃ n, HasProjectiveDimensionLE X n := by
70149 sorry
150+ -/
151+
152+ open Limits Abelian in
153+ lemma hasProjectiveDimensionLT_one_iff (X : C) :
154+ Projective X ↔ HasProjectiveDimensionLT X 1 := by
155+ letI := HasExt.standard C
156+ refine ⟨fun h ↦ inferInstance, fun ⟨h⟩ ↦ ⟨?_⟩⟩
157+ intro Z Y f g epi
158+ let S := ShortComplex.mk (kernel.ι g) g (kernel.condition g)
159+ have S_exact : S.ShortExact := {
160+ exact := ShortComplex.exact_kernel g
161+ mono_f := equalizer.ι_mono
162+ epi_g := epi}
163+ have : IsZero (AddCommGrp.of (Ext X S.X₁ 1 )) := by
164+ let _ := h 1 (le_refl 1 ) (Y := S.X₁)
165+ exact AddCommGrp.isZero_of_subsingleton _
166+ have exac := Ext.covariant_sequence_exact₃' X S_exact 0 1 (zero_add 1 )
167+ have surj: Function.Surjective ((Ext.mk₀ S.g).postcomp X (add_zero 0 )) :=
168+ (AddCommGrp.epi_iff_surjective _).mp (exac.epi_f (this.eq_zero_of_tgt _))
169+ rcases surj (Ext.mk₀ f) with ⟨f', hf'⟩
170+ use Ext.addEquiv₀ f'
171+ simp only [AddMonoidHom.flip_apply, Ext.bilinearComp_apply_apply] at hf'
172+ rw [← Ext.mk₀_addEquiv₀_apply f', Ext.mk₀_comp_mk₀] at hf'
173+ exact (Ext.mk₀_bijective X Y).1 hf'
71174
72175end ProjectiveDimension
176+
177+ section GlobalDimension
178+
179+ variable (R : Type u) [CommRing R]
180+
181+ open Abelian
182+
183+ noncomputable def globalDimension : WithBot ℕ∞ :=
184+ ⨆ (M : ModuleCat.{v} R), projectiveDimension.{v} M
185+
186+ lemma globalDimension_eq_bot_iff [Small.{v} R] : globalDimension.{v} R = ⊥ ↔ Subsingleton R := by
187+ simp only [globalDimension, iSup_eq_bot, projectiveDimension_eq_bot_iff,
188+ ModuleCat.isZero_iff_subsingleton]
189+ refine ⟨fun h ↦ ?_, fun h M ↦ Module.subsingleton R M⟩
190+ let _ := h (ModuleCat.of R (Shrink.{v} R))
191+ exact (equivShrink.{v} R).subsingleton
192+
193+ lemma globalDimension_le_iff (n : ℕ) : globalDimension.{v} R ≤ n ↔
194+ ∀ M : ModuleCat.{v} R, HasProjectiveDimensionLE M n := by
195+ simp [globalDimension, projectiveDimension_le_iff]
196+
197+ end GlobalDimension
0 commit comments