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

Title: Degree sequences in triangle-free graphs Authors: P. Erdős, S. Fajtlowicz and W. Staton, Published in Discrete Mathematics 92 (1991) 85–88.

open BigOperatorsopen Classicalopen scoped Finset namespace DegreeSequencesTriangleFree

A sequence of natural numbers is compact on a set S if consecutive terms at distance 2 differ by 1 for all k ∈ S.

def IsCompactSequenceOn (d : ) (S : Set ) : Prop := k S, d (k + 2) = d k + 1 end DegreeSequencesTriangleFree namespace SimpleGraph variable {α : Type*} [Fintype α] [DecidableEq α]

The number of vertices of G having degree d.

noncomputable def degreeFreq (G : SimpleGraph α) (d : ) : := #{v | G.degree v = d} end SimpleGraph namespace DegreeSequencesTriangleFree variable (d : ) (n k r : )

Lemma 1 (a) If a sequence d is nondecreasing and no three terms are equal, then terms at distance 2 differ by at least 1.

@[category API, AMS 5] lemma lemma1_a (h_mono : Monotone d) (h_no_three : k, d (k + 2) d k) : 1 d (k + 2) - d k := d: k:h_mono:Monotone dh_no_three: (k : ), d (k + 2) d k1 d (k + 2) - d k have : d k d (k + 2) := h_mono (d: k:h_mono:Monotone dh_no_three: (k : ), d (k + 2) d kk k + 2 All goals completed! 🐙) d: k:h_mono:Monotone dh_no_three: (k : ), d (k + 2) d kthis✝:d k d (k + 2) := h_mono (Decidable.byContradiction fun a => lemma1_a._proof_1 k a)this:d (k + 2) d k := h_no_three k1 d (k + 2) - d k All goals completed! 🐙

Lemma 1 (b) If a sequence d is nondecreasing and no three terms are equal, then terms at distance 2 * r differ by at least r.

@[category API, AMS 5] lemma lemma1_b (h_mono : Monotone d) (h_no_three : i, d (i + 2) d i) : r d (k + 2 * r) - d k := d: k:r:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d ir d (k + 2 * r) - d k induction r with d: k:r:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d i0 d (k + 2 * 0) - d k All goals completed! 🐙 d: k:r✝:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d ir:ih:r d (k + 2 * r) - d kr + 1 d (k + 2 * (r + 1)) - d k have hrw : k + 2 * (r + 1) = (k + 2 * r) + 2 := d: k:r:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d ir d (k + 2 * r) - d k All goals completed! 🐙 d: k:r✝:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d ir:ih:r d (k + 2 * r) - d khrw:k + 2 * (r + 1) = k + 2 * r + 2 := Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf k) (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 r) (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 (r ^ 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 r (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 (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))) (Mathlib.Tactic.Ring.add_pf_add_lt (Nat.rawCast 2) (Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + (r ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))))) (Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 2) (Mathlib.Tactic.Ring.add_pf_add_lt (k ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))))) (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf k) (Mathlib.Tactic.Ring.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 2))) (Mathlib.Tactic.Ring.atom_pf r) (Mathlib.Tactic.Ring.add_mul (Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_pf_right r (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 (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))) (Mathlib.Tactic.Ring.zero_mul (r ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.add_pf_add_zero (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.add_pf_add_lt (k ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 2))) (Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 2) (Mathlib.Tactic.Ring.add_pf_add_zero (k ^ Nat.rawCast 1 * Nat.rawCast 1 + (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))))r + 1 d (k + 2 * r + 2) - d k d: k:r✝:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d ir:ih:r d (k + 2 * r) - d khrw:k + 2 * (r + 1) = k + 2 * r + 2 := Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf k) (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 r) (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 (r ^ 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 r (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 (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))) (Mathlib.Tactic.Ring.add_pf_add_lt (Nat.rawCast 2) (Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + (r ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))))) (Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 2) (Mathlib.Tactic.Ring.add_pf_add_lt (k ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))))) (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf k) (Mathlib.Tactic.Ring.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 2))) (Mathlib.Tactic.Ring.atom_pf r) (Mathlib.Tactic.Ring.add_mul (Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_pf_right r (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 (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))) (Mathlib.Tactic.Ring.zero_mul (r ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.add_pf_add_zero (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.add_pf_add_lt (k ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 2))) (Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 2) (Mathlib.Tactic.Ring.add_pf_add_zero (k ^ Nat.rawCast 1 * Nat.rawCast 1 + (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))))h1:1 d (k + 2 * r + 2) - d (k + 2 * r) := lemma1_a d (k + 2 * r) h_mono h_no_threer + 1 d (k + 2 * r + 2) - d k have h2 : d k d (k + 2 * r) := h_mono (d: k:r✝:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d ir:ih:r d (k + 2 * r) - d khrw:k + 2 * (r + 1) = k + 2 * r + 2 := Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf k) (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 r) (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 (r ^ 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 r (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 (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))) (Mathlib.Tactic.Ring.add_pf_add_lt (Nat.rawCast 2) (Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + (r ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))))) (Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 2) (Mathlib.Tactic.Ring.add_pf_add_lt (k ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))))) (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf k) (Mathlib.Tactic.Ring.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 2))) (Mathlib.Tactic.Ring.atom_pf r) (Mathlib.Tactic.Ring.add_mul (Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_pf_right r (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 (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))) (Mathlib.Tactic.Ring.zero_mul (r ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.add_pf_add_zero (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.add_pf_add_lt (k ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 2))) (Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 2) (Mathlib.Tactic.Ring.add_pf_add_zero (k ^ Nat.rawCast 1 * Nat.rawCast 1 + (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))))h1:1 d (k + 2 * r + 2) - d (k + 2 * r) := lemma1_a d (k + 2 * r) h_mono h_no_threek k + 2 * r All goals completed! 🐙) have h3 : d (k + 2 * r) d (k + 2 * r + 2) := h_mono (d: k:r✝:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d ir:ih:r d (k + 2 * r) - d khrw:k + 2 * (r + 1) = k + 2 * r + 2 := Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf k) (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 r) (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 (r ^ 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 r (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 (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))) (Mathlib.Tactic.Ring.add_pf_add_lt (Nat.rawCast 2) (Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + (r ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))))) (Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 2) (Mathlib.Tactic.Ring.add_pf_add_lt (k ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))))) (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf k) (Mathlib.Tactic.Ring.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 2))) (Mathlib.Tactic.Ring.atom_pf r) (Mathlib.Tactic.Ring.add_mul (Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_pf_right r (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 (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))) (Mathlib.Tactic.Ring.zero_mul (r ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.add_pf_add_zero (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.add_pf_add_lt (k ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 2))) (Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 2) (Mathlib.Tactic.Ring.add_pf_add_zero (k ^ Nat.rawCast 1 * Nat.rawCast 1 + (r ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))))h1:1 d (k + 2 * r + 2) - d (k + 2 * r) := lemma1_a d (k + 2 * r) h_mono h_no_threeh2:d k d (k + 2 * r) := h_mono (Decidable.byContradiction fun a => lemma1_b._proof_1 d k r a)k + 2 * r k + 2 * r + 2 All goals completed! 🐙) All goals completed! 🐙

