Theorem: Algebra.IsAlgebraic.algHom_bijective
File: Mathlib/RingTheory/Algebraic.lean

tactic: refine' ⟨f.toRingHom.injective, fun b => _⟩
state_before: K : Type u_1
L : Type u_2
R : Type ?u.339073
S : Type ?u.339076
A : Type ?u.339079
inst✝¹² : Field K
inst✝¹¹ : Field L
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : CommRing A
inst✝⁷ : Algebra K L
inst✝⁶ : Algebra L A
inst✝⁵ : Algebra K A
inst✝⁴ : IsScalarTower K L A
inst✝³ : Algebra R S
inst✝² : Algebra S A
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R S A
ha : IsAlgebraic K L
f : L →ₐ[K] L
⊢ Function.Bijective ↑f

tactic: obtain ⟨p, hp, he⟩ := ha b
state_before: K : Type u_1
L : Type u_2
R : Type ?u.339073
S : Type ?u.339076
A : Type ?u.339079
inst✝¹² : Field K
inst✝¹¹ : Field L
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : CommRing A
inst✝⁷ : Algebra K L
inst✝⁶ : Algebra L A
inst✝⁵ : Algebra K A
inst✝⁴ : IsScalarTower K L A
inst✝³ : Algebra R S
inst✝² : Algebra S A
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R S A
ha : IsAlgebraic K L
f : L →ₐ[K] L
b : L
⊢ ∃ a, ↑f a = b

tactic: let f' : p.rootSet L → p.rootSet L := (rootSet_maps_to' (fun x => x) f).restrict f _ _
state_before: case intro.intro
K : Type u_1
L : Type u_2
R : Type ?u.339073
S : Type ?u.339076
A : Type ?u.339079
inst✝¹² : Field K
inst✝¹¹ : Field L
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : CommRing A
inst✝⁷ : Algebra K L
inst✝⁶ : Algebra L A
inst✝⁵ : Algebra K A
inst✝⁴ : IsScalarTower K L A
inst✝³ : Algebra R S
inst✝² : Algebra S A
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R S A
ha : IsAlgebraic K L
f : L →ₐ[K] L
b : L
p : K[X]
hp : p ≠ 0
he : ↑(aeval b) p = 0
⊢ ∃ a, ↑f a = b

tactic: have : Function.Surjective f' :=
  Finite.injective_iff_surjective.1 fun _ _ h =>
    Subtype.eq <| f.toRingHom.injective <| Subtype.ext_iff.1 h
state_before: case intro.intro
K : Type u_1
L : Type u_2
R : Type ?u.339073
S : Type ?u.339076
A : Type ?u.339079
inst✝¹² : Field K
inst✝¹¹ : Field L
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : CommRing A
inst✝⁷ : Algebra K L
inst✝⁶ : Algebra L A
inst✝⁵ : Algebra K A
inst✝⁴ : IsScalarTower K L A
inst✝³ : Algebra R S
inst✝² : Algebra S A
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R S A
ha : IsAlgebraic K L
f : L →ₐ[K] L
b : L
p : K[X]
hp : p ≠ 0
he : ↑(aeval b) p = 0
f' : ↑(rootSet p L) → ↑(rootSet p L) :=
  Set.MapsTo.restrict (↑f) (rootSet p L) (rootSet p L) (_ : Set.MapsTo (↑f) (rootSet p L) (rootSet p L))
⊢ ∃ a, ↑f a = b

tactic: obtain ⟨a, ha⟩ := this ⟨b, mem_rootSet.2 ⟨hp, he⟩⟩
state_before: case intro.intro
K : Type u_1
L : Type u_2
R : Type ?u.339073
S : Type ?u.339076
A : Type ?u.339079
inst✝¹² : Field K
inst✝¹¹ : Field L
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : CommRing A
inst✝⁷ : Algebra K L
inst✝⁶ : Algebra L A
inst✝⁵ : Algebra K A
inst✝⁴ : IsScalarTower K L A
inst✝³ : Algebra R S
inst✝² : Algebra S A
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R S A
ha : IsAlgebraic K L
f : L →ₐ[K] L
b : L
p : K[X]
hp : p ≠ 0
he : ↑(aeval b) p = 0
f' : ↑(rootSet p L) → ↑(rootSet p L) :=
  Set.MapsTo.restrict (↑f) (rootSet p L) (rootSet p L) (_ : Set.MapsTo (↑f) (rootSet p L) (rootSet p L))
this : Function.Surjective f'
⊢ ∃ a, ↑f a = b

tactic: exact ⟨a, Subtype.ext_iff.1 ha⟩
state_before: case intro.intro.intro
K : Type u_1
L : Type u_2
R : Type ?u.339073
S : Type ?u.339076
A : Type ?u.339079
inst✝¹² : Field K
inst✝¹¹ : Field L
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : CommRing A
inst✝⁷ : Algebra K L
inst✝⁶ : Algebra L A
inst✝⁵ : Algebra K A
inst✝⁴ : IsScalarTower K L A
inst✝³ : Algebra R S
inst✝² : Algebra S A
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R S A
ha✝ : IsAlgebraic K L
f : L →ₐ[K] L
b : L
p : K[X]
hp : p ≠ 0
he : ↑(aeval b) p = 0
f' : ↑(rootSet p L) → ↑(rootSet p L) :=
  Set.MapsTo.restrict (↑f) (rootSet p L) (rootSet p L) (_ : Set.MapsTo (↑f) (rootSet p L) (rootSet p L))
this : Function.Surjective f'
a : ↑(rootSet p L)
ha : f' a = { val := b, property := (_ : b ∈ rootSet p L) }
⊢ ∃ a, ↑f a = b