Theorem: exists_integral_multiple
File: Mathlib/RingTheory/Algebraic.lean

Proof steps:
state_before: R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : Algebra R S
z : S
hz : IsAlgebraic R z
inj : ∀ (x : R), (algebraMap R S) x = 0 → x = 0
⊢ ∃ x y, y ≠ 0 ∧ z * (algebraMap R S) y = ↑x
state_after: case intro.intro
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : Algebra R S
z : S
inj : ∀ (x : R), (algebraMap R S) x = 0 → x = 0
p : R[X]
p_ne_zero : p ≠ 0
px : (aeval z) p = 0
⊢ ∃ x y, y ≠ 0 ∧ z * (algebraMap R S) y = ↑x
tactic: rcases hz with ⟨p, p_ne_zero, px⟩
state_before: case intro.intro
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : Algebra R S
z : S
inj : ∀ (x : R), (algebraMap R S) x = 0 → x = 0
p : R[X]
p_ne_zero : p ≠ 0
px : (aeval z) p = 0
⊢ ∃ x y, y ≠ 0 ∧ z * (algebraMap R S) y = ↑x
state_after: case intro.intro
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : Algebra R S
z : S
inj : ∀ (x : R), (algebraMap R S) x = 0 → x = 0
p : R[X]
p_ne_zero : p ≠ 0
px : (aeval z) p = 0
a : R := p.leadingCoeff
⊢ ∃ x y, y ≠ 0 ∧ z * (algebraMap R S) y = ↑x
tactic: set a := p.leadingCoeff
state_before: case intro.intro
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : Algebra R S
z : S
inj : ∀ (x : R), (algebraMap R S) x = 0 → x = 0
p : R[X]
p_ne_zero : p ≠ 0
px : (aeval z) p = 0
a : R := p.leadingCoeff
⊢ ∃ x y, y ≠ 0 ∧ z * (algebraMap R S) y = ↑x
state_after: case intro.intro
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : Algebra R S
z : S
inj : ∀ (x : R), (algebraMap R S) x = 0 → x = 0
p : R[X]
p_ne_zero : p ≠ 0
px : (aeval z) p = 0
a : R := p.leadingCoeff
a_ne_zero : a ≠ 0
⊢ ∃ x y, y ≠ 0 ∧ z * (algebraMap R S) y = ↑x
tactic: have a_ne_zero : a ≠ 0 := mt Polynomial.leadingCoeff_eq_zero.mp p_ne_zero
state_before: case intro.intro
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : Algebra R S
z : S
inj : ∀ (x : R), (algebraMap R S) x = 0 → x = 0
p : R[X]
p_ne_zero : p ≠ 0
px : (aeval z) p = 0
a : R := p.leadingCoeff
a_ne_zero : a ≠ 0
⊢ ∃ x y, y ≠ 0 ∧ z * (algebraMap R S) y = ↑x
state_after: case intro.intro
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : Algebra R S
z : S
inj : ∀ (x : R), (algebraMap R S) x = 0 → x = 0
p : R[X]
p_ne_zero : p ≠ 0
px : (aeval z) p = 0
a : R := p.leadingCoeff
a_ne_zero : a ≠ 0
x_integral : IsIntegral R (z * (algebraMap R S) a)
⊢ ∃ x y, y ≠ 0 ∧ z * (algebraMap R S) y = ↑x
tactic: have x_integral : IsIntegral R (z * algebraMap R S a) :=
    ⟨p.integralNormalization, monic_integralNormalization p_ne_zero,
      integralNormalization_aeval_eq_zero px inj⟩
state_before: case intro.intro
R : Type u_1
S : Type u_2
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : Algebra R S
z : S
inj : ∀ (x : R), (algebraMap R S) x = 0 → x = 0
p : R[X]
p_ne_zero : p ≠ 0
px : (aeval z) p = 0
a : R := p.leadingCoeff
a_ne_zero : a ≠ 0
x_integral : IsIntegral R (z * (algebraMap R S) a)
⊢ ∃ x y, y ≠ 0 ∧ z * (algebraMap R S) y = ↑x
state_after: no goals
tactic: exact ⟨⟨_, x_integral⟩, a, a_ne_zero, rfl⟩