/- 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. -/ module public import FormalConjecturesForMathlib.Combinatorics.AP.Basic public import Mathlib.Analysis.Normed.Field.Lemmas public import Mathlib.Order.CompletePartialOrder@[expose] public sectionopen Function Setopen scoped Pointwisevariable {α : Type*} [AddCommMonoid α]

A set $S$ is said to be product-free if the product set $S \cdot S$ is disjoint from $S$, i.e. if the equation $x \cdot y = z$ has no solution with $x, y, z \in S$.

@[to_additive IsSumFree

A set $A$ is said to be sum-free if the sumset $A + A$ is disjoint from $A$, i.e. if the equation $a + b = c$ has no solution with $a, b, c \in A$.

] def IsProductFree {M : Type*} [Mul M] (S : Set M) : Prop := Disjoint (S * S) S@[to_additive isSumFree_iff] theorem isProductFree_iff {M : Type*} [Mul M] {S : Set M} : IsProductFree S x S, y S, x * y S := M:Type u_2inst✝:Mul MS:Set MIsProductFree S x S, y S, x * y S M:Type u_2inst✝:Mul MS:Set M(∀ a : M⦄, x S, x_1 S, x * x_1 = a a S) x S, y S, x * y S All goals completed! 🐙

allUniqueSums A is the set of elements in α that can be written as the sum of exactly one unordered pair of elements from A.

def allUniqueSums (A : Set α) : Set α := { n | p : α × α, p.1 A p.2 A p.1 + p.2 = n a₁ A, a₂ A, a₁ + a₂ = n (a₁ = p.1 a₂ = p.2) (a₁ = p.2 a₂ = p.1) }

A set A has no unique representation in its sumset A + A if for every pair of elements a₁, a₂ ∈ A, there exist another pair of elements b₁, b₂ ∈ A such that a₁ + a₂ = b₁ + b₂ and {a₁, a₂} ≠ {b₁, b₂}.

def HasNoUniqueRepresentation {α : Type*} [AddCommMonoid α] (A : Finset α) : Prop := allUniqueSums (A : Set α) =

A set $A$ of natural numbers is said to have bounded gaps if there exists an integer $p$ such that $A ∩ [n, n + 1, ..., n + p]$ is nonempty for all $n$.

def IsSyndetic (A : Set ) : Prop := p, n, (A .Icc n (n + p)).Nonempty

A Sidon set is a set, such that such that all pairwise sums of elements are distinct apart from coincidences forced by the commutativity of addition.

