Theorem: IsIntegralClosure.exists_smul_eq_mul
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
L : Type u_3
inst✝⁶ : Field L
inst✝⁵ : Algebra R S
inst✝⁴ : Algebra S L
inst✝³ : Algebra R L
inst✝² : IsScalarTower R S L
inst✝¹ : IsIntegralClosure S R L
inst✝ : Algebra.IsAlgebraic R L
inj : Function.Injective ⇑(algebraMap R L)
a b : S
hb : b ≠ 0
⊢ ∃ c d, d ≠ 0 ∧ d • a = b * c
state_after: case intro.intro.intro
R : Type u_1
S : Type u_2
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : CommRing S
L : Type u_3
inst✝⁶ : Field L
inst✝⁵ : Algebra R S
inst✝⁴ : Algebra S L
inst✝³ : Algebra R L
inst✝² : IsScalarTower R S L
inst✝¹ : IsIntegralClosure S R L
inst✝ : Algebra.IsAlgebraic R L
inj : Function.Injective ⇑(algebraMap R L)
a b : S
hb : b ≠ 0
c : ↥(integralClosure R L)
d : R
d_ne : d ≠ 0
hx : (algebraMap S L) a / (algebraMap S L) b * (algebraMap R L) d = ↑c
⊢ ∃ c d, d ≠ 0 ∧ d • a = b * c
tactic: obtain ⟨c, d, d_ne, hx⟩ :=
    exists_integral_multiple (Algebra.IsAlgebraic.isAlgebraic (algebraMap _ L a / algebraMap _ L b))
      ((injective_iff_map_eq_zero _).mp inj)
