Skip to content

Commit 32fb683

Browse files
committed
feat(RingTheory/Extension/Cotangent): presentation is submersive if I/I² has a suitable basis (#28769)
Let `P` be a presentation of an algebra with kernel `I`. We show that if `I/I²` has a basis given by the images of the relations and the module of Kaehler differentials has a basis given by the differentials of the free generators (those that don't appear in the Jacobian matrix), then `P` is submersive. We will later deduce from this a presentation-independent characterization of standard smooth algebras. From Pi1.
1 parent 4e5592f commit 32fb683

File tree

17 files changed

+333
-11
lines changed

17 files changed

+333
-11
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5662,6 +5662,7 @@ import Mathlib.RingTheory.EuclideanDomain
56625662
import Mathlib.RingTheory.Extension
56635663
import Mathlib.RingTheory.Extension.Basic
56645664
import Mathlib.RingTheory.Extension.Cotangent.Basic
5665+
import Mathlib.RingTheory.Extension.Cotangent.Free
56655666
import Mathlib.RingTheory.Extension.Cotangent.LocalizationAway
56665667
import Mathlib.RingTheory.Extension.Generators
56675668
import Mathlib.RingTheory.Extension.Presentation.Basic

Mathlib/Algebra/Group/Subgroup/Map.lean

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,13 +253,23 @@ theorem map_inf_eq (H K : Subgroup G) (f : G →* N) (hf : Function.Injective f)
253253
theorem map_bot (f : G →* N) : (⊥ : Subgroup G).map f = ⊥ :=
254254
(gc_map_comap f).l_bot
255255

256+
@[to_additive]
257+
lemma disjoint_map {f : G →* N} (hf : Function.Injective f) {H K : Subgroup G} (h : Disjoint H K) :
258+
Disjoint (H.map f) (K.map f) := by
259+
rw [disjoint_iff, ← map_inf _ _ f hf, disjoint_iff.mp h, map_bot]
260+
256261
@[to_additive]
257262
theorem map_top_of_surjective (f : G →* N) (h : Function.Surjective f) : Subgroup.map f ⊤ = ⊤ := by
258263
rw [eq_top_iff]
259264
intro x _
260265
obtain ⟨y, hy⟩ := h x
261266
exact ⟨y, trivial, hy⟩
262267

268+
@[to_additive]
269+
lemma codisjoint_map {f : G →* N} (hf : Function.Surjective f)
270+
{H K : Subgroup G} (h : Codisjoint H K) : Codisjoint (H.map f) (K.map f) := by
271+
rw [codisjoint_iff, ← map_sup, codisjoint_iff.mp h, map_top_of_surjective _ hf]
272+
263273
@[to_additive (attr := simp)]
264274
lemma map_equiv_top {F : Type*} [EquivLike F G N] [MulEquivClass F G N] (f : F) :
265275
map (f : G →* N) ⊤ = ⊤ :=
@@ -560,6 +570,11 @@ end MonoidHom
560570

561571
namespace Subgroup
562572

573+
@[to_additive]
574+
lemma surjOn_iff_le_map {f : G →* N} {H : Subgroup G} {K : Subgroup N} :
575+
Set.SurjOn f H K ↔ K ≤ H.map f :=
576+
Iff.rfl
577+
563578
@[to_additive (attr := simp)]
564579
theorem equivMapOfInjective_coe_mulEquiv (H : Subgroup G) (e : G ≃* G') :
565580
H.equivMapOfInjective (e : G →* G') (EquivLike.injective e) = e.subgroupMap H := by

Mathlib/Algebra/Group/Submonoid/Operations.lean

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,11 @@ theorem comap_iInf {ι : Sort*} (f : F) (s : ι → Submonoid N) :
312312
theorem map_bot (f : F) : (⊥ : Submonoid M).map f = ⊥ :=
313313
(gc_map_comap f).l_bot
314314

315+
@[to_additive]
316+
lemma disjoint_map {f : F} (hf : Function.Injective f) {H K : Submonoid M} (h : Disjoint H K) :
317+
Disjoint (H.map f) (K.map f) := by
318+
rw [disjoint_iff, ← map_inf _ _ f hf, disjoint_iff.mp h, map_bot]
319+
315320
@[to_additive (attr := simp)]
316321
theorem comap_top (f : F) : (⊤ : Submonoid N).comap f = ⊤ :=
317322
(gc_map_comap f).u_top
@@ -848,6 +853,11 @@ end MonoidHom
848853

849854
namespace Submonoid
850855

856+
@[to_additive]
857+
lemma surjOn_iff_le_map {f : M →* N} {H : Submonoid M} {K : Submonoid N} :
858+
Set.SurjOn f H K ↔ K ≤ H.map f :=
859+
Iff.rfl
860+
851861
open MonoidHom
852862

853863
@[to_additive]
@@ -946,6 +956,13 @@ theorem bot_or_nontrivial (S : Submonoid M) : S = ⊥ ∨ Nontrivial S := by
946956
theorem bot_or_exists_ne_one (S : Submonoid M) : S = ⊥ ∨ ∃ x ∈ S, x ≠ (1 : M) :=
947957
S.bot_or_nontrivial.imp_right S.nontrivial_iff_exists_ne_one.mp
948958

959+
@[to_additive]
960+
lemma codisjoint_map {F : Type*} [FunLike F M N] [MonoidHomClass F M N] {f : F}
961+
(hf : Function.Surjective f) {H K : Submonoid M} (h : Codisjoint H K) :
962+
Codisjoint (H.map f) (K.map f) := by
963+
rw [codisjoint_iff, ← map_sup, codisjoint_iff.mp h, ← MonoidHom.mrange_eq_map,
964+
mrange_eq_top_of_surjective _ hf]
965+
949966
section Pi
950967

951968
variable {ι : Type*} {M : ι → Type*} [∀ i, MulOneClass (M i)]

Mathlib/Algebra/Module/Submodule/LinearMap.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@ theorem domRestrict_apply (f : M →ₛₗ[σ₁₂] M₂) (p : Submodule R M) (
144144
f.domRestrict p x = f x :=
145145
rfl
146146

147+
lemma coe_domRestrict (f : M →ₛₗ[σ₁₂] M₂) (p : Submodule R M) :
148+
⇑(f.domRestrict p) = Set.restrict p f := rfl
149+
147150
/-- A linear map `f : M₂ → M` whose values lie in a submodule `p ⊆ M` can be restricted to a
148151
linear map M₂ → p.
149152

Mathlib/Algebra/Module/Submodule/Map.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,10 @@ theorem map_iSup {ι : Sort*} (f : F) (p : ι → Submodule R M) :
232232
map f (⨆ i, p i) = ⨆ i, map f (p i) :=
233233
(gc_map_comap f : GaloisConnection (map f) (comap f)).l_iSup
234234

235+
lemma disjoint_map {f : F} (hf : Function.Injective f) {p q : Submodule R M} (hpq : Disjoint p q) :
236+
Disjoint (p.map f) (q.map f) := by
237+
rw [disjoint_iff, ← map_inf f hf, disjoint_iff.mp hpq, map_bot]
238+
235239
end
236240

237241
@[simp]
@@ -593,6 +597,10 @@ theorem inf_comap_le_comap_add (f₁ f₂ : M →ₛₗ[τ₁₂] M₂) :
593597
change f₁ m ∈ q ∧ f₂ m ∈ q at h
594598
apply q.add_mem h.1 h.2
595599

600+
lemma surjOn_iff_le_map [RingHomSurjective τ₁₂] {f : M →ₛₗ[τ₁₂] M₂} {p : Submodule R M}
601+
{q : Submodule R₂ M₂} : Set.SurjOn f p q ↔ q ≤ p.map f :=
602+
Iff.rfl
603+
596604
end Submodule
597605

598606
namespace Submodule

Mathlib/Algebra/Module/Submodule/Range.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,11 @@ def mapIic (p : Submodule R M) :
363363
(p.mapIic q : Submodule R M) = q.map p.subtype :=
364364
rfl
365365

366+
lemma codisjoint_map [RingHomSurjective τ₁₂] {f : F} (hf : Function.Surjective f)
367+
{p q : Submodule R M} (hpq : Codisjoint p q) : Codisjoint (p.map f) (q.map f) := by
368+
rw [codisjoint_iff, ← Submodule.map_sup, codisjoint_iff.mp hpq, map_top,
369+
LinearMap.range_eq_top_of_surjective f hf]
370+
366371
end AddCommMonoid
367372

368373
end Submodule

Mathlib/Analysis/InnerProductSpace/Symmetric.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ theorem _root_.Submodule.IsCompl.projection_isSymmetric_iff
271271
refine ⟨fun h u hu v hv => ?_, fun h x y => ?_⟩
272272
· rw [← Subtype.coe_mk u hu, ← Subtype.coe_mk v hv,
273273
← Submodule.linearProjOfIsCompl_apply_left hUV ⟨u, hu⟩, ← U.subtype_apply, ← comp_apply,
274-
← h, comp_apply, linearProjOfIsCompl_apply_right hUV ⟨v, hv⟩,
274+
← h, comp_apply, Submodule.linearProjOfIsCompl_apply_right hUV ⟨v, hv⟩,
275275
map_zero, inner_zero_left]
276276
· nth_rw 2 [← hUV.projection_add_projection_eq_self x]
277277
nth_rw 1 [← hUV.projection_add_projection_eq_self y]

Mathlib/Data/Finsupp/Basic.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,14 @@ theorem comapDomain_mapDomain (hf : Function.Injective f) (l : α →₀ M) :
707707
comapDomain f (mapDomain f l) hf.injOn = l := by
708708
ext; rw [comapDomain_apply, mapDomain_apply hf]
709709

710+
lemma mem_range_mapDomain_iff (hf : Function.Injective f) (x : β →₀ M) :
711+
x ∈ Set.range (Finsupp.mapDomain f) ↔ ∀ b ∉ Set.range f, x b = 0 := by
712+
refine ⟨fun ⟨y, hy⟩ x hx ↦ hy ▸ Finsupp.mapDomain_notin_range y x hx, fun h ↦ ?_⟩
713+
refine ⟨Finsupp.comapDomain f x hf.injOn, Finsupp.mapDomain_comapDomain f hf _ fun i hi ↦ ?_⟩
714+
by_contra hc
715+
simp only [Finset.mem_coe, Finsupp.mem_support_iff, ne_eq] at hi
716+
exact hi (h _ hc)
717+
710718
end FInjective
711719

712720
end ComapDomain

Mathlib/LinearAlgebra/Basis/Exact.lean

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: Christian Merten
55
-/
66
import Mathlib.Algebra.Exact
77
import Mathlib.LinearAlgebra.Basis.Basic
8+
import Mathlib.LinearAlgebra.Projection
89

910
/-!
1011
# Basis from a split exact sequence
@@ -23,6 +24,8 @@ variable [Module R M] [Module R K] [Module R P]
2324
variable {f : K →ₗ[R] M} {g : M →ₗ[R] P} {s : M →ₗ[R] K}
2425
variable (hs : s ∘ₗ f = LinearMap.id) (hfg : Function.Exact f g)
2526
variable {ι κ σ : Type*} {v : ι → M} {a : κ → ι} {b : σ → ι}
27+
28+
section
2629
include hs hfg
2730

2831
lemma LinearIndependent.linearIndependent_of_exact_of_retraction
@@ -91,3 +94,39 @@ noncomputable def Module.Basis.ofSplitExact (hg : Function.Surjective g) (v : Ba
9194
Basis κ R P :=
9295
.mk (v.linearIndependent.linearIndependent_of_exact_of_retraction hs hfg hainj hsa)
9396
(Submodule.top_le_span_of_exact_of_retraction hs hfg hg hsa hlib hab (by rw [v.span_eq]))
97+
98+
end
99+
100+
section
101+
include hfg
102+
103+
lemma Submodule.linearProjOfIsCompl_comp_surjective_of_exact
104+
{p q : Submodule R M} (hpq : IsCompl p q)
105+
(hmap : Submodule.map g q = ⊤) :
106+
Function.Surjective (Submodule.linearProjOfIsCompl p q hpq ∘ₗ f) := by
107+
rw [← Set.surjOn_univ, LinearMap.coe_comp, Set.surjOn_comp_iff, Set.image_univ]
108+
rw [← LinearMap.coe_range, ← Submodule.top_coe (R := R), surjOn_iff_le_map,
109+
← hfg.linearMap_ker_eq]
110+
intro x triv
111+
obtain ⟨a, haq, ha⟩ : g x.val ∈ q.map g := by rwa [hmap]
112+
exact ⟨x - a, by simp [← ha], by simpa⟩
113+
114+
lemma Submodule.linearProjOfIsCompl_comp_bijective_of_exact
115+
(hf : Function.Injective f) {p q : Submodule R M} (hpq : IsCompl p q)
116+
(hker : Disjoint (LinearMap.ker g) q) (hmap : Submodule.map g q = ⊤) :
117+
Function.Bijective (Submodule.linearProjOfIsCompl p q hpq ∘ₗ f) := by
118+
refine ⟨?_, Submodule.linearProjOfIsCompl_comp_surjective_of_exact hfg _ hmap⟩
119+
rwa [LinearMap.coe_comp, Set.InjOn.injective_iff ↑(LinearMap.range f) _ subset_rfl]
120+
simpa [← LinearMap.disjoint_ker_iff_injOn, ← hfg.linearMap_ker_eq]
121+
122+
lemma LinearMap.linearProjOfIsCompl_comp_bijective_of_exact
123+
(hf : Function.Injective f) {q : Submodule R M} {E : Type*} [AddCommGroup E] [Module R E]
124+
{i : E →ₗ[R] M} (hi : Function.Injective i) (h : IsCompl (LinearMap.range i) q)
125+
(hker : Disjoint (LinearMap.ker g) q) (hmap : Submodule.map g q = ⊤) :
126+
Function.Bijective (LinearMap.linearProjOfIsCompl q i hi h ∘ₗ f) := by
127+
rw [LinearMap.linearProjOfIsCompl, LinearMap.comp_assoc, LinearMap.coe_comp,
128+
Function.Bijective.of_comp_iff]
129+
· exact (LinearEquiv.ofInjective i hi).symm.bijective
130+
· exact Submodule.linearProjOfIsCompl_comp_bijective_of_exact hfg hf h hker hmap
131+
132+
end

Mathlib/LinearAlgebra/Finsupp/Defs.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ theorem lmapDomain_apply (f : α → α') (l : α →₀ M) :
147147
(lmapDomain M R f : (α →₀ M) →ₗ[R] α' →₀ M) l = mapDomain f l :=
148148
rfl
149149

150+
lemma coe_lmapDomain (f : α → α') : ⇑(lmapDomain M R f) = Finsupp.mapDomain f :=
151+
rfl
152+
150153
@[simp]
151154
theorem lmapDomain_id : (lmapDomain M R _root_.id : (α →₀ M) →ₗ[R] α →₀ M) = LinearMap.id :=
152155
LinearMap.ext fun _ => mapDomain_id

0 commit comments

Comments
 (0)