def IsSidon (A : Set α) : Prop := ∀ᵉ (i₁ A) (j₁ A) (i₂ A) (j₂ A), i₁ + i₂ = j₁ + j₂ (i₁ = j₁ i₂ = j₂) (i₁ = j₂ i₂ = j₁)namespace SetA:Set hA:IsSidon AY:Set hc:Y.encard = 3a:d:hY:Y = {x | n < 3, a + n * d = x}hY_card:Y.ncard = 3h:2 < (A Y).ncardhss:Y A Yha:a Aha₁:a + d Aha₂:a + 2 d Athis:a = a + d a + 2 d = a + d a = a + d a + 2 d = a + dFalse A:Set hA:IsSidon AY:Set hc:Y.encard = 3a:d:hY:Y = {x | n < 3, a + n * d = x}hY_card:Y.ncard = 3h:2 < (A Y).ncardhss:Y A Yha:a Aha₁:a + d Aha₂:a + 2 d Athis:d = 0 2 * d = dFalse A:Set hA:IsSidon AY:Set hc:Y.encard = 3a:d:hY:Y = {x | n < 3, a + n * d = x}h:2 < (A Y).ncardhss:Y A Yha:a Aha₁:a + d Aha₂:a + 2 d Athis:d = 0 2 * d = dhY_card:({a | x, x < 3} {a}).ncard = 3False All goals completed! 🐙theorem IsSidon.subset {A B : Set α} (hB : IsSidon B) (hAB : A B) : IsSidon A := fun _ _ _ _ _ _ _ _ _ hB _ (hAB _) _ (hAB _) _ (hAB _) _ (hAB _) _theorem IsSidon.insert {A : Set α} {m : α} [IsRightCancelAdd α] [IsLeftCancelAdd α] (hA : IsSidon A) : IsSidon (A {m}) (m A ∀ᵉ (a A) (b A), m + m a + b c A, m + a b + c) := α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon AIsSidon (A {m}) m A a A, b A, m + m a + b c A, m + a b + c α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m AIsSidon (A {m}) m A a A, b A, m + m a + b c A, m + a b + cα:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m AIsSidon (A {m}) m A a A, b A, m + m a + b c A, m + a b + c α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m AIsSidon (A {m}) m A a A, b A, m + m a + b c A, m + a b + c exact fun _ .inl h_mem, fun _ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ax✝:m A a A, b A, m + m a + b c A, m + a b + cIsSidon (A {m}) rwa [α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ax✝:m A a A, b A, m + m a + b c A, m + a b + cIsSidon (Insert.insert m A) α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ax✝:m A a A, b A, m + m a + b c A, m + a b + cIsSidon Aα:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ax✝:m A a A, b A, m + m a + b c A, m + a b + cIsSidon A α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ah:IsSidon (A {m})a:αha:a Ab:αhb:b Ahc:m + m = a + bFalseα:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ah:IsSidon (A {m})a:αha:a Ab:αhb:b Ac:αhc:c Ah_contr:m + a = b + cFalseα:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + cIsSidon (A {m}) α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ah:IsSidon (A {m})a:αha:a Ab:αhb:b Ahc:m + m = a + bFalse exact h m (α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ah:IsSidon (A {m})a:αha:a Ab:αhb:b Ahc:m + m = a + bm A {m} All goals completed! 🐙) a (α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ah:IsSidon (A {m})a:αha:a Ab:αhb:b Ahc:m + m = a + ba A {m} All goals completed! 🐙) m (α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ah:IsSidon (A {m})a:αha:a Ab:αhb:b Ahc:m + m = a + bm A {m} All goals completed! 🐙) b (α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ah:IsSidon (A {m})a:αha:a Ab:αhb:b Ahc:m + m = a + bb A {m} All goals completed! 🐙) hc |>.elim (fun _ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ah:IsSidon (A {m})a:αha:a Ab:αhb:b Ahc:m + m = a + bx✝:m = a m = bFalse All goals completed! 🐙) (fun _ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ah:IsSidon (A {m})a:αha:a Ab:αhb:b Ahc:m + m = a + bx✝:m = b m = aFalse All goals completed! 🐙) α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ah:IsSidon (A {m})a:αha:a Ab:αhb:b Ac:αhc:c Ah_contr:m + a = b + cFalse exact h m (α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ah:IsSidon (A {m})a:αha:a Ab:αhb:b Ac:αhc:c Ah_contr:m + a = b + cm A {m} All goals completed! 🐙) b (α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ah:IsSidon (A {m})a:αha:a Ab:αhb:b Ac:αhc:c Ah_contr:m + a = b + cb A {m} All goals completed! 🐙) a (α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ah:IsSidon (A {m})a:αha:a Ab:αhb:b Ac:αhc:c Ah_contr:m + a = b + ca A {m} All goals completed! 🐙) c (α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ah:IsSidon (A {m})a:αha:a Ab:αhb:b Ac:αhc:c Ah_contr:m + a = b + cc A {m} All goals completed! 🐙) h_contr |>.elim (fun _ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ah:IsSidon (A {m})a:αha:a Ab:αhb:b Ac:αhc:c Ah_contr:m + a = b + cx✝:m = b a = cFalse All goals completed! 🐙) (fun _ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ah:IsSidon (A {m})a:αha:a Ab:αhb:b Ac:αhc:c Ah_contr:m + a = b + cx✝:m = c a = bFalse All goals completed! 🐙) α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + cIsSidon (A {m}) α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ A {m} j₁ A {m}, i₂ A {m}, j₂ A {m}, i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ A j₁ A {m}, i₂ A {m}, j₂ A {m}, i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ {m} j₁ A {m}, i₂ A {m}, j₂ A {m}, i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ A j₁ A {m}, i₂ A {m}, j₂ A {m}, i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ Aj₁:αhj₁:j₁ A {m} i₂ A {m}, j₂ A {m}, i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ Aj₁:αhj₁:j₁ A i₂ A {m}, j₂ A {m}, i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ Aj₁:αhj₁:j₁ {m} i₂ A {m}, j₂ A {m}, i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ Aj₁:αhj₁:j₁ A i₂ A {m}, j₂ A {m}, i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ Aj₁:αhj₁:j₁ Ai₂:αhi₂:i₂ A {m} j₂ A {m}, i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ Aj₁:αhj₁:j₁ Ai₂:αhi₂:i₂ A j₂ A {m}, i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ Aj₁:αhj₁:j₁ Ai₂:αhi₂:i₂ {m} j₂ A {m}, i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ Aj₁:αhj₁:j₁ Ai₂:αhi₂:i₂ A j₂ A {m}, i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ Aj₁:αhj₁:j₁ Ai₂:αhi₂:i₂ Aj₂:αhj₂:j₂ A {m}i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ Aj₁:αhj₁:j₁ Ai₂:αhi₂:i₂ Aj₂:αhj₂:j₂ Ai₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ Aj₁:αhj₁:j₁ Ai₂:αhi₂:i₂ Aj₂:αhj₂:j₂ {m}i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ Aj₁:αhj₁:j₁ Ai₂:αhi₂:i₂ Aj₂:αhj₂:j₂ Ai₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁ All goals completed! 🐙 α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ Aj₁:αhj₁:j₁ Ai₂:αhi₂:i₂ Aj₂:αhj₂:j₂ {m}i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ai₁:αj₁:αi₂:αj₂:αhm: a A, b A, ¬m + m = a + b c A, ¬m + a = b + chi₁:i₁ Ahj₁:j₁ Ahi₂:i₂ Ahj₂:j₂ = mi₁ + i₂ = j₁ + m i₁ = j₁ i₂ = m i₁ = m i₂ = j₁ exact fun h α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ai₁:αj₁:αi₂:αj₂:αhm: a A, b A, ¬m + m = a + b c A, ¬m + a = b + chi₁:i₁ Ahj₁:j₁ Ahi₂:i₂ Ahj₂:j₂ = mh:i₁ + i₂ = j₁ + mi₁ = j₁ i₂ = m i₁ = m i₂ = j₁ All goals completed! 🐙 α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ Aj₁:αhj₁:j₁ Ai₂:αhi₂:i₂ {m} j₂ A {m}, i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ai₁:αj₁:αi₂:αhm: a A, b A, ¬m + m = a + b c A, ¬m + a = b + chi₁:i₁ Ahj₁:j₁ Ahi₂:i₂ = m a A, i₁ + m = j₁ + a i₁ = j₁ m = a i₁ = a m = j₁ exact fun a ha h α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ai₁:αj₁:αi₂:αhm: a A, b A, ¬m + m = a + b c A, ¬m + a = b + chi₁:i₁ Ahj₁:j₁ Ahi₂:i₂ = ma:αha:a Ah:i₁ + m = j₁ + ai₁ = j₁ m = a i₁ = a m = j₁ All goals completed! 🐙 α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ Aj₁:αhj₁:j₁ {m} i₂ A {m}, j₂ A {m}, i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ai₁:αj₁:αhm: a A, b A, ¬m + m = a + b c A, ¬m + a = b + chi₁:i₁ Ahj₁:j₁ = m(∀ a A, i₁ + m = m + a i₁ = m m = a i₁ = a) a A, (i₁ + a = m + m i₁ = m a = m) a_2 A, i₁ + a = m + a_2 i₁ = m a = a_2 i₁ = a_2 a = m refine fun b hb h .inr <| α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ai₁:αj₁:αhm: a A, b A, ¬m + m = a + b c A, ¬m + a = b + chi₁:i₁ Ahj₁:j₁ = mb:αhb:b Ah:i₁ + m = m + bi₁ = b All goals completed! 🐙, fun b hb fun h ?_, ?_ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ai₁:αj₁:αhm: a A, b A, ¬m + m = a + b c A, ¬m + a = b + chi₁:i₁ Ahj₁:j₁ = mb:αhb:b Ah:i₁ + b = m + mi₁ = m b = m All goals completed! 🐙 α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ai₁:αj₁:αhm: a A, b A, ¬m + m = a + b c A, ¬m + a = b + chi₁:i₁ Ahj₁:j₁ = mb:αhb:b A a A, i₁ + b = m + a i₁ = m b = a i₁ = a b = m exact fun c hc h α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ai₁:αj₁:αhm: a A, b A, ¬m + m = a + b c A, ¬m + a = b + chi₁:i₁ Ahj₁:j₁ = mb:αhb:b Ac:αhc:c Ah:i₁ + b = m + ci₁ = m b = c i₁ = c b = m All goals completed! 🐙 α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ahm:m A a A, b A, m + m a + b c A, m + a b + ci₁:αhi₁:i₁ {m} j₁ A {m}, i₂ A {m}, j₂ A {m}, i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ai₁:αhm: a A, b A, ¬m + m = a + b c A, ¬m + a = b + chi₁:i₁ = m a A, a_2 A, m + a_2 = a + m m = a a_2 = m a_2 = a exact fun _ _ _ _ _ α:Type u_1inst✝²:AddCommMonoid αA:Set αm:αinst✝¹:IsRightCancelAdd αinst✝:IsLeftCancelAdd αhA:IsSidon Ah_mem:m Ai₁:αhm: a A, b A, ¬m + m = a + b c A, ¬m + a = b + chi₁:i₁ = mx✝⁴:αx✝³:x✝⁴ Ax✝²:αx✝¹:x✝² Ax✝:m + x✝² = x✝⁴ + mm = x✝⁴ x✝² = m x✝² = x✝⁴ All goals completed! 🐙

Maximal Sidon sets in an interval.

We follow the convention that IsMaximalSidonSetIn A N means A ⊆ {1, …, N} is Sidon and is inclusion-maximal among subsets of Set.Icc 1 N with the Sidon property.

IsMaximalSidonSetIn A N means A ⊆ {1, …, N} is Sidon and cannot be extended within {1, …, N} while remaining Sidon.

def IsMaximalSidonSetIn (A : Set ) (N : ) : Prop := A Set.Icc 1 N IsSidon A x : , x Set.Icc 1 N x A ¬ IsSidon (A {x})namespace IsMaximalSidonSetIn

If A is a maximal Sidon set in {1, …, N}, then A ⊆ {1, …, N}.

theorem subset {A : Set } {N : } (hA : IsMaximalSidonSetIn A N) : A Set.Icc 1 N := hA.1

If A is a maximal Sidon set in {1, …, N}, then A is Sidon.

theorem isSidon {A : Set } {N : } (hA : IsMaximalSidonSetIn A N) : IsSidon A := hA.2.1

Maximality condition unpacked.

theorem maximal {A : Set } {N : } (hA : IsMaximalSidonSetIn A N) {x : } (hx : x Set.Icc 1 N) (hxA : x A) : ¬ IsSidon (A {x}) := hA.2.2 hx hxAend IsMaximalSidonSetInend Setnamespace Finsetinstance (A : Finset α) [DecidableEq α] : Decidable (IsSidon (A : Set α)) := α:Type u_1inst✝¹:AddCommMonoid αA:Finset αinst✝:DecidableEq αDecidable (IsSidon A) α:Type u_1inst✝¹:AddCommMonoid αA:Finset αinst✝:DecidableEq α(∀ i₁ A, j₁ A, i₂ A, j₂ A, i₁ + i₂ = j₁ + j₂ i₁ = j₁ i₂ = j₂ i₁ = j₂ i₂ = j₁) IsSidon A All goals completed! 🐙

The maximum size of a Sidon set in the supplied Finset.

def maxSidonSubsetCard (A : Finset α) [DecidableEq α] : := (A.powerset.filter fun B : Finset α IsSidon (B : Set α)).sup Finset.card

If A is finite Sidon, then A ∪ {s} is also Sidon provided s ≥ A.max + 1.

A:Finset h:A.NonemptyhA:IsSidon As:hs:2 * A.max' h + 1 sh₁: {a b c : }, a A b A c A a + b < 2 * A.max' h + 1 + cthis:s AIsSidon (A {s}) exact (IsSidon.insert hA).2 <| A:Finset h:A.NonemptyhA:IsSidon As:hs:2 * A.max' h + 1 sh₁: {a b c : }, a A b A c A a + b < 2 * A.max' h + 1 + cthis:s As A a A, b A, s + s a + b c A, s + a b + c simpa [this] using fun a ha b hb A:Finset h:A.NonemptyhA:IsSidon As:hs:2 * A.max' h + 1 sh₁: {a b c : }, a A b A c A a + b < 2 * A.max' h + 1 + cthis:s Aa:ha:a Ab:hb:b A¬s + s = a + b All goals completed! 🐙, fun c hc A:Finset h:A.NonemptyhA:IsSidon As:hs:2 * A.max' h + 1 sh₁: {a b c : }, a A b A c A a + b < 2 * A.max' h + 1 + cthis:s Aa:ha:a Ab:hb:b Ac:hc:c A¬s + a = b + c All goals completed! 🐙theorem IsSidon.exists_insert {A : Finset } (h : A.Nonempty) (hA : IsSidon (A : Set )) : m A, IsSidon (A {m}) := A:Finset h:A.NonemptyhA:IsSidon A m A, IsSidon (A {m}) A:Finset h:A.NonemptyhA:IsSidon A2 * A.max' h + 1 A exact mt (A.le_max' _) <| not_le.2 <| Finset.max'_lt_iff _ _ |>.2 fun a ha A:Finset h:A.NonemptyhA:IsSidon Aa:ha:a Aa < 2 * A.max' h + 1 All goals completed! 🐙theorem IsSidon.exists_insert_ge {A : Finset } (h : A.Nonempty) (hA : IsSidon (A : Set )) (s : ) : m s, m A IsSidon (A {m}) := A:Finset h:A.NonemptyhA:IsSidon As: m s, m A IsSidon (A {m}) A:Finset h:A.NonemptyhA:IsSidon As:(if s 2 * A.max' h + 1 then s else 2 * A.max' h + 1) sA:Finset h:A.NonemptyhA:IsSidon As:(if s 2 * A.max' h + 1 then s else 2 * A.max' h + 1) AA:Finset h:A.NonemptyhA:IsSidon As:IsSidon (A {if s 2 * A.max' h + 1 then s else 2 * A.max' h + 1}) A:Finset h:A.NonemptyhA:IsSidon As:(if s 2 * A.max' h + 1 then s else 2 * A.max' h + 1) s A:Finset h:A.NonemptyhA:IsSidon As:h✝:s 2 * A.max' h + 1s sA:Finset h:A.NonemptyhA:IsSidon As:h✝:¬s 2 * A.max' h + 12 * A.max' h + 1 s A:Finset h:A.NonemptyhA:IsSidon As:h✝:s 2 * A.max' h + 1s sA:Finset h:A.NonemptyhA:IsSidon As:h✝:¬s 2 * A.max' h + 12 * A.max' h + 1 s All goals completed! 🐙 A:Finset h:A.NonemptyhA:IsSidon As:(if s 2 * A.max' h + 1 then s else 2 * A.max' h + 1) A A:Finset h:A.NonemptyhA:IsSidon As:h✝:s 2 * A.max' h + 1s AA:Finset h:A.NonemptyhA:IsSidon As:h✝:¬s 2 * A.max' h + 12 * A.max' h + 1 A A:Finset h:A.NonemptyhA:IsSidon As:h✝:s 2 * A.max' h + 1s AA:Finset h:A.NonemptyhA:IsSidon As:h✝:¬s 2 * A.max' h + 12 * A.max' h + 1 A exact mt (A.le_max' _) <| not_le.2 <| Finset.max'_lt_iff _ _ |>.2 fun a ha A:Finset h:A.NonemptyhA:IsSidon As:h✝:¬s 2 * A.max' h + 1a:ha:a Aa < 2 * A.max' h + 1 All goals completed! 🐙 A:Finset h:A.NonemptyhA:IsSidon As:IsSidon (A {if s 2 * A.max' h + 1 then s else 2 * A.max' h + 1}) A:Finset h:A.NonemptyhA:IsSidon As:hs:s 2 * A.max' h + 1IsSidon (A {s})A:Finset h:A.NonemptyhA:IsSidon As:hs:¬s 2 * A.max' h + 1IsSidon (A {2 * A.max' h + 1}) A:Finset h:A.NonemptyhA:IsSidon As:hs:s 2 * A.max' h + 1IsSidon (A {s}) All goals completed! 🐙 A:Finset h:A.NonemptyhA:IsSidon As:hs:¬s 2 * A.max' h + 1IsSidon (A {2 * A.max' h + 1}) All goals completed! 🐙

Given a finite Sidon set A and a lower bound m, go finds the smallest number m' ≥ m such that A ∪ {m'} is Sidon. If A is empty then this returns the value m. Note that the lower bound is required to avoid 0 being a contender in some cases.

