Theorem: IsFractionRing.isAlgebraic_iff'
File: Mathlib/RingTheory/Localization/Integral.lean

tactic: simp only [Algebra.IsAlgebraic]
state_before: R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
⊢ Algebra.IsAlgebraic R S ↔ Algebra.IsAlgebraic R K

tactic: constructor
state_before: R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
⊢ (∀ (x : S), IsAlgebraic R x) ↔ ∀ (x : K), IsAlgebraic R x

tactic: intro h x
state_before: case mp
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
⊢ (∀ (x : S), IsAlgebraic R x) → ∀ (x : K), IsAlgebraic R x

tactic: rw [IsFractionRing.isAlgebraic_iff R (FractionRing R) K, isAlgebraic_iff_isIntegral]
state_before: case mp
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : S), IsAlgebraic R x
x : K
⊢ IsAlgebraic R x

tactic: obtain ⟨a : S, b, ha, rfl⟩ := @div_surjective S _ _ _ _ _ _ x
state_before: case mp
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : S), IsAlgebraic R x
x : K
⊢ IsIntegral (FractionRing R) x

tactic: obtain ⟨f, hf₁, hf₂⟩ := h b
state_before: case mp.intro.intro.intro
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : S), IsAlgebraic R x
a b : S
ha : b ∈ nonZeroDivisors S
⊢ IsIntegral (FractionRing R) (↑(algebraMap S K) a / ↑(algebraMap S K) b)

tactic: rw [div_eq_mul_inv]
state_before: case mp.intro.intro.intro.intro.intro
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : S), IsAlgebraic R x
a b : S
ha : b ∈ nonZeroDivisors S
f : R[X]
hf₁ : f ≠ 0
hf₂ : ↑(aeval b) f = 0
⊢ IsIntegral (FractionRing R) (↑(algebraMap S K) a / ↑(algebraMap S K) b)

tactic: refine' isIntegral_mul _ _
state_before: case mp.intro.intro.intro.intro.intro
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : S), IsAlgebraic R x
a b : S
ha : b ∈ nonZeroDivisors S
f : R[X]
hf₁ : f ≠ 0
hf₂ : ↑(aeval b) f = 0
⊢ IsIntegral (FractionRing R) (↑(algebraMap S K) a * (↑(algebraMap S K) b)⁻¹)

tactic: rw [← isAlgebraic_iff_isIntegral]
state_before: case mp.intro.intro.intro.intro.intro.refine'_1
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : S), IsAlgebraic R x
a b : S
ha : b ∈ nonZeroDivisors S
f : R[X]
hf₁ : f ≠ 0
hf₂ : ↑(aeval b) f = 0
⊢ IsIntegral (FractionRing R) (↑(algebraMap S K) a)

tactic: refine'
  _root_.isAlgebraic_of_larger_base_of_injective
    (NoZeroSMulDivisors.algebraMap_injective R (FractionRing R)) _
state_before: case mp.intro.intro.intro.intro.intro.refine'_1
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : S), IsAlgebraic R x
a b : S
ha : b ∈ nonZeroDivisors S
f : R[X]
hf₁ : f ≠ 0
hf₂ : ↑(aeval b) f = 0
⊢ IsAlgebraic (FractionRing R) (↑(algebraMap S K) a)

tactic: exact isAlgebraic_algebraMap_of_isAlgebraic (h a)
state_before: case mp.intro.intro.intro.intro.intro.refine'_1
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : S), IsAlgebraic R x
a b : S
ha : b ∈ nonZeroDivisors S
f : R[X]
hf₁ : f ≠ 0
hf₂ : ↑(aeval b) f = 0
⊢ IsAlgebraic R (↑(algebraMap S K) a)

tactic: rw [← isAlgebraic_iff_isIntegral]
state_before: case mp.intro.intro.intro.intro.intro.refine'_2
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : S), IsAlgebraic R x
a b : S
ha : b ∈ nonZeroDivisors S
f : R[X]
hf₁ : f ≠ 0
hf₂ : ↑(aeval b) f = 0
⊢ IsIntegral (FractionRing R) (↑(algebraMap S K) b)⁻¹

tactic: use (f.map (algebraMap R (FractionRing R))).reverse
state_before: case mp.intro.intro.intro.intro.intro.refine'_2
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : S), IsAlgebraic R x
a b : S
ha : b ∈ nonZeroDivisors S
f : R[X]
hf₁ : f ≠ 0
hf₂ : ↑(aeval b) f = 0
⊢ IsAlgebraic (FractionRing R) (↑(algebraMap S K) b)⁻¹

