Skip to content

Commit cf617dd

Browse files
committed
feat(RingTheory): descend finiteness along quotients by nilpotent ideals (leanprover-community#32536)
1 parent e9a19f3 commit cf617dd

2 files changed

Lines changed: 63 additions & 0 deletions

File tree

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5884,6 +5884,7 @@ public import Mathlib.RingTheory.Finiteness.Lattice
58845884
public import Mathlib.RingTheory.Finiteness.ModuleFinitePresentation
58855885
public import Mathlib.RingTheory.Finiteness.Nakayama
58865886
public import Mathlib.RingTheory.Finiteness.Nilpotent
5887+
public import Mathlib.RingTheory.Finiteness.NilpotentKer
58875888
public import Mathlib.RingTheory.Finiteness.Prod
58885889
public import Mathlib.RingTheory.Finiteness.Projective
58895890
public import Mathlib.RingTheory.Finiteness.Quotient
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/-
2+
Copyright (c) 2025 Andrew Yang. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Andrew Yang
5+
-/
6+
module
7+
8+
public import Mathlib.LinearAlgebra.TensorProduct.Quotient
9+
public import Mathlib.RingTheory.Finiteness.Subalgebra
10+
public import Mathlib.RingTheory.Ideal.Quotient.Operations
11+
public import Mathlib.RingTheory.Noetherian.Nilpotent
12+
public import Mathlib.RingTheory.TensorProduct.Finite
13+
14+
/-! # Descend finiteness along quotients by nilpotent ideals -/
15+
16+
@[expose] public section
17+
18+
open TensorProduct
19+
20+
/-- If `I` is a finitely generated nilpotent ideal of an `R`-algebra `S`, and `T = S / I` is
21+
`R`-finite, then `S` is also `R`-finite. -/
22+
lemma Module.finite_of_surjective_of_ker_le_nilradical
23+
{R S T : Type*} [CommRing R] [CommRing S] [CommRing T]
24+
[Algebra R S] [Algebra R T]
25+
[Module.Finite R T] (f : S →ₐ[R] T)
26+
(hf₁ : Function.Surjective f) (hf₂ : RingHom.ker f ≤ nilradical S)
27+
(hf₃ : (RingHom.ker f).FG) :
28+
Module.Finite R S := by
29+
have : Module.Finite R (S ⧸ RingHom.ker f) :=
30+
let e := Ideal.quotientKerAlgEquivOfSurjective hf₁
31+
.of_surjective e.symm.toLinearMap e.symm.surjective
32+
generalize hI : RingHom.ker f = I at *
33+
suffices ∀ i, Module.Finite R (S ⧸ I ^ i) by
34+
obtain ⟨n, hn : _ = ⊥⟩ := hf₃.isNilpotent_iff_le_nilradical.mpr hf₂
35+
let e : (S ⧸ I ^ n) ≃ₐ[R] S := hn ▸ (AlgEquiv.quotientBot R S)
36+
exact .of_surjective e.toLinearMap e.surjective
37+
intro n
38+
induction n with
39+
| zero => rw [pow_zero, Ideal.one_eq_top]; infer_instance
40+
| succ n IH =>
41+
let φ : (S ⧸ I ^ (n + 1)) →ₐ[S] S ⧸ I ^ n :=
42+
Ideal.Quotient.factorₐ _ (Ideal.pow_le_pow_right n.le_succ)
43+
have hφ : Function.Surjective φ :=
44+
Ideal.Quotient.factor_surjective (Ideal.pow_le_pow_right n.le_succ)
45+
have hφ' : φ.toLinearMap ∘ₗ (I ^ (n + 1)).mkQ = (I ^ n).mkQ := rfl
46+
refine ⟨Submodule.fg_of_fg_map_of_fg_inf_ker (φ.toLinearMap.restrictScalars R) ?_ ?_⟩
47+
· simpa [LinearMap.range_eq_top_of_surjective (φ.toLinearMap.restrictScalars R) hφ] using
48+
Module.Finite.fg_top
49+
· have : Module.Finite R ((S ⧸ I) ⊗[S] ↑(I ^ n)) := by
50+
have : Module.Finite S ↑(I ^ n) := Module.Finite.iff_fg.mpr (.pow hf₃ _)
51+
exact .trans (S ⧸ I) _
52+
let ψ : (S ⧸ I) ⊗[S] ↑(I ^ n) →ₗ[S] (S ⧸ I ^ (n + 1)) := by
53+
refine ?_ ∘ₗ (TensorProduct.quotTensorEquivQuotSMul _ I).toLinearMap
54+
refine Submodule.liftQ _ ((Submodule.mkQ _).comp (I ^ n).subtype) ?_
55+
rw [LinearMap.ker_comp, ← Submodule.map_le_map_iff_of_injective (I ^ n).subtype_injective,
56+
Submodule.map_smul'', Submodule.map_comap_eq]
57+
simpa [pow_succ'] using Ideal.mul_le_left (I := I) (J := I ^ n)
58+
convert Module.Finite.fg_top.map (ψ.restrictScalars R) using 1
59+
suffices LinearMap.ker φ.toLinearMap = Submodule.map (I ^ (n + 1)).mkQ (I ^ n) by
60+
simpa [LinearMap.range_restrictScalars, ψ, LinearMap.range_comp, Submodule.range_liftQ]
61+
apply Submodule.comap_injective_of_surjective (I ^ (n + 1)).mkQ_surjective
62+
simpa [← LinearMap.ker_comp, hφ'] using Ideal.pow_le_pow_right n.le_succ

0 commit comments

Comments
 (0)