Theorem: isField_of_isIntegral_of_isField
File: Mathlib/RingTheory/IntegralClosure.lean

tactic: have := hS.nontrivial
state_before: R✝ : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type u_4
T : Type u_5
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : Ring B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_6
S : Type u_7
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : Algebra R S
inst✝ : Algebra.IsIntegral R S
hRS : Function.Injective ⇑(algebraMap R S)
hS : IsField S
⊢ IsField R
state_after: R✝ : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type u_4
T : Type u_5
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : Ring B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_6
S : Type u_7
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : Algebra R S
inst✝ : Algebra.IsIntegral R S
hRS : Function.Injective ⇑(algebraMap R S)
hS : IsField S
this : Nontrivial S
⊢ IsField R

tactic: have := Module.nontrivial R S
state_before: R✝ : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type u_4
T : Type u_5
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : Ring B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_6
S : Type u_7
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : Algebra R S
inst✝ : Algebra.IsIntegral R S
hRS : Function.Injective ⇑(algebraMap R S)
hS : IsField S
this : Nontrivial S
⊢ IsField R
state_after: R✝ : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type u_4
T : Type u_5
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : Ring B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_6
S : Type u_7
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : Algebra R S
inst✝ : Algebra.IsIntegral R S
hRS : Function.Injective ⇑(algebraMap R S)
hS : IsField S
this✝ : Nontrivial S
this : Nontrivial R
⊢ IsField R

tactic: refine ⟨⟨0, 1, zero_ne_one⟩, mul_comm, fun {a} ha ↦ ?_⟩
state_before: R✝ : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type u_4
T : Type u_5
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : Ring B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_6
S : Type u_7
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : Algebra R S
inst✝ : Algebra.IsIntegral R S
hRS : Function.Injective ⇑(algebraMap R S)
hS : IsField S
this✝ : Nontrivial S
this : Nontrivial R
⊢ IsField R
state_after: R✝ : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type u_4
T : Type u_5
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : Ring B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_6
S : Type u_7
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : Algebra R S
inst✝ : Algebra.IsIntegral R S
hRS : Function.Injective ⇑(algebraMap R S)
hS : IsField S
this✝ : Nontrivial S
this : Nontrivial R
a : R
ha : a ≠ 0
⊢ ∃ b, a * b = 1

tactic: obtain ⟨a_inv, ha_inv⟩ := hS.mul_inv_cancel fun h ↦ ha (hRS (h.trans (RingHom.map_zero _).symm))
state_before: R✝ : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type u_4
T : Type u_5
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : Ring B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_6
S : Type u_7
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : Algebra R S
inst✝ : Algebra.IsIntegral R S
hRS : Function.Injective ⇑(algebraMap R S)
hS : IsField S
this✝ : Nontrivial S
this : Nontrivial R
a : R
ha : a ≠ 0
⊢ ∃ b, a * b = 1
state_after: case intro
R✝ : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type u_4
T : Type u_5
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : Ring B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_6
S : Type u_7
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : Algebra R S
inst✝ : Algebra.IsIntegral R S
hRS : Function.Injective ⇑(algebraMap R S)
hS : IsField S
this✝ : Nontrivial S
this : Nontrivial R
a : R
ha : a ≠ 0
a_inv : S
ha_inv : (algebraMap R S) a * a_inv = 1
⊢ ∃ b, a * b = 1

tactic: letI : Invertible a_inv := (Units.mkOfMulEqOne a_inv _ <| mul_comm _ a_inv ▸ ha_inv).invertible
state_before: case intro
R✝ : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type u_4
T : Type u_5
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : Ring B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_6
S : Type u_7
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : Algebra R S
inst✝ : Algebra.IsIntegral R S
hRS : Function.Injective ⇑(algebraMap R S)
hS : IsField S
this✝ : Nontrivial S
this : Nontrivial R
a : R
ha : a ≠ 0
a_inv : S
ha_inv : (algebraMap R S) a * a_inv = 1
⊢ ∃ b, a * b = 1
state_after: case intro
R✝ : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type u_4
T : Type u_5
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : Ring B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_6
S : Type u_7
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : Algebra R S
inst✝ : Algebra.IsIntegral R S
hRS : Function.Injective ⇑(algebraMap R S)
hS : IsField S
this✝¹ : Nontrivial S
this✝ : Nontrivial R
a : R
ha : a ≠ 0
a_inv : S
ha_inv : (algebraMap R S) a * a_inv = 1
this : Invertible a_inv := (Units.mkOfMulEqOne a_inv ((algebraMap R S) a) ⋯).invertible
⊢ ∃ b, a * b = 1

tactic: obtain ⟨p, p_monic, hp⟩ := Algebra.IsIntegral.isIntegral (R := R) a_inv
state_before: case intro
R✝ : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type u_4
T : Type u_5
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : Ring B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_6
S : Type u_7
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : Algebra R S
inst✝ : Algebra.IsIntegral R S
hRS : Function.Injective ⇑(algebraMap R S)
hS : IsField S
this✝¹ : Nontrivial S
this✝ : Nontrivial R
a : R
ha : a ≠ 0
a_inv : S
ha_inv : (algebraMap R S) a * a_inv = 1
this : Invertible a_inv := (Units.mkOfMulEqOne a_inv ((algebraMap R S) a) ⋯).invertible
⊢ ∃ b, a * b = 1
state_after: case intro.intro.intro
R✝ : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type u_4
T : Type u_5
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : Ring B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_6
S : Type u_7
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : Algebra R S
inst✝ : Algebra.IsIntegral R S
hRS : Function.Injective ⇑(algebraMap R S)
hS : IsField S
this✝¹ : Nontrivial S
this✝ : Nontrivial R
a : R
ha : a ≠ 0
a_inv : S
ha_inv : (algebraMap R S) a * a_inv = 1
this : Invertible a_inv := (Units.mkOfMulEqOne a_inv ((algebraMap R S) a) ⋯).invertible
p : R[X]
p_monic : p.Monic
hp : eval₂ (algebraMap R S) a_inv p = 0
⊢ ∃ b, a * b = 1

