Theorem: Polynomial.dickson_one_one_zmod_p
File: Mathlib/RingTheory/Polynomial/Dickson.lean

tactic: obtain ⟨K, _, _, H⟩ : ∃ (K : Type)(_ : Field K), ∃ _ : CharP K p, Infinite K := by
  let K := FractionRing (Polynomial (ZMod p))
  let f : ZMod p →+* K := (algebraMap _ (FractionRing _)).comp C
  have : CharP K p := by
    rw [← f.charP_iff_charP]
    infer_instance
  haveI : Infinite K :=
    Infinite.of_injective (algebraMap (Polynomial (ZMod p)) (FractionRing (Polynomial (ZMod p))))
      (IsFractionRing.injective _ _)
  refine' ⟨K, _, _, _⟩ <;> infer_instance
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
⊢ dickson 1 1 p = X ^ p

tactic: apply map_injective (ZMod.castHom (dvd_refl p) K) (RingHom.injective _)
state_before: case intro.intro.intro
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Infinite K
⊢ dickson 1 1 p = X ^ p

tactic: rw [map_dickson, Polynomial.map_pow, map_X]
state_before: case intro.intro.intro.a
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Infinite K
⊢ map (ZMod.castHom (_ : p ∣ p) K) (dickson 1 1 p) = map (ZMod.castHom (_ : p ∣ p) K) (X ^ p)

tactic: apply eq_of_infinite_eval_eq
state_before: case intro.intro.intro.a
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Infinite K
⊢ dickson 1 (↑(ZMod.castHom (_ : p ∣ p) K) 1) p = X ^ p

tactic: apply @Set.Infinite.mono _ { x : K | ∃ y, x = y + y⁻¹ ∧ y ≠ 0 }
state_before: case intro.intro.intro.a.h
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Infinite K
⊢ Set.Infinite {x | eval x (dickson 1 (↑(ZMod.castHom (_ : p ∣ p) K) 1) p) = eval x (X ^ p)}

tactic: let K := FractionRing (Polynomial (ZMod p))
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
⊢ ∃ K x x, Infinite K

tactic: let f : ZMod p →+* K := (algebraMap _ (FractionRing _)).comp C
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type := FractionRing (ZMod p)[X]
⊢ ∃ K x x, Infinite K

tactic: have : CharP K p := by
  rw [← f.charP_iff_charP]
  infer_instance
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type := FractionRing (ZMod p)[X]
f : ZMod p →+* K := RingHom.comp (algebraMap (ZMod p)[X] (FractionRing (ZMod p)[X])) C
⊢ ∃ K x x, Infinite K

tactic: haveI : Infinite K :=
  Infinite.of_injective (algebraMap (Polynomial (ZMod p)) (FractionRing (Polynomial (ZMod p))))
    (IsFractionRing.injective _ _)
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type := FractionRing (ZMod p)[X]
f : ZMod p →+* K := RingHom.comp (algebraMap (ZMod p)[X] (FractionRing (ZMod p)[X])) C
this : CharP K p
⊢ ∃ K x x, Infinite K

tactic: refine' ⟨K, _, _, _⟩ <;> infer_instance
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type := FractionRing (ZMod p)[X]
f : ZMod p →+* K := RingHom.comp (algebraMap (ZMod p)[X] (FractionRing (ZMod p)[X])) C
this✝ : CharP K p
this : Infinite K
⊢ ∃ K x x, Infinite K

tactic: rw [← f.charP_iff_charP]
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type := FractionRing (ZMod p)[X]
f : ZMod p →+* K := RingHom.comp (algebraMap (ZMod p)[X] (FractionRing (ZMod p)[X])) C
⊢ CharP K p

tactic: infer_instance
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type := FractionRing (ZMod p)[X]
f : ZMod p →+* K := RingHom.comp (algebraMap (ZMod p)[X] (FractionRing (ZMod p)[X])) C
⊢ CharP (ZMod p) p

tactic: rintro _ ⟨x, rfl, hx⟩
state_before: case intro.intro.intro.a.h.h
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Infinite K
⊢ {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0} ⊆ {x | eval x (dickson 1 (↑(ZMod.castHom (_ : p ∣ p) K) 1) p) = eval x (X ^ p)}

