Theorem: Fermat42.coprime_of_minimal
File: Mathlib/NumberTheory/Fermat4.lean

tactic: apply Int.gcd_eq_one_iff_coprime.mp
state_before: a b c : ℤ
h : Minimal a b c
⊢ IsCoprime a b

tactic: by_contra hab
state_before: a b c : ℤ
h : Minimal a b c
⊢ Int.gcd a b = 1

tactic: obtain ⟨p, hp, hpa, hpb⟩ := Nat.Prime.not_coprime_iff_dvd.mp hab
state_before: a b c : ℤ
h : Minimal a b c
hab : ¬Int.gcd a b = 1
⊢ False

tactic: obtain ⟨a1, rfl⟩ := Int.coe_nat_dvd_left.mpr hpa
state_before: case intro.intro.intro
a b c : ℤ
h : Minimal a b c
hab : ¬Int.gcd a b = 1
p : ℕ
hp : Nat.Prime p
hpa : p ∣ Int.natAbs a
hpb : p ∣ Int.natAbs b
⊢ False

tactic: obtain ⟨b1, rfl⟩ := Int.coe_nat_dvd_left.mpr hpb
state_before: case intro.intro.intro.intro
b c : ℤ
p : ℕ
hp : Nat.Prime p
hpb : p ∣ Int.natAbs b
a1 : ℤ
h : Minimal (↑p * a1) b c
hab : ¬Int.gcd (↑p * a1) b = 1
hpa : p ∣ Int.natAbs (↑p * a1)
⊢ False

tactic: have hpc : (p : ℤ) ^ 2 ∣ c := by
  rw [← Int.pow_dvd_pow_iff zero_lt_two, ← h.1.2.2]
  apply Dvd.intro (a1 ^ 4 + b1 ^ 4)
  ring
state_before: case intro.intro.intro.intro.intro
c : ℤ
p : ℕ
hp : Nat.Prime p
a1 : ℤ
hpa : p ∣ Int.natAbs (↑p * a1)
b1 : ℤ
hpb : p ∣ Int.natAbs (↑p * b1)
h : Minimal (↑p * a1) (↑p * b1) c
hab : ¬Int.gcd (↑p * a1) (↑p * b1) = 1
⊢ False

tactic: obtain ⟨c1, rfl⟩ := hpc
state_before: case intro.intro.intro.intro.intro
c : ℤ
p : ℕ
hp : Nat.Prime p
a1 : ℤ
hpa : p ∣ Int.natAbs (↑p * a1)
b1 : ℤ
hpb : p ∣ Int.natAbs (↑p * b1)
h : Minimal (↑p * a1) (↑p * b1) c
hab : ¬Int.gcd (↑p * a1) (↑p * b1) = 1
hpc : ↑p ^ 2 ∣ c
⊢ False

tactic: have hf : Fermat42 a1 b1 c1 :=
  (Fermat42.mul (Int.coe_nat_ne_zero.mpr (Nat.Prime.ne_zero hp))).mpr h.1
state_before: case intro.intro.intro.intro.intro.intro
p : ℕ
hp : Nat.Prime p
a1 : ℤ
hpa : p ∣ Int.natAbs (↑p * a1)
b1 : ℤ
hpb : p ∣ Int.natAbs (↑p * b1)
hab : ¬Int.gcd (↑p * a1) (↑p * b1) = 1
c1 : ℤ
h : Minimal (↑p * a1) (↑p * b1) (↑p ^ 2 * c1)
⊢ False

tactic: apply Nat.le_lt_antisymm (h.2 _ _ _ hf)
state_before: case intro.intro.intro.intro.intro.intro
p : ℕ
hp : Nat.Prime p
a1 : ℤ
hpa : p ∣ Int.natAbs (↑p * a1)
b1 : ℤ
hpb : p ∣ Int.natAbs (↑p * b1)
hab : ¬Int.gcd (↑p * a1) (↑p * b1) = 1
c1 : ℤ
h : Minimal (↑p * a1) (↑p * b1) (↑p ^ 2 * c1)
hf : Fermat42 a1 b1 c1
⊢ False

