[GOAL]
z : ZMod 4
⊢ z * z ≠ 2
[PROOFSTEP]
change Fin 4 at z 
[GOAL]
z : Fin 4
⊢ z * z ≠ 2
[PROOFSTEP]
fin_cases z
[GOAL]
case head
⊢ { val := 0, isLt := (_ : 0 < 4) } * { val := 0, isLt := (_ : 0 < 4) } ≠ 2
[PROOFSTEP]
norm_num [Fin.ext_iff, Fin.val_bit0, Fin.val_bit1]
[GOAL]
case tail.head
⊢ { val := 1, isLt := (_ : (fun a => a < 4) 1) } * { val := 1, isLt := (_ : (fun a => a < 4) 1) } ≠ 2
[PROOFSTEP]
norm_num [Fin.ext_iff, Fin.val_bit0, Fin.val_bit1]
[GOAL]
case tail.tail.head
⊢ { val := 2, isLt := (_ : (fun a => (fun a => a < 4) a) 2) } *
      { val := 2, isLt := (_ : (fun a => (fun a => a < 4) a) 2) } ≠
    2
[PROOFSTEP]
norm_num [Fin.ext_iff, Fin.val_bit0, Fin.val_bit1]
[GOAL]
case tail.tail.tail.head
⊢ { val := 3, isLt := (_ : (fun a => (fun a => (fun a => a < 4) a) a) 3) } *
      { val := 3, isLt := (_ : (fun a => (fun a => (fun a => a < 4) a) a) 3) } ≠
    2
[PROOFSTEP]
norm_num [Fin.ext_iff, Fin.val_bit0, Fin.val_bit1]
[GOAL]
z : ℤ
⊢ z * z % 4 ≠ 2
[PROOFSTEP]
suffices ¬z * z % (4 : ℕ) = 2 % (4 : ℕ) by exact this
[GOAL]
z : ℤ
this : ¬z * z % ↑4 = 2 % ↑4
⊢ z * z % 4 ≠ 2
[PROOFSTEP]
exact this
[GOAL]
z : ℤ
⊢ ¬z * z % ↑4 = 2 % ↑4
[PROOFSTEP]
rw [← ZMod.int_cast_eq_int_cast_iff']
[GOAL]
z : ℤ
⊢ ¬↑(z * z) = ↑2
[PROOFSTEP]
simpa using sq_ne_two_fin_zmod_four _
[GOAL]
x y z : ℤ
⊢ PythagoreanTriple x y z ↔ PythagoreanTriple y x z
[PROOFSTEP]
delta PythagoreanTriple
[GOAL]
x y z : ℤ
⊢ x * x + y * y = z * z ↔ y * y + x * x = z * z
[PROOFSTEP]
rw [add_comm]
[GOAL]
⊢ PythagoreanTriple 0 0 0
[PROOFSTEP]
simp only [PythagoreanTriple, zero_mul, zero_add]
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
⊢ PythagoreanTriple y x z
[PROOFSTEP]
rwa [pythagoreanTriple_comm]
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
k : ℤ
⊢ k * x * (k * x) + k * y * (k * y) = k ^ 2 * (x * x + y * y)
[PROOFSTEP]
ring
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
k : ℤ
⊢ k ^ 2 * (x * x + y * y) = k ^ 2 * (z * z)
[PROOFSTEP]
rw [h.eq]
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
k : ℤ
⊢ k ^ 2 * (z * z) = k * z * (k * z)
[PROOFSTEP]
ring
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
k : ℤ
hk : k ≠ 0
⊢ PythagoreanTriple (k * x) (k * y) (k * z) ↔ PythagoreanTriple x y z
[PROOFSTEP]
refine' ⟨_, fun h => h.mul k⟩
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
k : ℤ
hk : k ≠ 0
⊢ PythagoreanTriple (k * x) (k * y) (k * z) → PythagoreanTriple x y z
[PROOFSTEP]
simp only [PythagoreanTriple]
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
k : ℤ
hk : k ≠ 0
⊢ k * x * (k * x) + k * y * (k * y) = k * z * (k * z) → x * x + y * y = z * z
[PROOFSTEP]
intro h
[GOAL]
x y z : ℤ
h✝ : PythagoreanTriple x y z
k : ℤ
hk : k ≠ 0
h : k * x * (k * x) + k * y * (k * y) = k * z * (k * z)
⊢ x * x + y * y = z * z
[PROOFSTEP]
rw [← mul_left_inj' (mul_ne_zero hk hk)]
[GOAL]
x y z : ℤ
h✝ : PythagoreanTriple x y z
k : ℤ
hk : k ≠ 0
h : k * x * (k * x) + k * y * (k * y) = k * z * (k * z)
⊢ (x * x + y * y) * (k * k) = z * z * (k * k)
[PROOFSTEP]
convert h using 1
[GOAL]
case h.e'_2
x y z : ℤ
h✝ : PythagoreanTriple x y z
k : ℤ
hk : k ≠ 0
h : k * x * (k * x) + k * y * (k * y) = k * z * (k * z)
⊢ (x * x + y * y) * (k * k) = k * x * (k * x) + k * y * (k * y)
[PROOFSTEP]
ring
[GOAL]
case h.e'_3
x y z : ℤ
h✝ : PythagoreanTriple x y z
k : ℤ
hk : k ≠ 0
h : k * x * (k * x) + k * y * (k * y) = k * z * (k * z)
⊢ z * z * (k * k) = k * z * (k * z)
[PROOFSTEP]
ring
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
k : ℤ
hc : IsClassified h
⊢ IsClassified (_ : PythagoreanTriple (k * x) (k * y) (k * z))
[PROOFSTEP]
obtain ⟨l, m, n, ⟨⟨rfl, rfl⟩ | ⟨rfl, rfl⟩, co⟩⟩ := hc
[GOAL]
case intro.intro.intro.intro.inl.intro
z k l m n : ℤ
co : Int.gcd m n = 1
h : PythagoreanTriple (l * (m ^ 2 - n ^ 2)) (l * (2 * m * n)) z
⊢ IsClassified (_ : PythagoreanTriple (k * (l * (m ^ 2 - n ^ 2))) (k * (l * (2 * m * n))) (k * z))
[PROOFSTEP]
use k * l, m, n
[GOAL]
case h
z k l m n : ℤ
co : Int.gcd m n = 1
h : PythagoreanTriple (l * (m ^ 2 - n ^ 2)) (l * (2 * m * n)) z
⊢ (k * (l * (m ^ 2 - n ^ 2)) = k * l * (m ^ 2 - n ^ 2) ∧ k * (l * (2 * m * n)) = k * l * (2 * m * n) ∨
      k * (l * (m ^ 2 - n ^ 2)) = k * l * (2 * m * n) ∧ k * (l * (2 * m * n)) = k * l * (m ^ 2 - n ^ 2)) ∧
    Int.gcd m n = 1
[PROOFSTEP]
apply And.intro _ co
[GOAL]
z k l m n : ℤ
co : Int.gcd m n = 1
h : PythagoreanTriple (l * (m ^ 2 - n ^ 2)) (l * (2 * m * n)) z
⊢ k * (l * (m ^ 2 - n ^ 2)) = k * l * (m ^ 2 - n ^ 2) ∧ k * (l * (2 * m * n)) = k * l * (2 * m * n) ∨
    k * (l * (m ^ 2 - n ^ 2)) = k * l * (2 * m * n) ∧ k * (l * (2 * m * n)) = k * l * (m ^ 2 - n ^ 2)
[PROOFSTEP]
left
[GOAL]
case h
z k l m n : ℤ
co : Int.gcd m n = 1
h : PythagoreanTriple (l * (m ^ 2 - n ^ 2)) (l * (2 * m * n)) z
⊢ k * (l * (m ^ 2 - n ^ 2)) = k * l * (m ^ 2 - n ^ 2) ∧ k * (l * (2 * m * n)) = k * l * (2 * m * n)
[PROOFSTEP]
constructor
[GOAL]
case h.left
z k l m n : ℤ
co : Int.gcd m n = 1
h : PythagoreanTriple (l * (m ^ 2 - n ^ 2)) (l * (2 * m * n)) z
⊢ k * (l * (m ^ 2 - n ^ 2)) = k * l * (m ^ 2 - n ^ 2)
[PROOFSTEP]
ring
[GOAL]
case h.right
z k l m n : ℤ
co : Int.gcd m n = 1
h : PythagoreanTriple (l * (m ^ 2 - n ^ 2)) (l * (2 * m * n)) z
⊢ k * (l * (2 * m * n)) = k * l * (2 * m * n)
[PROOFSTEP]
ring
[GOAL]
case intro.intro.intro.intro.inr.intro
z k l m n : ℤ
co : Int.gcd m n = 1
h : PythagoreanTriple (l * (2 * m * n)) (l * (m ^ 2 - n ^ 2)) z
⊢ IsClassified (_ : PythagoreanTriple (k * (l * (2 * m * n))) (k * (l * (m ^ 2 - n ^ 2))) (k * z))
[PROOFSTEP]
use k * l, m, n
[GOAL]
case h
z k l m n : ℤ
co : Int.gcd m n = 1
h : PythagoreanTriple (l * (2 * m * n)) (l * (m ^ 2 - n ^ 2)) z
⊢ (k * (l * (2 * m * n)) = k * l * (m ^ 2 - n ^ 2) ∧ k * (l * (m ^ 2 - n ^ 2)) = k * l * (2 * m * n) ∨
      k * (l * (2 * m * n)) = k * l * (2 * m * n) ∧ k * (l * (m ^ 2 - n ^ 2)) = k * l * (m ^ 2 - n ^ 2)) ∧
    Int.gcd m n = 1
[PROOFSTEP]
apply And.intro _ co
[GOAL]
z k l m n : ℤ
co : Int.gcd m n = 1
h : PythagoreanTriple (l * (2 * m * n)) (l * (m ^ 2 - n ^ 2)) z
⊢ k * (l * (2 * m * n)) = k * l * (m ^ 2 - n ^ 2) ∧ k * (l * (m ^ 2 - n ^ 2)) = k * l * (2 * m * n) ∨
    k * (l * (2 * m * n)) = k * l * (2 * m * n) ∧ k * (l * (m ^ 2 - n ^ 2)) = k * l * (m ^ 2 - n ^ 2)
[PROOFSTEP]
right
[GOAL]
case h
z k l m n : ℤ
co : Int.gcd m n = 1
h : PythagoreanTriple (l * (2 * m * n)) (l * (m ^ 2 - n ^ 2)) z
⊢ k * (l * (2 * m * n)) = k * l * (2 * m * n) ∧ k * (l * (m ^ 2 - n ^ 2)) = k * l * (m ^ 2 - n ^ 2)
[PROOFSTEP]
constructor
[GOAL]
case h.left
z k l m n : ℤ
co : Int.gcd m n = 1
h : PythagoreanTriple (l * (2 * m * n)) (l * (m ^ 2 - n ^ 2)) z
⊢ k * (l * (2 * m * n)) = k * l * (2 * m * n)
[PROOFSTEP]
ring
[GOAL]
case h.right
z k l m n : ℤ
co : Int.gcd m n = 1
h : PythagoreanTriple (l * (2 * m * n)) (l * (m ^ 2 - n ^ 2)) z
⊢ k * (l * (m ^ 2 - n ^ 2)) = k * l * (m ^ 2 - n ^ 2)
[PROOFSTEP]
ring
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
⊢ x % 2 = 0 ∧ y % 2 = 1 ∨ x % 2 = 1 ∧ y % 2 = 0
[PROOFSTEP]
cases' Int.emod_two_eq_zero_or_one x with hx hx
[GOAL]
case inl
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 0
⊢ x % 2 = 0 ∧ y % 2 = 1 ∨ x % 2 = 1 ∧ y % 2 = 0
[PROOFSTEP]
cases' Int.emod_two_eq_zero_or_one y with hy hy
[GOAL]
case inr
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 1
⊢ x % 2 = 0 ∧ y % 2 = 1 ∨ x % 2 = 1 ∧ y % 2 = 0
[PROOFSTEP]
cases' Int.emod_two_eq_zero_or_one y with hy hy
[GOAL]
case inl.inl
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 0
hy : y % 2 = 0
⊢ x % 2 = 0 ∧ y % 2 = 1 ∨ x % 2 = 1 ∧ y % 2 = 0
[PROOFSTEP]
exfalso
[GOAL]
case inl.inl.h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 0
hy : y % 2 = 0
⊢ False
[PROOFSTEP]
apply Nat.not_coprime_of_dvd_of_dvd (by decide : 1 < 2) _ _ hc
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 0
hy : y % 2 = 0
⊢ 1 < 2
[PROOFSTEP]
decide
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 0
hy : y % 2 = 0
⊢ 2 ∣ Int.natAbs x
[PROOFSTEP]
apply Int.coe_nat_dvd_left.1
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 0
hy : y % 2 = 0
⊢ ↑2 ∣ x
[PROOFSTEP]
apply Int.dvd_of_emod_eq_zero hx
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 0
hy : y % 2 = 0
⊢ 2 ∣ Int.natAbs y
[PROOFSTEP]
apply Int.coe_nat_dvd_left.1
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 0
hy : y % 2 = 0
⊢ ↑2 ∣ y
[PROOFSTEP]
apply Int.dvd_of_emod_eq_zero hy
[GOAL]
case inl.inr
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 0
hy : y % 2 = 1
⊢ x % 2 = 0 ∧ y % 2 = 1 ∨ x % 2 = 1 ∧ y % 2 = 0
[PROOFSTEP]
left
[GOAL]
case inl.inr.h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 0
hy : y % 2 = 1
⊢ x % 2 = 0 ∧ y % 2 = 1
[PROOFSTEP]
exact
  ⟨hx, hy⟩
    -- x odd, y even
[GOAL]
case inr.inl
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 1
hy : y % 2 = 0
⊢ x % 2 = 0 ∧ y % 2 = 1 ∨ x % 2 = 1 ∧ y % 2 = 0
[PROOFSTEP]
right
[GOAL]
case inr.inl.h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 1
hy : y % 2 = 0
⊢ x % 2 = 1 ∧ y % 2 = 0
[PROOFSTEP]
exact
  ⟨hx, hy⟩
    -- x odd, y odd
[GOAL]
case inr.inr
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 1
hy : y % 2 = 1
⊢ x % 2 = 0 ∧ y % 2 = 1 ∨ x % 2 = 1 ∧ y % 2 = 0
[PROOFSTEP]
exfalso
[GOAL]
case inr.inr.h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 1
hy : y % 2 = 1
⊢ False
[PROOFSTEP]
obtain ⟨x0, y0, rfl, rfl⟩ : ∃ x0 y0, x = x0 * 2 + 1 ∧ y = y0 * 2 + 1 :=
  by
  cases' exists_eq_mul_left_of_dvd (Int.dvd_sub_of_emod_eq hx) with x0 hx2
  cases' exists_eq_mul_left_of_dvd (Int.dvd_sub_of_emod_eq hy) with y0 hy2
  rw [sub_eq_iff_eq_add] at hx2 hy2 
  exact ⟨x0, y0, hx2, hy2⟩
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 1
hy : y % 2 = 1
⊢ ∃ x0 y0, x = x0 * 2 + 1 ∧ y = y0 * 2 + 1
[PROOFSTEP]
cases' exists_eq_mul_left_of_dvd (Int.dvd_sub_of_emod_eq hx) with x0 hx2
[GOAL]
case intro
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 1
hy : y % 2 = 1
x0 : ℤ
hx2 : x - 1 = x0 * 2
⊢ ∃ x0 y0, x = x0 * 2 + 1 ∧ y = y0 * 2 + 1
[PROOFSTEP]
cases' exists_eq_mul_left_of_dvd (Int.dvd_sub_of_emod_eq hy) with y0 hy2
[GOAL]
case intro.intro
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 1
hy : y % 2 = 1
x0 : ℤ
hx2 : x - 1 = x0 * 2
y0 : ℤ
hy2 : y - 1 = y0 * 2
⊢ ∃ x0 y0, x = x0 * 2 + 1 ∧ y = y0 * 2 + 1
[PROOFSTEP]
rw [sub_eq_iff_eq_add] at hx2 hy2 
[GOAL]
case intro.intro
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x % 2 = 1
hy : y % 2 = 1
x0 : ℤ
hx2 : x = x0 * 2 + 1
y0 : ℤ
hy2 : y = y0 * 2 + 1
⊢ ∃ x0 y0, x = x0 * 2 + 1 ∧ y = y0 * 2 + 1
[PROOFSTEP]
exact ⟨x0, y0, hx2, hy2⟩
[GOAL]
case inr.inr.h.intro.intro.intro
z x0 y0 : ℤ
hx : (x0 * 2 + 1) % 2 = 1
hy : (y0 * 2 + 1) % 2 = 1
h : PythagoreanTriple (x0 * 2 + 1) (y0 * 2 + 1) z
hc : Int.gcd (x0 * 2 + 1) (y0 * 2 + 1) = 1
⊢ False
[PROOFSTEP]
apply Int.sq_ne_two_mod_four z
[GOAL]
case inr.inr.h.intro.intro.intro
z x0 y0 : ℤ
hx : (x0 * 2 + 1) % 2 = 1
hy : (y0 * 2 + 1) % 2 = 1
h : PythagoreanTriple (x0 * 2 + 1) (y0 * 2 + 1) z
hc : Int.gcd (x0 * 2 + 1) (y0 * 2 + 1) = 1
⊢ z * z % 4 = 2
[PROOFSTEP]
rw [show z * z = 4 * (x0 * x0 + x0 + y0 * y0 + y0) + 2 by
    rw [← h.eq]
    ring]
[GOAL]
z x0 y0 : ℤ
hx : (x0 * 2 + 1) % 2 = 1
hy : (y0 * 2 + 1) % 2 = 1
h : PythagoreanTriple (x0 * 2 + 1) (y0 * 2 + 1) z
hc : Int.gcd (x0 * 2 + 1) (y0 * 2 + 1) = 1
⊢ z * z = 4 * (x0 * x0 + x0 + y0 * y0 + y0) + 2
[PROOFSTEP]
rw [← h.eq]
[GOAL]
z x0 y0 : ℤ
hx : (x0 * 2 + 1) % 2 = 1
hy : (y0 * 2 + 1) % 2 = 1
h : PythagoreanTriple (x0 * 2 + 1) (y0 * 2 + 1) z
hc : Int.gcd (x0 * 2 + 1) (y0 * 2 + 1) = 1
⊢ (x0 * 2 + 1) * (x0 * 2 + 1) + (y0 * 2 + 1) * (y0 * 2 + 1) = 4 * (x0 * x0 + x0 + y0 * y0 + y0) + 2
[PROOFSTEP]
ring
[GOAL]
case inr.inr.h.intro.intro.intro
z x0 y0 : ℤ
hx : (x0 * 2 + 1) % 2 = 1
hy : (y0 * 2 + 1) % 2 = 1
h : PythagoreanTriple (x0 * 2 + 1) (y0 * 2 + 1) z
hc : Int.gcd (x0 * 2 + 1) (y0 * 2 + 1) = 1
⊢ (4 * (x0 * x0 + x0 + y0 * y0 + y0) + 2) % 4 = 2
[PROOFSTEP]
field_simp [Int.add_emod]
  -- Porting note: norm_num is not enough to close this
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
⊢ ↑(Int.gcd x y) ∣ z
[PROOFSTEP]
by_cases h0 : Int.gcd x y = 0
[GOAL]
case pos
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
⊢ ↑(Int.gcd x y) ∣ z
[PROOFSTEP]
have hx : x = 0 := by
  apply Int.natAbs_eq_zero.mp
  apply Nat.eq_zero_of_gcd_eq_zero_left h0
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
⊢ x = 0
[PROOFSTEP]
apply Int.natAbs_eq_zero.mp
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
⊢ Int.natAbs x = 0
[PROOFSTEP]
apply Nat.eq_zero_of_gcd_eq_zero_left h0
[GOAL]
case pos
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
⊢ ↑(Int.gcd x y) ∣ z
[PROOFSTEP]
have hy : y = 0 := by
  apply Int.natAbs_eq_zero.mp
  apply Nat.eq_zero_of_gcd_eq_zero_right h0
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
⊢ y = 0
[PROOFSTEP]
apply Int.natAbs_eq_zero.mp
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
⊢ Int.natAbs y = 0
[PROOFSTEP]
apply Nat.eq_zero_of_gcd_eq_zero_right h0
[GOAL]
case pos
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
hy : y = 0
⊢ ↑(Int.gcd x y) ∣ z
[PROOFSTEP]
have hz : z = 0 := by simpa only [PythagoreanTriple, hx, hy, add_zero, zero_eq_mul, mul_zero, or_self_iff] using h
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
hy : y = 0
⊢ z = 0
[PROOFSTEP]
simpa only [PythagoreanTriple, hx, hy, add_zero, zero_eq_mul, mul_zero, or_self_iff] using h
[GOAL]
case pos
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
hy : y = 0
hz : z = 0
⊢ ↑(Int.gcd x y) ∣ z
[PROOFSTEP]
simp only [hz, dvd_zero]
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
h0 : ¬Int.gcd x y = 0
⊢ ↑(Int.gcd x y) ∣ z
[PROOFSTEP]
obtain ⟨k, x0, y0, _, h2, rfl, rfl⟩ : ∃ (k : ℕ) (x0 y0 : _), 0 < k ∧ Int.gcd x0 y0 = 1 ∧ x = x0 * k ∧ y = y0 * k :=
  Int.exists_gcd_one' (Nat.pos_of_ne_zero h0)
[GOAL]
case neg.intro.intro.intro.intro.intro.intro
z : ℤ
k : ℕ
x0 y0 : ℤ
left✝ : 0 < k
h2 : Int.gcd x0 y0 = 1
h : PythagoreanTriple (x0 * ↑k) (y0 * ↑k) z
h0 : ¬Int.gcd (x0 * ↑k) (y0 * ↑k) = 0
⊢ ↑(Int.gcd (x0 * ↑k) (y0 * ↑k)) ∣ z
[PROOFSTEP]
rw [Int.gcd_mul_right, h2, Int.natAbs_ofNat, one_mul]
[GOAL]
case neg.intro.intro.intro.intro.intro.intro
z : ℤ
k : ℕ
x0 y0 : ℤ
left✝ : 0 < k
h2 : Int.gcd x0 y0 = 1
h : PythagoreanTriple (x0 * ↑k) (y0 * ↑k) z
h0 : ¬Int.gcd (x0 * ↑k) (y0 * ↑k) = 0
⊢ ↑k ∣ z
[PROOFSTEP]
rw [← Int.pow_dvd_pow_iff zero_lt_two, sq z, ← h.eq]
[GOAL]
case neg.intro.intro.intro.intro.intro.intro
z : ℤ
k : ℕ
x0 y0 : ℤ
left✝ : 0 < k
h2 : Int.gcd x0 y0 = 1
h : PythagoreanTriple (x0 * ↑k) (y0 * ↑k) z
h0 : ¬Int.gcd (x0 * ↑k) (y0 * ↑k) = 0
⊢ ↑k ^ 2 ∣ x0 * ↑k * (x0 * ↑k) + y0 * ↑k * (y0 * ↑k)
[PROOFSTEP]
rw [(by ring : x0 * k * (x0 * k) + y0 * k * (y0 * k) = (k : ℤ) ^ 2 * (x0 * x0 + y0 * y0))]
[GOAL]
z : ℤ
k : ℕ
x0 y0 : ℤ
left✝ : 0 < k
h2 : Int.gcd x0 y0 = 1
h : PythagoreanTriple (x0 * ↑k) (y0 * ↑k) z
h0 : ¬Int.gcd (x0 * ↑k) (y0 * ↑k) = 0
⊢ x0 * ↑k * (x0 * ↑k) + y0 * ↑k * (y0 * ↑k) = ↑k ^ 2 * (x0 * x0 + y0 * y0)
[PROOFSTEP]
ring
[GOAL]
case neg.intro.intro.intro.intro.intro.intro
z : ℤ
k : ℕ
x0 y0 : ℤ
left✝ : 0 < k
h2 : Int.gcd x0 y0 = 1
h : PythagoreanTriple (x0 * ↑k) (y0 * ↑k) z
h0 : ¬Int.gcd (x0 * ↑k) (y0 * ↑k) = 0
⊢ ↑k ^ 2 ∣ ↑k ^ 2 * (x0 * x0 + y0 * y0)
[PROOFSTEP]
exact dvd_mul_right _ _
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
⊢ PythagoreanTriple (x / ↑(Int.gcd x y)) (y / ↑(Int.gcd x y)) (z / ↑(Int.gcd x y))
[PROOFSTEP]
by_cases h0 : Int.gcd x y = 0
[GOAL]
case pos
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
⊢ PythagoreanTriple (x / ↑(Int.gcd x y)) (y / ↑(Int.gcd x y)) (z / ↑(Int.gcd x y))
[PROOFSTEP]
have hx : x = 0 := by
  apply Int.natAbs_eq_zero.mp
  apply Nat.eq_zero_of_gcd_eq_zero_left h0
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
⊢ x = 0
[PROOFSTEP]
apply Int.natAbs_eq_zero.mp
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
⊢ Int.natAbs x = 0
[PROOFSTEP]
apply Nat.eq_zero_of_gcd_eq_zero_left h0
[GOAL]
case pos
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
⊢ PythagoreanTriple (x / ↑(Int.gcd x y)) (y / ↑(Int.gcd x y)) (z / ↑(Int.gcd x y))
[PROOFSTEP]
have hy : y = 0 := by
  apply Int.natAbs_eq_zero.mp
  apply Nat.eq_zero_of_gcd_eq_zero_right h0
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
⊢ y = 0
[PROOFSTEP]
apply Int.natAbs_eq_zero.mp
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
⊢ Int.natAbs y = 0
[PROOFSTEP]
apply Nat.eq_zero_of_gcd_eq_zero_right h0
[GOAL]
case pos
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
hy : y = 0
⊢ PythagoreanTriple (x / ↑(Int.gcd x y)) (y / ↑(Int.gcd x y)) (z / ↑(Int.gcd x y))
[PROOFSTEP]
have hz : z = 0 := by simpa only [PythagoreanTriple, hx, hy, add_zero, zero_eq_mul, mul_zero, or_self_iff] using h
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
hy : y = 0
⊢ z = 0
[PROOFSTEP]
simpa only [PythagoreanTriple, hx, hy, add_zero, zero_eq_mul, mul_zero, or_self_iff] using h
[GOAL]
case pos
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
hy : y = 0
hz : z = 0
⊢ PythagoreanTriple (x / ↑(Int.gcd x y)) (y / ↑(Int.gcd x y)) (z / ↑(Int.gcd x y))
[PROOFSTEP]
simp only [hx, hy, hz, Int.zero_div]
[GOAL]
case pos
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
hy : y = 0
hz : z = 0
⊢ PythagoreanTriple (0 / ↑(Int.gcd 0 0)) (0 / ↑(Int.gcd 0 0)) (0 / ↑(Int.gcd 0 0))
[PROOFSTEP]
exact zero
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
h0 : ¬Int.gcd x y = 0
⊢ PythagoreanTriple (x / ↑(Int.gcd x y)) (y / ↑(Int.gcd x y)) (z / ↑(Int.gcd x y))
[PROOFSTEP]
rcases h.gcd_dvd with ⟨z0, rfl⟩
[GOAL]
case neg.intro
x y : ℤ
h0 : ¬Int.gcd x y = 0
z0 : ℤ
h : PythagoreanTriple x y (↑(Int.gcd x y) * z0)
⊢ PythagoreanTriple (x / ↑(Int.gcd x y)) (y / ↑(Int.gcd x y)) (↑(Int.gcd x y) * z0 / ↑(Int.gcd x y))
[PROOFSTEP]
obtain ⟨k, x0, y0, k0, h2, rfl, rfl⟩ : ∃ (k : ℕ) (x0 y0 : _), 0 < k ∧ Int.gcd x0 y0 = 1 ∧ x = x0 * k ∧ y = y0 * k :=
  Int.exists_gcd_one' (Nat.pos_of_ne_zero h0)
[GOAL]
case neg.intro.intro.intro.intro.intro.intro.intro
z0 : ℤ
k : ℕ
x0 y0 : ℤ
k0 : 0 < k
h2 : Int.gcd x0 y0 = 1
h0 : ¬Int.gcd (x0 * ↑k) (y0 * ↑k) = 0
h : PythagoreanTriple (x0 * ↑k) (y0 * ↑k) (↑(Int.gcd (x0 * ↑k) (y0 * ↑k)) * z0)
⊢ PythagoreanTriple (x0 * ↑k / ↑(Int.gcd (x0 * ↑k) (y0 * ↑k))) (y0 * ↑k / ↑(Int.gcd (x0 * ↑k) (y0 * ↑k)))
    (↑(Int.gcd (x0 * ↑k) (y0 * ↑k)) * z0 / ↑(Int.gcd (x0 * ↑k) (y0 * ↑k)))
[PROOFSTEP]
have hk : (k : ℤ) ≠ 0 := by
  norm_cast
  rwa [pos_iff_ne_zero] at k0 
[GOAL]
z0 : ℤ
k : ℕ
x0 y0 : ℤ
k0 : 0 < k
h2 : Int.gcd x0 y0 = 1
h0 : ¬Int.gcd (x0 * ↑k) (y0 * ↑k) = 0
h : PythagoreanTriple (x0 * ↑k) (y0 * ↑k) (↑(Int.gcd (x0 * ↑k) (y0 * ↑k)) * z0)
⊢ ↑k ≠ 0
[PROOFSTEP]
norm_cast
[GOAL]
z0 : ℤ
k : ℕ
x0 y0 : ℤ
k0 : 0 < k
h2 : Int.gcd x0 y0 = 1
h0 : ¬Int.gcd (x0 * ↑k) (y0 * ↑k) = 0
h : PythagoreanTriple (x0 * ↑k) (y0 * ↑k) (↑(Int.gcd (x0 * ↑k) (y0 * ↑k)) * z0)
⊢ ¬k = 0
[PROOFSTEP]
rwa [pos_iff_ne_zero] at k0 
[GOAL]
case neg.intro.intro.intro.intro.intro.intro.intro
z0 : ℤ
k : ℕ
x0 y0 : ℤ
k0 : 0 < k
h2 : Int.gcd x0 y0 = 1
h0 : ¬Int.gcd (x0 * ↑k) (y0 * ↑k) = 0
h : PythagoreanTriple (x0 * ↑k) (y0 * ↑k) (↑(Int.gcd (x0 * ↑k) (y0 * ↑k)) * z0)
hk : ↑k ≠ 0
⊢ PythagoreanTriple (x0 * ↑k / ↑(Int.gcd (x0 * ↑k) (y0 * ↑k))) (y0 * ↑k / ↑(Int.gcd (x0 * ↑k) (y0 * ↑k)))
    (↑(Int.gcd (x0 * ↑k) (y0 * ↑k)) * z0 / ↑(Int.gcd (x0 * ↑k) (y0 * ↑k)))
[PROOFSTEP]
rw [Int.gcd_mul_right, h2, Int.natAbs_ofNat, one_mul] at h ⊢
[GOAL]
case neg.intro.intro.intro.intro.intro.intro.intro
z0 : ℤ
k : ℕ
x0 y0 : ℤ
k0 : 0 < k
h2 : Int.gcd x0 y0 = 1
h0 : ¬Int.gcd (x0 * ↑k) (y0 * ↑k) = 0
h : PythagoreanTriple (x0 * ↑k) (y0 * ↑k) (↑k * z0)
hk : ↑k ≠ 0
⊢ PythagoreanTriple (x0 * ↑k / ↑k) (y0 * ↑k / ↑k) (↑k * z0 / ↑k)
[PROOFSTEP]
rw [mul_comm x0, mul_comm y0, mul_iff k hk] at h 
[GOAL]
case neg.intro.intro.intro.intro.intro.intro.intro
z0 : ℤ
k : ℕ
x0 y0 : ℤ
k0 : 0 < k
h2 : Int.gcd x0 y0 = 1
h0 : ¬Int.gcd (x0 * ↑k) (y0 * ↑k) = 0
h : PythagoreanTriple x0 y0 z0
hk : ↑k ≠ 0
⊢ PythagoreanTriple (x0 * ↑k / ↑k) (y0 * ↑k / ↑k) (↑k * z0 / ↑k)
[PROOFSTEP]
rwa [Int.mul_ediv_cancel _ hk, Int.mul_ediv_cancel _ hk, Int.mul_ediv_cancel_left _ hk]
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hp : IsPrimitiveClassified h
⊢ IsClassified h
[PROOFSTEP]
obtain ⟨m, n, H⟩ := hp
[GOAL]
case intro.intro
x y z : ℤ
h : PythagoreanTriple x y z
m n : ℤ
H :
  (x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2) ∧
    Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)
⊢ IsClassified h
[PROOFSTEP]
use 1, m, n
[GOAL]
case h
x y z : ℤ
h : PythagoreanTriple x y z
m n : ℤ
H :
  (x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2) ∧
    Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)
