Theorem: RingHom.isIntegralElem_localization_at_leadingCoeff
File: Mathlib/RingTheory/Localization/Integral.lean

tactic: by_cases triv : (1 : Rₘ) = 0
state_before: R✝ : Type ?u.131884
inst✝¹⁷ : CommRing R✝
M✝ : Submonoid R✝
S✝ : Type ?u.132091
inst✝¹⁶ : CommRing S✝
inst✝¹⁵ : Algebra R✝ S✝
P : Type ?u.132347
inst✝¹⁴ : CommRing P
Rₘ✝ : Type ?u.132353
Sₘ✝ : Type ?u.132356
inst✝¹³ : CommRing Rₘ✝
inst✝¹² : CommRing Sₘ✝
inst✝¹¹ : Algebra R✝ Rₘ✝
inst✝¹⁰ : IsLocalization M✝ Rₘ✝
inst✝⁹ : Algebra S✝ Sₘ✝
inst✝⁸ : IsLocalization (Algebra.algebraMapSubmonoid S✝ M✝) Sₘ✝
R : Type u_1
S : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
x : S
p : R[X]
hf : eval₂ f x p = 0
M : Submonoid R
hM : leadingCoeff p ∈ M
Rₘ : Type u_3
Sₘ : Type u_4
inst✝⁵ : CommRing Rₘ
inst✝⁴ : CommRing Sₘ
inst✝³ : Algebra R Rₘ
inst✝² : IsLocalization M Rₘ
inst✝¹ : Algebra S Sₘ
inst✝ : IsLocalization (Submonoid.map f M) Sₘ
⊢ IsIntegralElem (IsLocalization.map Sₘ f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))) (↑(algebraMap S Sₘ) x)

tactic: haveI : Nontrivial Rₘ := nontrivial_of_ne 1 0 triv
state_before: case neg
R✝ : Type ?u.131884
inst✝¹⁷ : CommRing R✝
M✝ : Submonoid R✝
S✝ : Type ?u.132091
inst✝¹⁶ : CommRing S✝
inst✝¹⁵ : Algebra R✝ S✝
P : Type ?u.132347
inst✝¹⁴ : CommRing P
Rₘ✝ : Type ?u.132353
Sₘ✝ : Type ?u.132356
inst✝¹³ : CommRing Rₘ✝
inst✝¹² : CommRing Sₘ✝
inst✝¹¹ : Algebra R✝ Rₘ✝
inst✝¹⁰ : IsLocalization M✝ Rₘ✝
inst✝⁹ : Algebra S✝ Sₘ✝
inst✝⁸ : IsLocalization (Algebra.algebraMapSubmonoid S✝ M✝) Sₘ✝
R : Type u_1
S : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
x : S
p : R[X]
hf : eval₂ f x p = 0
M : Submonoid R
hM : leadingCoeff p ∈ M
Rₘ : Type u_3
Sₘ : Type u_4
inst✝⁵ : CommRing Rₘ
inst✝⁴ : CommRing Sₘ
inst✝³ : Algebra R Rₘ
inst✝² : IsLocalization M Rₘ
inst✝¹ : Algebra S Sₘ
inst✝ : IsLocalization (Submonoid.map f M) Sₘ
triv : ¬1 = 0
⊢ IsIntegralElem (IsLocalization.map Sₘ f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))) (↑(algebraMap S Sₘ) x)

