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

Proof steps:
state_before: K : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
A : Type u_5
inst✝⁴ : CommRing K
inst✝³ : Field L
inst✝² : Algebra K L
inst✝¹ : NoZeroSMulDivisors K L
inst✝ : Algebra.IsAlgebraic K L
f : L →ₐ[K] L
⊢ Function.Bijective ⇑f
state_after: K : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
A : Type u_5
inst✝⁴ : CommRing K
inst✝³ : Field L
inst✝² : Algebra K L
inst✝¹ : NoZeroSMulDivisors K L
inst✝ : Algebra.IsAlgebraic K L
f : L →ₐ[K] L
b : L
⊢ ∃ a, f a = b
tactic: refine ⟨f.injective, fun b ↦ ?_⟩
state_before: K : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
A : Type u_5
inst✝⁴ : CommRing K
inst✝³ : Field L
inst✝² : Algebra K L
inst✝¹ : NoZeroSMulDivisors K L
inst✝ : Algebra.IsAlgebraic K L
f : L →ₐ[K] L
b : L
⊢ ∃ a, f a = b
state_after: case intro.intro
K : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
A : Type u_5
inst✝⁴ : CommRing K
inst✝³ : Field L
inst✝² : Algebra K L
inst✝¹ : NoZeroSMulDivisors K L
inst✝ : Algebra.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: obtain ⟨p, hp, he⟩ := Algebra.IsAlgebraic.isAlgebraic (R := K) b
state_before: case intro.intro
K : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
A : Type u_5
inst✝⁴ : CommRing K
inst✝³ : Field L
inst✝² : Algebra K L
inst✝¹ : NoZeroSMulDivisors K L
inst✝ : Algebra.IsAlgebraic K L
f : L →ₐ[K] L
b : L
p : K[X]
hp : p ≠ 0
he : (aeval b) p = 0
⊢ ∃ a, f a = b
state_after: case intro.intro
K : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
A : Type u_5
inst✝⁴ : CommRing K
inst✝³ : Field L
inst✝² : Algebra K L
inst✝¹ : NoZeroSMulDivisors K L
inst✝ : Algebra.IsAlgebraic K L
f : L →ₐ[K] L
b : L
p : K[X]
hp : p ≠ 0
he : (aeval b) p = 0
f' : ↑(p.rootSet L) → ↑(p.rootSet L) := Set.MapsTo.restrict (⇑f) (p.rootSet L) (p.rootSet 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_3
S : Type u_4
A : Type u_5
inst✝⁴ : CommRing K
inst✝³ : Field L
inst✝² : Algebra K L
inst✝¹ : NoZeroSMulDivisors K L
inst✝ : Algebra.IsAlgebraic K L
f : L →ₐ[K] L
b : L
p : K[X]
hp : p ≠ 0
he : (aeval b) p = 0
f' : ↑(p.rootSet L) → ↑(p.rootSet L) := Set.MapsTo.restrict (⇑f) (p.rootSet L) (p.rootSet L) ⋯
⊢ ∃ a, f a = b
state_after: case intro.intro
K : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
A : Type u_5
inst✝⁴ : CommRing K
inst✝³ : Field L
inst✝² : Algebra K L
inst✝¹ : NoZeroSMulDivisors K L
inst✝ : Algebra.IsAlgebraic K L
f : L →ₐ[K] L
b : L
p : K[X]
hp : p ≠ 0
he : (aeval b) p = 0
f' : ↑(p.rootSet L) → ↑(p.rootSet L) := Set.MapsTo.restrict (⇑f) (p.rootSet L) (p.rootSet L) ⋯
this : Function.Surjective f'
⊢ ∃ a, f a = b
tactic: have : f'.Surjective := Finite.injective_iff_surjective.1
    fun _ _ h ↦ Subtype.eq <| f.injective <| Subtype.ext_iff.1 h
state_before: case intro.intro
K : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
A : Type u_5
inst✝⁴ : CommRing K
inst✝³ : Field L
inst✝² : Algebra K L
inst✝¹ : NoZeroSMulDivisors K L
inst✝ : Algebra.IsAlgebraic K L
f : L →ₐ[K] L
b : L
p : K[X]
hp : p ≠ 0
he : (aeval b) p = 0
f' : ↑(p.rootSet L) → ↑(p.rootSet L) := Set.MapsTo.restrict (⇑f) (p.rootSet L) (p.rootSet L) ⋯
this : Function.Surjective f'
⊢ ∃ a, f a = b
state_after: case intro.intro.intro
K : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
A : Type u_5
inst✝⁴ : CommRing K
inst✝³ : Field L
inst✝² : Algebra K L
inst✝¹ : NoZeroSMulDivisors K L
inst✝ : Algebra.IsAlgebraic K L
f : L →ₐ[K] L
b : L
p : K[X]
hp : p ≠ 0
he : (aeval b) p = 0
f' : ↑(p.rootSet L) → ↑(p.rootSet L) := Set.MapsTo.restrict (⇑f) (p.rootSet L) (p.rootSet L) ⋯
this : Function.Surjective f'
a : ↑(p.rootSet L)
ha : f' a = ⟨b, ⋯⟩
⊢ ∃ a, f a = b
tactic: obtain ⟨a, ha⟩ := this ⟨b, mem_rootSet.2 ⟨hp, he⟩⟩
state_before: case intro.intro.intro
K : Type u_1
L : Type u_2
R : Type u_3
S : Type u_4
A : Type u_5
inst✝⁴ : CommRing K
inst✝³ : Field L
inst✝² : Algebra K L
inst✝¹ : NoZeroSMulDivisors K L
inst✝ : Algebra.IsAlgebraic K L
f : L →ₐ[K] L
b : L
p : K[X]
hp : p ≠ 0
he : (aeval b) p = 0
f' : ↑(p.rootSet L) → ↑(p.rootSet L) := Set.MapsTo.restrict (⇑f) (p.rootSet L) (p.rootSet L) ⋯
this : Function.Surjective f'
a : ↑(p.rootSet L)
ha : f' a = ⟨b, ⋯⟩
⊢ ∃ a, f a = b
state_after: no goals
tactic: exact ⟨a, Subtype.ext_iff.1 ha⟩