|
| 1 | +/- |
| 2 | +Copyright (c) 2024 Andrew Yang. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Andrew Yang |
| 5 | +-/ |
| 6 | +import Mathlib.Algebra.Module.LocalizedModule |
| 7 | + |
| 8 | +/-! |
| 9 | +# Localization of Submodules |
| 10 | +
|
| 11 | +Results about localizations of submodules and quotient modules are provided in this file. |
| 12 | +
|
| 13 | +## Main result |
| 14 | +- `Submodule.localized`: |
| 15 | + The localization of an `R`-submodule of `M` at `p` viewed as an `Rₚ`-submodule of `Mₚ`. |
| 16 | +- `Submodule.toLocalized`: |
| 17 | + The localization map of a submodule `M' →ₗ[R] M'.localized p`. |
| 18 | +- `Submodule.toLocalizedQuotient`: |
| 19 | + The localization map of a quotient module `M ⧸ M' →ₗ[R] LocalizedModule p M ⧸ M'.localized p`. |
| 20 | +
|
| 21 | +## TODO |
| 22 | +- Statements regarding the exactness of localization. |
| 23 | +- Connection with flatness. |
| 24 | +
|
| 25 | +-/ |
| 26 | + |
| 27 | +open nonZeroDivisors |
| 28 | + |
| 29 | +universe u u' v v' |
| 30 | + |
| 31 | +variable {R : Type u} (S : Type u') {M : Type v} {N : Type v'} |
| 32 | +variable [CommRing R] [CommRing S] [AddCommGroup M] [AddCommGroup N] [Module R M] |
| 33 | +variable [Module R M] [Module R N] [Algebra R S] [Module S N] [IsScalarTower R S N] |
| 34 | +variable (p : Submonoid R) [IsLocalization p S] (f : M →ₗ[R] N) [IsLocalizedModule p f] |
| 35 | +variable (hp : p ≤ R⁰) |
| 36 | + |
| 37 | +variable (M' : Submodule R M) |
| 38 | + |
| 39 | +/-- Let `S` be the localization of `R` at `p` and `N` be the localization of `M` at `p`. |
| 40 | +This is the localization of an `R`-submodule of `M` viewed as an `S`-submodule of `N`. -/ |
| 41 | +def Submodule.localized' : Submodule S N where |
| 42 | + carrier := { x | ∃ m ∈ M', ∃ s : p, IsLocalizedModule.mk' f m s = x } |
| 43 | + add_mem' := fun {x} {y} ⟨m, hm, s, hx⟩ ⟨n, hn, t, hy⟩ ↦ ⟨t • m + s • n, add_mem (M'.smul_mem t hm) |
| 44 | + (M'.smul_mem s hn), s * t, by rw [← hx, ← hy, IsLocalizedModule.mk'_add_mk']⟩ |
| 45 | + zero_mem' := ⟨0, zero_mem _, 1, by simp⟩ |
| 46 | + smul_mem' := fun r x h ↦ by |
| 47 | + have ⟨m, hm, s, hx⟩ := h |
| 48 | + have ⟨y, t, hyt⟩ := IsLocalization.mk'_surjective p r |
| 49 | + exact ⟨y • m, M'.smul_mem y hm, t * s, by simp [← hyt, ← hx, IsLocalizedModule.mk'_smul_mk']⟩ |
| 50 | + |
| 51 | +/-- The localization of an `R`-submodule of `M` at `p` viewed as an `Rₚ`-submodule of `Mₚ`. -/ |
| 52 | +abbrev Submodule.localized : Submodule (Localization p) (LocalizedModule p M) := |
| 53 | + M'.localized' (Localization p) p (LocalizedModule.mkLinearMap p M) |
| 54 | + |
| 55 | +/-- The localization map of a submodule. -/ |
| 56 | +@[simps!] |
| 57 | +def Submodule.toLocalized' : M' →ₗ[R] M'.localized' S p f := |
| 58 | + f.restrict (q := (M'.localized' S p f).restrictScalars R) (fun x hx ↦ ⟨x, hx, 1, by simp⟩) |
| 59 | + |
| 60 | +/-- The localization map of a submodule. -/ |
| 61 | +abbrev Submodule.toLocalized : M' →ₗ[R] M'.localized p := |
| 62 | + M'.toLocalized' (Localization p) p (LocalizedModule.mkLinearMap p M) |
| 63 | + |
| 64 | +instance Submodule.isLocalizedModule : IsLocalizedModule p (M'.toLocalized' S p f) where |
| 65 | + map_units x := by |
| 66 | + simp_rw [Module.End_isUnit_iff] |
| 67 | + constructor |
| 68 | + · exact fun _ _ e ↦ Subtype.ext |
| 69 | + (IsLocalizedModule.smul_injective f x (congr_arg Subtype.val e)) |
| 70 | + · rintro m |
| 71 | + use (IsLocalization.mk' S 1 x) • m |
| 72 | + rw [Module.algebraMap_end_apply, ← smul_assoc, IsLocalization.smul_mk'_one, |
| 73 | + IsLocalization.mk'_self', one_smul] |
| 74 | + surj' := by |
| 75 | + rintro ⟨y, x, hx, s, rfl⟩ |
| 76 | + exact ⟨⟨⟨x, hx⟩, s⟩, by ext; simp⟩ |
| 77 | + exists_of_eq e := by simpa [Subtype.ext_iff] using |
| 78 | + IsLocalizedModule.exists_of_eq (S := p) (f := f) (congr_arg Subtype.val e) |
| 79 | + |
| 80 | +/-- The localization map of a quotient module. -/ |
| 81 | +def Submodule.toLocalizedQuotient' : M ⧸ M' →ₗ[R] N ⧸ M'.localized' S p f := |
| 82 | + Submodule.mapQ M' ((M'.localized' S p f).restrictScalars R) f (fun x hx ↦ ⟨x, hx, 1, by simp⟩) |
| 83 | + |
| 84 | +/-- The localization map of a quotient module. -/ |
| 85 | +abbrev Submodule.toLocalizedQuotient : M ⧸ M' →ₗ[R] LocalizedModule p M ⧸ M'.localized p := |
| 86 | + M'.toLocalizedQuotient' (Localization p) p (LocalizedModule.mkLinearMap p M) |
| 87 | + |
| 88 | +@[simp] |
| 89 | +lemma Submodule.toLocalizedQuotient'_mk (x : M) : |
| 90 | + M'.toLocalizedQuotient' S p f (Submodule.Quotient.mk x) = Submodule.Quotient.mk (f x) := rfl |
| 91 | + |
| 92 | +open Submodule Submodule.Quotient IsLocalization in |
| 93 | +instance IsLocalizedModule.toLocalizedQuotient' (M' : Submodule R M) : |
| 94 | + IsLocalizedModule p (M'.toLocalizedQuotient' S p f) where |
| 95 | + map_units x := by |
| 96 | + refine (Module.End_isUnit_iff _).mpr ⟨fun m n e ↦ ?_, fun m ↦ ⟨(IsLocalization.mk' S 1 x) • m, |
| 97 | + by rw [Module.algebraMap_end_apply, ← smul_assoc, smul_mk'_one, mk'_self', one_smul]⟩⟩ |
| 98 | + obtain ⟨⟨m, rfl⟩, n, rfl⟩ := PProd.mk (mk_surjective _ m) (mk_surjective _ n) |
| 99 | + simp only [Module.algebraMap_end_apply, ← mk_smul, Submodule.Quotient.eq, ← smul_sub] at e |
| 100 | + replace e := Submodule.smul_mem _ (IsLocalization.mk' S 1 x) e |
| 101 | + rwa [smul_comm, ← smul_assoc, smul_mk'_one, mk'_self', one_smul, ← Submodule.Quotient.eq] at e |
| 102 | + surj' y := by |
| 103 | + obtain ⟨y, rfl⟩ := mk_surjective _ y |
| 104 | + obtain ⟨⟨y, s⟩, rfl⟩ := IsLocalizedModule.mk'_surjective p f y |
| 105 | + exact ⟨⟨Submodule.Quotient.mk y, s⟩, |
| 106 | + by simp only [Function.uncurry_apply_pair, toLocalizedQuotient'_mk, ← mk_smul, mk'_cancel']⟩ |
| 107 | + exists_of_eq {m n} e := by |
| 108 | + obtain ⟨⟨m, rfl⟩, n, rfl⟩ := PProd.mk (mk_surjective _ m) (mk_surjective _ n) |
| 109 | + obtain ⟨x, hx, s, hs⟩ : f (m - n) ∈ _ := by simpa [Submodule.Quotient.eq] using e |
| 110 | + obtain ⟨c, hc⟩ := exists_of_eq (S := p) (show f (s • (m - n)) = f x by simp [-map_sub, ← hs]) |
| 111 | + exact ⟨c * s, by simpa only [← Quotient.mk_smul, Submodule.Quotient.eq, |
| 112 | + ← smul_sub, mul_smul, hc] using M'.smul_mem c hx⟩ |
| 113 | + |
| 114 | +instance (M' : Submodule R M) : IsLocalizedModule p (M'.toLocalizedQuotient p) := |
| 115 | + IsLocalizedModule.toLocalizedQuotient' _ _ _ _ |
0 commit comments