tactic: use -p.reverse.divX.eval a
state_before: case intro.intro.intro
R✝ : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type u_4
T : Type u_5
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : Ring B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_6
S : Type u_7
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : Algebra R S
inst✝ : Algebra.IsIntegral R S
hRS : Function.Injective ⇑(algebraMap R S)
hS : IsField S
this✝¹ : Nontrivial S
this✝ : Nontrivial R
a : R
ha : a ≠ 0
a_inv : S
ha_inv : (algebraMap R S) a * a_inv = 1
this : Invertible a_inv := (Units.mkOfMulEqOne a_inv ((algebraMap R S) a) ⋯).invertible
p : R[X]
p_monic : p.Monic
hp : eval₂ (algebraMap R S) a_inv p = 0
⊢ ∃ b, a * b = 1
state_after: case h
R✝ : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type u_4
T : Type u_5
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : Ring B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_6
S : Type u_7
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : Algebra R S
inst✝ : Algebra.IsIntegral R S
hRS : Function.Injective ⇑(algebraMap R S)
hS : IsField S
this✝¹ : Nontrivial S
this✝ : Nontrivial R
a : R
ha : a ≠ 0
a_inv : S
ha_inv : (algebraMap R S) a * a_inv = 1
this : Invertible a_inv := (Units.mkOfMulEqOne a_inv ((algebraMap R S) a) ⋯).invertible
p : R[X]
p_monic : p.Monic
hp : eval₂ (algebraMap R S) a_inv p = 0
⊢ a * -eval a p.reverse.divX = 1

tactic: nth_rewrite 1 [mul_neg, ← eval_X (x := a), ← eval_mul, ← p_monic, ← coeff_zero_reverse,
  ← add_eq_zero_iff_neg_eq, ← eval_C (a := p.reverse.coeff 0), ← eval_add, X_mul_divX_add,
  ← (injective_iff_map_eq_zero' _).mp hRS, ← aeval_algebraMap_apply_eq_algebraMap_eval]
state_before: case h
R✝ : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type u_4
T : Type u_5
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : Ring B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_6
S : Type u_7
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : Algebra R S
inst✝ : Algebra.IsIntegral R S
hRS : Function.Injective ⇑(algebraMap R S)
hS : IsField S
this✝¹ : Nontrivial S
this✝ : Nontrivial R
a : R
ha : a ≠ 0
a_inv : S
ha_inv : (algebraMap R S) a * a_inv = 1
this : Invertible a_inv := (Units.mkOfMulEqOne a_inv ((algebraMap R S) a) ⋯).invertible
p : R[X]
p_monic : p.Monic
hp : eval₂ (algebraMap R S) a_inv p = 0
⊢ a * -eval a p.reverse.divX = 1
state_after: case h
R✝ : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type u_4
T : Type u_5
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : Ring B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_6
S : Type u_7
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : Algebra R S
inst✝ : Algebra.IsIntegral R S
hRS : Function.Injective ⇑(algebraMap R S)
hS : IsField S
this✝¹ : Nontrivial S
this✝ : Nontrivial R
a : R
ha : a ≠ 0
a_inv : S
ha_inv : (algebraMap R S) a * a_inv = 1
this : Invertible a_inv := (Units.mkOfMulEqOne a_inv ((algebraMap R S) a) ⋯).invertible
p : R[X]
p_monic : p.Monic
hp : eval₂ (algebraMap R S) a_inv p = 0
⊢ (aeval ((algebraMap R S) a)) p.reverse = 0

tactic: rwa [← eval₂_reverse_eq_zero_iff] at hp
state_before: case h
R✝ : Type u_1
A : Type u_2
B : Type u_3
S✝ : Type u_4
T : Type u_5
inst✝¹² : CommRing R✝
inst✝¹¹ : CommRing A
inst✝¹⁰ : Ring B
inst✝⁹ : CommRing S✝
inst✝⁸ : CommRing T
inst✝⁷ : Algebra A B
inst✝⁶ : Algebra R✝ B
f : R✝ →+* S✝
g : S✝ →+* T
inst✝⁵ : Algebra R✝ A
inst✝⁴ : IsScalarTower R✝ A B
R : Type u_6
S : Type u_7
inst✝³ : CommRing R
inst✝² : CommRing S
inst✝¹ : Algebra R S
inst✝ : Algebra.IsIntegral R S
hRS : Function.Injective ⇑(algebraMap R S)
hS : IsField S
this✝¹ : Nontrivial S
this✝ : Nontrivial R
a : R
ha : a ≠ 0
a_inv : S
ha_inv : (algebraMap R S) a * a_inv = 1
this : Invertible a_inv := (Units.mkOfMulEqOne a_inv ((algebraMap R S) a) ⋯).invertible
p : R[X]
p_monic : p.Monic
hp : eval₂ (algebraMap R S) a_inv p = 0
⊢ (aeval ((algebraMap R S) a)) p.reverse = 0
state_after: no goals