Theorem: corners_theorem_nat
File: Mathlib/Combinatorics/Additive/Corner/Roth.lean

Proof steps:
state_before: G : Type u_1
inst✝¹ : AddCommGroup G
inst✝ : Fintype G
A✝ B : Finset (G × G)
a b c d x y : G
n : ℕ
ε : ℝ
hε : 0 < ε
hn : cornersTheoremBound (ε / 9) ≤ n
A : Finset (ℕ × ℕ)
hAn : A ⊆ range n ×ˢ range n
hAε : ε * ↑n ^ 2 ≤ ↑A.card
⊢ ¬IsCornerFree ↑A
state_after: G : Type u_1
inst✝¹ : AddCommGroup G
inst✝ : Fintype G
A✝ B : Finset (G × G)
a b c d x y : G
n : ℕ
ε : ℝ
hε : 0 < ε
hn : cornersTheoremBound (ε / 9) ≤ n
A : Finset (ℕ × ℕ)
hAn : A ⊆ range n ×ˢ range n
hAε : ε * ↑n ^ 2 ≤ ↑A.card
hA : IsCornerFree ↑A
⊢ False
tactic: rintro hA
state_before: G : Type u_1
inst✝¹ : AddCommGroup G
inst✝ : Fintype G
A✝ B : Finset (G × G)
a b c d x y : G
n : ℕ
ε : ℝ
hε : 0 < ε
hn : cornersTheoremBound (ε / 9) ≤ n
A : Finset (ℕ × ℕ)
hAn : A ⊆ range n ×ˢ range n
hAε : ε * ↑n ^ 2 ≤ ↑A.card
hA : IsCornerFree ↑A
⊢ False
state_after: G : Type u_1
inst✝¹ : AddCommGroup G
inst✝ : Fintype G
A✝ B : Finset (G × G)
a b c d x y : G
n : ℕ
ε : ℝ
hε : 0 < ε
hn : cornersTheoremBound (ε / 9) ≤ n
A : Finset (ℕ × ℕ)
hAn : ↑A ⊆ ↑(range n) ×ˢ ↑(range n)
hAε : ε * ↑n ^ 2 ≤ ↑A.card
hA : IsCornerFree ↑A
⊢ False
tactic: rw [← coe_subset, coe_product] at hAn
state_before: G : Type u_1
inst✝¹ : AddCommGroup G
inst✝ : Fintype G
A✝ B : Finset (G × G)
a b c d x y : G
n : ℕ
ε : ℝ
hε : 0 < ε
hn : cornersTheoremBound (ε / 9) ≤ n
A : Finset (ℕ × ℕ)
hAn : ↑A ⊆ ↑(range n) ×ˢ ↑(range n)
hAε : ε * ↑n ^ 2 ≤ ↑A.card
hA : IsCornerFree ↑A
⊢ False
state_after: G : Type u_1
inst✝¹ : AddCommGroup G
inst✝ : Fintype G
A✝ B : Finset (G × G)
a b c d x y : G
n : ℕ
ε : ℝ
hε : 0 < ε
hn : cornersTheoremBound (ε / 9) ≤ n
A : Finset (ℕ × ℕ)
hAn : ↑A ⊆ ↑(range n) ×ˢ ↑(range n)
hAε : ε * ↑n ^ 2 ≤ ↑A.card
hA : IsCornerFree ↑A
this : ↑A = Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A)
⊢ False
tactic: have : A = Prod.map Fin.val Fin.val ''
      (Prod.map Nat.cast Nat.cast '' A : Set (Fin (2 * n).succ × Fin (2 * n).succ)) := by
    rw [Set.image_image, Set.image_congr, Set.image_id]
    simp only [mem_coe, Nat.succ_eq_add_one, Prod.map_apply, Fin.val_natCast, id_eq, Prod.forall,
      Prod.mk.injEq, Nat.mod_succ_eq_iff_lt]
    rintro a b hab
    have := hAn hab
    simp at this
    omega
