@@ -10,6 +10,7 @@ import ring_theory.ideal.local_ring
10
10
import ring_theory.ideal.quotient
11
11
import ring_theory.integral_closure
12
12
import ring_theory.non_zero_divisors
13
+ import group_theory.submonoid.inverses
13
14
import tactic.ring_exp
14
15
15
16
/-!
@@ -743,6 +744,90 @@ end away
743
744
744
745
end away
745
746
747
+ section inv_submonoid
748
+
749
+ variables (M S)
750
+
751
+ /-- The submonoid of `S = M⁻¹R` consisting of `{ 1 / x | x ∈ M }`. -/
752
+ def inv_submonoid : submonoid S := (M.map (algebra_map R S : R →* S)).left_inv
753
+
754
+ variable [is_localization M S]
755
+
756
+ lemma submonoid_map_le_is_unit : M.map (algebra_map R S : R →* S) ≤ is_unit.submonoid S :=
757
+ by { rintros _ ⟨a, ha, rfl⟩, exact is_localization.map_units S ⟨_, ha⟩ }
758
+
759
+ /-- There is an equivalence of monoids between the image of `M` and `inv_submonoid`. -/
760
+ noncomputable
761
+ abbreviation equiv_inv_submonoid : M.map (algebra_map R S : R →* S) ≃* inv_submonoid M S :=
762
+ ((M.map (algebra_map R S : R →* S)).left_inv_equiv (submonoid_map_le_is_unit M S)).symm
763
+
764
+ /-- There is a canonical map from `M` to `inv_submonoid` sending `x` to `1 / x`. -/
765
+ noncomputable
766
+ def to_inv_submonoid : M →* inv_submonoid M S :=
767
+ (equiv_inv_submonoid M S).to_monoid_hom.comp ((algebra_map R S : R →* S).submonoid_map M)
768
+
769
+ lemma to_inv_submonoid_surjective : function.surjective (to_inv_submonoid M S) :=
770
+ function.surjective.comp (equiv.surjective _) (monoid_hom.submonoid_map_surjective _ _)
771
+
772
+ @[simp]
773
+ lemma to_inv_submonoid_mul (m : M) : (to_inv_submonoid M S m : S) * (algebra_map R S m) = 1 :=
774
+ submonoid.left_inv_equiv_symm_mul _ _ _
775
+
776
+ @[simp]
777
+ lemma mul_to_inv_submonoid (m : M) : (algebra_map R S m) * (to_inv_submonoid M S m : S) = 1 :=
778
+ submonoid.mul_left_inv_equiv_symm _ _ ⟨_, _⟩
779
+
780
+ @[simp]
781
+ lemma smul_to_inv_submonoid (m : M) : m • (to_inv_submonoid M S m : S) = 1 :=
782
+ by { convert mul_to_inv_submonoid M S m, rw ← algebra.smul_def, refl }
783
+
784
+ variables {S}
785
+
786
+ lemma surj' (z : S) : ∃ (r : R) (m : M), z = r • to_inv_submonoid M S m :=
787
+ begin
788
+ rcases is_localization.surj M z with ⟨⟨r, m⟩, e : z * _ = algebra_map R S r⟩,
789
+ refine ⟨r, m, _⟩,
790
+ rw [algebra.smul_def, ← e, mul_assoc],
791
+ simp,
792
+ end
793
+
794
+ lemma to_inv_submonoid_eq_mk' (x : M) :
795
+ (to_inv_submonoid M S x : S) = mk' S 1 x :=
796
+ by { rw ← (is_localization.map_units S x).mul_left_inj, simp }
797
+
798
+ lemma mem_inv_submonoid_iff_exists_mk' (x : S) :
799
+ x ∈ inv_submonoid M S ↔ ∃ m : M, mk' S 1 m = x :=
800
+ begin
801
+ simp_rw ← to_inv_submonoid_eq_mk',
802
+ exact ⟨λ h, ⟨_, congr_arg subtype.val (to_inv_submonoid_surjective M S ⟨x, h⟩).some_spec⟩,
803
+ λ h, h.some_spec ▸ (to_inv_submonoid M S h.some).prop⟩
804
+ end
805
+
806
+ variables (S)
807
+
808
+ lemma span_inv_submonoid : submodule.span R (inv_submonoid M S : set S) = ⊤ :=
809
+ begin
810
+ rw eq_top_iff,
811
+ rintros x -,
812
+ rcases is_localization.surj' M x with ⟨r, m, rfl⟩,
813
+ exact submodule.smul_mem _ _ (submodule.subset_span (to_inv_submonoid M S m).prop),
814
+ end
815
+
816
+ lemma finite_type_of_monoid_fg [monoid.fg M] : algebra.finite_type R S :=
817
+ begin
818
+ have := monoid.fg_of_surjective _ (to_inv_submonoid_surjective M S),
819
+ rw monoid.fg_iff_submonoid_fg at this ,
820
+ rcases this with ⟨s, hs⟩,
821
+ refine ⟨⟨s, _⟩⟩,
822
+ rw eq_top_iff,
823
+ rintro x -,
824
+ change x ∈ ((algebra.adjoin R _ : subalgebra R S).to_submodule : set S),
825
+ rw [algebra.adjoin_eq_span, hs, span_inv_submonoid],
826
+ trivial
827
+ end
828
+
829
+ end inv_submonoid
830
+
746
831
end is_localization
747
832
748
833
namespace localization
0 commit comments