Zulip Chat Archive

Stream: Is there code for X?

Topic: A lemma about localization


Kenny Lau (Jul 18 2025 at 14:09):

import Mathlib

universe u

variable (R : Type u) [CommRing R]
  (J : Type) [Fintype J] (elem : J  R) (span : Ideal.span (Set.range elem) = )
  (loc : J  Type u) [ j, CommRing (loc j)] [ j, Algebra R (loc j)]
    [ j, IsLocalization.Away (elem j) (loc j)]

-- now for each `j : J`, do the same thing:
variable (K : J  Type) [ k, Fintype (K k)]
  (elems :  j, K j  loc j) (spans :  j, Ideal.span (Set.range (elems j)) = )
  (locs :  j, K j  Type u) [ j k, CommRing (locs j k)] [ j k, Algebra (loc j) (locs j k)]
    [ j k, IsLocalization.Away (elems j k) (locs j k)]

include R J elem span loc K elems spans locs

theorem span_elems : Ideal.span (Set.range fun jk : (j : J) × K j 
    elem jk.fst * (IsLocalization.Away.sec (elem jk.fst) (elems jk.fst jk.snd)).1) =  :=
  sorry

instance (j : J) (k : K j) : IsLocalization.Away
    (elem j * (IsLocalization.Away.sec (elem j) (elems j k)).1)
    (RestrictScalars R (loc j) (locs j k)) :=
  sorry

Kenny Lau (Jul 18 2025 at 14:09):

Let (f1,,fn)=R(f_1, \cdots, f_n) = R, and then for each R[1/fi]R[1/f_i] we do the same thing, i.e. pick fijR[1/fi]f_{ij} \in R[1/f_i] such that (fi1,,fini)=R[1/fi](f_{i1}, \cdots, f_{in_i}) = R[1/f_i].