tactic: constructor
state_before: case mp.intro.intro.intro.intro.intro.refine'_2
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : S), IsAlgebraic R x
a b : S
ha : b ∈ nonZeroDivisors S
f : R[X]
hf₁ : f ≠ 0
hf₂ : ↑(aeval b) f = 0
⊢ reverse (Polynomial.map (algebraMap R (FractionRing R)) f) ≠ 0 ∧
    ↑(aeval (↑(algebraMap S K) b)⁻¹) (reverse (Polynomial.map (algebraMap R (FractionRing R)) f)) = 0

tactic: rwa [Ne.def, Polynomial.reverse_eq_zero, ← Polynomial.degree_eq_bot,
  Polynomial.degree_map_eq_of_injective
    (NoZeroSMulDivisors.algebraMap_injective R (FractionRing R)),
  Polynomial.degree_eq_bot]
state_before: case mp.intro.intro.intro.intro.intro.refine'_2.left
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : S), IsAlgebraic R x
a b : S
ha : b ∈ nonZeroDivisors S
f : R[X]
hf₁ : f ≠ 0
hf₂ : ↑(aeval b) f = 0
⊢ reverse (Polynomial.map (algebraMap R (FractionRing R)) f) ≠ 0

tactic: have : Invertible (algebraMap S K b) :=
  IsUnit.invertible
    (isUnit_of_mem_nonZeroDivisors
      (mem_nonZeroDivisors_iff_ne_zero.2 fun h =>
        nonZeroDivisors.ne_zero ha
          ((injective_iff_map_eq_zero (algebraMap S K)).1
            (NoZeroSMulDivisors.algebraMap_injective _ _) b h)))
state_before: case mp.intro.intro.intro.intro.intro.refine'_2.right
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : S), IsAlgebraic R x
a b : S
ha : b ∈ nonZeroDivisors S
f : R[X]
hf₁ : f ≠ 0
hf₂ : ↑(aeval b) f = 0
⊢ ↑(aeval (↑(algebraMap S K) b)⁻¹) (reverse (Polynomial.map (algebraMap R (FractionRing R)) f)) = 0

tactic: rw [Polynomial.aeval_def, ← invOf_eq_inv, Polynomial.eval₂_reverse_eq_zero_iff,
  Polynomial.eval₂_map, ← IsScalarTower.algebraMap_eq, ← Polynomial.aeval_def,
  Polynomial.aeval_algebraMap_apply, hf₂, RingHom.map_zero]
state_before: case mp.intro.intro.intro.intro.intro.refine'_2.right
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : S), IsAlgebraic R x
a b : S
ha : b ∈ nonZeroDivisors S
f : R[X]
hf₁ : f ≠ 0
hf₂ : ↑(aeval b) f = 0
this : Invertible (↑(algebraMap S K) b)
⊢ ↑(aeval (↑(algebraMap S K) b)⁻¹) (reverse (Polynomial.map (algebraMap R (FractionRing R)) f)) = 0

tactic: intro h x
state_before: case mpr
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
⊢ (∀ (x : K), IsAlgebraic R x) → ∀ (x : S), IsAlgebraic R x

tactic: obtain ⟨f, hf₁, hf₂⟩ := h (algebraMap S K x)
state_before: case mpr
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : K), IsAlgebraic R x
x : S
⊢ IsAlgebraic R x

tactic: use f, hf₁
state_before: case mpr.intro.intro
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : K), IsAlgebraic R x
x : S
f : R[X]
hf₁ : f ≠ 0
hf₂ : ↑(aeval (↑(algebraMap S K) x)) f = 0
⊢ IsAlgebraic R x

tactic: rw [Polynomial.aeval_algebraMap_apply] at hf₂
state_before: case mpr.intro.intro
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : K), IsAlgebraic R x
x : S
f : R[X]
hf₁ : f ≠ 0
hf₂ : ↑(aeval (↑(algebraMap S K) x)) f = 0
⊢ ↑(aeval x) f = 0

tactic: exact
  (injective_iff_map_eq_zero (algebraMap S K)).1 (NoZeroSMulDivisors.algebraMap_injective _ _) _
    hf₂
state_before: case mpr.intro.intro
R : Type u_2
inst✝¹³ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹² : CommRing S
inst✝¹¹ : Algebra R S
P : Type ?u.599719
inst✝¹⁰ : CommRing P
A : Type ?u.599725
K : Type u_1
inst✝⁹ : CommRing A
inst✝⁸ : IsDomain A
inst✝⁷ : Field K
inst✝⁶ : IsDomain R
inst✝⁵ : IsDomain S
inst✝⁴ : Algebra R K
inst✝³ : Algebra S K
inst✝² : NoZeroSMulDivisors R K
inst✝¹ : IsFractionRing S K
inst✝ : IsScalarTower R S K
h : ∀ (x : K), IsAlgebraic R x
x : S
f : R[X]
hf₁ : f ≠ 0
hf₂ : ↑(algebraMap S K) (↑(aeval x) f) = 0
⊢ ↑(aeval x) f = 0