/-
Copyright 2025 The Formal Conjectures Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-/
import FormalConjecturesUtilErdős Problem 1097
[Bo99] Bourgain, J., On the dimension of {K}akeya sets and related maximal inequalities. Geom. Funct. Anal. (1999), 256--282
[KaTa99] Katz, Nets Hawk and Tao, Terence, Bounds on arithmetic projections, and applications to the {K}akeya conjecture. Math. Res. Lett. (1999), 625--630.
[Le15] Lemm, Marius, New counterexamples for sums-differences. Proc. Amer. Math. Soc. (2015), 3863--3868.
[GGTW25] B. Georgiev, J. Gómez-Serrano, T. Tao, and A. Wagner, Mathematical exploration and discovery at scale. arXiv:2511.02864 (2025).
namespace Erdos1097
Given a finite set of integers A (modelled as a Finset ℤ), the set
CommonDifferencesThreeTermAP A consists of all integers d such that there
is a non-trivial three-term arithmetic progression a, b, c ∈ A with
b - a = d and c - b = d.
def CommonDifferencesThreeTermAP (A : Finset ℤ) : Set ℤ :=
{d : ℤ | d ≠ 0 ∧ ∃ a ∈ A, ∃ b ∈ A, ∃ c ∈ A, b - a = d ∧ c - b = d}
The main conjecture: for any finite set of integers $A$ with $|A| = n$, the number of distinct common differences in three-term arithmetic progressions is $O(n^{3/2})$.
This conjecture was resolved negatively by showing that the problem is exactly equivalent to Bourgain's sums-differences question [Bo99], which was introduced as an arithmetic path towards the Kakeya conjecture. Under this equivalence:
The greatest achievable exponent for this problem is equal to the smallest constant $c$ achievable for Bourgain's sums-differences question: $$|A -_G B| \ll \max(|A|, |B|, |A +_G B|)^c$$
The $O(n^{3/2})$ prediction is disproved because the lower bound has been shown to satisfy $c \ge 1.77898$ (due to Zheng and AlphaEvolve [GGTW25], improving on Lemm [Le15]), which is strictly greater than $3/2 = 1.5$.
The best known upper bound is $c \le 11/6 \approx 1.833$ (due to Katz and Tao [KaTa99]).
While the specific $O(n^{3/2})$ prediction is resolved negatively, the general question of determining the exact optimal exponent $c$ remains open.
@[category research solved, AMS 11, formal_proof using formal_conjectures at
"https://github.com/mo271/formal-conjectures/blob/f13dd54b520cdf2136fdd3a04f0f9fa50e311358/FormalConjectures/ErdosProblems/1097.lean#L306"]
theorem erdos_1097 : answer(False) ↔ ∃ C > (0 : ℝ), ∀ (A : Finset ℤ),
(CommonDifferencesThreeTermAP A).ncard ≤ C * (A.card : ℝ) ^ (3 / 2 : ℝ) := ⊢ False ↔ ∃ C > 0, ∀ (A : Finset ℤ), ↑(CommonDifferencesThreeTermAP A).ncard ≤ C * ↑A.card ^ (3 / 2)
All goals completed! 🐙
A weaker bound has been proven: there are always at most $n^2$ such values of $d$.
@[category textbook, AMS 11]
theorem erdos_1097.variants.weaker :
∀ A, (CommonDifferencesThreeTermAP A).ncard ≤ A.card ^ 2 := ⊢ ∀ (A : Finset ℤ), (CommonDifferencesThreeTermAP A).ncard ≤ A.card ^ 2
A:Finset ℤ⊢ (CommonDifferencesThreeTermAP A).ncard ≤ A.card ^ 2
A:Finset ℤD:Finset ℤ := Finset.image (fun p => p.2 - p.1) (A ×ˢ A)⊢ (CommonDifferencesThreeTermAP A).ncard ≤ A.card ^ 2
have h_sub : CommonDifferencesThreeTermAP A ⊆ (D : Set ℤ) := ⊢ ∀ (A : Finset ℤ), (CommonDifferencesThreeTermAP A).ncard ≤ A.card ^ 2
A:Finset ℤD:Finset ℤ := Finset.image (fun p => p.2 - p.1) (A ×ˢ A)d:ℤa:ℤha:a ∈ Ab:ℤhb:b ∈ Ahab:b - a = d⊢ d ∈ ↑D
All goals completed! 🐙
calc (CommonDifferencesThreeTermAP A).ncard
≤ (D : Set ℤ).ncard := Set.ncard_le_ncard h_sub D.finite_toSet
_ = D.card := Set.ncard_coe_finset _
_ ≤ (A ×ˢ A).card := Finset.card_image_le
_ = A.card * A.card := Finset.card_product _ _
_ = A.card ^ 2 := (sq _).symm
A trivial lower bound: for sufficiently large n there exist sets $A$ with $|A| = n$ that contain at least $\Omega(n)$
distinct common differences of three-term arithmetic progressions.
@[category textbook, AMS 11]
theorem erdos_1097.variants.lower_bound : ∃ c > (0 : ℝ), ∀ᶠ n in Filter.atTop, ∃ (A : Finset ℤ),
A.card = n ∧ c * (n : ℝ) ≤ (CommonDifferencesThreeTermAP A).ncard := ⊢ ∃ c > 0, ∀ᶠ (n : ℕ) in Filter.atTop, ∃ A, A.card = n ∧ c * ↑n ≤ ↑(CommonDifferencesThreeTermAP A).ncard
refine ⟨1/4, ⊢ 1 / 4 > 0 All goals completed! 🐙, ?_⟩
⊢ ∃ a, ∀ b ≥ a, ∃ A, A.card = b ∧ 1 / 4 * ↑b ≤ ↑(CommonDifferencesThreeTermAP A).ncard
n:ℕhn:n ≥ 4⊢ ∃ A, A.card = n ∧ 1 / 4 * ↑n ≤ ↑(CommonDifferencesThreeTermAP A).ncard
n:ℕhn:n ≥ 4⊢ (Finset.image (fun k => ↑k) (Finset.range n)).card = nn:ℕhn:n ≥ 4⊢ 1 / 4 * ↑n ≤ ↑(CommonDifferencesThreeTermAP (Finset.image (fun k => ↑k) (Finset.range n))).ncard
n:ℕhn:n ≥ 4⊢ (Finset.image (fun k => ↑k) (Finset.range n)).card = n All goals completed! 🐙
n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)⊢ 1 / 4 * ↑n ≤ ↑(CommonDifferencesThreeTermAP A).ncard
n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rfl⊢ 1 / 4 * ↑n ≤ ↑(CommonDifferencesThreeTermAP A).ncard
n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)⊢ 1 / 4 * ↑n ≤ ↑(CommonDifferencesThreeTermAP A).ncard
have hk_ge_nat : 4 * k ≥ n := ⊢ ∃ c > 0, ∀ᶠ (n : ℕ) in Filter.atTop, ∃ A, A.card = n ∧ c * ↑n ≤ ↑(CommonDifferencesThreeTermAP A).ncard n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)⊢ n ≤ 4 * ((n - 1) / 2); All goals completed! 🐙
have hD_card : D.card = k := ⊢ ∃ c > 0, ∀ᶠ (n : ℕ) in Filter.atTop, ∃ A, A.card = n ∧ c * ↑n ≤ ↑(CommonDifferencesThreeTermAP A).ncard
n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)⊢ Function.Injective fun i => ↑(i + 1)
intro a n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)a:ℕb:ℕ⊢ (fun i => ↑(i + 1)) a = (fun i => ↑(i + 1)) b → a = b n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)a:ℕb:ℕh:(fun i => ↑(i + 1)) a = (fun i => ↑(i + 1)) b⊢ a = b
n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)a:ℕb:ℕh:↑(a + 1) = ↑(b + 1)⊢ a = b
have : (a + 1 : ℤ) = (b + 1 : ℤ) := ⊢ ∃ c > 0, ∀ᶠ (n : ℕ) in Filter.atTop, ∃ A, A.card = n ∧ c * ↑n ≤ ↑(CommonDifferencesThreeTermAP A).ncard All goals completed! 🐙
All goals completed! 🐙
have h_finite : (CommonDifferencesThreeTermAP A).Finite := ⊢ ∃ c > 0, ∀ᶠ (n : ℕ) in Filter.atTop, ∃ A, A.card = n ∧ c * ↑n ≤ ↑(CommonDifferencesThreeTermAP A).ncard
n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))⊢ CommonDifferencesThreeTermAP A ⊆ ↑(Finset.image (fun p => p.2 - p.1) (A ×ˢ A))
n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))d:ℤa:ℤha:a ∈ Ab:ℤhb:b ∈ Ahab:b - a = d⊢ d ∈ ↑(Finset.image (fun p => p.2 - p.1) (A ×ˢ A))
All goals completed! 🐙
have hD_sub : (D : Set ℤ) ⊆ CommonDifferencesThreeTermAP A := ⊢ ∃ c > 0, ∀ᶠ (n : ℕ) in Filter.atTop, ∃ A, A.card = n ∧ c * ↑n ≤ ↑(CommonDifferencesThreeTermAP A).ncard
intro d n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))d:ℤhd:d ∈ ↑D⊢ d ∈ CommonDifferencesThreeTermAP A
n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))d:ℤhd:∃ a ∈ Finset.range k, ↑(a + 1) = d⊢ d ∈ CommonDifferencesThreeTermAP A
n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))i:ℕhi:i ∈ Finset.range k⊢ ↑(i + 1) ∈ CommonDifferencesThreeTermAP A
n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))i:ℕhi:i < k⊢ ↑(i + 1) ∈ CommonDifferencesThreeTermAP A
have h2d_lt : 2 * (i + 1) < n := ⊢ ∃ c > 0, ∀ᶠ (n : ℕ) in Filter.atTop, ∃ A, A.card = n ∧ c * ↑n ≤ ↑(CommonDifferencesThreeTermAP A).ncard n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))i:ℕhi:i < (n - 1) / 2⊢ 2 * (i + 1) < n; All goals completed! 🐙
refine ⟨n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))i:ℕhi:i < kh2d_lt:2 * (i + 1) < n := Decidable.byContradiction fun a => lower_bound._proof_3 n hn hD_card i (Eq.mp (congrArg (LT.lt i) hk_def) hi) a⊢ ↑(i + 1) ≠ 0 n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))i:ℕhi:i < kh2d_lt:2 * (i + 1) < n := Decidable.byContradiction fun a => lower_bound._proof_3 n hn hD_card i (Eq.mp (congrArg (LT.lt i) hk_def) hi) a⊢ ↑i + 1 ≠ 0; All goals completed! 🐙, 0, ?_, ((i + 1 : ℕ) : ℤ), ?_,
((2 * (i + 1) : ℕ) : ℤ), ?_, n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))i:ℕhi:i < kh2d_lt:2 * (i + 1) < n := Decidable.byContradiction fun a => lower_bound._proof_3 n hn hD_card i (Eq.mp (congrArg (LT.lt i) hk_def) hi) a⊢ ↑(i + 1) - 0 = ↑(i + 1) n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))i:ℕhi:i < kh2d_lt:2 * (i + 1) < n := Decidable.byContradiction fun a => lower_bound._proof_3 n hn hD_card i (Eq.mp (congrArg (LT.lt i) hk_def) hi) a⊢ ↑i + 1 - 0 = ↑i + 1; All goals completed! 🐙, n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))i:ℕhi:i < kh2d_lt:2 * (i + 1) < n := Decidable.byContradiction fun a => lower_bound._proof_3 n hn hD_card i (Eq.mp (congrArg (LT.lt i) hk_def) hi) a⊢ ↑(2 * (i + 1)) - ↑(i + 1) = ↑(i + 1) n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))i:ℕhi:i < kh2d_lt:2 * (i + 1) < n := Decidable.byContradiction fun a => lower_bound._proof_3 n hn hD_card i (Eq.mp (congrArg (LT.lt i) hk_def) hi) a⊢ 2 * (↑i + 1) - (↑i + 1) = ↑i + 1; All goals completed! 🐙⟩
n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))i:ℕhi:i < kh2d_lt:2 * (i + 1) < n := Decidable.byContradiction fun a => lower_bound._proof_3 n hn hD_card i (Eq.mp (congrArg (LT.lt i) hk_def) hi) a⊢ 0 ∈ A exact Finset.mem_image.mpr ⟨0, Finset.mem_range.mpr (n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))i:ℕhi:i < kh2d_lt:2 * (i + 1) < n := Decidable.byContradiction fun a => lower_bound._proof_3 n hn hD_card i (Eq.mp (congrArg (LT.lt i) hk_def) hi) a⊢ 0 < n All goals completed! 🐙), n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))i:ℕhi:i < kh2d_lt:2 * (i + 1) < n := Decidable.byContradiction fun a => lower_bound._proof_3 n hn hD_card i (Eq.mp (congrArg (LT.lt i) hk_def) hi) a⊢ ↑0 = 0 All goals completed! 🐙⟩
n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))i:ℕhi:i < kh2d_lt:2 * (i + 1) < n := Decidable.byContradiction fun a => lower_bound._proof_3 n hn hD_card i (Eq.mp (congrArg (LT.lt i) hk_def) hi) a⊢ ↑(i + 1) ∈ A exact Finset.mem_image.mpr ⟨i + 1, Finset.mem_range.mpr (n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))i:ℕhi:i < kh2d_lt:2 * (i + 1) < n := Decidable.byContradiction fun a => lower_bound._proof_3 n hn hD_card i (Eq.mp (congrArg (LT.lt i) hk_def) hi) a⊢ i + 1 < n All goals completed! 🐙), rfl⟩
n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))i:ℕhi:i < kh2d_lt:2 * (i + 1) < n := Decidable.byContradiction fun a => lower_bound._proof_3 n hn hD_card i (Eq.mp (congrArg (LT.lt i) hk_def) hi) a⊢ ↑(2 * (i + 1)) ∈ A All goals completed! 🐙
calc (1 / 4 : ℝ) * n
= (n : ℝ) / 4 := n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))hD_sub:↑D ⊆ CommonDifferencesThreeTermAP A :=
fun ⦃d⦄ hd =>
Exists.casesOn
(Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_image))
(Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_coe)) hd))
fun i h =>
And.casesOn h fun hi right =>
right ▸
have h2d_lt :=
Decidable.byContradiction fun a =>
lower_bound._proof_3 n hn hD_card i
(Eq.mp (congrArg (LT.lt i) hk_def) (Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_range)) hi)) a;
⟨Eq.mpr (id (congrArg (fun x => x ≠ 0) (Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(ne_of_gt
(Right.add_pos_of_nonneg_of_pos (Nat.cast_nonneg' i)
(Mathlib.Meta.Positivity.pos_of_isNat (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1))
(Eq.refl (Nat.ble 1 1))))),
Exists.intro 0
⟨Finset.mem_image.mpr
(Exists.intro 0
⟨Finset.mem_range.mpr (Decidable.byContradiction fun a => lower_bound._proof_4 n hn i a),
of_eq_true
(Eq.trans (congrArg (fun x => x = 0) Nat.cast_zero) (eq_true_of_decide (Eq.refl true)))⟩),
Exists.intro ↑(i + 1)
⟨Finset.mem_image.mpr
(Exists.intro (i + 1)
⟨Finset.mem_range.mpr (Decidable.byContradiction fun a => lower_bound._proof_5 n hn i h2d_lt a),
rfl⟩),
Exists.intro ↑(2 * (i + 1))
⟨Finset.mem_image.mpr (Exists.intro (2 * (i + 1)) ⟨Finset.mem_range.mpr h2d_lt, rfl⟩),
⟨Eq.mpr
(id
(congr
(congrArg (fun x => Eq (x - 0))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one)))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))
(Mathlib.Tactic.Ring.sub_pf Mathlib.Tactic.Ring.neg_zero
(Mathlib.Tactic.Ring.add_pf_add_zero
(Nat.rawCast 1 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))),
Eq.mpr
(id
(congr
(congrArg Eq
(congr
(congrArg HSub.hSub
(Eq.trans (Nat.cast_mul 2 (i + 1))
(congrArg (HMul.hMul 2)
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one)))))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑i) (Nat.rawCast 1)
(Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2)))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.add_pf_add_lt (Nat.rawCast 2)
(Mathlib.Tactic.Ring.add_pf_zero_add (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.zero_mul
(Nat.rawCast 1 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))
(Mathlib.Tactic.Ring.add_pf_add_zero
(Nat.rawCast 2 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1)))))
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑i) (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt
(Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Tactic.Ring.add_overlap_pf (↑i) (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsNat.to_isInt
(Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Eq.refl (Int.ofNat 1))))))
(Mathlib.Tactic.Ring.add_pf_zero_add 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))⟩⟩⟩⟩⟩⊢ 1 / 4 * ↑n = ↑n / 4 All goals completed! 🐙
_ ≤ (k : ℝ) := n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))hD_sub:↑D ⊆ CommonDifferencesThreeTermAP A :=
fun ⦃d⦄ hd =>
Exists.casesOn
(Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_image))
(Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_coe)) hd))
fun i h =>
And.casesOn h fun hi right =>
right ▸
have h2d_lt :=
Decidable.byContradiction fun a =>
lower_bound._proof_3 n hn hD_card i
(Eq.mp (congrArg (LT.lt i) hk_def) (Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_range)) hi)) a;
⟨Eq.mpr (id (congrArg (fun x => x ≠ 0) (Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(ne_of_gt
(Right.add_pos_of_nonneg_of_pos (Nat.cast_nonneg' i)
(Mathlib.Meta.Positivity.pos_of_isNat (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1))
(Eq.refl (Nat.ble 1 1))))),
Exists.intro 0
⟨Finset.mem_image.mpr
(Exists.intro 0
⟨Finset.mem_range.mpr (Decidable.byContradiction fun a => lower_bound._proof_4 n hn i a),
of_eq_true
(Eq.trans (congrArg (fun x => x = 0) Nat.cast_zero) (eq_true_of_decide (Eq.refl true)))⟩),
Exists.intro ↑(i + 1)
⟨Finset.mem_image.mpr
(Exists.intro (i + 1)
⟨Finset.mem_range.mpr (Decidable.byContradiction fun a => lower_bound._proof_5 n hn i h2d_lt a),
rfl⟩),
Exists.intro ↑(2 * (i + 1))
⟨Finset.mem_image.mpr (Exists.intro (2 * (i + 1)) ⟨Finset.mem_range.mpr h2d_lt, rfl⟩),
⟨Eq.mpr
(id
(congr
(congrArg (fun x => Eq (x - 0))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one)))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))
(Mathlib.Tactic.Ring.sub_pf Mathlib.Tactic.Ring.neg_zero
(Mathlib.Tactic.Ring.add_pf_add_zero
(Nat.rawCast 1 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))),
Eq.mpr
(id
(congr
(congrArg Eq
(congr
(congrArg HSub.hSub
(Eq.trans (Nat.cast_mul 2 (i + 1))
(congrArg (HMul.hMul 2)
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one)))))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑i) (Nat.rawCast 1)
(Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2)))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.add_pf_add_lt (Nat.rawCast 2)
(Mathlib.Tactic.Ring.add_pf_zero_add (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.zero_mul
(Nat.rawCast 1 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))
(Mathlib.Tactic.Ring.add_pf_add_zero
(Nat.rawCast 2 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1)))))
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑i) (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt
(Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Tactic.Ring.add_overlap_pf (↑i) (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsNat.to_isInt
(Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Eq.refl (Int.ofNat 1))))))
(Mathlib.Tactic.Ring.add_pf_zero_add 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))⟩⟩⟩⟩⟩⊢ ↑n / 4 ≤ ↑k
have : (4 : ℝ) * k ≥ n := n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))hD_sub:↑D ⊆ CommonDifferencesThreeTermAP A :=
fun ⦃d⦄ hd =>
Exists.casesOn
(Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_image))
(Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_coe)) hd))
fun i h =>
And.casesOn h fun hi right =>
right ▸
have h2d_lt :=
Decidable.byContradiction fun a =>
lower_bound._proof_3 n hn hD_card i
(Eq.mp (congrArg (LT.lt i) hk_def) (Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_range)) hi)) a;
⟨Eq.mpr (id (congrArg (fun x => x ≠ 0) (Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(ne_of_gt
(Right.add_pos_of_nonneg_of_pos (Nat.cast_nonneg' i)
(Mathlib.Meta.Positivity.pos_of_isNat (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1))
(Eq.refl (Nat.ble 1 1))))),
Exists.intro 0
⟨Finset.mem_image.mpr
(Exists.intro 0
⟨Finset.mem_range.mpr (Decidable.byContradiction fun a => lower_bound._proof_4 n hn i a),
of_eq_true
(Eq.trans (congrArg (fun x => x = 0) Nat.cast_zero) (eq_true_of_decide (Eq.refl true)))⟩),
Exists.intro ↑(i + 1)
⟨Finset.mem_image.mpr
(Exists.intro (i + 1)
⟨Finset.mem_range.mpr (Decidable.byContradiction fun a => lower_bound._proof_5 n hn i h2d_lt a),
rfl⟩),
Exists.intro ↑(2 * (i + 1))
⟨Finset.mem_image.mpr (Exists.intro (2 * (i + 1)) ⟨Finset.mem_range.mpr h2d_lt, rfl⟩),
⟨Eq.mpr
(id
(congr
(congrArg (fun x => Eq (x - 0))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one)))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))
(Mathlib.Tactic.Ring.sub_pf Mathlib.Tactic.Ring.neg_zero
(Mathlib.Tactic.Ring.add_pf_add_zero
(Nat.rawCast 1 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))),
Eq.mpr
(id
(congr
(congrArg Eq
(congr
(congrArg HSub.hSub
(Eq.trans (Nat.cast_mul 2 (i + 1))
(congrArg (HMul.hMul 2)
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one)))))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑i) (Nat.rawCast 1)
(Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2)))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.add_pf_add_lt (Nat.rawCast 2)
(Mathlib.Tactic.Ring.add_pf_zero_add (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.zero_mul
(Nat.rawCast 1 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))
(Mathlib.Tactic.Ring.add_pf_add_zero
(Nat.rawCast 2 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1)))))
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑i) (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt
(Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Tactic.Ring.add_overlap_pf (↑i) (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsNat.to_isInt
(Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Eq.refl (Int.ofNat 1))))))
(Mathlib.Tactic.Ring.add_pf_zero_add 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))⟩⟩⟩⟩⟩⊢ ↑n / 4 ≤ ↑k All goals completed! 🐙
All goals completed! 🐙
_ = (D.card : ℝ) := n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))hD_sub:↑D ⊆ CommonDifferencesThreeTermAP A :=
fun ⦃d⦄ hd =>
Exists.casesOn
(Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_image))
(Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_coe)) hd))
fun i h =>
And.casesOn h fun hi right =>
right ▸
have h2d_lt :=
Decidable.byContradiction fun a =>
lower_bound._proof_3 n hn hD_card i
(Eq.mp (congrArg (LT.lt i) hk_def) (Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_range)) hi)) a;
⟨Eq.mpr (id (congrArg (fun x => x ≠ 0) (Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(ne_of_gt
(Right.add_pos_of_nonneg_of_pos (Nat.cast_nonneg' i)
(Mathlib.Meta.Positivity.pos_of_isNat (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1))
(Eq.refl (Nat.ble 1 1))))),
Exists.intro 0
⟨Finset.mem_image.mpr
(Exists.intro 0
⟨Finset.mem_range.mpr (Decidable.byContradiction fun a => lower_bound._proof_4 n hn i a),
of_eq_true
(Eq.trans (congrArg (fun x => x = 0) Nat.cast_zero) (eq_true_of_decide (Eq.refl true)))⟩),
Exists.intro ↑(i + 1)
⟨Finset.mem_image.mpr
(Exists.intro (i + 1)
⟨Finset.mem_range.mpr (Decidable.byContradiction fun a => lower_bound._proof_5 n hn i h2d_lt a),
rfl⟩),
Exists.intro ↑(2 * (i + 1))
⟨Finset.mem_image.mpr (Exists.intro (2 * (i + 1)) ⟨Finset.mem_range.mpr h2d_lt, rfl⟩),
⟨Eq.mpr
(id
(congr
(congrArg (fun x => Eq (x - 0))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one)))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))
(Mathlib.Tactic.Ring.sub_pf Mathlib.Tactic.Ring.neg_zero
(Mathlib.Tactic.Ring.add_pf_add_zero
(Nat.rawCast 1 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))),
Eq.mpr
(id
(congr
(congrArg Eq
(congr
(congrArg HSub.hSub
(Eq.trans (Nat.cast_mul 2 (i + 1))
(congrArg (HMul.hMul 2)
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one)))))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑i) (Nat.rawCast 1)
(Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2)))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.add_pf_add_lt (Nat.rawCast 2)
(Mathlib.Tactic.Ring.add_pf_zero_add (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.zero_mul
(Nat.rawCast 1 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))
(Mathlib.Tactic.Ring.add_pf_add_zero
(Nat.rawCast 2 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1)))))
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑i) (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt
(Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Tactic.Ring.add_overlap_pf (↑i) (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsNat.to_isInt
(Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Eq.refl (Int.ofNat 1))))))
(Mathlib.Tactic.Ring.add_pf_zero_add 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))⟩⟩⟩⟩⟩⊢ ↑k = ↑D.card All goals completed! 🐙
_ = ((D : Set ℤ).ncard : ℝ) := n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))hD_sub:↑D ⊆ CommonDifferencesThreeTermAP A :=
fun ⦃d⦄ hd =>
Exists.casesOn
(Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_image))
(Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_coe)) hd))
fun i h =>
And.casesOn h fun hi right =>
right ▸
have h2d_lt :=
Decidable.byContradiction fun a =>
lower_bound._proof_3 n hn hD_card i
(Eq.mp (congrArg (LT.lt i) hk_def) (Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_range)) hi)) a;
⟨Eq.mpr (id (congrArg (fun x => x ≠ 0) (Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(ne_of_gt
(Right.add_pos_of_nonneg_of_pos (Nat.cast_nonneg' i)
(Mathlib.Meta.Positivity.pos_of_isNat (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1))
(Eq.refl (Nat.ble 1 1))))),
Exists.intro 0
⟨Finset.mem_image.mpr
(Exists.intro 0
⟨Finset.mem_range.mpr (Decidable.byContradiction fun a => lower_bound._proof_4 n hn i a),
of_eq_true
(Eq.trans (congrArg (fun x => x = 0) Nat.cast_zero) (eq_true_of_decide (Eq.refl true)))⟩),
Exists.intro ↑(i + 1)
⟨Finset.mem_image.mpr
(Exists.intro (i + 1)
⟨Finset.mem_range.mpr (Decidable.byContradiction fun a => lower_bound._proof_5 n hn i h2d_lt a),
rfl⟩),
Exists.intro ↑(2 * (i + 1))
⟨Finset.mem_image.mpr (Exists.intro (2 * (i + 1)) ⟨Finset.mem_range.mpr h2d_lt, rfl⟩),
⟨Eq.mpr
(id
(congr
(congrArg (fun x => Eq (x - 0))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one)))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))
(Mathlib.Tactic.Ring.sub_pf Mathlib.Tactic.Ring.neg_zero
(Mathlib.Tactic.Ring.add_pf_add_zero
(Nat.rawCast 1 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))),
Eq.mpr
(id
(congr
(congrArg Eq
(congr
(congrArg HSub.hSub
(Eq.trans (Nat.cast_mul 2 (i + 1))
(congrArg (HMul.hMul 2)
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one)))))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑i) (Nat.rawCast 1)
(Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2)))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.add_pf_add_lt (Nat.rawCast 2)
(Mathlib.Tactic.Ring.add_pf_zero_add (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.zero_mul
(Nat.rawCast 1 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))
(Mathlib.Tactic.Ring.add_pf_add_zero
(Nat.rawCast 2 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1)))))
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑i) (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt
(Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Tactic.Ring.add_overlap_pf (↑i) (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsNat.to_isInt
(Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Eq.refl (Int.ofNat 1))))))
(Mathlib.Tactic.Ring.add_pf_zero_add 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))⟩⟩⟩⟩⟩⊢ ↑D.card = ↑(↑D).ncard All goals completed! 🐙
_ ≤ ((CommonDifferencesThreeTermAP A).ncard : ℝ) := n:ℕhn:n ≥ 4A:Finset ℤ := Finset.image (fun k => ↑k) (Finset.range n)k:ℕ := (n - 1) / 2hk_def:k = (n - 1) / 2 := rflD:Finset ℤ := Finset.image (fun i => ↑(i + 1)) (Finset.range k)hk_ge_nat:4 * k ≥ n :=
Eq.mpr (id (Eq.trans (congrArg (fun x => 4 * x ≥ n) hk_def) ge_iff_le._simp_1))
(Decidable.byContradiction fun a => lower_bound._proof_1 n hn a)hD_card:D.card = k :=
Eq.mpr
(id
(congrArg (fun _a => _a = k)
(Finset.card_image_of_injective (Finset.range k) fun ⦃a b⦄ h =>
have this :=
cast
(Eq.trans Nat.cast_inj._simp_1
(Eq.symm
(Eq.trans
(congr (congrArg (fun x => Eq (↑a + x)) (Eq.symm Nat.cast_one))
(congrArg (HAdd.hAdd ↑b) (Eq.symm Nat.cast_one)))
(Eq.trans (congr (congrArg Eq (Nat.cast_add._simp_1 a 1)) (Nat.cast_add._simp_1 b 1))
Nat.cast_inj._simp_1))))
h;
Decidable.byContradiction fun a_1 => lower_bound._proof_2 n h a_1)))
(Eq.mpr (id (congrArg (fun _a => _a = k) (Finset.card_range k))) (Eq.refl k))h_finite:(CommonDifferencesThreeTermAP A).Finite :=
Set.Finite.subset (Finset.finite_toSet (Finset.image (fun p => p.2 - p.1) (A ×ˢ A))) fun ⦃d⦄ a =>
And.casesOn a fun left right =>
Exists.casesOn right fun a h =>
And.casesOn h fun ha right =>
Exists.casesOn right fun b h =>
And.casesOn h fun hb right =>
Exists.casesOn right fun w h =>
And.casesOn h fun left right =>
And.casesOn right fun hab right =>
Finset.mem_coe.mpr (Finset.mem_image.mpr (Exists.intro (a, b) ⟨Finset.mem_product.mpr ⟨ha, hb⟩, hab⟩))hD_sub:↑D ⊆ CommonDifferencesThreeTermAP A :=
fun ⦃d⦄ hd =>
Exists.casesOn
(Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_image))
(Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_coe)) hd))
fun i h =>
And.casesOn h fun hi right =>
right ▸
have h2d_lt :=
Decidable.byContradiction fun a =>
lower_bound._proof_3 n hn hD_card i
(Eq.mp (congrArg (LT.lt i) hk_def) (Eq.mp (congrArg (fun _a => _a) (propext Finset.mem_range)) hi)) a;
⟨Eq.mpr (id (congrArg (fun x => x ≠ 0) (Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(ne_of_gt
(Right.add_pos_of_nonneg_of_pos (Nat.cast_nonneg' i)
(Mathlib.Meta.Positivity.pos_of_isNat (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1))
(Eq.refl (Nat.ble 1 1))))),
Exists.intro 0
⟨Finset.mem_image.mpr
(Exists.intro 0
⟨Finset.mem_range.mpr (Decidable.byContradiction fun a => lower_bound._proof_4 n hn i a),
of_eq_true
(Eq.trans (congrArg (fun x => x = 0) Nat.cast_zero) (eq_true_of_decide (Eq.refl true)))⟩),
Exists.intro ↑(i + 1)
⟨Finset.mem_image.mpr
(Exists.intro (i + 1)
⟨Finset.mem_range.mpr (Decidable.byContradiction fun a => lower_bound._proof_5 n hn i h2d_lt a),
rfl⟩),
Exists.intro ↑(2 * (i + 1))
⟨Finset.mem_image.mpr (Exists.intro (2 * (i + 1)) ⟨Finset.mem_range.mpr h2d_lt, rfl⟩),
⟨Eq.mpr
(id
(congr
(congrArg (fun x => Eq (x - 0))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one)))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))
(Mathlib.Tactic.Ring.sub_pf Mathlib.Tactic.Ring.neg_zero
(Mathlib.Tactic.Ring.add_pf_add_zero
(Nat.rawCast 1 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))),
Eq.mpr
(id
(congr
(congrArg Eq
(congr
(congrArg HSub.hSub
(Eq.trans (Nat.cast_mul 2 (i + 1))
(congrArg (HMul.hMul 2)
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one)))))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Eq.trans (Nat.cast_add i 1) (congrArg (HAdd.hAdd ↑i) Nat.cast_one))))
(Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑i) (Nat.rawCast 1)
(Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2)))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.add_pf_add_lt (Nat.rawCast 2)
(Mathlib.Tactic.Ring.add_pf_zero_add (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.zero_mul
(Nat.rawCast 1 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))
(Mathlib.Tactic.Ring.add_pf_add_zero
(Nat.rawCast 2 + (↑i ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1)))))
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑i) (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt
(Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Tactic.Ring.add_overlap_pf (↑i) (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsNat.to_isInt
(Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Eq.refl (Int.ofNat 1))))))
(Mathlib.Tactic.Ring.add_pf_zero_add 0)))))
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑i)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑i ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))⟩⟩⟩⟩⟩⊢ ↑(↑D).ncard ≤ ↑(CommonDifferencesThreeTermAP A).ncard
All goals completed! 🐙
end Erdos1097