Skip to content

Commit a7569c0

Browse files
committed
feat: left-Noetherian rings and commutative rings satisfy OrzechProperty (#13425)
This is part 2 of #12076. It states that if - `R` is a ring (not necessarily commutative) and `M` is a Noetherian `R`-module (based on the proof in <https://math.stackexchange.com/a/1066128>), or - `R` is a commutative ring and `M` is a finitely generated `R`-module (based on the proof in <https://math.stackexchange.com/a/1066110>), if `N` is a submodule of `M`, `f : N -> M` is a surjective `R`-module homomorphism, then it is also injective. These results generalize `(IsNoetherian|Module.Finite).injective_of_surjective_endomorphism`. The proof for Noetherian case uses `LinearMap.iterateMapComap` which is put into `Mathlib/Algebra/Module/Submodule/IterateMapComap.lean`. The changed proof makes `LinearMap.tunnel` and `LinearMap.tailing` not used in any other parts of mathlib. Remove them or not is leaved for future discussion.
1 parent 9ac8f02 commit a7569c0

File tree

5 files changed

+243
-45
lines changed

5 files changed

+243
-45
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,7 @@ import Mathlib.Algebra.Module.Prod
413413
import Mathlib.Algebra.Module.Projective
414414
import Mathlib.Algebra.Module.Submodule.Basic
415415
import Mathlib.Algebra.Module.Submodule.Bilinear
416+
import Mathlib.Algebra.Module.Submodule.IterateMapComap
416417
import Mathlib.Algebra.Module.Submodule.Ker
417418
import Mathlib.Algebra.Module.Submodule.Lattice
418419
import Mathlib.Algebra.Module.Submodule.LinearMap
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/-
2+
Copyright (c) 2024 Jz Pan. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Jz Pan
5+
-/
6+
import Mathlib.Algebra.Module.Submodule.Ker
7+
8+
/-!
9+
10+
# Iterate maps and comaps of submodules
11+
12+
Some preliminary work for establishing the strong rank condition for noetherian rings.
13+
14+
Given two linear maps `f i : N →ₗ[R] M` and a submodule `K : Submodule R N`, we can define
15+
`LinearMap.iterateMapComap f i n K : Submodule R N` to be `f⁻¹(i(⋯(f⁻¹(i(K)))))` (`n` times).
16+
If `f(K) ≤ i(K)`, then this sequence is non-decreasing (`LinearMap.iterateMapComap_le_succ`).
17+
On the other hand, if `f` is surjective, `i` is injective, and there exists some `m` such that
18+
`LinearMap.iterateMapComap f i m K = LinearMap.iterateMapComap f i (m + 1) K`,
19+
then for any `n`,
20+
`LinearMap.iterateMapComap f i n K = LinearMap.iterateMapComap f i (n + 1) K`.
21+
In particular, by taking `n = 0`, the kernel of `f` is contained in `K`
22+
(`LinearMap.ker_le_of_iterateMapComap_eq_succ`),
23+
which is a consequence of `LinearMap.ker_le_comap`.
24+
As a special case, if one can take `K` to be zero,
25+
then `f` is injective. This is the key result for establishing the strong rank condition
26+
for noetherian rings.
27+
28+
The construction here is adapted from the proof in Djoković's paper
29+
*Epimorphisms of modules which must be isomorphisms* [djokovic1973].
30+
31+
-/
32+
33+
open Function Submodule
34+
35+
namespace LinearMap
36+
37+
variable {R N M : Type*} [Semiring R] [AddCommMonoid N] [Module R N]
38+
[AddCommMonoid M] [Module R M] (f i : N →ₗ[R] M)
39+
40+
/-- The `LinearMap.iterateMapComap f i n K : Submodule R N` is
41+
`f⁻¹(i(⋯(f⁻¹(i(K)))))` (`n` times). -/
42+
def iterateMapComap (n : ℕ) := (fun K : Submodule R N ↦ (K.map i).comap f)^[n]
43+
44+
/-- If `f(K) ≤ i(K)`, then `LinearMap.iterateMapComap` is not decreasing. -/
45+
theorem iterateMapComap_le_succ (K : Submodule R N) (h : K.map f ≤ K.map i) (n : ℕ) :
46+
f.iterateMapComap i n K ≤ f.iterateMapComap i (n + 1) K := by
47+
nth_rw 2 [iterateMapComap]
48+
rw [iterate_succ', Function.comp_apply, ← iterateMapComap, ← map_le_iff_le_comap]
49+
induction n with
50+
| zero => exact h
51+
| succ n ih =>
52+
simp_rw [iterateMapComap, iterate_succ', Function.comp_apply]
53+
calc
54+
_ ≤ (f.iterateMapComap i n K).map i := map_comap_le _ _
55+
_ ≤ (((f.iterateMapComap i n K).map f).comap f).map i := map_mono (le_comap_map _ _)
56+
_ ≤ _ := map_mono (comap_mono ih)
57+
58+
/-- If `f` is surjective, `i` is injective, and there exists some `m` such that
59+
`LinearMap.iterateMapComap f i m K = LinearMap.iterateMapComap f i (m + 1) K`,
60+
then for any `n`,
61+
`LinearMap.iterateMapComap f i n K = LinearMap.iterateMapComap f i (n + 1) K`.
62+
In particular, by taking `n = 0`, the kernel of `f` is contained in `K`
63+
(`LinearMap.ker_le_of_iterateMapComap_eq_succ`),
64+
which is a consequence of `LinearMap.ker_le_comap`. -/
65+
theorem iterateMapComap_eq_succ (K : Submodule R N)
66+
(m : ℕ) (heq : f.iterateMapComap i m K = f.iterateMapComap i (m + 1) K)
67+
(hf : Surjective f) (hi : Injective i) (n : ℕ) :
68+
f.iterateMapComap i n K = f.iterateMapComap i (n + 1) K := by
69+
induction n with
70+
| zero =>
71+
contrapose! heq
72+
induction m with
73+
| zero => exact heq
74+
| succ m ih =>
75+
rw [iterateMapComap, iterateMapComap, iterate_succ', iterate_succ']
76+
exact fun H ↦ ih (map_injective_of_injective hi (comap_injective_of_surjective hf H))
77+
| succ n ih =>
78+
rw [iterateMapComap, iterateMapComap, iterate_succ', iterate_succ',
79+
Function.comp_apply, Function.comp_apply, ← iterateMapComap, ← iterateMapComap, ih]
80+
81+
/-- If `f` is surjective, `i` is injective, and there exists some `m` such that
82+
`LinearMap.iterateMapComap f i m K = LinearMap.iterateMapComap f i (m + 1) K`,
83+
then the kernel of `f` is contained in `K`.
84+
This is a corollary of `LinearMap.iterateMapComap_eq_succ` and `LinearMap.ker_le_comap`.
85+
As a special case, if one can take `K` to be zero,
86+
then `f` is injective. This is the key result for establishing the strong rank condition
87+
for noetherian rings. -/
88+
theorem ker_le_of_iterateMapComap_eq_succ (K : Submodule R N)
89+
(m : ℕ) (heq : f.iterateMapComap i m K = f.iterateMapComap i (m + 1) K)
90+
(hf : Surjective f) (hi : Injective i) : LinearMap.ker f ≤ K := by
91+
rw [show K = _ from f.iterateMapComap_eq_succ i K m heq hf hi 0]
92+
exact f.ker_le_comap
93+
94+
end LinearMap

Mathlib/LinearAlgebra/InvariantBasisNumber.lean

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ It is also useful to consider the following stronger conditions:
3838
3939
## Instances
4040
41+
- `IsNoetherianRing.orzechProperty` (defined in `Mathlib/RingTheory/Noetherian.lean`) :
42+
any left-noetherian ring satisfies the Orzech property.
43+
This applies in particular to division rings.
44+
4145
- `strongRankCondition_of_orzechProperty` : the Orzech property implies the strong rank condition
4246
(for non trivial rings).
4347
@@ -50,11 +54,11 @@ It is also useful to consider the following stronger conditions:
5054
invariant basis number property.
5155
5256
- `invariantBasisNumber_of_nontrivial_of_commRing`: a nontrivial commutative ring satisfies
53-
the invariant basis number property
57+
the invariant basis number property.
5458
55-
More generally, every commutative ring satisfies the strong rank condition. This is proved in
56-
`LinearAlgebra/FreeModule/StrongRankCondition`. We keep
57-
`invariantBasisNumber_of_nontrivial_of_commRing` here since it imports fewer files.
59+
More generally, every commutative ring satisfies the Orzech property,
60+
hence the strong rank condition, which is proved in `Mathlib/RingTheory/FiniteType.lean`.
61+
We keep `invariantBasisNumber_of_nontrivial_of_commRing` here since it imports fewer files.
5862
5963
6064
## Counterexamples to converse results
@@ -263,30 +267,10 @@ section
263267

264268
variable (R : Type u) [Ring R] [Nontrivial R] [IsNoetherianRing R]
265269

266-
-- Note this includes fields,
267-
-- and we use this below to show any commutative ring has invariant basis number.
268-
/-- Any nontrivial noetherian ring satisfies the strong rank condition.
269-
270-
An injective map `((Fin n ⊕ Fin (1 + m)) → R) →ₗ[R] (Fin n → R)` for some left-noetherian `R`
271-
would force `Fin (1 + m) → R ≃ₗ PUnit` (via `IsNoetherian.equivPUnitOfProdInjective`),
272-
which is not the case!
273-
-/
274-
instance (priority := 100) IsNoetherianRing.strongRankCondition : StrongRankCondition R := by
275-
constructor
276-
intro m n f i
277-
by_contra h
278-
rw [not_le, ← Nat.add_one_le_iff, le_iff_exists_add] at h
279-
obtain ⟨m, rfl⟩ := h
280-
let e : Fin (n + 1 + m) ≃ Sum (Fin n) (Fin (1 + m)) :=
281-
(finCongr (add_assoc _ _ _)).trans finSumFinEquiv.symm
282-
let f' :=
283-
f.comp
284-
((LinearEquiv.sumArrowLequivProdArrow _ _ R R).symm.trans
285-
(LinearEquiv.funCongrLeft R R e)).toLinearMap
286-
have i' : Injective f' := i.comp (LinearEquiv.injective _)
287-
apply @zero_ne_one (Fin (1 + m) → R) _ _
288-
apply (IsNoetherian.equivPUnitOfProdInjective f' i').injective
289-
ext
270+
/-- Any nontrivial noetherian ring satisfies the strong rank condition,
271+
since it satisfies Orzech property. -/
272+
instance (priority := 100) IsNoetherianRing.strongRankCondition : StrongRankCondition R :=
273+
inferInstance
290274
#align noetherian_ring_strong_rank_condition IsNoetherianRing.strongRankCondition
291275

292276
end

Mathlib/RingTheory/FiniteType.lean

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,96 @@ end MonoidAlgebra
706706

707707
end MonoidAlgebra
708708

709+
section Orzech
710+
711+
open Submodule Module Module.Finite in
712+
/-- Any commutative ring `R` satisfies the `OrzechProperty`, that is, for any finitely generated
713+
`R`-module `M`, any surjective homomorphism `f : N →ₗ[R] M` from a submodule `N` of `M` to `M`
714+
is injective.
715+
716+
This is a consequence of Noetherian case
717+
(`IsNoetherian.injective_of_surjective_of_injective`), which requires that `M` is a
718+
Noetherian module, but allows `R` to be non-commutative. The reduction of this result to
719+
Noetherian case is adapted from <https://math.stackexchange.com/a/1066110>:
720+
suppose `{ m_j }` is a finite set of generator of `M`, for any `n : N` one can write
721+
`i n = ∑ j, b_j * m_j` for `{ b_j }` in `R`, here `i : N →ₗ[R] M` is the standard inclusion.
722+
We can choose `{ n_j }` which are preimages of `{ m_j }` under `f`, and can choose
723+
`{ c_jl }` in `R` such that `i n_j = ∑ l, c_jl * m_l` for each `j`.
724+
Now let `A` be the subring of `R` generated by `{ b_j }` and `{ c_jl }`, then it is
725+
Noetherian. Let `N'` be the `A`-submodule of `N` generated by `n` and `{ n_j }`,
726+
`M'` be the `A`-submodule of `M` generated by `{ m_j }`,
727+
then it's easy to see that `i` and `f` restrict to `N' →ₗ[A] M'`,
728+
and the restricted version of `f` is surjective, hence by Noetherian case,
729+
it is also injective, in particular, if `f n = 0`, then `n = 0`.
730+
731+
See also Orzech's original paper: *Onto endomorphisms are isomorphisms* [orzech1971]. -/
732+
instance (priority := 100) CommRing.orzechProperty
733+
(R : Type*) [CommRing R] : OrzechProperty R := by
734+
refine ⟨fun {M} _ _ _ {N} f hf ↦ ?_⟩
735+
letI := addCommMonoidToAddCommGroup R (M := M)
736+
letI := addCommMonoidToAddCommGroup R (M := N)
737+
let i := N.subtype
738+
let hi : Function.Injective i := N.injective_subtype
739+
refine LinearMap.ker_eq_bot.1 <| LinearMap.ker_eq_bot'.2 fun n hn ↦ ?_
740+
obtain ⟨k, mj, hmj⟩ := exists_fin (R := R) (M := M)
741+
rw [← surjective_piEquiv_apply_iff] at hmj
742+
obtain ⟨b, hb⟩ := hmj (i n)
743+
choose nj hnj using fun j ↦ hf (mj j)
744+
choose c hc using fun j ↦ hmj (i (nj j))
745+
let A := Subring.closure (Set.range b ∪ Set.range c.uncurry)
746+
let N' := span A ({n} ∪ Set.range nj)
747+
let M' := span A (Set.range mj)
748+
haveI : IsNoetherianRing A := is_noetherian_subring_closure _
749+
(.union (Set.finite_range _) (Set.finite_range _))
750+
haveI : Module.Finite A M' := span_of_finite A (Set.finite_range _)
751+
refine congr($((LinearMap.ker_eq_bot'.1 <| LinearMap.ker_eq_bot.2 <|
752+
IsNoetherian.injective_of_surjective_of_injective
753+
((i.restrictScalars A).restrict fun x hx ↦ ?_ : N' →ₗ[A] M')
754+
((f.restrictScalars A).restrict fun x hx ↦ ?_ : N' →ₗ[A] M')
755+
(fun _ _ h ↦ injective_subtype _ (hi congr(($h).1)))
756+
fun ⟨x, hx⟩ ↦ ?_) ⟨n, (subset_span (by simp))⟩ (Subtype.val_injective hn)).1)
757+
· induction hx using span_induction' with
758+
| mem x hx =>
759+
change i x ∈ M'
760+
simp only [Set.singleton_union, Set.mem_insert_iff, Set.mem_range] at hx
761+
rcases hx with hx | ⟨j, rfl⟩
762+
· rw [hx, ← hb, piEquiv_apply_apply]
763+
refine Submodule.sum_mem _ fun j _ ↦ ?_
764+
let b' : A := ⟨b j, Subring.subset_closure (by simp)⟩
765+
rw [show b j • mj j = b' • mj j from rfl]
766+
exact smul_mem _ _ (subset_span (by simp))
767+
· rw [← hc, piEquiv_apply_apply]
768+
refine Submodule.sum_mem _ fun j' _ ↦ ?_
769+
let c' : A := ⟨c j j', Subring.subset_closure
770+
(by simp [show ∃ a b, c a b = c j j' from ⟨j, j', rfl⟩])⟩
771+
rw [show c j j' • mj j' = c' • mj j' from rfl]
772+
exact smul_mem _ _ (subset_span (by simp))
773+
| zero => simp
774+
| add x _ y _ hx hy => rw [map_add]; exact add_mem hx hy
775+
| smul a x _ hx => rw [map_smul]; exact smul_mem _ _ hx
776+
· induction hx using span_induction' with
777+
| mem x hx =>
778+
change f x ∈ M'
779+
simp only [Set.singleton_union, Set.mem_insert_iff, Set.mem_range] at hx
780+
rcases hx with hx | ⟨j, rfl⟩
781+
· rw [hx, hn]; exact zero_mem _
782+
· exact subset_span (by simp [hnj])
783+
| zero => simp
784+
| add x _ y _ hx hy => rw [map_add]; exact add_mem hx hy
785+
| smul a x _ hx => rw [map_smul]; exact smul_mem _ _ hx
786+
suffices x ∈ LinearMap.range ((f.restrictScalars A).domRestrict N') by
787+
obtain ⟨a, ha⟩ := this
788+
exact ⟨a, Subtype.val_injective ha⟩
789+
induction hx using span_induction' with
790+
| mem x hx =>
791+
obtain ⟨j, rfl⟩ := hx
792+
exact ⟨⟨nj j, subset_span (by simp)⟩, hnj j⟩
793+
| zero => exact zero_mem _
794+
| add x _ y _ hx hy => exact add_mem hx hy
795+
| smul a x _ hx => exact smul_mem _ a hx
796+
797+
end Orzech
798+
709799
section Vasconcelos
710800

711801
/-- A theorem/proof by Vasconcelos, given a finite module `M` over a commutative ring, any

Mathlib/RingTheory/Noetherian.lean

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Mario Carneiro, Kevin Buzzard
55
-/
66
import Mathlib.Order.Filter.EventuallyConst
7-
import Mathlib.RingTheory.Finiteness
7+
import Mathlib.Order.PartialSups
8+
import Mathlib.Algebra.Module.Submodule.IterateMapComap
9+
import Mathlib.RingTheory.OrzechProperty
810
import Mathlib.RingTheory.Nilpotent.Lemmas
911

1012
#align_import ring_theory.noetherian from "leanprover-community/mathlib"@"210657c4ea4a4a7b234392f70a3a2a83346dfa90"
@@ -456,14 +458,31 @@ lemma LinearMap.eventually_iSup_ker_pow_eq (f : M →ₗ[R] M) :
456458
· rw [← hn _ (hm.trans h), hn _ hm]
457459
· exact f.iterateKer.monotone h.le
458460

461+
/-- **Orzech's theorem** for Noetherian module: if `R` is a ring (not necessarily commutative),
462+
`M` and `N` are `R`-modules, `M` is Noetherian, `i : N →ₗ[R] M` is injective,
463+
`f : N →ₗ[R] M` is surjective, then `f` is also injective. The proof here is adapted from
464+
Djoković's paper *Epimorphisms of modules which must be isomorphisms* [djokovic1973],
465+
utilizing `LinearMap.iterateMapComap`.
466+
See also Orzech's original paper: *Onto endomorphisms are isomorphisms* [orzech1971]. -/
467+
theorem IsNoetherian.injective_of_surjective_of_injective (i f : N →ₗ[R] M)
468+
(hi : Injective i) (hf : Surjective f) : Injective f := by
469+
haveI := isNoetherian_of_injective i hi
470+
obtain ⟨n, H⟩ := monotone_stabilizes_iff_noetherian.2 ‹_›
471+
⟨_, monotone_nat_of_le_succ <| f.iterateMapComap_le_succ i ⊥ (by simp)⟩
472+
exact LinearMap.ker_eq_bot.1 <| bot_unique <|
473+
f.ker_le_of_iterateMapComap_eq_succ i ⊥ n (H _ (Nat.le_succ _)) hf hi
474+
475+
/-- **Orzech's theorem** for Noetherian module: if `R` is a ring (not necessarily commutative),
476+
`M` is a Noetherian `R`-module, `N` is a submodule, `f : N →ₗ[R] M` is surjective, then `f` is also
477+
injective. -/
478+
theorem IsNoetherian.injective_of_surjective_of_submodule
479+
{N : Submodule R M} (f : N →ₗ[R] M) (hf : Surjective f) : Injective f :=
480+
IsNoetherian.injective_of_surjective_of_injective N.subtype f N.injective_subtype hf
481+
459482
/-- Any surjective endomorphism of a Noetherian module is injective. -/
460483
theorem IsNoetherian.injective_of_surjective_endomorphism (f : M →ₗ[R] M)
461-
(s : Surjective f) : Injective f := by
462-
obtain ⟨n, hn⟩ := eventually_atTop.mp f.eventually_disjoint_ker_pow_range_pow
463-
specialize hn (n + 1) (n.le_add_right 1)
464-
rw [disjoint_iff, LinearMap.range_eq_top.mpr (LinearMap.iterate_surjective s _), inf_top_eq,
465-
LinearMap.ker_eq_bot] at hn
466-
exact LinearMap.injective_of_iterate_injective n.succ_ne_zero hn
484+
(s : Surjective f) : Injective f :=
485+
IsNoetherian.injective_of_surjective_of_injective _ f (LinearEquiv.refl _ _).injective s
467486
#align is_noetherian.injective_of_surjective_endomorphism IsNoetherian.injective_of_surjective_endomorphism
468487

469488
/-- Any surjective endomorphism of a Noetherian module is bijective. -/
@@ -494,16 +513,17 @@ theorem IsNoetherian.disjoint_partialSups_eventually_bot
494513
#align is_noetherian.disjoint_partial_sups_eventually_bot IsNoetherian.disjoint_partialSups_eventually_bot
495514

496515
/-- If `M ⊕ N` embeds into `M`, for `M` noetherian over `R`, then `N` is trivial. -/
497-
noncomputable def IsNoetherian.equivPUnitOfProdInjective (f : M × N →ₗ[R] M)
498-
(i : Injective f) : N ≃ₗ[R] PUnit.{w + 1} := by
499-
apply Nonempty.some
500-
obtain ⟨n, w⟩ :=
501-
IsNoetherian.disjoint_partialSups_eventually_bot (f.tailing i) (f.tailings_disjoint_tailing i)
502-
specialize w n (le_refl n)
503-
apply Nonempty.intro
504-
refine (LinearMap.tailingLinearEquiv f i n).symm ≪≫ₗ ?_
505-
rw [w]
506-
apply Submodule.botEquivPUnit
516+
theorem IsNoetherian.subsingleton_of_prod_injective (f : M × N →ₗ[R] M)
517+
(i : Injective f) : Subsingleton N := .intro fun x y ↦ by
518+
have h := IsNoetherian.injective_of_surjective_of_injective f _ i LinearMap.fst_surjective
519+
simpa using h (show LinearMap.fst R M N (0, x) = LinearMap.fst R M N (0, y) from rfl)
520+
521+
/-- If `M ⊕ N` embeds into `M`, for `M` noetherian over `R`, then `N` is trivial. -/
522+
@[simps!]
523+
def IsNoetherian.equivPUnitOfProdInjective (f : M × N →ₗ[R] M)
524+
(i : Injective f) : N ≃ₗ[R] PUnit.{w + 1} :=
525+
haveI := IsNoetherian.subsingleton_of_prod_injective f i
526+
.ofSubsingleton _ _
507527
#align is_noetherian.equiv_punit_of_prod_injective IsNoetherian.equivPUnitOfProdInjective
508528

509529
end
@@ -624,3 +644,12 @@ theorem IsNoetherianRing.isNilpotent_nilradical (R : Type*) [CommRing R] [IsNoet
624644
obtain ⟨n, hn⟩ := Ideal.exists_radical_pow_le_of_fg (⊥ : Ideal R) (IsNoetherian.noetherian _)
625645
exact ⟨n, eq_bot_iff.mpr hn⟩
626646
#align is_noetherian_ring.is_nilpotent_nilradical IsNoetherianRing.isNilpotent_nilradical
647+
648+
/-- Any Noetherian ring satisfies Orzech property.
649+
See also `IsNoetherian.injective_of_surjective_of_submodule` and
650+
`IsNoetherian.injective_of_surjective_of_injective`. -/
651+
instance (priority := 100) IsNoetherianRing.orzechProperty
652+
(R) [Ring R] [IsNoetherianRing R] : OrzechProperty R where
653+
injective_of_surjective_of_submodule' {M} :=
654+
letI := Module.addCommMonoidToAddCommGroup R (M := M)
655+
IsNoetherian.injective_of_surjective_of_submodule

0 commit comments

Comments
 (0)