@@ -7,13 +7,34 @@ Authors: Andrew Yang
7
7
import ring_theory.noetherian
8
8
import ring_theory.rees_algebra
9
9
import ring_theory.finiteness
10
+ import data.polynomial.module
11
+ import order.hom.complete_lattice
10
12
11
13
/-!
12
14
13
15
# `I`-filtrations of modules
14
16
15
17
This file contains the definitions and basic results around (stable) `I`-filtrations of modules.
16
18
19
+ ## Main results
20
+
21
+ - `ideal.filtration`: An `I`-filtration on the module `M` is a sequence of decreasing submodules
22
+ `N i` such that `I • N ≤ I (i + 1)`. Note that we do not require the filtration to start from `⊤`.
23
+ - `ideal.filtration.stable`: An `I`-filtration is stable if `I • (N i) = N (i + 1)` for large
24
+ enough `i`.
25
+ - `ideal.filtration.submodule`: The associated module `⨁ Nᵢ` of a filtration, implemented as a
26
+ submodule of `M[X]`.
27
+ - `ideal.filtration.submodule_fg_iff_stable`: If `F.N i` are all finitely generated, then
28
+ `F.stable` iff `F.submodule.fg`.
29
+ - `ideal.filtration.stable.of_le`: In a finite module over a noetherian ring,
30
+ if `F' ≤ F`, then `F.stable → F'.stable`.
31
+ - `ideal.exists_pow_inf_eq_pow_smul`: **Artin-Rees lemma** .
32
+ given `N ≤ M`, there exists a `k` such that `IⁿM ⊓ N = Iⁿ⁻ᵏ(IᵏM ⊓ N)` for all `n ≥ k`.
33
+ - `ideal.infi_pow_eq_bot_of_local_ring`:
34
+ **Krull's intersection theorem** (`⨅ i, I ^ i = ⊥`) for noetherian local rings.
35
+ - `ideal.infi_pow_eq_bot_of_is_domain`:
36
+ **Krull's intersection theorem** (`⨅ i, I ^ i = ⊥`) for noetherian domains.
37
+
17
38
-/
18
39
19
40
@@ -25,7 +46,7 @@ open polynomial
25
46
open_locale polynomial big_operators
26
47
27
48
/-- An `I`-filtration on the module `M` is a sequence of decreasing submodules `N i` such that
28
- `I • N ≤ I (i + 1)`. Note that we do not require the filtration to start from `⊤`. -/
49
+ `I • (N i) ≤ N (i + 1)`. Note that we do not require the filtration to start from `⊤`. -/
29
50
@[ext]
30
51
structure ideal.filtration (M : Type u) [add_comm_group M] [module R M] :=
31
52
(N : ℕ → submodule R M)
@@ -196,4 +217,233 @@ begin
196
217
refine ⟨(F.antitone _).trans (h₁ n), (F'.antitone _).trans (h₂ n)⟩; simp
197
218
end
198
219
220
+ open polynomial_module
221
+
222
+ variables (F F')
223
+
224
+ /-- The `R[IX]`-submodule of `M[X]` associated with an `I`-filtration. -/
225
+ protected
226
+ def submodule : submodule (rees_algebra I) (polynomial_module R M) :=
227
+ { carrier := { f | ∀ i, f i ∈ F.N i },
228
+ add_mem' := λ f g hf hg i, submodule.add_mem _ (hf i) (hg i),
229
+ zero_mem' := λ i, submodule.zero_mem _,
230
+ smul_mem' := λ r f hf i, begin
231
+ rw [subalgebra.smul_def, polynomial_module.smul_apply],
232
+ apply submodule.sum_mem,
233
+ rintro ⟨j, k⟩ e,
234
+ rw finset.nat.mem_antidiagonal at e,
235
+ subst e,
236
+ exact F.pow_smul_le j k (submodule.smul_mem_smul (r.2 j) (hf k))
237
+ end }
238
+
239
+ @[simp]
240
+ lemma mem_submodule (f : polynomial_module R M) : f ∈ F.submodule ↔ ∀ i, f i ∈ F.N i := iff.rfl
241
+
242
+ lemma inf_submodule : (F ⊓ F').submodule = F.submodule ⊓ F'.submodule :=
243
+ by { ext, exact forall_and_distrib }
244
+
245
+ variables (I M)
246
+
247
+ /-- `ideal.filtration.submodule` as an `inf_hom` -/
248
+ def submodule_inf_hom :
249
+ inf_hom (I.filtration M) (submodule (rees_algebra I) (polynomial_module R M)) :=
250
+ { to_fun := ideal.filtration.submodule, map_inf' := inf_submodule }
251
+
252
+ variables {I M}
253
+
254
+ lemma submodule_closure_single :
255
+ add_submonoid.closure (⋃ i, single R i '' (F.N i : set M)) = F.submodule.to_add_submonoid :=
256
+ begin
257
+ apply le_antisymm,
258
+ { rw [add_submonoid.closure_le, set.Union_subset_iff],
259
+ rintro i _ ⟨m, hm, rfl⟩ j,
260
+ rw single_apply,
261
+ split_ifs,
262
+ { rwa ← h },
263
+ { exact (F.N j).zero_mem } },
264
+ { intros f hf,
265
+ rw [← f.sum_single],
266
+ apply add_submonoid.sum_mem _ _,
267
+ rintros c -,
268
+ exact add_submonoid.subset_closure (set.subset_Union _ c $ set.mem_image_of_mem _ (hf c)) }
269
+ end
270
+
271
+ lemma submodule_span_single :
272
+ submodule.span (rees_algebra I) (⋃ i, single R i '' (F.N i : set M)) = F.submodule :=
273
+ begin
274
+ rw [← submodule.span_closure, submodule_closure_single],
275
+ simp,
276
+ end
277
+
278
+ lemma submodule_eq_span_le_iff_stable_ge (n₀ : ℕ) :
279
+ F.submodule = submodule.span _ (⋃ i ≤ n₀, single R i '' (F.N i : set M)) ↔
280
+ ∀ n ≥ n₀, I • F.N n = F.N (n + 1 ) :=
281
+ begin
282
+ rw [← submodule_span_single, ← has_le.le.le_iff_eq, submodule.span_le,
283
+ set.Union_subset_iff],
284
+ swap, { exact submodule.span_mono (set.Union₂_subset_Union _ _) },
285
+ split,
286
+ { intros H n hn,
287
+ refine (F.smul_le n).antisymm _,
288
+ intros x hx,
289
+ obtain ⟨l, hl⟩ := (finsupp.mem_span_iff_total _ _ _).mp (H _ ⟨x, hx, rfl⟩),
290
+ replace hl := congr_arg (λ f : ℕ →₀ M, f (n + 1 )) hl,
291
+ dsimp only at hl,
292
+ erw finsupp.single_eq_same at hl,
293
+ rw [← hl, finsupp.total_apply, finsupp.sum_apply],
294
+ apply submodule.sum_mem _ _,
295
+ rintros ⟨_, _, ⟨n', rfl⟩, _, ⟨hn', rfl⟩, m, hm, rfl⟩ -,
296
+ dsimp only [subtype.coe_mk],
297
+ rw [subalgebra.smul_def, smul_single_apply, if_pos (show n' ≤ n + 1 , by linarith)],
298
+ have e : n' ≤ n := by linarith,
299
+ have := F.pow_smul_le_pow_smul (n - n') n' 1 ,
300
+ rw [tsub_add_cancel_of_le e, pow_one, add_comm _ 1 , ← add_tsub_assoc_of_le e, add_comm] at this ,
301
+ exact this (submodule.smul_mem_smul ((l _).2 $ n + 1 - n') hm) },
302
+ { let F' := submodule.span (rees_algebra I) (⋃ i ≤ n₀, single R i '' (F.N i : set M)),
303
+ intros hF i,
304
+ have : ∀ i ≤ n₀, single R i '' (F.N i : set M) ⊆ F' :=
305
+ λ i hi, set.subset.trans (set.subset_Union₂ i hi) submodule.subset_span,
306
+ induction i with j hj,
307
+ { exact this _ (zero_le _) },
308
+ by_cases hj' : j.succ ≤ n₀,
309
+ { exact this _ hj' },
310
+ simp only [not_le, nat.lt_succ_iff] at hj',
311
+ rw [nat.succ_eq_add_one, ← hF _ hj'],
312
+ rintro _ ⟨m, hm, rfl⟩,
313
+ apply submodule.smul_induction_on hm,
314
+ { intros r hr m' hm',
315
+ rw [add_comm, ← monomial_smul_single],
316
+ exact F'.smul_mem ⟨_, rees_algebra.monomial_mem.mpr (by rwa pow_one)⟩
317
+ (hj $ set.mem_image_of_mem _ hm') },
318
+ { intros x y hx hy, rw map_add, exact F'.add_mem hx hy } }
319
+ end
320
+
321
+ /-- If the components of a filtration are finitely generated, then the filtration is stable iff
322
+ its associated submodule of is finitely generated. -/
323
+ lemma submodule_fg_iff_stable (hF' : ∀ i, (F.N i).fg) :
324
+ F.submodule.fg ↔ F.stable :=
325
+ begin
326
+ classical,
327
+ delta ideal.filtration.stable,
328
+ simp_rw ← F.submodule_eq_span_le_iff_stable_ge,
329
+ split,
330
+ { rintro H,
331
+ apply H.stablizes_of_supr_eq
332
+ ⟨λ n₀, submodule.span _ (⋃ (i : ℕ) (H : i ≤ n₀), single R i '' ↑(F.N i)), _⟩,
333
+ { dsimp,
334
+ rw [← submodule.span_Union, ← submodule_span_single],
335
+ congr' 1 ,
336
+ ext,
337
+ simp only [set.mem_Union, set.mem_image, set_like.mem_coe, exists_prop],
338
+ split,
339
+ { rintro ⟨-, i, -, e⟩, exact ⟨i, e⟩ },
340
+ { rintro ⟨i, e⟩, exact ⟨i, i, le_refl i, e⟩ } },
341
+ { intros n m e,
342
+ rw [submodule.span_le, set.Union₂_subset_iff],
343
+ intros i hi,
344
+ refine (set.subset.trans _ (set.subset_Union₂ i (hi.trans e : _))).trans
345
+ submodule.subset_span,
346
+ refl } },
347
+ { rintros ⟨n, hn⟩,
348
+ rw hn,
349
+ simp_rw [submodule.span_Union₂, ← finset.mem_range_succ_iff, supr_subtype'],
350
+ apply submodule.fg_supr,
351
+ rintro ⟨i, hi⟩,
352
+ obtain ⟨s, hs⟩ := hF' i,
353
+ have : submodule.span (rees_algebra I) (s.image (lsingle R i) : set (polynomial_module R M))
354
+ = submodule.span _ (single R i '' (F.N i : set M)),
355
+ { rw [finset.coe_image, ← submodule.span_span_of_tower R, ← submodule.map_span, hs], refl },
356
+ rw [subtype.coe_mk, ← this ],
357
+ exact ⟨_, rfl⟩ }
358
+ end
359
+ .
360
+ variables {F}
361
+
362
+ lemma stable.of_le [is_noetherian_ring R] [h : module.finite R M] (hF : F.stable)
363
+ {F' : I.filtration M} (hf : F' ≤ F) : F'.stable :=
364
+ begin
365
+ haveI := is_noetherian_of_fg_of_noetherian' h.1 ,
366
+ rw ← submodule_fg_iff_stable at hF ⊢,
367
+ any_goals { intro i, exact is_noetherian.noetherian _ },
368
+ have := is_noetherian_of_fg_of_noetherian _ hF,
369
+ rw is_noetherian_submodule at this ,
370
+ exact this _ (order_hom_class.mono (submodule_inf_hom M I) hf),
371
+ end
372
+
373
+ lemma stable.inter_right [is_noetherian_ring R] [h : module.finite R M] (hF : F.stable) :
374
+ (F ⊓ F').stable :=
375
+ hF.of_le inf_le_left
376
+
377
+ lemma stable.inter_left [is_noetherian_ring R] [h : module.finite R M] (hF : F.stable) :
378
+ (F' ⊓ F).stable :=
379
+ hF.of_le inf_le_right
380
+
199
381
end ideal.filtration
382
+
383
+ variable (I)
384
+
385
+ /-- **Artin-Rees lemma** -/
386
+ lemma ideal.exists_pow_inf_eq_pow_smul [is_noetherian_ring R] [h : module.finite R M]
387
+ (N : submodule R M) : ∃ k : ℕ, ∀ n ≥ k, I ^ n • ⊤ ⊓ N = I ^ (n - k) • (I ^ k • ⊤ ⊓ N) :=
388
+ ((I.stable_filtration_stable ⊤).inter_right (I.trivial_filtration N)).exists_pow_smul_eq_of_ge
389
+
390
+ lemma ideal.mem_infi_smul_pow_eq_bot_iff [is_noetherian_ring R] [hM : module.finite R M] (x : M) :
391
+ x ∈ (⨅ i : ℕ, I ^ i • ⊤ : submodule R M) ↔ ∃ r : I, (r : R) • x = x :=
392
+ begin
393
+ let N := (⨅ i : ℕ, I ^ i • ⊤ : submodule R M),
394
+ have hN : ∀ k, (I.stable_filtration ⊤ ⊓ I.trivial_filtration N).N k = N,
395
+ { intro k, exact inf_eq_right.mpr ((infi_le _ k).trans $ le_of_eq $ by simp) },
396
+ split,
397
+ { haveI := is_noetherian_of_fg_of_noetherian' hM.out,
398
+ obtain ⟨r, hr₁, hr₂⟩ := submodule.exists_mem_and_smul_eq_self_of_fg_of_le_smul I N
399
+ (is_noetherian.noetherian N) _,
400
+ { intro H, exact ⟨⟨r, hr₁⟩, hr₂ _ H⟩ },
401
+ obtain ⟨k, hk⟩ := (I.stable_filtration_stable ⊤).inter_right (I.trivial_filtration N),
402
+ have := hk k (le_refl _),
403
+ rw [hN, hN] at this ,
404
+ exact le_of_eq this.symm },
405
+ { rintro ⟨r, eq⟩,
406
+ rw submodule.mem_infi,
407
+ intro i,
408
+ induction i with i hi,
409
+ { simp },
410
+ { rw [nat.succ_eq_one_add, pow_add, ← smul_smul, pow_one, ← eq],
411
+ exact submodule.smul_mem_smul r.prop hi } }
412
+ end
413
+
414
+ lemma ideal.infi_pow_smul_eq_bot_of_local_ring [is_noetherian_ring R] [local_ring R]
415
+ [module.finite R M] (h : I ≠ ⊤) :
416
+ (⨅ i : ℕ, I ^ i • ⊤ : submodule R M) = ⊥ :=
417
+ begin
418
+ rw eq_bot_iff,
419
+ intros x hx,
420
+ obtain ⟨r, hr⟩ := (I.mem_infi_smul_pow_eq_bot_iff x).mp hx,
421
+ have := local_ring.is_unit_one_sub_self_of_mem_nonunits _ (local_ring.le_maximal_ideal h r.prop),
422
+ apply this.smul_left_cancel.mp,
423
+ swap, { apply_instance },
424
+ simp [sub_smul, hr],
425
+ end
426
+
427
+ /-- **Krull's intersection theorem** for noetherian local rings. -/
428
+ lemma ideal.infi_pow_eq_bot_of_local_ring [is_noetherian_ring R] [local_ring R] (h : I ≠ ⊤) :
429
+ (⨅ i : ℕ, I ^ i) = ⊥ :=
430
+ begin
431
+ convert I.infi_pow_smul_eq_bot_of_local_ring h,
432
+ ext i,
433
+ rw [smul_eq_mul, ← ideal.one_eq_top, mul_one],
434
+ apply_instance,
435
+ end
436
+
437
+ /-- **Krull's intersection theorem** for noetherian domains. -/
438
+ lemma ideal.infi_pow_eq_bot_of_is_domain [is_noetherian_ring R] [is_domain R] (h : I ≠ ⊤) :
439
+ (⨅ i : ℕ, I ^ i) = ⊥ :=
440
+ begin
441
+ rw eq_bot_iff,
442
+ intros x hx,
443
+ by_contra hx',
444
+ have := ideal.mem_infi_smul_pow_eq_bot_iff I x,
445
+ simp_rw [smul_eq_mul, ← ideal.one_eq_top, mul_one] at this ,
446
+ obtain ⟨r, hr⟩ := this.mp hx,
447
+ have := mul_right_cancel₀ hx' (hr.trans (one_mul x).symm),
448
+ exact I.eq_top_iff_one.not.mp h (this ▸ r.prop),
449
+ end
0 commit comments