Theorem: ZMod.sq_add_sq
File: Mathlib/FieldTheory/Finite/Basic.lean

tactic: cases' hp.1.eq_two_or_odd with hp2 hp_odd
state_before: K : Type ?u.822912
R : Type ?u.822915
p : ℕ
hp : Fact (Nat.Prime p)
x : ZMod p
⊢ ∃ a b, a ^ 2 + b ^ 2 = x

tactic: let f : (ZMod p)[X] := X ^ 2
state_before: case inr
K : Type ?u.822912
R : Type ?u.822915
p : ℕ
hp : Fact (Nat.Prime p)
x : ZMod p
hp_odd : p % 2 = 1
⊢ ∃ a b, a ^ 2 + b ^ 2 = x

tactic: let g : (ZMod p)[X] := X ^ 2 - C x
state_before: case inr
K : Type ?u.822912
R : Type ?u.822915
p : ℕ
hp : Fact (Nat.Prime p)
x : ZMod p
hp_odd : p % 2 = 1
f : (ZMod p)[X] := X ^ 2
⊢ ∃ a b, a ^ 2 + b ^ 2 = x

tactic: obtain ⟨a, b, hab⟩ : ∃ a b, f.eval a + g.eval b = 0 :=
  @exists_root_sum_quadratic _ _ _ _ f g (degree_X_pow 2) (degree_X_pow_sub_C (by decide) _)
    (by rw [ZMod.card, hp_odd])
state_before: case inr
K : Type ?u.822912
R : Type ?u.822915
p : ℕ
hp : Fact (Nat.Prime p)
x : ZMod p
hp_odd : p % 2 = 1
f : (ZMod p)[X] := X ^ 2
g : (ZMod p)[X] := X ^ 2 - ↑C x
⊢ ∃ a b, a ^ 2 + b ^ 2 = x

tactic: refine' ⟨a, b, _⟩
state_before: case inr.intro.intro
K : Type ?u.822912
R : Type ?u.822915
p : ℕ
hp : Fact (Nat.Prime p)
x : ZMod p
hp_odd : p % 2 = 1
f : (ZMod p)[X] := X ^ 2
g : (ZMod p)[X] := X ^ 2 - ↑C x
a b : ZMod p
hab : eval a f + eval b g = 0
⊢ ∃ a b, a ^ 2 + b ^ 2 = x

tactic: rw [← sub_eq_zero]
state_before: case inr.intro.intro
K : Type ?u.822912
R : Type ?u.822915
p : ℕ
hp : Fact (Nat.Prime p)
x : ZMod p
hp_odd : p % 2 = 1
f : (ZMod p)[X] := X ^ 2
g : (ZMod p)[X] := X ^ 2 - ↑C x
a b : ZMod p
hab : eval a f + eval b g = 0
⊢ a ^ 2 + b ^ 2 = x

tactic: simpa only [eval_C, eval_X, eval_pow, eval_sub, ← add_sub_assoc] using hab
state_before: case inr.intro.intro
K : Type ?u.822912
R : Type ?u.822915
p : ℕ
hp : Fact (Nat.Prime p)
x : ZMod p
hp_odd : p % 2 = 1
f : (ZMod p)[X] := X ^ 2
g : (ZMod p)[X] := X ^ 2 - ↑C x
a b : ZMod p
hab : eval a f + eval b g = 0
⊢ a ^ 2 + b ^ 2 - x = 0

tactic: subst p
state_before: case inl
K : Type ?u.822912
R : Type ?u.822915
p : ℕ
hp : Fact (Nat.Prime p)
x : ZMod p
hp2 : p = 2
⊢ ∃ a b, a ^ 2 + b ^ 2 = x

tactic: change Fin 2 at x
state_before: case inl
K : Type ?u.822912
R : Type ?u.822915
hp : Fact (Nat.Prime 2)
x : ZMod 2
⊢ ∃ a b, a ^ 2 + b ^ 2 = x

tactic: fin_cases x
state_before: case inl
K : Type ?u.822912
R : Type ?u.822915
hp : Fact (Nat.Prime 2)
x : Fin 2
⊢ ∃ a b, a ^ 2 + b ^ 2 = x

tactic: use 0
state_before: case inl.head
K : Type ?u.822912
R : Type ?u.822915
hp : Fact (Nat.Prime 2)
⊢ ∃ a b, a ^ 2 + b ^ 2 = { val := 0, isLt := (_ : 0 < 2) }

tactic: simp
state_before: case inl.head
K : Type ?u.822912
R : Type ?u.822915
hp : Fact (Nat.Prime 2)
⊢ ∃ b, 0 ^ 2 + b ^ 2 = { val := 0, isLt := (_ : 0 < 2) }

tactic: use 0, 1
state_before: case inl.tail.head
K : Type ?u.822912
R : Type ?u.822915
hp : Fact (Nat.Prime 2)
⊢ ∃ a b, a ^ 2 + b ^ 2 = { val := 1, isLt := (_ : (fun a => a < 2) 1) }

tactic: simp
state_before: case inl.tail.head
K : Type ?u.822912
R : Type ?u.822915
hp : Fact (Nat.Prime 2)
⊢ 0 ^ 2 + 1 ^ 2 = { val := 1, isLt := (_ : (fun a => a < 2) 1) }

tactic: decide
state_before: K : Type ?u.822912
R : Type ?u.822915
p : ℕ
hp : Fact (Nat.Prime p)
x : ZMod p
hp_odd : p % 2 = 1
f : (ZMod p)[X] := X ^ 2
g : (ZMod p)[X] := X ^ 2 - ↑C x
⊢ 0 < 2

tactic: rw [ZMod.card, hp_odd]
state_before: K : Type ?u.822912
R : Type ?u.822915
p : ℕ
hp : Fact (Nat.Prime p)
x : ZMod p
hp_odd : p % 2 = 1
f : (ZMod p)[X] := X ^ 2
g : (ZMod p)[X] := X ^ 2 - ↑C x
⊢ Fintype.card (ZMod p) % 2 = 1