Helper: additive form of Lemma 2(a)'s estimate, used by lemma2_alemma2_d. The upper sum (after reindexing) exceeds the lower sum by at least 2 * n * n.

@[category API, AMS 5] private lemma lemma2_helper_short (h_mono : Monotone d) (h_no_three : i, d (i + 2) d i) : i Finset.Icc 1 (2 * n), d i + 2 * n * n i Finset.Icc (2 * n + 1) (4 * n), d i := d: n:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d i i Finset.Icc 1 (2 * n), d i + 2 * n * n i Finset.Icc (2 * n + 1) (4 * n), d i -- Reindex `i ↦ i + 2 * n`. have hreindex : i Finset.Icc (2 * n + 1) (4 * n), d i = i Finset.Icc 1 (2 * n), d (i + 2 * n) := d: n:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d i i Finset.Icc 1 (2 * n), d i + 2 * n * n i Finset.Icc (2 * n + 1) (4 * n), d i d: n:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d i i Finset.image (fun x => x + 2 * n) (Finset.Icc 1 (2 * n)), d i = i Finset.Icc 1 (2 * n), d (i + 2 * n) d: n:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d iSet.InjOn (fun x => x + 2 * n) (Finset.Icc 1 (2 * n)); intro a d: n:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d ia:a✝:a (Finset.Icc 1 (2 * n)) x₂ : ⦄, x₂ (Finset.Icc 1 (2 * n)) (fun x => x + 2 * n) a = (fun x => x + 2 * n) x₂ a = x₂ d: n:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d ia:a✝:a (Finset.Icc 1 (2 * n))b:b (Finset.Icc 1 (2 * n)) (fun x => x + 2 * n) a = (fun x => x + 2 * n) b a = b d: n:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d ia:a✝¹:a (Finset.Icc 1 (2 * n))b:a✝:b (Finset.Icc 1 (2 * n))(fun x => x + 2 * n) a = (fun x => x + 2 * n) b a = b d: n:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d ia:a✝¹:a (Finset.Icc 1 (2 * n))b:a✝:b (Finset.Icc 1 (2 * n))hab:(fun x => x + 2 * n) a = (fun x => x + 2 * n) ba = b; All goals completed! 🐙 d: n:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d ihreindex: i Finset.Icc (2 * n + 1) (4 * n), d i = i Finset.Icc 1 (2 * n), d (i + 2 * n) := Eq.mpr (id (congrArg (fun _a => i _a, d i = i Finset.Icc 1 (2 * n), d (i + 2 * n)) (have this := Finset.ext fun x => Eq.mpr (id (congr (congrArg Iff (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n) Order.add_one_le_iff._simp_1))) (Eq.trans (congrArg (fun x_1 => x x_1) (Finset.image_add_right_Icc 1 (2 * n) (2 * n))) Finset.mem_Icc._simp_1))) (Decidable.byContradiction fun a => lemma2_helper_short._proof_1 n x a); this))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc 1 (2 * n), d (i + 2 * n)) (Finset.sum_image fun a a_1 b a_2 hab => Nat.add_right_cancel hab))) (Eq.refl (∑ x Finset.Icc 1 (2 * n), d (x + 2 * n)))) i Finset.Icc 1 (2 * n), d i + 2 * n * n i Finset.Icc 1 (2 * n), d (i + 2 * n) have hpt : i, d i + n d (i + 2 * n) := fun i => d: n:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d ihreindex: i Finset.Icc (2 * n + 1) (4 * n), d i = i Finset.Icc 1 (2 * n), d (i + 2 * n) := Eq.mpr (id (congrArg (fun _a => i _a, d i = i Finset.Icc 1 (2 * n), d (i + 2 * n)) (have this := Finset.ext fun x => Eq.mpr (id (congr (congrArg Iff (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n) Order.add_one_le_iff._simp_1))) (Eq.trans (congrArg (fun x_1 => x x_1) (Finset.image_add_right_Icc 1 (2 * n) (2 * n))) Finset.mem_Icc._simp_1))) (Decidable.byContradiction fun a => lemma2_helper_short._proof_1 n x a); this))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc 1 (2 * n), d (i + 2 * n)) (Finset.sum_image fun a a_1 b a_2 hab => Nat.add_right_cancel hab))) (Eq.refl (∑ x Finset.Icc 1 (2 * n), d (x + 2 * n))))i:d i + n d (i + 2 * n) d: n:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d ihreindex: i Finset.Icc (2 * n + 1) (4 * n), d i = i Finset.Icc 1 (2 * n), d (i + 2 * n) := Eq.mpr (id (congrArg (fun _a => i _a, d i = i Finset.Icc 1 (2 * n), d (i + 2 * n)) (have this := Finset.ext fun x => Eq.mpr (id (congr (congrArg Iff (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n) Order.add_one_le_iff._simp_1))) (Eq.trans (congrArg (fun x_1 => x x_1) (Finset.image_add_right_Icc 1 (2 * n) (2 * n))) Finset.mem_Icc._simp_1))) (Decidable.byContradiction fun a => lemma2_helper_short._proof_1 n x a); this))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc 1 (2 * n), d (i + 2 * n)) (Finset.sum_image fun a a_1 b a_2 hab => Nat.add_right_cancel hab))) (Eq.refl (∑ x Finset.Icc 1 (2 * n), d (x + 2 * n))))i:h1:n d (i + 2 * n) - d i := lemma1_b d i n h_mono h_no_threed i + n d (i + 2 * n) have h2 := h_mono (show i i + 2 * n d: n:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d ihreindex: i Finset.Icc (2 * n + 1) (4 * n), d i = i Finset.Icc 1 (2 * n), d (i + 2 * n) := Eq.mpr (id (congrArg (fun _a => i _a, d i = i Finset.Icc 1 (2 * n), d (i + 2 * n)) (have this := Finset.ext fun x => Eq.mpr (id (congr (congrArg Iff (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n) Order.add_one_le_iff._simp_1))) (Eq.trans (congrArg (fun x_1 => x x_1) (Finset.image_add_right_Icc 1 (2 * n) (2 * n))) Finset.mem_Icc._simp_1))) (Decidable.byContradiction fun a => lemma2_helper_short._proof_1 n x a); this))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc 1 (2 * n), d (i + 2 * n)) (Finset.sum_image fun a a_1 b a_2 hab => Nat.add_right_cancel hab))) (Eq.refl (∑ x Finset.Icc 1 (2 * n), d (x + 2 * n))))i:d i + n d (i + 2 * n) All goals completed! 🐙) All goals completed! 🐙 have hcard : (Finset.Icc 1 (2 * n)).card = 2 * n := d: n:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d i i Finset.Icc 1 (2 * n), d i + 2 * n * n i Finset.Icc (2 * n + 1) (4 * n), d i All goals completed! 🐙 have hsum_n : _ Finset.Icc 1 (2 * n), n = 2 * n * n := d: n:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d i i Finset.Icc 1 (2 * n), d i + 2 * n * n i Finset.Icc (2 * n + 1) (4 * n), d i All goals completed! 🐙 d: n:h_mono:Monotone dh_no_three: (i : ), d (i + 2) d ihreindex: i Finset.Icc (2 * n + 1) (4 * n), d i = i Finset.Icc 1 (2 * n), d (i + 2 * n) := Eq.mpr (id (congrArg (fun _a => i _a, d i = i Finset.Icc 1 (2 * n), d (i + 2 * n)) (have this := Finset.ext fun x => Eq.mpr (id (congr (congrArg Iff (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n) Order.add_one_le_iff._simp_1))) (Eq.trans (congrArg (fun x_1 => x x_1) (Finset.image_add_right_Icc 1 (2 * n) (2 * n))) Finset.mem_Icc._simp_1))) (Decidable.byContradiction fun a => lemma2_helper_short._proof_1 n x a); this))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc 1 (2 * n), d (i + 2 * n)) (Finset.sum_image fun a a_1 b a_2 hab => Nat.add_right_cancel hab))) (Eq.refl (∑ x Finset.Icc 1 (2 * n), d (x + 2 * n))))hpt: (i : ), d i + n d (i + 2 * n) := fun i => have h1 := lemma1_b d i n h_mono h_no_three; have h2 := h_mono (have this := Decidable.byContradiction fun a => lemma2_helper_short._proof_2 d n i a; this); Decidable.byContradiction fun a => lemma2_helper_short._proof_3 d n i h1 h2 ahcard:#(Finset.Icc 1 (2 * n)) = 2 * n := of_eq_true (Eq.trans (congrArg (fun x => x = 2 * n) (Eq.trans (Nat.card_Icc 1 (2 * n)) (add_tsub_cancel_right (2 * n) 1))) (eq_self (2 * n)))hsum_n: x Finset.Icc 1 (2 * n), n = 2 * n * n := Eq.mpr (id (congrArg (fun _a => _a = 2 * n * n) (Finset.sum_const n))) (Eq.mpr (id (congrArg (fun _a => _a n = 2 * n * n) hcard)) (Eq.mpr (id (congrArg (fun _a => _a = 2 * n * n) (smul_eq_mul (2 * n) n))) (Eq.refl (2 * n * n)))) x Finset.Icc 1 (2 * n), (d x + n) i Finset.Icc 1 (2 * n), d (i + 2 * n) All goals completed! 🐙