⊢ (x = 1 * (m ^ 2 - n ^ 2) ∧ y = 1 * (2 * m * n) ∨ x = 1 * (2 * m * n) ∧ y = 1 * (m ^ 2 - n ^ 2)) ∧ Int.gcd m n = 1
[PROOFSTEP]
rcases H with ⟨t, co, _⟩
[GOAL]
case h.intro.intro
x y z : ℤ
h : PythagoreanTriple x y z
m n : ℤ
t : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2
co : Int.gcd m n = 1
right✝ : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ (x = 1 * (m ^ 2 - n ^ 2) ∧ y = 1 * (2 * m * n) ∨ x = 1 * (2 * m * n) ∧ y = 1 * (m ^ 2 - n ^ 2)) ∧ Int.gcd m n = 1
[PROOFSTEP]
rw [one_mul, one_mul]
[GOAL]
case h.intro.intro
x y z : ℤ
h : PythagoreanTriple x y z
m n : ℤ
t : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2
co : Int.gcd m n = 1
right✝ : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ (x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2) ∧ Int.gcd m n = 1
[PROOFSTEP]
exact ⟨t, co⟩
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : IsPrimitiveClassified (_ : PythagoreanTriple (x / ↑(Int.gcd x y)) (y / ↑(Int.gcd x y)) (z / ↑(Int.gcd x y)))
⊢ IsClassified h
[PROOFSTEP]
convert h.normalize.mul_isClassified (Int.gcd x y) (isClassified_of_isPrimitiveClassified h.normalize hc)
[GOAL]
case h.e'_1
x y z : ℤ
h : PythagoreanTriple x y z
hc : IsPrimitiveClassified (_ : PythagoreanTriple (x / ↑(Int.gcd x y)) (y / ↑(Int.gcd x y)) (z / ↑(Int.gcd x y)))
⊢ x = ↑(Int.gcd x y) * (x / ↑(Int.gcd x y))
[PROOFSTEP]
rw [Int.mul_ediv_cancel']
[GOAL]
case h.e'_2
x y z : ℤ
h : PythagoreanTriple x y z
hc : IsPrimitiveClassified (_ : PythagoreanTriple (x / ↑(Int.gcd x y)) (y / ↑(Int.gcd x y)) (z / ↑(Int.gcd x y)))
⊢ y = ↑(Int.gcd x y) * (y / ↑(Int.gcd x y))
[PROOFSTEP]
rw [Int.mul_ediv_cancel']
[GOAL]
case h.e'_3
x y z : ℤ
h : PythagoreanTriple x y z
hc : IsPrimitiveClassified (_ : PythagoreanTriple (x / ↑(Int.gcd x y)) (y / ↑(Int.gcd x y)) (z / ↑(Int.gcd x y)))
⊢ z = ↑(Int.gcd x y) * (z / ↑(Int.gcd x y))
[PROOFSTEP]
rw [Int.mul_ediv_cancel']
[GOAL]
case h.e'_1
x y z : ℤ
h : PythagoreanTriple x y z
hc : IsPrimitiveClassified (_ : PythagoreanTriple (x / ↑(Int.gcd x y)) (y / ↑(Int.gcd x y)) (z / ↑(Int.gcd x y)))
⊢ ↑(Int.gcd x y) ∣ x
[PROOFSTEP]
exact Int.gcd_dvd_left x y
[GOAL]
case h.e'_2
x y z : ℤ
h : PythagoreanTriple x y z
hc : IsPrimitiveClassified (_ : PythagoreanTriple (x / ↑(Int.gcd x y)) (y / ↑(Int.gcd x y)) (z / ↑(Int.gcd x y)))
⊢ ↑(Int.gcd x y) ∣ y
[PROOFSTEP]
exact Int.gcd_dvd_right x y
[GOAL]
case h.e'_3
x y z : ℤ
h : PythagoreanTriple x y z
hc : IsPrimitiveClassified (_ : PythagoreanTriple (x / ↑(Int.gcd x y)) (y / ↑(Int.gcd x y)) (z / ↑(Int.gcd x y)))
⊢ ↑(Int.gcd x y) ∣ z
[PROOFSTEP]
exact h.gcd_dvd
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
⊢ z ≠ 0
[PROOFSTEP]
suffices 0 < z * z by
  rintro rfl
  norm_num at this 
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
this : 0 < z * z
⊢ z ≠ 0
[PROOFSTEP]
rintro rfl
[GOAL]
x y : ℤ
hc : Int.gcd x y = 1
h : PythagoreanTriple x y 0
this : 0 < 0 * 0
⊢ False
[PROOFSTEP]
norm_num at this 
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
⊢ 0 < z * z
[PROOFSTEP]
rw [← h.eq, ← sq, ← sq]
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
⊢ 0 < x ^ 2 + y ^ 2
[PROOFSTEP]
have hc' : Int.gcd x y ≠ 0 := by
  rw [hc]
  exact one_ne_zero
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
⊢ Int.gcd x y ≠ 0
[PROOFSTEP]
rw [hc]
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
⊢ 1 ≠ 0
[PROOFSTEP]
exact one_ne_zero
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hc' : Int.gcd x y ≠ 0
⊢ 0 < x ^ 2 + y ^ 2
[PROOFSTEP]
cases' Int.ne_zero_of_gcd hc' with hxz hyz
[GOAL]
case inl
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hc' : Int.gcd x y ≠ 0
hxz : x ≠ 0
⊢ 0 < x ^ 2 + y ^ 2
[PROOFSTEP]
apply lt_add_of_pos_of_le (sq_pos_of_ne_zero x hxz) (sq_nonneg y)
[GOAL]
case inr
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hc' : Int.gcd x y ≠ 0
hyz : y ≠ 0
⊢ 0 < x ^ 2 + y ^ 2
[PROOFSTEP]
apply lt_add_of_le_of_pos (sq_nonneg x) (sq_pos_of_ne_zero y hyz)
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hx : x = 0
⊢ IsPrimitiveClassified h
[PROOFSTEP]
subst x
[GOAL]
y z : ℤ
h : PythagoreanTriple 0 y z
hc : Int.gcd 0 y = 1
⊢ IsPrimitiveClassified h
[PROOFSTEP]
change Nat.gcd 0 (Int.natAbs y) = 1 at hc 
[GOAL]
y z : ℤ
h : PythagoreanTriple 0 y z
hc : Nat.gcd 0 (Int.natAbs y) = 1
⊢ IsPrimitiveClassified h
[PROOFSTEP]
rw [Nat.gcd_zero_left (Int.natAbs y)] at hc 
[GOAL]
y z : ℤ
h : PythagoreanTriple 0 y z
hc : Int.natAbs y = 1
⊢ IsPrimitiveClassified h
[PROOFSTEP]
cases' Int.natAbs_eq y with hy hy
[GOAL]
case inl
y z : ℤ
h : PythagoreanTriple 0 y z
hc : Int.natAbs y = 1
hy : y = ↑(Int.natAbs y)
⊢ IsPrimitiveClassified h
[PROOFSTEP]
use 1, 0
[GOAL]
case h
y z : ℤ
h : PythagoreanTriple 0 y z
hc : Int.natAbs y = 1
hy : y = ↑(Int.natAbs y)
⊢ (0 = 1 ^ 2 - 0 ^ 2 ∧ y = 2 * 1 * 0 ∨ 0 = 2 * 1 * 0 ∧ y = 1 ^ 2 - 0 ^ 2) ∧
    Int.gcd 1 0 = 1 ∧ (1 % 2 = 0 ∧ 0 % 2 = 1 ∨ 1 % 2 = 1 ∧ 0 % 2 = 0)
[PROOFSTEP]
rw [hy, hc, Int.gcd_zero_right]
[GOAL]
case h
y z : ℤ
h : PythagoreanTriple 0 y z
hc : Int.natAbs y = 1
hy : y = ↑(Int.natAbs y)
⊢ (0 = 1 ^ 2 - 0 ^ 2 ∧ ↑1 = 2 * 1 * 0 ∨ 0 = 2 * 1 * 0 ∧ ↑1 = 1 ^ 2 - 0 ^ 2) ∧
    Int.natAbs 1 = 1 ∧ (1 % 2 = 0 ∧ 0 % 2 = 1 ∨ 1 % 2 = 1 ∧ 0 % 2 = 0)
[PROOFSTEP]
norm_num
[GOAL]
case inr
y z : ℤ
h : PythagoreanTriple 0 y z
hc : Int.natAbs y = 1
hy : y = -↑(Int.natAbs y)
⊢ IsPrimitiveClassified h
[PROOFSTEP]
use 0, 1
[GOAL]
case h
y z : ℤ
h : PythagoreanTriple 0 y z
hc : Int.natAbs y = 1
hy : y = -↑(Int.natAbs y)
⊢ (0 = 0 ^ 2 - 1 ^ 2 ∧ y = 2 * 0 * 1 ∨ 0 = 2 * 0 * 1 ∧ y = 0 ^ 2 - 1 ^ 2) ∧
    Int.gcd 0 1 = 1 ∧ (0 % 2 = 0 ∧ 1 % 2 = 1 ∨ 0 % 2 = 1 ∧ 1 % 2 = 0)
[PROOFSTEP]
rw [hy, hc, Int.gcd_zero_left]
[GOAL]
case h
y z : ℤ
h : PythagoreanTriple 0 y z
hc : Int.natAbs y = 1
hy : y = -↑(Int.natAbs y)
⊢ (0 = 0 ^ 2 - 1 ^ 2 ∧ -↑1 = 2 * 0 * 1 ∨ 0 = 2 * 0 * 1 ∧ -↑1 = 0 ^ 2 - 1 ^ 2) ∧
    Int.natAbs 1 = 1 ∧ (0 % 2 = 0 ∧ 1 % 2 = 1 ∨ 0 % 2 = 1 ∧ 1 % 2 = 0)
[PROOFSTEP]
norm_num
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
⊢ Int.gcd y z = 1
[PROOFSTEP]
by_contra H
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
H : ¬Int.gcd y z = 1
⊢ False
[PROOFSTEP]
obtain ⟨p, hp, hpy, hpz⟩ := Nat.Prime.not_coprime_iff_dvd.mp H
[GOAL]
case intro.intro.intro
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
H : ¬Int.gcd y z = 1
p : ℕ
hp : Nat.Prime p
hpy : p ∣ Int.natAbs y
hpz : p ∣ Int.natAbs z
⊢ False
[PROOFSTEP]
apply hp.not_dvd_one
[GOAL]
case intro.intro.intro
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
H : ¬Int.gcd y z = 1
p : ℕ
hp : Nat.Prime p
hpy : p ∣ Int.natAbs y
hpz : p ∣ Int.natAbs z
⊢ p ∣ 1
[PROOFSTEP]
rw [← hc]
[GOAL]
case intro.intro.intro
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
H : ¬Int.gcd y z = 1
p : ℕ
hp : Nat.Prime p
hpy : p ∣ Int.natAbs y
hpz : p ∣ Int.natAbs z
⊢ p ∣ Int.gcd x y
[PROOFSTEP]
apply Nat.dvd_gcd (Int.Prime.dvd_natAbs_of_coe_dvd_sq hp _ _) hpy
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
H : ¬Int.gcd y z = 1
p : ℕ
hp : Nat.Prime p
hpy : p ∣ Int.natAbs y
hpz : p ∣ Int.natAbs z
⊢ ↑p ∣ x ^ 2
[PROOFSTEP]
rw [sq, eq_sub_of_add_eq h]
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
H : ¬Int.gcd y z = 1
p : ℕ
hp : Nat.Prime p
hpy : p ∣ Int.natAbs y
hpz : p ∣ Int.natAbs z
⊢ ↑p ∣ z * z - y * y
[PROOFSTEP]
rw [← Int.coe_nat_dvd_left] at hpy hpz 
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
H : ¬Int.gcd y z = 1
p : ℕ
hp : Nat.Prime p
hpy : ↑p ∣ y
hpz : ↑p ∣ z
⊢ ↑p ∣ z * z - y * y
[PROOFSTEP]
exact dvd_sub (hpz.mul_right _) (hpy.mul_right _)
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x : K
⊢ (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).fst ^ 2 + (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ^ 2 =
    1
[PROOFSTEP]
field_simp [hk x, div_pow]
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x : K
⊢ (2 * x) ^ 2 + (1 - x ^ 2) ^ 2 = (1 + x ^ 2) ^ 2
[PROOFSTEP]
ring
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x : K
⊢ (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ≠ -1
[PROOFSTEP]
simp only [Ne.def, div_eq_iff (hk x), neg_mul, one_mul, neg_add, sub_eq_add_neg, add_left_inj]
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x : K
⊢ ¬1 = -1
[PROOFSTEP]
simpa only [eq_neg_iff_add_eq_zero, one_pow] using hk 1
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x : K
⊢ (fun p => (↑p).fst / ((↑p).snd + 1))
      ((fun x =>
          { val := (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)),
            property :=
              (_ :
                (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).fst ^ 2 +
                      (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ^ 2 =
                    1 ∧
                  (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ≠ -1) })
        x) =
    x
[PROOFSTEP]
have h2 : (1 + 1 : K) = 2 := by
  norm_num
    -- Porting note: rfl is not enough to close this
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x : K
⊢ 1 + 1 = 2
[PROOFSTEP]
norm_num
  -- Porting note: rfl is not enough to close this
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x : K
h2 : 1 + 1 = 2
⊢ (fun p => (↑p).fst / ((↑p).snd + 1))
      ((fun x =>
          { val := (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)),
            property :=
              (_ :
                (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).fst ^ 2 +
                      (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ^ 2 =
                    1 ∧
                  (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ≠ -1) })
        x) =
    x
[PROOFSTEP]
have h3 : (2 : K) ≠ 0 := by
  convert hk 1
  rw [one_pow 2, h2]
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x : K
h2 : 1 + 1 = 2
⊢ 2 ≠ 0
[PROOFSTEP]
convert hk 1
[GOAL]
case h.e'_2
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x : K
h2 : 1 + 1 = 2
⊢ 2 = 1 + 1 ^ 2
[PROOFSTEP]
rw [one_pow 2, h2]
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x : K
h2 : 1 + 1 = 2
h3 : 2 ≠ 0
⊢ (fun p => (↑p).fst / ((↑p).snd + 1))
      ((fun x =>
          { val := (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)),
            property :=
              (_ :
                (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).fst ^ 2 +
                      (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ^ 2 =
                    1 ∧
                  (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ≠ -1) })
        x) =
    x
[PROOFSTEP]
field_simp [hk x, h2, add_assoc, add_comm, add_sub_cancel'_right, mul_comm]
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x✝ : { p // p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1 }
x y : K
hxy : (x, y).fst ^ 2 + (x, y).snd ^ 2 = 1
hy : (x, y).snd ≠ -1
⊢ (fun x =>
        { val := (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)),
          property :=
            (_ :
              (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).fst ^ 2 +
                    (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ^ 2 =
                  1 ∧
                (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ≠ -1) })
      ((fun p => (↑p).fst / ((↑p).snd + 1))
        { val := (x, y), property := (_ : (x, y).fst ^ 2 + (x, y).snd ^ 2 = 1 ∧ (x, y).snd ≠ -1) }) =
    { val := (x, y), property := (_ : (x, y).fst ^ 2 + (x, y).snd ^ 2 = 1 ∧ (x, y).snd ≠ -1) }
[PROOFSTEP]
change x ^ 2 + y ^ 2 = 1 at hxy 
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x✝ : { p // p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1 }
x y : K
hy : (x, y).snd ≠ -1
hxy : x ^ 2 + y ^ 2 = 1
⊢ (fun x =>
        { val := (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)),
          property :=
            (_ :
              (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).fst ^ 2 +
                    (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ^ 2 =
                  1 ∧
                (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ≠ -1) })
      ((fun p => (↑p).fst / ((↑p).snd + 1))
        { val := (x, y), property := (_ : (x, y).fst ^ 2 + (x, y).snd ^ 2 = 1 ∧ (x, y).snd ≠ -1) }) =
    { val := (x, y), property := (_ : (x, y).fst ^ 2 + (x, y).snd ^ 2 = 1 ∧ (x, y).snd ≠ -1) }
[PROOFSTEP]
have h2 : y + 1 ≠ 0 := mt eq_neg_of_add_eq_zero_left hy
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x✝ : { p // p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1 }
x y : K
hy : (x, y).snd ≠ -1
hxy : x ^ 2 + y ^ 2 = 1
h2 : y + 1 ≠ 0
⊢ (fun x =>
        { val := (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)),
          property :=
            (_ :
              (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).fst ^ 2 +
                    (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ^ 2 =
                  1 ∧
                (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ≠ -1) })
      ((fun p => (↑p).fst / ((↑p).snd + 1))
        { val := (x, y), property := (_ : (x, y).fst ^ 2 + (x, y).snd ^ 2 = 1 ∧ (x, y).snd ≠ -1) }) =
    { val := (x, y), property := (_ : (x, y).fst ^ 2 + (x, y).snd ^ 2 = 1 ∧ (x, y).snd ≠ -1) }
[PROOFSTEP]
have h3 : (y + 1) ^ 2 + x ^ 2 = 2 * (y + 1) :=
  by
  rw [(add_neg_eq_iff_eq_add.mpr hxy.symm).symm]
  ring
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x✝ : { p // p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1 }
x y : K
hy : (x, y).snd ≠ -1
hxy : x ^ 2 + y ^ 2 = 1
h2 : y + 1 ≠ 0
⊢ (y + 1) ^ 2 + x ^ 2 = 2 * (y + 1)
[PROOFSTEP]
rw [(add_neg_eq_iff_eq_add.mpr hxy.symm).symm]
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x✝ : { p // p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1 }
x y : K
hy : (x, y).snd ≠ -1
hxy : x ^ 2 + y ^ 2 = 1
h2 : y + 1 ≠ 0
⊢ (y + 1) ^ 2 + (1 + -y ^ 2) = 2 * (y + 1)
[PROOFSTEP]
ring
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x✝ : { p // p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1 }
x y : K
hy : (x, y).snd ≠ -1
hxy : x ^ 2 + y ^ 2 = 1
h2 : y + 1 ≠ 0
h3 : (y + 1) ^ 2 + x ^ 2 = 2 * (y + 1)
⊢ (fun x =>
        { val := (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)),
          property :=
            (_ :
              (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).fst ^ 2 +
                    (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ^ 2 =
                  1 ∧
                (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ≠ -1) })
      ((fun p => (↑p).fst / ((↑p).snd + 1))
        { val := (x, y), property := (_ : (x, y).fst ^ 2 + (x, y).snd ^ 2 = 1 ∧ (x, y).snd ≠ -1) }) =
    { val := (x, y), property := (_ : (x, y).fst ^ 2 + (x, y).snd ^ 2 = 1 ∧ (x, y).snd ≠ -1) }
[PROOFSTEP]
have h4 : (2 : K) ≠ 0 := by
  convert hk 1
  rw [one_pow 2]
  ring
    -- Porting note: rfl is not enough to close this
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x✝ : { p // p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1 }
x y : K
hy : (x, y).snd ≠ -1
hxy : x ^ 2 + y ^ 2 = 1
h2 : y + 1 ≠ 0
h3 : (y + 1) ^ 2 + x ^ 2 = 2 * (y + 1)
⊢ 2 ≠ 0
[PROOFSTEP]
convert hk 1
[GOAL]
case h.e'_2
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x✝ : { p // p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1 }
x y : K
hy : (x, y).snd ≠ -1
hxy : x ^ 2 + y ^ 2 = 1
h2 : y + 1 ≠ 0
h3 : (y + 1) ^ 2 + x ^ 2 = 2 * (y + 1)
⊢ 2 = 1 + 1 ^ 2
[PROOFSTEP]
rw [one_pow 2]
[GOAL]
case h.e'_2
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x✝ : { p // p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1 }
x y : K
hy : (x, y).snd ≠ -1
hxy : x ^ 2 + y ^ 2 = 1
h2 : y + 1 ≠ 0
h3 : (y + 1) ^ 2 + x ^ 2 = 2 * (y + 1)
⊢ 2 = 1 + 1
[PROOFSTEP]
ring
  -- Porting note: rfl is not enough to close this
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x✝ : { p // p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1 }
x y : K
hy : (x, y).snd ≠ -1
hxy : x ^ 2 + y ^ 2 = 1
h2 : y + 1 ≠ 0
h3 : (y + 1) ^ 2 + x ^ 2 = 2 * (y + 1)
h4 : 2 ≠ 0
⊢ (fun x =>
        { val := (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)),
          property :=
            (_ :
              (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).fst ^ 2 +
                    (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ^ 2 =
                  1 ∧
                (2 * x / (1 + x ^ 2), (1 - x ^ 2) / (1 + x ^ 2)).snd ≠ -1) })
      ((fun p => (↑p).fst / ((↑p).snd + 1))
        { val := (x, y), property := (_ : (x, y).fst ^ 2 + (x, y).snd ^ 2 = 1 ∧ (x, y).snd ≠ -1) }) =
    { val := (x, y), property := (_ : (x, y).fst ^ 2 + (x, y).snd ^ 2 = 1 ∧ (x, y).snd ≠ -1) }
[PROOFSTEP]
simp only [Prod.mk.inj_iff, Subtype.mk_eq_mk]
[GOAL]
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x✝ : { p // p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1 }
x y : K
hy : (x, y).snd ≠ -1
hxy : x ^ 2 + y ^ 2 = 1
h2 : y + 1 ≠ 0
h3 : (y + 1) ^ 2 + x ^ 2 = 2 * (y + 1)
h4 : 2 ≠ 0
⊢ 2 * (x / (y + 1)) / (1 + (x / (y + 1)) ^ 2) = x ∧ (1 - (x / (y + 1)) ^ 2) / (1 + (x / (y + 1)) ^ 2) = y
[PROOFSTEP]
constructor
[GOAL]
case left
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x✝ : { p // p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1 }
x y : K
hy : (x, y).snd ≠ -1
hxy : x ^ 2 + y ^ 2 = 1
h2 : y + 1 ≠ 0
h3 : (y + 1) ^ 2 + x ^ 2 = 2 * (y + 1)
h4 : 2 ≠ 0
⊢ 2 * (x / (y + 1)) / (1 + (x / (y + 1)) ^ 2) = x
[PROOFSTEP]
field_simp [h3]
[GOAL]
case left
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x✝ : { p // p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1 }
x y : K
hy : (x, y).snd ≠ -1
hxy : x ^ 2 + y ^ 2 = 1
h2 : y + 1 ≠ 0
h3 : (y + 1) ^ 2 + x ^ 2 = 2 * (y + 1)
h4 : 2 ≠ 0
⊢ 2 * x * (y + 1) ^ 2 = x * ((y + 1) * (2 * (y + 1)))
[PROOFSTEP]
ring
[GOAL]
case right
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x✝ : { p // p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1 }
x y : K
hy : (x, y).snd ≠ -1
hxy : x ^ 2 + y ^ 2 = 1
h2 : y + 1 ≠ 0
h3 : (y + 1) ^ 2 + x ^ 2 = 2 * (y + 1)
h4 : 2 ≠ 0
⊢ (1 - (x / (y + 1)) ^ 2) / (1 + (x / (y + 1)) ^ 2) = y
[PROOFSTEP]
field_simp [h3]
[GOAL]
case right
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x✝ : { p // p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1 }
x y : K
hy : (x, y).snd ≠ -1
hxy : x ^ 2 + y ^ 2 = 1
h2 : y + 1 ≠ 0
h3 : (y + 1) ^ 2 + x ^ 2 = 2 * (y + 1)
h4 : 2 ≠ 0
⊢ (y + 1) ^ 2 - x ^ 2 = y * (2 * (y + 1))
[PROOFSTEP]
rw [← add_neg_eq_iff_eq_add.mpr hxy.symm]
[GOAL]
case right
K : Type u_1
inst✝ : Field K
hk : ∀ (x : K), 1 + x ^ 2 ≠ 0
x✝ : { p // p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1 }
x y : K
hy : (x, y).snd ≠ -1
hxy : x ^ 2 + y ^ 2 = 1
h2 : y + 1 ≠ 0
h3 : (y + 1) ^ 2 + x ^ 2 = 2 * (y + 1)
h4 : 2 ≠ 0
⊢ (y + 1) ^ 2 - (1 + -y ^ 2) = y * (2 * (y + 1))
[PROOFSTEP]
ring
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
⊢ Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
[PROOFSTEP]
by_contra H
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
⊢ False
[PROOFSTEP]
obtain ⟨p, hp, hp1, hp2⟩ := Nat.Prime.not_coprime_iff_dvd.mp H
[GOAL]
case intro.intro.intro
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : p ∣ Int.natAbs (m ^ 2 - n ^ 2)
hp2 : p ∣ Int.natAbs (m ^ 2 + n ^ 2)
⊢ False
[PROOFSTEP]
rw [← Int.coe_nat_dvd_left] at hp1 hp2 
[GOAL]
case intro.intro.intro
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
⊢ False
[PROOFSTEP]
have h2m : (p : ℤ) ∣ 2 * m ^ 2 := by
  convert dvd_add hp2 hp1 using 1
  ring
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
⊢ ↑p ∣ 2 * m ^ 2
[PROOFSTEP]
convert dvd_add hp2 hp1 using 1
[GOAL]
case h.e'_4
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
⊢ 2 * m ^ 2 = m ^ 2 + n ^ 2 + (m ^ 2 - n ^ 2)
[PROOFSTEP]
ring
[GOAL]
case intro.intro.intro
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
h2m : ↑p ∣ 2 * m ^ 2
⊢ False
[PROOFSTEP]
have h2n : (p : ℤ) ∣ 2 * n ^ 2 := by
  convert dvd_sub hp2 hp1 using 1
  ring
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
h2m : ↑p ∣ 2 * m ^ 2
⊢ ↑p ∣ 2 * n ^ 2
[PROOFSTEP]
convert dvd_sub hp2 hp1 using 1
[GOAL]
case h.e'_4
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
h2m : ↑p ∣ 2 * m ^ 2
⊢ 2 * n ^ 2 = m ^ 2 + n ^ 2 - (m ^ 2 - n ^ 2)
[PROOFSTEP]
ring
[GOAL]
case intro.intro.intro
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
h2m : ↑p ∣ 2 * m ^ 2
h2n : ↑p ∣ 2 * n ^ 2
⊢ False
[PROOFSTEP]
have hmc : p = 2 ∨ p ∣ Int.natAbs m := prime_two_or_dvd_of_dvd_two_mul_pow_self_two hp h2m
[GOAL]
case intro.intro.intro
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
h2m : ↑p ∣ 2 * m ^ 2
h2n : ↑p ∣ 2 * n ^ 2
hmc : p = 2 ∨ p ∣ Int.natAbs m
⊢ False
[PROOFSTEP]
have hnc : p = 2 ∨ p ∣ Int.natAbs n := prime_two_or_dvd_of_dvd_two_mul_pow_self_two hp h2n
[GOAL]
case intro.intro.intro
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
h2m : ↑p ∣ 2 * m ^ 2
h2n : ↑p ∣ 2 * n ^ 2
hmc : p = 2 ∨ p ∣ Int.natAbs m
hnc : p = 2 ∨ p ∣ Int.natAbs n
⊢ False
[PROOFSTEP]
by_cases h2 :
  p =
    2
      -- Porting note: norm_num is not enough to close h3
[GOAL]
case pos
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
h2m : ↑p ∣ 2 * m ^ 2
h2n : ↑p ∣ 2 * n ^ 2
hmc : p = 2 ∨ p ∣ Int.natAbs m
hnc : p = 2 ∨ p ∣ Int.natAbs n
h2 : p = 2
⊢ False
[PROOFSTEP]
have h3 : (m ^ 2 + n ^ 2) % 2 = 1 := by field_simp [sq, Int.add_emod, Int.mul_emod, hm, hn]
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
h2m : ↑p ∣ 2 * m ^ 2
h2n : ↑p ∣ 2 * n ^ 2
hmc : p = 2 ∨ p ∣ Int.natAbs m
hnc : p = 2 ∨ p ∣ Int.natAbs n
h2 : p = 2
⊢ (m ^ 2 + n ^ 2) % 2 = 1
[PROOFSTEP]
field_simp [sq, Int.add_emod, Int.mul_emod, hm, hn]
[GOAL]
case pos
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
h2m : ↑p ∣ 2 * m ^ 2
h2n : ↑p ∣ 2 * n ^ 2
hmc : p = 2 ∨ p ∣ Int.natAbs m
hnc : p = 2 ∨ p ∣ Int.natAbs n
h2 : p = 2
h3 : (m ^ 2 + n ^ 2) % 2 = 1
⊢ False
[PROOFSTEP]
have h4 : (m ^ 2 + n ^ 2) % 2 = 0 := by
  apply Int.emod_eq_zero_of_dvd
  rwa [h2] at hp2 
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
h2m : ↑p ∣ 2 * m ^ 2
h2n : ↑p ∣ 2 * n ^ 2
hmc : p = 2 ∨ p ∣ Int.natAbs m
hnc : p = 2 ∨ p ∣ Int.natAbs n
h2 : p = 2
h3 : (m ^ 2 + n ^ 2) % 2 = 1
⊢ (m ^ 2 + n ^ 2) % 2 = 0
[PROOFSTEP]
apply Int.emod_eq_zero_of_dvd
[GOAL]
case a
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
h2m : ↑p ∣ 2 * m ^ 2
h2n : ↑p ∣ 2 * n ^ 2
hmc : p = 2 ∨ p ∣ Int.natAbs m
hnc : p = 2 ∨ p ∣ Int.natAbs n
h2 : p = 2
h3 : (m ^ 2 + n ^ 2) % 2 = 1
⊢ 2 ∣ m ^ 2 + n ^ 2
[PROOFSTEP]
rwa [h2] at hp2 
[GOAL]
case pos
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
h2m : ↑p ∣ 2 * m ^ 2
h2n : ↑p ∣ 2 * n ^ 2
hmc : p = 2 ∨ p ∣ Int.natAbs m
hnc : p = 2 ∨ p ∣ Int.natAbs n
h2 : p = 2
h3 : (m ^ 2 + n ^ 2) % 2 = 1
h4 : (m ^ 2 + n ^ 2) % 2 = 0
⊢ False
[PROOFSTEP]
rw [h4] at h3 
[GOAL]
case pos
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
h2m : ↑p ∣ 2 * m ^ 2
h2n : ↑p ∣ 2 * n ^ 2
hmc : p = 2 ∨ p ∣ Int.natAbs m
hnc : p = 2 ∨ p ∣ Int.natAbs n
h2 : p = 2
h3 : 0 = 1
h4 : (m ^ 2 + n ^ 2) % 2 = 0
⊢ False
[PROOFSTEP]
exact zero_ne_one h3
[GOAL]
case neg
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
h2m : ↑p ∣ 2 * m ^ 2
h2n : ↑p ∣ 2 * n ^ 2
hmc : p = 2 ∨ p ∣ Int.natAbs m
hnc : p = 2 ∨ p ∣ Int.natAbs n
h2 : ¬p = 2
⊢ False
[PROOFSTEP]
apply hp.not_dvd_one
[GOAL]
case neg
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
h2m : ↑p ∣ 2 * m ^ 2
h2n : ↑p ∣ 2 * n ^ 2
hmc : p = 2 ∨ p ∣ Int.natAbs m
hnc : p = 2 ∨ p ∣ Int.natAbs n
h2 : ¬p = 2
⊢ p ∣ 1
[PROOFSTEP]
rw [← h]
[GOAL]
case neg
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ m ^ 2 + n ^ 2
h2m : ↑p ∣ 2 * m ^ 2
h2n : ↑p ∣ 2 * n ^ 2
hmc : p = 2 ∨ p ∣ Int.natAbs m
hnc : p = 2 ∨ p ∣ Int.natAbs n
h2 : ¬p = 2
⊢ p ∣ Int.gcd m n
[PROOFSTEP]
exact Nat.dvd_gcd (Or.resolve_left hmc h2) (Or.resolve_left hnc h2)
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 1
hn : n % 2 = 0
⊢ Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
[PROOFSTEP]
rw [Int.gcd, ← Int.natAbs_neg (m ^ 2 - n ^ 2)]
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 1
hn : n % 2 = 0
⊢ Nat.gcd (Int.natAbs (-(m ^ 2 - n ^ 2))) (Int.natAbs (m ^ 2 + n ^ 2)) = 1
[PROOFSTEP]
rw [(by ring : -(m ^ 2 - n ^ 2) = n ^ 2 - m ^ 2), add_comm]
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 1
hn : n % 2 = 0
⊢ -(m ^ 2 - n ^ 2) = n ^ 2 - m ^ 2
[PROOFSTEP]
ring
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 1
hn : n % 2 = 0
⊢ Nat.gcd (Int.natAbs (n ^ 2 - m ^ 2)) (Int.natAbs (n ^ 2 + m ^ 2)) = 1
[PROOFSTEP]
apply coprime_sq_sub_sq_add_of_even_odd _ hn hm
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 1
hn : n % 2 = 0
⊢ Int.gcd n m = 1
[PROOFSTEP]
rwa [Int.gcd_comm]
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
⊢ Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
[PROOFSTEP]
by_contra H
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
⊢ False
[PROOFSTEP]
obtain ⟨p, hp, hp1, hp2⟩ := Nat.Prime.not_coprime_iff_dvd.mp H
[GOAL]
case intro.intro.intro
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : p ∣ Int.natAbs (m ^ 2 - n ^ 2)
hp2 : p ∣ Int.natAbs (2 * m * n)
⊢ False
[PROOFSTEP]
rw [← Int.coe_nat_dvd_left] at hp1 hp2 
[GOAL]
case intro.intro.intro
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
⊢ False
[PROOFSTEP]
have hnp : ¬(p : ℤ) ∣ Int.gcd m n := by
  rw [h]
  norm_cast
  exact mt Nat.dvd_one.mp (Nat.Prime.ne_one hp)
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
⊢ ¬↑p ∣ ↑(Int.gcd m n)
[PROOFSTEP]
rw [h]
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
⊢ ¬↑p ∣ ↑1
[PROOFSTEP]
norm_cast
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
⊢ ¬p ∣ 1
[PROOFSTEP]
exact mt Nat.dvd_one.mp (Nat.Prime.ne_one hp)
[GOAL]
case intro.intro.intro
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd m n)
⊢ False
[PROOFSTEP]
cases' Int.Prime.dvd_mul hp hp2 with hp2m hpn
[GOAL]
case intro.intro.intro.inl
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd m n)
hp2m : p ∣ Int.natAbs (2 * m)
⊢ False
[PROOFSTEP]
rw [Int.natAbs_mul] at hp2m 
[GOAL]
case intro.intro.intro.inl
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd m n)
hp2m : p ∣ Int.natAbs 2 * Int.natAbs m
⊢ False
[PROOFSTEP]
cases' (Nat.Prime.dvd_mul hp).mp hp2m with hp2 hpm
[GOAL]
case intro.intro.intro.inl.inl
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2✝ : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd m n)
hp2m : p ∣ Int.natAbs 2 * Int.natAbs m
hp2 : p ∣ Int.natAbs 2
⊢ False
[PROOFSTEP]
have hp2' : p = 2 := (Nat.le_of_dvd zero_lt_two hp2).antisymm hp.two_le
[GOAL]
case intro.intro.intro.inl.inl
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2✝ : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd m n)
hp2m : p ∣ Int.natAbs 2 * Int.natAbs m
hp2 : p ∣ Int.natAbs 2
hp2' : p = 2
⊢ False
[PROOFSTEP]
revert hp1
[GOAL]
case intro.intro.intro.inl.inl
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp2✝ : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd m n)
hp2m : p ∣ Int.natAbs 2 * Int.natAbs m
hp2 : p ∣ Int.natAbs 2
hp2' : p = 2
⊢ ↑p ∣ m ^ 2 - n ^ 2 → False
[PROOFSTEP]
rw [hp2']
[GOAL]
case intro.intro.intro.inl.inl
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp2✝ : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd m n)
hp2m : p ∣ Int.natAbs 2 * Int.natAbs m
hp2 : p ∣ Int.natAbs 2
hp2' : p = 2
⊢ ↑2 ∣ m ^ 2 - n ^ 2 → False
[PROOFSTEP]
apply mt Int.emod_eq_zero_of_dvd
[GOAL]
case intro.intro.intro.inl.inl
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp2✝ : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd m n)
hp2m : p ∣ Int.natAbs 2 * Int.natAbs m
hp2 : p ∣ Int.natAbs 2
hp2' : p = 2
⊢ ¬(m ^ 2 - n ^ 2) % ↑2 = 0
[PROOFSTEP]
field_simp [sq, Int.sub_emod, Int.mul_emod, hm, hn]
[GOAL]
case intro.intro.intro.inl.inr
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd m n)
hp2m : p ∣ Int.natAbs 2 * Int.natAbs m
hpm : p ∣ Int.natAbs m
⊢ False
[PROOFSTEP]
apply mt (Int.dvd_gcd (Int.coe_nat_dvd_left.mpr hpm)) hnp
[GOAL]
case intro.intro.intro.inl.inr
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd m n)
hp2m : p ∣ Int.natAbs 2 * Int.natAbs m
hpm : p ∣ Int.natAbs m
⊢ ↑p ∣ n
[PROOFSTEP]
apply (or_self_iff _).mp
[GOAL]
case intro.intro.intro.inl.inr
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd m n)
hp2m : p ∣ Int.natAbs 2 * Int.natAbs m
hpm : p ∣ Int.natAbs m
⊢ ↑p ∣ n ∨ ↑p ∣ n
[PROOFSTEP]
apply Int.Prime.dvd_mul' hp
[GOAL]
case intro.intro.intro.inl.inr
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd m n)
hp2m : p ∣ Int.natAbs 2 * Int.natAbs m
hpm : p ∣ Int.natAbs m
⊢ ↑p ∣ n * n
[PROOFSTEP]
rw [(by ring : n * n = -(m ^ 2 - n ^ 2) + m * m)]
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd m n)
hp2m : p ∣ Int.natAbs 2 * Int.natAbs m
hpm : p ∣ Int.natAbs m
⊢ n * n = -(m ^ 2 - n ^ 2) + m * m
[PROOFSTEP]
ring
[GOAL]
case intro.intro.intro.inl.inr
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd m n)
hp2m : p ∣ Int.natAbs 2 * Int.natAbs m
hpm : p ∣ Int.natAbs m
⊢ ↑p ∣ -(m ^ 2 - n ^ 2) + m * m
[PROOFSTEP]
exact hp1.neg_right.add ((Int.coe_nat_dvd_left.2 hpm).mul_right _)
[GOAL]
case intro.intro.intro.inr
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd m n)
hpn : p ∣ Int.natAbs n
⊢ False
[PROOFSTEP]
rw [Int.gcd_comm] at hnp 
[GOAL]
case intro.intro.intro.inr
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd n m)
hpn : p ∣ Int.natAbs n
⊢ False
[PROOFSTEP]
apply mt (Int.dvd_gcd (Int.coe_nat_dvd_left.mpr hpn)) hnp
[GOAL]
case intro.intro.intro.inr
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd n m)
hpn : p ∣ Int.natAbs n
⊢ ↑p ∣ m
[PROOFSTEP]
apply (or_self_iff _).mp
[GOAL]
case intro.intro.intro.inr
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd n m)
hpn : p ∣ Int.natAbs n
⊢ ↑p ∣ m ∨ ↑p ∣ m
[PROOFSTEP]
apply Int.Prime.dvd_mul' hp
[GOAL]
case intro.intro.intro.inr
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd n m)
hpn : p ∣ Int.natAbs n
⊢ ↑p ∣ m * m
[PROOFSTEP]
rw [(by ring : m * m = m ^ 2 - n ^ 2 + n * n)]
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd n m)
hpn : p ∣ Int.natAbs n
⊢ m * m = m ^ 2 - n ^ 2 + n * n
[PROOFSTEP]
ring
[GOAL]
case intro.intro.intro.inr
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd n m)
hpn : p ∣ Int.natAbs n
⊢ ↑p ∣ m ^ 2 - n ^ 2 + n * n
[PROOFSTEP]
apply dvd_add hp1
[GOAL]
case intro.intro.intro.inr
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 0
hn : n % 2 = 1
H : ¬Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ m ^ 2 - n ^ 2
hp2 : ↑p ∣ 2 * m * n
hnp : ¬↑p ∣ ↑(Int.gcd n m)
hpn : p ∣ Int.natAbs n
⊢ ↑p ∣ n * n
[PROOFSTEP]
exact (Int.coe_nat_dvd_left.mpr hpn).mul_right n
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 1
hn : n % 2 = 0
⊢ Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
[PROOFSTEP]
rw [Int.gcd, ← Int.natAbs_neg (m ^ 2 - n ^ 2)]
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 1
hn : n % 2 = 0
⊢ Nat.gcd (Int.natAbs (-(m ^ 2 - n ^ 2))) (Int.natAbs (2 * m * n)) = 1
[PROOFSTEP]
rw [(by ring : 2 * m * n = 2 * n * m), (by ring : -(m ^ 2 - n ^ 2) = n ^ 2 - m ^ 2)]
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 1
hn : n % 2 = 0
⊢ 2 * m * n = 2 * n * m
[PROOFSTEP]
ring
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 1
hn : n % 2 = 0
⊢ -(m ^ 2 - n ^ 2) = n ^ 2 - m ^ 2
[PROOFSTEP]
ring
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 1
hn : n % 2 = 0
⊢ Nat.gcd (Int.natAbs (n ^ 2 - m ^ 2)) (Int.natAbs (2 * n * m)) = 1
[PROOFSTEP]
apply coprime_sq_sub_mul_of_even_odd _ hn hm
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 1
hn : n % 2 = 0
⊢ Int.gcd n m = 1
[PROOFSTEP]
rwa [Int.gcd_comm]
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hmn : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
[PROOFSTEP]
cases' hmn with h1 h2
[GOAL]
case inl
m n : ℤ
h : Int.gcd m n = 1
h1 : m % 2 = 0 ∧ n % 2 = 1
⊢ Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
[PROOFSTEP]
exact coprime_sq_sub_mul_of_even_odd h h1.left h1.right
[GOAL]
case inr
m n : ℤ
h : Int.gcd m n = 1
h2 : m % 2 = 1 ∧ n % 2 = 0
⊢ Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
[PROOFSTEP]
exact coprime_sq_sub_mul_of_odd_even h h2.left h2.right
[GOAL]
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 1
hn : n % 2 = 1
⊢ 2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
[PROOFSTEP]
cases' exists_eq_mul_left_of_dvd (Int.dvd_sub_of_emod_eq hm) with m0 hm2
[GOAL]
case intro
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 1
hn : n % 2 = 1
m0 : ℤ
hm2 : m - 1 = m0 * 2
⊢ 2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
[PROOFSTEP]
cases' exists_eq_mul_left_of_dvd (Int.dvd_sub_of_emod_eq hn) with n0 hn2
[GOAL]
case intro.intro
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 1
hn : n % 2 = 1
m0 : ℤ
hm2 : m - 1 = m0 * 2
n0 : ℤ
hn2 : n - 1 = n0 * 2
⊢ 2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
[PROOFSTEP]
rw [sub_eq_iff_eq_add] at hm2 hn2 
[GOAL]
case intro.intro
m n : ℤ
h : Int.gcd m n = 1
hm : m % 2 = 1
hn : n % 2 = 1
m0 : ℤ
hm2 : m = m0 * 2 + 1
n0 : ℤ
hn2 : n = n0 * 2 + 1
⊢ 2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
[PROOFSTEP]
subst m
[GOAL]
case intro.intro
n : ℤ
hn : n % 2 = 1
m0 n0 : ℤ
hn2 : n = n0 * 2 + 1
h : Int.gcd (m0 * 2 + 1) n = 1
hm : (m0 * 2 + 1) % 2 = 1
⊢ 2 ∣ (m0 * 2 + 1) ^ 2 + n ^ 2 ∧
    2 ∣ (m0 * 2 + 1) ^ 2 - n ^ 2 ∧
      ((m0 * 2 + 1) ^ 2 - n ^ 2) / 2 % 2 = 0 ∧
        Int.gcd (((m0 * 2 + 1) ^ 2 - n ^ 2) / 2) (((m0 * 2 + 1) ^ 2 + n ^ 2) / 2) = 1
[PROOFSTEP]
subst n
[GOAL]
case intro.intro
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
⊢ 2 ∣ (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 ∧
    2 ∣ (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 ∧
      ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0 ∧
        Int.gcd (((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2) (((m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2) / 2) = 1
[PROOFSTEP]
have h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1) := by ring
[GOAL]
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
⊢ (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
[PROOFSTEP]
ring
[GOAL]
case intro.intro
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
⊢ 2 ∣ (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 ∧
    2 ∣ (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 ∧
      ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0 ∧
        Int.gcd (((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2) (((m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2) / 2) = 1
[PROOFSTEP]
have h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)) := by ring
[GOAL]
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
⊢ (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
[PROOFSTEP]
ring
[GOAL]
case intro.intro
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
⊢ 2 ∣ (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 ∧
    2 ∣ (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 ∧
      ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0 ∧
        Int.gcd (((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2) (((m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2) / 2) = 1
[PROOFSTEP]
have h3 : ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0 :=
  by
  rw [h2, Int.mul_ediv_cancel_left, Int.mul_emod_right]
  exact by decide
[GOAL]
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
⊢ ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0
[PROOFSTEP]
rw [h2, Int.mul_ediv_cancel_left, Int.mul_emod_right]
[GOAL]
case H
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
⊢ 2 ≠ 0
[PROOFSTEP]
exact by decide
[GOAL]
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
⊢ 2 ≠ 0
[PROOFSTEP]
decide
[GOAL]
case intro.intro
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
h3 : ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0
⊢ 2 ∣ (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 ∧
    2 ∣ (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 ∧
      ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0 ∧
        Int.gcd (((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2) (((m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2) / 2) = 1
[PROOFSTEP]
refine' ⟨⟨_, h1⟩, ⟨_, h2⟩, h3, _⟩
[GOAL]
case intro.intro
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
h3 : ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0
⊢ Int.gcd (((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2) (((m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2) / 2) = 1
[PROOFSTEP]
have h20 : (2 : ℤ) ≠ 0 := by decide
[GOAL]
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
h3 : ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0
⊢ 2 ≠ 0
[PROOFSTEP]
decide
[GOAL]
case intro.intro
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
h3 : ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0
h20 : 2 ≠ 0
⊢ Int.gcd (((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2) (((m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2) / 2) = 1
[PROOFSTEP]
rw [h1, h2, Int.mul_ediv_cancel_left _ h20, Int.mul_ediv_cancel_left _ h20]
[GOAL]
case intro.intro
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
h3 : ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0
h20 : 2 ≠ 0
⊢ Int.gcd (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)) (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1) = 1
[PROOFSTEP]
by_contra h4
[GOAL]
case intro.intro
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
h3 : ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0
h20 : 2 ≠ 0
h4 : ¬Int.gcd (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)) (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1) = 1
⊢ False
[PROOFSTEP]
obtain ⟨p, hp, hp1, hp2⟩ := Nat.Prime.not_coprime_iff_dvd.mp h4
[GOAL]
case intro.intro.intro.intro.intro
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
h3 : ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0
h20 : 2 ≠ 0
h4 : ¬Int.gcd (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)) (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1) = 1
p : ℕ
hp : Nat.Prime p
hp1 : p ∣ Int.natAbs (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
hp2 : p ∣ Int.natAbs (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
⊢ False
[PROOFSTEP]
apply hp.not_dvd_one
[GOAL]
case intro.intro.intro.intro.intro
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
h3 : ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0
h20 : 2 ≠ 0
h4 : ¬Int.gcd (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)) (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1) = 1
p : ℕ
hp : Nat.Prime p
hp1 : p ∣ Int.natAbs (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
hp2 : p ∣ Int.natAbs (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
⊢ p ∣ 1
[PROOFSTEP]
rw [← h]
[GOAL]
case intro.intro.intro.intro.intro
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
h3 : ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0
h20 : 2 ≠ 0
h4 : ¬Int.gcd (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)) (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1) = 1
p : ℕ
hp : Nat.Prime p
hp1 : p ∣ Int.natAbs (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
hp2 : p ∣ Int.natAbs (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
⊢ p ∣ Int.gcd (m0 * 2 + 1) (n0 * 2 + 1)
[PROOFSTEP]
rw [← Int.coe_nat_dvd_left] at hp1 hp2 
[GOAL]
case intro.intro.intro.intro.intro
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
h3 : ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0
h20 : 2 ≠ 0
h4 : ¬Int.gcd (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)) (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ 2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)
hp2 : ↑p ∣ 2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1
⊢ p ∣ Int.gcd (m0 * 2 + 1) (n0 * 2 + 1)
[PROOFSTEP]
apply Nat.dvd_gcd
[GOAL]
case intro.intro.intro.intro.intro.a
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
h3 : ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0
h20 : 2 ≠ 0
h4 : ¬Int.gcd (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)) (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ 2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)
hp2 : ↑p ∣ 2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1
⊢ p ∣ Int.natAbs (m0 * 2 + 1)
[PROOFSTEP]
apply Int.Prime.dvd_natAbs_of_coe_dvd_sq hp
[GOAL]
case intro.intro.intro.intro.intro.a.h
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
h3 : ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0
h20 : 2 ≠ 0
h4 : ¬Int.gcd (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)) (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ 2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)
hp2 : ↑p ∣ 2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1
⊢ ↑p ∣ (m0 * 2 + 1) ^ 2
[PROOFSTEP]
convert dvd_add hp1 hp2
[GOAL]
case h.e'_4
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
h3 : ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0
h20 : 2 ≠ 0
h4 : ¬Int.gcd (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)) (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ 2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)
hp2 : ↑p ∣ 2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1
⊢ (m0 * 2 + 1) ^ 2 = 2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0) + (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
[PROOFSTEP]
ring
[GOAL]
case intro.intro.intro.intro.intro.a
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
h3 : ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0
h20 : 2 ≠ 0
h4 : ¬Int.gcd (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)) (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ 2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)
hp2 : ↑p ∣ 2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1
⊢ p ∣ Int.natAbs (n0 * 2 + 1)
[PROOFSTEP]
apply Int.Prime.dvd_natAbs_of_coe_dvd_sq hp
[GOAL]
case intro.intro.intro.intro.intro.a.h
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
h3 : ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0
h20 : 2 ≠ 0
h4 : ¬Int.gcd (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)) (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ 2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)
hp2 : ↑p ∣ 2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1
⊢ ↑p ∣ (n0 * 2 + 1) ^ 2
[PROOFSTEP]
convert dvd_sub hp2 hp1
[GOAL]
case h.e'_4
m0 n0 : ℤ
hm : (m0 * 2 + 1) % 2 = 1
hn : (n0 * 2 + 1) % 2 = 1
h : Int.gcd (m0 * 2 + 1) (n0 * 2 + 1) = 1
h1 : (m0 * 2 + 1) ^ 2 + (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1)
h2 : (m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2 = 2 * (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0))
h3 : ((m0 * 2 + 1) ^ 2 - (n0 * 2 + 1) ^ 2) / 2 % 2 = 0
h20 : 2 ≠ 0
h4 : ¬Int.gcd (2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)) (2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1) = 1
p : ℕ
hp : Nat.Prime p
hp1 : ↑p ∣ 2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)
hp2 : ↑p ∣ 2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1
⊢ (n0 * 2 + 1) ^ 2 = 2 * (m0 ^ 2 + n0 ^ 2 + m0 + n0) + 1 - 2 * (m0 ^ 2 - n0 ^ 2 + m0 - n0)
[PROOFSTEP]
ring
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
m n : ℤ
hm2n2 : 0 < m ^ 2 + n ^ 2
hv2 : ↑x / ↑z = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hw2 : ↑y / ↑z = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
H : Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have hz : z ≠ 0
[GOAL]
case hz
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
m n : ℤ
hm2n2 : 0 < m ^ 2 + n ^ 2
hv2 : ↑x / ↑z = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hw2 : ↑y / ↑z = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
H : Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ z ≠ 0
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
m n : ℤ
hm2n2 : 0 < m ^ 2 + n ^ 2
hv2 : ↑x / ↑z = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hw2 : ↑y / ↑z = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
H : Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hz : z ≠ 0
⊢ IsPrimitiveClassified h
[PROOFSTEP]
apply ne_of_gt hzpos
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
m n : ℤ
hm2n2 : 0 < m ^ 2 + n ^ 2
hv2 : ↑x / ↑z = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hw2 : ↑y / ↑z = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
H : Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hz : z ≠ 0
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have h2 : y = m ^ 2 - n ^ 2 ∧ z = m ^ 2 + n ^ 2 :=
  by
  apply Rat.div_int_inj hzpos hm2n2 (h.coprime_of_coprime hc) H
  rw [hw2]
  norm_cast
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
m n : ℤ
hm2n2 : 0 < m ^ 2 + n ^ 2
hv2 : ↑x / ↑z = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hw2 : ↑y / ↑z = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
H : Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hz : z ≠ 0
⊢ y = m ^ 2 - n ^ 2 ∧ z = m ^ 2 + n ^ 2
[PROOFSTEP]
apply Rat.div_int_inj hzpos hm2n2 (h.coprime_of_coprime hc) H
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
m n : ℤ
hm2n2 : 0 < m ^ 2 + n ^ 2
hv2 : ↑x / ↑z = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hw2 : ↑y / ↑z = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
H : Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hz : z ≠ 0
⊢ ↑y / ↑z = ↑(m ^ 2 - n ^ 2) / ↑(m ^ 2 + n ^ 2)
[PROOFSTEP]
rw [hw2]
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
m n : ℤ
hm2n2 : 0 < m ^ 2 + n ^ 2
hv2 : ↑x / ↑z = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hw2 : ↑y / ↑z = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
H : Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hz : z ≠ 0
⊢ (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2) = ↑(m ^ 2 - n ^ 2) / ↑(m ^ 2 + n ^ 2)
[PROOFSTEP]
norm_cast
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
m n : ℤ
hm2n2 : 0 < m ^ 2 + n ^ 2
hv2 : ↑x / ↑z = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hw2 : ↑y / ↑z = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
H : Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hz : z ≠ 0
h2 : y = m ^ 2 - n ^ 2 ∧ z = m ^ 2 + n ^ 2
⊢ IsPrimitiveClassified h
[PROOFSTEP]
use m, n
[GOAL]
case h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
m n : ℤ
hm2n2 : 0 < m ^ 2 + n ^ 2
hv2 : ↑x / ↑z = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hw2 : ↑y / ↑z = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
H : Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hz : z ≠ 0
h2 : y = m ^ 2 - n ^ 2 ∧ z = m ^ 2 + n ^ 2
⊢ (x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2) ∧
    Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)
[PROOFSTEP]
apply And.intro _ (And.intro co pp)
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
m n : ℤ
hm2n2 : 0 < m ^ 2 + n ^ 2
hv2 : ↑x / ↑z = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hw2 : ↑y / ↑z = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
H : Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hz : z ≠ 0
h2 : y = m ^ 2 - n ^ 2 ∧ z = m ^ 2 + n ^ 2
⊢ x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2
[PROOFSTEP]
right
[GOAL]
case h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
m n : ℤ
hm2n2 : 0 < m ^ 2 + n ^ 2
hv2 : ↑x / ↑z = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hw2 : ↑y / ↑z = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
H : Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hz : z ≠ 0
h2 : y = m ^ 2 - n ^ 2 ∧ z = m ^ 2 + n ^ 2
⊢ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2
[PROOFSTEP]
refine' ⟨_, h2.left⟩
[GOAL]
case h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
m n : ℤ
hm2n2 : 0 < m ^ 2 + n ^ 2
hv2 : ↑x / ↑z = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hw2 : ↑y / ↑z = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
H : Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hz : z ≠ 0
h2 : y = m ^ 2 - n ^ 2 ∧ z = m ^ 2 + n ^ 2
⊢ x = 2 * m * n
[PROOFSTEP]
rw [← Rat.coe_int_inj _ _, ← div_left_inj' ((mt (Rat.coe_int_inj z 0).mp) hz), hv2, h2.right]
[GOAL]
case h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
m n : ℤ
hm2n2 : 0 < m ^ 2 + n ^ 2
hv2 : ↑x / ↑z = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hw2 : ↑y / ↑z = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
H : Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hz : z ≠ 0
h2 : y = m ^ 2 - n ^ 2 ∧ z = m ^ 2 + n ^ 2
⊢ 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2) = ↑(2 * m * n) / ↑(m ^ 2 + n ^ 2)
[PROOFSTEP]
norm_cast
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
⊢ IsPrimitiveClassified h
[PROOFSTEP]
by_cases h0 : x = 0
[GOAL]
case pos
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : x = 0
⊢ IsPrimitiveClassified h
[PROOFSTEP]
exact h.isPrimitiveClassified_of_coprime_of_zero_left hc h0
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
⊢ IsPrimitiveClassified h
[PROOFSTEP]
let v := (x : ℚ) / z
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
⊢ IsPrimitiveClassified h
[PROOFSTEP]
let w := (y : ℚ) / z
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have hz : z ≠ 0
[GOAL]
case hz
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
⊢ z ≠ 0
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
⊢ IsPrimitiveClassified h
[PROOFSTEP]
apply ne_of_gt hzpos
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have hq : v ^ 2 + w ^ 2 = 1 := by
  field_simp [hz, sq]
  norm_cast
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
⊢ v ^ 2 + w ^ 2 = 1
[PROOFSTEP]
field_simp [hz, sq]
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
⊢ ↑x * ↑x + ↑y * ↑y = ↑z * ↑z
[PROOFSTEP]
norm_cast
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have hvz : v ≠ 0 := by
  field_simp [hz]
  exact h0
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
⊢ v ≠ 0
[PROOFSTEP]
field_simp [hz]
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
⊢ ¬x = 0
[PROOFSTEP]
exact h0
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have hw1 : w ≠ -1 := by
  contrapose! hvz with hw1
  replace hw1 : w = -1 := hw1; show v = 0
  rw [hw1, neg_sq, one_pow, add_left_eq_self] at hq 
  exact pow_eq_zero hq
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
⊢ w ≠ -1
[PROOFSTEP]
contrapose! hvz with hw1
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hw1 : ↑y / ↑z = -1
⊢ ↑x / ↑z = 0
[PROOFSTEP]
replace hw1 : w = -1 := hw1
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hw1 : w = -1
⊢ ↑x / ↑z = 0
[PROOFSTEP]
show v = 0
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hw1 : w = -1
⊢ v = 0
[PROOFSTEP]
rw [hw1, neg_sq, one_pow, add_left_eq_self] at hq 
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 = 0
hw1 : w = -1
⊢ v = 0
[PROOFSTEP]
exact pow_eq_zero hq
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have hQ : ∀ x : ℚ, 1 + x ^ 2 ≠ 0 := by
  intro q
  apply ne_of_gt
  exact lt_add_of_pos_of_le zero_lt_one (sq_nonneg q)
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
⊢ ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
[PROOFSTEP]
intro q
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
q : ℚ
⊢ 1 + q ^ 2 ≠ 0
[PROOFSTEP]
apply ne_of_gt
[GOAL]
case h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
q : ℚ
⊢ 0 < 1 + q ^ 2
[PROOFSTEP]
exact lt_add_of_pos_of_le zero_lt_one (sq_nonneg q)
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have hp : (⟨v, w⟩ : ℚ × ℚ) ∈ {p : ℚ × ℚ | p.1 ^ 2 + p.2 ^ 2 = 1 ∧ p.2 ≠ -1} := ⟨hq, hw1⟩
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
⊢ IsPrimitiveClassified h
[PROOFSTEP]
let q := (circleEquivGen hQ).symm ⟨⟨v, w⟩, hp⟩
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2) :=
  by
  apply Prod.mk.inj
  have := ((circleEquivGen hQ).apply_symm_apply ⟨⟨v, w⟩, hp⟩).symm
  exact congr_arg Subtype.val this
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
⊢ v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
[PROOFSTEP]
apply Prod.mk.inj
[GOAL]
case x
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
⊢ (v, w) = (2 * q / (1 + q ^ 2), (1 - q ^ 2) / (1 + q ^ 2))
[PROOFSTEP]
have := ((circleEquivGen hQ).apply_symm_apply ⟨⟨v, w⟩, hp⟩).symm
[GOAL]
case x
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
this :
  { val := (v, w), property := hp } = ↑(circleEquivGen hQ) (↑(circleEquivGen hQ).symm { val := (v, w), property := hp })
⊢ (v, w) = (2 * q / (1 + q ^ 2), (1 - q ^ 2) / (1 + q ^ 2))
[PROOFSTEP]
exact congr_arg Subtype.val this
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
⊢ IsPrimitiveClassified h
[PROOFSTEP]
let m := (q.den : ℤ)
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
⊢ IsPrimitiveClassified h
[PROOFSTEP]
let n := q.num
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have hm0 : m ≠ 0 := by
  norm_cast
  apply Rat.den_nz q
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
⊢ m ≠ 0
[PROOFSTEP]
norm_cast
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
⊢ ¬q.den = 0
[PROOFSTEP]
apply Rat.den_nz q
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have hq2 : q = n / m := (Rat.num_div_den q).symm
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have hm2n2 : 0 < m ^ 2 + n ^ 2 := by
  apply lt_add_of_pos_of_le _ (sq_nonneg n)
  exact lt_of_le_of_ne (sq_nonneg m) (Ne.symm (pow_ne_zero 2 hm0))
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
⊢ 0 < m ^ 2 + n ^ 2
[PROOFSTEP]
apply lt_add_of_pos_of_le _ (sq_nonneg n)
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
⊢ 0 < m ^ 2
[PROOFSTEP]
exact lt_of_le_of_ne (sq_nonneg m) (Ne.symm (pow_ne_zero 2 hm0))
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have hm2n20 : (m : ℚ) ^ 2 + (n : ℚ) ^ 2 ≠ 0 := by
  norm_cast
  simpa only [Int.coe_nat_pow] using ne_of_gt hm2n2
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
⊢ ↑m ^ 2 + ↑n ^ 2 ≠ 0
[PROOFSTEP]
norm_cast
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
⊢ ¬↑(q.den ^ 2) + n ^ 2 = 0
[PROOFSTEP]
simpa only [Int.coe_nat_pow] using ne_of_gt hm2n2
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have hx1 {j k : ℚ} (h₁ : k ≠ 0) (h₂ : k ^ 2 + j ^ 2 ≠ 0) :
  (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2) := by field_simp
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
j k : ℚ
h₁ : k ≠ 0
h₂ : k ^ 2 + j ^ 2 ≠ 0
⊢ (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
[PROOFSTEP]
field_simp
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have hw2 : w = ((m : ℚ) ^ 2 - (n : ℚ) ^ 2) / ((m : ℚ) ^ 2 + (n : ℚ) ^ 2) := by
  calc
    w = (1 - q ^ 2) / (1 + q ^ 2) := by apply ht4.2
    _ = (1 - (↑n / ↑m) ^ 2) / (1 + (↑n / ↑m) ^ 2) := by rw [hq2]
    _ = _ := by exact hx1 (Int.cast_ne_zero.mpr hm0) hm2n20
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
⊢ w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
[PROOFSTEP]
calc
  w = (1 - q ^ 2) / (1 + q ^ 2) := by apply ht4.2
  _ = (1 - (↑n / ↑m) ^ 2) / (1 + (↑n / ↑m) ^ 2) := by rw [hq2]
  _ = _ := by exact hx1 (Int.cast_ne_zero.mpr hm0) hm2n20
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
⊢ w = (1 - q ^ 2) / (1 + q ^ 2)
[PROOFSTEP]
apply ht4.2
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
⊢ (1 - q ^ 2) / (1 + q ^ 2) = (1 - (↑n / ↑m) ^ 2) / (1 + (↑n / ↑m) ^ 2)
[PROOFSTEP]
rw [hq2]
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
⊢ (1 - (↑n / ↑m) ^ 2) / (1 + (↑n / ↑m) ^ 2) = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
[PROOFSTEP]
exact hx1 (Int.cast_ne_zero.mpr hm0) hm2n20
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have hx2 {j k : ℚ} (h₁ : k ≠ 0) (h₂ : k ^ 2 + j ^ 2 ≠ 0) :
  2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2) :=
  have h₃ : k * (k ^ 2 + j ^ 2) ≠ 0 := mul_ne_zero h₁ h₂
  by field_simp; ring
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
j k : ℚ
h₁ : k ≠ 0
h₂ : k ^ 2 + j ^ 2 ≠ 0
h₃ : k * (k ^ 2 + j ^ 2) ≠ 0
⊢ 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
[PROOFSTEP]
field_simp
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
j k : ℚ
h₁ : k ≠ 0
h₂ : k ^ 2 + j ^ 2 ≠ 0
h₃ : k * (k ^ 2 + j ^ 2) ≠ 0
⊢ 2 * j * k ^ 2 * (k ^ 2 + j ^ 2) = 2 * k * j * (k * (k ^ 2 + j ^ 2))
[PROOFSTEP]
ring
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have hv2 : v = 2 * m * n / ((m : ℚ) ^ 2 + (n : ℚ) ^ 2) := by
  calc
    v = 2 * q / (1 + q ^ 2) := by apply ht4.1
    _ = 2 * (n / m) / (1 + (↑n / ↑m) ^ 2) := by rw [hq2]
    _ = _ := by exact hx2 (Int.cast_ne_zero.mpr hm0) hm2n20
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
⊢ v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
[PROOFSTEP]
calc
  v = 2 * q / (1 + q ^ 2) := by apply ht4.1
  _ = 2 * (n / m) / (1 + (↑n / ↑m) ^ 2) := by rw [hq2]
  _ = _ := by exact hx2 (Int.cast_ne_zero.mpr hm0) hm2n20
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
⊢ v = 2 * q / (1 + q ^ 2)
[PROOFSTEP]
apply ht4.1
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
⊢ 2 * q / (1 + q ^ 2) = 2 * (↑n / ↑m) / (1 + (↑n / ↑m) ^ 2)
[PROOFSTEP]
rw [hq2]
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
⊢ 2 * (↑n / ↑m) / (1 + (↑n / ↑m) ^ 2) = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
[PROOFSTEP]
exact hx2 (Int.cast_ne_zero.mpr hm0) hm2n20
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have hnmcp : Int.gcd n m = 1 := q.reduced
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have hmncp : Int.gcd m n = 1 := by
  rw [Int.gcd_comm]
  exact hnmcp
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
⊢ Int.gcd m n = 1
[PROOFSTEP]
rw [Int.gcd_comm]
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
⊢ Int.gcd n m = 1
[PROOFSTEP]
exact hnmcp
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
⊢ IsPrimitiveClassified h
[PROOFSTEP]
cases' Int.emod_two_eq_zero_or_one m with hm2 hm2
[GOAL]
case neg.inl
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 0
⊢ IsPrimitiveClassified h
[PROOFSTEP]
cases' Int.emod_two_eq_zero_or_one n with hn2 hn2
[GOAL]
case neg.inr
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
⊢ IsPrimitiveClassified h
[PROOFSTEP]
cases' Int.emod_two_eq_zero_or_one n with hn2 hn2
[GOAL]
case neg.inl.inl
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 0
hn2 : n % 2 = 0
⊢ IsPrimitiveClassified h
[PROOFSTEP]
exfalso
[GOAL]
case neg.inl.inl.h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 0
hn2 : n % 2 = 0
⊢ False
[PROOFSTEP]
have h1 : 2 ∣ (Int.gcd n m : ℤ) := Int.dvd_gcd (Int.dvd_of_emod_eq_zero hn2) (Int.dvd_of_emod_eq_zero hm2)
[GOAL]
case neg.inl.inl.h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 0
hn2 : n % 2 = 0
h1 : 2 ∣ ↑(Int.gcd n m)
⊢ False
[PROOFSTEP]
rw [hnmcp] at h1 
[GOAL]
case neg.inl.inl.h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 0
hn2 : n % 2 = 0
h1 : 2 ∣ ↑1
⊢ False
[PROOFSTEP]
revert h1
[GOAL]
case neg.inl.inl.h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 0
hn2 : n % 2 = 0
⊢ 2 ∣ ↑1 → False
[PROOFSTEP]
norm_num
[GOAL]
case neg.inl.inr
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 0
hn2 : n % 2 = 1
⊢ IsPrimitiveClassified h
[PROOFSTEP]
apply h.isPrimitiveClassified_aux hc hzpos hm2n2 hv2 hw2 _ hmncp
[GOAL]
case neg.inl.inr
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 0
hn2 : n % 2 = 1
⊢ m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
[PROOFSTEP]
apply Or.intro_left
[GOAL]
case neg.inl.inr.h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 0
hn2 : n % 2 = 1
⊢ m % 2 = 0 ∧ n % 2 = 1
[PROOFSTEP]
exact And.intro hm2 hn2
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 0
hn2 : n % 2 = 1
⊢ Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
[PROOFSTEP]
apply coprime_sq_sub_sq_add_of_even_odd hmncp hm2 hn2
[GOAL]
case neg.inr.inl
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 0
⊢ IsPrimitiveClassified h
[PROOFSTEP]
apply h.isPrimitiveClassified_aux hc hzpos hm2n2 hv2 hw2 _ hmncp
[GOAL]
case neg.inr.inl
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 0
⊢ m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
[PROOFSTEP]
apply Or.intro_right
[GOAL]
case neg.inr.inl.h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 0
⊢ m % 2 = 1 ∧ n % 2 = 0
[PROOFSTEP]
exact And.intro hm2 hn2
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 0
⊢ Int.gcd (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2) = 1
[PROOFSTEP]
apply coprime_sq_sub_sq_add_of_odd_even hmncp hm2 hn2
[GOAL]
case neg.inr.inr
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 1
⊢ IsPrimitiveClassified h
[PROOFSTEP]
exfalso
[GOAL]
case neg.inr.inr.h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 1
⊢ False
[PROOFSTEP]
have h1 :
  2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1 :=
  coprime_sq_sub_sq_sum_of_odd_odd hmncp hm2 hn2
[GOAL]
case neg.inr.inr.h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 1
h1 :
  2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
⊢ False
[PROOFSTEP]
have h2 : y = (m ^ 2 - n ^ 2) / 2 ∧ z = (m ^ 2 + n ^ 2) / 2 :=
  by
  apply Rat.div_int_inj hzpos _ (h.coprime_of_coprime hc) h1.2.2.2
  · show w = _
    rw [← Rat.divInt_eq_div, ← Rat.divInt_mul_right (by norm_num : (2 : ℤ) ≠ 0)]
    rw [Int.ediv_mul_cancel h1.1, Int.ediv_mul_cancel h1.2.1, hw2]
    norm_cast
  · apply (mul_lt_mul_right (by norm_num : 0 < (2 : ℤ))).mp
    rw [Int.ediv_mul_cancel h1.1, zero_mul]
    exact hm2n2
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 1
h1 :
  2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
⊢ y = (m ^ 2 - n ^ 2) / 2 ∧ z = (m ^ 2 + n ^ 2) / 2
[PROOFSTEP]
apply Rat.div_int_inj hzpos _ (h.coprime_of_coprime hc) h1.2.2.2
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 1
h1 :
  2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
⊢ ↑y / ↑z = ↑((m ^ 2 - n ^ 2) / 2) / ↑((m ^ 2 + n ^ 2) / 2)
[PROOFSTEP]
show w = _
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 1
h1 :
  2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
⊢ w = ↑((m ^ 2 - n ^ 2) / 2) / ↑((m ^ 2 + n ^ 2) / 2)
[PROOFSTEP]
rw [← Rat.divInt_eq_div, ← Rat.divInt_mul_right (by norm_num : (2 : ℤ) ≠ 0)]
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 1
h1 :
  2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
⊢ 2 ≠ 0
[PROOFSTEP]
norm_num
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 1
h1 :
  2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
⊢ w = Rat.divInt ((m ^ 2 - n ^ 2) / 2 * 2) ((m ^ 2 + n ^ 2) / 2 * 2)
[PROOFSTEP]
rw [Int.ediv_mul_cancel h1.1, Int.ediv_mul_cancel h1.2.1, hw2]
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 1
h1 :
  2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
⊢ (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2) = Rat.divInt (m ^ 2 - n ^ 2) (m ^ 2 + n ^ 2)
[PROOFSTEP]
norm_cast
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 1
h1 :
  2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
⊢ 0 < (m ^ 2 + n ^ 2) / 2
[PROOFSTEP]
apply (mul_lt_mul_right (by norm_num : 0 < (2 : ℤ))).mp
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 1
h1 :
  2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
⊢ 0 < 2
[PROOFSTEP]
norm_num
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 1
h1 :
  2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
⊢ 0 * 2 < (m ^ 2 + n ^ 2) / 2 * 2
[PROOFSTEP]
rw [Int.ediv_mul_cancel h1.1, zero_mul]
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 1
h1 :
  2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
⊢ 0 < m ^ 2 + n ^ 2
[PROOFSTEP]
exact hm2n2
[GOAL]
case neg.inr.inr.h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hyo : y % 2 = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 1
h1 :
  2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
h2 : y = (m ^ 2 - n ^ 2) / 2 ∧ z = (m ^ 2 + n ^ 2) / 2
⊢ False
[PROOFSTEP]
rw [h2.1, h1.2.2.1] at hyo 
[GOAL]
case neg.inr.inr.h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hyo : 0 = 1
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 1
h1 :
  2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
h2 : y = (m ^ 2 - n ^ 2) / 2 ∧ z = (m ^ 2 + n ^ 2) / 2
⊢ False
[PROOFSTEP]
revert hyo
[GOAL]
case neg.inr.inr.h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
h0 : ¬x = 0
v : ℚ := ↑x / ↑z
w : ℚ := ↑y / ↑z
hz : z ≠ 0
hq : v ^ 2 + w ^ 2 = 1
hvz : v ≠ 0
hw1 : w ≠ -1
hQ : ∀ (x : ℚ), 1 + x ^ 2 ≠ 0
hp : (v, w) ∈ {p | p.fst ^ 2 + p.snd ^ 2 = 1 ∧ p.snd ≠ -1}
q : (fun x => ℚ) { val := (v, w), property := hp } := ↑(circleEquivGen hQ).symm { val := (v, w), property := hp }
ht4 : v = 2 * q / (1 + q ^ 2) ∧ w = (1 - q ^ 2) / (1 + q ^ 2)
m : ℤ := ↑q.den
n : ℤ := q.num
hm0 : m ≠ 0
hq2 : q = ↑n / ↑m
hm2n2 : 0 < m ^ 2 + n ^ 2
hm2n20 : ↑m ^ 2 + ↑n ^ 2 ≠ 0
hx1 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → (1 - (j / k) ^ 2) / (1 + (j / k) ^ 2) = (k ^ 2 - j ^ 2) / (k ^ 2 + j ^ 2)
hw2 : w = (↑m ^ 2 - ↑n ^ 2) / (↑m ^ 2 + ↑n ^ 2)
hx2 : ∀ {j k : ℚ}, k ≠ 0 → k ^ 2 + j ^ 2 ≠ 0 → 2 * (j / k) / (1 + (j / k) ^ 2) = 2 * k * j / (k ^ 2 + j ^ 2)
hv2 : v = 2 * ↑m * ↑n / (↑m ^ 2 + ↑n ^ 2)
hnmcp : Int.gcd n m = 1
hmncp : Int.gcd m n = 1
hm2 : m % 2 = 1
hn2 : n % 2 = 1
h1 :
  2 ∣ m ^ 2 + n ^ 2 ∧
    2 ∣ m ^ 2 - n ^ 2 ∧ (m ^ 2 - n ^ 2) / 2 % 2 = 0 ∧ Int.gcd ((m ^ 2 - n ^ 2) / 2) ((m ^ 2 + n ^ 2) / 2) = 1
h2 : y = (m ^ 2 - n ^ 2) / 2 ∧ z = (m ^ 2 + n ^ 2) / 2
⊢ 0 = 1 → False
[PROOFSTEP]
norm_num
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
⊢ IsPrimitiveClassified h
[PROOFSTEP]
cases' h.even_odd_of_coprime hc with h1 h2
[GOAL]
case inl
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
h1 : x % 2 = 0 ∧ y % 2 = 1
⊢ IsPrimitiveClassified h
[PROOFSTEP]
exact h.isPrimitiveClassified_of_coprime_of_odd_of_pos hc h1.right hzpos
[GOAL]
case inr
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hzpos : 0 < z
h2 : x % 2 = 1 ∧ y % 2 = 0
⊢ IsPrimitiveClassified h
[PROOFSTEP]
rw [Int.gcd_comm] at hc 
[GOAL]
case inr
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd y x = 1
hzpos : 0 < z
h2 : x % 2 = 1 ∧ y % 2 = 0
⊢ IsPrimitiveClassified h
[PROOFSTEP]
obtain ⟨m, n, H⟩ := h.symm.isPrimitiveClassified_of_coprime_of_odd_of_pos hc h2.left hzpos
[GOAL]
case inr.intro.intro
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd y x = 1
hzpos : 0 < z
h2 : x % 2 = 1 ∧ y % 2 = 0
m n : ℤ
H :
  (y = m ^ 2 - n ^ 2 ∧ x = 2 * m * n ∨ y = 2 * m * n ∧ x = m ^ 2 - n ^ 2) ∧
    Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)
⊢ IsPrimitiveClassified h
[PROOFSTEP]
use m, n
[GOAL]
case h
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd y x = 1
hzpos : 0 < z
h2 : x % 2 = 1 ∧ y % 2 = 0
m n : ℤ
H :
  (y = m ^ 2 - n ^ 2 ∧ x = 2 * m * n ∨ y = 2 * m * n ∧ x = m ^ 2 - n ^ 2) ∧
    Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)
⊢ (x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2) ∧
    Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)
[PROOFSTEP]
tauto
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
⊢ IsPrimitiveClassified h
[PROOFSTEP]
by_cases hz : 0 < z
[GOAL]
case pos
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hz : 0 < z
⊢ IsPrimitiveClassified h
[PROOFSTEP]
exact h.isPrimitiveClassified_of_coprime_of_pos hc hz
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hz : ¬0 < z
⊢ IsPrimitiveClassified h
[PROOFSTEP]
have h' : PythagoreanTriple x y (-z) := by simpa [PythagoreanTriple, neg_mul_neg] using h.eq
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hz : ¬0 < z
⊢ PythagoreanTriple x y (-z)
[PROOFSTEP]
simpa [PythagoreanTriple, neg_mul_neg] using h.eq
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hz : ¬0 < z
h' : PythagoreanTriple x y (-z)
⊢ IsPrimitiveClassified h
[PROOFSTEP]
apply h'.isPrimitiveClassified_of_coprime_of_pos hc
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hz : ¬0 < z
h' : PythagoreanTriple x y (-z)
⊢ 0 < -z
[PROOFSTEP]
apply lt_of_le_of_ne _ (h'.ne_zero_of_coprime hc).symm
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
hc : Int.gcd x y = 1
hz : ¬0 < z
h' : PythagoreanTriple x y (-z)
⊢ 0 ≤ -z
[PROOFSTEP]
exact le_neg.mp (not_lt.mp hz)
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
⊢ IsClassified h
[PROOFSTEP]
by_cases h0 : Int.gcd x y = 0
[GOAL]
case pos
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
⊢ IsClassified h
[PROOFSTEP]
have hx : x = 0 := by
  apply Int.natAbs_eq_zero.mp
  apply Nat.eq_zero_of_gcd_eq_zero_left h0
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
⊢ x = 0
[PROOFSTEP]
apply Int.natAbs_eq_zero.mp
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
⊢ Int.natAbs x = 0
[PROOFSTEP]
apply Nat.eq_zero_of_gcd_eq_zero_left h0
[GOAL]
case pos
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
⊢ IsClassified h
[PROOFSTEP]
have hy : y = 0 := by
  apply Int.natAbs_eq_zero.mp
  apply Nat.eq_zero_of_gcd_eq_zero_right h0
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
⊢ y = 0
[PROOFSTEP]
apply Int.natAbs_eq_zero.mp
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
⊢ Int.natAbs y = 0
[PROOFSTEP]
apply Nat.eq_zero_of_gcd_eq_zero_right h0
[GOAL]
case pos
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
hy : y = 0
⊢ IsClassified h
[PROOFSTEP]
use 0, 1, 0
[GOAL]
case h
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
hy : y = 0
⊢ (x = 0 * (1 ^ 2 - 0 ^ 2) ∧ y = 0 * (2 * 1 * 0) ∨ x = 0 * (2 * 1 * 0) ∧ y = 0 * (1 ^ 2 - 0 ^ 2)) ∧ Int.gcd 1 0 = 1
[PROOFSTEP]
field_simp [hx, hy]
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
h0 : ¬Int.gcd x y = 0
⊢ IsClassified h
[PROOFSTEP]
apply h.isClassified_of_normalize_isPrimitiveClassified
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
h0 : ¬Int.gcd x y = 0
⊢ IsPrimitiveClassified (_ : PythagoreanTriple (x / ↑(Int.gcd x y)) (y / ↑(Int.gcd x y)) (z / ↑(Int.gcd x y)))
[PROOFSTEP]
apply h.normalize.isPrimitiveClassified_of_coprime
[GOAL]
case neg
x y z : ℤ
h : PythagoreanTriple x y z
h0 : ¬Int.gcd x y = 0
⊢ Int.gcd (x / ↑(Int.gcd x y)) (y / ↑(Int.gcd x y)) = 1
[PROOFSTEP]
apply Int.gcd_div_gcd_div_gcd (Nat.pos_of_ne_zero h0)
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
⊢ PythagoreanTriple x y z ∧ Int.gcd x y = 1 ↔
    ∃ m n,
      (x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2) ∧
        (z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)) ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)
[PROOFSTEP]
clear h
[GOAL]
x y z : ℤ
⊢ PythagoreanTriple x y z ∧ Int.gcd x y = 1 ↔
    ∃ m n,
      (x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2) ∧
        (z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)) ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)
[PROOFSTEP]
constructor
[GOAL]
case mp
x y z : ℤ
⊢ PythagoreanTriple x y z ∧ Int.gcd x y = 1 →
    ∃ m n,
      (x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2) ∧
        (z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)) ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)
[PROOFSTEP]
intro h
[GOAL]
case mp
x y z : ℤ
h : PythagoreanTriple x y z ∧ Int.gcd x y = 1
⊢ ∃ m n,
    (x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2) ∧
      (z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)) ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)
[PROOFSTEP]
obtain ⟨m, n, H⟩ := h.left.isPrimitiveClassified_of_coprime h.right
[GOAL]
case mp.intro.intro
x y z : ℤ
h : PythagoreanTriple x y z ∧ Int.gcd x y = 1
m n : ℤ
H :
  (x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2) ∧
    Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)
⊢ ∃ m n,
    (x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2) ∧
      (z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)) ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)
[PROOFSTEP]
use m, n
[GOAL]
case h
x y z : ℤ
h : PythagoreanTriple x y z ∧ Int.gcd x y = 1
m n : ℤ
H :
  (x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2) ∧
    Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)
⊢ (x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2) ∧
    (z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)) ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)
[PROOFSTEP]
rcases H with ⟨⟨rfl, rfl⟩ | ⟨rfl, rfl⟩, co, pp⟩
[GOAL]
case h.intro.inl.intro.intro
z m n : ℤ
h : PythagoreanTriple (m ^ 2 - n ^ 2) (2 * m * n) z ∧ Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ (m ^ 2 - n ^ 2 = m ^ 2 - n ^ 2 ∧ 2 * m * n = 2 * m * n ∨ m ^ 2 - n ^ 2 = 2 * m * n ∧ 2 * m * n = m ^ 2 - n ^ 2) ∧
    (z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)) ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)
[PROOFSTEP]
refine' ⟨Or.inl ⟨rfl, rfl⟩, _, co, pp⟩
[GOAL]
case h.intro.inl.intro.intro
z m n : ℤ
h : PythagoreanTriple (m ^ 2 - n ^ 2) (2 * m * n) z ∧ Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
[PROOFSTEP]
have : z ^ 2 = (m ^ 2 + n ^ 2) ^ 2 := by
  rw [sq, ← h.left.eq]
  ring
[GOAL]
z m n : ℤ
h : PythagoreanTriple (m ^ 2 - n ^ 2) (2 * m * n) z ∧ Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ z ^ 2 = (m ^ 2 + n ^ 2) ^ 2
[PROOFSTEP]
rw [sq, ← h.left.eq]
[GOAL]
z m n : ℤ
h : PythagoreanTriple (m ^ 2 - n ^ 2) (2 * m * n) z ∧ Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) + 2 * m * n * (2 * m * n) = (m ^ 2 + n ^ 2) ^ 2
[PROOFSTEP]
ring
[GOAL]
case h.intro.inl.intro.intro
z m n : ℤ
h : PythagoreanTriple (m ^ 2 - n ^ 2) (2 * m * n) z ∧ Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
this : z ^ 2 = (m ^ 2 + n ^ 2) ^ 2
⊢ z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
[PROOFSTEP]
simpa using eq_or_eq_neg_of_sq_eq_sq _ _ this
[GOAL]
case h.intro.inr.intro.intro
z m n : ℤ
h : PythagoreanTriple (2 * m * n) (m ^ 2 - n ^ 2) z ∧ Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ (2 * m * n = m ^ 2 - n ^ 2 ∧ m ^ 2 - n ^ 2 = 2 * m * n ∨ 2 * m * n = 2 * m * n ∧ m ^ 2 - n ^ 2 = m ^ 2 - n ^ 2) ∧
    (z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)) ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)
[PROOFSTEP]
refine' ⟨Or.inr ⟨rfl, rfl⟩, _, co, pp⟩
[GOAL]
case h.intro.inr.intro.intro
z m n : ℤ
h : PythagoreanTriple (2 * m * n) (m ^ 2 - n ^ 2) z ∧ Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
[PROOFSTEP]
have : z ^ 2 = (m ^ 2 + n ^ 2) ^ 2 := by
  rw [sq, ← h.left.eq]
  ring
[GOAL]
z m n : ℤ
h : PythagoreanTriple (2 * m * n) (m ^ 2 - n ^ 2) z ∧ Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ z ^ 2 = (m ^ 2 + n ^ 2) ^ 2
[PROOFSTEP]
rw [sq, ← h.left.eq]
[GOAL]
z m n : ℤ
h : PythagoreanTriple (2 * m * n) (m ^ 2 - n ^ 2) z ∧ Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ 2 * m * n * (2 * m * n) + (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) = (m ^ 2 + n ^ 2) ^ 2
[PROOFSTEP]
ring
[GOAL]
case h.intro.inr.intro.intro
z m n : ℤ
h : PythagoreanTriple (2 * m * n) (m ^ 2 - n ^ 2) z ∧ Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
this : z ^ 2 = (m ^ 2 + n ^ 2) ^ 2
⊢ z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
[PROOFSTEP]
simpa using eq_or_eq_neg_of_sq_eq_sq _ _ this
[GOAL]
case mpr
x y z : ℤ
⊢ (∃ m n,
      (x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2) ∧
        (z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)) ∧
          Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)) →
    PythagoreanTriple x y z ∧ Int.gcd x y = 1
[PROOFSTEP]
delta PythagoreanTriple
[GOAL]
case mpr
x y z : ℤ
⊢ (∃ m n,
      (x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2) ∧
        (z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)) ∧
          Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0)) →
    x * x + y * y = z * z ∧ Int.gcd x y = 1
