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

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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : A ⊆ range n
hAε : ε * ↑n ≤ ↑A.card
⊢ ¬ThreeAPFree ↑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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : A ⊆ range n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree ↑A
⊢ False

tactic: rw [← coe_subset, coe_range] 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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : A ⊆ range n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree ↑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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree ↑A
⊢ False

tactic: have : A = Fin.val '' (Nat.cast '' A : Set (Fin (2 * n).succ)) := by
  rw [Set.image_image, Set.image_congr, Set.image_id]
  simp only [mem_coe, Nat.succ_eq_add_one, Fin.val_natCast, id_eq, Nat.mod_succ_eq_iff_lt]
  rintro a ha
  have := hAn ha
  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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree ↑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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree ↑A
this : ↑A = Fin.val '' (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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree ↑A
this : ↑A = Fin.val '' (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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this : ↑A = Fin.val '' (Nat.cast '' ↑A)
⊢ 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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this : ↑A = Fin.val '' (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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
⊢ False

tactic: have := hA.of_image this.isAddFreimanHom Fin.val_injective.injOn $ Set.image_subset_iff.2 $
    hAn.trans fun x hx ↦ Fin.natCast_strictMono (by omega) $ by
      simpa only [coe_range, Set.mem_Iio] using hx
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝ : ↑A = Fin.val '' (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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ((fun x => ↑x) '' ↑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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ((fun x => ↑x) '' ↑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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ False

tactic: refine roth_3ap_theorem (ε / 3) (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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) 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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ ε / 3 * ↑(Fintype.card (Fin (2 * n + 1))) ≤ ↑(image (fun x => ↑x) A).card

tactic: calc
  _ = ε / 3 * (2 * n + 1) := by simp
  _ ≤ ε / 3 * (2 * n + n) := by gcongr; simp; unfold cornersTheoremBound at hG; omega
  _ = ε * n := by ring
  _ ≤ A.card := hAε
  _ = _ := by
    rw [card_image_of_injOn]
    exact (CharP.natCast_injOn_Iio (Fin (2 * n).succ) (2 * n).succ).mono $ hAn.trans $ by
      simp; 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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ ε / 3 * ↑(Fintype.card (Fin (2 * n + 1))) ≤ ↑(image (fun x => ↑x) A).card
state_after: no goals

tactic: rw [Set.image_image, Set.image_congr, Set.image_id]
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree ↑A
⊢ ↑A = Fin.val '' (Nat.cast '' ↑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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree ↑A
⊢ ∀ a ∈ ↑A, ↑↑a = id a

tactic: simp only [mem_coe, Nat.succ_eq_add_one, Fin.val_natCast, id_eq, Nat.mod_succ_eq_iff_lt]
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree ↑A
⊢ ∀ a ∈ ↑A, ↑↑a = id 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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree ↑A
⊢ ∀ a ∈ A, a < 2 * n + 1

tactic: rintro a 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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree ↑A
⊢ ∀ a ∈ A, a < 2 * n + 1
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree ↑A
a : ℕ
ha : a ∈ A
⊢ a < 2 * n + 1

tactic: have := hAn 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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree ↑A
a : ℕ
ha : a ∈ A
⊢ a < 2 * n + 1
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree ↑A
a : ℕ
ha : a ∈ A
this : a ∈ Set.Iio n
⊢ a < 2 * n + 1

tactic: simp 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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree ↑A
a : ℕ
ha : a ∈ A
this : a ∈ Set.Iio n
⊢ a < 2 * n + 1
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree ↑A
a : ℕ
ha : a ∈ A
this : a < n
⊢ a < 2 * n + 1

tactic: 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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree ↑A
a : ℕ
ha : a ∈ A
this : a < n
⊢ a < 2 * n + 1
state_after: no goals

tactic: 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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
x : ℕ
hx : x ∈ Set.Iio n
⊢ n ≤ 2 * n
state_after: no goals

tactic: simpa only [coe_range, Set.mem_Iio] using hx
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
x : ℕ
hx : x ∈ Set.Iio n
⊢ x < n
state_after: no goals

tactic: positivity
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ 0 < ε / 3
state_after: no goals

tactic: simp
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ cornersTheoremBound (ε / 3) ≤ Fintype.card (Fin (2 * n + 1))
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ cornersTheoremBound (ε / 3) ≤ 2 * n + 1

tactic: 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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ cornersTheoremBound (ε / 3) ≤ 2 * n + 1
state_after: no goals

tactic: simp
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ ε / 3 * ↑(Fintype.card (Fin (2 * n + 1))) = ε / 3 * (2 * ↑n + 1)
state_after: no goals

tactic: gcongr
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ ε / 3 * (2 * ↑n + 1) ≤ ε / 3 * (2 * ↑n + ↑n)
state_after: case h.bc
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ 1 ≤ ↑n

tactic: simp
state_before: case h.bc
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ 1 ≤ ↑n
state_after: case h.bc
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ 1 ≤ n

tactic: unfold cornersTheoremBound at hG
state_before: case h.bc
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ 1 ≤ n
state_after: case h.bc
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 < ε
hG : ⌊(triangleRemovalBound (ε / 3 / 9) * 27)⁻¹⌋₊ + 1 ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ 1 ≤ n

tactic: omega
state_before: case h.bc
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 < ε
hG : ⌊(triangleRemovalBound (ε / 3 / 9) * 27)⁻¹⌋₊ + 1 ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ 1 ≤ n
state_after: no goals

tactic: ring
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ ε / 3 * (2 * ↑n + ↑n) = ε * ↑n
state_after: no goals

tactic: rw [card_image_of_injOn]
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ ↑A.card = ↑(image (fun x => ↑x) A).card
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ Set.InjOn (fun x => ↑x) ↑A

tactic: exact (CharP.natCast_injOn_Iio (Fin (2 * n).succ) (2 * n).succ).mono $ hAn.trans $ by
  simp; 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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ Set.InjOn (fun x => ↑x) ↑A
state_after: no goals

tactic: simp
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ Set.Iio n ⊆ Set.Iio (2 * n).succ
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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ n ≤ 2 * n + 1

tactic: 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 < ε
hG : cornersTheoremBound (ε / 3) ≤ n
A : Finset ℕ
hAn : ↑A ⊆ Set.Iio n
hAε : ε * ↑n ≤ ↑A.card
hA : ThreeAPFree (Fin.val '' (Nat.cast '' ↑A))
this✝¹ : ↑A = Fin.val '' (Nat.cast '' ↑A)
this✝ : IsAddFreimanIso 2 (Set.Iio ↑n) (Set.Iio n) Fin.val
this : ThreeAPFree ↑(image (fun x => ↑x) A)
⊢ n ≤ 2 * n + 1
state_after: no goals