Lemma 2 (a) Inequality involving sums of terms of a nondecreasing sequence with no three terms equal.

@[category API, AMS 5] lemma lemma2_a (h_mono : Monotone d) (_h_pos : k, 0 < d k) (h_no_three : i, d (i + 2) d i) : 2 * n * n i .Icc (2 * n + 1) (4 * n), d i - i .Icc 1 (2 * n), d i := d: n:h_mono:Monotone d_h_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d i2 * n * n i Finset.Icc (2 * n + 1) (4 * n), d i - i Finset.Icc 1 (2 * n), d i d: n:h_mono:Monotone d_h_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d ithis: i Finset.Icc 1 (2 * n), d i + 2 * n * n i Finset.Icc (2 * n + 1) (4 * n), d i := lemma2_helper_short d n h_mono h_no_three2 * n * n i Finset.Icc (2 * n + 1) (4 * n), d i - i Finset.Icc 1 (2 * n), d i All goals completed! 🐙

Lemma 2 (b) Inequality involving sums of terms of a nondecreasing sequence with no three terms equal.

@[category API, AMS 5] lemma lemma2_b (h_mono : Monotone d) (h_pos : k, 0 < d k) (h_no_three : i, d (i + 2) d i) : 2 * n * n + 2 * n + 1 i .Icc (2 * n + 1) (4 * n + 1), d i - i .Icc 1 (2 * n), d i := d: n:h_mono:Monotone dh_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d i2 * n * n + 2 * n + 1 i Finset.Icc (2 * n + 1) (4 * n + 1), d i - i Finset.Icc 1 (2 * n), d i -- Split the upper sum at `4 * n + 1`. have hsplit : i Finset.Icc (2 * n + 1) (4 * n + 1), d i = ( i Finset.Icc (2 * n + 1) (4 * n), d i) + d (4 * n + 1) := d: n:h_mono:Monotone dh_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d i2 * n * n + 2 * n + 1 i Finset.Icc (2 * n + 1) (4 * n + 1), d i - i Finset.Icc 1 (2 * n), d i d: n:h_mono:Monotone dh_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d i i insert (4 * n + 1) (Finset.Icc (2 * n + 1) (4 * n)), d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1) All goals completed! 🐙 -- Bound `d (4 * n + 1) ≥ 2 * n + 1` via two applications of `lemma1_b` + `h_pos`. have h_dbig : 2 * n + 1 d (4 * n + 1) := d: n:h_mono:Monotone dh_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d i2 * n * n + 2 * n + 1 i Finset.Icc (2 * n + 1) (4 * n + 1), d i - i Finset.Icc 1 (2 * n), d i d: n:h_mono:Monotone dh_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d ihsplit: i Finset.Icc (2 * n + 1) (4 * n + 1), d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1) := Eq.mpr (id (congrArg (fun _a => i _a, d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (have this := Finset.ext fun x => Eq.mpr (id (congr (congrArg Iff (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n + 1) Order.add_one_le_iff._simp_1))) (Eq.trans Finset.mem_insert._simp_1 (congrArg (Or (x = 4 * n + 1)) (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n) Order.add_one_le_iff._simp_1)))))) (Decidable.byContradiction fun a => lemma2_b._proof_1 n x a); this))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (Finset.sum_insert (of_eq_true (Eq.trans (congrArg Not (Eq.trans Finset.mem_Icc._simp_1 (Eq.trans (congr (congrArg And (mul_le_mul_iff_right._simp_2 1)) (Eq.trans (mul_le_iff_le_one_right'._simp_2 (4 * n)) (Eq.trans le_one_iff_eq_one._simp_2 one_ne_zero._simp_1))) (and_false (2 * n 4 * n))))) not_false_eq_true))))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (add_comm (d (4 * n + 1)) (∑ x Finset.Icc (2 * n + 1) (4 * n), d x)))) (Eq.refl ( x Finset.Icc (2 * n + 1) (4 * n), d x + d (4 * n + 1)))))h1:n d (1 + 2 * n) - d 1 := lemma1_b d 1 n h_mono h_no_three2 * n + 1 d (4 * n + 1) d: n:h_mono:Monotone dh_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d ihsplit: i Finset.Icc (2 * n + 1) (4 * n + 1), d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1) := Eq.mpr (id (congrArg (fun _a => i _a, d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (have this := Finset.ext fun x => Eq.mpr (id (congr (congrArg Iff (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n + 1) Order.add_one_le_iff._simp_1))) (Eq.trans Finset.mem_insert._simp_1 (congrArg (Or (x = 4 * n + 1)) (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n) Order.add_one_le_iff._simp_1)))))) (Decidable.byContradiction fun a => lemma2_b._proof_1 n x a); this))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (Finset.sum_insert (of_eq_true (Eq.trans (congrArg Not (Eq.trans Finset.mem_Icc._simp_1 (Eq.trans (congr (congrArg And (mul_le_mul_iff_right._simp_2 1)) (Eq.trans (mul_le_iff_le_one_right'._simp_2 (4 * n)) (Eq.trans le_one_iff_eq_one._simp_2 one_ne_zero._simp_1))) (and_false (2 * n 4 * n))))) not_false_eq_true))))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (add_comm (d (4 * n + 1)) (∑ x Finset.Icc (2 * n + 1) (4 * n), d x)))) (Eq.refl ( x Finset.Icc (2 * n + 1) (4 * n), d x + d (4 * n + 1)))))h1:n d (1 + 2 * n) - d 1 := lemma1_b d 1 n h_mono h_no_threeh2:n d (2 * n + 1 + 2 * n) - d (2 * n + 1) := lemma1_b d (2 * n + 1) n h_mono h_no_three2 * n + 1 d (4 * n + 1) d: n:h_mono:Monotone dh_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d ihsplit: i Finset.Icc (2 * n + 1) (4 * n + 1), d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1) := Eq.mpr (id (congrArg (fun _a => i _a, d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (have this := Finset.ext fun x => Eq.mpr (id (congr (congrArg Iff (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n + 1) Order.add_one_le_iff._simp_1))) (Eq.trans Finset.mem_insert._simp_1 (congrArg (Or (x = 4 * n + 1)) (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n) Order.add_one_le_iff._simp_1)))))) (Decidable.byContradiction fun a => lemma2_b._proof_1 n x a); this))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (Finset.sum_insert (of_eq_true (Eq.trans (congrArg Not (Eq.trans Finset.mem_Icc._simp_1 (Eq.trans (congr (congrArg And (mul_le_mul_iff_right._simp_2 1)) (Eq.trans (mul_le_iff_le_one_right'._simp_2 (4 * n)) (Eq.trans le_one_iff_eq_one._simp_2 one_ne_zero._simp_1))) (and_false (2 * n 4 * n))))) not_false_eq_true))))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (add_comm (d (4 * n + 1)) (∑ x Finset.Icc (2 * n + 1) (4 * n), d x)))) (Eq.refl ( x Finset.Icc (2 * n + 1) (4 * n), d x + d (4 * n + 1)))))h1:n d (1 + 2 * n) - d 1 := lemma1_b d 1 n h_mono h_no_threeh2:n d (2 * n + 1 + 2 * n) - d (2 * n + 1) := lemma1_b d (2 * n + 1) n h_mono h_no_threehp:0 < d 1 := h_pos 12 * n + 1 d (4 * n + 1) have m1 : d 1 d (1 + 2 * n) := h_mono (d: n:h_mono:Monotone dh_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d ihsplit: i Finset.Icc (2 * n + 1) (4 * n + 1), d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1) := Eq.mpr (id (congrArg (fun _a => i _a, d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (have this := Finset.ext fun x => Eq.mpr (id (congr (congrArg Iff (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n + 1) Order.add_one_le_iff._simp_1))) (Eq.trans Finset.mem_insert._simp_1 (congrArg (Or (x = 4 * n + 1)) (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n) Order.add_one_le_iff._simp_1)))))) (Decidable.byContradiction fun a => lemma2_b._proof_1 n x a); this))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (Finset.sum_insert (of_eq_true (Eq.trans (congrArg Not (Eq.trans Finset.mem_Icc._simp_1 (Eq.trans (congr (congrArg And (mul_le_mul_iff_right._simp_2 1)) (Eq.trans (mul_le_iff_le_one_right'._simp_2 (4 * n)) (Eq.trans le_one_iff_eq_one._simp_2 one_ne_zero._simp_1))) (and_false (2 * n 4 * n))))) not_false_eq_true))))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (add_comm (d (4 * n + 1)) (∑ x Finset.Icc (2 * n + 1) (4 * n), d x)))) (Eq.refl ( x Finset.Icc (2 * n + 1) (4 * n), d x + d (4 * n + 1)))))h1:n d (1 + 2 * n) - d 1 := lemma1_b d 1 n h_mono h_no_threeh2:n d (2 * n + 1 + 2 * n) - d (2 * n + 1) := lemma1_b d (2 * n + 1) n h_mono h_no_threehp:0 < d 1 := h_pos 11 1 + 2 * n All goals completed! 🐙) have m2 : d (2 * n + 1) d (2 * n + 1 + 2 * n) := h_mono (d: n:h_mono:Monotone dh_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d ihsplit: i Finset.Icc (2 * n + 1) (4 * n + 1), d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1) := Eq.mpr (id (congrArg (fun _a => i _a, d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (have this := Finset.ext fun x => Eq.mpr (id (congr (congrArg Iff (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n + 1) Order.add_one_le_iff._simp_1))) (Eq.trans Finset.mem_insert._simp_1 (congrArg (Or (x = 4 * n + 1)) (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n) Order.add_one_le_iff._simp_1)))))) (Decidable.byContradiction fun a => lemma2_b._proof_1 n x a); this))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (Finset.sum_insert (of_eq_true (Eq.trans (congrArg Not (Eq.trans Finset.mem_Icc._simp_1 (Eq.trans (congr (congrArg And (mul_le_mul_iff_right._simp_2 1)) (Eq.trans (mul_le_iff_le_one_right'._simp_2 (4 * n)) (Eq.trans le_one_iff_eq_one._simp_2 one_ne_zero._simp_1))) (and_false (2 * n 4 * n))))) not_false_eq_true))))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (add_comm (d (4 * n + 1)) (∑ x Finset.Icc (2 * n + 1) (4 * n), d x)))) (Eq.refl ( x Finset.Icc (2 * n + 1) (4 * n), d x + d (4 * n + 1)))))h1:n d (1 + 2 * n) - d 1 := lemma1_b d 1 n h_mono h_no_threeh2:n d (2 * n + 1 + 2 * n) - d (2 * n + 1) := lemma1_b d (2 * n + 1) n h_mono h_no_threehp:0 < d 1 := h_pos 1m1:d 1 d (1 + 2 * n) := h_mono (Decidable.byContradiction fun a => lemma2_b._proof_2 d n a)2 * n + 1 2 * n + 1 + 2 * n All goals completed! 🐙) have e1 : 1 + 2 * n = 2 * n + 1 := d: n:h_mono:Monotone dh_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d i2 * n * n + 2 * n + 1 i Finset.Icc (2 * n + 1) (4 * n + 1), d i - i Finset.Icc 1 (2 * n), d i All goals completed! 🐙 have e2 : 2 * n + 1 + 2 * n = 4 * n + 1 := d: n:h_mono:Monotone dh_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d i2 * n * n + 2 * n + 1 i Finset.Icc (2 * n + 1) (4 * n + 1), d i - i Finset.Icc 1 (2 * n), d i All goals completed! 🐙 d: n:h_mono:Monotone dh_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d ihsplit: i Finset.Icc (2 * n + 1) (4 * n + 1), d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1) := Eq.mpr (id (congrArg (fun _a => i _a, d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (have this := Finset.ext fun x => Eq.mpr (id (congr (congrArg Iff (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n + 1) Order.add_one_le_iff._simp_1))) (Eq.trans Finset.mem_insert._simp_1 (congrArg (Or (x = 4 * n + 1)) (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n) Order.add_one_le_iff._simp_1)))))) (Decidable.byContradiction fun a => lemma2_b._proof_1 n x a); this))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (Finset.sum_insert (of_eq_true (Eq.trans (congrArg Not (Eq.trans Finset.mem_Icc._simp_1 (Eq.trans (congr (congrArg And (mul_le_mul_iff_right._simp_2 1)) (Eq.trans (mul_le_iff_le_one_right'._simp_2 (4 * n)) (Eq.trans le_one_iff_eq_one._simp_2 one_ne_zero._simp_1))) (and_false (2 * n 4 * n))))) not_false_eq_true))))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (add_comm (d (4 * n + 1)) (∑ x Finset.Icc (2 * n + 1) (4 * n), d x)))) (Eq.refl ( x Finset.Icc (2 * n + 1) (4 * n), d x + d (4 * n + 1)))))h1:n d (2 * n + 1) - d 1h2:n d (2 * n + 1 + 2 * n) - d (2 * n + 1)hp:0 < d 1m1:d 1 d (2 * n + 1)m2:d (2 * n + 1) d (2 * n + 1 + 2 * n)e1:1 + 2 * n = 2 * n + 1e2:2 * n + 1 + 2 * n = 4 * n + 12 * n + 1 d (4 * n + 1); d: n:h_mono:Monotone dh_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d ihsplit: i Finset.Icc (2 * n + 1) (4 * n + 1), d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1) := Eq.mpr (id (congrArg (fun _a => i _a, d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (have this := Finset.ext fun x => Eq.mpr (id (congr (congrArg Iff (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n + 1) Order.add_one_le_iff._simp_1))) (Eq.trans Finset.mem_insert._simp_1 (congrArg (Or (x = 4 * n + 1)) (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n) Order.add_one_le_iff._simp_1)))))) (Decidable.byContradiction fun a => lemma2_b._proof_1 n x a); this))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (Finset.sum_insert (of_eq_true (Eq.trans (congrArg Not (Eq.trans Finset.mem_Icc._simp_1 (Eq.trans (congr (congrArg And (mul_le_mul_iff_right._simp_2 1)) (Eq.trans (mul_le_iff_le_one_right'._simp_2 (4 * n)) (Eq.trans le_one_iff_eq_one._simp_2 one_ne_zero._simp_1))) (and_false (2 * n 4 * n))))) not_false_eq_true))))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (add_comm (d (4 * n + 1)) (∑ x Finset.Icc (2 * n + 1) (4 * n), d x)))) (Eq.refl ( x Finset.Icc (2 * n + 1) (4 * n), d x + d (4 * n + 1)))))h1:n d (2 * n + 1) - d 1h2:n d (4 * n + 1) - d (2 * n + 1)hp:0 < d 1m1:d 1 d (2 * n + 1)m2:d (2 * n + 1) d (4 * n + 1)e1:1 + 2 * n = 2 * n + 1e2:2 * n + 1 + 2 * n = 4 * n + 12 * n + 1 d (4 * n + 1) All goals completed! 🐙 d: n:h_mono:Monotone dh_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d ihsplit: i Finset.Icc (2 * n + 1) (4 * n + 1), d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1) := Eq.mpr (id (congrArg (fun _a => i _a, d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (have this := Finset.ext fun x => Eq.mpr (id (congr (congrArg Iff (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n + 1) Order.add_one_le_iff._simp_1))) (Eq.trans Finset.mem_insert._simp_1 (congrArg (Or (x = 4 * n + 1)) (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n) Order.add_one_le_iff._simp_1)))))) (Decidable.byContradiction fun a => lemma2_b._proof_1 n x a); this))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (Finset.sum_insert (of_eq_true (Eq.trans (congrArg Not (Eq.trans Finset.mem_Icc._simp_1 (Eq.trans (congr (congrArg And (mul_le_mul_iff_right._simp_2 1)) (Eq.trans (mul_le_iff_le_one_right'._simp_2 (4 * n)) (Eq.trans le_one_iff_eq_one._simp_2 one_ne_zero._simp_1))) (and_false (2 * n 4 * n))))) not_false_eq_true))))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (add_comm (d (4 * n + 1)) (∑ x Finset.Icc (2 * n + 1) (4 * n), d x)))) (Eq.refl ( x Finset.Icc (2 * n + 1) (4 * n), d x + d (4 * n + 1)))))h_dbig:2 * n + 1 d (4 * n + 1) := have h1 := lemma1_b d 1 n h_mono h_no_three; have h2 := lemma1_b d (2 * n + 1) n h_mono h_no_three; have hp := h_pos 1; have m1 := h_mono (Decidable.byContradiction fun a => lemma2_b._proof_2 d n a); have m2 := h_mono (Decidable.byContradiction fun a => lemma2_b._proof_3 d n a); have e1 := Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 1))) (Mathlib.Tactic.Ring.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 2))) (Mathlib.Tactic.Ring.atom_pf n) (Mathlib.Tactic.Ring.add_mul (Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_pf_right n (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 (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))) (Mathlib.Tactic.Ring.zero_mul (n ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.add_pf_add_zero (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.add_pf_add_lt (Nat.rawCast 1) (Mathlib.Tactic.Ring.add_pf_zero_add (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 2))) (Mathlib.Tactic.Ring.atom_pf n) (Mathlib.Tactic.Ring.add_mul (Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_pf_right n (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 (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))) (Mathlib.Tactic.Ring.zero_mul (n ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.add_pf_add_zero (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (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 (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))); have e2 := Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 2))) (Mathlib.Tactic.Ring.atom_pf n) (Mathlib.Tactic.Ring.add_mul (Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_pf_right n (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 (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))) (Mathlib.Tactic.Ring.zero_mul (n ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.add_pf_add_zero (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (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 (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 2))) (Mathlib.Tactic.Ring.atom_pf n) (Mathlib.Tactic.Ring.add_mul (Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_pf_right n (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 (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))) (Mathlib.Tactic.Ring.zero_mul (n ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.add_pf_add_zero (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.add_pf_add_lt (Nat.rawCast 1) (Mathlib.Tactic.Ring.add_pf_add_overlap (Mathlib.Tactic.Ring.add_overlap_pf n (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.of_raw 2) (Mathlib.Meta.NormNum.IsNat.of_raw 2) (Eq.refl 4)))) (Mathlib.Tactic.Ring.add_pf_zero_add 0)))) (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 4))) (Mathlib.Tactic.Ring.atom_pf n) (Mathlib.Tactic.Ring.add_mul (Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_pf_right n (Nat.rawCast 1) (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 4))) (Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 4)) (Mathlib.Tactic.Ring.add_pf_add_zero (n ^ Nat.rawCast 1 * Nat.rawCast 4 + 0))) (Mathlib.Tactic.Ring.zero_mul (n ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.add_pf_add_zero (n ^ Nat.rawCast 1 * Nat.rawCast 4 + 0)))) (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 (n ^ Nat.rawCast 1 * Nat.rawCast 4 + 0)))); Decidable.byContradiction fun a => lemma2_b._proof_4 d n (Eq.mp (congrArg (fun _a => n d _a - d 1) e1) h1) (Eq.mp (congrArg (fun _a => n d _a - d (2 * n + 1)) e2) h2) hp (Eq.mp (congrArg (fun _a => d 1 d _a) e1) m1) (Eq.mp (congrArg (fun _a => d (2 * n + 1) d _a) e2) m2) ah_add: i Finset.Icc 1 (2 * n), d i + 2 * n * n i Finset.Icc (2 * n + 1) (4 * n), d i := lemma2_helper_short d n h_mono h_no_three2 * n * n + 2 * n + 1 i Finset.Icc (2 * n + 1) (4 * n + 1), d i - i Finset.Icc 1 (2 * n), d i d: n:h_mono:Monotone dh_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d ihsplit: i Finset.Icc (2 * n + 1) (4 * n + 1), d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1) := Eq.mpr (id (congrArg (fun _a => i _a, d i = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (have this := Finset.ext fun x => Eq.mpr (id (congr (congrArg Iff (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n + 1) Order.add_one_le_iff._simp_1))) (Eq.trans Finset.mem_insert._simp_1 (congrArg (Or (x = 4 * n + 1)) (Eq.trans Finset.mem_Icc._simp_1 (congrArg (fun x_1 => x_1 x 4 * n) Order.add_one_le_iff._simp_1)))))) (Decidable.byContradiction fun a => lemma2_b._proof_1 n x a); this))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (Finset.sum_insert (of_eq_true (Eq.trans (congrArg Not (Eq.trans Finset.mem_Icc._simp_1 (Eq.trans (congr (congrArg And (mul_le_mul_iff_right._simp_2 1)) (Eq.trans (mul_le_iff_le_one_right'._simp_2 (4 * n)) (Eq.trans le_one_iff_eq_one._simp_2 one_ne_zero._simp_1))) (and_false (2 * n 4 * n))))) not_false_eq_true))))) (Eq.mpr (id (congrArg (fun _a => _a = i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1)) (add_comm (d (4 * n + 1)) (∑ x Finset.Icc (2 * n + 1) (4 * n), d x)))) (Eq.refl ( x Finset.Icc (2 * n + 1) (4 * n), d x + d (4 * n + 1)))))h_dbig:2 * n + 1 d (4 * n + 1) := have h1 := lemma1_b d 1 n h_mono h_no_three; have h2 := lemma1_b d (2 * n + 1) n h_mono h_no_three; have hp := h_pos 1; have m1 := h_mono (Decidable.byContradiction fun a => lemma2_b._proof_2 d n a); have m2 := h_mono (Decidable.byContradiction fun a => lemma2_b._proof_3 d n a); have e1 := Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 1))) (Mathlib.Tactic.Ring.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 2))) (Mathlib.Tactic.Ring.atom_pf n) (Mathlib.Tactic.Ring.add_mul (Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_pf_right n (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 (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))) (Mathlib.Tactic.Ring.zero_mul (n ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.add_pf_add_zero (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.add_pf_add_lt (Nat.rawCast 1) (Mathlib.Tactic.Ring.add_pf_zero_add (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 2))) (Mathlib.Tactic.Ring.atom_pf n) (Mathlib.Tactic.Ring.add_mul (Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_pf_right n (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 (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))) (Mathlib.Tactic.Ring.zero_mul (n ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.add_pf_add_zero (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (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 (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))); have e2 := Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 2))) (Mathlib.Tactic.Ring.atom_pf n) (Mathlib.Tactic.Ring.add_mul (Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_pf_right n (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 (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))) (Mathlib.Tactic.Ring.zero_mul (n ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.add_pf_add_zero (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (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 (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 2))) (Mathlib.Tactic.Ring.atom_pf n) (Mathlib.Tactic.Ring.add_mul (Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_pf_right n (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 (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0))) (Mathlib.Tactic.Ring.zero_mul (n ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.add_pf_add_zero (n ^ Nat.rawCast 1 * Nat.rawCast 2 + 0)))) (Mathlib.Tactic.Ring.add_pf_add_lt (Nat.rawCast 1) (Mathlib.Tactic.Ring.add_pf_add_overlap (Mathlib.Tactic.Ring.add_overlap_pf n (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.of_raw 2) (Mathlib.Meta.NormNum.IsNat.of_raw 2) (Eq.refl 4)))) (Mathlib.Tactic.Ring.add_pf_zero_add 0)))) (Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat (Eq.refl 4))) (Mathlib.Tactic.Ring.atom_pf n) (Mathlib.Tactic.Ring.add_mul (Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_pf_right n (Nat.rawCast 1) (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 4))) (Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 4)) (Mathlib.Tactic.Ring.add_pf_add_zero (n ^ Nat.rawCast 1 * Nat.rawCast 4 + 0))) (Mathlib.Tactic.Ring.zero_mul (n ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.add_pf_add_zero (n ^ Nat.rawCast 1 * Nat.rawCast 4 + 0)))) (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 (n ^ Nat.rawCast 1 * Nat.rawCast 4 + 0)))); Decidable.byContradiction fun a => lemma2_b._proof_4 d n (Eq.mp (congrArg (fun _a => n d _a - d 1) e1) h1) (Eq.mp (congrArg (fun _a => n d _a - d (2 * n + 1)) e2) h2) hp (Eq.mp (congrArg (fun _a => d 1 d _a) e1) m1) (Eq.mp (congrArg (fun _a => d (2 * n + 1) d _a) e2) m2) ah_add: i Finset.Icc 1 (2 * n), d i + 2 * n * n i Finset.Icc (2 * n + 1) (4 * n), d i := lemma2_helper_short d n h_mono h_no_three2 * n * n + 2 * n + 1 i Finset.Icc (2 * n + 1) (4 * n), d i + d (4 * n + 1) - i Finset.Icc 1 (2 * n), d i All goals completed! 🐙

Lemma 2 (c) Inequality involving sums of terms of a nondecreasing sequence with no three terms equal.

@[category API, AMS 5] lemma declaration uses 'sorry'lemma2_c (h_mono : Monotone d) (h_pos : k, 0 < d k) (h_no_three : i, d (i + 2) d i) : 2 * n * n + 2 * n ( i .Icc (2 * n + 2) (4 * n + 2), d i) - i .Icc 1 (2 * n + 1), d i := d: n:h_mono:Monotone dh_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d i2 * n * n + 2 * n i Finset.Icc (2 * n + 2) (4 * n + 2), d i - i Finset.Icc 1 (2 * n + 1), d i All goals completed! 🐙

Lemma 2 (d) Inequality involving sums of terms of a nondecreasing sequence with no three terms equal.

@[category API, AMS 5] lemma declaration uses 'sorry'lemma2_d (h_mono : Monotone d) (h_pos : k, 0 < d k) (h_no_three : i, d (i + 2) d i) : 2 * n * n + 4 * n + 2 ( i .Icc (2 * n + 2) (4 * n + 3), d i) - i .Icc 1 (2 * n + 1), d i := d: n:h_mono:Monotone dh_pos: (k : ), 0 < d kh_no_three: (i : ), d (i + 2) d i2 * n * n + 4 * n + 2 i Finset.Icc (2 * n + 2) (4 * n + 3), d i - i Finset.Icc 1 (2 * n + 1), d i All goals completed! 🐙 end DegreeSequencesTriangleFree namespace SimpleGraph variable {α : Type*} [Fintype α] [DecidableEq α]

The degree sequence of G is compact if it satisfies IsCompactSequenceOn for all valid indices k such that k + 2 < Fintype.card α.

def HasCompactdegreeSequence (G : SimpleGraph α) [DecidableRel G.Adj] : Prop := DegreeSequencesTriangleFree.IsCompactSequenceOn (fun k => (degreeSequence G).getD k 0) {k | k + 2 < Fintype.card α}

Theorem 1. If a triangle-free graph has f = 2, then it is bipartite, has minimum degree 1, and its degree sequence is compact.

@[category research solved, AMS 5] theorem declaration uses 'sorry'theorem1 (G : SimpleGraph α) (h_conn: G.Connected) [DecidableRel G.Adj] (h₁ : G.CliqueFree 3) (h₂ : degreeSequenceMultiplicity G = 2) : G.IsBipartite G.minDegree = 1 HasCompactdegreeSequence G := α:Type u_1inst✝²:Fintype αinst✝¹:DecidableEq αG:SimpleGraph αh_conn:G.Connectedinst✝:DecidableRel G.Adjh₁:G.CliqueFree 3h₂:G.degreeSequenceMultiplicity = 2G.IsBipartite G.minDegree = 1 G.HasCompactdegreeSequence All goals completed! 🐙

Lemma 3. For every n there exists a bipartite graph with 8 n vertices, minimum degree n + 1, and f = 3.

@[category API, AMS 5] lemma declaration uses 'sorry'lemma3 (n : ) (hn : 0 < n) : (G : SimpleGraph (Fin (8 * n))) (_ : DecidableRel G.Adj), G.IsBipartite G.minDegree = n + 1 degreeSequenceMultiplicity G = 3 := n:hn:0 < n G x, G.IsBipartite G.minDegree = n + 1 G.degreeSequenceMultiplicity = 3 All goals completed! 🐙

Lemma 4. Let G be a triangle-free graph with n vertices and let v be a vertex of G. There exists a triangle-free graph H containing G as an induced subgraph such that: (i) the degree of v in H is one more than its degree in G; (ii) for every vertex w of G other than v the degree of w in H is the same as its degree in G; (iii) if J is the subgraph of H induced by the vertices not in G, then f(J)=3 and δ(J) ≥ 2n.

@[category API, AMS 5] lemma declaration uses 'sorry'lemma4 (G : SimpleGraph α) [DecidableRel G.Adj] (h_conn: G.Connected) (h₁ : G.CliqueFree 3) (v : α) : (β : Type*) (_ : Fintype β) (H : SimpleGraph β) (_ : DecidableRel H.Adj) (i : G ↪g H), H.CliqueFree 3 H.degree (i v) = G.degree v + 1 ( w v, H.degree (i w) = G.degree w) let J := H.induce (Set.compl (Set.range i)) degreeSequenceMultiplicity J = 3 J.minDegree 2 * Fintype.card α := α:Type u_1inst✝²:Fintype αinst✝¹:DecidableEq αG:SimpleGraph αinst✝:DecidableRel G.Adjh_conn:G.Connectedh₁:G.CliqueFree 3v:α β x H x_1 i, H.CliqueFree 3 H.degree (i v) = G.degree v + 1 (∀ (w : α), w v H.degree (i w) = G.degree w) let J := induce (Set.range i).compl H; J.degreeSequenceMultiplicity = 3 J.minDegree 2 * Fintype.card α All goals completed! 🐙

Theorem 2. Every triangle-free graph is an induced subgraph of one with f = 3.

@[category research solved, AMS 5] theorem declaration uses 'sorry'theorem2 (G : SimpleGraph α) [DecidableRel G.Adj] (h_conn: G.Connected) (h : G.CliqueFree 3) : (β : Type*) (_ : Fintype β) (H : SimpleGraph β) (_ : DecidableRel H.Adj) (i : G ↪g H), H.CliqueFree 3 degreeSequenceMultiplicity H = 3 := α:Type u_1inst✝²:Fintype αinst✝¹:DecidableEq αG:SimpleGraph αinst✝:DecidableRel G.Adjh_conn:G.Connectedh:G.CliqueFree 3 β x H x_1 i, H.CliqueFree 3 H.degreeSequenceMultiplicity = 3 All goals completed! 🐙

F n is the smallest number of vertices of a triangle-free graph with chromatic number n and f = 3.

@[category research solved, AMS 5] noncomputable def F (n : ) : := sInf { p | (G : SimpleGraph (Fin p)) (_ : DecidableRel G.Adj), G.CliqueFree 3 G.chromaticNumber = n degreeSequenceMultiplicity G = 3 }

The smallest number of vertices of a triangle-free graph with chromatic number 3 and f=3 is 7.

@[category research solved, AMS 5] theorem declaration uses 'sorry'F_three : F 3 = 7 := F 3 = 7 All goals completed! 🐙

The smallest number of vertices of a triangle-free graph with chromatic number 4 and f=3 is at most 19.

@[category research solved, AMS 5] theorem declaration uses 'sorry'F_four_le : F 4 19 := F 4 19 All goals completed! 🐙 end SimpleGraph