state_before: G : Type u_1
inst✝¹ : AddCommGroup G
inst✝ : Fintype G
A✝ B : Finset (G × G)
a b c d x y : G
n : ℕ
ε : ℝ
hε : 0 < ε
hn : cornersTheoremBound (ε / 9) ≤ n
A : Finset (ℕ × ℕ)
hAn : ↑A ⊆ ↑(range n) ×ˢ ↑(range n)
hAε : ε * ↑n ^ 2 ≤ ↑A.card
hA : IsCornerFree ↑A
this : ↑A = Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A)
⊢ False
state_after: G : Type u_1
inst✝¹ : AddCommGroup G
inst✝ : Fintype G
A✝ B : Finset (G × G)
a b c d x y : G
n : ℕ
ε : ℝ
hε : 0 < ε
hn : cornersTheoremBound (ε / 9) ≤ n
A : Finset (ℕ × ℕ)
hAn : ↑A ⊆ ↑(range n) ×ˢ ↑(range n)
hAε : ε * ↑n ^ 2 ≤ ↑A.card
hA : IsCornerFree (Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A))
this : ↑A = Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A)
⊢ False
tactic: rw [this] at hA
state_before: G : Type u_1
inst✝¹ : AddCommGroup G
inst✝ : Fintype G
A✝ B : Finset (G × G)
a b c d x y : G
n : ℕ
ε : ℝ
hε : 0 < ε
hn : cornersTheoremBound (ε / 9) ≤ n
A : Finset (ℕ × ℕ)
hAn : ↑A ⊆ ↑(range n) ×ˢ ↑(range n)
hAε : ε * ↑n ^ 2 ≤ ↑A.card
hA : IsCornerFree (Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A))
this : ↑A = Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A)
⊢ False
state_after: G : Type u_1
inst✝¹ : AddCommGroup G
inst✝ : Fintype G
A✝ B : Finset (G × G)
a b c d x y : G
n : ℕ
ε : ℝ
hε : 0 < ε
hn : cornersTheoremBound (ε / 9) ≤ n
A : Finset (ℕ × ℕ)
hAn : ↑A ⊆ ↑(range n) ×ˢ ↑(range n)
hAε : ε * ↑n ^ 2 ≤ ↑A.card
hA : IsCornerFree (Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A))
this✝ : ↑A = Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A)
this : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
⊢ False
tactic: have := Fin.isAddFreimanIso_Iio two_ne_zero (le_refl (2 * n))
state_before: G : Type u_1
inst✝¹ : AddCommGroup G
inst✝ : Fintype G
A✝ B : Finset (G × G)
a b c d x y : G
n : ℕ
ε : ℝ
hε : 0 < ε
hn : cornersTheoremBound (ε / 9) ≤ n
A : Finset (ℕ × ℕ)
hAn : ↑A ⊆ ↑(range n) ×ˢ ↑(range n)
hAε : ε * ↑n ^ 2 ≤ ↑A.card
hA : IsCornerFree (Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A))
this✝ : ↑A = Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A)
this : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
⊢ False
state_after: G : Type u_1
inst✝¹ : AddCommGroup G
inst✝ : Fintype G
A✝ B : Finset (G × G)
a b c d x y : G
n : ℕ
ε : ℝ
hε : 0 < ε
hn : cornersTheoremBound (ε / 9) ≤ n
A : Finset (ℕ × ℕ)
hAn : ↑A ⊆ ↑(range n) ×ˢ ↑(range n)
hAε : ε * ↑n ^ 2 ≤ ↑A.card
hA : IsCornerFree (Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A))
this✝¹ : ↑A = Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : IsCornerFree (Prod.map Nat.cast Nat.cast '' ↑A)
⊢ False
tactic: have := hA.of_image this.isAddFreimanHom Fin.val_injective.injOn $ by
    refine Set.image_subset_iff.2 $ hAn.trans fun x hx ↦ ?_
    simp only [coe_range, Set.mem_prod, Set.mem_Iio] at hx
    exact ⟨Fin.natCast_strictMono (by omega) hx.1, Fin.natCast_strictMono (by omega) hx.2⟩