Then pick representatives fij=rij/fiaijf_{ij} = r_{ij}/f_i^{a_{ij}}, where rijRr_{ij} \in R. (that's the sec in the code)

Then I claim that firstly each new localization is a localization over RR, i.e. R[1/fi][1/fij]=R[1/(firij)]R[1/f_i][1/f_{ij}] = R[1/(f_i r_{ij})],

and secondly I claim that (firij)=R(f_i r_{ij}) = R.

Kenny Lau (Jul 18 2025 at 14:10):

Are these two lemmas (or any simpler form) in mathlib?

Kenny Lau (Jul 18 2025 at 14:11):

ok it seems like I can use IsLocalization.Away.mul' as a step

Kenny Lau (Jul 18 2025 at 14:12):

I need to first prove that R[1/fi][1/fij]=R[1/fi][1/rij]R[1/f_i][1/f_{ij}] = R[1/f_i][1/r_{ij}], and for that I need to show that "multiplying a unit" doesn't change the truth value of IsLocalization

Kenny Lau (Jul 18 2025 at 14:13):

ok I see that it is IsLocalization.Away.of_associated

Kenny Lau (Jul 18 2025 at 16:10):

Ok I now have a rather long proof of the two lemmas.

Kenny Lau (Jul 18 2025 at 16:23):

import Mathlib

universe u

variable {R : Type u} [CommRing R]
  {J : Type} [Fintype J] (elem : J  R) (span : Ideal.span (Set.range elem) = )
  (loc : J  Type u) [ j, CommRing (loc j)] [ j, Algebra R (loc j)]
    [ j, IsLocalization.Away (elem j) (loc j)]

-- now for each `j : J`, do the same thing:
variable {K : J  Type} [ k, Fintype (K k)]
  (elems :  j, K j  loc j) (spans :  j, Ideal.span (Set.range (elems j)) = )
  (locs :  j, K j  Type u) [ j k, CommRing (locs j k)] [ j k, Algebra (loc j) (locs j k)]
    [ j k, IsLocalization.Away (elems j k) (locs j k)]

-- scalar tower
variable [ j k, Algebra R (locs j k)] [ j k, IsScalarTower R (loc j) (locs j k)]

variable (j : J) (k : K j)

noncomputable def bindElem : R :=
  (IsLocalization.Away.sec (elem j) (elems j k)).1

lemma associated_bindElem :
    Associated (algebraMap R (loc j) (bindElem elem loc elems j k)) (elems j k) := by
  unfold bindElem
  rw [ IsLocalization.Away.sec_spec, map_pow]
  exact associated_mul_unit_left _ _ (.pow _ <| IsLocalization.Away.algebraMap_isUnit _)

instance foo : IsLocalization.Away (algebraMap R (loc j) (bindElem elem loc elems j k)) (locs j k) :=
  IsLocalization.Away.of_associated (associated_bindElem elem loc elems j k).symm

include spans in
theorem span_map_bindElem_eq_top :
    Ideal.span (Set.range (algebraMap R (loc j)  bindElem elem loc elems j)) =  := by
  rw [eq_top_iff,  spans, Ideal.span_le, Set.range_subset_iff]
  exact fun k  let u, hu := associated_bindElem elem loc elems j k
    hu  Ideal.mul_mem_right _ _ (Ideal.subset_span <| Set.mem_range_self _)

include spans in
theorem exists_pow_mem_span_bindElem :
     n : , elem j ^ n  Ideal.span (Set.range (bindElem elem loc elems j)) := by
  have := span_map_bindElem_eq_top elem loc elems spans j
  rw [Ideal.eq_top_iff_one, Set.range_comp,  Ideal.map_span,  map_one (algebraMap R (loc j)),
    IsLocalization.algebraMap_mem_map_algebraMap_iff (Submonoid.powers (elem j))] at this
  obtain ⟨_, n, rfl, hn := this
  exact n, by simpa using hn

include spans in
theorem exists_pow_mem_span_mul_bindElem :
     n : , elem j ^ n  Ideal.span (Set.range fun k : K j  elem j * bindElem elem loc elems j k) := by
  obtain n, hn := exists_pow_mem_span_bindElem elem loc elems spans j
  refine n + 1, ?_⟩
  rw [pow_succ']
  convert Ideal.mul_mem_mul (Ideal.mem_span_singleton_self _) hn
  rw [Ideal.span_mul_span', Set.singleton_mul,  Set.range_comp]
  rfl

include span spans in
theorem span_bindElem_eq_top :
    Ideal.span (Set.range fun jk : (j : J) × K j 
      elem jk.fst * bindElem elem loc elems jk.fst jk.snd) =  := by
  have (j : J) := exists_pow_mem_span_mul_bindElem elem loc elems spans j
  choose n hn using this
  rw [eq_top_iff,  Ideal.span_pow_eq_top _ span ( j : J, n j), Ideal.span_le,
     Set.range_comp, Set.range_subset_iff]
  refine fun j  Ideal.mem_of_dvd _ ?_ (Ideal.span_mono ?_ (hn j))
  · exact pow_dvd_pow _ (Finset.single_le_sum (fun _ _  Nat.zero_le _) (Finset.mem_univ _))
  · exact Set.range_subset_iff.2 fun k  ⟨⟨j, k, rfl

include span spans in
theorem span_elems : Ideal.span (Set.range fun jk : (j : J) × K j 
    elem jk.fst * (IsLocalization.Away.sec (elem jk.fst) (elems jk.fst jk.snd)).1) =  :=
  span_bindElem_eq_top elem span loc elems spans

instance (j : J) (k : K j) : IsLocalization.Away
    (elem j * (IsLocalization.Away.sec (elem j) (elems j k)).1)
    (locs j k) := by
  have := foo elem loc elems locs j k
  unfold bindElem at this
  exact IsLocalization.Away.mul' (loc j) _ _ _

Kenny Lau (Jul 18 2025 at 16:23):

Thanks to everyone who helped :duck:


Last updated: Dec 20 2025 at 21:32 UTC