tactic: rw [Int.natAbs_mul, lt_mul_iff_one_lt_left, Int.natAbs_pow, Int.natAbs_ofNat]
state_before: case intro.intro.intro.intro.intro.intro
p : ℕ
hp : Nat.Prime p
a1 : ℤ
hpa : p ∣ Int.natAbs (↑p * a1)
b1 : ℤ
hpb : p ∣ Int.natAbs (↑p * b1)
hab : ¬Int.gcd (↑p * a1) (↑p * b1) = 1
c1 : ℤ
h : Minimal (↑p * a1) (↑p * b1) (↑p ^ 2 * c1)
hf : Fermat42 a1 b1 c1
⊢ Int.natAbs c1 < Int.natAbs (↑p ^ 2 * c1)

tactic: rw [← Int.pow_dvd_pow_iff zero_lt_two, ← h.1.2.2]
state_before: c : ℤ
p : ℕ
hp : Nat.Prime p
a1 : ℤ
hpa : p ∣ Int.natAbs (↑p * a1)
b1 : ℤ
hpb : p ∣ Int.natAbs (↑p * b1)
h : Minimal (↑p * a1) (↑p * b1) c
hab : ¬Int.gcd (↑p * a1) (↑p * b1) = 1
⊢ ↑p ^ 2 ∣ c

tactic: apply Dvd.intro (a1 ^ 4 + b1 ^ 4)
state_before: c : ℤ
p : ℕ
hp : Nat.Prime p
a1 : ℤ
hpa : p ∣ Int.natAbs (↑p * a1)
b1 : ℤ
hpb : p ∣ Int.natAbs (↑p * b1)
h : Minimal (↑p * a1) (↑p * b1) c
hab : ¬Int.gcd (↑p * a1) (↑p * b1) = 1
⊢ (↑p ^ 2) ^ 2 ∣ (↑p * a1) ^ 4 + (↑p * b1) ^ 4

tactic: ring
state_before: c : ℤ
p : ℕ
hp : Nat.Prime p
a1 : ℤ
hpa : p ∣ Int.natAbs (↑p * a1)
b1 : ℤ
hpb : p ∣ Int.natAbs (↑p * b1)
h : Minimal (↑p * a1) (↑p * b1) c
hab : ¬Int.gcd (↑p * a1) (↑p * b1) = 1
⊢ (↑p ^ 2) ^ 2 * (a1 ^ 4 + b1 ^ 4) = (↑p * a1) ^ 4 + (↑p * b1) ^ 4

tactic: exact Nat.one_lt_pow _ _ zero_lt_two (Nat.Prime.one_lt hp)
state_before: case intro.intro.intro.intro.intro.intro
p : ℕ
hp : Nat.Prime p
a1 : ℤ
hpa : p ∣ Int.natAbs (↑p * a1)
b1 : ℤ
hpb : p ∣ Int.natAbs (↑p * b1)
hab : ¬Int.gcd (↑p * a1) (↑p * b1) = 1
c1 : ℤ
h : Minimal (↑p * a1) (↑p * b1) (↑p ^ 2 * c1)
hf : Fermat42 a1 b1 c1
⊢ 1 < p ^ 2

tactic: exact Nat.pos_of_ne_zero (Int.natAbs_ne_zero.2 (ne_zero hf))
state_before: case intro.intro.intro.intro.intro.intro
p : ℕ
hp : Nat.Prime p
a1 : ℤ
hpa : p ∣ Int.natAbs (↑p * a1)
b1 : ℤ
hpb : p ∣ Int.natAbs (↑p * b1)
hab : ¬Int.gcd (↑p * a1) (↑p * b1) = 1
c1 : ℤ
h : Minimal (↑p * a1) (↑p * b1) (↑p ^ 2 * c1)
hf : Fermat42 a1 b1 c1
⊢ 0 < Int.natAbs c1