tactic: simp only [eval_X, eval_pow, Set.mem_setOf_eq, @add_pow_char K _ p,
  dickson_one_one_eval_add_inv _ _ (mul_inv_cancel hx), inv_pow, ZMod.castHom_apply,
  ZMod.cast_one']
state_before: case intro.intro.intro.a.h.h.intro.intro
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Infinite K
x : K
hx : x ≠ 0
⊢ x + x⁻¹ ∈ {x | eval x (dickson 1 (↑(ZMod.castHom (_ : p ∣ p) K) 1) p) = eval x (X ^ p)}

tactic: intro h
state_before: case intro.intro.intro.a.h.a
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Infinite K
⊢ Set.Infinite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}

tactic: rw [← Set.infinite_univ_iff] at H
state_before: case intro.intro.intro.a.h.a
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Infinite K
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
⊢ False

tactic: apply H
state_before: case intro.intro.intro.a.h.a
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
⊢ False

tactic: rw [this]
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
this :
  Set.univ = do
    let x ← {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
    {y | x = y + y⁻¹ ∨ y = 0}
⊢ Set.Finite Set.univ

tactic: clear this
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
this :
  Set.univ = do
    let x ← {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
    {y | x = y + y⁻¹ ∨ y = 0}
⊢ Set.Finite do
    let x ← {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
    {y | x = y + y⁻¹ ∨ y = 0}

tactic: refine' h.biUnion fun x _ => _
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
⊢ Set.Finite do
    let x ← {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
    {y | x = y + y⁻¹ ∨ y = 0}

tactic: let φ : K[X] := X ^ 2 - C x * X + 1
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
x✝ : x ∈ {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
⊢ Set.Finite ((fun x => {y | x = y + y⁻¹ ∨ y = 0}) x)

tactic: have hφ : φ ≠ 0 := by
  intro H
  have : φ.eval 0 = 0 := by rw [H, eval_zero]
  simpa [eval_X, eval_one, eval_pow, eval_sub, sub_zero, eval_add, eval_mul,
    MulZeroClass.mul_zero, sq, zero_add, one_ne_zero]
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
x✝ : x ∈ {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
φ : K[X] := X ^ 2 - ↑C x * X + 1
⊢ Set.Finite ((fun x => {y | x = y + y⁻¹ ∨ y = 0}) x)

tactic: intro H
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
x✝ : x ∈ {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
φ : K[X] := X ^ 2 - ↑C x * X + 1
⊢ φ ≠ 0

tactic: have : φ.eval 0 = 0 := by rw [H, eval_zero]
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H✝ : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
x✝ : x ∈ {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
φ : K[X] := X ^ 2 - ↑C x * X + 1
H : φ = 0
⊢ False

tactic: simpa [eval_X, eval_one, eval_pow, eval_sub, sub_zero, eval_add, eval_mul,
  MulZeroClass.mul_zero, sq, zero_add, one_ne_zero]
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H✝ : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
x✝ : x ∈ {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
φ : K[X] := X ^ 2 - ↑C x * X + 1
H : φ = 0
this : eval 0 φ = 0
⊢ False

tactic: rw [H, eval_zero]
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H✝ : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
x✝ : x ∈ {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
φ : K[X] := X ^ 2 - ↑C x * X + 1
H : φ = 0
⊢ eval 0 φ = 0

tactic: convert(φ.roots ∪ {0}).toFinset.finite_toSet using 1
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
x✝ : x ∈ {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
φ : K[X] := X ^ 2 - ↑C x * X + 1
hφ : φ ≠ 0
⊢ Set.Finite ((fun x => {y | x = y + y⁻¹ ∨ y = 0}) x)

tactic: ext1 y
state_before: case h.e'_2
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
x✝ : x ∈ {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
φ : K[X] := X ^ 2 - ↑C x * X + 1
hφ : φ ≠ 0
⊢ (fun x => {y | x = y + y⁻¹ ∨ y = 0}) x = ↑(Multiset.toFinset (roots φ ∪ {0}))

tactic: simp only [Multiset.mem_toFinset, Set.mem_setOf_eq, Finset.mem_coe, Multiset.mem_union,
  mem_roots hφ, IsRoot, eval_add, eval_sub, eval_pow, eval_mul, eval_X, eval_C, eval_one,
  Multiset.mem_singleton]
state_before: case h.e'_2.h
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
x✝ : x ∈ {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
φ : K[X] := X ^ 2 - ↑C x * X + 1
hφ : φ ≠ 0
y : K
⊢ y ∈ (fun x => {y | x = y + y⁻¹ ∨ y = 0}) x ↔ y ∈ ↑(Multiset.toFinset (roots φ ∪ {0}))

tactic: by_cases hy : y = 0
state_before: case h.e'_2.h
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
x✝ : x ∈ {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
φ : K[X] := X ^ 2 - ↑C x * X + 1
hφ : φ ≠ 0
y : K
⊢ x = y + y⁻¹ ∨ y = 0 ↔ y ^ 2 - x * y + 1 = 0 ∨ y = 0

tactic: apply or_congr _ Iff.rfl
state_before: case neg
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
x✝ : x ∈ {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
φ : K[X] := X ^ 2 - ↑C x * X + 1
hφ : φ ≠ 0
y : K
hy : ¬y = 0
⊢ x = y + y⁻¹ ∨ y = 0 ↔ y ^ 2 - x * y + 1 = 0 ∨ y = 0

tactic: rw [← mul_left_inj' hy, eq_comm, ← sub_eq_zero, add_mul, inv_mul_cancel hy]
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
x✝ : x ∈ {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
φ : K[X] := X ^ 2 - ↑C x * X + 1
hφ : φ ≠ 0
y : K
hy : ¬y = 0
⊢ x = y + y⁻¹ ↔ y ^ 2 - x * y + 1 = 0

tactic: apply eq_iff_eq_cancel_right.mpr
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
x✝ : x ∈ {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
φ : K[X] := X ^ 2 - ↑C x * X + 1
hφ : φ ≠ 0
y : K
hy : ¬y = 0
⊢ y * y + 1 - x * y = 0 ↔ y ^ 2 - x * y + 1 = 0

tactic: ring
state_before: case a
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
x✝ : x ∈ {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
φ : K[X] := X ^ 2 - ↑C x * X + 1
hφ : φ ≠ 0
y : K
hy : ¬y = 0
⊢ y * y + 1 - x * y = y ^ 2 - x * y + 1

tactic: simp only [hy, eq_self_iff_true, or_true_iff]
state_before: case pos
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
x✝ : x ∈ {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
φ : K[X] := X ^ 2 - ↑C x * X + 1
hφ : φ ≠ 0
y : K
hy : y = 0
⊢ x = y + y⁻¹ ∨ y = 0 ↔ y ^ 2 - x * y + 1 = 0 ∨ y = 0

tactic: apply (Set.eq_univ_of_forall _).symm
state_before: case intro.intro.intro.a.h.a
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
⊢ Set.univ = do
    let x ← {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
    {y | x = y + y⁻¹ ∨ y = 0}

tactic: intro x
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
⊢ ∀ (x : K),
    x ∈ do
      let x ← {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
      {y | x = y + y⁻¹ ∨ y = 0}

tactic: simp only [exists_prop, Set.mem_iUnion, Set.bind_def, Ne.def, Set.mem_setOf_eq]
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
⊢ x ∈ do
    let x ← {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
    {y | x = y + y⁻¹ ∨ y = 0}

tactic: by_cases hx : x = 0
state_before: R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
⊢ ∃ i, (∃ y, i = y + y⁻¹ ∧ ¬y = 0) ∧ (i = x + x⁻¹ ∨ x = 0)

tactic: simp only [hx, and_true_iff, eq_self_iff_true, inv_zero, or_true_iff]
state_before: case pos
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
hx : x = 0
⊢ ∃ i, (∃ y, i = y + y⁻¹ ∧ ¬y = 0) ∧ (i = x + x⁻¹ ∨ x = 0)

tactic: exact ⟨_, 1, rfl, one_ne_zero⟩
state_before: case pos
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
hx : x = 0
⊢ ∃ i y, i = y + y⁻¹ ∧ ¬y = 0

tactic: simp only [hx, or_false_iff, exists_eq_right]
state_before: case neg
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
hx : ¬x = 0
⊢ ∃ i, (∃ y, i = y + y⁻¹ ∧ ¬y = 0) ∧ (i = x + x⁻¹ ∨ x = 0)

tactic: exact ⟨_, rfl, hx⟩
state_before: case neg
R : Type ?u.256583
S : Type ?u.256586
inst✝² : CommRing R
inst✝¹ : CommRing S
k : ℕ
a : R
p : ℕ
inst✝ : Fact (Nat.Prime p)
K : Type
w✝¹ : Field K
w✝ : CharP K p
H : Set.Infinite Set.univ
h : Set.Finite {x | ∃ y, x = y + y⁻¹ ∧ y ≠ 0}
x : K
hx : ¬x = 0
⊢ ∃ y, x + x⁻¹ = y + y⁻¹ ∧ ¬y = 0