/- 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 FormalConjecturesUtil

Erdős Problem 1097

References:

    erdosproblems.com/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 declaration uses 'sorry'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 = dd 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 41 / 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 := rfl1 / 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)) ba = 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 = dd (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 Dd 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) = dd 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) / 22 * (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) ai + 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) ai + 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) a2 * (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) a0 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) a0 < 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) a0 = 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) ai + 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