tactic: obtain ⟨b, hb⟩ := isUnit_iff_exists_inv.mp (map_units Rₘ ⟨p.leadingCoeff, hM⟩)
state_before: case neg
R✝ : Type ?u.131884
inst✝¹⁷ : CommRing R✝
M✝ : Submonoid R✝
S✝ : Type ?u.132091
inst✝¹⁶ : CommRing S✝
inst✝¹⁵ : Algebra R✝ S✝
P : Type ?u.132347
inst✝¹⁴ : CommRing P
Rₘ✝ : Type ?u.132353
Sₘ✝ : Type ?u.132356
inst✝¹³ : CommRing Rₘ✝
inst✝¹² : CommRing Sₘ✝
inst✝¹¹ : Algebra R✝ Rₘ✝
inst✝¹⁰ : IsLocalization M✝ Rₘ✝
inst✝⁹ : Algebra S✝ Sₘ✝
inst✝⁸ : IsLocalization (Algebra.algebraMapSubmonoid S✝ M✝) Sₘ✝
R : Type u_1
S : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
x : S
p : R[X]
hf : eval₂ f x p = 0
M : Submonoid R
hM : leadingCoeff p ∈ M
Rₘ : Type u_3
Sₘ : Type u_4
inst✝⁵ : CommRing Rₘ
inst✝⁴ : CommRing Sₘ
inst✝³ : Algebra R Rₘ
inst✝² : IsLocalization M Rₘ
inst✝¹ : Algebra S Sₘ
inst✝ : IsLocalization (Submonoid.map f M) Sₘ
triv : ¬1 = 0
this : Nontrivial Rₘ
⊢ IsIntegralElem (IsLocalization.map Sₘ f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))) (↑(algebraMap S Sₘ) x)

tactic: refine' ⟨p.map (algebraMap R Rₘ) * C b, ⟨_, _⟩⟩
state_before: case neg.intro
R✝ : Type ?u.131884
inst✝¹⁷ : CommRing R✝
M✝ : Submonoid R✝
S✝ : Type ?u.132091
inst✝¹⁶ : CommRing S✝
inst✝¹⁵ : Algebra R✝ S✝
P : Type ?u.132347
inst✝¹⁴ : CommRing P
Rₘ✝ : Type ?u.132353
Sₘ✝ : Type ?u.132356
inst✝¹³ : CommRing Rₘ✝
inst✝¹² : CommRing Sₘ✝
inst✝¹¹ : Algebra R✝ Rₘ✝
inst✝¹⁰ : IsLocalization M✝ Rₘ✝
inst✝⁹ : Algebra S✝ Sₘ✝
inst✝⁸ : IsLocalization (Algebra.algebraMapSubmonoid S✝ M✝) Sₘ✝
R : Type u_1
S : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
x : S
p : R[X]
hf : eval₂ f x p = 0
M : Submonoid R
hM : leadingCoeff p ∈ M
Rₘ : Type u_3
Sₘ : Type u_4
inst✝⁵ : CommRing Rₘ
inst✝⁴ : CommRing Sₘ
inst✝³ : Algebra R Rₘ
inst✝² : IsLocalization M Rₘ
inst✝¹ : Algebra S Sₘ
inst✝ : IsLocalization (Submonoid.map f M) Sₘ
triv : ¬1 = 0
this : Nontrivial Rₘ
b : Rₘ
hb : ↑(algebraMap R Rₘ) ↑{ val := leadingCoeff p, property := hM } * b = 1
⊢ IsIntegralElem (IsLocalization.map Sₘ f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))) (↑(algebraMap S Sₘ) x)

tactic: exact ⟨0, ⟨_root_.trans leadingCoeff_zero triv.symm, eval₂_zero _ _⟩⟩
state_before: case pos
R✝ : Type ?u.131884
inst✝¹⁷ : CommRing R✝
M✝ : Submonoid R✝
S✝ : Type ?u.132091
inst✝¹⁶ : CommRing S✝
inst✝¹⁵ : Algebra R✝ S✝
P : Type ?u.132347
inst✝¹⁴ : CommRing P
Rₘ✝ : Type ?u.132353
Sₘ✝ : Type ?u.132356
inst✝¹³ : CommRing Rₘ✝
inst✝¹² : CommRing Sₘ✝
inst✝¹¹ : Algebra R✝ Rₘ✝
inst✝¹⁰ : IsLocalization M✝ Rₘ✝
inst✝⁹ : Algebra S✝ Sₘ✝
inst✝⁸ : IsLocalization (Algebra.algebraMapSubmonoid S✝ M✝) Sₘ✝
R : Type u_1
S : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
x : S
p : R[X]
hf : eval₂ f x p = 0
M : Submonoid R
hM : leadingCoeff p ∈ M
Rₘ : Type u_3
Sₘ : Type u_4
inst✝⁵ : CommRing Rₘ
inst✝⁴ : CommRing Sₘ
inst✝³ : Algebra R Rₘ
inst✝² : IsLocalization M Rₘ
inst✝¹ : Algebra S Sₘ
inst✝ : IsLocalization (Submonoid.map f M) Sₘ
triv : 1 = 0
⊢ IsIntegralElem (IsLocalization.map Sₘ f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))) (↑(algebraMap S Sₘ) x)