state_before: G : Type u_1
inst✝¹ : AddCommGroup G
inst✝ : Fintype G
A✝ B : Finset (G × G)
a b c d x y : G
n : ℕ
ε : ℝ
hε : 0 < ε
hn : cornersTheoremBound (ε / 9) ≤ n
A : Finset (ℕ × ℕ)
hAn : ↑A ⊆ ↑(range n) ×ˢ ↑(range n)
hAε : ε * ↑n ^ 2 ≤ ↑A.card
hA : IsCornerFree (Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A))
this✝¹ : ↑A = Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : IsCornerFree (Prod.map Nat.cast Nat.cast '' ↑A)
⊢ False
state_after: G : Type u_1
inst✝¹ : AddCommGroup G
inst✝ : Fintype G
A✝ B : Finset (G × G)
a b c d x y : G
n : ℕ
ε : ℝ
hε : 0 < ε
hn : cornersTheoremBound (ε / 9) ≤ n
A : Finset (ℕ × ℕ)
hAn : ↑A ⊆ ↑(range n) ×ˢ ↑(range n)
hAε : ε * ↑n ^ 2 ≤ ↑A.card
hA : IsCornerFree (Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A))
this✝¹ : ↑A = Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : IsCornerFree ↑(image (Prod.map Nat.cast Nat.cast) A)
⊢ False
tactic: rw [← coe_image] at this
state_before: G : Type u_1
inst✝¹ : AddCommGroup G
inst✝ : Fintype G
A✝ B : Finset (G × G)
a b c d x y : G
n : ℕ
ε : ℝ
hε : 0 < ε
hn : cornersTheoremBound (ε / 9) ≤ n
A : Finset (ℕ × ℕ)
hAn : ↑A ⊆ ↑(range n) ×ˢ ↑(range n)
hAε : ε * ↑n ^ 2 ≤ ↑A.card
hA : IsCornerFree (Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A))
this✝¹ : ↑A = Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : IsCornerFree ↑(image (Prod.map Nat.cast Nat.cast) A)
⊢ False
state_after: G : Type u_1
inst✝¹ : AddCommGroup G
inst✝ : Fintype G
A✝ B : Finset (G × G)
a b c d x y : G
n : ℕ
ε : ℝ
hε : 0 < ε
hn : cornersTheoremBound (ε / 9) ≤ n
A : Finset (ℕ × ℕ)
hAn : ↑A ⊆ ↑(range n) ×ˢ ↑(range n)
hAε : ε * ↑n ^ 2 ≤ ↑A.card
hA : IsCornerFree (Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A))
this✝¹ : ↑A = Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : IsCornerFree ↑(image (Prod.map Nat.cast Nat.cast) A)
⊢ ε / 9 * ↑(Fintype.card (Fin (2 * n + 1))) ^ 2 ≤ ↑(image (Prod.map Nat.cast Nat.cast) A).card
tactic: refine corners_theorem (ε / 9) (by positivity) (by simp; omega) _ ?_ this
state_before: G : Type u_1
inst✝¹ : AddCommGroup G
inst✝ : Fintype G
A✝ B : Finset (G × G)
a b c d x y : G
n : ℕ
ε : ℝ
hε : 0 < ε
hn : cornersTheoremBound (ε / 9) ≤ n
A : Finset (ℕ × ℕ)
hAn : ↑A ⊆ ↑(range n) ×ˢ ↑(range n)
hAε : ε * ↑n ^ 2 ≤ ↑A.card
hA : IsCornerFree (Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A))
this✝¹ : ↑A = Prod.map Fin.val Fin.val '' (Prod.map Nat.cast Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : IsCornerFree ↑(image (Prod.map Nat.cast Nat.cast) A)
⊢ ε / 9 * ↑(Fintype.card (Fin (2 * n + 1))) ^ 2 ≤ ↑(image (Prod.map Nat.cast Nat.cast) A).card
state_after: no goals
tactic: calc
    _ = ε / 9 * (2 * n + 1) ^ 2 := by simp
    _ ≤ ε / 9 * (2 * n + n) ^ 2 := by gcongr; simp; unfold cornersTheoremBound at hn; omega
    _ = ε * n ^ 2 := by ring
    _ ≤ A.card := hAε
    _ = _ := by
      rw [card_image_of_injOn]
      have : Set.InjOn Nat.cast (range n) :=
        (CharP.natCast_injOn_Iio (Fin (2 * n).succ) (2 * n).succ).mono (by simp; omega)
      exact (this.prodMap this).mono hAn