[PROOFSTEP]
rintro ⟨m, n, ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩, rfl | rfl, co, pp⟩
[GOAL]
case mpr.intro.intro.intro.inl.intro.intro.inl.intro
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) + 2 * m * n * (2 * m * n) = (m ^ 2 + n ^ 2) * (m ^ 2 + n ^ 2) ∧
    Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
[PROOFSTEP]
first
| constructor; ring; exact coprime_sq_sub_mul co pp
| constructor; ring; rw [Int.gcd_comm]; exact coprime_sq_sub_mul co pp
[GOAL]
case mpr.intro.intro.intro.inl.intro.intro.inl.intro
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) + 2 * m * n * (2 * m * n) = (m ^ 2 + n ^ 2) * (m ^ 2 + n ^ 2) ∧
    Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
[PROOFSTEP]
constructor
[GOAL]
case mpr.intro.intro.intro.inl.intro.intro.inl.intro.left
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) + 2 * m * n * (2 * m * n) = (m ^ 2 + n ^ 2) * (m ^ 2 + n ^ 2)
case mpr.intro.intro.intro.inl.intro.intro.inl.intro.right
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
[PROOFSTEP]
ring
[GOAL]
case mpr.intro.intro.intro.inl.intro.intro.inl.intro.right
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
[PROOFSTEP]
exact coprime_sq_sub_mul co pp
[GOAL]
case mpr.intro.intro.intro.inl.intro.intro.inr.intro
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) + 2 * m * n * (2 * m * n) = -(m ^ 2 + n ^ 2) * -(m ^ 2 + n ^ 2) ∧
    Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