state_before: case intro.intro.intro
R : Type u_1
S : Type u_2
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : CommRing S
L : Type u_3
inst✝⁶ : Field L
inst✝⁵ : Algebra R S
inst✝⁴ : Algebra S L
inst✝³ : Algebra R L
inst✝² : IsScalarTower R S L
inst✝¹ : IsIntegralClosure S R L
inst✝ : Algebra.IsAlgebraic R L
inj : Function.Injective ⇑(algebraMap R L)
a b : S
hb : b ≠ 0
c : ↥(integralClosure R L)
d : R
d_ne : d ≠ 0
hx : (algebraMap S L) a / (algebraMap S L) b * (algebraMap R L) d = ↑c
⊢ ∃ c d, d ≠ 0 ∧ d • a = b * c
state_after: case intro.intro.intro
R : Type u_1
S : Type u_2
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : CommRing S
L : Type u_3
inst✝⁶ : Field L
inst✝⁵ : Algebra R S
inst✝⁴ : Algebra S L
inst✝³ : Algebra R L
inst✝² : IsScalarTower R S L
inst✝¹ : IsIntegralClosure S R L
inst✝ : Algebra.IsAlgebraic R L
inj : Function.Injective ⇑(algebraMap R L)
a b : S
hb : b ≠ 0
c : ↥(integralClosure R L)
d : R
d_ne : d ≠ 0
hx : (algebraMap S L) a / (algebraMap S L) b * (algebraMap R L) d = ↑c
⊢ (algebraMap S L) (d • a) = (algebraMap S L) (b * mk' S ↑c ⋯)
tactic: refine
    ⟨IsIntegralClosure.mk' S (c : L) c.2, d, d_ne, IsIntegralClosure.algebraMap_injective S R L ?_⟩
state_before: case intro.intro.intro
R : Type u_1
S : Type u_2
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : CommRing S
L : Type u_3
inst✝⁶ : Field L
inst✝⁵ : Algebra R S
inst✝⁴ : Algebra S L
inst✝³ : Algebra R L
inst✝² : IsScalarTower R S L
inst✝¹ : IsIntegralClosure S R L
inst✝ : Algebra.IsAlgebraic R L
inj : Function.Injective ⇑(algebraMap R L)
a b : S
hb : b ≠ 0
c : ↥(integralClosure R L)
d : R
d_ne : d ≠ 0
hx : (algebraMap S L) a / (algebraMap S L) b * (algebraMap R L) d = ↑c
⊢ (algebraMap S L) (d • a) = (algebraMap S L) (b * mk' S ↑c ⋯)
state_after: case intro.intro.intro
R : Type u_1
S : Type u_2
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : CommRing S
L : Type u_3
inst✝⁶ : Field L
inst✝⁵ : Algebra R S
inst✝⁴ : Algebra S L
inst✝³ : Algebra R L
inst✝² : IsScalarTower R S L
inst✝¹ : IsIntegralClosure S R L
inst✝ : Algebra.IsAlgebraic R L
inj : Function.Injective ⇑(algebraMap R L)
a b : S
hb : b ≠ 0
c : ↥(integralClosure R L)
d : R
d_ne : d ≠ 0
hx : (algebraMap S L) a / (algebraMap S L) b * (algebraMap R L) d = ↑c
⊢ (algebraMap R L) d * (algebraMap S L) a =
    (algebraMap S L) b * ((algebraMap S L) a / (algebraMap S L) b * (algebraMap R L) d)
tactic: simp only [Algebra.smul_def, RingHom.map_mul, IsIntegralClosure.algebraMap_mk', ← hx, ←
    IsScalarTower.algebraMap_apply]
state_before: case intro.intro.intro
R : Type u_1
S : Type u_2
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : CommRing S
L : Type u_3
inst✝⁶ : Field L
inst✝⁵ : Algebra R S
inst✝⁴ : Algebra S L
inst✝³ : Algebra R L
inst✝² : IsScalarTower R S L
inst✝¹ : IsIntegralClosure S R L
inst✝ : Algebra.IsAlgebraic R L
inj : Function.Injective ⇑(algebraMap R L)
a b : S
hb : b ≠ 0
c : ↥(integralClosure R L)
d : R
d_ne : d ≠ 0
hx : (algebraMap S L) a / (algebraMap S L) b * (algebraMap R L) d = ↑c
⊢ (algebraMap R L) d * (algebraMap S L) a =
    (algebraMap S L) b * ((algebraMap S L) a / (algebraMap S L) b * (algebraMap R L) d)
state_after: case intro.intro.intro
R : Type u_1
S : Type u_2
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : CommRing S
L : Type u_3
inst✝⁶ : Field L
inst✝⁵ : Algebra R S
inst✝⁴ : Algebra S L
inst✝³ : Algebra R L
inst✝² : IsScalarTower R S L
inst✝¹ : IsIntegralClosure S R L
inst✝ : Algebra.IsAlgebraic R L
inj : Function.Injective ⇑(algebraMap R L)
a b : S
hb : b ≠ 0
c : ↥(integralClosure R L)
d : R
d_ne : d ≠ 0
hx : (algebraMap S L) a / (algebraMap S L) b * (algebraMap R L) d = ↑c
⊢ (algebraMap S L) b ≠ 0
tactic: rw [← mul_assoc _ (_ / _), mul_div_cancel₀ (algebraMap S L a), mul_comm]
state_before: case intro.intro.intro
R : Type u_1
S : Type u_2
inst✝⁹ : CommRing R
inst✝⁸ : IsDomain R
inst✝⁷ : CommRing S
L : Type u_3
inst✝⁶ : Field L
inst✝⁵ : Algebra R S
inst✝⁴ : Algebra S L
inst✝³ : Algebra R L
inst✝² : IsScalarTower R S L
inst✝¹ : IsIntegralClosure S R L
inst✝ : Algebra.IsAlgebraic R L
inj : Function.Injective ⇑(algebraMap R L)
a b : S
hb : b ≠ 0
c : ↥(integralClosure R L)
d : R
d_ne : d ≠ 0
hx : (algebraMap S L) a / (algebraMap S L) b * (algebraMap R L) d = ↑c
⊢ (algebraMap S L) b ≠ 0
state_after: no goals
tactic: exact mt ((injective_iff_map_eq_zero _).mp (IsIntegralClosure.algebraMap_injective S R L) _) hb