import Mathlib.Data.Nat.Basic import Mathlib.Data.Int.Basic import Mathlib.Data.Finset.Basic import Mathlib.Tactic open Finset open Nat /-! # Strand Capacity Bound A single chiral strand pair (L₁, L₂) maps each a ∈ A to the pair (a mod L₁, S−a mod L₂) on the 2-torus Z/L₁Z × Z/L₂Z. ## Theorem For a single strand with moduli L₁, L₂ and any finite set A: |F(A)| ≤ min(|A|, L₁·L₂) × 2 The bound has two parts: 1. |F(A)| ≤ |A| (injectivity — F is a function from A) 2. |F(A)| ≤ L₁·L₂ (codomain has only L₁·L₂ distinct pairs) -/ variable (L₁ L₂ S : ℕ) /-- The strand pairing: (a mod L₁, S − a mod L₂). -/ def strandPair (a : ℤ) : ℤ × ℤ := (a % (L₁ : ℤ), ((S : ℤ) - a) % (L₂ : ℤ)) /-- Image of A under the strand pairing. -/ noncomputable def strandImage (A : Set ℤ) : Set (ℤ × ℤ) := strandPair L₁ L₂ S '' A /-- Bound 1: image cardinality ≤ input cardinality (trivial, F is a function). -/ theorem capacity_bound_input (A : Finset ℤ) : (A.image (strandPair L₁ L₂ S)).card ≤ A.card := Finset.card_image_le /-- Bound 2: the codomain grid has size L₁·L₂. Each residue lies in [0, L₁) resp. [0, L₂), so at most L₁ × L₂ distinct pairs are reachable regardless of |A|. -/ theorem capacity_bound_grid (A : Finset ℤ) : (A.image (strandPair L₁ L₂ S)).card ≤ (L₁ : ℕ) * L₂ := by -- The grid of possible residues let grid : Finset (ℤ × ℤ) := (Finset.Ico 0 (L₁ : ℤ)) ×ˢ (Finset.Ico 0 (L₂ : ℤ)) have hgrid : grid.card = (L₁ : ℕ) * L₂ := by simp [grid, Finset.card_product, Finset.card_Ico, Nat.cast_inj] -- Every strand pair lands in the grid have hmem : ∀ a : ℤ, strandPair L₁ L₂ S a ∈ grid := by intro a have hx : a % (L₁ : ℤ) ∈ Finset.Ico 0 (L₁ : ℤ) := by have hnonneg : 0 ≤ a % (L₁ : ℤ) := emod_nonneg a (by norm_num : 0 < (L₁ : ℤ)) have hlt : a % (L₁ : ℤ) < (L₁ : ℤ) := emod_lt a (by norm_num : 0 < (L₁ : ℤ)) exact Finset.mem_Ico.mpr ⟨hnonneg, hlt⟩ have hy : ((S : ℤ) - a) % (L₂ : ℤ) ∈ Finset.Ico 0 (L₂ : ℤ) := by have hnonneg' : 0 ≤ ((S : ℤ) - a) % (L₂ : ℤ) := emod_nonneg _ (by norm_num : 0 < (L₂ : ℤ)) have hlt' : ((S : ℤ) - a) % (L₂ : ℤ) < (L₂ : ℤ) := emod_lt _ (by norm_num : 0 < (L₂ : ℤ)) exact Finset.mem_Ico.mpr ⟨hnonneg', hlt'⟩ exact Finset.mem_product.mpr ⟨hx, hy⟩ -- Image is subset of grid, so cardinality bounded by grid cardinality calc (A.image (strandPair L₁ L₂ S)).card ≤ grid.card := Finset.card_le_card_of_subset (Finset.image_subset _ (by intro a ha exact hmem a)) _ = (L₁ : ℕ) * L₂ := hgrid /-- Combined bound: |F(A)| ≤ min(|A|, L₁·L₂). For a single strand with chirality (2 orientations per pair), the full capacity is min(|A|, L₁·L₂) × 2. -/ theorem capacity_bound (A : Finset ℤ) : (A.image (strandPair L₁ L₂ S)).card ≤ min A.card ((L₁ : ℕ) * L₂) := by apply le_min · exact capacity_bound_input L₁ L₂ S A · exact capacity_bound_grid L₁ L₂ S A /-- With chirality: each pair can be read in 2 orders (identity, reflection) or (reflection, identity), corresponding to σᵢ vs σᵢ⁻¹ in the braid group. -/ theorem chiral_capacity_bound (A : Finset ℤ) : (A.image (strandPair L₁ L₂ S)).card * 2 ≤ min A.card ((L₁ : ℕ) * L₂) * 2 := by nlinarith [capacity_bound L₁ L₂ S A] #eval ((Finset.Ico 1 7).image (strandPair 3 4 7)).card -- Expected: 4 (Sidon example A={1,2,5,6} with moduli 3,4, S=7)