[PROOFSTEP]
first
| constructor; ring; exact coprime_sq_sub_mul co pp
| constructor; ring; rw [Int.gcd_comm]; exact coprime_sq_sub_mul co pp
[GOAL]
case mpr.intro.intro.intro.inl.intro.intro.inr.intro
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) + 2 * m * n * (2 * m * n) = -(m ^ 2 + n ^ 2) * -(m ^ 2 + n ^ 2) ∧
    Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
[PROOFSTEP]
constructor
[GOAL]
case mpr.intro.intro.intro.inl.intro.intro.inr.intro.left
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) + 2 * m * n * (2 * m * n) = -(m ^ 2 + n ^ 2) * -(m ^ 2 + n ^ 2)
case mpr.intro.intro.intro.inl.intro.intro.inr.intro.right
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
[PROOFSTEP]
ring
[GOAL]
case mpr.intro.intro.intro.inl.intro.intro.inr.intro.right
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
[PROOFSTEP]
exact coprime_sq_sub_mul co pp
[GOAL]
case mpr.intro.intro.intro.inr.intro.intro.inl.intro
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ 2 * m * n * (2 * m * n) + (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) = (m ^ 2 + n ^ 2) * (m ^ 2 + n ^ 2) ∧
    Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
[PROOFSTEP]
first
| constructor; ring; exact coprime_sq_sub_mul co pp
| constructor; ring; rw [Int.gcd_comm]; exact coprime_sq_sub_mul co pp
[GOAL]
case mpr.intro.intro.intro.inr.intro.intro.inl.intro
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ 2 * m * n * (2 * m * n) + (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) = (m ^ 2 + n ^ 2) * (m ^ 2 + n ^ 2) ∧
    Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