tactic: refine' monic_mul_C_of_leadingCoeff_mul_eq_one _
state_before: case neg.intro.refine'_1
R✝ : Type ?u.131884
inst✝¹⁷ : CommRing R✝
M✝ : Submonoid R✝
S✝ : Type ?u.132091
inst✝¹⁶ : CommRing S✝
inst✝¹⁵ : Algebra R✝ S✝
P : Type ?u.132347
inst✝¹⁴ : CommRing P
Rₘ✝ : Type ?u.132353
Sₘ✝ : Type ?u.132356
inst✝¹³ : CommRing Rₘ✝
inst✝¹² : CommRing Sₘ✝
inst✝¹¹ : Algebra R✝ Rₘ✝
inst✝¹⁰ : IsLocalization M✝ Rₘ✝
inst✝⁹ : Algebra S✝ Sₘ✝
inst✝⁸ : IsLocalization (Algebra.algebraMapSubmonoid S✝ M✝) Sₘ✝
R : Type u_1
S : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
x : S
p : R[X]
hf : eval₂ f x p = 0
M : Submonoid R
hM : leadingCoeff p ∈ M
Rₘ : Type u_3
Sₘ : Type u_4
inst✝⁵ : CommRing Rₘ
inst✝⁴ : CommRing Sₘ
inst✝³ : Algebra R Rₘ
inst✝² : IsLocalization M Rₘ
inst✝¹ : Algebra S Sₘ
inst✝ : IsLocalization (Submonoid.map f M) Sₘ
triv : ¬1 = 0
this : Nontrivial Rₘ
b : Rₘ
hb : ↑(algebraMap R Rₘ) ↑{ val := leadingCoeff p, property := hM } * b = 1
⊢ Monic (Polynomial.map (algebraMap R Rₘ) p * ↑C b)

tactic: rwa [leadingCoeff_map_of_leadingCoeff_ne_zero (algebraMap R Rₘ)]
state_before: case neg.intro.refine'_1
R✝ : Type ?u.131884
inst✝¹⁷ : CommRing R✝
M✝ : Submonoid R✝
S✝ : Type ?u.132091
inst✝¹⁶ : CommRing S✝
inst✝¹⁵ : Algebra R✝ S✝
P : Type ?u.132347
inst✝¹⁴ : CommRing P
Rₘ✝ : Type ?u.132353
Sₘ✝ : Type ?u.132356
inst✝¹³ : CommRing Rₘ✝
inst✝¹² : CommRing Sₘ✝
inst✝¹¹ : Algebra R✝ Rₘ✝
inst✝¹⁰ : IsLocalization M✝ Rₘ✝
inst✝⁹ : Algebra S✝ Sₘ✝
inst✝⁸ : IsLocalization (Algebra.algebraMapSubmonoid S✝ M✝) Sₘ✝
R : Type u_1
S : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
x : S
p : R[X]
hf : eval₂ f x p = 0
M : Submonoid R
hM : leadingCoeff p ∈ M
Rₘ : Type u_3
Sₘ : Type u_4
inst✝⁵ : CommRing Rₘ
inst✝⁴ : CommRing Sₘ
inst✝³ : Algebra R Rₘ
inst✝² : IsLocalization M Rₘ
inst✝¹ : Algebra S Sₘ
inst✝ : IsLocalization (Submonoid.map f M) Sₘ
triv : ¬1 = 0
this : Nontrivial Rₘ
b : Rₘ
hb : ↑(algebraMap R Rₘ) ↑{ val := leadingCoeff p, property := hM } * b = 1
⊢ leadingCoeff (Polynomial.map (algebraMap R Rₘ) p) * b = 1

