Skip to content

Commit 773f9ce

Browse files
committed
feat(RingTheory/Smooth): formally smooth iff H¹(L_{R/S}) = 0 and Ω_{S/R} is projective (#17905)
1 parent 12bee1a commit 773f9ce

File tree

2 files changed

+227
-3
lines changed

2 files changed

+227
-3
lines changed

Mathlib/RingTheory/Smooth/Kaehler.lean

Lines changed: 226 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ Copyright (c) 2024 Andrew Yang. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Andrew Yang
55
-/
6-
import Mathlib.RingTheory.Kaehler.Basic
6+
import Mathlib.RingTheory.Kaehler.CotangentComplex
7+
import Mathlib.RingTheory.Smooth.Basic
8+
import Mathlib.Algebra.Module.Projective
9+
import Mathlib.Tactic.StacksAttribute
710

811
/-!
912
# Relation of smoothness and `Ω[S⁄R]`
@@ -14,13 +17,32 @@ import Mathlib.RingTheory.Kaehler.Basic
1417
Given a surjective algebra homomorphism `f : P →ₐ[R] S` with square-zero kernel `I`,
1518
there is a one-to-one correspondence between `P`-linear retractions of `I →ₗ[P] S ⊗[P] Ω[P/R]`
1619
and algebra homomorphism sections of `f`.
20+
- `retractionKerCotangentToTensorEquivSection`:
21+
Given a surjective algebra homomorphism `f : P →ₐ[R] S` with kernel `I`,
22+
there is a one-to-one correspondence between `P`-linear retractions of `I/I² →ₗ[P] S ⊗[P] Ω[P/R]`
23+
and algebra homomorphism sections of `f‾ : P/I² → S`.
24+
- `Algebra.FormallySmooth.iff_split_injection`:
25+
Given a formally smooth `R`-algebra `P` and a surjective algebra homomorphism `f : P →ₐ[R] S`
26+
with kernel `I` (typically a presentation `R[X] → S`),
27+
`S` is formally smooth iff the `P`-linear map `I/I² → S ⊗[P] Ω[P⁄R]` is split injective.
28+
- `Algebra.FormallySmooth.iff_injective_and_projective`:
29+
Given a formally smooth `R`-algebra `P` and a surjective algebra homomorphism `f : P →ₐ[R] S`
30+
with kernel `I` (typically a presentation `R[X] → S`),
31+
then `S` is formally smooth iff `Ω[S/R]` is projective and `I/I² → S ⊗[P] Ω[P⁄R]` is injective.
32+
- `Algebra.FormallySmooth.iff_subsingleton_and_projective`:
33+
An algebra is formally smooth if and only if `H¹(L_{R/S}) = 0` and `Ω_{S/R}` is projective.
1734
1835
## Future projects
1936
20-
- Show that relative smooth iff `H¹(L_{S/R}) = 0` and `Ω[S/R]` is projective.
2137
- Show that being smooth is local on stalks.
2238
- Show that being formally smooth is Zariski-local (very hard).
2339
40+
## References
41+
42+
- https://stacks.math.columbia.edu/tag/00TH
43+
- [B. Iversen, *Generic Local Structure of the Morphisms in Commutative Algebra*][iversen]
44+
45+
2446
-/
2547

2648
universe u
@@ -198,7 +220,6 @@ end ofRetraction
198220

199221
variable [Algebra R S] [IsScalarTower R P S]
200222
variable (hf' : (RingHom.ker (algebraMap P S)) ^ 2 = ⊥) (hf : Surjective (algebraMap P S))
201-
include hf' hf
202223

203224
/--
204225
Given a surjective algebra homomorphism `f : P →ₐ[R] S` with square-zero kernel `I`,
@@ -224,3 +245,205 @@ def retractionKerToTensorEquivSection :
224245
simp only [this, Algebra.algebraMap_eq_smul_one, ← smul_tmul', LinearMapClass.map_smul,
225246
SetLike.val_smul, smul_eq_mul, sub_zero]
226247
right_inv g := by ext s; obtain ⟨s, rfl⟩ := hf s; simp
248+
249+
variable (R P S) in
250+
/--
251+
Given a tower of algebras `S/P/R`, with `I = ker(P → S)`,
252+
this is the `R`-derivative `P/I² → S ⊗[P] Ω[P⁄R]` given by `[x] ↦ 1 ⊗ D x`.
253+
-/
254+
noncomputable
255+
def derivationQuotKerSq :
256+
Derivation R (P ⧸ (RingHom.ker (algebraMap P S) ^ 2)) (S ⊗[P] Ω[P⁄R]) := by
257+
letI := Submodule.liftQ ((RingHom.ker (algebraMap P S) ^ 2).restrictScalars R)
258+
(((mk P S _ 1).restrictScalars R).comp (KaehlerDifferential.D R P).toLinearMap)
259+
refine ⟨this ?_, ?_, ?_⟩
260+
· rintro x hx
261+
simp only [Submodule.restrictScalars_mem, pow_two] at hx
262+
simp only [LinearMap.mem_ker, LinearMap.coe_comp, LinearMap.coe_restrictScalars,
263+
Derivation.coeFn_coe, Function.comp_apply, mk_apply]
264+
refine Submodule.smul_induction_on hx ?_ ?_
265+
· intro x hx y hy
266+
simp only [smul_eq_mul, Derivation.leibniz, tmul_add, ← smul_tmul, Algebra.smul_def,
267+
mul_one, RingHom.mem_ker.mp hx, RingHom.mem_ker.mp hy, zero_tmul, zero_add]
268+
· intro x y hx hy; simp only [map_add, hx, hy, tmul_add, zero_add]
269+
· show (1 : S) ⊗ₜ[P] KaehlerDifferential.D R P 1 = 0; simp
270+
· intro a b
271+
obtain ⟨a, rfl⟩ := Submodule.Quotient.mk_surjective _ a
272+
obtain ⟨b, rfl⟩ := Submodule.Quotient.mk_surjective _ b
273+
show (1 : S) ⊗ₜ[P] KaehlerDifferential.D R P (a * b) =
274+
Ideal.Quotient.mk _ a • ((1 : S) ⊗ₜ[P] KaehlerDifferential.D R P b) +
275+
Ideal.Quotient.mk _ b • ((1 : S) ⊗ₜ[P] KaehlerDifferential.D R P a)
276+
simp only [← Ideal.Quotient.algebraMap_eq, IsScalarTower.algebraMap_smul,
277+
Derivation.leibniz, tmul_add, tmul_smul]
278+
279+
@[simp]
280+
lemma derivationQuotKerSq_mk (x : P) :
281+
derivationQuotKerSq R P S x = 1 ⊗ₜ .D R P x := rfl
282+
283+
variable (R P S) in
284+
/--
285+
Given a tower of algebras `S/P/R`, with `I = ker(P → S)` and `Q := P/I²`,
286+
there is an isomorphism of `S`-modules `S ⊗[Q] Ω[Q/R] ≃ S ⊗[P] Ω[P/R]`.
287+
-/
288+
noncomputable
289+
def tensorKaehlerQuotKerSqEquiv :
290+
S ⊗[P ⧸ (RingHom.ker (algebraMap P S) ^ 2)] Ω[(P ⧸ (RingHom.ker (algebraMap P S) ^ 2))⁄R] ≃ₗ[S]
291+
S ⊗[P] Ω[P⁄R] :=
292+
letI f₁ := (derivationQuotKerSq R P S).liftKaehlerDifferential
293+
letI f₂ := AlgebraTensorModule.lift ((LinearMap.ringLmapEquivSelf S S _).symm f₁)
294+
letI f₃ := KaehlerDifferential.map R R P (P ⧸ (RingHom.ker (algebraMap P S) ^ 2))
295+
letI f₄ := ((mk (P ⧸ RingHom.ker (algebraMap P S) ^ 2) S _ 1).restrictScalars P).comp f₃
296+
letI f₅ := AlgebraTensorModule.lift ((LinearMap.ringLmapEquivSelf S S _).symm f₄)
297+
{ __ := f₂
298+
invFun := f₅
299+
left_inv := by
300+
suffices f₅.comp f₂ = LinearMap.id from LinearMap.congr_fun this
301+
ext a
302+
obtain ⟨a, rfl⟩ := Ideal.Quotient.mk_surjective a
303+
simp [f₁, f₂, f₃, f₄, f₅]
304+
right_inv := by
305+
suffices f₂.comp f₅ = LinearMap.id from LinearMap.congr_fun this
306+
ext a
307+
simp [f₁, f₂, f₃, f₄, f₅] }
308+
309+
@[simp]
310+
lemma tensorKaehlerQuotKerSqEquiv_tmul_D (s t) :
311+
tensorKaehlerQuotKerSqEquiv R P S (s ⊗ₜ .D _ _ (Ideal.Quotient.mk _ t)) = s ⊗ₜ .D _ _ t := by
312+
show s • (derivationQuotKerSq R P S).liftKaehlerDifferential (.D _ _ (Ideal.Quotient.mk _ t)) = _
313+
simp [smul_tmul']
314+
315+
@[simp]
316+
lemma tensorKaehlerQuotKerSqEquiv_symm_tmul_D (s t) :
317+
(tensorKaehlerQuotKerSqEquiv R P S).symm (s ⊗ₜ .D _ _ t) =
318+
s ⊗ₜ .D _ _ (Ideal.Quotient.mk _ t) := by
319+
apply (tensorKaehlerQuotKerSqEquiv R P S).injective
320+
simp
321+
322+
/--
323+
Given a surjective algebra homomorphism `f : P →ₐ[R] S` with kernel `I`,
324+
there is a one-to-one correspondence between `P`-linear retractions of `I/I² →ₗ[P] S ⊗[P] Ω[P/R]`
325+
and algebra homomorphism sections of `f‾ : P/I² → S`.
326+
-/
327+
noncomputable
328+
def retractionKerCotangentToTensorEquivSection :
329+
{ l // l ∘ₗ (kerCotangentToTensor R P S) = LinearMap.id } ≃
330+
{ g // (IsScalarTower.toAlgHom R P S).kerSquareLift.comp g = AlgHom.id R S } := by
331+
let P' := P ⧸ (RingHom.ker (algebraMap P S) ^ 2)
332+
have h₁ : Surjective (algebraMap P' S) := Function.Surjective.of_comp (g := algebraMap P P') hf
333+
have h₂ : RingHom.ker (algebraMap P' S) ^ 2 = ⊥ := by
334+
rw [RingHom.algebraMap_toAlgebra, AlgHom.ker_kerSquareLift, Ideal.cotangentIdeal_square]
335+
let e₁ : (RingHom.ker (algebraMap P S)).Cotangent ≃ₗ[P] (RingHom.ker (algebraMap P' S)) :=
336+
(Ideal.cotangentEquivIdeal _).trans ((LinearEquiv.ofEq _ _
337+
(IsScalarTower.toAlgHom R P S).ker_kerSquareLift.symm).restrictScalars P)
338+
let e₂ : S ⊗[P'] Ω[P'⁄R] ≃ₗ[P] S ⊗[P] Ω[P⁄R] :=
339+
(tensorKaehlerQuotKerSqEquiv R P S).restrictScalars P
340+
have H : kerCotangentToTensor R P S =
341+
e₂.toLinearMap ∘ₗ (kerToTensor R P' S ).restrictScalars P ∘ₗ e₁.toLinearMap := by
342+
ext x
343+
obtain ⟨x, rfl⟩ := Ideal.toCotangent_surjective _ x
344+
exact (tensorKaehlerQuotKerSqEquiv_tmul_D 1 x.1).symm
345+
refine Equiv.trans ?_ (retractionKerToTensorEquivSection (R := R) h₂ h₁)
346+
refine ⟨fun ⟨l, hl⟩ ↦ ⟨⟨(e₁.toLinearMap ∘ₗ l ∘ₗ e₂.toLinearMap).toAddMonoidHom, ?_⟩, ?_⟩,
347+
fun ⟨l, hl⟩ ↦ ⟨e₁.symm.toLinearMap ∘ₗ l.restrictScalars P ∘ₗ e₂.symm.toLinearMap, ?_⟩, ?_, ?_⟩
348+
· rintro x y
349+
obtain ⟨x, rfl⟩ := Ideal.Quotient.mk_surjective x
350+
simp only [← Ideal.Quotient.algebraMap_eq, IsScalarTower.algebraMap_smul]
351+
exact (e₁.toLinearMap ∘ₗ l ∘ₗ e₂.toLinearMap).map_smul x y
352+
· ext1 x
353+
rw [H] at hl
354+
obtain ⟨x, rfl⟩ := e₁.surjective x
355+
exact DFunLike.congr_arg e₁ (LinearMap.congr_fun hl x)
356+
· ext x
357+
rw [H]
358+
apply e₁.injective
359+
simp only [LinearMap.coe_comp, LinearEquiv.coe_coe, LinearMap.coe_restrictScalars,
360+
Function.comp_apply, LinearEquiv.symm_apply_apply, LinearMap.id_coe, id_eq,
361+
LinearEquiv.apply_symm_apply]
362+
exact LinearMap.congr_fun hl (e₁ x)
363+
· intro f
364+
ext x
365+
simp only [AlgebraTensorModule.curry_apply, Derivation.coe_comp, LinearMap.coe_comp,
366+
LinearMap.coe_restrictScalars, Derivation.coeFn_coe, Function.comp_apply, curry_apply,
367+
LinearEquiv.coe_coe, LinearMap.coe_mk, AddHom.coe_coe, LinearMap.toAddMonoidHom_coe,
368+
LinearEquiv.apply_symm_apply, LinearEquiv.symm_apply_apply]
369+
· intro f
370+
ext x
371+
simp only [AlgebraTensorModule.curry_apply, Derivation.coe_comp, LinearMap.coe_comp,
372+
LinearMap.coe_restrictScalars, Derivation.coeFn_coe, Function.comp_apply, curry_apply,
373+
LinearMap.coe_mk, AddHom.coe_coe, LinearMap.toAddMonoidHom_coe, LinearEquiv.coe_coe,
374+
LinearEquiv.symm_apply_apply, LinearEquiv.apply_symm_apply]
375+
376+
variable [Algebra.FormallySmooth R P]
377+
378+
include hf in
379+
/--
380+
Given a formally smooth `R`-algebra `P` and a surjective algebra homomorphism `f : P →ₐ[R] S`
381+
with kernel `I` (typically a presentation `R[X] → S`),
382+
`S` is formally smooth iff the `P`-linear map `I/I² → S ⊗[P] Ω[P⁄R]` is split injective.
383+
-/
384+
@[stacks 031I]
385+
theorem Algebra.FormallySmooth.iff_split_injection :
386+
Algebra.FormallySmooth R S ↔ ∃ l, l ∘ₗ (kerCotangentToTensor R P S) = LinearMap.id := by
387+
have := (retractionKerCotangentToTensorEquivSection (R := R) hf).nonempty_congr
388+
simp only [nonempty_subtype] at this
389+
rw [this, ← Algebra.FormallySmooth.iff_split_surjection _ hf]
390+
391+
include hf in
392+
/--
393+
Given a formally smooth `R`-algebra `P` and a surjective algebra homomorphism `f : P →ₐ[R] S`
394+
with kernel `I` (typically a presentation `R[X] → S`),
395+
then `S` is formally smooth iff `I/I² → S ⊗[P] Ω[S⁄R]` is injective and
396+
`S ⊗[P] Ω[P⁄R] → Ω[S⁄R]` is split surjective.
397+
-/
398+
theorem Algebra.FormallySmooth.iff_injective_and_split :
399+
Algebra.FormallySmooth R S ↔ Function.Injective (kerCotangentToTensor R P S) ∧
400+
∃ l, (KaehlerDifferential.mapBaseChange R P S) ∘ₗ l = LinearMap.id := by
401+
rw [Algebra.FormallySmooth.iff_split_injection hf]
402+
refine (and_iff_right (KaehlerDifferential.mapBaseChange_surjective R _ _ hf)).symm.trans ?_
403+
refine Iff.trans (((exact_kerCotangentToTensor_mapBaseChange R _ _ hf).split_tfae'
404+
(g := (KaehlerDifferential.mapBaseChange R P S).restrictScalars P)).out 1 0)
405+
(and_congr Iff.rfl ?_)
406+
rw [(LinearMap.extendScalarsOfSurjectiveEquiv hf).surjective.exists]
407+
simp only [LinearMap.ext_iff, LinearMap.coe_comp, LinearMap.coe_restrictScalars,
408+
Function.comp_apply, LinearMap.extendScalarsOfSurjective_apply, LinearMap.id_coe, id_eq]
409+
410+
private theorem Algebra.FormallySmooth.iff_injective_and_projective' :
411+
letI : Algebra (MvPolynomial S R) S := (MvPolynomial.aeval _root_.id).toAlgebra
412+
Algebra.FormallySmooth R S ↔
413+
Function.Injective (kerCotangentToTensor R (MvPolynomial S R) S) ∧
414+
Module.Projective S (Ω[S⁄R]) := by
415+
letI : Algebra (MvPolynomial S R) S := (MvPolynomial.aeval _root_.id).toAlgebra
416+
have : Function.Surjective (algebraMap (MvPolynomial S R) S) :=
417+
fun x ↦ ⟨.X x, MvPolynomial.aeval_X _ _⟩
418+
rw [Algebra.FormallySmooth.iff_injective_and_split this,
419+
← Module.Projective.iff_split_of_projective]
420+
exact KaehlerDifferential.mapBaseChange_surjective _ _ _ this
421+
422+
instance : Module.Projective P (Ω[P⁄R]) :=
423+
(Algebra.FormallySmooth.iff_injective_and_projective'.mp ‹_›).2
424+
425+
include hf in
426+
/--
427+
Given a formally smooth `R`-algebra `P` and a surjective algebra homomorphism `f : P →ₐ[R] S`
428+
with kernel `I` (typically a presentation `R[X] → S`),
429+
then `S` is formally smooth iff `I/I² → S ⊗[P] Ω[P⁄R]` is injective and `Ω[S/R]` is projective.
430+
-/
431+
theorem Algebra.FormallySmooth.iff_injective_and_projective :
432+
Algebra.FormallySmooth R S ↔
433+
Function.Injective (kerCotangentToTensor R P S) ∧ Module.Projective S (Ω[S⁄R]) := by
434+
rw [Algebra.FormallySmooth.iff_injective_and_split hf,
435+
← Module.Projective.iff_split_of_projective]
436+
exact KaehlerDifferential.mapBaseChange_surjective _ _ _ hf
437+
438+
/--
439+
An algebra is formally smooth if and only if `H¹(L_{R/S}) = 0` and `Ω_{S/R}` is projective.
440+
-/
441+
@[stacks 031J]
442+
theorem Algebra.FormallySmooth.iff_subsingleton_and_projective :
443+
Algebra.FormallySmooth R S ↔
444+
Subsingleton (Algebra.H1Cotangent R S) ∧ Module.Projective S (Ω[S⁄R]) := by
445+
refine (Algebra.FormallySmooth.iff_injective_and_projective
446+
(Generators.self R S).algebraMap_surjective).trans (and_congr ?_ Iff.rfl)
447+
show Function.Injective (Generators.self R S).cotangentComplex ↔ _
448+
rw [← LinearMap.ker_eq_bot, ← Submodule.subsingleton_iff_eq_bot]
449+
rfl

scripts/noshake.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@
311311
"Mathlib.Tactic.Attr.Register": ["Lean.Meta.Tactic.Simp.SimpTheorems"],
312312
"Mathlib.Tactic.ArithMult": ["Mathlib.Tactic.ArithMult.Init"],
313313
"Mathlib.Tactic.Algebraize": ["Mathlib.Algebra.Algebra.Tower"],
314+
"Mathlib.RingTheory.Smooth.Kaehler": ["Mathlib.Tactic.StacksAttribute"],
314315
"Mathlib.RingTheory.PowerSeries.Basic":
315316
["Mathlib.Algebra.CharP.Defs", "Mathlib.Tactic.MoveAdd"],
316317
"Mathlib.RingTheory.PolynomialAlgebra": ["Mathlib.Data.Matrix.DMatrix"],

0 commit comments

Comments
 (0)