[PROOFSTEP]
constructor
[GOAL]
case mpr.intro.intro.intro.inr.intro.intro.inl.intro.left
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ 2 * m * n * (2 * m * n) + (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) = (m ^ 2 + n ^ 2) * (m ^ 2 + n ^ 2)
case mpr.intro.intro.intro.inr.intro.intro.inl.intro.right
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
[PROOFSTEP]
ring
[GOAL]
case mpr.intro.intro.intro.inr.intro.intro.inl.intro.right
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
[PROOFSTEP]
exact coprime_sq_sub_mul co pp
[GOAL]
case mpr.intro.intro.intro.inr.intro.intro.inl.intro
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ 2 * m * n * (2 * m * n) + (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) = (m ^ 2 + n ^ 2) * (m ^ 2 + n ^ 2) ∧
    Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
[PROOFSTEP]
constructor
[GOAL]
case mpr.intro.intro.intro.inr.intro.intro.inl.intro.left
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ 2 * m * n * (2 * m * n) + (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) = (m ^ 2 + n ^ 2) * (m ^ 2 + n ^ 2)
case mpr.intro.intro.intro.inr.intro.intro.inl.intro.right
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
[PROOFSTEP]
ring
[GOAL]
case mpr.intro.intro.intro.inr.intro.intro.inl.intro.right
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
[PROOFSTEP]
rw [Int.gcd_comm]
[GOAL]
case mpr.intro.intro.intro.inr.intro.intro.inl.intro.right
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
[PROOFSTEP]
exact coprime_sq_sub_mul co pp
[GOAL]
case mpr.intro.intro.intro.inr.intro.intro.inr.intro
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ 2 * m * n * (2 * m * n) + (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) = -(m ^ 2 + n ^ 2) * -(m ^ 2 + n ^ 2) ∧
    Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