tactic: refine' fun hfp => zero_ne_one
  (_root_.trans (MulZeroClass.zero_mul b).symm (hfp ▸ hb) : (0 : Rₘ) = 1)
state_before: case neg.intro.refine'_1
R✝ : Type ?u.131884
inst✝¹⁷ : CommRing R✝
M✝ : Submonoid R✝
S✝ : Type ?u.132091
inst✝¹⁶ : CommRing S✝
inst✝¹⁵ : Algebra R✝ S✝
P : Type ?u.132347
inst✝¹⁴ : CommRing P
Rₘ✝ : Type ?u.132353
Sₘ✝ : Type ?u.132356
inst✝¹³ : CommRing Rₘ✝
inst✝¹² : CommRing Sₘ✝
inst✝¹¹ : Algebra R✝ Rₘ✝
inst✝¹⁰ : IsLocalization M✝ Rₘ✝
inst✝⁹ : Algebra S✝ Sₘ✝
inst✝⁸ : IsLocalization (Algebra.algebraMapSubmonoid S✝ M✝) Sₘ✝
R : Type u_1
S : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
x : S
p : R[X]
hf : eval₂ f x p = 0
M : Submonoid R
hM : leadingCoeff p ∈ M
Rₘ : Type u_3
Sₘ : Type u_4
inst✝⁵ : CommRing Rₘ
inst✝⁴ : CommRing Sₘ
inst✝³ : Algebra R Rₘ
inst✝² : IsLocalization M Rₘ
inst✝¹ : Algebra S Sₘ
inst✝ : IsLocalization (Submonoid.map f M) Sₘ
triv : ¬1 = 0
this : Nontrivial Rₘ
b : Rₘ
hb : ↑(algebraMap R Rₘ) ↑{ val := leadingCoeff p, property := hM } * b = 1
⊢ ↑(algebraMap R Rₘ) (leadingCoeff p) ≠ 0

tactic: refine' eval₂_mul_eq_zero_of_left _ _ _ _
state_before: case neg.intro.refine'_2
R✝ : Type ?u.131884
inst✝¹⁷ : CommRing R✝
M✝ : Submonoid R✝
S✝ : Type ?u.132091
inst✝¹⁶ : CommRing S✝
inst✝¹⁵ : Algebra R✝ S✝
P : Type ?u.132347
inst✝¹⁴ : CommRing P
Rₘ✝ : Type ?u.132353
Sₘ✝ : Type ?u.132356
inst✝¹³ : CommRing Rₘ✝
inst✝¹² : CommRing Sₘ✝
inst✝¹¹ : Algebra R✝ Rₘ✝
inst✝¹⁰ : IsLocalization M✝ Rₘ✝
inst✝⁹ : Algebra S✝ Sₘ✝
inst✝⁸ : IsLocalization (Algebra.algebraMapSubmonoid S✝ M✝) Sₘ✝
R : Type u_1
S : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
x : S
p : R[X]
hf : eval₂ f x p = 0
M : Submonoid R
hM : leadingCoeff p ∈ M
Rₘ : Type u_3
Sₘ : Type u_4
inst✝⁵ : CommRing Rₘ
inst✝⁴ : CommRing Sₘ
inst✝³ : Algebra R Rₘ
inst✝² : IsLocalization M Rₘ
inst✝¹ : Algebra S Sₘ
inst✝ : IsLocalization (Submonoid.map f M) Sₘ
triv : ¬1 = 0
this : Nontrivial Rₘ
b : Rₘ
hb : ↑(algebraMap R Rₘ) ↑{ val := leadingCoeff p, property := hM } * b = 1
⊢ eval₂ (IsLocalization.map Sₘ f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))) (↑(algebraMap S Sₘ) x)
      (Polynomial.map (algebraMap R Rₘ) p * ↑C b) =
    0

