Skip to content

Commit d325d10

Browse files
committed
Merge branch 'Global-Dimension' into Global-Dimension-of-Regular-Local-Ring
2 parents f3fd492 + ad71043 commit d325d10

1 file changed

Lines changed: 140 additions & 15 deletions

File tree

Mathlib/RingTheory/GlobalDimension.lean

Lines changed: 140 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,26 @@ import Mathlib.RingTheory.Regular.Category
1212
import Mathlib.RingTheory.Regular.RegularSequence
1313
import Mathlib.Algebra.Module.LocalizedModule.AtPrime
1414
import 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

2331
variable (R : Type u) [CommRing R]
2432

2533
open 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-
3635
section ProjectiveDimension
3736

3837
variable {C : Type u} [Category.{v, u} C] [Abelian C]
@@ -42,31 +41,157 @@ variable {C : Type u} [Category.{v, u} C] [Abelian C]
4241
noncomputable def projectiveDimension (X : C) : WithBot ℕ∞ :=
4342
sInf {n : WithBot ℕ∞ | ∀ (i : ℕ), n < i → HasProjectiveDimensionLT X i}
4443

44+
/-
4545
noncomputable 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

5264
lemma 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

5692
lemma 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+
/-
60118
lemma projectiveDimension_eq_nonnegProjectiveDimension_of_not_zero (X : C) (h : ¬ Limits.IsZero X) :
61119
nonnegProjectiveDimension X = projectiveDimension X := by
62120
sorry
121+
-/
63122

64123
lemma 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 usingfun i hi ↦ hasProjectiveDimensionLT_of_ge X (n + 1) i hi,
144+
WithBot.coe_inj.not.mpr (ENat.coe_ne_top n)⟩
67145

146+
/-
68147
lemma 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

72175
end 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

Comments
 (0)