[PROOFSTEP]
first
| constructor; ring; exact coprime_sq_sub_mul co pp
| constructor; ring; rw [Int.gcd_comm]; exact coprime_sq_sub_mul co pp
[GOAL]
case mpr.intro.intro.intro.inr.intro.intro.inr.intro
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ 2 * m * n * (2 * m * n) + (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) = -(m ^ 2 + n ^ 2) * -(m ^ 2 + n ^ 2) ∧
    Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
[PROOFSTEP]
constructor
[GOAL]
case mpr.intro.intro.intro.inr.intro.intro.inr.intro.left
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ 2 * m * n * (2 * m * n) + (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) = -(m ^ 2 + n ^ 2) * -(m ^ 2 + n ^ 2)
case mpr.intro.intro.intro.inr.intro.intro.inr.intro.right
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
[PROOFSTEP]
ring
[GOAL]
case mpr.intro.intro.intro.inr.intro.intro.inr.intro.right
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
[PROOFSTEP]
exact coprime_sq_sub_mul co pp
[GOAL]
case mpr.intro.intro.intro.inr.intro.intro.inr.intro
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ 2 * m * n * (2 * m * n) + (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) = -(m ^ 2 + n ^ 2) * -(m ^ 2 + n ^ 2) ∧
    Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
[PROOFSTEP]
constructor
[GOAL]
case mpr.intro.intro.intro.inr.intro.intro.inr.intro.left
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ 2 * m * n * (2 * m * n) + (m ^ 2 - n ^ 2) * (m ^ 2 - n ^ 2) = -(m ^ 2 + n ^ 2) * -(m ^ 2 + n ^ 2)
case mpr.intro.intro.intro.inr.intro.intro.inr.intro.right
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
[PROOFSTEP]
ring
[GOAL]
case mpr.intro.intro.intro.inr.intro.intro.inr.intro.right
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ Int.gcd (2 * m * n) (m ^ 2 - n ^ 2) = 1
[PROOFSTEP]
rw [Int.gcd_comm]
[GOAL]
case mpr.intro.intro.intro.inr.intro.intro.inr.intro.right
m n : ℤ
co : Int.gcd m n = 1
pp : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ Int.gcd (m ^ 2 - n ^ 2) (2 * m * n) = 1
[PROOFSTEP]
exact coprime_sq_sub_mul co pp
[GOAL]
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
⊢ ∃ m n,
    x = m ^ 2 - n ^ 2 ∧
      y = 2 * m * n ∧ z = m ^ 2 + n ^ 2 ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0) ∧ 0 ≤ m