tactic: erw [eval₂_map, IsLocalization.map_comp, ← hom_eval₂ _ f (algebraMap S Sₘ) x]
state_before: case neg.intro.refine'_2
R✝ : Type ?u.131884
inst✝¹⁷ : CommRing R✝
M✝ : Submonoid R✝
S✝ : Type ?u.132091
inst✝¹⁶ : CommRing S✝
inst✝¹⁵ : Algebra R✝ S✝
P : Type ?u.132347
inst✝¹⁴ : CommRing P
Rₘ✝ : Type ?u.132353
Sₘ✝ : Type ?u.132356
inst✝¹³ : CommRing Rₘ✝
inst✝¹² : CommRing Sₘ✝
inst✝¹¹ : Algebra R✝ Rₘ✝
inst✝¹⁰ : IsLocalization M✝ Rₘ✝
inst✝⁹ : Algebra S✝ Sₘ✝
inst✝⁸ : IsLocalization (Algebra.algebraMapSubmonoid S✝ M✝) Sₘ✝
R : Type u_1
S : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
x : S
p : R[X]
hf : eval₂ f x p = 0
M : Submonoid R
hM : leadingCoeff p ∈ M
Rₘ : Type u_3
Sₘ : Type u_4
inst✝⁵ : CommRing Rₘ
inst✝⁴ : CommRing Sₘ
inst✝³ : Algebra R Rₘ
inst✝² : IsLocalization M Rₘ
inst✝¹ : Algebra S Sₘ
inst✝ : IsLocalization (Submonoid.map f M) Sₘ
triv : ¬1 = 0
this : Nontrivial Rₘ
b : Rₘ
hb : ↑(algebraMap R Rₘ) ↑{ val := leadingCoeff p, property := hM } * b = 1
⊢ eval₂ (IsLocalization.map Sₘ f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))) (↑(algebraMap S Sₘ) x)
      (Polynomial.map (algebraMap R Rₘ) p) =
    0

tactic: exact _root_.trans (congr_arg (algebraMap S Sₘ) hf) (RingHom.map_zero _)
state_before: case neg.intro.refine'_2
R✝ : Type ?u.131884
inst✝¹⁷ : CommRing R✝
M✝ : Submonoid R✝
S✝ : Type ?u.132091
inst✝¹⁶ : CommRing S✝
inst✝¹⁵ : Algebra R✝ S✝
P : Type ?u.132347
inst✝¹⁴ : CommRing P
Rₘ✝ : Type ?u.132353
Sₘ✝ : Type ?u.132356
inst✝¹³ : CommRing Rₘ✝
inst✝¹² : CommRing Sₘ✝
inst✝¹¹ : Algebra R✝ Rₘ✝
inst✝¹⁰ : IsLocalization M✝ Rₘ✝
inst✝⁹ : Algebra S✝ Sₘ✝
inst✝⁸ : IsLocalization (Algebra.algebraMapSubmonoid S✝ M✝) Sₘ✝
R : Type u_1
S : Type u_2
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
x : S
p : R[X]
hf : eval₂ f x p = 0
M : Submonoid R
hM : leadingCoeff p ∈ M
Rₘ : Type u_3
Sₘ : Type u_4
inst✝⁵ : CommRing Rₘ
inst✝⁴ : CommRing Sₘ
inst✝³ : Algebra R Rₘ
inst✝² : IsLocalization M Rₘ
inst✝¹ : Algebra S Sₘ
inst✝ : IsLocalization (Submonoid.map f M) Sₘ
triv : ¬1 = 0
this : Nontrivial Rₘ
b : Rₘ
hb : ↑(algebraMap R Rₘ) ↑{ val := leadingCoeff p, property := hM } * b = 1
⊢ ↑(algebraMap S Sₘ) (eval₂ f x p) = 0