def greedySidon.go (A : Finset ) (hA : IsSidon (A : Set )) (m : ) : {m' : // m' m m' A IsSidon ((A {m'}) : Set )} := if h : A.Nonempty then have : m', m' m m' A IsSidon ((A {m'}) : Set ) := α:Type u_1inst✝:AddCommMonoid αA:Finset hA:IsSidon Am:h:A.Nonempty m' m, m' A IsSidon (A {m'}) All goals completed! 🐙 Nat.find this, Nat.find_spec this else m, α:Type u_1inst✝:AddCommMonoid αA:Finset hA:IsSidon Am:h:¬A.Nonemptym m m A IsSidon (A {m}) All goals completed! 🐙

Main search loop for generating the greedy Sidon sequence. The return value for step n is the finite set of numbers generated so far, a proof that it is Sidon, and the greatest element of the finite set at that point. This is initialised at {1}, then greedySidon.go is called iteratively using the lower bound max + 1 to find the next smallest Sidon preserving number.

def greedySidon.aux (n : ) : ({A : Finset // IsSidon (A : Set )} × ) := match n with | 0 => ({1}, α:Type u_1inst✝:AddCommMonoid αn:IsSidon {1} All goals completed! 🐙, 1) | k + 1 => let (A, s) := greedySidon.aux k let s := if h : A.1.Nonempty then A.1.max' h + 1 else s let s' := greedySidon.go A.1 A.2 s (A.1 {s'.1}, s'.2.2.2, s'.1)

greedySidon is the sequence obtained by the initial set ${1}$ and iteratively obtaining the next smallest integer that preserves the Sidon property of the set. This gives the sequence 1, 2, 4, 8, 13, 21, 31, ....

def greedySidon (n : ) : := greedySidon.aux n |>.2

The greedy Sidon set in {1, …, N}: starting from , iterate through 1, …, N and include x if and only if A ∪ {x} remains Sidon. Alternatively, this is precisely the set of elements in the greedy Sidon sequence that are ≤ N.

def greedySidonBelow (N : ) : Finset := (greedySidon.aux N).1.1.filter (· N)end Finset