[PROOFSTEP]
obtain ⟨m, n, ht1, ht2, ht3, ht4⟩ := PythagoreanTriple.coprime_classification.mp (And.intro h h_coprime)
[GOAL]
case intro.intro.intro.intro.intro
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht1 : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
⊢ ∃ m n,
    x = m ^ 2 - n ^ 2 ∧
      y = 2 * m * n ∧ z = m ^ 2 + n ^ 2 ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0) ∧ 0 ≤ m
[PROOFSTEP]
cases' le_or_lt 0 m with hm hm
[GOAL]
case intro.intro.intro.intro.intro.inl
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht1 : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : 0 ≤ m
⊢ ∃ m n,
    x = m ^ 2 - n ^ 2 ∧
      y = 2 * m * n ∧ z = m ^ 2 + n ^ 2 ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0) ∧ 0 ≤ m
[PROOFSTEP]
use m, n
[GOAL]
case h
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht1 : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : 0 ≤ m
⊢ x = m ^ 2 - n ^ 2 ∧
    y = 2 * m * n ∧ z = m ^ 2 + n ^ 2 ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0) ∧ 0 ≤ m
[PROOFSTEP]
cases' ht1 with h_odd h_even
[GOAL]
case h.inl
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : 0 ≤ m
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
⊢ x = m ^ 2 - n ^ 2 ∧
    y = 2 * m * n ∧ z = m ^ 2 + n ^ 2 ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0) ∧ 0 ≤ m
[PROOFSTEP]
apply And.intro h_odd.1
[GOAL]
case h.inl
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : 0 ≤ m
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
⊢ y = 2 * m * n ∧ z = m ^ 2 + n ^ 2 ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0) ∧ 0 ≤ m
[PROOFSTEP]
apply And.intro h_odd.2
[GOAL]
case h.inl
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : 0 ≤ m
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
⊢ z = m ^ 2 + n ^ 2 ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0) ∧ 0 ≤ m
[PROOFSTEP]
cases' ht2 with h_pos h_neg
[GOAL]
case h.inl.inl
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos✝ : 0 < z
m n : ℤ
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : 0 ≤ m
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
h_pos : z = m ^ 2 + n ^ 2
⊢ z = m ^ 2 + n ^ 2 ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0) ∧ 0 ≤ m
[PROOFSTEP]
apply And.intro h_pos (And.intro ht3 (And.intro ht4 hm))
[GOAL]
case h.inl.inr
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : 0 ≤ m
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
h_neg : z = -(m ^ 2 + n ^ 2)
⊢ z = m ^ 2 + n ^ 2 ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0) ∧ 0 ≤ m
[PROOFSTEP]
exfalso
[GOAL]
case h.inl.inr.h
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : 0 ≤ m
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
h_neg : z = -(m ^ 2 + n ^ 2)
⊢ False
[PROOFSTEP]
revert h_pos
[GOAL]
case h.inl.inr.h
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
m n : ℤ
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : 0 ≤ m
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
h_neg : z = -(m ^ 2 + n ^ 2)
⊢ 0 < z → False
[PROOFSTEP]
rw [h_neg]
[GOAL]
case h.inl.inr.h
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
m n : ℤ
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : 0 ≤ m
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
h_neg : z = -(m ^ 2 + n ^ 2)
⊢ 0 < -(m ^ 2 + n ^ 2) → False
[PROOFSTEP]
exact imp_false.mpr (not_lt.mpr (neg_nonpos.mpr (add_nonneg (sq_nonneg m) (sq_nonneg n))))
[GOAL]
case h.inr
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : 0 ≤ m
h_even : x = 2 * m * n ∧ y = m ^ 2 - n ^ 2
⊢ x = m ^ 2 - n ^ 2 ∧
    y = 2 * m * n ∧ z = m ^ 2 + n ^ 2 ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0) ∧ 0 ≤ m
[PROOFSTEP]
exfalso
[GOAL]
case h.inr.h
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : 0 ≤ m
h_even : x = 2 * m * n ∧ y = m ^ 2 - n ^ 2
⊢ False
[PROOFSTEP]
rcases h_even with ⟨rfl, -⟩
[GOAL]
case h.inr.h.intro
x y✝ z✝ : ℤ
h✝ : PythagoreanTriple x y✝ z✝
y z : ℤ
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : 0 ≤ m
h : PythagoreanTriple (2 * m * n) y z
h_coprime : Int.gcd (2 * m * n) y = 1
h_parity : 2 * m * n % 2 = 1
⊢ False
[PROOFSTEP]
rw [mul_assoc, Int.mul_emod_right] at h_parity 
[GOAL]
case h.inr.h.intro
x y✝ z✝ : ℤ
h✝ : PythagoreanTriple x y✝ z✝
y z : ℤ
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : 0 ≤ m
h : PythagoreanTriple (2 * m * n) y z
h_coprime : Int.gcd (2 * m * n) y = 1
h_parity : 0 = 1
⊢ False
[PROOFSTEP]
exact zero_ne_one h_parity
[GOAL]
case intro.intro.intro.intro.intro.inr
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht1 : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
⊢ ∃ m n,
    x = m ^ 2 - n ^ 2 ∧
      y = 2 * m * n ∧ z = m ^ 2 + n ^ 2 ∧ Int.gcd m n = 1 ∧ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0) ∧ 0 ≤ m
[PROOFSTEP]
use-m, -n
[GOAL]
case h
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht1 : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n ∨ x = 2 * m * n ∧ y = m ^ 2 - n ^ 2
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
⊢ x = (-m) ^ 2 - (-n) ^ 2 ∧
    y = 2 * -m * -n ∧
      z = (-m) ^ 2 + (-n) ^ 2 ∧ Int.gcd (-m) (-n) = 1 ∧ (-m % 2 = 0 ∧ -n % 2 = 1 ∨ -m % 2 = 1 ∧ -n % 2 = 0) ∧ 0 ≤ -m
[PROOFSTEP]
cases' ht1 with h_odd h_even
[GOAL]
case h.inl
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
⊢ x = (-m) ^ 2 - (-n) ^ 2 ∧
    y = 2 * -m * -n ∧
      z = (-m) ^ 2 + (-n) ^ 2 ∧ Int.gcd (-m) (-n) = 1 ∧ (-m % 2 = 0 ∧ -n % 2 = 1 ∨ -m % 2 = 1 ∧ -n % 2 = 0) ∧ 0 ≤ -m
[PROOFSTEP]
rw [neg_sq m]
[GOAL]
case h.inl
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
⊢ x = m ^ 2 - (-n) ^ 2 ∧
    y = 2 * -m * -n ∧
      z = m ^ 2 + (-n) ^ 2 ∧ Int.gcd (-m) (-n) = 1 ∧ (-m % 2 = 0 ∧ -n % 2 = 1 ∨ -m % 2 = 1 ∧ -n % 2 = 0) ∧ 0 ≤ -m
[PROOFSTEP]
rw [neg_sq n]
[GOAL]
case h.inl
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
⊢ x = m ^ 2 - n ^ 2 ∧
    y = 2 * -m * -n ∧
      z = m ^ 2 + n ^ 2 ∧ Int.gcd (-m) (-n) = 1 ∧ (-m % 2 = 0 ∧ -n % 2 = 1 ∨ -m % 2 = 1 ∧ -n % 2 = 0) ∧ 0 ≤ -m
