-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Expand file tree
/
Copy pathStandardSmooth.lean
More file actions
206 lines (156 loc) · 8.31 KB
/
Copy pathStandardSmooth.lean
File metadata and controls
206 lines (156 loc) · 8.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
/-
Copyright (c) 2024 Christian Merten. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jung Tao Cheng, Christian Merten, Andrew Yang
-/
module
public import Mathlib.RingTheory.Extension.Presentation.Submersive
/-!
# Standard smooth algebras
A standard smooth algebra is an algebra that admits a `SubmersivePresentation`. A standard
smooth algebra is of relative dimension `n` if it admits a submersive presentation of
dimension `n`.
While every standard smooth algebra is smooth, the converse does not hold. But if `S` is `R`-smooth,
then `S` is `R`-standard smooth locally on `S`, i.e. there exists a set `{ t }` of `S` that
generates the unit ideal, such that `Sₜ` is `R`-standard smooth for every `t` (TODO, see below).
## Main definitions
All of these are in the `Algebra` namespace. Let `S` be an `R`-algebra.
- `Algebra.IsStandardSmooth`: `S` is `R`-standard smooth if `S` admits a submersive
`R`-presentation.
- `Algebra.IsStandardSmooth.relativeDimension`: If `S` is `R`-standard smooth this is the dimension
of an arbitrary submersive `R`-presentation of `S`. This is independent of the choice
of the presentation (TODO, see below).
- `Algebra.IsStandardSmoothOfRelativeDimension n`: `S` is `R`-standard smooth of relative dimension
`n` if it admits a submersive `R`-presentation of dimension `n`.
## TODO
- Show that locally on the target, smooth algebras are standard smooth.
## Notes
This contribution was created as part of the AIM workshop "Formalizing algebraic geometry"
in June 2024.
-/
@[expose] public section
universe t t' w w' u v
open TensorProduct Module MvPolynomial
variable (n m : ℕ)
namespace Algebra
variable (R : Type u) (S : Type v) (ι : Type w) (σ : Type t) [CommRing R] [CommRing S] [Algebra R S]
attribute [local instance] Fintype.ofFinite
/--
An `R`-algebra `S` is called standard smooth, if there
exists a submersive presentation.
-/
class IsStandardSmooth : Prop where
out : ∃ (ι σ : Type) (_ : Finite σ), Finite ι ∧ Nonempty (SubmersivePresentation R S ι σ)
variable [Finite σ]
variable {R S ι σ} in
lemma SubmersivePresentation.isStandardSmooth [Finite ι] (P : SubmersivePresentation R S ι σ) :
IsStandardSmooth R S := by
exact ⟨_, _, _, inferInstance, ⟨P.reindex (Fintype.equivFin _).symm (Fintype.equivFin _).symm⟩⟩
/--
The relative dimension of a standard smooth `R`-algebra `S` is
the dimension of an arbitrarily chosen submersive `R`-presentation of `S`.
Note: If `S` is non-trivial, this number is independent of the choice of the presentation as it is
equal to the `S`-rank of `Ω[S/R]`
(see `IsStandardSmoothOfRelativeDimension.rank_kaehlerDifferential`).
-/
noncomputable def IsStandardSmooth.relativeDimension [IsStandardSmooth R S] : ℕ :=
letI := ‹IsStandardSmooth R S›.out.choose_spec.choose_spec.choose
‹IsStandardSmooth R S›.out.choose_spec.choose_spec.choose_spec.2.some.dimension
/--
An `R`-algebra `S` is called standard smooth of relative dimension `n`, if there exists
a submersive presentation of dimension `n`.
-/
class IsStandardSmoothOfRelativeDimension : Prop where
out : ∃ (ι σ : Type) (_ : Finite σ) (_ : Finite ι) (P : SubmersivePresentation R S ι σ),
P.dimension = n
variable {R S ι σ n} in
lemma SubmersivePresentation.isStandardSmoothOfRelativeDimension [Finite ι]
(P : SubmersivePresentation R S ι σ) (hP : P.dimension = n) :
IsStandardSmoothOfRelativeDimension n R S := by
refine ⟨⟨_, _, _, inferInstance,
P.reindex (Fintype.equivFin _).symm (Fintype.equivFin σ).symm, ?_⟩⟩
simp [hP]
variable {R} {S}
lemma IsStandardSmoothOfRelativeDimension.isStandardSmooth
[H : IsStandardSmoothOfRelativeDimension n R S] : IsStandardSmooth R S :=
⟨_, _, _, H.out.choose_spec.choose_spec.choose_spec.choose,
H.out.choose_spec.choose_spec.choose_spec.choose_spec.nonempty⟩
lemma IsStandardSmoothOfRelativeDimension.of_algebraMap_bijective
(h : Function.Bijective (algebraMap R S)) :
IsStandardSmoothOfRelativeDimension 0 R S :=
⟨_, _, _, inferInstance,
SubmersivePresentation.ofBijectiveAlgebraMap h, Presentation.ofBijectiveAlgebraMap_dimension h⟩
variable (R) in
instance IsStandardSmoothOfRelativeDimension.id :
IsStandardSmoothOfRelativeDimension 0 R R :=
IsStandardSmoothOfRelativeDimension.of_algebraMap_bijective Function.bijective_id
variable (R) in
/-- The polynomial algebra `MvPolynomial ι R` is standard smooth over `R` of relative
dimension `Nat.card ι`. -/
lemma IsStandardSmoothOfRelativeDimension.mvPolynomial [Finite ι] :
IsStandardSmoothOfRelativeDimension (Nat.card ι) R (MvPolynomial ι R) :=
(SubmersivePresentation.mvPolynomial.{0} R ι).isStandardSmoothOfRelativeDimension
(Presentation.dimension_mvPolynomial)
/-- The polynomial algebra `MvPolynomial (Fin n) R` is standard smooth over `R` of relative
dimension `n`. -/
instance IsStandardSmoothOfRelativeDimension.mvPolynomial_fin {n : ℕ} :
IsStandardSmoothOfRelativeDimension n R (MvPolynomial (Fin n) R) := by
simpa using IsStandardSmoothOfRelativeDimension.mvPolynomial R (Fin n)
instance (priority := 100) IsStandardSmooth.finitePresentation [IsStandardSmooth R S] :
FinitePresentation R S := by
obtain ⟨_, _, _, _, ⟨P⟩⟩ := ‹IsStandardSmooth R S›
exact P.finitePresentation_of_isFinite
lemma IsStandardSmooth.of_algEquiv {T : Type*} [CommRing T] [Algebra R T] (e : S ≃ₐ[R] T)
[IsStandardSmooth R S] : IsStandardSmooth R T := by
obtain ⟨_, _, _, _, ⟨P⟩⟩ := ‹IsStandardSmooth R S›
exact (P.ofAlgEquiv e).isStandardSmooth
lemma IsStandardSmoothOfRelativeDimension.of_algEquiv {T : Type*} [CommRing T] [Algebra R T]
(e : S ≃ₐ[R] T) [IsStandardSmoothOfRelativeDimension n R S] :
IsStandardSmoothOfRelativeDimension n R T := by
obtain ⟨_, _, _, _, ⟨P, hP⟩⟩ := ‹IsStandardSmoothOfRelativeDimension n R S›
exact (P.ofAlgEquiv e).isStandardSmoothOfRelativeDimension (by simpa)
section Composition
variable (R S T) [CommRing T] [Algebra R T] [Algebra S T] [IsScalarTower R S T]
lemma IsStandardSmooth.trans [IsStandardSmooth R S] [IsStandardSmooth S T] :
IsStandardSmooth R T where
out := by
obtain ⟨_, _, _, _, ⟨P⟩⟩ := ‹IsStandardSmooth R S›
obtain ⟨_, _, _, _, ⟨Q⟩⟩ := ‹IsStandardSmooth S T›
exact ⟨_, _, _, inferInstance, ⟨Q.comp P⟩⟩
lemma IsStandardSmoothOfRelativeDimension.trans [IsStandardSmoothOfRelativeDimension n R S]
[IsStandardSmoothOfRelativeDimension m S T] :
IsStandardSmoothOfRelativeDimension (m + n) R T where
out := by
obtain ⟨_, _, _, _, P, hP⟩ := ‹IsStandardSmoothOfRelativeDimension n R S›
obtain ⟨_, _, _, _, Q, hQ⟩ := ‹IsStandardSmoothOfRelativeDimension m S T›
refine ⟨_, _, _, inferInstance, Q.comp P, hP ▸ hQ ▸ ?_⟩
apply PreSubmersivePresentation.dimension_comp_eq_dimension_add_dimension
end Composition
lemma IsStandardSmooth.localization_away (r : R) [IsLocalization.Away r S] :
IsStandardSmooth R S where
out := ⟨_, _, _, inferInstance, ⟨SubmersivePresentation.localizationAway S r⟩⟩
lemma IsStandardSmoothOfRelativeDimension.localization_away (r : R) [IsLocalization.Away r S] :
IsStandardSmoothOfRelativeDimension 0 R S where
out := ⟨_, _, _, inferInstance, SubmersivePresentation.localizationAway S r,
Presentation.localizationAway_dimension_zero r⟩
section BaseChange
variable (T) [CommRing T] [Algebra R T]
instance IsStandardSmooth.baseChange [IsStandardSmooth R S] :
IsStandardSmooth T (T ⊗[R] S) where
out := by
obtain ⟨ι, σ, _, _, ⟨P⟩⟩ := ‹IsStandardSmooth R S›
exact ⟨ι, σ, _, inferInstance, ⟨P.baseChange T⟩⟩
instance IsStandardSmoothOfRelativeDimension.baseChange
[IsStandardSmoothOfRelativeDimension n R S] :
IsStandardSmoothOfRelativeDimension n T (T ⊗[R] S) where
out := by
obtain ⟨_, _, _, _, P, hP⟩ := ‹IsStandardSmoothOfRelativeDimension n R S›
exact ⟨_, _, _, inferInstance, P.baseChange T, hP⟩
end BaseChange
@[nontriviality]
instance (priority := 100) [Subsingleton S] : IsStandardSmooth R S :=
⟨Unit, Unit, inferInstance, inferInstance, ⟨.ofSubsingleton R S⟩⟩
@[nontriviality]
instance (priority := 100) [Subsingleton S] : IsStandardSmoothOfRelativeDimension 0 R S :=
⟨Unit, Unit, inferInstance, inferInstance, .ofSubsingleton R S, by simp [Presentation.dimension]⟩
end Algebra