@@ -3,17 +3,8 @@ Copyright (c) 2021 Chris Hughes. All rights reserved.
3
3
Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Chris Hughes
5
5
-/
6
- import linear_algebra.basic
7
- import linear_algebra.prod
8
- import linear_algebra.pi
9
- import data.set_like.fintype
10
- import linear_algebra.linear_independent
11
- import tactic.linarith
12
- import algebra.algebra.basic
13
- import ring_theory.noetherian
14
- import ring_theory.jacobson_ideal
15
- import ring_theory.nilpotent
16
6
import ring_theory.nakayama
7
+ import data.set_like.fintype
17
8
18
9
/-!
19
10
# Artinian rings and modules
@@ -55,7 +46,8 @@ class is_artinian (R M) [semiring R] [add_comm_monoid M] [module R M] : Prop :=
55
46
(well_founded_submodule_lt [] : well_founded ((<) : submodule R M → submodule R M → Prop ))
56
47
57
48
section
58
- variables {R : Type *} {M : Type *} {P : Type *} {N : Type *}
49
+ variables {R M P N : Type *}
50
+
59
51
variables [ring R] [add_comm_group M] [add_comm_group P] [add_comm_group N]
60
52
variables [module R M] [module R P] [module R N]
61
53
open is_artinian
@@ -117,8 +109,9 @@ is_artinian_of_range_eq_ker
117
109
linear_map.snd_surjective
118
110
(linear_map.range_inl R M P)
119
111
120
- @[instance, priority 100 ]
121
- lemma is_artinian_of_fintype [fintype M] : is_artinian R M :=
112
+ @[priority 100 ]
113
+ instance is_artinian_of_finite [finite M] : is_artinian R M :=
114
+ let ⟨_⟩ := nonempty_fintype M in by exactI
122
115
⟨fintype.well_founded_of_trans_of_irrefl _⟩
123
116
124
117
local attribute [elab_as_eliminator] fintype.induction_empty_option
151
144
152
145
open is_artinian submodule function
153
146
154
- section
147
+ section ring
148
+
155
149
variables {R M : Type *} [ring R] [add_comm_group M] [module R M]
156
150
157
151
theorem is_artinian_iff_well_founded :
@@ -201,24 +195,26 @@ theorem monotone_stabilizes_iff_artinian :
201
195
(∀ (f : ℕ →o (submodule R M)ᵒᵈ), ∃ n, ∀ m, n ≤ m → f n = f m) ↔ is_artinian R M :=
202
196
by { rw is_artinian_iff_well_founded, exact well_founded.monotone_chain_condition.symm }
203
197
204
- theorem is_artinian.monotone_stabilizes [is_artinian R M] (f : ℕ →o (submodule R M)ᵒᵈ) :
205
- ∃ n, ∀ m, n ≤ m → f n = f m :=
198
+ namespace is_artinian
199
+
200
+ variables [is_artinian R M]
201
+
202
+ theorem monotone_stabilizes (f : ℕ →o (submodule R M)ᵒᵈ) : ∃ n, ∀ m, n ≤ m → f n = f m :=
206
203
monotone_stabilizes_iff_artinian.mpr ‹_› f
207
204
208
205
/-- If `∀ I > J, P I` implies `P J`, then `P` holds for all submodules. -/
209
- lemma is_artinian. induction [is_artinian R M] {P : submodule R M → Prop }
210
- (hgt : ∀ I, (∀ J < I, P J) → P I) (I : submodule R M) : P I :=
211
- well_founded.recursion (well_founded_submodule_lt R M) I hgt
206
+ lemma induction {P : submodule R M → Prop } (hgt : ∀ I, (∀ J < I, P J) → P I) (I : submodule R M) :
207
+ P I :=
208
+ (well_founded_submodule_lt R M).recursion I hgt
212
209
213
210
/--
214
211
For any endomorphism of a Artinian module, there is some nontrivial iterate
215
212
with disjoint kernel and range.
216
213
-/
217
- theorem is_artinian. exists_endomorphism_iterate_ker_sup_range_eq_top
218
- [I : is_artinian R M] (f : M →ₗ[R] M) : ∃ n : ℕ, n ≠ 0 ∧ (f ^ n).ker ⊔ (f ^ n).range = ⊤ :=
214
+ theorem exists_endomorphism_iterate_ker_sup_range_eq_top (f : M →ₗ[R] M) :
215
+ ∃ n : ℕ, n ≠ 0 ∧ (f ^ n).ker ⊔ (f ^ n).range = ⊤ :=
219
216
begin
220
- obtain ⟨n, w⟩ := monotone_stabilizes_iff_artinian.mpr I
221
- (f.iterate_range.comp ⟨λ n, n+1 , λ n m w, by linarith⟩),
217
+ obtain ⟨n, w⟩ := monotone_stabilizes (f.iterate_range.comp ⟨λ n, n+1 , λ n m w, by linarith⟩),
222
218
specialize w ((n + 1 ) + n) (by linarith),
223
219
dsimp at w,
224
220
refine ⟨n + 1 , nat.succ_ne_zero _, _⟩,
@@ -236,28 +232,25 @@ begin
236
232
end
237
233
238
234
/-- Any injective endomorphism of an Artinian module is surjective. -/
239
- theorem is_artinian.surjective_of_injective_endomorphism [is_artinian R M]
240
- (f : M →ₗ[R] M) (s : injective f) : surjective f :=
235
+ theorem surjective_of_injective_endomorphism (f : M →ₗ[R] M) (s : injective f) : surjective f :=
241
236
begin
242
- obtain ⟨n, ne, w⟩ := is_artinian. exists_endomorphism_iterate_ker_sup_range_eq_top f,
237
+ obtain ⟨n, ne, w⟩ := exists_endomorphism_iterate_ker_sup_range_eq_top f,
243
238
rw [linear_map.ker_eq_bot.mpr (linear_map.iterate_injective s n), bot_sup_eq,
244
239
linear_map.range_eq_top] at w,
245
240
exact linear_map.surjective_of_iterate_surjective ne w,
246
241
end
247
242
248
243
/-- Any injective endomorphism of an Artinian module is bijective. -/
249
- theorem is_artinian.bijective_of_injective_endomorphism [is_artinian R M]
250
- (f : M →ₗ[R] M) (s : injective f) : bijective f :=
251
- ⟨s, is_artinian.surjective_of_injective_endomorphism f s⟩
244
+ theorem bijective_of_injective_endomorphism (f : M →ₗ[R] M) (s : injective f) : bijective f :=
245
+ ⟨s, surjective_of_injective_endomorphism f s⟩
252
246
253
247
/--
254
248
A sequence `f` of submodules of a artinian module,
255
249
with the supremum `f (n+1)` and the infinum of `f 0`, ..., `f n` being ⊤,
256
250
is eventually ⊤.
257
251
-/
258
- lemma is_artinian.disjoint_partial_infs_eventually_top [I : is_artinian R M]
259
- (f : ℕ → submodule R M) (h : ∀ n, disjoint
260
- (partial_sups (order_dual.to_dual ∘ f) n) (order_dual.to_dual (f (n+1 )))) :
252
+ lemma disjoint_partial_infs_eventually_top (f : ℕ → submodule R M)
253
+ (h : ∀ n, disjoint (partial_sups (order_dual.to_dual ∘ f) n) (order_dual.to_dual (f (n+1 )))) :
261
254
∃ n : ℕ, ∀ m, n ≤ m → f m = ⊤ :=
262
255
begin
263
256
-- A little off-by-one cleanup first:
@@ -269,18 +262,48 @@ begin
269
262
{ apply w,
270
263
exact nat.succ_le_succ_iff.mp p }, },
271
264
272
- obtain ⟨n, w⟩ := monotone_stabilizes_iff_artinian.mpr I (partial_sups (order_dual.to_dual ∘ f)),
273
- exact ⟨n, λ m p, (h m).eq_bot_of_ge $ sup_eq_left. 1 $ (w (m + 1 ) $ le_add_right p).symm.trans $
274
- w m p⟩
265
+ obtain ⟨n, w⟩ := monotone_stabilizes (partial_sups (order_dual.to_dual ∘ f)),
266
+ refine ⟨n, λ m p, _⟩,
267
+ exact (h m).eq_bot_of_ge (sup_eq_left. 1 $ (w (m + 1 ) $ le_add_right p).symm.trans $ w m p)
275
268
end
276
269
277
- universe w
278
- variables {N : Type w} [add_comm_group N] [module R N]
270
+ end is_artinian
271
+
272
+ end ring
273
+
274
+ section comm_ring
275
+
276
+ variables {R : Type *} (M : Type *) [comm_ring R] [add_comm_group M] [module R M] [is_artinian R M]
277
+
278
+ namespace is_artinian
279
+
280
+ lemma range_smul_pow_stabilizes (r : R) : ∃ n : ℕ, ∀ m, n ≤ m →
281
+ (r^n • linear_map.id : M →ₗ[R] M).range = (r^m • linear_map.id).range :=
282
+ monotone_stabilizes
283
+ ⟨λ n, (r^n • linear_map.id : M →ₗ[R] M).range,
284
+ λ n m h x ⟨y, hy⟩, ⟨r ^ (m - n) • y,
285
+ by { dsimp at ⊢ hy, rw [←smul_assoc, smul_eq_mul, ←pow_add, ←hy, add_tsub_cancel_of_le h] }⟩⟩
286
+
287
+ variables {M}
288
+
289
+ lemma exists_pow_succ_smul_dvd (r : R) (x : M) :
290
+ ∃ (n : ℕ) (y : M), r ^ n.succ • y = r ^ n • x :=
291
+ begin
292
+ obtain ⟨n, hn⟩ := is_artinian.range_smul_pow_stabilizes M r,
293
+ simp_rw [set_like.ext_iff] at hn,
294
+ exact ⟨n, by simpa using hn n.succ n.le_succ (r ^ n • x)⟩,
295
+ end
296
+
297
+ end is_artinian
298
+
299
+ end comm_ring
279
300
280
301
-- TODO: Prove this for artinian modules
281
302
-- /--
282
303
-- If `M ⊕ N` embeds into `M`, for `M` noetherian over `R`, then `N` is trivial.
283
304
-- -/
305
+ -- universe w
306
+ -- variables {N : Type w} [add_comm_group N] [module R N]
284
307
-- noncomputable def is_noetherian.equiv_punit_of_prod_injective [is_noetherian R M]
285
308
-- (f : M × N →ₗ[ R ] M) (i : injective f) : N ≃ₗ[ R ] punit.{w+1} :=
286
309
-- begin
@@ -294,14 +317,16 @@ variables {N : Type w} [add_comm_group N] [module R N]
294
317
-- exact submodule.bot_equiv_punit,
295
318
-- end
296
319
297
- end
298
-
299
320
/-- A ring is Artinian if it is Artinian as a module over itself.
300
321
301
322
Strictly speaking, this should be called `is_left_artinian_ring` but we omit the `left_` for
302
323
convenience in the commutative case. For a right Artinian ring, use `is_artinian Rᵐᵒᵖ R`. -/
303
324
class is_artinian_ring (R) [ring R] extends is_artinian R R : Prop
304
325
326
+ -- TODO: Can we define `is_artinian_ring` in a different way so this isn't needed?
327
+ @[priority 100 ]
328
+ instance is_artinian_ring_of_finite (R) [ring R] [finite R] : is_artinian_ring R := ⟨⟩
329
+
305
330
theorem is_artinian_ring_iff {R} [ring R] : is_artinian_ring R ↔ is_artinian R R :=
306
331
⟨λ h, h.1 , @is_artinian_ring.mk _ _⟩
307
332
@@ -369,22 +394,16 @@ theorem is_artinian_span_of_finite (R) {M} [ring R] [add_comm_group M] [module R
369
394
[is_artinian_ring R] {A : set M} (hA : A.finite) : is_artinian R (submodule.span R A) :=
370
395
is_artinian_of_fg_of_artinian _ (submodule.fg_def.mpr ⟨A, hA, rfl⟩)
371
396
372
- theorem is_artinian_ring_of_surjective (R) [ring R] (S) [ring S]
373
- (f : R →+* S) (hf : function.surjective f)
374
- [H : is_artinian_ring R] : is_artinian_ring S :=
397
+ theorem function.surjective.is_artinian_ring {R} [ring R] {S} [ring S] {F} [ring_hom_class F R S]
398
+ {f : F} (hf : function.surjective f) [H : is_artinian_ring R] : is_artinian_ring S :=
375
399
begin
376
400
rw [is_artinian_ring_iff, is_artinian_iff_well_founded] at H ⊢,
377
- exact order_embedding.well_founded (ideal.order_embedding_of_surjective f hf) H,
401
+ exact (ideal.order_embedding_of_surjective f hf).well_founded H,
378
402
end
379
403
380
- instance is_artinian_ring_range {R} [ring R] {S} [ring S] (f : R →+* S)
381
- [is_artinian_ring R] : is_artinian_ring f.range :=
382
- is_artinian_ring_of_surjective R f.range f.range_restrict
383
- f.range_restrict_surjective
384
-
385
- theorem is_artinian_ring_of_ring_equiv (R) [ring R] {S} [ring S]
386
- (f : R ≃+* S) [is_artinian_ring R] : is_artinian_ring S :=
387
- is_artinian_ring_of_surjective R S f.to_ring_hom f.to_equiv.surjective
404
+ instance is_artinian_ring_range {R} [ring R] {S} [ring S] (f : R →+* S) [is_artinian_ring R] :
405
+ is_artinian_ring f.range :=
406
+ f.range_restrict_surjective.is_artinian_ring
388
407
389
408
namespace is_artinian_ring
390
409
@@ -428,4 +447,35 @@ begin
428
447
rwa [← hn (n + 1 ) (nat.le_succ _)]
429
448
end
430
449
450
+ section localization
451
+
452
+ variables (S : submonoid R) (L : Type *) [comm_ring L] [algebra R L] [is_localization S L]
453
+
454
+ include S
455
+
456
+ /-- Localizing an artinian ring can only reduce the amount of elements. -/
457
+ theorem localization_surjective : function.surjective (algebra_map R L) :=
458
+ begin
459
+ intro r',
460
+ obtain ⟨r₁, s, rfl⟩ := is_localization.mk'_surjective S r',
461
+ obtain ⟨r₂, h⟩ : ∃ r : R, is_localization.mk' L 1 s = algebra_map R L r,
462
+ swap, { exact ⟨r₁ * r₂, by rw [is_localization.mk'_eq_mul_mk'_one, map_mul, h]⟩ },
463
+ obtain ⟨n, r, hr⟩ := is_artinian.exists_pow_succ_smul_dvd (s : R) (1 : R),
464
+ use r,
465
+ rw [smul_eq_mul, smul_eq_mul, pow_succ', mul_assoc] at hr,
466
+ apply_fun algebra_map R L at hr,
467
+ simp only [map_mul, ←submonoid.coe_pow] at hr,
468
+ rw [←is_localization.mk'_one L, is_localization.mk'_eq_iff_eq, one_mul, submonoid.coe_one,
469
+ ←(is_localization.map_units L (s ^ n)).mul_left_cancel hr, map_mul, mul_comm],
470
+ end
471
+
472
+ lemma localization_artinian : is_artinian_ring L :=
473
+ (localization_surjective S L).is_artinian_ring
474
+
475
+ /-- `is_artinian_ring.localization_artinian` can't be made an instance, as it would make `S` + `R`
476
+ into metavariables. However, this is safe. -/
477
+ instance : is_artinian_ring (localization S) := localization_artinian S _
478
+
479
+ end localization
480
+
431
481
end is_artinian_ring
0 commit comments