[PROOFSTEP]
apply And.intro h_odd.1
[GOAL]
case h.inl
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
⊢ y = 2 * -m * -n ∧
    z = m ^ 2 + n ^ 2 ∧ Int.gcd (-m) (-n) = 1 ∧ (-m % 2 = 0 ∧ -n % 2 = 1 ∨ -m % 2 = 1 ∧ -n % 2 = 0) ∧ 0 ≤ -m
[PROOFSTEP]
constructor
[GOAL]
case h.inl.left
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
⊢ y = 2 * -m * -n
[PROOFSTEP]
rw [h_odd.2]
[GOAL]
case h.inl.left
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
⊢ 2 * m * n = 2 * -m * -n
[PROOFSTEP]
ring
[GOAL]
case h.inl.right
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
⊢ z = m ^ 2 + n ^ 2 ∧ Int.gcd (-m) (-n) = 1 ∧ (-m % 2 = 0 ∧ -n % 2 = 1 ∨ -m % 2 = 1 ∧ -n % 2 = 0) ∧ 0 ≤ -m
[PROOFSTEP]
cases' ht2 with h_pos h_neg
[GOAL]
case h.inl.right.inl
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos✝ : 0 < z
m n : ℤ
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
h_pos : z = m ^ 2 + n ^ 2
⊢ z = m ^ 2 + n ^ 2 ∧ Int.gcd (-m) (-n) = 1 ∧ (-m % 2 = 0 ∧ -n % 2 = 1 ∨ -m % 2 = 1 ∧ -n % 2 = 0) ∧ 0 ≤ -m
[PROOFSTEP]
apply And.intro h_pos
[GOAL]
case h.inl.right.inl
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos✝ : 0 < z
m n : ℤ
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
h_pos : z = m ^ 2 + n ^ 2
⊢ Int.gcd (-m) (-n) = 1 ∧ (-m % 2 = 0 ∧ -n % 2 = 1 ∨ -m % 2 = 1 ∧ -n % 2 = 0) ∧ 0 ≤ -m
[PROOFSTEP]
constructor
[GOAL]
case h.inl.right.inl.left
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos✝ : 0 < z
m n : ℤ
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
h_pos : z = m ^ 2 + n ^ 2
⊢ Int.gcd (-m) (-n) = 1
[PROOFSTEP]
delta Int.gcd
[GOAL]
case h.inl.right.inl.left
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos✝ : 0 < z
m n : ℤ
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
h_pos : z = m ^ 2 + n ^ 2
⊢ Nat.gcd (Int.natAbs (-m)) (Int.natAbs (-n)) = 1
[PROOFSTEP]
rw [Int.natAbs_neg, Int.natAbs_neg]
[GOAL]
case h.inl.right.inl.left
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos✝ : 0 < z
m n : ℤ
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
h_pos : z = m ^ 2 + n ^ 2
⊢ Nat.gcd (Int.natAbs m) (Int.natAbs n) = 1
[PROOFSTEP]
exact ht3
[GOAL]
case h.inl.right.inl.right
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos✝ : 0 < z
m n : ℤ
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
h_pos : z = m ^ 2 + n ^ 2
⊢ (-m % 2 = 0 ∧ -n % 2 = 1 ∨ -m % 2 = 1 ∧ -n % 2 = 0) ∧ 0 ≤ -m
[PROOFSTEP]
rw [Int.neg_emod_two, Int.neg_emod_two]
[GOAL]
case h.inl.right.inl.right
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos✝ : 0 < z
m n : ℤ
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
h_pos : z = m ^ 2 + n ^ 2
⊢ (m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0) ∧ 0 ≤ -m
[PROOFSTEP]
apply And.intro ht4
[GOAL]
case h.inl.right.inl.right
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos✝ : 0 < z
m n : ℤ
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
h_pos : z = m ^ 2 + n ^ 2
⊢ 0 ≤ -m
[PROOFSTEP]
linarith
[GOAL]
case h.inl.right.inr
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
h_neg : z = -(m ^ 2 + n ^ 2)
⊢ z = m ^ 2 + n ^ 2 ∧ Int.gcd (-m) (-n) = 1 ∧ (-m % 2 = 0 ∧ -n % 2 = 1 ∨ -m % 2 = 1 ∧ -n % 2 = 0) ∧ 0 ≤ -m
[PROOFSTEP]
exfalso
[GOAL]
case h.inl.right.inr.h
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
h_neg : z = -(m ^ 2 + n ^ 2)
⊢ False
[PROOFSTEP]
revert h_pos
[GOAL]
case h.inl.right.inr.h
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
m n : ℤ
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
h_neg : z = -(m ^ 2 + n ^ 2)
⊢ 0 < z → False
[PROOFSTEP]
rw [h_neg]
[GOAL]
case h.inl.right.inr.h
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
m n : ℤ
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_odd : x = m ^ 2 - n ^ 2 ∧ y = 2 * m * n
h_neg : z = -(m ^ 2 + n ^ 2)
⊢ 0 < -(m ^ 2 + n ^ 2) → False
[PROOFSTEP]
exact imp_false.mpr (not_lt.mpr (neg_nonpos.mpr (add_nonneg (sq_nonneg m) (sq_nonneg n))))
[GOAL]
case h.inr
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_even : x = 2 * m * n ∧ y = m ^ 2 - n ^ 2
⊢ x = (-m) ^ 2 - (-n) ^ 2 ∧
    y = 2 * -m * -n ∧
      z = (-m) ^ 2 + (-n) ^ 2 ∧ Int.gcd (-m) (-n) = 1 ∧ (-m % 2 = 0 ∧ -n % 2 = 1 ∨ -m % 2 = 1 ∧ -n % 2 = 0) ∧ 0 ≤ -m
[PROOFSTEP]
exfalso
[GOAL]
case h.inr.h
x✝ y✝ z✝ : ℤ
h✝ : PythagoreanTriple x✝ y✝ z✝
x y z : ℤ
h : PythagoreanTriple x y z
h_coprime : Int.gcd x y = 1
h_parity : x % 2 = 1
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h_even : x = 2 * m * n ∧ y = m ^ 2 - n ^ 2
⊢ False
[PROOFSTEP]
rcases h_even with ⟨rfl, -⟩
[GOAL]
case h.inr.h.intro
x y✝ z✝ : ℤ
h✝ : PythagoreanTriple x y✝ z✝
y z : ℤ
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h : PythagoreanTriple (2 * m * n) y z
h_coprime : Int.gcd (2 * m * n) y = 1
h_parity : 2 * m * n % 2 = 1
⊢ False
[PROOFSTEP]
rw [mul_assoc, Int.mul_emod_right] at h_parity 
[GOAL]
case h.inr.h.intro
x y✝ z✝ : ℤ
h✝ : PythagoreanTriple x y✝ z✝
y z : ℤ
h_pos : 0 < z
m n : ℤ
ht2 : z = m ^ 2 + n ^ 2 ∨ z = -(m ^ 2 + n ^ 2)
ht3 : Int.gcd m n = 1
ht4 : m % 2 = 0 ∧ n % 2 = 1 ∨ m % 2 = 1 ∧ n % 2 = 0
hm : m < 0
h : PythagoreanTriple (2 * m * n) y z
h_coprime : Int.gcd (2 * m * n) y = 1
h_parity : 0 = 1
⊢ False
[PROOFSTEP]
exact zero_ne_one h_parity
[GOAL]
x y z : ℤ
h : PythagoreanTriple x y z
⊢ PythagoreanTriple x y z ↔
    ∃ k m n,
      (x = k * (m ^ 2 - n ^ 2) ∧ y = k * (2 * m * n) ∨ x = k * (2 * m * n) ∧ y = k * (m ^ 2 - n ^ 2)) ∧
        (z = k * (m ^ 2 + n ^ 2) ∨ z = -k * (m ^ 2 + n ^ 2))
[PROOFSTEP]
clear h
[GOAL]
x y z : ℤ
⊢ PythagoreanTriple x y z ↔
    ∃ k m n,
      (x = k * (m ^ 2 - n ^ 2) ∧ y = k * (2 * m * n) ∨ x = k * (2 * m * n) ∧ y = k * (m ^ 2 - n ^ 2)) ∧
        (z = k * (m ^ 2 + n ^ 2) ∨ z = -k * (m ^ 2 + n ^ 2))
[PROOFSTEP]
constructor
[GOAL]
case mp
x y z : ℤ
⊢ PythagoreanTriple x y z →
    ∃ k m n,
      (x = k * (m ^ 2 - n ^ 2) ∧ y = k * (2 * m * n) ∨ x = k * (2 * m * n) ∧ y = k * (m ^ 2 - n ^ 2)) ∧
        (z = k * (m ^ 2 + n ^ 2) ∨ z = -k * (m ^ 2 + n ^ 2))
[PROOFSTEP]
intro h
[GOAL]
case mp
x y z : ℤ
h : PythagoreanTriple x y z
⊢ ∃ k m n,
    (x = k * (m ^ 2 - n ^ 2) ∧ y = k * (2 * m * n) ∨ x = k * (2 * m * n) ∧ y = k * (m ^ 2 - n ^ 2)) ∧
      (z = k * (m ^ 2 + n ^ 2) ∨ z = -k * (m ^ 2 + n ^ 2))
[PROOFSTEP]
obtain ⟨k, m, n, H⟩ := h.classified
[GOAL]
case mp.intro.intro.intro
x y z : ℤ
h : PythagoreanTriple x y z
k m n : ℤ
H : (x = k * (m ^ 2 - n ^ 2) ∧ y = k * (2 * m * n) ∨ x = k * (2 * m * n) ∧ y = k * (m ^ 2 - n ^ 2)) ∧ Int.gcd m n = 1
⊢ ∃ k m n,
    (x = k * (m ^ 2 - n ^ 2) ∧ y = k * (2 * m * n) ∨ x = k * (2 * m * n) ∧ y = k * (m ^ 2 - n ^ 2)) ∧
      (z = k * (m ^ 2 + n ^ 2) ∨ z = -k * (m ^ 2 + n ^ 2))
[PROOFSTEP]
use k, m, n
[GOAL]
case h
x y z : ℤ
h : PythagoreanTriple x y z
k m n : ℤ
H : (x = k * (m ^ 2 - n ^ 2) ∧ y = k * (2 * m * n) ∨ x = k * (2 * m * n) ∧ y = k * (m ^ 2 - n ^ 2)) ∧ Int.gcd m n = 1
⊢ (x = k * (m ^ 2 - n ^ 2) ∧ y = k * (2 * m * n) ∨ x = k * (2 * m * n) ∧ y = k * (m ^ 2 - n ^ 2)) ∧
    (z = k * (m ^ 2 + n ^ 2) ∨ z = -k * (m ^ 2 + n ^ 2))
[PROOFSTEP]
rcases H with (⟨rfl, rfl⟩ | ⟨rfl, rfl⟩)
[GOAL]
case h.intro.inl.intro
z k m n : ℤ
right✝ : Int.gcd m n = 1
h : PythagoreanTriple (k * (m ^ 2 - n ^ 2)) (k * (2 * m * n)) z
⊢ (k * (m ^ 2 - n ^ 2) = k * (m ^ 2 - n ^ 2) ∧ k * (2 * m * n) = k * (2 * m * n) ∨
      k * (m ^ 2 - n ^ 2) = k * (2 * m * n) ∧ k * (2 * m * n) = k * (m ^ 2 - n ^ 2)) ∧
    (z = k * (m ^ 2 + n ^ 2) ∨ z = -k * (m ^ 2 + n ^ 2))
[PROOFSTEP]
refine' ⟨Or.inl ⟨rfl, rfl⟩, _⟩
[GOAL]
case h.intro.inl.intro
z k m n : ℤ
right✝ : Int.gcd m n = 1
h : PythagoreanTriple (k * (m ^ 2 - n ^ 2)) (k * (2 * m * n)) z
⊢ z = k * (m ^ 2 + n ^ 2) ∨ z = -k * (m ^ 2 + n ^ 2)
[PROOFSTEP]
have : z ^ 2 = (k * (m ^ 2 + n ^ 2)) ^ 2 := by
  rw [sq, ← h.eq]
  ring
[GOAL]
z k m n : ℤ
right✝ : Int.gcd m n = 1
h : PythagoreanTriple (k * (m ^ 2 - n ^ 2)) (k * (2 * m * n)) z
⊢ z ^ 2 = (k * (m ^ 2 + n ^ 2)) ^ 2
[PROOFSTEP]
rw [sq, ← h.eq]
[GOAL]
z k m n : ℤ
right✝ : Int.gcd m n = 1
h : PythagoreanTriple (k * (m ^ 2 - n ^ 2)) (k * (2 * m * n)) z
⊢ k * (m ^ 2 - n ^ 2) * (k * (m ^ 2 - n ^ 2)) + k * (2 * m * n) * (k * (2 * m * n)) = (k * (m ^ 2 + n ^ 2)) ^ 2
[PROOFSTEP]
ring
[GOAL]
case h.intro.inl.intro
z k m n : ℤ
right✝ : Int.gcd m n = 1
h : PythagoreanTriple (k * (m ^ 2 - n ^ 2)) (k * (2 * m * n)) z
this : z ^ 2 = (k * (m ^ 2 + n ^ 2)) ^ 2
⊢ z = k * (m ^ 2 + n ^ 2) ∨ z = -k * (m ^ 2 + n ^ 2)
[PROOFSTEP]
simpa using eq_or_eq_neg_of_sq_eq_sq _ _ this
[GOAL]
case h.intro.inr.intro
z k m n : ℤ
right✝ : Int.gcd m n = 1
h : PythagoreanTriple (k * (2 * m * n)) (k * (m ^ 2 - n ^ 2)) z
⊢ (k * (2 * m * n) = k * (m ^ 2 - n ^ 2) ∧ k * (m ^ 2 - n ^ 2) = k * (2 * m * n) ∨
      k * (2 * m * n) = k * (2 * m * n) ∧ k * (m ^ 2 - n ^ 2) = k * (m ^ 2 - n ^ 2)) ∧
    (z = k * (m ^ 2 + n ^ 2) ∨ z = -k * (m ^ 2 + n ^ 2))
[PROOFSTEP]
refine' ⟨Or.inr ⟨rfl, rfl⟩, _⟩
[GOAL]
case h.intro.inr.intro
z k m n : ℤ
right✝ : Int.gcd m n = 1
h : PythagoreanTriple (k * (2 * m * n)) (k * (m ^ 2 - n ^ 2)) z
⊢ z = k * (m ^ 2 + n ^ 2) ∨ z = -k * (m ^ 2 + n ^ 2)
[PROOFSTEP]
have : z ^ 2 = (k * (m ^ 2 + n ^ 2)) ^ 2 := by
  rw [sq, ← h.eq]
  ring
[GOAL]
z k m n : ℤ
right✝ : Int.gcd m n = 1
h : PythagoreanTriple (k * (2 * m * n)) (k * (m ^ 2 - n ^ 2)) z
⊢ z ^ 2 = (k * (m ^ 2 + n ^ 2)) ^ 2
[PROOFSTEP]
rw [sq, ← h.eq]
[GOAL]
z k m n : ℤ
right✝ : Int.gcd m n = 1
h : PythagoreanTriple (k * (2 * m * n)) (k * (m ^ 2 - n ^ 2)) z
⊢ k * (2 * m * n) * (k * (2 * m * n)) + k * (m ^ 2 - n ^ 2) * (k * (m ^ 2 - n ^ 2)) = (k * (m ^ 2 + n ^ 2)) ^ 2
[PROOFSTEP]
ring
[GOAL]
case h.intro.inr.intro
z k m n : ℤ
right✝ : Int.gcd m n = 1
h : PythagoreanTriple (k * (2 * m * n)) (k * (m ^ 2 - n ^ 2)) z
this : z ^ 2 = (k * (m ^ 2 + n ^ 2)) ^ 2
⊢ z = k * (m ^ 2 + n ^ 2) ∨ z = -k * (m ^ 2 + n ^ 2)
[PROOFSTEP]
simpa using eq_or_eq_neg_of_sq_eq_sq _ _ this
[GOAL]
case mpr
x y z : ℤ
⊢ (∃ k m n,
      (x = k * (m ^ 2 - n ^ 2) ∧ y = k * (2 * m * n) ∨ x = k * (2 * m * n) ∧ y = k * (m ^ 2 - n ^ 2)) ∧
        (z = k * (m ^ 2 + n ^ 2) ∨ z = -k * (m ^ 2 + n ^ 2))) →
    PythagoreanTriple x y z
[PROOFSTEP]
rintro ⟨k, m, n, ⟨rfl, rfl⟩ | ⟨rfl, rfl⟩, rfl | rfl⟩
[GOAL]
case mpr.intro.intro.intro.intro.inl.intro.inl
k m n : ℤ
⊢ PythagoreanTriple (k * (m ^ 2 - n ^ 2)) (k * (2 * m * n)) (k * (m ^ 2 + n ^ 2))
[PROOFSTEP]
delta PythagoreanTriple
[GOAL]
case mpr.intro.intro.intro.intro.inl.intro.inr
k m n : ℤ
⊢ PythagoreanTriple (k * (m ^ 2 - n ^ 2)) (k * (2 * m * n)) (-k * (m ^ 2 + n ^ 2))
[PROOFSTEP]
delta PythagoreanTriple
[GOAL]
case mpr.intro.intro.intro.intro.inr.intro.inl
k m n : ℤ
⊢ PythagoreanTriple (k * (2 * m * n)) (k * (m ^ 2 - n ^ 2)) (k * (m ^ 2 + n ^ 2))
[PROOFSTEP]
delta PythagoreanTriple
[GOAL]
case mpr.intro.intro.intro.intro.inr.intro.inr
k m n : ℤ
⊢ PythagoreanTriple (k * (2 * m * n)) (k * (m ^ 2 - n ^ 2)) (-k * (m ^ 2 + n ^ 2))
[PROOFSTEP]
delta PythagoreanTriple
[GOAL]
case mpr.intro.intro.intro.intro.inl.intro.inl
k m n : ℤ
⊢ k * (m ^ 2 - n ^ 2) * (k * (m ^ 2 - n ^ 2)) + k * (2 * m * n) * (k * (2 * m * n)) =
    k * (m ^ 2 + n ^ 2) * (k * (m ^ 2 + n ^ 2))
[PROOFSTEP]
ring
[GOAL]
case mpr.intro.intro.intro.intro.inl.intro.inr
k m n : ℤ
⊢ k * (m ^ 2 - n ^ 2) * (k * (m ^ 2 - n ^ 2)) + k * (2 * m * n) * (k * (2 * m * n)) =
    -k * (m ^ 2 + n ^ 2) * (-k * (m ^ 2 + n ^ 2))
[PROOFSTEP]
ring
[GOAL]
case mpr.intro.intro.intro.intro.inr.intro.inl
k m n : ℤ
⊢ k * (2 * m * n) * (k * (2 * m * n)) + k * (m ^ 2 - n ^ 2) * (k * (m ^ 2 - n ^ 2)) =
    k * (m ^ 2 + n ^ 2) * (k * (m ^ 2 + n ^ 2))
[PROOFSTEP]
ring
[GOAL]
case mpr.intro.intro.intro.intro.inr.intro.inr
k m n : ℤ
⊢ k * (2 * m * n) * (k * (2 * m * n)) + k * (m ^ 2 - n ^ 2) * (k * (m ^ 2 - n ^ 2)) =
    -k * (m ^ 2 + n ^ 2) * (-k * (m ^ 2 + n ^ 2))
[PROOFSTEP]
ring
