case pos
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
⊢ ↑(Int.gcd x y) ∣ z

case neg
x y z : ℤ
h : PythagoreanTriple x y z
h0 : ¬Int.gcd x y = 0
⊢ ↑(Int.gcd x y) ∣ z
x y z : ℤ
h : PythagoreanTriple x y z
⊢ ↑(Int.gcd x y) ∣ z
by_cases h0 : Int.gcd x y = 0
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
case neg
x y z : ℤ
h : PythagoreanTriple x y z
h0 : ¬Int.gcd x y = 0
⊢ ↑(Int.gcd x y) ∣ z
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)
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
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
rw [Int.gcd_mul_right, h2, Int.natAbs_ofNat, one_mul]
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)
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
rw [← Int.pow_dvd_pow_iff zero_lt_two, sq z, ← h.eq]
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)
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)
rw [(by ring : x0 * k * (x0 * k) + y0 * k * (y0 * k) = (k : ℤ) ^ 2 * (x0 * x0 + y0 * y0))]
no goals
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)
exact dvd_mul_right _ _
case pos
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
⊢ ↑(Int.gcd x y) ∣ z
case pos
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
⊢ ↑(Int.gcd x y) ∣ z
have hx : x = 0 := by
  apply Int.natAbs_eq_zero.mp
  apply Nat.eq_zero_of_gcd_eq_zero_left h0
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
case pos
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
⊢ ↑(Int.gcd x y) ∣ z
have hy : y = 0 := by
  apply Int.natAbs_eq_zero.mp
  apply Nat.eq_zero_of_gcd_eq_zero_right h0
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
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
have hz : z = 0 := by
  simpa only [PythagoreanTriple, hx, hy, add_zero, zero_eq_mul, MulZeroClass.mul_zero,
    or_self_iff] using h
no goals
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
simp only [hz, dvd_zero]
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
⊢ Int.natAbs x = 0
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
⊢ x = 0
apply Int.natAbs_eq_zero.mp
no goals
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
⊢ Int.natAbs x = 0
apply Nat.eq_zero_of_gcd_eq_zero_left h0
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
⊢ Int.natAbs y = 0
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
⊢ y = 0
apply Int.natAbs_eq_zero.mp
no goals
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
⊢ Int.natAbs y = 0
apply Nat.eq_zero_of_gcd_eq_zero_right h0
no goals
x y z : ℤ
h : PythagoreanTriple x y z
h0 : Int.gcd x y = 0
hx : x = 0
hy : y = 0
⊢ z = 0
simpa only [PythagoreanTriple, hx, hy, add_zero, zero_eq_mul, MulZeroClass.mul_zero,
  or_self_iff] using h
no goals
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)
ring