Theorem: coprime_sq_sub_mul_of_even_odd
File: Mathlib/NumberTheory/PythagoreanTriples.lean

tactic: by_contra H
state_before: 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

tactic: obtain ⟨p, hp, hp1, hp2⟩ := Nat.Prime.not_coprime_iff_dvd.mp H
state_before: 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

tactic: rw [← Int.coe_nat_dvd_left] at hp1 hp2
state_before: 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

tactic: have hnp : ¬(p : ℤ) ∣ Int.gcd m n := by
  rw [h]
  norm_cast
  exact mt Nat.dvd_one.mp (Nat.Prime.ne_one hp)
state_before: 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

tactic: cases' Int.Prime.dvd_mul hp hp2 with hp2m hpn
state_before: 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

tactic: rw [Int.gcd_comm] at hnp
state_before: 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

tactic: apply mt (Int.dvd_gcd (Int.coe_nat_dvd_left.mpr hpn)) hnp
state_before: 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

tactic: apply (or_self_iff _).mp
state_before: 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

tactic: apply Int.Prime.dvd_mul' hp
state_before: 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

tactic: rw [(by ring : m * m = m ^ 2 - n ^ 2 + n * n)]
state_before: 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

tactic: apply dvd_add hp1
state_before: 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

tactic: exact (Int.coe_nat_dvd_left.mpr hpn).mul_right n
state_before: 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

tactic: rw [h]
state_before: 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)

tactic: norm_cast
state_before: 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

tactic: exact mt Nat.dvd_one.mp (Nat.Prime.ne_one hp)
state_before: 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

tactic: rw [Int.natAbs_mul] at hp2m
state_before: 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

tactic: cases' (Nat.Prime.dvd_mul hp).mp hp2m with hp2 hpm
state_before: 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

tactic: apply mt (Int.dvd_gcd (Int.coe_nat_dvd_left.mpr hpm)) hnp
state_before: 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

tactic: apply (or_self_iff _).mp
state_before: 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

tactic: apply Int.Prime.dvd_mul' hp
state_before: 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

tactic: rw [(by ring : n * n = -(m ^ 2 - n ^ 2) + m * m)]
state_before: 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

tactic: exact hp1.neg_right.add ((Int.coe_nat_dvd_left.2 hpm).mul_right _)
state_before: 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

tactic: have hp2' : p = 2 := (Nat.le_of_dvd zero_lt_two hp2).antisymm hp.two_le
state_before: 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

tactic: revert hp1
state_before: 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

tactic: rw [hp2']
state_before: 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

tactic: apply mt Int.emod_eq_zero_of_dvd
state_before: 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

tactic: field_simp [sq, Int.sub_emod, Int.mul_emod, hm, hn]
state_before: 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

tactic: ring
state_before: 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

tactic: ring
state_before: 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