-- Submission body for math30catalog-source23 (Wilf's inequality for numerical semigroups with c ≤ 4m). -- Blueprint: experiments/astra/BLUEPRINT.md. Each `sorry` below is an open blueprint node. -- Infrastructure lemmas (prefix w23_) come from audited sub-task fragments; see experiments/astra/merged/. open Math30 Math30.Wilf open scoped Pointwise /-- A1: the least positive element is no larger than the conductor. -/ theorem w22_multiplicity_le_conductor (S : NumericalSemigroup) : S.multiplicity ≤ S.conductor := S.multiplicity_le S.conductor_pos (S.conductor_spec _ (le_refl _)) theorem w22_conductor_eq_multiplicity (S : NumericalSemigroup) (h : S.conductor ≤ S.multiplicity) : S.conductor = S.multiplicity := Nat.le_antisymm h (w22_multiplicity_le_conductor S) /-- A2: the full conductor block belongs to the semigroup. -/ theorem w22_mem_of_conductor_le (S : NumericalSemigroup) {x : ℕ} (h : S.conductor ≤ x) : x ∈ S.carrier := S.conductor_spec x h theorem w22_conductor_block_filter (S : NumericalSemigroup) : (@Finset.filter ℕ (fun x => x ∈ S.carrier) (Classical.decPred _) (Finset.Ico S.conductor (S.conductor + S.multiplicity))) = Finset.Ico S.conductor (S.conductor + S.multiplicity) := by classical apply Finset.filter_eq_self.mpr intro x hx exact S.conductor_spec x (Finset.mem_Ico.mp hx).1 /-- A3: primitives and the multiplicity. -/ theorem w22_primitives_subset (S : NumericalSemigroup) : S.primitiveElements ⊆ Finset.Ico S.multiplicity (S.conductor + S.multiplicity) := by intro x hx have hp := (S.mem_primitiveElements x).mp hx exact Finset.mem_Ico.mpr ⟨S.multiplicity_le hp.2.1 hp.1, S.primitive_lt hp⟩ theorem w22_multiplicity_mem_primitives (S : NumericalSemigroup) : S.multiplicity ∈ S.primitiveElements := (S.mem_primitiveElements _).mpr S.multiplicity_isPrimitive theorem w22_primitive_sub_multiplicity_not_mem (S : NumericalSemigroup) {x : ℕ} (hp : S.IsPrimitive x) (hne : x ≠ S.multiplicity) : x - S.multiplicity ∉ S.carrier := by intro hsub have hle := S.multiplicity_le hp.2.1 hp.1 have hm := S.multiplicity_pos have hzero := hp.2.2 S.multiplicity (x - S.multiplicity) S.multiplicity_mem hsub (by omega) omega /-- A4: primitive generation and positive decomposition. -/ theorem w22_generated_by_primitives (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ S.carrier) : x ∈ AddSubmonoid.closure {n | S.IsPrimitive n} := by rw [S.closure_primitives] exact hx theorem w22_primitive_or_decomposition (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ S.carrier) (hpos : 0 < x) : S.IsPrimitive x ∨ ∃ y z, y ∈ S.carrier ∧ z ∈ S.carrier ∧ 0 < y ∧ 0 < z ∧ x = y + z := by classical by_cases hp : S.IsPrimitive x · exact Or.inl hp · right have hd : ¬ ∀ y z, y ∈ S.carrier → z ∈ S.carrier → x = y + z → y = 0 ∨ z = 0 := by intro hall exact hp ⟨hx, hpos, hall⟩ push Not at hd obtain ⟨y, z, hy, hz, he, hy0, hz0⟩ := hd exact ⟨y, z, hy, hz, by omega, by omega, he⟩ /-- A4 in explicit finite-sum form, including zero as the empty sum. -/ theorem w22_sum_of_primitives (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ S.carrier) : ∃ l : List ℕ, (∀ p ∈ l, S.IsPrimitive p) ∧ l.sum = x := by have hgen : ∀ x : ℕ, x ∈ S.carrier → ∃ l : List ℕ, (∀ p ∈ l, S.IsPrimitive p) ∧ l.sum = x := by intro x induction x using Nat.strong_induction_on with | h x ih => intro hx by_cases hz : x = 0 · subst x exact ⟨[], by simp, by simp⟩ · rcases w22_primitive_or_decomposition S hx (by omega) with hp | ⟨a, b, ha, hb, hap, hbp, he⟩ · exact ⟨[x], by simpa using hp, by simp⟩ · obtain ⟨la, hla, hsa⟩ := ih a (by omega) ha obtain ⟨lb, hlb, hsb⟩ := ih b (by omega) hb refine ⟨la ++ lb, ?_, ?_⟩ · intro p hp rcases List.mem_append.mp hp with hpa | hpb · exact hla p hpa · exact hlb p hpb · simpa only [List.sum_append, hsa, hsb] using he.symm exact hgen x hx /-- A5: elements below twice the multiplicity are indecomposable. -/ theorem w22_primitive_of_lt_two_multiplicity (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ S.carrier) (hpos : 0 < x) (hlt : x < 2 * S.multiplicity) : S.IsPrimitive x := by refine ⟨hx, hpos, ?_⟩ intro a b ha hb he by_cases ha0 : a = 0 · exact Or.inl ha0 · by_cases hb0 : b = 0 · exact Or.inr hb0 · have hma := S.multiplicity_le (by omega : 0 < a) ha have hmb := S.multiplicity_le (by omega : 0 < b) hb omega noncomputable def w22_leftPrimitives (S : NumericalSemigroup) : Finset ℕ := S.primitiveElements.filter (fun x => x < S.conductor) noncomputable def w22_rightPrimitives (S : NumericalSemigroup) : Finset ℕ := S.primitiveElements.filter (fun x => S.conductor ≤ x) /-- A6: zero together with all positive left elements. -/ theorem w22_leftElements_split (S : NumericalSemigroup) : S.leftElements = {0} ∪ (@Finset.filter ℕ (fun x => x ∈ S.carrier) (Classical.decPred _) (Finset.Ico 1 S.conductor)) := by classical ext x simp only [S.mem_leftElements, Finset.mem_union, Finset.mem_singleton, Finset.mem_filter, Finset.mem_Ico] have h0 := S.carrier.zero_mem have hc := S.conductor_pos constructor · rintro ⟨hlt, hx⟩ by_cases hz : x = 0 · exact Or.inl hz · exact Or.inr ⟨⟨by omega, hlt⟩, hx⟩ · rintro (rfl | ⟨⟨_, hlt⟩, hx⟩) · exact ⟨hc, h0⟩ · exact ⟨hlt, hx⟩ theorem w22_leftElements_eq_insert_primitives (S : NumericalSemigroup) (h : S.conductor ≤ 2 * S.multiplicity) : S.leftElements = insert 0 (w22_leftPrimitives S) := by classical ext x simp only [S.mem_leftElements, Finset.mem_insert, w22_leftPrimitives, Finset.mem_filter, S.mem_primitiveElements] constructor · rintro ⟨hlt, hx⟩ by_cases hz : x = 0 · exact Or.inl hz · exact Or.inr ⟨w22_primitive_of_lt_two_multiplicity S hx (by omega) (by omega), hlt⟩ · rintro (rfl | ⟨hp, hlt⟩) · exact ⟨S.conductor_pos, S.carrier.zero_mem⟩ · exact ⟨hlt, hp.1⟩ theorem w22_leftCount_eq (S : NumericalSemigroup) (h : S.conductor ≤ 2 * S.multiplicity) : S.leftCount = 1 + (w22_leftPrimitives S).card := by classical have h0 : 0 ∉ w22_leftPrimitives S := by simp only [w22_leftPrimitives, Finset.mem_filter, S.mem_primitiveElements] intro hp exact Nat.lt_irrefl 0 hp.1.2.1 unfold NumericalSemigroup.leftCount rw [w22_leftElements_eq_insert_primitives S h, Finset.card_insert_of_notMem h0] omega theorem w22_primitive_counts (S : NumericalSemigroup) : (w22_leftPrimitives S).card + (w22_rightPrimitives S).card = S.embeddingDimension := by classical simpa only [w22_leftPrimitives, w22_rightPrimitives, not_lt, NumericalSemigroup.embeddingDimension] using (Finset.card_filter_add_card_filter_not (s := S.primitiveElements) (fun x => x < S.conductor)) theorem w22_left_multiples (S : NumericalSemigroup) {q : ℕ} (h : ∀ k < q, k * S.multiplicity < S.conductor) : (Finset.range q).image (fun k => k * S.multiplicity) ⊆ S.leftElements := by classical intro x hx obtain ⟨k, hk, rfl⟩ := Finset.mem_image.mp hx refine (S.mem_leftElements _).mpr ⟨h k (Finset.mem_range.mp hk), ?_⟩ simpa using S.carrier.nsmul_mem S.multiplicity_mem k theorem w22_leftCount_ge_multiples (S : NumericalSemigroup) {q : ℕ} (h : ∀ k < q, k * S.multiplicity < S.conductor) : q ≤ S.leftCount := by classical have hm := S.multiplicity_pos have hinj : Function.Injective (fun k : ℕ => k * S.multiplicity) := by intro a b hab nlinarith have hc := Finset.card_le_card (w22_left_multiples S h) rw [Finset.card_image_of_injective _ hinj, Finset.card_range] at hc exact hc theorem w22_ceil_conductor_le_leftCount (S : NumericalSemigroup) : (S.conductor + S.multiplicity - 1) / S.multiplicity ≤ S.leftCount := by apply w22_leftCount_ge_multiples intro k hk have hm := S.multiplicity_pos have hc := S.conductor_pos have hd := Nat.div_mul_le_self (S.conductor + S.multiplicity - 1) S.multiplicity have hs : S.conductor + S.multiplicity - 1 + 1 = S.conductor + S.multiplicity := by omega have hkq := Nat.mul_le_mul_right S.multiplicity (Nat.succ_le_of_lt hk) nlinarith theorem w22_ordinary_mem_iff (S : NumericalSemigroup) (h : S.conductor ≤ S.multiplicity) (x : ℕ) : x ∈ S.carrier ↔ x = 0 ∨ S.multiplicity ≤ x := by constructor · intro hx by_cases hz : x = 0 · exact Or.inl hz · exact Or.inr (S.multiplicity_le (by omega) hx) · rintro (rfl | hmx) · exact S.carrier.zero_mem · exact S.conductor_spec x (le_trans h hmx) /-- The ordinary case, including its exact invariant values. -/ theorem w22_ordinary_invariants (S : NumericalSemigroup) (h : S.conductor ≤ S.multiplicity) : S.conductor = S.multiplicity ∧ S.leftCount = 1 ∧ S.embeddingDimension = S.multiplicity := by classical have he := w22_conductor_eq_multiplicity S h have hl : S.leftElements = {0} := by ext x simp only [S.mem_leftElements, Finset.mem_singleton] constructor · rintro ⟨hlt, hx⟩ by_contra hx0 have hm := S.multiplicity_le (by omega : 0 < x) hx omega · intro hx0 subst x exact ⟨S.conductor_pos, S.carrier.zero_mem⟩ have hp : S.primitiveElements = Finset.Ico S.multiplicity (2 * S.multiplicity) := by ext x simp only [S.mem_primitiveElements, Finset.mem_Ico] constructor · intro hx have hle := S.multiplicity_le hx.2.1 hx.1 have hlt := S.primitive_lt hx exact ⟨hle, by omega⟩ · rintro ⟨hle, hlt⟩ exact w22_primitive_of_lt_two_multiplicity S (S.conductor_spec x (by omega)) (lt_of_lt_of_le S.multiplicity_pos hle) hlt refine ⟨he, ?_, ?_⟩ · simp [NumericalSemigroup.leftCount, hl] · simp [NumericalSemigroup.embeddingDimension, hp, Nat.two_mul] /-- Every decomposable element of the conductor block is a sum of two left primitives. -/ theorem w22_block_coverage (S : NumericalSemigroup) (h : S.conductor ≤ 2 * S.multiplicity) : Finset.Ico S.conductor (S.conductor + S.multiplicity) ⊆ w22_rightPrimitives S ∪ (w22_leftPrimitives S).sym2.image Sym2.add := by classical intro x hx obtain ⟨hc, hlt⟩ := Finset.mem_Ico.mp hx have hxS := S.conductor_spec x hc have hpos : 0 < x := lt_of_lt_of_le S.conductor_pos hc rcases w22_primitive_or_decomposition S hxS hpos with hp | ⟨a, b, ha, hb, hap, hbp, he⟩ · apply Finset.mem_union_left exact Finset.mem_filter.mpr ⟨(S.mem_primitiveElements x).mpr hp, hc⟩ · have hma := S.multiplicity_le hap ha have hmb := S.multiplicity_le hbp hb have hal : a < S.conductor := by omega have hbl : b < S.conductor := by omega have hpa := w22_primitive_of_lt_two_multiplicity S ha hap (by omega) have hpb := w22_primitive_of_lt_two_multiplicity S hb hbp (by omega) apply Finset.mem_union_right apply Finset.mem_image.mpr refine ⟨Sym2.mk a b, ?_, ?_⟩ · exact Finset.mk_mem_sym2_iff.mpr ⟨Finset.mem_filter.mpr ⟨(S.mem_primitiveElements a).mpr hpa, hal⟩, Finset.mem_filter.mpr ⟨(S.mem_primitiveElements b).mpr hpb, hbl⟩⟩ · simpa using he.symm theorem w22_kaplan_count (S : NumericalSemigroup) (h : S.conductor ≤ 2 * S.multiplicity) : S.multiplicity ≤ (w22_rightPrimitives S).card + ((w22_leftPrimitives S).card + 1).choose 2 := by classical have hb := Finset.card_le_card (w22_block_coverage S h) have hu := Finset.card_union_le (w22_rightPrimitives S) ((w22_leftPrimitives S).sym2.image Sym2.add) have hi := Finset.card_image_le (s := (w22_leftPrimitives S).sym2) (f := Sym2.add) rw [Finset.card_sym2] at hi have hc : (Finset.Ico S.conductor (S.conductor + S.multiplicity)).card = S.multiplicity := by simp omega theorem w22_two_mul_choose (n : ℕ) : 2 * (n + 1).choose 2 = n * (n + 1) := by have h := Nat.add_one_mul_choose_eq n 1 simpa [Nat.mul_comm] using h.symm /-- Kaplan's theorem: conductor at most twice the multiplicity implies Wilf. -/ theorem w22_kaplan (S : NumericalSemigroup) (h : S.conductor ≤ 2 * S.multiplicity) : S.SatisfiesWilf := by classical unfold NumericalSemigroup.SatisfiesWilf by_cases hc : S.conductor ≤ S.multiplicity · obtain ⟨he, hl, hp⟩ := w22_ordinary_invariants S hc rw [he, hl, hp, Nat.mul_one] · have hmc : S.multiplicity < S.conductor := by omega let n := (w22_leftPrimitives S).card let r := (w22_rightPrimitives S).card have hn : 1 ≤ n := by have hm : S.multiplicity ∈ w22_leftPrimitives S := Finset.mem_filter.mpr ⟨w22_multiplicity_mem_primitives S, hmc⟩ have hp := Finset.card_pos.mpr ⟨S.multiplicity, hm⟩ exact hp have he : n + r = S.embeddingDimension := w22_primitive_counts S have hl : S.leftCount = 1 + n := w22_leftCount_eq S h have hb : S.multiplicity ≤ r + (n + 1).choose 2 := w22_kaplan_count S h have ht := w22_two_mul_choose n have hr : 0 ≤ r * (n - 1) := Nat.zero_le _ have hn1 : n - 1 + 1 = n := by omega rw [hl, ← he] nlinarith /-- A7: a residue always occurs, by cofiniteness. -/ theorem w22_exists_residue (S : NumericalSemigroup) (i : Fin S.multiplicity) : ∃ x : ℕ, x ∈ S.carrier ∧ x % S.multiplicity = i.val := by refine ⟨S.conductor * S.multiplicity + i.val, ?_, ?_⟩ · apply S.conductor_spec have hm := S.multiplicity_pos nlinarith · simp [Nat.add_mod, Nat.mod_eq_of_lt i.isLt] noncomputable def w22_apery (S : NumericalSemigroup) (i : Fin S.multiplicity) : ℕ := by classical exact Nat.find (w22_exists_residue S i) theorem w22_apery_mem (S : NumericalSemigroup) (i : Fin S.multiplicity) : w22_apery S i ∈ S.carrier := by classical exact (Nat.find_spec (w22_exists_residue S i)).1 theorem w22_apery_mod (S : NumericalSemigroup) (i : Fin S.multiplicity) : w22_apery S i % S.multiplicity = i.val := by classical exact (Nat.find_spec (w22_exists_residue S i)).2 theorem w22_apery_min (S : NumericalSemigroup) (i : Fin S.multiplicity) {x : ℕ} (hx : x ∈ S.carrier) (hi : x % S.multiplicity = i.val) : w22_apery S i ≤ x := by classical exact Nat.find_min' (w22_exists_residue S i) ⟨hx, hi⟩ theorem w22_apery_lt (S : NumericalSemigroup) (i : Fin S.multiplicity) : w22_apery S i < S.conductor + S.multiplicity := by by_contra hlt have hc := S.conductor_pos have hm := S.multiplicity_pos have hsub : w22_apery S i - S.multiplicity ∈ S.carrier := S.conductor_spec _ (by omega) have he : w22_apery S i - S.multiplicity + S.multiplicity = w22_apery S i := by omega have hr : (w22_apery S i - S.multiplicity) % S.multiplicity = i.val := by calc _ = (w22_apery S i - S.multiplicity + S.multiplicity) % S.multiplicity := (Nat.add_mod_right _ _).symm _ = i.val := by rw [he, w22_apery_mod] have hmin := w22_apery_min S i hsub hr omega /-- An element above the residue's Apéry representative is in the semigroup. -/ theorem w22_mem_of_apery_le (S : NumericalSemigroup) (i : Fin S.multiplicity) {x : ℕ} (hi : x % S.multiplicity = i.val) (hle : w22_apery S i ≤ x) : x ∈ S.carrier := by have hdiv := Nat.div_le_div_right (c := S.multiplicity) hle have hw := Nat.div_add_mod (w22_apery S i) S.multiplicity have hx := Nat.div_add_mod x S.multiplicity have hr := w22_apery_mod S i have hd : x / S.multiplicity - w22_apery S i / S.multiplicity + w22_apery S i / S.multiplicity = x / S.multiplicity := by omega have he : x = w22_apery S i + (x / S.multiplicity - w22_apery S i / S.multiplicity) * S.multiplicity := by nlinarith rw [he] apply S.carrier.add_mem (w22_apery_mem S i) simpa using S.carrier.nsmul_mem S.multiplicity_mem (x / S.multiplicity - w22_apery S i / S.multiplicity) theorem w22_frobenius_not_mem (S : NumericalSemigroup) : S.conductor - 1 ∉ S.carrier := by intro hmem have hc := S.conductor_pos have hthreshold : S.IsConductor (S.conductor - 1) := by intro x hx by_cases he : x = S.conductor - 1 · simpa [he] using hmem · exact S.conductor_spec x (by omega) have hle := S.conductor_le hthreshold omega noncomputable def w22_aperyMax (S : NumericalSemigroup) : ℕ := Finset.univ.sup (w22_apery S) theorem w22_aperyMax_lt (S : NumericalSemigroup) : w22_aperyMax S < S.conductor + S.multiplicity := by unfold w22_aperyMax apply (Finset.sup_lt_iff (show (0 : ℕ) < S.conductor + S.multiplicity from by have := S.conductor_pos; omega)).mpr intro i _ exact w22_apery_lt S i theorem w22_aperyMax_eq (S : NumericalSemigroup) : w22_aperyMax S = S.conductor + S.multiplicity - 1 := by let f := S.conductor - 1 let i : Fin S.multiplicity := ⟨f % S.multiplicity, Nat.mod_lt _ S.multiplicity_pos⟩ have hr : w22_apery S i % S.multiplicity = f % S.multiplicity := w22_apery_mod S i have hgt : f < w22_apery S i := by by_contra h have hmem := w22_mem_of_apery_le S i rfl (by omega) exact w22_frobenius_not_mem S hmem have hf := Nat.div_add_mod f S.multiplicity have hw := Nat.div_add_mod (w22_apery S i) S.multiplicity have hq : f / S.multiplicity < w22_apery S i / S.multiplicity := by have hm := S.multiplicity_pos nlinarith have hstep : f + S.multiplicity ≤ w22_apery S i := by have hm := S.multiplicity_pos nlinarith have hmax : w22_apery S i ≤ w22_aperyMax S := Finset.le_sup (f := w22_apery S) (Finset.mem_univ i) have hlt := w22_aperyMax_lt S have hc := S.conductor_pos dsimp [f] at hstep omega theorem w22_conductor_from_apery (S : NumericalSemigroup) : S.conductor = w22_aperyMax S - S.multiplicity + 1 := by rw [w22_aperyMax_eq] have hc := S.conductor_pos omega /-- A8: residue-wise arithmetic progressions, with a finite counting domain. -/ theorem w22_apery_decomposition (S : NumericalSemigroup) (i : Fin S.multiplicity) {x : ℕ} (hx : x ∈ S.carrier) (hi : x % S.multiplicity = i.val) : ∃ k : ℕ, k ≤ x ∧ x = w22_apery S i + k * S.multiplicity := by have hle := w22_apery_min S i hx hi have hdiv := Nat.div_le_div_right (c := S.multiplicity) hle have hw := Nat.div_add_mod (w22_apery S i) S.multiplicity have hxx := Nat.div_add_mod x S.multiplicity have hr := w22_apery_mod S i let k := x / S.multiplicity - w22_apery S i / S.multiplicity have hd : k + w22_apery S i / S.multiplicity = x / S.multiplicity := by dsimp [k] omega have he : x = w22_apery S i + k * S.multiplicity := by nlinarith refine ⟨k, ?_, he⟩ have hm := S.multiplicity_pos nlinarith noncomputable def w22_aperyLeftCount (S : NumericalSemigroup) (i : Fin S.multiplicity) : ℕ := ((Finset.range S.conductor).filter (fun k => w22_apery S i + k * S.multiplicity < S.conductor)).card theorem w22_aperyLeftCount_eq_fiber (S : NumericalSemigroup) (i : Fin S.multiplicity) : w22_aperyLeftCount S i = (S.leftElements.filter (fun x => x % S.multiplicity = i.val)).card := by classical unfold w22_aperyLeftCount apply Finset.card_bij (fun k _ => w22_apery S i + k * S.multiplicity) · intro k hk have hlt := (Finset.mem_filter.mp hk).2 refine Finset.mem_filter.mpr ⟨(S.mem_leftElements _).mpr ⟨hlt, ?_⟩, ?_⟩ · apply S.carrier.add_mem (w22_apery_mem S i) simpa using S.carrier.nsmul_mem S.multiplicity_mem k · simp [Nat.add_mod, w22_apery_mod, Nat.mod_eq_of_lt i.isLt] · intro a ha b hb hab have hm := S.multiplicity_pos nlinarith · intro x hx obtain ⟨hxL, hi⟩ := Finset.mem_filter.mp hx obtain ⟨hlt, hxS⟩ := (S.mem_leftElements x).mp hxL obtain ⟨k, hk, he⟩ := w22_apery_decomposition S i hxS hi refine ⟨k, Finset.mem_filter.mpr ⟨Finset.mem_range.mpr (by omega), ?_⟩, he.symm⟩ simpa only [← he] using hlt theorem w22_leftCount_apery_sum (S : NumericalSemigroup) : S.leftCount = ∑ i : Fin S.multiplicity, w22_aperyLeftCount S i := by classical let residue := fun x : ℕ => (⟨x % S.multiplicity, Nat.mod_lt x S.multiplicity_pos⟩ : Fin S.multiplicity) have hmap : Set.MapsTo residue (S.leftElements : Set ℕ) (↑(Finset.univ : Finset (Fin S.multiplicity))) := by intro x hx exact Finset.mem_univ _ have hcard := Finset.card_eq_sum_card_fiberwise hmap unfold NumericalSemigroup.leftCount rw [hcard] apply Finset.sum_congr rfl intro i hi rw [w22_aperyLeftCount_eq_fiber] congr 1 noncomputable def w23_q (S : NumericalSemigroup) : ℕ := (S.conductor - 1) / S.multiplicity + 1 noncomputable def w23_rho (S : NumericalSemigroup) : ℕ := w23_q S * S.multiplicity - S.conductor lemma w23_q_bounds (S : NumericalSemigroup) : (w23_q S - 1) * S.multiplicity < S.conductor ∧ S.conductor ≤ w23_q S * S.multiplicity := by have hc := S.conductor_pos have hm := S.multiplicity_pos have hmod := Nat.mod_lt (S.conductor - 1) hm have hdiv := Nat.mod_add_div (S.conductor - 1) S.multiplicity have hc1 : S.conductor - 1 + 1 = S.conductor := by omega unfold w23_q simp only [Nat.add_sub_cancel] constructor · exact lt_of_le_of_lt (Nat.div_mul_le_self _ _) (by omega) · nlinarith lemma w23_q_pos (S : NumericalSemigroup) : 0 < w23_q S := by exact Nat.succ_pos _ lemma w23_q_mul_sub (S : NumericalSemigroup) : w23_q S * S.multiplicity = S.conductor + w23_rho S := by have h := (w23_q_bounds S).2 unfold w23_rho omega lemma w23_rho_lt (S : NumericalSemigroup) : w23_rho S < S.multiplicity := by have h := (w23_q_bounds S).1 have hq := w23_q_pos S have he := w23_q_mul_sub S have hmul : (w23_q S - 1) * S.multiplicity + S.multiplicity = w23_q S * S.multiplicity := by have ht : w23_q S - 1 + 1 = w23_q S := by omega nlinarith omega lemma w23_q_le_four (S : NumericalSemigroup) (h : S.conductor ≤ 4 * S.multiplicity) : w23_q S ≤ 4 := by have hb := (w23_q_bounds S).1 have hm := S.multiplicity_pos by_contra hn have ht : 4 * S.multiplicity ≤ (w23_q S - 1) * S.multiplicity := Nat.mul_le_mul_right _ (by omega) omega lemma w23_q_eq_three (S : NumericalSemigroup) (h1 : 2 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 3 * S.multiplicity) : w23_q S = 3 := by have hb := w23_q_bounds S have hq := w23_q_pos S have hm := S.multiplicity_pos have hl : 3 ≤ w23_q S := by by_contra hn have ht := Nat.mul_le_mul_right S.multiplicity (show w23_q S ≤ 2 by omega) omega have hu : w23_q S ≤ 3 := by by_contra hn have ht := Nat.mul_le_mul_right S.multiplicity (show 3 ≤ w23_q S - 1 by omega) omega omega lemma w23_q_eq_four (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) : w23_q S = 4 := by have hb := (w23_q_bounds S).2 have hl : 4 ≤ w23_q S := by by_contra hn have ht := Nat.mul_le_mul_right S.multiplicity (show w23_q S ≤ 3 by omega) omega exact Nat.le_antisymm (w23_q_le_four S h2) hl lemma w23_q_eq_ceil (S : NumericalSemigroup) : w23_q S = (S.conductor + S.multiplicity - 1) / S.multiplicity := by have hc := S.conductor_pos have he : S.conductor + S.multiplicity - 1 = S.conductor - 1 + S.multiplicity := by omega rw [he, Nat.add_div_right _ S.multiplicity_pos] rfl noncomputable def w23_apery (S : NumericalSemigroup) : Finset ℕ := by classical exact (Finset.range (S.conductor + S.multiplicity)).filter (fun x => x ∈ S.carrier ∧ ¬ ∃ y, y ∈ S.carrier ∧ y + S.multiplicity = x) lemma w23_mem_apery (S : NumericalSemigroup) (x : ℕ) : x ∈ w23_apery S ↔ x < S.conductor + S.multiplicity ∧ x ∈ S.carrier ∧ ¬ ∃ y, y ∈ S.carrier ∧ y + S.multiplicity = x := by classical simp [w23_apery] lemma w23_zero_mem_apery (S : NumericalSemigroup) : 0 ∈ w23_apery S := by have hc := S.conductor_pos have hm := S.multiplicity_pos refine (w23_mem_apery S 0).2 ⟨by omega, S.carrier.zero_mem, ?_⟩ rintro ⟨y, hy, he⟩ omega lemma w23_apery_lt (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ w23_apery S) : x < S.conductor + S.multiplicity := (w23_mem_apery S x).1 hx |>.1 lemma w23_apery_of_no_predecessor (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ S.carrier) (hn : ¬ ∃ y, y ∈ S.carrier ∧ y + S.multiplicity = x) : x ∈ w23_apery S := by refine (w23_mem_apery S x).2 ⟨?_, hx, hn⟩ by_contra hlt apply hn exact ⟨x - S.multiplicity, S.conductor_spec _ (by omega), by omega⟩ lemma w23_mul_mem (S : NumericalSemigroup) (k : ℕ) : k * S.multiplicity ∈ S.carrier := by induction k with | zero => simp | succ k ih => simpa [Nat.succ_mul] using S.carrier.add_mem ih S.multiplicity_mem lemma w23_same_residue (m a b : ℕ) (_hm : 0 < m) (hab : a ≤ b) (hr : a % m = b % m) : ∃ k, b = a + k * m := by have ha := Nat.mod_add_div a m have hb := Nat.mod_add_div b m have hq : a / m ≤ b / m := Nat.div_le_div_right hab refine ⟨b / m - a / m, ?_⟩ have hs : b / m - a / m + a / m = b / m := by omega have ht := congrArg (fun k => k * m) hs nlinarith lemma w23_apery_residue_inj (S : NumericalSemigroup) {x y : ℕ} (hx : x ∈ w23_apery S) (hy : y ∈ w23_apery S) (hr : x % S.multiplicity = y % S.multiplicity) : x = y := by have hstep : ∀ a b, a ∈ w23_apery S → b ∈ w23_apery S → a % S.multiplicity = b % S.multiplicity → a ≤ b → a = b := by intro a b ha hb hr hab obtain ⟨k, hk⟩ := w23_same_residue S.multiplicity a b S.multiplicity_pos hab hr by_cases h0 : k = 0 · simpa [h0] using hk.symm · exfalso apply ((w23_mem_apery S b).1 hb).2.2 refine ⟨a + (k - 1) * S.multiplicity, S.carrier.add_mem ((w23_mem_apery S a).1 ha).2.1 (w23_mul_mem S _), ?_⟩ have ht : (k - 1) * S.multiplicity + S.multiplicity = k * S.multiplicity := by have hs : k - 1 + 1 = k := by omega nlinarith omega rcases le_total x y with h | h · exact hstep x y hx hy hr h · exact (hstep y x hy hx hr.symm h).symm lemma w23_exists_residue (S : NumericalSemigroup) (r : ℕ) : ∃ x, x ∈ S.carrier ∧ x % S.multiplicity = r % S.multiplicity := by refine ⟨S.conductor * S.multiplicity + r, S.conductor_spec _ ?_, ?_⟩ · have hm := S.multiplicity_pos nlinarith · simp [Nat.add_mod] noncomputable def w23_rep (S : NumericalSemigroup) (r : ℕ) : ℕ := by classical exact Nat.find (w23_exists_residue S r) lemma w23_rep_spec (S : NumericalSemigroup) (r : ℕ) : w23_rep S r ∈ S.carrier ∧ w23_rep S r % S.multiplicity = r % S.multiplicity := by classical exact Nat.find_spec (w23_exists_residue S r) lemma w23_rep_le (S : NumericalSemigroup) {r x : ℕ} (hx : x ∈ S.carrier) (hr : x % S.multiplicity = r % S.multiplicity) : w23_rep S r ≤ x := by classical exact Nat.find_min' (w23_exists_residue S r) ⟨hx, hr⟩ lemma w23_rep_mem_apery (S : NumericalSemigroup) (r : ℕ) : w23_rep S r ∈ w23_apery S := by apply w23_apery_of_no_predecessor S (w23_rep_spec S r).1 rintro ⟨y, hy, he⟩ have hr : y % S.multiplicity = r % S.multiplicity := by have hh := (w23_rep_spec S r).2 rw [← he] at hh simpa [Nat.add_mod] using hh have hl := w23_rep_le S hy hr have hm := S.multiplicity_pos omega lemma w23_apery_card (S : NumericalSemigroup) : (w23_apery S).card = S.multiplicity := by classical rw [← Finset.card_range S.multiplicity] apply Finset.card_bij (fun x _ => x % S.multiplicity) · intro x hx exact Finset.mem_range.2 (Nat.mod_lt _ S.multiplicity_pos) · intro x hx y hy hr exact w23_apery_residue_inj S hx hy hr · intro r hr refine ⟨w23_rep S r, w23_rep_mem_apery S r, ?_⟩ exact (w23_rep_spec S r).2.trans (Nat.mod_eq_of_lt (Finset.mem_range.1 hr)) lemma w23_primitive_mem_apery (S : NumericalSemigroup) {x : ℕ} (hx : S.IsPrimitive x) (hne : x ≠ S.multiplicity) : x ∈ w23_apery S := by apply w23_apery_of_no_predecessor S hx.1 rintro ⟨y, hy, he⟩ rcases hx.2.2 y S.multiplicity hy S.multiplicity_mem he.symm with h | h · apply hne omega · have hm := S.multiplicity_pos omega lemma w23_apery_closed (S : NumericalSemigroup) {x y z : ℕ} (hx : x ∈ w23_apery S) (hy : y ∈ S.carrier) (hz : z ∈ S.carrier) (he : x = y + z) : y ∈ w23_apery S := by apply w23_apery_of_no_predecessor S hy rintro ⟨a, ha, hea⟩ apply ((w23_mem_apery S x).1 hx).2.2 exact ⟨a + z, S.carrier.add_mem ha hz, by omega⟩ noncomputable def w23_level (S : NumericalSemigroup) (x : ℕ) : ℕ := (x + w23_rho S) / S.multiplicity noncomputable def w23_X (S : NumericalSemigroup) (i : ℕ) : Finset ℕ := by classical exact (w23_apery S).filter (fun x => w23_level S x = i) lemma w23_mem_X (S : NumericalSemigroup) (i x : ℕ) : x ∈ w23_X S i ↔ x ∈ w23_apery S ∧ w23_level S x = i := by classical simp [w23_X] lemma w23_level_zero (S : NumericalSemigroup) : w23_level S 0 = 0 := by unfold w23_level simp [Nat.div_eq_of_lt (w23_rho_lt S)] lemma w23_level_add_mul (S : NumericalSemigroup) (x : ℕ) : w23_level S (x + S.multiplicity) = w23_level S x + 1 := by unfold w23_level rw [show x + S.multiplicity + w23_rho S = x + w23_rho S + S.multiplicity by omega] exact Nat.add_div_right _ S.multiplicity_pos lemma w23_level_add_kmul (S : NumericalSemigroup) (x k : ℕ) : w23_level S (x + k * S.multiplicity) = w23_level S x + k := by induction k with | zero => simp | succ k ih => rw [Nat.succ_mul, ← Nat.add_assoc, w23_level_add_mul, ih] omega lemma w23_lt_conductor_iff (S : NumericalSemigroup) (x : ℕ) : x < S.conductor ↔ w23_level S x < w23_q S := by unfold w23_level rw [Nat.div_lt_iff_lt_mul S.multiplicity_pos, w23_q_mul_sub] omega lemma w23_level_apery_le (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ w23_apery S) : w23_level S x ≤ w23_q S := by have hl := w23_apery_lt S hx have he := w23_q_mul_sub S have hm := S.multiplicity_pos have ht : x + w23_rho S < (w23_q S + 1) * S.multiplicity := by nlinarith have hd : w23_level S x < w23_q S + 1 := (Nat.div_lt_iff_lt_mul hm).2 ht omega lemma w23_X_zero (S : NumericalSemigroup) : w23_X S 0 = {0} := by classical ext x rw [w23_mem_X, Finset.mem_singleton] constructor · rintro ⟨hx, hl⟩ have hd := Nat.div_eq_zero_iff.1 hl have hmpos := S.multiplicity_pos have hh : x + w23_rho S < S.multiplicity := by omega have hs := ((w23_mem_apery S x).1 hx).2.1 by_contra hn have hm := S.multiplicity_le (by omega : 0 < x) hs omega · intro h subst x exact ⟨w23_zero_mem_apery S, w23_level_zero S⟩ noncomputable def w23_alpha (S : NumericalSemigroup) (i : ℕ) : ℕ := (w23_X S i).card lemma w23_rep_eq_apery (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ w23_apery S) : w23_rep S x = x := w23_apery_residue_inj S (w23_rep_mem_apery S x) hx (w23_rep_spec S x).2 lemma w23_rep_add_kmul (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ w23_apery S) (k : ℕ) : w23_rep S (x + k * S.multiplicity) = x := by apply w23_apery_residue_inj S (w23_rep_mem_apery S _) hx simpa [Nat.add_mod] using (w23_rep_spec S (x + k * S.multiplicity)).2 lemma w23_apery_decomposition (S : NumericalSemigroup) {y : ℕ} (hy : y ∈ S.carrier) : ∃ k, y = w23_rep S y + k * S.multiplicity := by exact w23_same_residue S.multiplicity (w23_rep S y) y S.multiplicity_pos (w23_rep_le S hy rfl) (w23_rep_spec S y).2 lemma w23_left_fiber_card (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ w23_apery S) : (S.leftElements.filter (fun y => w23_rep S y = x)).card = w23_q S - w23_level S x := by classical rw [← Finset.card_range (w23_q S - w23_level S x)] symm apply Finset.card_bij (fun k _ => x + k * S.multiplicity) · intro k hk have hklt := Finset.mem_range.1 hk have hl : w23_level S (x + k * S.multiplicity) < w23_q S := by rw [w23_level_add_kmul] omega apply Finset.mem_filter.2 refine ⟨(S.mem_leftElements _).2 ⟨(w23_lt_conductor_iff S _).2 hl, ?_⟩, w23_rep_add_kmul S hx k⟩ exact S.carrier.add_mem ((w23_mem_apery S x).1 hx).2.1 (w23_mul_mem S k) · intro k hk l hl he have hm := S.multiplicity_pos nlinarith · intro y hy obtain ⟨hyL, hyr⟩ := Finset.mem_filter.1 hy obtain ⟨hylt, hyS⟩ := (S.mem_leftElements _).1 hyL obtain ⟨k, he⟩ := w23_apery_decomposition S hyS rw [hyr] at he refine ⟨k, Finset.mem_range.2 ?_, he.symm⟩ have hl := (w23_lt_conductor_iff S y).1 hylt rw [he, w23_level_add_kmul] at hl omega lemma w23_leftCount_apery_sum (S : NumericalSemigroup) : S.leftCount = ∑ x ∈ w23_apery S, (w23_q S - w23_level S x) := by classical have hmap : Set.MapsTo (w23_rep S) (S.leftElements : Set ℕ) (w23_apery S : Set ℕ) := by intro y hy exact w23_rep_mem_apery S y unfold NumericalSemigroup.leftCount rw [Finset.card_eq_sum_card_fiberwise hmap] apply Finset.sum_congr rfl intro x hx exact w23_left_fiber_card S hx lemma w23_leftCount_eq (S : NumericalSemigroup) : S.leftCount = ∑ i ∈ Finset.range (w23_q S), (w23_q S - i) * w23_alpha S i := by classical rw [w23_leftCount_apery_sum] have hmap : ∀ x ∈ w23_apery S, w23_level S x ∈ Finset.range (w23_q S + 1) := by intro x hx exact Finset.mem_range.2 (by have := w23_level_apery_le S hx; omega) have hsum := Finset.sum_fiberwise_of_maps_to' hmap (fun i => w23_q S - i) have he : (∑ i ∈ Finset.range (w23_q S + 1), (w23_q S - i) * w23_alpha S i) = ∑ x ∈ w23_apery S, (w23_q S - w23_level S x) := by simpa [w23_alpha, w23_X, Nat.mul_comm] using hsum rw [← he, Finset.sum_range_succ] simp noncomputable def w23_D (S : NumericalSemigroup) : Finset ℕ := by classical exact (Finset.Ico S.conductor (S.conductor + S.multiplicity)).filter (fun y => ¬ S.IsPrimitive y) noncomputable def w23_pq (S : NumericalSemigroup) : ℕ := by classical exact (S.primitiveElements.filter (fun x => S.conductor ≤ x)).card noncomputable def w23_n (S : NumericalSemigroup) : ℕ := by classical exact (S.primitiveElements.filter (fun x => x < S.conductor)).card lemma w23_e_eq (S : NumericalSemigroup) : S.embeddingDimension = w23_n S + w23_pq S := by classical simpa [w23_n, w23_pq, NumericalSemigroup.embeddingDimension] using (Finset.card_filter_add_card_filter_not (s := S.primitiveElements) (fun x => x < S.conductor)).symm lemma w23_right_primitives (S : NumericalSemigroup) : S.primitiveElements.filter (fun x => S.conductor ≤ x) = (@Finset.filter ℕ S.IsPrimitive (Classical.decPred _) (Finset.Ico S.conductor (S.conductor + S.multiplicity))) := by classical ext x simp only [Finset.mem_filter, S.mem_primitiveElements, Finset.mem_Ico] constructor · rintro ⟨hp, hc⟩ exact ⟨⟨hc, S.primitive_lt hp⟩, hp⟩ · rintro ⟨⟨hc, _⟩, hp⟩ exact ⟨hp, hc⟩ lemma w23_m_eq (S : NumericalSemigroup) : S.multiplicity = w23_pq S + (w23_D S).card := by classical unfold w23_pq w23_D rw [w23_right_primitives] have h := Finset.card_filter_add_card_filter_not (s := Finset.Ico S.conductor (S.conductor + S.multiplicity)) S.IsPrimitive simpa using h.symm lemma w23_q_le_leftCount (S : NumericalSemigroup) : w23_q S ≤ S.leftCount := by classical have hsub : (Finset.range (w23_q S)).image (fun k => k * S.multiplicity) ⊆ S.leftElements := by intro x hx obtain ⟨k, hk, rfl⟩ := Finset.mem_image.1 hx refine (S.mem_leftElements _).2 ⟨?_, w23_mul_mem S k⟩ apply (w23_lt_conductor_iff S _).2 have he : k * S.multiplicity = 0 + k * S.multiplicity := by omega rw [he, w23_level_add_kmul, w23_level_zero, Nat.zero_add] exact Finset.mem_range.1 hk have hinj : Function.Injective (fun k : ℕ => k * S.multiplicity) := by intro a b he have hm := S.multiplicity_pos nlinarith have hcard := Finset.card_le_card hsub rw [Finset.card_image_of_injective _ hinj, Finset.card_range] at hcard exact hcard theorem w23_wilf_of_W0 (S : NumericalSemigroup) (h : w23_q S * (w23_D S).card ≤ w23_n S * S.leftCount + w23_rho S) : S.SatisfiesWilf := by have he := w23_e_eq S have hm := w23_m_eq S have hq := w23_q_mul_sub S have hl := w23_q_le_leftCount S have hp := Nat.mul_le_mul_left (w23_pq S) hl unfold NumericalSemigroup.SatisfiesWilf nlinarith lemma w23_decomposable_eq_add (S : NumericalSemigroup) {y : ℕ} (hy : y ∈ S.carrier) (hn : ¬ S.IsPrimitive y) (hp : 0 < y) (hlt : y < S.conductor + S.multiplicity) : ∃ a b, a ∈ S.leftElements ∧ b ∈ S.leftElements ∧ 0 < a ∧ 0 < b ∧ y = a + b := by classical have hdec : ¬ ∀ a b, a ∈ S.carrier → b ∈ S.carrier → y = a + b → a = 0 ∨ b = 0 := by intro hh exact hn ⟨hy, hp, hh⟩ push Not at hdec obtain ⟨a, b, ha, hb, he, ha0, hb0⟩ := hdec have hap : 0 < a := by omega have hbp : 0 < b := by omega have hma := S.multiplicity_le hap ha have hmb := S.multiplicity_le hbp hb exact ⟨a, b, (S.mem_leftElements a).2 ⟨by omega, ha⟩, (S.mem_leftElements b).2 ⟨by omega, hb⟩, hap, hbp, he⟩ lemma w23_level_eq_iff (S : NumericalSemigroup) (x j : ℕ) : w23_level S x = j ↔ j * S.multiplicity ≤ x + w23_rho S ∧ x + w23_rho S < (j + 1) * S.multiplicity := by unfold w23_level rw [Nat.div_eq_iff S.multiplicity_pos] simp only [Nat.add_mul, Nat.one_mul] have hm := S.multiplicity_pos omega lemma w23_level_add_le (S : NumericalSemigroup) (x y : ℕ) : w23_level S (x + y) ≤ w23_level S x + w23_level S y + 1 := by have hx := (w23_level_eq_iff S x (w23_level S x)).1 rfl have hy := (w23_level_eq_iff S y (w23_level S y)).1 rfl have ht : x + y + w23_rho S < (w23_level S x + w23_level S y + 1 + 1) * S.multiplicity := by nlinarith have hd := (Nat.div_lt_iff_lt_mul S.multiplicity_pos).2 ht change w23_level S (x + y) < _ at hd omega lemma w23_le_level_add (S : NumericalSemigroup) (x y : ℕ) : w23_level S x + w23_level S y ≤ w23_level S (x + y) + 1 := by have hx := (w23_level_eq_iff S x (w23_level S x)).1 rfl have hy := (w23_level_eq_iff S y (w23_level S y)).1 rfl have hs := (w23_level_eq_iff S (x + y) (w23_level S (x + y))).1 rfl have hr := w23_rho_lt S by_contra hn have ht := Nat.mul_le_mul_right S.multiplicity (show w23_level S (x + y) + 2 ≤ w23_level S x + w23_level S y by omega) nlinarith lemma w23_level_mono (S : NumericalSemigroup) {x y : ℕ} (h : x ≤ y) : w23_level S x ≤ w23_level S y := by exact Nat.div_le_div_right (Nat.add_le_add_right h (w23_rho S)) lemma w23_level_add_ge_of_mem (S : NumericalSemigroup) (x : ℕ) {y : ℕ} (hy : y ∈ S.carrier) (hp : 0 < y) : w23_level S x + 1 ≤ w23_level S (x + y) := by rw [← w23_level_add_mul] exact w23_level_mono S (Nat.add_le_add_left (S.multiplicity_le hp hy) x) lemma w23_level_multiplicity (S : NumericalSemigroup) : w23_level S S.multiplicity = 1 := by simpa [w23_level_zero] using w23_level_add_mul S 0 lemma w23_level_pos_of_mem (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ S.carrier) (hp : 0 < x) : 1 ≤ w23_level S x := by rw [← w23_level_multiplicity S] exact w23_level_mono S (S.multiplicity_le hp hx) lemma w23_level_one_of_lt (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ S.carrier) (hp : 0 < x) (hlt : x < 2 * S.multiplicity - w23_rho S) : w23_level S x = 1 := by apply (w23_level_eq_iff S x 1).2 have hm := S.multiplicity_le hp hx have hr := w23_rho_lt S simp only [Nat.one_mul] constructor <;> omega lemma w23_level_one_iff_of_mem (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ S.carrier) : w23_level S x = 1 ↔ S.multiplicity ≤ x ∧ x < 2 * S.multiplicity - w23_rho S := by constructor · intro hl have hp : 0 < x := by by_contra hn have he : x = 0 := by omega rw [he, w23_level_zero] at hl omega have hb := (w23_level_eq_iff S x 1).1 hl exact ⟨S.multiplicity_le hp hx, by simp only [Nat.one_mul] at hb; omega⟩ · rintro ⟨hm, hlt⟩ exact w23_level_one_of_lt S hx (by have := S.multiplicity_pos; omega) hlt lemma w23_apery_split (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ w23_apery S) (hn : ¬ S.IsPrimitive x) (hp : 0 < x) : ∃ y z, y ∈ w23_apery S ∧ z ∈ w23_apery S ∧ 0 < y ∧ 0 < z ∧ x = y + z := by obtain ⟨y, z, hy, hz, hyp, hzp, he⟩ := w23_decomposable_eq_add S ((w23_mem_apery S x).1 hx).2.1 hn hp (w23_apery_lt S hx) have hyS := ((S.mem_leftElements y).1 hy).2 have hzS := ((S.mem_leftElements z).1 hz).2 exact ⟨y, z, w23_apery_closed S hx hyS hzS he, w23_apery_closed S hx hzS hyS (by omega), hyp, hzp, he⟩ lemma w23_apery_split_levels (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ w23_apery S) (hn : ¬ S.IsPrimitive x) (hp : 0 < x) : ∃ y z, y ∈ w23_apery S ∧ z ∈ w23_apery S ∧ 0 < y ∧ 0 < z ∧ x = y + z ∧ w23_level S y + w23_level S z ≤ w23_level S x + 1 ∧ w23_level S x ≤ w23_level S y + w23_level S z + 1 ∧ 1 ≤ w23_level S y ∧ 1 ≤ w23_level S z ∧ y < x ∧ z < x := by obtain ⟨y, z, hy, hz, hyp, hzp, he⟩ := w23_apery_split S hx hn hp refine ⟨y, z, hy, hz, hyp, hzp, he, ?_, ?_, ?_, ?_, by omega, by omega⟩ · rw [he] exact w23_le_level_add S y z · rw [he] exact w23_level_add_le S y z · exact w23_level_pos_of_mem S ((w23_mem_apery S y).1 hy).2.1 hyp · exact w23_level_pos_of_mem S ((w23_mem_apery S z).1 hz).2.1 hzp lemma w23_primitive_of_lt_two_mul (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ S.carrier) (hp : 0 < x) (hlt : x < 2 * S.multiplicity) : S.IsPrimitive x := by refine ⟨hx, hp, ?_⟩ intro a b ha hb he by_cases ha0 : a = 0 · exact Or.inl ha0 by_cases hb0 : b = 0 · exact Or.inr hb0 have hma := S.multiplicity_le (by omega : 0 < a) ha have hmb := S.multiplicity_le (by omega : 0 < b) hb omega lemma w23_multiplicity_not_mem_apery (S : NumericalSemigroup) : S.multiplicity ∉ w23_apery S := by intro hm exact ((w23_mem_apery S S.multiplicity).1 hm).2.2 ⟨0, S.carrier.zero_mem, by omega⟩ lemma w23_primitive_level_pos (S : NumericalSemigroup) {x : ℕ} (hx : S.IsPrimitive x) : 1 ≤ w23_level S x := w23_level_pos_of_mem S hx.1 hx.2.1 lemma w23_X_one (S : NumericalSemigroup) : w23_X S 1 = (S.primitiveElements.filter (fun x => w23_level S x = 1)).erase S.multiplicity := by classical ext x rw [w23_mem_X, Finset.mem_erase, Finset.mem_filter, S.mem_primitiveElements] constructor · rintro ⟨hx, hl⟩ have hxS := ((w23_mem_apery S x).1 hx).2.1 have hb := (w23_level_one_iff_of_mem S hxS).1 hl refine ⟨?_, w23_primitive_of_lt_two_mul S hxS ?_ ?_, hl⟩ · intro he subst x exact w23_multiplicity_not_mem_apery S hx · have hm := S.multiplicity_pos omega · omega · rintro ⟨hne, hp, hl⟩ exact ⟨w23_primitive_mem_apery S hp hne, hl⟩ lemma w23_alpha_one (S : NumericalSemigroup) : w23_alpha S 1 + 1 = (S.primitiveElements.filter (fun x => w23_level S x = 1)).card := by classical unfold w23_alpha rw [w23_X_one] apply Finset.card_erase_add_one exact Finset.mem_filter.2 ⟨(S.mem_primitiveElements _).2 S.multiplicity_isPrimitive, w23_level_multiplicity S⟩ lemma w23_n_eq_sum (S : NumericalSemigroup) : w23_n S = ∑ i ∈ Finset.range (w23_q S), (S.primitiveElements.filter (fun x => w23_level S x = i)).card := by classical rw [Finset.sum_card_fiberwise_eq_card_filter] unfold w23_n congr 1 ext x simp only [Finset.mem_filter, Finset.mem_range, ← w23_lt_conductor_iff] lemma w23_level_eq_q_iff (S : NumericalSemigroup) (x : ℕ) : w23_level S x = w23_q S ↔ S.conductor ≤ x ∧ x < S.conductor + S.multiplicity := by rw [w23_level_eq_iff, Nat.add_mul, Nat.one_mul, w23_q_mul_sub] omega lemma w23_apery_card_levels (S : NumericalSemigroup) : S.multiplicity = (∑ i ∈ Finset.range (w23_q S), w23_alpha S i) + w23_alpha S (w23_q S) := by classical have hmap : Set.MapsTo (w23_level S) (w23_apery S : Set ℕ) (Finset.range (w23_q S + 1) : Set ℕ) := by intro x hx exact Finset.mem_range.2 (by have := w23_level_apery_le S hx; omega) have hc := Finset.card_eq_sum_card_fiberwise hmap change (w23_apery S).card = ∑ i ∈ Finset.range (w23_q S + 1), w23_alpha S i at hc rw [w23_apery_card, Finset.sum_range_succ] at hc exact hc lemma w23_pq_eq_X_q_primitives (S : NumericalSemigroup) (hmc : S.multiplicity < S.conductor) : w23_pq S = (@Finset.filter ℕ S.IsPrimitive (Classical.decPred _) (w23_X S (w23_q S))).card := by classical unfold w23_pq congr 1 ext x simp only [Finset.mem_filter, S.mem_primitiveElements, w23_mem_X] constructor · rintro ⟨hp, hc⟩ refine ⟨⟨w23_primitive_mem_apery S hp (by omega), ?_⟩, hp⟩ exact (w23_level_eq_q_iff S x).2 ⟨hc, S.primitive_lt hp⟩ · rintro ⟨⟨_, hl⟩, hp⟩ exact ⟨hp, ((w23_level_eq_q_iff S x).1 hl).1⟩ lemma w23_D_card_eq (S : NumericalSemigroup) (hmc : S.multiplicity < S.conductor) : (w23_D S).card = (∑ i ∈ Finset.range (w23_q S), w23_alpha S i) + (@Finset.filter ℕ (fun x => ¬ S.IsPrimitive x) (Classical.decPred _) (w23_X S (w23_q S))).card := by classical have hm := w23_m_eq S have ha := w23_apery_card_levels S have hp := w23_pq_eq_X_q_primitives S hmc have hc := Finset.card_filter_add_card_filter_not (s := w23_X S (w23_q S)) S.IsPrimitive have hneg : (w23_X S (w23_q S)).filter (fun x => ¬ S.IsPrimitive x) = @Finset.filter ℕ (fun x => ¬ S.IsPrimitive x) (Classical.decPred _) (w23_X S (w23_q S)) := by ext x simp rw [hneg] at hc change _ + _ = w23_alpha S (w23_q S) at hc omega lemma w23_multiplicity_le_conductor (S : NumericalSemigroup) : S.multiplicity ≤ S.conductor := S.multiplicity_le S.conductor_pos (S.conductor_spec _ (Nat.le_refl _)) lemma w23_D_card_q_one (S : NumericalSemigroup) (hq : w23_q S = 1) : (w23_D S).card = 0 ∧ (∑ i ∈ Finset.range (w23_q S), w23_alpha S i) + (@Finset.filter ℕ (fun x => ¬ S.IsPrimitive x) (Classical.decPred _) (w23_X S (w23_q S))).card = 1 := by classical have hc : S.conductor = S.multiplicity := by have h := (w23_q_bounds S).2 have hm := w23_multiplicity_le_conductor S rw [hq, Nat.one_mul] at h omega have hD : w23_D S = ∅ := by ext x simp only [w23_D, Finset.mem_filter, Finset.mem_Ico, Finset.notMem_empty, iff_false] rintro ⟨⟨hx, hlt⟩, hn⟩ apply hn apply w23_primitive_of_lt_two_mul S (S.conductor_spec _ hx) · have hm := S.multiplicity_pos omega · omega have hX : @Finset.filter ℕ (fun x => ¬ S.IsPrimitive x) (Classical.decPred _) (w23_X S 1) = ∅ := by ext x simp only [Finset.mem_filter, Finset.notMem_empty, iff_false] rintro ⟨hx, hn⟩ rw [w23_X_one] at hx exact hn ((S.mem_primitiveElements x).1 (Finset.mem_filter.1 (Finset.mem_erase.1 hx).2).1) rw [hD, hq, hX] simp [w23_alpha, w23_X_zero] lemma w23_D_card_formula_counterexample : ∃ S : NumericalSemigroup, S.conductor = 2 ∧ S.multiplicity = 2 ∧ w23_q S = 1 ∧ (w23_D S).card = 0 ∧ (∑ i ∈ Finset.range (w23_q S), w23_alpha S i) + (@Finset.filter ℕ (fun x => ¬ S.IsPrimitive x) (Classical.decPred _) (w23_X S (w23_q S))).card = 1 := by classical let S := Fixtures.ordinary 2 (by omega) have hc : S.conductor = 2 := Fixtures.ordinary_conductor 2 _ have hm : S.multiplicity = 2 := Fixtures.ordinary_multiplicity 2 _ have hq : w23_q S = 1 := by simp [w23_q, hc, hm] exact ⟨S, hc, hm, hq, w23_D_card_q_one S hq⟩ lemma w23_q_eq_one_iff (S : NumericalSemigroup) : w23_q S = 1 ↔ S.conductor = S.multiplicity := by constructor · intro hq have hc := (w23_q_bounds S).2 have hm := w23_multiplicity_le_conductor S rw [hq, Nat.one_mul] at hc omega · intro hc have hm := S.multiplicity_pos unfold w23_q rw [Nat.div_eq_of_lt (show S.conductor - 1 < S.multiplicity by omega)] lemma w23_D_card_eq_general (S : NumericalSemigroup) : (w23_D S).card + (if w23_q S = 1 then 1 else 0) = (∑ i ∈ Finset.range (w23_q S), w23_alpha S i) + (@Finset.filter ℕ (fun x => ¬ S.IsPrimitive x) (Classical.decPred _) (w23_X S (w23_q S))).card := by classical by_cases hq : w23_q S = 1 · have h := w23_D_card_q_one S hq calc (w23_D S).card + (if w23_q S = 1 then 1 else 0) = 1 := by rw [h.1]; simp [hq] _ = _ := h.2.symm · have hmc : S.multiplicity < S.conductor := by have hm := w23_multiplicity_le_conductor S have hne : S.conductor ≠ S.multiplicity := by intro he exact hq ((w23_q_eq_one_iff S).2 he) omega simpa [hq] using w23_D_card_eq S hmc lemma w23_card_add_le (A B : Finset ℕ) : (A + B).card ≤ A.card * B.card := Finset.card_add_le lemma w23_card_two_add_le (A : Finset ℕ) : (A + A).card ≤ (A.card + 1).choose 2 := by classical induction A using Finset.induction_on with | empty => simp | @insert a A ha ih => have hsub : insert a A + insert a A ⊆ (A + A) ∪ (insert a A).image (fun x => a + x) := by intro x hx obtain ⟨y, hy, z, hz, rfl⟩ := Finset.mem_add.1 hx rcases Finset.mem_insert.1 hy with he | hyA · subst y exact Finset.mem_union.2 (Or.inr (Finset.mem_image.2 ⟨z, hz, rfl⟩)) · rcases Finset.mem_insert.1 hz with he | hzA · subst z exact Finset.mem_union.2 (Or.inr (Finset.mem_image.2 ⟨y, hy, by omega⟩)) · exact Finset.mem_union.2 (Or.inl (Finset.add_mem_add hyA hzA)) have hi := Finset.card_image_le (s := insert a A) (f := fun x => a + x) have hc := Finset.card_insert_of_notMem ha have hp := Nat.choose_succ_succ' (A.card + 1) 1 change (A.card + 1 + 1).choose 2 = (A.card + 1).choose 1 + (A.card + 1).choose 2 at hp simp only [Nat.choose_one_right] at hp calc (insert a A + insert a A).card ≤ (A + A).card + ((insert a A).image (fun x => a + x)).card := (Finset.card_le_card hsub).trans (Finset.card_union_le _ _) _ ≤ (A.card + 1).choose 2 + (A.card + 1) := Nat.add_le_add ih (by omega) _ = ((insert a A).card + 1).choose 2 := by rw [hc]; omega lemma w23_card_three_add_le (A : Finset ℕ) : (A + A + A).card ≤ (A.card + 2).choose 3 := by classical induction A using Finset.induction_on with | empty => simp | @insert a A ha ih => have hsub : insert a A + insert a A + insert a A ⊆ (A + A + A) ∪ (insert a A + insert a A).image (fun x => a + x) := by intro t ht obtain ⟨u, hu, z, hz, rfl⟩ := Finset.mem_add.1 ht obtain ⟨x, hx, y, hy, rfl⟩ := Finset.mem_add.1 hu have hxB := hx have hyB := hy rcases Finset.mem_insert.1 hx with rfl | hx · exact Finset.mem_union.2 (Or.inr (Finset.mem_image.2 ⟨y + z, Finset.add_mem_add hyB hz, by omega⟩)) · rcases Finset.mem_insert.1 hy with rfl | hy · exact Finset.mem_union.2 (Or.inr (Finset.mem_image.2 ⟨x + z, Finset.add_mem_add hxB hz, by omega⟩)) · rcases Finset.mem_insert.1 hz with rfl | hz · exact Finset.mem_union.2 (Or.inr (Finset.mem_image.2 ⟨x + y, Finset.add_mem_add hxB hyB, by omega⟩)) · exact Finset.mem_union.2 (Or.inl (Finset.add_mem_add (Finset.add_mem_add hx hy) hz)) have hi := Finset.card_image_le (s := insert a A + insert a A) (f := fun x => a + x) have htwo := w23_card_two_add_le (insert a A) have hc := Finset.card_insert_of_notMem ha have hp := Nat.choose_succ_succ' (A.card + 2) 2 change (A.card + 2 + 1).choose 3 = (A.card + 2).choose 2 + (A.card + 2).choose 3 at hp calc (insert a A + insert a A + insert a A).card ≤ (A + A + A).card + ((insert a A + insert a A).image (fun x => a + x)).card := (Finset.card_le_card hsub).trans (Finset.card_union_le _ _) _ ≤ (A.card + 2).choose 3 + (A.card + 2).choose 2 := Nat.add_le_add ih (by rw [hc] at htwo; exact hi.trans htwo) _ = ((insert a A).card + 2).choose 3 := by rw [hc, show A.card + 1 + 2 = A.card + 2 + 1 by omega] omega lemma w23_card_add_add_le (A B : Finset ℕ) : (A + B).card ≤ (A.card + B.card + 1).choose 2 := by have hsub : A + B ⊆ (A ∪ B) + (A ∪ B) := by intro x hx obtain ⟨a, ha, b, hb, rfl⟩ := Finset.mem_add.1 hx exact Finset.add_mem_add (Finset.mem_union_left B ha) (Finset.mem_union_right A hb) exact (Finset.card_le_card hsub).trans ((w23_card_two_add_le (A ∪ B)).trans (Nat.choose_le_choose 2 (Nat.add_le_add_right (Finset.card_union_le A B) 1))) lemma w23_card_two_add_add_le (A B : Finset ℕ) : (A + A + B).card ≤ (A.card + 1).choose 2 * B.card := by exact (w23_card_add_le (A + A) B).trans (Nat.mul_le_mul_right B.card (w23_card_two_add_le A)) lemma w23_W0_expand (S : NumericalSemigroup) (hmc : S.multiplicity < S.conductor) : (w23_n S : ℤ) * (S.leftCount : ℤ) - (w23_q S : ℤ) * ((w23_D S).card : ℤ) = (w23_n S : ℤ) * ((∑ i ∈ Finset.range (w23_q S), (w23_q S - i) * w23_alpha S i : ℕ) : ℤ) - (w23_q S : ℤ) * (((∑ i ∈ Finset.range (w23_q S), w23_alpha S i) + (@Finset.filter ℕ (fun x => ¬ S.IsPrimitive x) (Classical.decPred _) (w23_X S (w23_q S))).card : ℕ) : ℤ) := by rw [w23_leftCount_eq S, w23_D_card_eq S hmc] lemma w23_W0_expand_general (S : NumericalSemigroup) : (w23_n S : ℤ) * (S.leftCount : ℤ) - (w23_q S : ℤ) * ((w23_D S).card : ℤ) = (w23_n S : ℤ) * ((∑ i ∈ Finset.range (w23_q S), (w23_q S - i) * w23_alpha S i : ℕ) : ℤ) - (w23_q S : ℤ) * (((∑ i ∈ Finset.range (w23_q S), w23_alpha S i) + (@Finset.filter ℕ (fun x => ¬ S.IsPrimitive x) (Classical.decPred _) (w23_X S (w23_q S))).card : ℕ) : ℤ) + (w23_q S : ℤ) * ((if w23_q S = 1 then 1 else 0 : ℕ) : ℤ) := by have hd : ((w23_D S).card : ℤ) + ((if w23_q S = 1 then 1 else 0 : ℕ) : ℤ) = (((∑ i ∈ Finset.range (w23_q S), w23_alpha S i) + (@Finset.filter ℕ (fun x => ¬ S.IsPrimitive x) (Classical.decPred _) (w23_X S (w23_q S))).card : ℕ) : ℤ) := by exact_mod_cast w23_D_card_eq_general S rw [w23_leftCount_eq S] have hm := congrArg (fun z : ℤ => (w23_q S : ℤ) * z) hd nlinarith def W23_M3 : Prop := ∀ (A B C : Finset ℕ) (x y : ℕ), B ⊆ A + A → C ⊆ A + A + A → (∀ c ∈ C, ∀ a ∈ A, ∀ z ∈ A + A, c = a + z → z ∈ B) → y < x → B.card = x.choose 2 + y → C.card ≤ (x + 1).choose 3 + (y + 1).choose 2 lemma w23_choose_two_mul (n : ℕ) : 2 * (n + 1).choose 2 = n * (n + 1) := by have h := Nat.add_one_mul_choose_eq n 1 simpa [Nat.choose_one_right, Nat.mul_comm] using h.symm lemma w23_choose_two_self (n : ℕ) : 2 * n.choose 2 + n = n * n := by cases n with | zero => simp | succ n => have h := w23_choose_two_mul n; nlinarith lemma w23_binomial_rep (b : ℕ) : ∃ x y : ℕ, y < x ∧ b = x.choose 2 + y := by induction b with | zero => exact ⟨1, 0, by omega, by simp⟩ | succ b ih => obtain ⟨x,y,hy,hb⟩ := ih by_cases h : y + 1 < x · exact ⟨x, y + 1, h, by omega⟩ · have he : y + 1 = x := by omega refine ⟨x+1,0, by omega, ?_⟩ have hc := Nat.choose_succ_succ' x 1 norm_num only [Nat.choose_one_right] at hc omega lemma w23_binomial_rep_bounded (b k : ℕ) (hk : 0 < k) (hb : b ≤ k.choose 2) : ∃ x y : ℕ, y < x ∧ x ≤ k ∧ b = x.choose 2 + y := by obtain ⟨x,y,hy,he⟩ := w23_binomial_rep b refine ⟨x,y,hy,?_,he⟩ by_contra hn have hc := Nat.choose_le_choose 2 (show k+1 ≤ x by omega) have hs := Nat.choose_succ_succ' k 1 norm_num only [Nat.choose_one_right] at hs omega lemma w23_q3_arith (k x y : ℕ) (hy : y < x) (hx : x ≤ k) (hb : x.choose 2 + y ≤ k.choose 2) : 3 * ((x+1).choose 3 + (y+1).choose 2) ≤ k.choose 2 + k * (x.choose 2 + y) := by have ht := Nat.add_one_mul_choose_eq x 2 by_cases he : x = k · subst x have hy0 : y = 0 := by omega subst y simp only [Nat.choose_eq_zero_of_lt (show 1 < 2 by omega), Nat.add_zero] nlinarith · have hxy : y+2 ≤ k := by omega have hc := Nat.choose_le_choose 2 hxy have hs := Nat.choose_succ_succ' (y+1) 1 norm_num only [Nat.choose_one_right] at hs have hm := Nat.mul_le_mul_right y hxy have htwo := w23_choose_two_mul y have hfirst := Nat.mul_le_mul_right (x.choose 2) (show x+1 ≤ k by omega) nlinarith lemma w23_q3_base_arith (k b t : ℕ) (hk : 0 < k) (hb : b ≤ k.choose 2) (ht : ∀ x y, y < x → b = x.choose 2 + y → t ≤ (x+1).choose 3 + (y+1).choose 2) : 3 * (k + k.choose 2 + t) ≤ k * (2*k+1+b) := by obtain ⟨x,y,hy,hx,he⟩ := w23_binomial_rep_bounded b k hk hb have h := w23_q3_arith k x y hy hx (by omega) have hc := ht x y hy he have htwo := w23_choose_two_self k rw [he] nlinarith noncomputable def w23_P (S : NumericalSemigroup) (i : ℕ) : Finset ℕ := by classical exact S.primitiveElements.filter (fun x => w23_level S x = i) noncomputable def w23_Z (S : NumericalSemigroup) : Finset ℕ := by classical exact (w23_X S 3).filter (fun x => ¬ S.IsPrimitive x) noncomputable def w23_B (S : NumericalSemigroup) : Finset ℕ := w23_X S 2 ∩ (w23_X S 1 + w23_X S 1) noncomputable def w23_C (S : NumericalSemigroup) : Finset ℕ := w23_Z S ∩ (w23_X S 1 + w23_X S 1 + w23_X S 1) noncomputable def w23_R (S : NumericalSemigroup) : Finset ℕ := by classical exact (w23_P S 2 + w23_P S 2).filter (fun x => w23_level S x = 3) lemma w23_mem_P (S : NumericalSemigroup) (i x : ℕ) : x ∈ w23_P S i ↔ S.IsPrimitive x ∧ w23_level S x = i := by classical simp [w23_P, S.mem_primitiveElements] lemma w23_X_pos (S : NumericalSemigroup) {i x : ℕ} (hi : 0 < i) (hx : x ∈ w23_X S i) : 0 < x := by have hl := (w23_mem_X S i x).1 hx |>.2 by_contra hn have he : x = 0 := by omega rw [he, w23_level_zero] at hl omega lemma w23_X_one_gt (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ w23_X S 1) : S.multiplicity < x := by have ha := (w23_mem_X S 1 x).1 hx |>.1 have hm := S.multiplicity_le (w23_X_pos S (by omega) hx) ((w23_mem_apery S x).1 ha).2.1 have hne : x ≠ S.multiplicity := by intro he subst x exact w23_multiplicity_not_mem_apery S ha omega lemma w23_X_two_decomp (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ w23_X S 2) (hn : ¬ S.IsPrimitive x) : x ∈ w23_X S 1 + w23_X S 1 := by obtain ⟨y,z,hy,hz,hyp,hzp,he⟩ := w23_apery_split S ((w23_mem_X S 2 x).1 hx).1 hn (w23_X_pos S (by omega) hx) have hyS := ((w23_mem_apery S y).1 hy).2.1 have hzS := ((w23_mem_apery S z).1 hz).2.1 have hpY := w23_level_pos_of_mem S hyS hyp have hpZ := w23_level_pos_of_mem S hzS hzp have hY := w23_level_add_ge_of_mem S y hzS hzp have hZ := w23_level_add_ge_of_mem S z hyS hyp have hl := (w23_mem_X S 2 x).1 hx |>.2 rw [← he] at hY rw [Nat.add_comm z y, ← he] at hZ exact Finset.mem_add.2 ⟨y, (w23_mem_X S 1 y).2 ⟨hy,by omega⟩, z, (w23_mem_X S 1 z).2 ⟨hz,by omega⟩, he.symm⟩ lemma w23_X_two_partition (S : NumericalSemigroup) : w23_X S 2 = w23_B S ∪ w23_P S 2 := by classical ext x constructor · intro hx by_cases hp : S.IsPrimitive x · exact Finset.mem_union_right _ ((w23_mem_P S 2 x).2 ⟨hp, ((w23_mem_X S 2 x).1 hx).2⟩) · exact Finset.mem_union_left _ (Finset.mem_inter.2 ⟨hx,w23_X_two_decomp S hx hp⟩) · intro hx rcases Finset.mem_union.1 hx with hb | hp · exact (Finset.mem_inter.1 hb).1 · obtain ⟨hp,hl⟩ := (w23_mem_P S 2 x).1 hp refine (w23_mem_X S 2 x).2 ⟨w23_primitive_mem_apery S hp ?_,hl⟩ intro he rw [he, w23_level_multiplicity] at hl omega lemma w23_X_two_card (S : NumericalSemigroup) : w23_alpha S 2 = (w23_B S).card + (w23_P S 2).card := by classical unfold w23_alpha rw [w23_X_two_partition] apply Finset.card_union_of_disjoint apply Finset.disjoint_left.2 intro x hb hp obtain ⟨y,hy,z,hz,he⟩ := Finset.mem_add.1 (Finset.mem_inter.1 hb).2 have hyp := w23_X_pos S (by omega) hy have hzp := w23_X_pos S (by omega) hz have hyS := ((w23_mem_apery S y).1 ((w23_mem_X S 1 y).1 hy).1).2.1 have hzS := ((w23_mem_apery S z).1 ((w23_mem_X S 1 z).1 hz).1).2.1 have h := ((w23_mem_P S 2 x).1 hp).1.2.2 y z hyS hzS he.symm omega lemma w23_C_shadow (S : NumericalSemigroup) (hq : w23_q S = 3) : ∀ c ∈ w23_C S, ∀ a ∈ w23_X S 1, ∀ z ∈ w23_X S 1 + w23_X S 1, c = a + z → z ∈ w23_B S := by classical intro c hc a ha z hz he have hZ := (Finset.mem_filter.1 (Finset.mem_inter.1 hc).1).1 have hca := (w23_mem_X S 3 c).1 hZ |>.1 have hcl := w23_apery_lt S hca have haS := ((w23_mem_apery S a).1 ((w23_mem_X S 1 a).1 ha).1).2.1 obtain ⟨u,hu,v,hv,huv⟩ := Finset.mem_add.1 hz have huS := ((w23_mem_apery S u).1 ((w23_mem_X S 1 u).1 hu).1).2.1 have hvS := ((w23_mem_apery S v).1 ((w23_mem_X S 1 v).1 hv).1).2.1 have hzS : z ∈ S.carrier := by rw [← huv]; exact S.carrier.add_mem huS hvS have hza := w23_apery_closed S hca hzS haS (by omega) have ha_gt := w23_X_one_gt S ha have hu_gt := w23_X_one_gt S hu have hv_gt := w23_X_one_gt S hv have hl := (w23_lt_conductor_iff S z).1 (show z < S.conductor by omega) rw [hq] at hl have hb := (w23_level_eq_iff S z (w23_level S z)).1 rfl have hlevel : w23_level S z = 2 := by by_contra hn have hh : w23_level S z + 1 ≤ 2 := by omega have hm := Nat.mul_le_mul_right S.multiplicity hh omega exact Finset.mem_inter.2 ⟨(w23_mem_X S 2 z).2 ⟨hza,hlevel⟩,hz⟩ lemma w23_M3_count (hM3 : W23_M3) (S : NumericalSemigroup) (hq : w23_q S = 3) : 3 * ((w23_P S 1).card + ((w23_P S 1).card).choose 2 + (w23_C S).card) ≤ (w23_P S 1).card * (2*(w23_P S 1).card + 1 + (w23_B S).card) := by have hk := w23_alpha_one S change (w23_X S 1).card + 1 = (w23_P S 1).card at hk have hb : (w23_B S).card ≤ ((w23_P S 1).card).choose 2 := by have h := (Finset.card_le_card (Finset.inter_subset_right : w23_B S ⊆ w23_X S 1 + w23_X S 1)).trans (w23_card_two_add_le (w23_X S 1)) simpa only [w23_B, hk] using h apply w23_q3_base_arith _ _ _ (by omega) hb intro x y hy he exact hM3 (w23_X S 1) (w23_B S) (w23_C S) x y Finset.inter_subset_right Finset.inter_subset_right (w23_C_shadow S hq) hy he lemma w23_P_zero (S : NumericalSemigroup) : w23_P S 0 = ∅ := by classical apply Finset.eq_empty_iff_forall_notMem.2 intro x hx obtain ⟨hp,hl⟩ := (w23_mem_P S 0 x).1 hx have h := w23_primitive_level_pos S hp omega lemma w23_q3_counts (S : NumericalSemigroup) (hq : w23_q S = 3) : w23_n S = (w23_P S 1).card + (w23_P S 2).card ∧ S.leftCount = 2*(w23_P S 1).card + 1 + (w23_B S).card + (w23_P S 2).card ∧ (w23_D S).card = (w23_P S 1).card + (w23_B S).card + (w23_P S 2).card + (w23_Z S).card := by classical have hn := w23_n_eq_sum S change w23_n S = ∑ i ∈ Finset.range (w23_q S), (w23_P S i).card at hn rw [hq] at hn norm_num [Finset.sum_range_succ, w23_P_zero] at hn have hl := w23_leftCount_eq S rw [hq] at hl norm_num [Finset.sum_range_succ, w23_alpha, w23_X_zero] at hl have ha := w23_alpha_one S change (w23_X S 1).card + 1 = (w23_P S 1).card at ha have hb := w23_X_two_card S change (w23_X S 2).card = _ at hb have hmc : S.multiplicity < S.conductor := by have h := (w23_q_bounds S).1 rw [hq] at h omega have hd := w23_D_card_eq S hmc rw [hq] at hd have hzeq : (@Finset.filter ℕ (fun x => ¬ S.IsPrimitive x) (Classical.decPred _) (w23_X S 3)) = w23_Z S := by ext x simp [w23_Z] rw [hzeq] at hd norm_num [Finset.sum_range_succ, w23_alpha, w23_X_zero] at hd exact ⟨hn,by omega,by omega⟩ lemma w23_Z_subset (S : NumericalSemigroup) : w23_Z S ⊆ (((w23_X S 1 + w23_X S 1) ∪ w23_C S) ∪ (w23_X S 1 + w23_P S 2)) ∪ w23_R S := by classical intro x hx obtain ⟨hx3,hn⟩ := Finset.mem_filter.1 hx obtain ⟨hxa,hxl⟩ := (w23_mem_X S 3 x).1 hx3 obtain ⟨y,z,hy,hz,hyp,hzp,he⟩ := w23_apery_split S hxa hn (w23_X_pos S (by omega) hx3) have hyS := ((w23_mem_apery S y).1 hy).2.1 have hzS := ((w23_mem_apery S z).1 hz).2.1 have hyl := w23_level_pos_of_mem S hyS hyp have hzl := w23_level_pos_of_mem S hzS hzp have hY := w23_level_add_ge_of_mem S y hzS hzp have hZ := w23_level_add_ge_of_mem S z hyS hyp rw [← he, hxl] at hY rw [Nat.add_comm z y, ← he, hxl] at hZ have hcase : (w23_level S y = 1 ∧ w23_level S z = 1) ∨ (w23_level S y = 1 ∧ w23_level S z = 2) ∨ (w23_level S y = 2 ∧ w23_level S z = 1) ∨ (w23_level S y = 2 ∧ w23_level S z = 2) := by omega have hmix : ∀ u v, u ∈ w23_X S 1 → v ∈ w23_X S 2 → x = u+v → x ∈ (((w23_X S 1 + w23_X S 1) ∪ w23_C S) ∪ (w23_X S 1 + w23_P S 2)) ∪ w23_R S := by intro u v hu hv huv rw [w23_X_two_partition] at hv rcases Finset.mem_union.1 hv with hvB | hvP · have hsum : x ∈ w23_X S 1 + w23_X S 1 + w23_X S 1 := by obtain ⟨a,ha,b,hb,hab⟩ := Finset.mem_add.1 (Finset.mem_inter.1 hvB).2 exact Finset.mem_add.2 ⟨u+a,Finset.add_mem_add hu ha,b,hb,by omega⟩ exact Finset.mem_union_left _ (Finset.mem_union_left _ (Finset.mem_union_right _ (Finset.mem_inter.2 ⟨hx,hsum⟩))) · exact Finset.mem_union_left _ (Finset.mem_union_right _ (Finset.mem_add.2 ⟨u,hu,v,hvP,huv.symm⟩)) rcases hcase with ⟨hy1,hz1⟩ | ⟨hy1,hz2⟩ | ⟨hy2,hz1⟩ | ⟨hy2,hz2⟩ · exact Finset.mem_union_left _ (Finset.mem_union_left _ (Finset.mem_union_left _ (Finset.mem_add.2 ⟨y,(w23_mem_X S 1 y).2 ⟨hy,hy1⟩, z,(w23_mem_X S 1 z).2 ⟨hz,hz1⟩,he.symm⟩))) · exact hmix y z ((w23_mem_X S 1 y).2 ⟨hy,hy1⟩) ((w23_mem_X S 2 z).2 ⟨hz,hz2⟩) he · exact hmix z y ((w23_mem_X S 1 z).2 ⟨hz,hz1⟩) ((w23_mem_X S 2 y).2 ⟨hy,hy2⟩) (by omega) · have hyX := (w23_mem_X S 2 y).2 ⟨hy,hy2⟩ have hzX := (w23_mem_X S 2 z).2 ⟨hz,hz2⟩ have hnotB : ∀ u v, u ∈ w23_B S → w23_level S v = 2 → x = u+v → False := by intro u v hu hv huv obtain ⟨a,ha,b,hb,hab⟩ := Finset.mem_add.1 (Finset.mem_inter.1 hu).2 have ha_gt := w23_X_one_gt S ha have hb_gt := w23_X_one_gt S hb have hvb := (w23_level_eq_iff S v 2).1 hv have hxb := (w23_level_eq_iff S x 3).1 hxl omega rw [w23_X_two_partition] at hyX hzX rcases Finset.mem_union.1 hyX with hyB | hyP · exact (hnotB y z hyB hz2 he).elim rcases Finset.mem_union.1 hzX with hzB | hzP · exact (hnotB z y hzB hy2 (by omega)).elim exact Finset.mem_union_right _ (Finset.mem_filter.2 ⟨Finset.mem_add.2 ⟨y,hyP,z,hzP,he.symm⟩,hxl⟩) lemma w23_B_disjoint_Z (S : NumericalSemigroup) : Disjoint (w23_B S) (w23_Z S) := by classical apply Finset.disjoint_left.2 intro x hx hz have h2 := (w23_mem_X S 2 x).1 (Finset.mem_inter.1 hx).1 |>.2 have h3 := (w23_mem_X S 3 x).1 (Finset.mem_filter.1 hz).1 |>.2 omega lemma w23_Z_card_le (S : NumericalSemigroup) : (w23_Z S).card + (w23_B S).card ≤ ((w23_P S 1).card).choose 2 + (w23_C S).card + (w23_X S 1).card * (w23_P S 2).card + (w23_R S).card := by classical have hsub : w23_Z S ⊆ ((((w23_X S 1 + w23_X S 1) \ w23_B S) ∪ w23_C S) ∪ (w23_X S 1 + w23_P S 2)) ∪ w23_R S := by intro x hx have hh := w23_Z_subset S hx have hn : x ∉ w23_B S := fun hb => (Finset.disjoint_left.1 (w23_B_disjoint_Z S)) hb hx simpa only [Finset.mem_union,Finset.mem_sdiff,hn,not_false_eq_true,and_true] using hh have h := Finset.card_le_card hsub have h1 := Finset.card_union_le ((w23_X S 1 + w23_X S 1) \ w23_B S) (w23_C S) have h2 := Finset.card_union_le (((w23_X S 1 + w23_X S 1) \ w23_B S) ∪ w23_C S) (w23_X S 1 + w23_P S 2) have h3 := Finset.card_union_le ((((w23_X S 1 + w23_X S 1) \ w23_B S) ∪ w23_C S) ∪ (w23_X S 1 + w23_P S 2)) (w23_R S) have hdiff := Finset.card_sdiff_add_card_eq_card (s := w23_B S) (t := w23_X S 1 + w23_X S 1) (Finset.inter_subset_right : w23_B S ⊆ w23_X S 1 + w23_X S 1) have htwo := w23_card_two_add_le (w23_X S 1) have ha := w23_alpha_one S change (w23_X S 1).card + 1 = (w23_P S 1).card at ha rw [ha] at htwo have hmix := w23_card_add_le (w23_X S 1) (w23_P S 2) omega lemma w23_R_card_le (S : NumericalSemigroup) : (w23_R S).card ≤ w23_rho S ∧ (w23_R S).card ≤ ((w23_P S 2).card + 1).choose 2 := by classical have hsub : w23_R S ⊆ Finset.Ico (4*S.multiplicity-2*w23_rho S) (4*S.multiplicity-w23_rho S) := by intro x hx obtain ⟨hs,hl⟩ := Finset.mem_filter.1 hx obtain ⟨y,hy,z,hz,he⟩ := Finset.mem_add.1 hs have hyb := (w23_level_eq_iff S y 2).1 ((w23_mem_P S 2 y).1 hy).2 have hzb := (w23_level_eq_iff S z 2).1 ((w23_mem_P S 2 z).1 hz).2 have hxb := (w23_level_eq_iff S x 3).1 hl have hr := w23_rho_lt S apply Finset.mem_Ico.2 constructor <;> omega have hc := Finset.card_le_card hsub rw [Nat.card_Ico] at hc have hr := w23_rho_lt S constructor · have he : 4*S.multiplicity-w23_rho S - (4*S.multiplicity-2*w23_rho S) = w23_rho S := by omega rwa [he] at hc · exact (Finset.card_le_card (Finset.filter_subset _ _)).trans (w23_card_two_add_le (w23_P S 2)) lemma w23_q3_error_arith (t r rho : ℕ) (hr : r ≤ rho) (ht : r ≤ (t+1).choose 2) : 3*r ≤ t*(t+1)+rho := by have h := w23_choose_two_mul t omega theorem w23_q3_of_M3 (hM3 : W23_M3) (S : NumericalSemigroup) (h1 : 2 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 3 * S.multiplicity) : S.SatisfiesWilf := by have hq := w23_q_eq_three S h1 h2 have hb := w23_M3_count hM3 S hq have hcounts := w23_q3_counts S hq have hZ := w23_Z_card_le S have hR := w23_R_card_le S have herr := w23_q3_error_arith (w23_P S 2).card (w23_R S).card (w23_rho S) hR.1 hR.2 have ha := w23_alpha_one S change (w23_X S 1).card + 1 = (w23_P S 1).card at ha apply w23_wilf_of_W0 rw [hq,hcounts.1,hcounts.2.1,hcounts.2.2] nlinarith [Nat.zero_le ((w23_P S 2).card * (w23_B S).card)] lemma w23_q3_arith_strict (k x y : ℕ) (hy : y < x) (hx : x < k) : 3 * ((x+1).choose 3 + (y+1).choose 2) ≤ k.choose 2 + k * (x.choose 2 + y) := by have h := Nat.choose_le_choose 2 (show x+1 ≤ k by omega) have hs := Nat.choose_succ_succ' x 1 norm_num only [Nat.choose_one_right] at hs exact w23_q3_arith k x y hy (by omega) (by omega) lemma w23_binomial_endpoint_counterexample : (2 : ℕ).choose 2 = 1 ∧ ∀ x y : ℕ, y < x → x ≤ 1 → 1 ≠ x.choose 2 + y := by constructor · norm_num · intro x y hy hx have he : x = 1 := by omega have heY : y = 0 := by omega simp [he,heY] theorem w23_q3_profile_k0_of_M3 (hM3 : W23_M3) (S : NumericalSemigroup) (h1 : 2 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 3 * S.multiplicity) (_hp2 : (S.primitiveElements.filter (fun x => w23_level S x = 2)).card = 0) : S.SatisfiesWilf := w23_q3_of_M3 hM3 S h1 h2 def m3_degree {k : ℕ} (α : Fin k → ℕ) : ℕ := ∑ i, α i def m3_value {k : ℕ} (a α : Fin k → ℕ) : ℕ := ∑ i, α i * a i def m3_code {k : ℕ} (α : Fin k → ℕ) : ℕ := ∑ i, α i * 4 ^ i.val def m3_unitAdd {k : ℕ} (α : Fin k → ℕ) (j : Fin k) : Fin k → ℕ := fun i => α i + if i = j then 1 else 0 def m3_parent {k : ℕ} (α : Fin k → ℕ) (j : Fin k) : Fin k → ℕ := Function.update α j (α j - 1) lemma m3_linear_unitAdd {k : ℕ} (g α : Fin k → ℕ) (j : Fin k) : (∑ i, m3_unitAdd α j i * g i) = (∑ i, α i * g i) + g j := by classical simp only [m3_unitAdd, Nat.add_mul, Finset.sum_add_distrib] simp lemma m3_degree_unitAdd {k : ℕ} (α : Fin k → ℕ) (j : Fin k) : m3_degree (m3_unitAdd α j) = m3_degree α + 1 := by simpa [m3_degree] using m3_linear_unitAdd (fun _ => 1) α j lemma m3_value_unitAdd {k : ℕ} (a α : Fin k → ℕ) (j : Fin k) : m3_value a (m3_unitAdd α j) = m3_value a α + a j := m3_linear_unitAdd a α j lemma m3_code_unitAdd {k : ℕ} (α : Fin k → ℕ) (j : Fin k) : m3_code (m3_unitAdd α j) = m3_code α + 4 ^ j.val := m3_linear_unitAdd (fun i => 4 ^ i.val) α j lemma m3_unitAdd_parent {k : ℕ} (α : Fin k → ℕ) (j : Fin k) (hj : 0 < α j) : m3_unitAdd (m3_parent α j) j = α := by classical funext i by_cases hi : i = j · subst i simp [m3_unitAdd, m3_parent] omega · simp [m3_unitAdd, m3_parent, Function.update, hi] lemma m3_degree_parent {k : ℕ} (α : Fin k → ℕ) (j : Fin k) (hj : 0 < α j) : m3_degree (m3_parent α j) + 1 = m3_degree α := by rw [← m3_degree_unitAdd, m3_unitAdd_parent α j hj] lemma m3_value_parent {k : ℕ} (a α : Fin k → ℕ) (j : Fin k) (hj : 0 < α j) : m3_value a (m3_parent α j) + a j = m3_value a α := by rw [← m3_value_unitAdd, m3_unitAdd_parent α j hj] lemma m3_code_parent {k : ℕ} (α : Fin k → ℕ) (j : Fin k) (hj : 0 < α j) : m3_code (m3_parent α j) + 4 ^ j.val = m3_code α := by rw [← m3_code_unitAdd, m3_unitAdd_parent α j hj] lemma m3_coord_le_degree {k : ℕ} (α : Fin k → ℕ) (i : Fin k) : α i ≤ m3_degree α := by exact Finset.single_le_sum (fun j _ => Nat.zero_le (α j)) (Finset.mem_univ i) lemma m3_code_succ (k : ℕ) (α : Fin (k + 1) → ℕ) : m3_code α = α 0 + 4 * m3_code (fun i : Fin k => α i.succ) := by unfold m3_code rw [Fin.sum_univ_succ] simp only [Fin.val_zero, pow_zero, Nat.mul_one, Fin.val_succ, pow_succ] congr 1 rw [Finset.mul_sum] apply Finset.sum_congr rfl intro i hi ring lemma m3_code_injective (k : ℕ) (α β : Fin k → ℕ) (hα : ∀ i, α i < 4) (hβ : ∀ i, β i < 4) (he : m3_code α = m3_code β) : α = β := by induction k with | zero => exact Subsingleton.elim _ _ | succ k ih => rw [m3_code_succ, m3_code_succ] at he have h0 : α 0 = β 0 := by have := hα 0; have := hβ 0; omega have ht : m3_code (fun i : Fin k => α i.succ) = m3_code (fun i : Fin k => β i.succ) := by omega have hf := ih (fun i => α i.succ) (fun i => β i.succ) (fun i => hα i.succ) (fun i => hβ i.succ) ht funext i refine Fin.cases h0 (fun j => congrFun hf j) i lemma m3_min_exists {k : ℕ} (a : Fin k → ℕ) (d v : ℕ) (h : ∃ α, m3_degree α = d ∧ m3_value a α = v) : ∃ α, m3_degree α = d ∧ m3_value a α = v ∧ ∀ β, m3_degree β = d → m3_value a β = v → m3_code α ≤ m3_code β := by classical have hq : ∃ n, ∃ α, m3_degree α = d ∧ m3_value a α = v ∧ m3_code α = n := by obtain ⟨α,hd,hv⟩ := h exact ⟨m3_code α, α,hd,hv,rfl⟩ obtain ⟨α,hd,hv,hc⟩ := Nat.find_spec hq refine ⟨α,hd,hv,?_⟩ intro β hβd hβv rw [hc] exact Nat.find_min' hq ⟨β,hβd,hβv,rfl⟩ noncomputable def m3_rep {k : ℕ} (a : Fin k → ℕ) (d v : ℕ) : Fin k → ℕ := by classical exact if h : ∃ α, m3_degree α = d ∧ m3_value a α = v then Classical.choose (m3_min_exists a d v h) else fun _ => 0 lemma m3_rep_spec {k : ℕ} (a : Fin k → ℕ) (d v : ℕ) (h : ∃ α, m3_degree α = d ∧ m3_value a α = v) : m3_degree (m3_rep a d v) = d ∧ m3_value a (m3_rep a d v) = v ∧ ∀ β, m3_degree β = d → m3_value a β = v → m3_code (m3_rep a d v) ≤ m3_code β := by classical simp only [m3_rep, dite_eq_left h] exact Classical.choose_spec (m3_min_exists a d v h) lemma m3_rep_parent {k : ℕ} (a : Fin k → ℕ) (v : ℕ) (h : ∃ α, m3_degree α = 3 ∧ m3_value a α = v) (i : Fin k) (hi : 0 < m3_rep a 3 v i) : m3_parent (m3_rep a 3 v) i = m3_rep a 2 (m3_value a (m3_parent (m3_rep a 3 v) i)) := by have hs := m3_rep_spec a 3 v h let p := m3_parent (m3_rep a 3 v) i have hpd : m3_degree p = 2 := by have hd := m3_degree_parent (m3_rep a 3 v) i hi dsimp [p] omega have ht := m3_rep_spec a 2 (m3_value a p) ⟨p,hpd,rfl⟩ have hmin := hs.2.2 (m3_unitAdd (m3_rep a 2 (m3_value a p)) i) (by rw [m3_degree_unitAdd, ht.1]) (by rw [m3_value_unitAdd, ht.2.1, m3_value_parent a (m3_rep a 3 v) i hi, hs.2.1]) rw [m3_code_unitAdd] at hmin have hc := m3_code_parent (m3_rep a 3 v) i hi change p = m3_rep a 2 (m3_value a p) apply m3_code_injective k · intro j have := m3_coord_le_degree p j omega · intro j have := m3_coord_le_degree (m3_rep a 2 (m3_value a p)) j omega · have hp := ht.2.2 p hpd rfl change m3_code p + 4 ^ i.val = m3_code (m3_rep a 3 v) at hc omega noncomputable def m3_enum (A : Finset ℕ) : Fin A.card → ℕ := fun i => ((Finset.equivFin A).symm i).val lemma m3_enum_mem (A : Finset ℕ) (i : Fin A.card) : m3_enum A i ∈ A := ((Finset.equivFin A).symm i).property lemma m3_enum_surjective (A : Finset ℕ) (v : ℕ) (hv : v ∈ A) : ∃ i, m3_enum A i = v := by refine ⟨(Finset.equivFin A) ⟨v,hv⟩,?_⟩ simp [m3_enum] noncomputable def m3_sumset (A : Finset ℕ) : ℕ → Finset ℕ | 0 => {0} | d + 1 => m3_sumset A d + A lemma m3_sumset_one (A : Finset ℕ) : m3_sumset A 1 = A := by ext v simp [m3_sumset, Finset.mem_add] lemma m3_sumset_two (A : Finset ℕ) : m3_sumset A 2 = A + A := by rw [m3_sumset, m3_sumset_one] lemma m3_sumset_three (A : Finset ℕ) : m3_sumset A 3 = A + A + A := by rw [m3_sumset, m3_sumset_two] lemma m3_rep_exists (A : Finset ℕ) (d v : ℕ) (hv : v ∈ m3_sumset A d) : ∃ α, m3_degree α = d ∧ m3_value (m3_enum A) α = v := by induction d generalizing v with | zero => have he : v = 0 := by simpa [m3_sumset] using hv subst v exact ⟨fun _ => 0, by simp [m3_degree], by simp [m3_value]⟩ | succ d ih => obtain ⟨z,hz,a,ha,he⟩ := Finset.mem_add.1 hv obtain ⟨α,hαd,hαv⟩ := ih z hz obtain ⟨i,hi⟩ := m3_enum_surjective A a ha refine ⟨m3_unitAdd α i, ?_, ?_⟩ · rw [m3_degree_unitAdd, hαd] · rw [m3_value_unitAdd, hαv, hi, he] lemma m3_degree_pos_coord {k : ℕ} (α : Fin k → ℕ) (hd : 0 < m3_degree α) : ∃ i, 0 < α i := by by_contra hn have hz : ∀ i, α i = 0 := by intro i; by_contra hi; exact hn ⟨i,by omega⟩ have he : m3_degree α = 0 := by simp [m3_degree,hz] omega lemma m3_value_mem_sumset (A : Finset ℕ) (d : ℕ) (α : Fin A.card → ℕ) (hd : m3_degree α = d) : m3_value (m3_enum A) α ∈ m3_sumset A d := by induction d generalizing α with | zero => have hz : ∀ i, α i = 0 := by intro i have := m3_coord_le_degree α i omega simp [m3_sumset,m3_value,hz] | succ d ih => obtain ⟨i,hi⟩ := m3_degree_pos_coord α (by omega) have hp : m3_degree (m3_parent α i) = d := by have := m3_degree_parent α i hi omega have hv := ih (m3_parent α i) hp have he := m3_value_parent (m3_enum A) α i hi exact Finset.mem_add.2 ⟨m3_value (m3_enum A) (m3_parent α i),hv, m3_enum A i,m3_enum_mem A i,he⟩ noncomputable def m3_shadow {k : ℕ} (F : Finset (Fin k → ℕ)) : Finset (Fin k → ℕ) := by classical exact F.biUnion (fun α => (Finset.univ.filter (fun i => 0 < α i)).image (m3_parent α)) lemma m3_mem_shadow {k : ℕ} (F : Finset (Fin k → ℕ)) (α : Fin k → ℕ) : α ∈ m3_shadow F ↔ ∃ β ∈ F, ∃ i : Fin k, 0 < β i ∧ m3_parent β i = α := by classical simp [m3_shadow, Finset.mem_biUnion] theorem m3_reduce (A B C : Finset ℕ) (hB : B ⊆ A + A) (hC : C ⊆ A + A + A) (hdiv : ∀ c ∈ C, ∀ a ∈ A, ∀ z ∈ A + A, c = a + z → z ∈ B) : ∃ E F : Finset (Fin A.card → ℕ), (∀ α ∈ E, m3_degree α = 2) ∧ (∀ β ∈ F, m3_degree β = 3) ∧ m3_shadow F ⊆ E ∧ E.card = B.card ∧ F.card = C.card := by classical let E := B.image (m3_rep (m3_enum A) 2) let F := C.image (m3_rep (m3_enum A) 3) have hb : ∀ v ∈ B, ∃ α, m3_degree α = 2 ∧ m3_value (m3_enum A) α = v := by intro v hv exact m3_rep_exists A 2 v (by rw [m3_sumset_two]; exact hB hv) have hc : ∀ v ∈ C, ∃ α, m3_degree α = 3 ∧ m3_value (m3_enum A) α = v := by intro v hv exact m3_rep_exists A 3 v (by rw [m3_sumset_three]; exact hC hv) refine ⟨E,F,?_,?_,?_,?_,?_⟩ · intro α hα obtain ⟨v,hv,rfl⟩ := Finset.mem_image.1 hα exact (m3_rep_spec (m3_enum A) 2 v (hb v hv)).1 · intro β hβ obtain ⟨v,hv,rfl⟩ := Finset.mem_image.1 hβ exact (m3_rep_spec (m3_enum A) 3 v (hc v hv)).1 · intro α hα obtain ⟨β,hβ,i,hi,rfl⟩ := (m3_mem_shadow F α).1 hα obtain ⟨v,hv,rfl⟩ := Finset.mem_image.1 hβ have hs := m3_rep_spec (m3_enum A) 3 v (hc v hv) have hd : m3_degree (m3_parent (m3_rep (m3_enum A) 3 v) i) = 2 := by have := m3_degree_parent (m3_rep (m3_enum A) 3 v) i hi omega have hz := m3_value_mem_sumset A 2 _ hd rw [m3_sumset_two] at hz have he := m3_value_parent (m3_enum A) (m3_rep (m3_enum A) 3 v) i hi have hzin := hdiv v hv (m3_enum A i) (m3_enum_mem A i) _ hz (by omega) apply Finset.mem_image.2 refine ⟨_,hzin,?_⟩ exact (m3_rep_parent (m3_enum A) v (hc v hv) i hi).symm · apply Finset.card_image_of_injOn intro v hv w hw he have hs := (m3_rep_spec (m3_enum A) 2 v (hb v hv)).2.1 have ht := (m3_rep_spec (m3_enum A) 2 w (hb w hw)).2.1 rw [he] at hs omega · apply Finset.card_image_of_injOn intro v hv w hw he have hs := (m3_rep_spec (m3_enum A) 3 v (hc v hv)).2.1 have ht := (m3_rep_spec (m3_enum A) 3 w (hc w hw)).2.1 rw [he] at hs omega noncomputable def m3_fibreShadow (S : Finset ℕ) (t : ℕ) : Finset ℕ := (S.filter (fun s => s < t)) ∪ ((S.filter (fun s => 0 < s)).image (fun s => s - 1)) lemma m3_mem_fibreShadow (S : Finset ℕ) (t s : ℕ) : s ∈ m3_fibreShadow S t ↔ (s ∈ S ∧ s < t) ∨ ∃ u ∈ S, 0 < u ∧ u - 1 = s := by classical simp [m3_fibreShadow, and_assoc] lemma m3_fibreShadow_range (t : ℕ) : m3_fibreShadow (Finset.range (t + 1)) t = Finset.range t := by classical ext s rw [m3_mem_fibreShadow] simp only [Finset.mem_range] constructor · rintro (⟨_,hs⟩ | ⟨u,hu,hup,he⟩) · exact hs · omega · intro hs exact Or.inl ⟨by omega,hs⟩ theorem m3_fibre_shadow_card (S : Finset ℕ) (t : ℕ) (hS : S ⊆ Finset.range (t + 1)) : min S.card t ≤ (m3_fibreShadow S t).card := by classical by_cases he : S = Finset.range (t + 1) · rw [he,m3_fibreShadow_range] simp only [Finset.card_range] exact Nat.min_le_right _ _ · have hmissing : ∃ h ∈ Finset.range (t + 1), h ∉ S := by by_contra hn apply he apply Finset.Subset.antisymm hS intro h hh by_contra hs exact hn ⟨h,hh,hs⟩ obtain ⟨h,hh,hnot⟩ := hmissing have hht := Finset.mem_range.1 hh let f : ℕ → ℕ := fun s => if s < h then s else s - 1 have hcard : S.card ≤ (m3_fibreShadow S t).card := by apply Finset.card_le_card_of_injOn f · intro s hs have hst := Finset.mem_range.1 (hS hs) have hne : s ≠ h := by intro he; subst s; exact hnot hs by_cases hsh : s < h · apply (m3_mem_fibreShadow S t (f s)).2 left dsimp [f] rw [ite_eq_left hsh] exact ⟨hs,by omega⟩ · apply (m3_mem_fibreShadow S t (f s)).2 right exact ⟨s,hs,by omega,by simp [f,hsh]⟩ · intro a ha b hb hab have han : a ≠ h := by intro he; subst a; exact hnot ha have hbn : b ≠ h := by intro he; subst b; exact hnot hb dsimp [f] at hab split_ifs at hab <;> omega exact (Nat.min_le_left _ _).trans hcard lemma m3_fibre_shadow_initial (p t : ℕ) (hp : p ≤ t + 1) : m3_fibreShadow (Finset.range p) t = Finset.range (min p t) := by classical ext s rw [m3_mem_fibreShadow] simp only [Finset.mem_range] constructor · rintro (⟨hs,ht⟩ | ⟨u,hu,hup,he⟩) · omega · omega · intro hs exact Or.inl ⟨by omega,by omega⟩ theorem m3_shadow_empty {k : ℕ} (F : Finset (Fin k → ℕ)) (hF : ∀ β ∈ F, m3_degree β = 3) (hs : m3_shadow F = ∅) : F = ∅ := by classical apply Finset.eq_empty_iff_forall_notMem.2 intro β hβ obtain ⟨i,hi⟩ := m3_degree_pos_coord β (by rw [hF β hβ]; omega) have hp := (m3_mem_shadow F (m3_parent β i)).2 ⟨β,hβ,i,hi,rfl⟩ rw [hs] at hp exact Finset.notMem_empty _ hp theorem m3_C_empty_of_B_empty (A B C : Finset ℕ) (hC : C ⊆ A + A + A) (hdiv : ∀ c ∈ C, ∀ a ∈ A, ∀ z ∈ A + A, c = a + z → z ∈ B) (hB : B = ∅) : C = ∅ := by classical apply Finset.eq_empty_iff_forall_notMem.2 intro c hc obtain ⟨z,hz,a,ha,he⟩ := Finset.mem_add.1 (hC hc) have hb := hdiv c hc a ha z hz (by omega) rw [hB] at hb exact Finset.notMem_empty _ hb lemma m3_pascal_assemble (x y : ℕ) : x.choose 2 + y + x.choose 3 + y.choose 2 = (x + 1).choose 3 + (y + 1).choose 2 := by have hx := Nat.choose_succ_succ' x 2 have hy := Nat.choose_succ_succ' y 1 change (x + 1).choose 3 = x.choose 2 + x.choose 3 at hx change (y + 1).choose 2 = y.choose 1 + y.choose 2 at hy simp only [Nat.choose_one_right] at hy omega lemma w23_M3_of_multicomplex (hMC : ∀ (k : ℕ) (E F : Finset (Fin k → ℕ)) (x y : ℕ), (∀ α ∈ E, m3_degree α = 2) → (∀ β ∈ F, m3_degree β = 3) → m3_shadow F ⊆ E → y < x → E.card = x.choose 2 + y → F.card ≤ (x + 1).choose 3 + (y + 1).choose 2) : W23_M3 := by intro A B C x y hB hC hdiv hy hb obtain ⟨E,F,hE,hF,hs,he,hf⟩ := m3_reduce A B C hB hC hdiv rw [← hf] exact hMC A.card E F x y hE hF hs hy (he.trans hb) def m3_raise {k : ℕ} (α : Fin k → ℕ) (j : Fin k) (t : ℕ) : Fin k → ℕ := fun i => α i + if i = j then t else 0 lemma m3_linear_raise {k : ℕ} (g α : Fin k → ℕ) (j : Fin k) (t : ℕ) : (∑ i, m3_raise α j t i * g i) = (∑ i, α i * g i) + t * g j := by classical simp only [m3_raise, Nat.add_mul, Finset.sum_add_distrib] simp lemma m3_degree_raise {k : ℕ} (α : Fin k → ℕ) (j : Fin k) (t : ℕ) : m3_degree (m3_raise α j t) = m3_degree α + t := by simpa [m3_degree] using m3_linear_raise (fun _ => 1) α j t def m3_outside {k : ℕ} (α : Fin k → ℕ) (i j : Fin k) : Fin k → ℕ := Function.update (Function.update α i 0) j 0 def m3_pair {k : ℕ} (γ : Fin k → ℕ) (i j : Fin k) (t s : ℕ) : Fin k → ℕ := m3_raise (m3_raise γ i (t - s)) j s lemma m3_outside_zero {k : ℕ} (α : Fin k → ℕ) (i j : Fin k) : m3_outside α i j i = 0 ∧ m3_outside α i j j = 0 := by classical by_cases hij : i = j · subst j; simp [m3_outside] · simp [m3_outside,Function.update,hij] lemma m3_pair_coords {k : ℕ} (γ : Fin k → ℕ) (i j : Fin k) (hij : i ≠ j) (hγi : γ i = 0) (hγj : γ j = 0) (t s : ℕ) : m3_pair γ i j t s i = t - s ∧ m3_pair γ i j t s j = s := by classical simp [m3_pair,m3_raise,hij,hij.symm,hγi,hγj] lemma m3_outside_pair {k : ℕ} (γ : Fin k → ℕ) (i j : Fin k) (hγi : γ i = 0) (hγj : γ j = 0) (t s : ℕ) : m3_outside (m3_pair γ i j t s) i j = γ := by classical funext l by_cases hli : l = i · subst l; simpa [hγi] using (m3_outside_zero (m3_pair γ i j t s) i j).1 by_cases hlj : l = j · subst l; simpa [hγj] using (m3_outside_zero (m3_pair γ i j t s) i j).2 simp [m3_outside,m3_pair,m3_raise,Function.update,hli,hlj] lemma m3_reconstruct {k : ℕ} (α : Fin k → ℕ) (i j : Fin k) (hij : i ≠ j) : m3_pair (m3_outside α i j) i j (α i + α j) (α j) = α := by classical funext l by_cases hli : l = i · subst l simp [m3_pair,m3_raise,m3_outside,Function.update,hij] by_cases hlj : l = j · subst l simp [m3_pair,m3_raise,m3_outside,Function.update,hij.symm] simp [m3_pair,m3_raise,m3_outside,Function.update,hli,hlj] lemma m3_degree_outside {k : ℕ} (α : Fin k → ℕ) (i j : Fin k) (hij : i ≠ j) : m3_degree (m3_outside α i j) + α i + α j = m3_degree α := by have h := congrArg m3_degree (m3_reconstruct α i j hij) simpa [m3_pair,m3_degree_raise] using h lemma m3_reconstruct_of_degree {k : ℕ} (α : Fin k → ℕ) (i j : Fin k) (hij : i ≠ j) (d : ℕ) (hd : m3_degree α = d) : m3_pair (m3_outside α i j) i j (d - m3_degree (m3_outside α i j)) (α j) = α := by have he := m3_degree_outside α i j hij rw [show d - m3_degree (m3_outside α i j) = α i + α j by omega] exact m3_reconstruct α i j hij noncomputable def m3_fibre {k : ℕ} (H : Finset (Fin k → ℕ)) (i j : Fin k) (γ : Fin k → ℕ) : Finset ℕ := by classical exact (H.filter (fun α => m3_outside α i j = γ)).image (fun α => α j) lemma m3_mem_fibre {k : ℕ} (H : Finset (Fin k → ℕ)) (i j : Fin k) (γ : Fin k → ℕ) (s : ℕ) : s ∈ m3_fibre H i j γ ↔ ∃ α ∈ H, m3_outside α i j = γ ∧ α j = s := by classical simp [m3_fibre,and_assoc] lemma m3_fibre_subset {k : ℕ} (H : Finset (Fin k → ℕ)) (i j : Fin k) (hij : i ≠ j) (d : ℕ) (hH : ∀ α ∈ H, m3_degree α = d) (γ : Fin k → ℕ) : m3_fibre H i j γ ⊆ Finset.range (d - m3_degree γ + 1) := by intro s hs obtain ⟨α,hα,hγ,rfl⟩ := (m3_mem_fibre H i j γ s).1 hs have he := m3_degree_outside α i j hij rw [hγ,hH α hα] at he apply Finset.mem_range.2 omega lemma m3_fibre_card {k : ℕ} (H : Finset (Fin k → ℕ)) (i j : Fin k) (hij : i ≠ j) (d : ℕ) (hH : ∀ α ∈ H, m3_degree α = d) (γ : Fin k → ℕ) : (m3_fibre H i j γ).card = (H.filter (fun α => m3_outside α i j = γ)).card := by classical apply Finset.card_image_of_injOn intro α hα β hβ he obtain ⟨hαH,hαγ⟩ := Finset.mem_filter.1 hα obtain ⟨hβH,hβγ⟩ := Finset.mem_filter.1 hβ change α j = β j at he rw [← m3_reconstruct_of_degree α i j hij d (hH α hαH), ← m3_reconstruct_of_degree β i j hij d (hH β hβH),hαγ,hβγ,he] lemma m3_fibre_card_bound {k : ℕ} (H : Finset (Fin k → ℕ)) (i j : Fin k) (hij : i ≠ j) (d : ℕ) (hH : ∀ α ∈ H, m3_degree α = d) (γ : Fin k → ℕ) : (m3_fibre H i j γ).card ≤ d - m3_degree γ + 1 := by simpa using Finset.card_le_card (m3_fibre_subset H i j hij d hH γ) lemma m3_fibre_pos_image {k : ℕ} (H : Finset (Fin k → ℕ)) (i j : Fin k) (γ : Fin k → ℕ) (h : 0 < (m3_fibre H i j γ).card) : γ ∈ H.image (fun α => m3_outside α i j) := by classical obtain ⟨s,hs⟩ := Finset.card_pos.1 h obtain ⟨α,hα,hγ,_⟩ := (m3_mem_fibre H i j γ s).1 hs exact Finset.mem_image.2 ⟨α,hα,hγ⟩ noncomputable def m3_K {k : ℕ} (H : Finset (Fin k → ℕ)) (d : ℕ) (i j : Fin k) : Finset (Fin k → ℕ) := by classical exact (H.image (fun α => m3_outside α i j)).biUnion (fun γ => (Finset.range (m3_fibre H i j γ).card).image (m3_pair γ i j (d - m3_degree γ))) lemma m3_mem_K {k : ℕ} (H : Finset (Fin k → ℕ)) (d : ℕ) (i j : Fin k) (α : Fin k → ℕ) : α ∈ m3_K H d i j ↔ ∃ γ ∈ H.image (fun β => m3_outside β i j), ∃ s < (m3_fibre H i j γ).card, m3_pair γ i j (d - m3_degree γ) s = α := by classical simp [m3_K,Finset.mem_biUnion] lemma m3_image_outside_spec {k : ℕ} (H : Finset (Fin k → ℕ)) (d : ℕ) (hH : ∀ α ∈ H, m3_degree α = d) (i j : Fin k) (hij : i ≠ j) (γ : Fin k → ℕ) (hγ : γ ∈ H.image (fun α => m3_outside α i j)) : γ i = 0 ∧ γ j = 0 ∧ m3_degree γ ≤ d := by classical obtain ⟨α,hα,rfl⟩ := Finset.mem_image.1 hγ have hz := m3_outside_zero α i j have hd := m3_degree_outside α i j hij rw [hH α hα] at hd exact ⟨hz.1,hz.2,by omega⟩ lemma m3_K_degree {k : ℕ} (H : Finset (Fin k → ℕ)) (d : ℕ) (hH : ∀ α ∈ H, m3_degree α = d) (i j : Fin k) (hij : i ≠ j) : ∀ α ∈ m3_K H d i j, m3_degree α = d := by intro α hα obtain ⟨γ,hγ,s,hs,rfl⟩ := (m3_mem_K H d i j α).1 hα have hspec := m3_image_outside_spec H d hH i j hij γ hγ have hb := m3_fibre_card_bound H i j hij d hH γ simp only [m3_pair,m3_degree_raise] omega lemma m3_K_card {k : ℕ} (H : Finset (Fin k → ℕ)) (d : ℕ) (hH : ∀ α ∈ H, m3_degree α = d) (i j : Fin k) (hij : i ≠ j) : (m3_K H d i j).card = H.card := by classical rw [m3_K,Finset.card_biUnion] · have he := Finset.card_eq_sum_card_fiberwise (s := H) (t := H.image (fun α => m3_outside α i j)) (f := fun α => m3_outside α i j) (fun α hα => Finset.mem_image_of_mem _ hα) rw [he] apply Finset.sum_congr rfl intro γ hγ rw [← m3_fibre_card H i j hij d hH γ] rw [Finset.card_image_of_injective,Finset.card_range] intro s t hst have hs := m3_pair_coords γ i j hij (m3_image_outside_spec H d hH i j hij γ hγ).1 (m3_image_outside_spec H d hH i j hij γ hγ).2.1 (d - m3_degree γ) s have ht := m3_pair_coords γ i j hij (m3_image_outside_spec H d hH i j hij γ hγ).1 (m3_image_outside_spec H d hH i j hij γ hγ).2.1 (d - m3_degree γ) t have := congrFun hst j omega · intro γ hγ δ hδ hne apply Finset.disjoint_left.2 intro α hαγ hαδ obtain ⟨s,hs,hsa⟩ := Finset.mem_image.1 hαγ obtain ⟨t,ht,hta⟩ := Finset.mem_image.1 hαδ have hγspec := m3_image_outside_spec H d hH i j hij γ hγ have hδspec := m3_image_outside_spec H d hH i j hij δ hδ have hoγ := m3_outside_pair γ i j hγspec.1 hγspec.2.1 (d - m3_degree γ) s have hoδ := m3_outside_pair δ i j hδspec.1 hδspec.2.1 (d - m3_degree δ) t rw [hsa] at hoγ rw [hta] at hoδ exact hne (hoγ.symm.trans hoδ) lemma m3_outside_parent_i {k : ℕ} (α : Fin k → ℕ) (i j : Fin k) : m3_outside (m3_parent α i) i j = m3_outside α i j := by classical funext l by_cases hli : l = i <;> by_cases hlj : l = j <;> simp [m3_outside,m3_parent,Function.update,hli,hlj] lemma m3_outside_parent_j {k : ℕ} (α : Fin k → ℕ) (i j : Fin k) : m3_outside (m3_parent α j) i j = m3_outside α i j := by classical funext l by_cases hli : l = i <;> by_cases hlj : l = j <;> simp [m3_outside,m3_parent,Function.update,hli,hlj] lemma m3_outside_parent_outer {k : ℕ} (α : Fin k → ℕ) (i j l : Fin k) (hli : l ≠ i) (hlj : l ≠ j) : m3_outside (m3_parent α l) i j = m3_parent (m3_outside α i j) l := by classical funext z by_cases hzi : z = i <;> by_cases hzj : z = j <;> by_cases hzl : z = l <;> simp_all [m3_outside,m3_parent,Function.update] lemma m3_parent_pair_outer {k : ℕ} (γ : Fin k → ℕ) (i j l : Fin k) (hli : l ≠ i) (hlj : l ≠ j) (t s : ℕ) : m3_parent (m3_pair γ i j t s) l = m3_pair (m3_parent γ l) i j t s := by classical funext z by_cases hzi : z = i <;> by_cases hzj : z = j <;> by_cases hzl : z = l <;> simp_all [m3_pair,m3_raise,m3_parent,Function.update] lemma m3_parent_pair_i {k : ℕ} (γ : Fin k → ℕ) (i j : Fin k) (hij : i ≠ j) (hγi : γ i = 0) (t s : ℕ) (hs : s < t) : m3_parent (m3_pair γ i j t s) i = m3_pair γ i j (t - 1) s := by classical funext z by_cases hzi : z = i · subst z simp [m3_parent,m3_pair,m3_raise,Function.update,hij,hγi] omega by_cases hzj : z = j · subst z simp [m3_parent,m3_pair,m3_raise,Function.update,hij.symm] · simp [m3_parent,m3_pair,m3_raise,Function.update,hzi,hzj] lemma m3_parent_pair_j {k : ℕ} (γ : Fin k → ℕ) (i j : Fin k) (hij : i ≠ j) (hγj : γ j = 0) (t s : ℕ) (hs : 0 < s) (hst : s ≤ t) : m3_parent (m3_pair γ i j t s) j = m3_pair γ i j (t - 1) (s - 1) := by classical funext z by_cases hzi : z = i · subst z simp [m3_parent,m3_pair,m3_raise,Function.update,hij] omega by_cases hzj : z = j · subst z simp [m3_parent,m3_pair,m3_raise,Function.update,hij.symm,hγj] · simp [m3_parent,m3_pair,m3_raise,Function.update,hzi,hzj] lemma m3_fibre_shadow_subset {k : ℕ} (E F : Finset (Fin k → ℕ)) (i j : Fin k) (hij : i ≠ j) (d : ℕ) (hF : ∀ β ∈ F, m3_degree β = d + 1) (hdiv : m3_shadow F ⊆ E) (γ : Fin k → ℕ) : m3_fibreShadow (m3_fibre F i j γ) (d + 1 - m3_degree γ) ⊆ m3_fibre E i j γ := by classical intro s hs rcases (m3_mem_fibreShadow _ _ _).1 hs with ⟨hs,hst⟩ | ⟨u,hu,hup,hus⟩ · obtain ⟨β,hβ,hγ,hβj⟩ := (m3_mem_fibre F i j γ s).1 hs have hdeg := m3_degree_outside β i j hij rw [hγ,hF β hβ,hβj] at hdeg have hβi : 0 < β i := by omega have hp := hdiv ((m3_mem_shadow F (m3_parent β i)).2 ⟨β,hβ,i,hβi,rfl⟩) apply (m3_mem_fibre E i j γ s).2 exact ⟨m3_parent β i,hp,(m3_outside_parent_i β i j).trans hγ, by simpa [m3_parent,Function.update,hij.symm] using hβj⟩ · obtain ⟨β,hβ,hγ,hβj⟩ := (m3_mem_fibre F i j γ u).1 hu have hβjp : 0 < β j := by omega have hp := hdiv ((m3_mem_shadow F (m3_parent β j)).2 ⟨β,hβ,j,hβjp,rfl⟩) apply (m3_mem_fibre E i j γ s).2 exact ⟨m3_parent β j,hp,(m3_outside_parent_j β i j).trans hγ, by simp [m3_parent,hβj,hus]⟩ lemma m3_fibre_outer_subset {k : ℕ} (E F : Finset (Fin k → ℕ)) (i j l : Fin k) (hli : l ≠ i) (hlj : l ≠ j) (hdiv : m3_shadow F ⊆ E) (γ : Fin k → ℕ) (hγl : 0 < γ l) : m3_fibre F i j γ ⊆ m3_fibre E i j (m3_parent γ l) := by classical intro s hs obtain ⟨β,hβ,hγ,hβj⟩ := (m3_mem_fibre F i j γ s).1 hs have hβl : 0 < β l := by have he := congrFun hγ l simp [m3_outside,Function.update,hli,hlj] at he rw [he] exact hγl have hp := hdiv ((m3_mem_shadow F (m3_parent β l)).2 ⟨β,hβ,l,hβl,rfl⟩) apply (m3_mem_fibre E i j (m3_parent γ l) s).2 exact ⟨m3_parent β l,hp,by rw [m3_outside_parent_outer β i j l hli hlj,hγ], by simpa [m3_parent,Function.update,hlj.symm] using hβj⟩ theorem m3_K_shadow {k : ℕ} (E F : Finset (Fin k → ℕ)) (d : ℕ) (_hE : ∀ α ∈ E, m3_degree α = d) (hF : ∀ β ∈ F, m3_degree β = d + 1) (hdiv : m3_shadow F ⊆ E) (i j : Fin k) (hij : i ≠ j) : m3_shadow (m3_K F (d + 1) i j) ⊆ m3_K E d i j := by classical intro α hα obtain ⟨β,hβ,l,hl,rfl⟩ := (m3_mem_shadow _ α).1 hα obtain ⟨γ,hγ,s,hs,rfl⟩ := (m3_mem_K F (d + 1) i j β).1 hβ have hspec := m3_image_outside_spec F (d + 1) hF i j hij γ hγ have hb := m3_fibre_card_bound F i j hij (d + 1) hF γ have hcoords := m3_pair_coords γ i j hij hspec.1 hspec.2.1 (d + 1 - m3_degree γ) s have hS := (m3_fibre_shadow_card (m3_fibre F i j γ) (d + 1 - m3_degree γ) (m3_fibre_subset F i j hij (d + 1) hF γ)).trans (Finset.card_le_card (m3_fibre_shadow_subset E F i j hij d hF hdiv γ)) by_cases hli : l = i · subst l have hst : s < d + 1 - m3_degree γ := by rw [hcoords.1] at hl; omega have hsE : s < (m3_fibre E i j γ).card := by omega apply (m3_mem_K E d i j _).2 refine ⟨γ,m3_fibre_pos_image E i j γ (by omega),s,hsE,?_⟩ rw [m3_parent_pair_i γ i j hij hspec.1 _ s hst] congr 1 omega by_cases hlj : l = j · subst l have hsp : 0 < s := by rwa [hcoords.2] at hl have hst : s ≤ d + 1 - m3_degree γ := by omega have hsE : s - 1 < (m3_fibre E i j γ).card := by omega apply (m3_mem_K E d i j _).2 refine ⟨γ,m3_fibre_pos_image E i j γ (by omega),s - 1,hsE,?_⟩ rw [m3_parent_pair_j γ i j hij hspec.2.1 _ s hsp hst] congr 1 omega · have hγl : 0 < γ l := by simpa [m3_pair,m3_raise,hli,hlj] using hl have hsub := m3_fibre_outer_subset E F i j l hli hlj hdiv γ hγl have hsE : s < (m3_fibre E i j (m3_parent γ l)).card := lt_of_lt_of_le hs (Finset.card_le_card hsub) apply (m3_mem_K E d i j _).2 refine ⟨m3_parent γ l,m3_fibre_pos_image E i j _ (by omega),s,hsE,?_⟩ rw [m3_parent_pair_outer γ i j l hli hlj] congr 1 have hd := m3_degree_parent γ l hγl omega noncomputable def m3_rank (S : Finset ℕ) (s : ℕ) : ℕ := (S.filter (fun u => u < s)).card lemma m3_rank_le (S : Finset ℕ) (s : ℕ) : m3_rank S s ≤ s := by have hsub : S.filter (fun u => u < s) ⊆ Finset.range s := by intro u hu exact Finset.mem_range.2 (Finset.mem_filter.1 hu).2 simpa [m3_rank] using Finset.card_le_card hsub lemma m3_rank_lt_card (S : Finset ℕ) (s : ℕ) (hs : s ∈ S) : m3_rank S s < S.card := by classical apply Finset.card_lt_card apply Finset.ssubset_iff_subset_ne.2 refine ⟨Finset.filter_subset _ _,?_⟩ intro he have hm : s ∈ S.filter (fun u => u < s) := he.symm ▸ hs exact (Nat.lt_irrefl s) (Finset.mem_filter.1 hm).2 lemma m3_rank_strict (S : Finset ℕ) (a b : ℕ) (ha : a ∈ S) (hab : a < b) : m3_rank S a < m3_rank S b := by classical apply Finset.card_lt_card apply Finset.ssubset_iff_subset_ne.2 refine ⟨?_,?_⟩ · intro u hu exact Finset.mem_filter.2 ⟨(Finset.mem_filter.1 hu).1, ((Finset.mem_filter.1 hu).2).trans hab⟩ · intro he have hm : a ∈ S.filter (fun u => u < a) := he.symm ▸ Finset.mem_filter.2 ⟨ha,hab⟩ exact (Nat.lt_irrefl a) (Finset.mem_filter.1 hm).2 lemma m3_rank_injOn (S : Finset ℕ) : Set.InjOn (m3_rank S) S := by intro a ha b hb he rcases lt_trichotomy a b with hab | hab | hab · have := m3_rank_strict S a b ha hab omega · exact hab · have := m3_rank_strict S b a hb hab omega lemma m3_rank_image (S : Finset ℕ) : S.image (m3_rank S) = Finset.range S.card := by classical apply Finset.eq_of_subset_of_card_le · intro r hr obtain ⟨s,hs,rfl⟩ := Finset.mem_image.1 hr exact Finset.mem_range.2 (m3_rank_lt_card S s hs) · rw [Finset.card_range,Finset.card_image_of_injOn (m3_rank_injOn S)] lemma m3_rank_fixed_initial (S : Finset ℕ) (h : ∀ s ∈ S, m3_rank S s = s) : S = Finset.range S.card := by classical rw [← m3_rank_image S] ext s constructor · intro hs exact Finset.mem_image.2 ⟨s,hs,h s hs⟩ · intro hs obtain ⟨u,hu,he⟩ := Finset.mem_image.1 hs rw [h u hu] at he exact he ▸ hu noncomputable def m3_kappa {k : ℕ} (H : Finset (Fin k → ℕ)) (d : ℕ) (i j : Fin k) (α : Fin k → ℕ) : Fin k → ℕ := m3_pair (m3_outside α i j) i j (d - m3_degree (m3_outside α i j)) (m3_rank (m3_fibre H i j (m3_outside α i j)) (α j)) lemma m3_kappa_image {k : ℕ} (H : Finset (Fin k → ℕ)) (d : ℕ) (_hH : ∀ α ∈ H, m3_degree α = d) (i j : Fin k) (_hij : i ≠ j) : H.image (m3_kappa H d i j) = m3_K H d i j := by classical ext β constructor · intro hβ obtain ⟨α,hα,rfl⟩ := Finset.mem_image.1 hβ apply (m3_mem_K H d i j _).2 have hs : α j ∈ m3_fibre H i j (m3_outside α i j) := (m3_mem_fibre H i j _ _).2 ⟨α,hα,rfl,rfl⟩ exact ⟨m3_outside α i j,Finset.mem_image_of_mem _ hα,_, m3_rank_lt_card _ _ hs,rfl⟩ · intro hβ obtain ⟨γ,hγ,s,hs,rfl⟩ := (m3_mem_K H d i j β).1 hβ have hsim : s ∈ (m3_fibre H i j γ).image (m3_rank (m3_fibre H i j γ)) := by rw [m3_rank_image] exact Finset.mem_range.2 hs obtain ⟨u,hu,hus⟩ := Finset.mem_image.1 hsim obtain ⟨α,hα,hαγ,hαj⟩ := (m3_mem_fibre H i j γ u).1 hu apply Finset.mem_image.2 exact ⟨α,hα,by simp only [m3_kappa,hαγ,hαj,hus]⟩ lemma m3_kappa_injOn {k : ℕ} (H : Finset (Fin k → ℕ)) (d : ℕ) (hH : ∀ α ∈ H, m3_degree α = d) (i j : Fin k) (hij : i ≠ j) : Set.InjOn (m3_kappa H d i j) H := by classical apply Finset.card_image_iff.1 rw [m3_kappa_image H d hH i j hij,m3_K_card H d hH i j hij] def m3_weight {k : ℕ} (α : Fin k → ℕ) : ℕ := m3_value (fun i => i.val + 1) α def m3_familyWeight {k : ℕ} (H : Finset (Fin k → ℕ)) : ℕ := ∑ α ∈ H, m3_weight α lemma m3_weight_pair {k : ℕ} (γ : Fin k → ℕ) (i j : Fin k) (hij : i < j) (t s : ℕ) (hs : s ≤ t) : m3_weight (m3_pair γ i j t s) = m3_weight γ + t * (i.val + 1) + (j.val - i.val) * s := by unfold m3_pair m3_weight m3_value rw [m3_linear_raise,m3_linear_raise] have he : t - s + s = t := by omega have hi : i.val ≤ j.val := hij.le have hj : j.val - i.val + i.val = j.val := by omega nlinarith lemma m3_weight_kappa_le {k : ℕ} (H : Finset (Fin k → ℕ)) (d : ℕ) (hH : ∀ α ∈ H, m3_degree α = d) (i j : Fin k) (hij : i < j) (α : Fin k → ℕ) (hα : α ∈ H) : m3_weight (m3_kappa H d i j α) ≤ m3_weight α := by have hs : α j ∈ m3_fibre H i j (m3_outside α i j) := (m3_mem_fibre H i j _ _).2 ⟨α,hα,rfl,rfl⟩ have ht := m3_degree_outside α i j hij.ne rw [hH α hα] at ht have hr := m3_rank_le (m3_fibre H i j (m3_outside α i j)) (α j) unfold m3_kappa rw [m3_weight_pair _ i j hij _ _ (by omega)] conv_rhs => rw [← m3_reconstruct_of_degree α i j hij.ne d (hH α hα)] rw [m3_weight_pair _ i j hij _ _ (by omega)] exact Nat.add_le_add_left (Nat.mul_le_mul_left _ hr) _ lemma m3_K_weight_le {k : ℕ} (H : Finset (Fin k → ℕ)) (d : ℕ) (hH : ∀ α ∈ H, m3_degree α = d) (i j : Fin k) (hij : i < j) : m3_familyWeight (m3_K H d i j) ≤ m3_familyWeight H := by classical unfold m3_familyWeight rw [← m3_kappa_image H d hH i j hij.ne, Finset.sum_image (m3_kappa_injOn H d hH i j hij.ne)] exact Finset.sum_le_sum (fun α hα => m3_weight_kappa_le H d hH i j hij α hα) lemma m3_K_weight_eq_fibre_initial {k : ℕ} (H : Finset (Fin k → ℕ)) (d : ℕ) (hH : ∀ α ∈ H, m3_degree α = d) (i j : Fin k) (hij : i < j) (he : m3_familyWeight (m3_K H d i j) = m3_familyWeight H) : ∀ γ, m3_fibre H i j γ = Finset.range (m3_fibre H i j γ).card := by classical have hsum := he unfold m3_familyWeight at hsum rw [← m3_kappa_image H d hH i j hij.ne, Finset.sum_image (m3_kappa_injOn H d hH i j hij.ne)] at hsum have hpoint : ∀ α ∈ H, m3_weight (m3_kappa H d i j α) = m3_weight α := by exact (Finset.sum_eq_sum_iff_of_le (fun α hα => m3_weight_kappa_le H d hH i j hij α hα)).1 hsum intro γ apply m3_rank_fixed_initial intro s hs obtain ⟨α,hα,hαγ,hαj⟩ := (m3_mem_fibre H i j γ s).1 hs have hweight := hpoint α hα have ht := m3_degree_outside α i j hij.ne rw [hH α hα,hαγ,hαj] at ht unfold m3_kappa at hweight rw [hαγ,hαj,m3_weight_pair _ i j hij _ _ (by have := m3_rank_le (m3_fibre H i j γ) s; omega)] at hweight have hrec := m3_reconstruct_of_degree α i j hij.ne d (hH α hα) rw [hαγ,hαj] at hrec rw [← hrec,m3_weight_pair _ i j hij _ _ (by omega)] at hweight have hpos : 0 < j.val - i.val := by exact Nat.sub_pos_of_lt hij nlinarith def m3_shifted {k : ℕ} (E : Finset (Fin k → ℕ)) : Prop := ∀ α ∈ E, ∀ i j : Fin k, i < j → 0 < α j → m3_unitAdd (m3_parent α j) i ∈ E lemma m3_shift_outside {k : ℕ} (α : Fin k → ℕ) (i j : Fin k) : m3_outside (m3_unitAdd (m3_parent α j) i) i j = m3_outside α i j := by classical funext l by_cases hli : l = i <;> by_cases hlj : l = j <;> simp [m3_outside,m3_unitAdd,m3_parent,Function.update,hli,hlj] lemma m3_shift_degree {k : ℕ} (α : Fin k → ℕ) (i j : Fin k) (hj : 0 < α j) : m3_degree (m3_unitAdd (m3_parent α j) i) = m3_degree α := by rw [m3_degree_unitAdd,m3_degree_parent α j hj] lemma m3_shifted_of_initial_fibres {k : ℕ} (E : Finset (Fin k → ℕ)) (d : ℕ) (hE : ∀ α ∈ E, m3_degree α = d) (hinit : ∀ i j : Fin k, i < j → ∀ γ, m3_fibre E i j γ = Finset.range (m3_fibre E i j γ).card) : m3_shifted E := by classical intro α hα i j hij hj let γ := m3_outside α i j have hs : α j ∈ m3_fibre E i j γ := (m3_mem_fibre E i j γ _).2 ⟨α,hα,rfl,rfl⟩ have hsc : α j < (m3_fibre E i j γ).card := by rwa [hinit i j hij γ,Finset.mem_range] at hs have hp : α j - 1 ∈ m3_fibre E i j γ := by rw [hinit i j hij γ] exact Finset.mem_range.2 (by omega) obtain ⟨β,hβ,hβγ,hβj⟩ := (m3_mem_fibre E i j γ _).1 hp have he : β = m3_unitAdd (m3_parent α j) i := by have hd := m3_shift_degree α i j hj rw [hE α hα] at hd have ho := m3_shift_outside α i j have hsj : m3_unitAdd (m3_parent α j) i j = α j - 1 := by simp [m3_unitAdd,m3_parent,hij.ne.symm] rw [← m3_reconstruct_of_degree β i j hij.ne d (hE β hβ), ← m3_reconstruct_of_degree (m3_unitAdd (m3_parent α j) i) i j hij.ne d hd] rw [hβγ,ho,hβj,hsj] exact he ▸ hβ theorem m3_compress {k : ℕ} (E F : Finset (Fin k → ℕ)) (hE : ∀ α ∈ E, m3_degree α = 2) (hF : ∀ β ∈ F, m3_degree β = 3) (hdiv : m3_shadow F ⊆ E) : ∃ E' F' : Finset (Fin k → ℕ), (∀ α ∈ E', m3_degree α = 2) ∧ (∀ β ∈ F', m3_degree β = 3) ∧ m3_shifted E' ∧ m3_shadow F' ⊆ E' ∧ E'.card = E.card ∧ F'.card = F.card := by classical let good : Finset (Fin k → ℕ) → Finset (Fin k → ℕ) → Prop := fun E' F' => (∀ α ∈ E', m3_degree α = 2) ∧ (∀ β ∈ F', m3_degree β = 3) ∧ m3_shadow F' ⊆ E' ∧ E'.card = E.card ∧ F'.card = F.card have hex : ∃ n, ∃ E' F', good E' F' ∧ m3_familyWeight E' + m3_familyWeight F' = n := ⟨m3_familyWeight E + m3_familyWeight F,E,F,⟨hE,hF,hdiv,rfl,rfl⟩,rfl⟩ obtain ⟨E',F',hg,hw⟩ := Nat.find_spec hex have hinit : ∀ i j : Fin k, i < j → ∀ γ, m3_fibre E' i j γ = Finset.range (m3_fibre E' i j γ).card := by intro i j hij have hgK : good (m3_K E' 2 i j) (m3_K F' 3 i j) := ⟨m3_K_degree E' 2 hg.1 i j hij.ne,m3_K_degree F' 3 hg.2.1 i j hij.ne, m3_K_shadow E' F' 2 hg.1 hg.2.1 hg.2.2.1 i j hij.ne, (m3_K_card E' 2 hg.1 i j hij.ne).trans hg.2.2.2.1, (m3_K_card F' 3 hg.2.1 i j hij.ne).trans hg.2.2.2.2⟩ have hmin := Nat.find_min' hex ⟨m3_K E' 2 i j,m3_K F' 3 i j,hgK,rfl⟩ have hleE := m3_K_weight_le E' 2 hg.1 i j hij have hleF := m3_K_weight_le F' 3 hg.2.1 i j hij have he : m3_familyWeight (m3_K E' 2 i j) = m3_familyWeight E' := by omega exact m3_K_weight_eq_fibre_initial E' 2 hg.1 i j hij he exact ⟨E',F',hg.1,hg.2.1,m3_shifted_of_initial_fibres E' 2 hg.1 hinit, hg.2.2.1,hg.2.2.2.1,hg.2.2.2.2⟩ def m3_pairVector {k : ℕ} (u v : Fin k) : Fin k → ℕ := m3_unitAdd (m3_unitAdd (fun _ => 0) v) u def m3_tripleVector {k : ℕ} (a b c : Fin k) : Fin k → ℕ := m3_unitAdd (m3_pairVector b c) a lemma m3_unitAdd_comm {k : ℕ} (α : Fin k → ℕ) (i j : Fin k) : m3_unitAdd (m3_unitAdd α i) j = m3_unitAdd (m3_unitAdd α j) i := by funext l simp only [m3_unitAdd] omega lemma m3_unitAdd_injective {k : ℕ} (i : Fin k) : Function.Injective (fun α : Fin k → ℕ => m3_unitAdd α i) := by intro α β he funext l have h := congrFun he l simp only [m3_unitAdd] at h omega lemma m3_pairVector_comm {k : ℕ} (u v : Fin k) : m3_pairVector u v = m3_pairVector v u := m3_unitAdd_comm (fun _ => 0) v u lemma m3_degree_pairVector {k : ℕ} (u v : Fin k) : m3_degree (m3_pairVector u v) = 2 := by rw [m3_pairVector,m3_degree_unitAdd,m3_degree_unitAdd] simp [m3_degree] lemma m3_degree_tripleVector {k : ℕ} (a b c : Fin k) : m3_degree (m3_tripleVector a b c) = 3 := by simp [m3_tripleVector,m3_degree_unitAdd,m3_degree_pairVector] lemma m3_degree_zero {k : ℕ} (α : Fin k → ℕ) (hd : m3_degree α = 0) : α = fun _ => 0 := by funext i have := m3_coord_le_degree α i omega lemma m3_degree_one_repr {k : ℕ} (α : Fin k → ℕ) (hd : m3_degree α = 1) : ∃ i, α = m3_unitAdd (fun _ => 0) i := by obtain ⟨i,hi⟩ := m3_degree_pos_coord α (by omega) have hp := m3_degree_parent α i hi have hz := m3_degree_zero (m3_parent α i) (by omega) exact ⟨i,by rw [← m3_unitAdd_parent α i hi,hz]⟩ lemma m3_degree_two_repr {k : ℕ} (α : Fin k → ℕ) (hd : m3_degree α = 2) : ∃ u v, u ≤ v ∧ α = m3_pairVector u v := by obtain ⟨i,hi⟩ := m3_degree_pos_coord α (by omega) have hp := m3_degree_parent α i hi obtain ⟨j,hj⟩ := m3_degree_one_repr (m3_parent α i) (by omega) have he : α = m3_pairVector i j := by rw [m3_pairVector,← hj,m3_unitAdd_parent α i hi] rcases le_total i j with hij | hji · exact ⟨i,j,hij,he⟩ · exact ⟨j,i,hji,he.trans (m3_pairVector_comm i j)⟩ lemma m3_degree_three_repr {k : ℕ} (α : Fin k → ℕ) (hd : m3_degree α = 3) : ∃ a b c, a ≤ b ∧ b ≤ c ∧ α = m3_tripleVector a b c := by obtain ⟨i,hi⟩ := m3_degree_pos_coord α (by omega) have hp := m3_degree_parent α i hi obtain ⟨j,l,hjl,hj⟩ := m3_degree_two_repr (m3_parent α i) (by omega) have he : α = m3_tripleVector i j l := by rw [m3_tripleVector,← hj,m3_unitAdd_parent α i hi] by_cases hij : i ≤ j · exact ⟨i,j,l,hij,hjl,he⟩ by_cases hil : i ≤ l · refine ⟨j,i,l,by omega,hil,?_⟩ rw [he,m3_tripleVector,m3_pairVector,m3_tripleVector,m3_pairVector] exact m3_unitAdd_comm _ j i · refine ⟨j,l,i,hjl,by omega,?_⟩ rw [he,m3_tripleVector,m3_pairVector,m3_tripleVector,m3_pairVector] rw [m3_unitAdd_comm (m3_unitAdd (fun _ => 0) l) j i] rw [m3_unitAdd_comm (fun _ => 0) l i] lemma m3_pairVector_sorted_inj {k : ℕ} (u v u' v' : Fin k) (huv : u ≤ v) (huv' : u' ≤ v') (he : m3_pairVector u v = m3_pairVector u' v') : u = u' ∧ v = v' := by have hu : u = u' := by by_contra hn rcases lt_or_gt_of_ne hn with hlt | hgt · have hv' : u ≠ v' := (hlt.trans_le huv').ne have h := congrFun he u simp [m3_pairVector,m3_unitAdd,hlt.ne,hv'] at h · have hv : u' ≠ v := (hgt.trans_le huv).ne have h := congrFun he u' simp [m3_pairVector,m3_unitAdd,hgt.ne,hv] at h subst u' have hv := m3_unitAdd_injective u he have h := congrFun hv v by_cases hvv : v = v' · exact ⟨rfl,hvv⟩ · simp [m3_unitAdd,hvv] at h lemma m3_tripleVector_sorted_inj {k : ℕ} (a b c a' b' c' : Fin k) (hab : a ≤ b) (hbc : b ≤ c) (hab' : a' ≤ b') (hbc' : b' ≤ c') (he : m3_tripleVector a b c = m3_tripleVector a' b' c') : a = a' ∧ b = b' ∧ c = c' := by have ha : a = a' := by by_contra hn rcases lt_or_gt_of_ne hn with hlt | hgt · have hb' : a ≠ b' := (hlt.trans_le hab').ne have hc' : a ≠ c' := (hlt.trans_le (hab'.trans hbc')).ne have h := congrFun he a simp [m3_tripleVector,m3_pairVector,m3_unitAdd,hlt.ne,hb',hc'] at h · have hb : a' ≠ b := (hgt.trans_le hab).ne have hc : a' ≠ c := (hgt.trans_le (hab.trans hbc)).ne have h := congrFun he a' simp [m3_tripleVector,m3_pairVector,m3_unitAdd,hgt.ne,hb,hc] at h subst a' have hpair := m3_unitAdd_injective a he obtain ⟨hb,hc⟩ := m3_pairVector_sorted_inj b c b' c' hbc hbc' hpair exact ⟨rfl,hb,hc⟩ noncomputable def m3_pairs {k : ℕ} (E : Finset (Fin k → ℕ)) : Finset (Fin k × Fin k) := by classical exact Finset.univ.filter (fun uv => uv.1 ≤ uv.2 ∧ m3_pairVector uv.1 uv.2 ∈ E) lemma m3_mem_pairs {k : ℕ} (E : Finset (Fin k → ℕ)) (u v : Fin k) : (u,v) ∈ m3_pairs E ↔ u ≤ v ∧ m3_pairVector u v ∈ E := by classical simp [m3_pairs] lemma m3_pairs_card {k : ℕ} (E : Finset (Fin k → ℕ)) (hE : ∀ α ∈ E, m3_degree α = 2) : (m3_pairs E).card = E.card := by classical apply Finset.card_bij (fun uv _ => m3_pairVector uv.1 uv.2) · intro uv huv exact ((m3_mem_pairs E uv.1 uv.2).1 huv).2 · intro uv huv xy hxy he have h := m3_pairVector_sorted_inj uv.1 uv.2 xy.1 xy.2 ((m3_mem_pairs E uv.1 uv.2).1 huv).1 ((m3_mem_pairs E xy.1 xy.2).1 hxy).1 he exact Prod.ext h.1 h.2 · intro α hα obtain ⟨u,v,huv,he⟩ := m3_degree_two_repr α (hE α hα) exact ⟨(u,v),(m3_mem_pairs E u v).2 ⟨huv,he ▸ hα⟩,he.symm⟩ noncomputable def m3_triples {k : ℕ} (F : Finset (Fin k → ℕ)) : Finset (Fin k × Fin k × Fin k) := by classical exact Finset.univ.filter (fun abc => abc.1 ≤ abc.2.1 ∧ abc.2.1 ≤ abc.2.2 ∧ m3_tripleVector abc.1 abc.2.1 abc.2.2 ∈ F) lemma m3_mem_triples {k : ℕ} (F : Finset (Fin k → ℕ)) (a b c : Fin k) : (a,b,c) ∈ m3_triples F ↔ a ≤ b ∧ b ≤ c ∧ m3_tripleVector a b c ∈ F := by classical simp [m3_triples] lemma m3_triples_card {k : ℕ} (F : Finset (Fin k → ℕ)) (hF : ∀ β ∈ F, m3_degree β = 3) : (m3_triples F).card = F.card := by classical apply Finset.card_bij (fun abc _ => m3_tripleVector abc.1 abc.2.1 abc.2.2) · intro abc habc exact ((m3_mem_triples F abc.1 abc.2.1 abc.2.2).1 habc).2.2 · intro abc habc xyz hxyz he have h := m3_tripleVector_sorted_inj abc.1 abc.2.1 abc.2.2 xyz.1 xyz.2.1 xyz.2.2 ((m3_mem_triples F abc.1 abc.2.1 abc.2.2).1 habc).1 ((m3_mem_triples F abc.1 abc.2.1 abc.2.2).1 habc).2.1 ((m3_mem_triples F xyz.1 xyz.2.1 xyz.2.2).1 hxyz).1 ((m3_mem_triples F xyz.1 xyz.2.1 xyz.2.2).1 hxyz).2.1 he exact Prod.ext h.1 (Prod.ext h.2.1 h.2.2) · intro α hα obtain ⟨a,b,c,hab,hbc,he⟩ := m3_degree_three_repr α (hF α hα) exact ⟨(a,b,c),(m3_mem_triples F a b c).2 ⟨hab,hbc,he ▸ hα⟩,he.symm⟩ lemma m3_pairSet_inj {N : ℕ} (a b c d : Fin N) (hab : a < b) (hcd : c < d) (he : ({a,b} : Finset (Fin N)) = {c,d}) : a = c ∧ b = d := by have ha : a = c ∨ a = d := by have hm : a ∈ ({a,b} : Finset (Fin N)) := by simp rw [he] at hm simpa using hm have hc : c = a ∨ c = b := by have hm : c ∈ ({c,d} : Finset (Fin N)) := by simp rw [← he] at hm simpa using hm have hb : b = c ∨ b = d := by have hm : b ∈ ({a,b} : Finset (Fin N)) := by simp rw [he] at hm simpa using hm have hd : d = a ∨ d = b := by have hm : d ∈ ({c,d} : Finset (Fin N)) := by simp rw [← he] at hm simpa using hm constructor <;> apply Fin.ext <;> omega lemma m3_tripleSet_inj {N : ℕ} (a b c d e f : Fin N) (hab : a < b) (hbc : b < c) (hde : d < e) (hef : e < f) (he : ({a,b,c} : Finset (Fin N)) = {d,e,f}) : a = d ∧ b = e ∧ c = f := by have ha : a = d ∨ a = e ∨ a = f := by have hm : a ∈ ({a,b,c} : Finset (Fin N)) := by simp rw [he] at hm simpa using hm have hd : d = a ∨ d = b ∨ d = c := by have hm : d ∈ ({d,e,f} : Finset (Fin N)) := by simp rw [← he] at hm simpa using hm have hb : b = d ∨ b = e ∨ b = f := by have hm : b ∈ ({a,b,c} : Finset (Fin N)) := by simp rw [he] at hm simpa using hm have hc : c = d ∨ c = e ∨ c = f := by have hm : c ∈ ({a,b,c} : Finset (Fin N)) := by simp rw [he] at hm simpa using hm have he' : e = a ∨ e = b ∨ e = c := by have hm : e ∈ ({d,e,f} : Finset (Fin N)) := by simp rw [← he] at hm simpa using hm have hf : f = a ∨ f = b ∨ f = c := by have hm : f ∈ ({d,e,f} : Finset (Fin N)) := by simp rw [← he] at hm simpa using hm have had : a = d := by apply Fin.ext; omega have hbe : b = e := by apply Fin.ext; omega have hcf : c = f := by apply Fin.ext; omega exact ⟨had,hbe,hcf⟩ def m3_edge {k : ℕ} (u v : Fin k) : Finset (Fin (k + 1)) := {u.castSucc,v.succ} noncomputable def m3_graph {k : ℕ} (E : Finset (Fin k → ℕ)) : Finset (Finset (Fin (k + 1))) := (m3_pairs E).image (fun uv => m3_edge uv.1 uv.2) lemma m3_graph_card {k : ℕ} (E : Finset (Fin k → ℕ)) (hE : ∀ α ∈ E, m3_degree α = 2) : (m3_graph E).card = E.card := by classical rw [m3_graph,Finset.card_image_of_injOn, m3_pairs_card E hE] intro uv huv xy hxy he have h := m3_pairSet_inj uv.1.castSucc uv.2.succ xy.1.castSucc xy.2.succ (by have := ((m3_mem_pairs E uv.1 uv.2).1 huv).1; change uv.1.val < uv.2.val + 1; omega) (by have := ((m3_mem_pairs E xy.1 xy.2).1 hxy).1; change xy.1.val < xy.2.val + 1; omega) he apply Prod.ext <;> apply Fin.ext · simpa only [Fin.val_castSucc] using congrArg (fun z : Fin (k + 1) => z.val) h.1 · have := congrArg Fin.val h.2; simp only [Fin.val_succ] at this; omega lemma m3_edge_mem_graph {k : ℕ} (E : Finset (Fin k → ℕ)) (u v : Fin k) (huv : u ≤ v) (he : m3_pairVector u v ∈ E) : m3_edge u v ∈ m3_graph E := by classical exact Finset.mem_image.2 ⟨(u,v),(m3_mem_pairs E u v).2 ⟨huv,he⟩,rfl⟩ noncomputable def m3_triangles {N : ℕ} (G : Finset (Finset (Fin N))) : Finset (Finset (Fin N)) := by classical exact Finset.univ.filter (fun t => t.card = 3 ∧ t.powersetCard 2 ⊆ G) lemma m3_mem_triangles {N : ℕ} (G : Finset (Finset (Fin N))) (t : Finset (Fin N)) : t ∈ m3_triangles G ↔ t.card = 3 ∧ t.powersetCard 2 ⊆ G := by classical simp [m3_triangles] lemma m3_graph_sized {k : ℕ} (E : Finset (Fin k → ℕ)) : ∀ t ∈ m3_graph E, t.card = 2 := by classical intro t ht obtain ⟨uv,huv,rfl⟩ := Finset.mem_image.1 ht obtain ⟨u,v⟩ := uv have hlt : u.castSucc < v.succ := by have := ((m3_mem_pairs E u v).1 huv).1 change u.val < v.val + 1 omega simp [m3_edge,hlt.ne] lemma m3_parent_unitAdd {k : ℕ} (α : Fin k → ℕ) (i : Fin k) : m3_parent (m3_unitAdd α i) i = α := by classical funext l by_cases hli : l = i <;> simp [m3_parent,m3_unitAdd,Function.update,hli] lemma m3_triple_parents {k : ℕ} (E F : Finset (Fin k → ℕ)) (hdiv : m3_shadow F ⊆ E) (a b c : Fin k) (h : m3_tripleVector a b c ∈ F) : m3_pairVector a b ∈ E ∧ m3_pairVector a c ∈ E ∧ m3_pairVector b c ∈ E := by have hp : ∀ α : Fin k → ℕ, ∀ i : Fin k, m3_unitAdd α i ∈ F → α ∈ E := by intro α i hi have hpos : 0 < m3_unitAdd α i i := by simp [m3_unitAdd] apply hdiv rw [← m3_parent_unitAdd α i] exact (m3_mem_shadow F _).2 ⟨m3_unitAdd α i,hi,i,hpos,rfl⟩ refine ⟨hp (m3_pairVector a b) c ?_,hp (m3_pairVector a c) b ?_,hp (m3_pairVector b c) a h⟩ · have he : m3_unitAdd (m3_pairVector a b) c = m3_tripleVector a b c := by simp only [m3_pairVector,m3_tripleVector] rw [m3_unitAdd_comm (m3_unitAdd (fun _ => 0) b) a c] rw [m3_unitAdd_comm (fun _ => 0) b c] exact he.symm ▸ h · have he : m3_unitAdd (m3_pairVector a c) b = m3_tripleVector a b c := by exact m3_unitAdd_comm (m3_unitAdd (fun _ => 0) c) a b exact he.symm ▸ h lemma m3_lower_pair_first {k : ℕ} (E : Finset (Fin k → ℕ)) (hshift : m3_shifted E) (a b u : Fin k) (hua : u ≤ a) (hab : m3_pairVector a b ∈ E) : m3_pairVector u b ∈ E := by rcases hua.eq_or_lt with rfl | hua · exact hab have hp : 0 < m3_pairVector a b a := by simp [m3_pairVector,m3_unitAdd] have h := hshift (m3_pairVector a b) hab u a hua hp have he : m3_parent (m3_pairVector a b) a = m3_unitAdd (fun _ => 0) b := m3_parent_unitAdd _ a rw [he] at h exact h lemma m3_lower_pair_second {k : ℕ} (E : Finset (Fin k → ℕ)) (hshift : m3_shifted E) (a b v : Fin k) (hvb : v ≤ b) (hab : m3_pairVector a b ∈ E) : m3_pairVector a v ∈ E := by rw [m3_pairVector_comm] apply m3_lower_pair_first E hshift b a v hvb rwa [m3_pairVector_comm] lemma m3_triple_pairs {N : ℕ} (a b c : Fin N) : ({a,b,c} : Finset (Fin N)).powersetCard 2 ⊆ {{a,b},{a,c},{b,c}} := by classical intro t ht obtain ⟨hsub,hcard⟩ := Finset.mem_powersetCard.1 ht obtain ⟨u,v,hne,rfl⟩ := Finset.card_eq_two.1 hcard have hu : u = a ∨ u = b ∨ u = c := by have := hsub (Finset.mem_insert_self u {v}) simpa using this have hv : v = a ∨ v = b ∨ v = c := by have := hsub (by simp : v ∈ ({u,v} : Finset (Fin N))) simpa using this rcases hu with rfl | rfl | rfl <;> rcases hv with rfl | rfl | rfl <;> simp_all [Finset.pair_comm] def m3_triangle {k : ℕ} (a b c : Fin k) (ha : 0 < a.val) : Finset (Fin (k + 1)) := {⟨a.val - 1,by omega⟩,b.castSucc,c.succ} lemma m3_triangle_mem {k : ℕ} (E F : Finset (Fin k → ℕ)) (hshift : m3_shifted E) (hdiv : m3_shadow F ⊆ E) (a b c : Fin k) (hab : a ≤ b) (hbc : b ≤ c) (ha : 0 < a.val) (hF : m3_tripleVector a b c ∈ F) : m3_triangle a b c ha ∈ m3_triangles (m3_graph E) := by classical let a' : Fin k := ⟨a.val - 1,by omega⟩ let b' : Fin k := ⟨b.val - 1,by omega⟩ have haa : a' < a := by change a.val - 1 < a.val; omega have hbb : b' < b := by change b.val - 1 < b.val; omega have hab' : a' ≤ b' := by change a.val - 1 ≤ b.val - 1; omega have hap : a'.castSucc < b.castSucc := by change a.val - 1 < b.val; omega have hbc' : b.castSucc < c.succ := by change b.val < c.val + 1; omega have hp := m3_triple_parents E F hdiv a b c hF have h1 := m3_edge_mem_graph E a' b' hab' (m3_lower_pair_second E hshift a' b b' hbb.le (m3_lower_pair_first E hshift a b a' haa.le hp.1)) have h2 := m3_edge_mem_graph E a' c (haa.le.trans (hab.trans hbc)) (m3_lower_pair_first E hshift a c a' haa.le hp.2.1) have h3 := m3_edge_mem_graph E b c hbc hp.2.2 have heb : b'.succ = b.castSucc := by apply Fin.ext; change b.val - 1 + 1 = b.val; omega apply (m3_mem_triangles _ _).2 constructor · change ({a'.castSucc,b.castSucc,c.succ} : Finset (Fin (k + 1))).card = 3 simp [hap.ne,(hap.trans hbc').ne,hbc'.ne] · intro t ht have hpair := m3_triple_pairs a'.castSucc b.castSucc c.succ ht rcases Finset.mem_insert.1 hpair with he | ht · subst t simpa only [m3_edge,heb] using h1 rcases Finset.mem_insert.1 ht with he | ht · subst t exact h2 · have he := Finset.mem_singleton.1 ht subst t exact h3 noncomputable def m3_triangleMap {k : ℕ} (abc : Fin k × Fin k × Fin k) : Finset (Fin (k + 1)) := if ha : 0 < abc.1.val then m3_triangle abc.1 abc.2.1 abc.2.2 ha else ∅ lemma m3_triangleMap_inj {k : ℕ} (a b c d e f : Fin k) (hab : a ≤ b) (hbc : b ≤ c) (hde : d ≤ e) (hef : e ≤ f) (ha : 0 < a.val) (hd : 0 < d.val) (he : m3_triangleMap (a,b,c) = m3_triangleMap (d,e,f)) : a = d ∧ b = e ∧ c = f := by classical simp only [m3_triangleMap,dite_eq_left ha,dite_eq_left hd] at he let a' : Fin (k + 1) := ⟨a.val - 1,by omega⟩ let d' : Fin (k + 1) := ⟨d.val - 1,by omega⟩ have h := m3_tripleSet_inj a' b.castSucc c.succ d' e.castSucc f.succ (by change a.val - 1 < b.val; omega) (by change b.val < c.val + 1; omega) (by change d.val - 1 < e.val; omega) (by change e.val < f.val + 1; omega) he constructor · apply Fin.ext have hp := congrArg (fun z : Fin (k + 1) => z.val) h.1 change a.val - 1 = d.val - 1 at hp omega constructor · apply Fin.ext exact congrArg (fun z : Fin (k + 1) => z.val) h.2.1 · apply Fin.ext have hp := congrArg (fun z : Fin (k + 1) => z.val) h.2.2 simp only [Fin.val_succ] at hp omega theorem m3_inj {k : ℕ} (E F : Finset (Fin k → ℕ)) (hF : ∀ β ∈ F, m3_degree β = 3) (hshift : m3_shifted E) (hdiv : m3_shadow F ⊆ E) : F.card ≤ E.card + (m3_triangles (m3_graph E)).card := by classical let L := (m3_triples F).filter (fun abc => abc.1.val = 0) let H := (m3_triples F).filter (fun abc => ¬ abc.1.val = 0) have hL : L.card ≤ E.card := by apply Finset.card_le_card_of_injOn (fun abc : Fin k × Fin k × Fin k => m3_pairVector abc.2.1 abc.2.2) · intro abc habc have ht := (m3_mem_triples F abc.1 abc.2.1 abc.2.2).1 (Finset.mem_filter.1 habc).1 exact (m3_triple_parents E F hdiv abc.1 abc.2.1 abc.2.2 ht.2.2).2.2 · intro abc habc xyz hxyz he have ht := (m3_mem_triples F abc.1 abc.2.1 abc.2.2).1 (Finset.mem_filter.1 habc).1 have hu := (m3_mem_triples F xyz.1 xyz.2.1 xyz.2.2).1 (Finset.mem_filter.1 hxyz).1 have hp := m3_pairVector_sorted_inj abc.2.1 abc.2.2 xyz.2.1 xyz.2.2 ht.2.1 hu.2.1 he have ha : abc.1 = xyz.1 := by apply Fin.ext have h0 := (Finset.mem_filter.1 habc).2 have h1 := (Finset.mem_filter.1 hxyz).2 omega exact Prod.ext ha (Prod.ext hp.1 hp.2) have hH : H.card ≤ (m3_triangles (m3_graph E)).card := by apply Finset.card_le_card_of_injOn m3_triangleMap · intro abc habc have ht := (m3_mem_triples F abc.1 abc.2.1 abc.2.2).1 (Finset.mem_filter.1 habc).1 have h0 := (Finset.mem_filter.1 habc).2 have hp : 0 < abc.1.val := by omega simp only [m3_triangleMap,dite_eq_left hp] exact m3_triangle_mem E F hshift hdiv abc.1 abc.2.1 abc.2.2 ht.1 ht.2.1 hp ht.2.2 · intro abc habc xyz hxyz he have ht := (m3_mem_triples F abc.1 abc.2.1 abc.2.2).1 (Finset.mem_filter.1 habc).1 have hu := (m3_mem_triples F xyz.1 xyz.2.1 xyz.2.2).1 (Finset.mem_filter.1 hxyz).1 have h0 := (Finset.mem_filter.1 habc).2 have h1 := (Finset.mem_filter.1 hxyz).2 have hp := m3_triangleMap_inj abc.1 abc.2.1 abc.2.2 xyz.1 xyz.2.1 xyz.2.2 ht.1 ht.2.1 hu.1 hu.2.1 (by omega) (by omega) he exact Prod.ext hp.1 (Prod.ext hp.2.1 hp.2.2) have hcount := Finset.card_filter_add_card_filter_not (s := m3_triples F) (fun abc => abc.1.val = 0) have hc : L.card + H.card = F.card := by simpa only [L,H,m3_triples_card F hF] using hcount omega noncomputable def m3_incident {N : ℕ} (G : Finset (Finset (Fin N))) (v : Fin N) : Finset (Finset (Fin N)) := G.filter (fun e => v ∈ e) noncomputable def m3_delete {N : ℕ} (G : Finset (Finset (Fin N))) (v : Fin N) : Finset (Finset (Fin N)) := G.filter (fun e => v ∉ e) noncomputable def m3_neighbors {N : ℕ} (G : Finset (Finset (Fin N))) (v : Fin N) : Finset (Fin N) := Finset.univ.filter (fun w => w ≠ v ∧ ({v,w} : Finset (Fin N)) ∈ G) noncomputable def m3_support {N : ℕ} (G : Finset (Finset (Fin N))) : Finset (Fin N) := Finset.univ.filter (fun v => 0 < (m3_incident G v).card) lemma m3_mem_neighbors {N : ℕ} (G : Finset (Finset (Fin N))) (v w : Fin N) : w ∈ m3_neighbors G v ↔ w ≠ v ∧ ({v,w} : Finset (Fin N)) ∈ G := by classical simp [m3_neighbors] lemma m3_mem_support {N : ℕ} (G : Finset (Finset (Fin N))) (v : Fin N) : v ∈ m3_support G ↔ 0 < (m3_incident G v).card := by classical simp [m3_support] lemma m3_incident_pos {N : ℕ} (G : Finset (Finset (Fin N))) (v : Fin N) (e : Finset (Fin N)) (he : e ∈ G) (hv : v ∈ e) : 0 < (m3_incident G v).card := by classical exact Finset.card_pos.2 ⟨e,Finset.mem_filter.2 ⟨he,hv⟩⟩ lemma m3_neighbors_card {N : ℕ} (G : Finset (Finset (Fin N))) (hG : ∀ e ∈ G, e.card = 2) (v : Fin N) : (m3_neighbors G v).card = (m3_incident G v).card := by classical apply Finset.card_bij (fun w _ => ({v,w} : Finset (Fin N))) · intro w hw obtain ⟨hne,hmem⟩ := (m3_mem_neighbors G v w).1 hw exact Finset.mem_filter.2 ⟨hmem,by simp⟩ · intro w hw z hz he have hwv := ((m3_mem_neighbors G v w).1 hw).1 have hzv := ((m3_mem_neighbors G v z).1 hz).1 have hzmem : w = v ∨ w = z := by have hm : w ∈ ({v,w} : Finset (Fin N)) := by simp rw [he] at hm simpa using hm exact hzmem.resolve_left hwv · intro e he obtain ⟨heG,hve⟩ := Finset.mem_filter.1 he obtain ⟨a,b,hab,heq⟩ := Finset.card_eq_two.1 (hG e heG) rw [heq] at hve rcases Finset.mem_insert.1 hve with rfl | hve · exact ⟨b,(m3_mem_neighbors G v b).2 ⟨hab.symm,heq ▸ heG⟩,heq.symm⟩ · have hb := Finset.mem_singleton.1 hve subst b exact ⟨a,(m3_mem_neighbors G v a).2 ⟨hab,by simpa [heq,Finset.pair_comm] using heG⟩, by rw [heq,Finset.pair_comm]⟩ lemma m3_neighbor_support {N : ℕ} (G : Finset (Finset (Fin N))) (v w : Fin N) (hw : w ∈ m3_neighbors G v) : w ∈ m3_support G := by obtain ⟨_,he⟩ := (m3_mem_neighbors G v w).1 hw exact (m3_mem_support G w).2 (m3_incident_pos G w {v,w} he (by simp)) lemma m3_degree_support_bound {N : ℕ} (G : Finset (Finset (Fin N))) (hG : ∀ e ∈ G, e.card = 2) (v : Fin N) (hv : v ∈ m3_support G) : (m3_incident G v).card + 1 ≤ (m3_support G).card := by classical have hsub : insert v (m3_neighbors G v) ⊆ m3_support G := by intro w hw rcases Finset.mem_insert.1 hw with rfl | hw · exact hv · exact m3_neighbor_support G v w hw have hvn : v ∉ m3_neighbors G v := by simp [m3_neighbors] have h := Finset.card_le_card hsub rw [Finset.card_insert_of_notMem hvn,m3_neighbors_card G hG v] at h exact h lemma m3_handshake {N : ℕ} (G : Finset (Finset (Fin N))) (hG : ∀ e ∈ G, e.card = 2) : (∑ v ∈ m3_support G, (m3_incident G v).card) = 2 * G.card := by classical have hsum : (∑ v ∈ m3_support G, (m3_incident G v).card) = ∑ v : Fin N, (m3_incident G v).card := by apply Finset.sum_subset (Finset.filter_subset _ _) intro v hv hvn have hzero : ¬ 0 < (m3_incident G v).card := by intro hp exact hvn ((m3_mem_support G v).2 hp) omega rw [hsum] simp only [m3_incident,Finset.card_eq_sum_ones,Finset.sum_filter] rw [Finset.sum_comm] have he : ∀ e ∈ G, (∑ v : Fin N, if v ∈ e then (1 : ℕ) else 0) = 2 := by intro e he rw [← Finset.sum_filter] have hf : Finset.univ.filter (fun v => v ∈ e) = e := by ext v; simp rw [hf] simpa using hG e he rw [Finset.sum_congr rfl he] simp [Nat.mul_comm] lemma m3_min_degree {N : ℕ} (G : Finset (Finset (Fin N))) (hG : ∀ e ∈ G, e.card = 2) (s r : ℕ) (hr : r < s) (hcard : G.card = s.choose 2 + r) (hpos : 0 < G.card) : ∃ v : Fin N, 0 < (m3_incident G v).card ∧ (m3_incident G v).card < s := by classical have hsupp : (m3_support G).Nonempty := by obtain ⟨e,he⟩ := Finset.card_pos.1 hpos obtain ⟨v,hv⟩ := Finset.card_pos.1 (by rw [hG e he]; omega) exact ⟨v,(m3_mem_support G v).2 (m3_incident_pos G v e he hv)⟩ obtain ⟨v,hv,hmin⟩ := Finset.exists_min_image (m3_support G) (fun v => (m3_incident G v).card) hsupp refine ⟨v,(m3_mem_support G v).1 hv,?_⟩ by_contra hn have hs : s ≤ (m3_incident G v).card := by omega have hsize : s + 1 ≤ (m3_support G).card := (Nat.add_le_add_right hs 1).trans (m3_degree_support_bound G hG v hv) have hsum : s * (m3_support G).card ≤ ∑ w ∈ m3_support G, (m3_incident G w).card := by have h := Finset.sum_le_sum (s := m3_support G) (f := fun _ => s) (g := fun w => (m3_incident G w).card) (fun w hw => hs.trans (hmin w hw)) simpa [Nat.mul_comm] using h rw [m3_handshake G hG,hcard] at hsum have hmul := Nat.mul_le_mul_left s hsize have htwo := w23_choose_two_self s nlinarith lemma m3_delete_card {N : ℕ} (G : Finset (Finset (Fin N))) (v : Fin N) : (m3_incident G v).card + (m3_delete G v).card = G.card := by classical exact Finset.card_filter_add_card_filter_not (s := G) (fun e => v ∈ e) lemma m3_triangles_small {N : ℕ} (G : Finset (Finset (Fin N))) (hG : G.card ≤ 2) : m3_triangles G = ∅ := by classical apply Finset.eq_empty_iff_forall_notMem.2 intro t ht obtain ⟨htc,htp⟩ := (m3_mem_triangles G t).1 ht have h := Finset.card_le_card htp rw [Finset.card_powersetCard,htc] at h norm_num at h omega lemma m3_triangle_parent_neighbors {N : ℕ} (G : Finset (Finset (Fin N))) (v : Fin N) (t : Finset (Fin N)) (ht : t ∈ m3_triangles G) (hv : v ∈ t) : t.erase v ∈ (m3_neighbors G v).powersetCard 2 := by classical obtain ⟨htc,htp⟩ := (m3_mem_triangles G t).1 ht apply Finset.mem_powersetCard.2 constructor · intro w hw obtain ⟨hwv,hwt⟩ := Finset.mem_erase.1 hw apply (m3_mem_neighbors G v w).2 refine ⟨hwv,htp ?_⟩ apply Finset.mem_powersetCard.2 constructor · intro z hz rcases Finset.mem_insert.1 hz with rfl | hz · exact hv · exact (Finset.mem_singleton.1 hz) ▸ hwt · simp [hwv.symm] · rw [Finset.card_erase_of_mem hv,htc] lemma m3_triangle_avoids_delete {N : ℕ} (G : Finset (Finset (Fin N))) (v : Fin N) (t : Finset (Fin N)) (ht : t ∈ m3_triangles G) (hv : v ∉ t) : t ∈ m3_triangles (m3_delete G v) := by classical obtain ⟨htc,htp⟩ := (m3_mem_triangles G t).1 ht apply (m3_mem_triangles _ _).2 refine ⟨htc,?_⟩ intro e he apply Finset.mem_filter.2 refine ⟨htp he,?_⟩ intro hve exact hv ((Finset.mem_powersetCard.1 he).1 hve) lemma m3_triangles_delete_le {N : ℕ} (G : Finset (Finset (Fin N))) (hG : ∀ e ∈ G, e.card = 2) (v : Fin N) : (m3_triangles G).card ≤ (m3_triangles (m3_delete G v)).card + ((m3_incident G v).card).choose 2 := by classical let A := (m3_triangles G).filter (fun t => v ∈ t) let B := (m3_triangles G).filter (fun t => v ∉ t) have hA : A.card ≤ ((m3_neighbors G v).powersetCard 2).card := by apply Finset.card_le_card_of_injOn (fun t => t.erase v) · intro t ht obtain ⟨htT,hvt⟩ := Finset.mem_filter.1 ht exact m3_triangle_parent_neighbors G v t htT hvt · intro t ht u hu he have hvt := (Finset.mem_filter.1 ht).2 have hvu := (Finset.mem_filter.1 hu).2 change t.erase v = u.erase v at he rw [← Finset.insert_erase hvt,← Finset.insert_erase hvu,he] have hB : B.card ≤ (m3_triangles (m3_delete G v)).card := by apply Finset.card_le_card intro t ht obtain ⟨htT,hvt⟩ := Finset.mem_filter.1 ht exact m3_triangle_avoids_delete G v t htT hvt have hcount : A.card + B.card = (m3_triangles G).card := Finset.card_filter_add_card_filter_not (s := m3_triangles G) (fun t => v ∈ t) rw [Finset.card_powersetCard,m3_neighbors_card G hG v] at hA omega lemma m3_triangle_arith_same (s r d : ℕ) (hdr : d ≤ r) : s.choose 3 + (r - d).choose 2 + d.choose 2 ≤ s.choose 3 + r.choose 2 := by have h0 := w23_choose_two_self (r - d) have h1 := w23_choose_two_self d have h2 := w23_choose_two_self r have he : r - d + d = r := by omega nlinarith lemma m3_choose_two_split (M r d : ℕ) (hrd : r ≤ d) (hdM : d ≤ M) : (M + r - d).choose 2 + d.choose 2 ≤ M.choose 2 + r.choose 2 := by let a := d - r let b := M - d have hd : d = r + a := by dsimp [a]; omega have hM : M = r + a + b := by dsimp [a,b]; omega have ht : M + r - d = r + b := by omega rw [ht,hd,hM] have h0 := w23_choose_two_self (r + b) have h1 := w23_choose_two_self (r + a) have h2 := w23_choose_two_self (r + a + b) have h3 := w23_choose_two_self r have hm : 0 ≤ a * b := Nat.zero_le _ nlinarith only [h0,h1,h2,h3,hm] lemma m3_triangle_arith_prev (s r d : ℕ) (hs : 2 ≤ s) (hrd : r < d) (hds : d < s) : (s - 1).choose 3 + (s - 1 + r - d).choose 2 + d.choose 2 ≤ s.choose 3 + r.choose 2 := by have hsplit := m3_choose_two_split (s - 1) r d (by omega) (by omega) have hp := Nat.choose_succ_succ' (s - 1) 2 change (s - 1 + 1).choose 3 = (s - 1).choose 2 + (s - 1).choose 3 at hp rw [show s - 1 + 1 = s by omega] at hp omega theorem m3_triangle_bound_aux (n : ℕ) : ∀ (N : ℕ) (G : Finset (Finset (Fin N))), (∀ e ∈ G, e.card = 2) → ∀ s r : ℕ, r < s → G.card = s.choose 2 + r → G.card = n → (m3_triangles G).card ≤ s.choose 3 + r.choose 2 := by induction n using Nat.strong_induction_on with | h n ih => intro N G hG s r hr hcard hn by_cases hzero : G.card = 0 · rw [m3_triangles_small G (by omega),Finset.card_empty] exact Nat.zero_le _ obtain ⟨v,hdp,hds⟩ := m3_min_degree G hG s r hr hcard (by omega) let d := (m3_incident G v).card have hd : d + (m3_delete G v).card = G.card := m3_delete_card G v have hlt : (m3_delete G v).card < n := by omega have hGdel : ∀ e ∈ m3_delete G v, e.card = 2 := by intro e he exact hG e (Finset.mem_filter.1 he).1 have hT := m3_triangles_delete_le G hG v by_cases hdr : d ≤ r · have hcarddel : (m3_delete G v).card = s.choose 2 + (r - d) := by omega have hsmall := ih (m3_delete G v).card hlt N (m3_delete G v) hGdel s (r - d) (by omega) hcarddel rfl exact hT.trans ((Nat.add_le_add_right hsmall (d.choose 2)).trans (m3_triangle_arith_same s r d hdr)) · have hs : 2 ≤ s := by omega have hp := Nat.choose_succ_succ' (s - 1) 1 change (s - 1 + 1).choose 2 = (s - 1).choose 1 + (s - 1).choose 2 at hp rw [show s - 1 + 1 = s by omega,Nat.choose_one_right] at hp have hcarddel : (m3_delete G v).card = (s - 1).choose 2 + (s - 1 + r - d) := by omega have hsmall := ih (m3_delete G v).card hlt N (m3_delete G v) hGdel (s - 1) (s - 1 + r - d) (by omega) hcarddel rfl exact hT.trans ((Nat.add_le_add_right hsmall (d.choose 2)).trans (m3_triangle_arith_prev s r d hs (by omega) hds)) theorem m3_triangle_bound {N : ℕ} (G : Finset (Finset (Fin N))) (hG : ∀ e ∈ G, e.card = 2) (s r : ℕ) (hr : r < s) (hcard : G.card = s.choose 2 + r) : (m3_triangles G).card ≤ s.choose 3 + r.choose 2 := m3_triangle_bound_aux G.card N G hG s r hr hcard rfl theorem m3_multicomplex_bound {k : ℕ} (E F : Finset (Fin k → ℕ)) (x y : ℕ) (hE : ∀ α ∈ E, m3_degree α = 2) (hF : ∀ β ∈ F, m3_degree β = 3) (hdiv : m3_shadow F ⊆ E) (hy : y < x) (he : E.card = x.choose 2 + y) : F.card ≤ (x + 1).choose 3 + (y + 1).choose 2 := by obtain ⟨E',F',hE',hF',hshift',hdiv',he',hf'⟩ := m3_compress E F hE hF hdiv have hI := m3_inj E' F' hF' hshift' hdiv' have hG := m3_triangle_bound (m3_graph E') (m3_graph_sized E') x y hy ((m3_graph_card E' hE').trans (he'.trans he)) rw [hf',he',he] at hI have hp := m3_pascal_assemble x y omega theorem w23_M3_proof : W23_M3 := by apply w23_M3_of_multicomplex intro k E F x y hE hF hdiv hy he exact m3_multicomplex_bound E F x y hE hF hdiv hy he -- Weighted-shadow proof adapted from T01; deficit and arithmetic proofs from T07. theorem n4_parent_injective {k : ℕ} (i : Fin k) {x y : Fin k → ℕ} (hx : 0 < x i) (hy : 0 < y i) (h : Function.update x i (x i - 1) = Function.update y i (y i - 1)) : x = y := by funext j by_cases hji : j = i · subst j have he := congrFun h i simp at he omega · have he := congrFun h j simpa [Function.update, hji] using he theorem n4_weighted_shadow {k r : ℕ} (B C : Finset (Fin k → ℕ)) (hB : ∀ a ∈ B, (∑ i : Fin k, a i) = r) (hC : ∀ b ∈ C, (∑ i : Fin k, b i) = r + 1) (hdiv : ∀ b ∈ C, ∀ i : Fin k, 0 < b i → Function.update b i (b i - 1) ∈ B) : (r + 1) * C.card ≤ (k + r) * B.card := by classical have hcoord : ∀ i : Fin k, (∑ b ∈ C, b i) ≤ ∑ a ∈ B, (a i + 1) := by intro i let T := C.filter (fun b => 0 < b i) have hfilter : (∑ b ∈ C, b i) = ∑ b ∈ T, b i := by symm apply Finset.sum_subset (Finset.filter_subset _ _) intro b hb hbt have : ¬ 0 < b i := by intro hi exact hbt (Finset.mem_filter.mpr ⟨hb, hi⟩) omega rw [hfilter] apply Finset.sum_le_sum_of_injOn (fun b => Function.update b i (b i - 1)) · intro x hx y hy hxy exact n4_parent_injective i (Finset.mem_filter.mp hx).2 (Finset.mem_filter.mp hy).2 hxy · intro a ha obtain ⟨b, hb, rfl⟩ := Finset.mem_image.mp ha have hb' := Finset.mem_filter.mp hb exact hdiv b hb'.1 i hb'.2 · intro b hb have hb' := (Finset.mem_filter.mp hb).2 simp omega · intro a ha hnot exact Nat.zero_le _ have hsum : (∑ b ∈ C, ∑ i : Fin k, b i) ≤ ∑ a ∈ B, ∑ i : Fin k, (a i + 1) := by calc (∑ b ∈ C, ∑ i : Fin k, b i) = ∑ i : Fin k, ∑ b ∈ C, b i := Finset.sum_comm _ ≤ ∑ i : Fin k, ∑ a ∈ B, (a i + 1) := Finset.sum_le_sum (fun i _ => hcoord i) _ = ∑ a ∈ B, ∑ i : Fin k, (a i + 1) := Finset.sum_comm have hleft : (∑ b ∈ C, ∑ i : Fin k, b i) = (r + 1) * C.card := by rw [Finset.sum_congr rfl (fun b hb => hC b hb)] simp [Nat.mul_comm] have hright : (∑ a ∈ B, ∑ i : Fin k, (a i + 1)) = (k + r) * B.card := by have he : ∀ a ∈ B, (∑ i : Fin k, (a i + 1)) = k + r := by intro a ha rw [Finset.sum_add_distrib, hB a ha] simp [Nat.add_comm] rw [Finset.sum_congr rfl he] simp [Nat.mul_comm] rwa [hleft, hright] at hsum theorem n4_no_first_level_count_bound (r s b u v t p rho : ℕ) (hpair : 2 * (b + u) ≤ r * (r + 1)) (hmixed : v ≤ r * s) (hshadow : 3 * t ≤ (r + 2) * b) (hdeficit : b + v + t ≤ rho) : 4 * (b + u + v + t) + p * (2 * r + s + b) + s * (s + 1 + b) ≤ (1 + r + s + p) * (2 * r + s + b) + rho := by nlinarith theorem n4_wilf_of_no_first_level_counts (S : NumericalSemigroup) (r s b u v t p rho : ℕ) (hpair : 2 * (b + u) ≤ r * (r + 1)) (hmixed : v ≤ r * s) (hshadow : 3 * t ≤ (r + 2) * b) (hdeficit : b + v + t ≤ rho) (he : S.embeddingDimension = 1 + r + s + p) (hleft : S.leftCount = 4 + 2 * r + s + b) (hm : S.multiplicity = S.embeddingDimension + (b + u + v + t)) (hc : S.conductor + rho = 4 * S.multiplicity) : S.SatisfiesWilf := by have hbound := n4_no_first_level_count_bound r s b u v t p rho hpair hmixed hshadow hdeficit have hp : 0 ≤ p * (2 * r + s + b) := Nat.zero_le _ have hs : 0 ≤ s * (s + 1 + b) := Nat.zero_le _ unfold NumericalSemigroup.SatisfiesWilf nlinarith lemma n4_downward_carry_residue (m rho x y : ℕ) (_hm : 0 < m) (hdrop : (x + rho) / m + (y + rho) / m = (x + y + rho) / m + 1) : m - rho ≤ (x + y + rho) % m := by have hmul := congrArg (fun k : ℕ => m * k) hdrop have hx := Nat.mod_add_div (x + rho) m have hy := Nat.mod_add_div (y + rho) m have hz := Nat.mod_add_div (x + y + rho) m have hid : (x + y + rho) % m + rho = m + (x + rho) % m + (y + rho) % m := by nlinarith omega theorem n4_deficit_card_bound (A : Finset ℕ) (m rho : ℕ) (hm : 0 < m) (hrho : rho ≤ m) (hinj : Set.InjOn (fun z : ℕ => (z + rho) % m) (A : Set ℕ)) (hcarry : ∀ z ∈ A, ∃ x y : ℕ, z = x + y ∧ (x + rho) / m + (y + rho) / m = (z + rho) / m + 1) : A.card ≤ rho := by classical have himg : (A.image (fun z : ℕ => (z + rho) % m)).card = A.card := Finset.card_image_of_injOn hinj have hsub : A.image (fun z : ℕ => (z + rho) % m) ⊆ Finset.Ico (m - rho) m := by intro a ha obtain ⟨z, hz, rfl⟩ := Finset.mem_image.mp ha obtain ⟨x, y, hxy, hdrop⟩ := hcarry z hz subst z exact Finset.mem_Ico.mpr ⟨n4_downward_carry_residue m rho x y hm hdrop, Nat.mod_lt _ hm⟩ have hcard : (Finset.Ico (m - rho) m).card = rho := by simp omega have hbound := Finset.card_le_card hsub rwa [himg, hcard] at hbound lemma n4_shift_residue_inj (A : Finset ℕ) (m rho : ℕ) (hinj : Set.InjOn (fun z : ℕ => z % m) (A : Set ℕ)) : Set.InjOn (fun z : ℕ => (z + rho) % m) (A : Set ℕ) := by intro x hx y hy hxy exact hinj hx hy (Nat.ModEq.add_right_cancel' rho hxy) theorem n4_deficit_card_bound_of_residue_inj (A : Finset ℕ) (m rho : ℕ) (hm : 0 < m) (hrho : rho ≤ m) (hinj : Set.InjOn (fun z : ℕ => z % m) (A : Set ℕ)) (hcarry : ∀ z ∈ A, ∃ x y : ℕ, z = x + y ∧ (x + rho) / m + (y + rho) / m = (z + rho) / m + 1) : A.card ≤ rho := by exact n4_deficit_card_bound A m rho hm hrho (n4_shift_residue_inj A m rho hinj) hcarry lemma n4_level_ge_two (S : NumericalSemigroup) (hX1 : w23_X S 1 = ∅) {x : ℕ} (hx : x ∈ w23_apery S) (hp : 0 < x) : 2 ≤ w23_level S x := by have hl := w23_level_pos_of_mem S ((w23_mem_apery S x).1 hx).2.1 hp have hn : w23_level S x ≠ 1 := by intro he have hm := (w23_mem_X S 1 x).2 ⟨hx,he⟩ rw [hX1] at hm exact Finset.notMem_empty x hm omega lemma n4_X_two_eq_P (S : NumericalSemigroup) (hX1 : w23_X S 1 = ∅) : w23_X S 2 = w23_P S 2 := by have hb : w23_B S = ∅ := by simp [w23_B,hX1] simpa [hb] using w23_X_two_partition S lemma n4_Z_subset_two (S : NumericalSemigroup) (hX1 : w23_X S 1 = ∅) : w23_Z S ⊆ w23_X S 2 + w23_X S 2 := by classical intro x hx obtain ⟨hx3,hn⟩ := Finset.mem_filter.1 hx obtain ⟨hxa,hxl⟩ := (w23_mem_X S 3 x).1 hx3 obtain ⟨y,z,hy,hz,hyp,hzp,he,hle,hge,hyl,hzl,_⟩ := w23_apery_split_levels S hxa hn (w23_X_pos S (by omega) hx3) have hy2 := n4_level_ge_two S hX1 hy hyp have hz2 := n4_level_ge_two S hX1 hz hzp have hyy : w23_level S y = 2 := by omega have hzz : w23_level S z = 2 := by omega exact Finset.mem_add.2 ⟨y,(w23_mem_X S 2 y).2 ⟨hy,hyy⟩, z,(w23_mem_X S 2 z).2 ⟨hz,hzz⟩,he.symm⟩ noncomputable def n4_right (S : NumericalSemigroup) : Finset ℕ := by classical exact (w23_X S 4).filter (fun x => ¬ S.IsPrimitive x) noncomputable def n4_triples (S : NumericalSemigroup) : Finset ℕ := n4_right S ∩ (w23_X S 2 + w23_X S 2 + w23_X S 2) noncomputable def n4_mixed (S : NumericalSemigroup) : Finset ℕ := (n4_right S \ n4_triples S) ∩ (w23_X S 2 + w23_P S 3) noncomputable def n4_pairs (S : NumericalSemigroup) : Finset ℕ := (n4_right S \ n4_triples S) \ n4_mixed S lemma n4_right_subset (S : NumericalSemigroup) (hX1 : w23_X S 1 = ∅) : n4_right S ⊆ ((w23_X S 2 + w23_X S 2) ∪ (w23_X S 2 + w23_P S 3)) ∪ (w23_X S 2 + w23_X S 2 + w23_X S 2) := by classical intro x hx obtain ⟨hx4,hn⟩ := Finset.mem_filter.1 hx obtain ⟨hxa,hxl⟩ := (w23_mem_X S 4 x).1 hx4 obtain ⟨y,z,hy,hz,hyp,hzp,he,hle,hge,hyl,hzl,_⟩ := w23_apery_split_levels S hxa hn (w23_X_pos S (by omega) hx4) have hy2 := n4_level_ge_two S hX1 hy hyp have hz2 := n4_level_ge_two S hX1 hz hzp have hcases : (w23_level S y = 2 ∧ w23_level S z = 2) ∨ (w23_level S y = 2 ∧ w23_level S z = 3) ∨ (w23_level S y = 3 ∧ w23_level S z = 2) := by omega have h23 : ∀ a d, a ∈ w23_X S 2 → d ∈ w23_X S 3 → x = a + d → x ∈ ((w23_X S 2 + w23_X S 2) ∪ (w23_X S 2 + w23_P S 3)) ∪ (w23_X S 2 + w23_X S 2 + w23_X S 2) := by intro a d ha hd hed by_cases hp : S.IsPrimitive d · exact Finset.mem_union.2 (Or.inl (Finset.mem_union.2 (Or.inr (Finset.mem_add.2 ⟨a,ha,d,(w23_mem_P S 3 d).2 ⟨hp,((w23_mem_X S 3 d).1 hd).2⟩,hed.symm⟩)))) · have hzsum := n4_Z_subset_two S hX1 (Finset.mem_filter.2 ⟨hd,hp⟩) obtain ⟨u,hu,v,hv,huv⟩ := Finset.mem_add.1 hzsum apply Finset.mem_union.2 right exact Finset.mem_add.2 ⟨a+u,Finset.add_mem_add ha hu,v,hv,by omega⟩ rcases hcases with ⟨hyy,hzz⟩ | ⟨hyy,hzz⟩ | ⟨hyy,hzz⟩ · exact Finset.mem_union.2 (Or.inl (Finset.mem_union.2 (Or.inl (Finset.mem_add.2 ⟨y,(w23_mem_X S 2 y).2 ⟨hy,hyy⟩, z,(w23_mem_X S 2 z).2 ⟨hz,hzz⟩,he.symm⟩)))) · exact h23 y z ((w23_mem_X S 2 y).2 ⟨hy,hyy⟩) ((w23_mem_X S 3 z).2 ⟨hz,hzz⟩) he · exact h23 z y ((w23_mem_X S 2 z).2 ⟨hz,hzz⟩) ((w23_mem_X S 3 y).2 ⟨hy,hyy⟩) (by omega) lemma n4_pairs_subset (S : NumericalSemigroup) (hX1 : w23_X S 1 = ∅) : n4_pairs S ⊆ w23_X S 2 + w23_X S 2 := by classical intro x hx obtain ⟨hx0,hxm⟩ := Finset.mem_sdiff.1 hx obtain ⟨hxr,hxt⟩ := Finset.mem_sdiff.1 hx0 have hsub := n4_right_subset S hX1 hxr rcases Finset.mem_union.1 hsub with hp | ht · rcases Finset.mem_union.1 hp with hp | hm · exact hp · exact False.elim (hxm (Finset.mem_inter.2 ⟨Finset.mem_sdiff.2 ⟨hxr,hxt⟩,hm⟩)) · exact False.elim (hxt (Finset.mem_inter.2 ⟨hxr,ht⟩)) lemma n4_triples_shadow (S : NumericalSemigroup) : ∀ x ∈ n4_triples S, ∀ a ∈ w23_X S 2, ∀ z ∈ w23_X S 2 + w23_X S 2, x = a + z → z ∈ w23_Z S := by classical intro x hx a ha z hz he have hx4 := (Finset.mem_filter.1 (Finset.mem_inter.1 hx).1).1 have hxa := ((w23_mem_X S 4 x).1 hx4).1 have hal := ((w23_mem_X S 2 a).1 ha).2 have haS := ((w23_mem_apery S a).1 ((w23_mem_X S 2 a).1 ha).1).2.1 obtain ⟨u,hu,v,hv,huv⟩ := Finset.mem_add.1 hz have huS := ((w23_mem_apery S u).1 ((w23_mem_X S 2 u).1 hu).1).2.1 have hvS := ((w23_mem_apery S v).1 ((w23_mem_X S 2 v).1 hv).1).2.1 have hzS : z ∈ S.carrier := by rw [← huv]; exact S.carrier.add_mem huS hvS have hza := w23_apery_closed S hxa hzS haS (by omega) have hzl := w23_le_level_add S u v rw [huv,((w23_mem_X S 2 u).1 hu).2,((w23_mem_X S 2 v).1 hv).2] at hzl have hzup := w23_level_add_ge_of_mem S z haS (w23_X_pos S (by omega) ha) rw [Nat.add_comm z a,← he,((w23_mem_X S 4 x).1 hx4).2] at hzup have hz3 : w23_level S z = 3 := by omega refine Finset.mem_filter.2 ⟨(w23_mem_X S 3 z).2 ⟨hza,hz3⟩,?_⟩ intro hp have hh := hp.2.2 u v huS hvS huv.symm have hup := w23_X_pos S (by omega) hu have hvp := w23_X_pos S (by omega) hv omega lemma n4_right_card_partition (S : NumericalSemigroup) : (n4_pairs S).card + (n4_mixed S).card + (n4_triples S).card = (n4_right S).card := by have ht : n4_triples S ⊆ n4_right S := Finset.inter_subset_left have hm : n4_mixed S ⊆ n4_right S \ n4_triples S := Finset.inter_subset_left have h1 := Finset.card_sdiff_add_card_eq_card ht have h2 := Finset.card_sdiff_add_card_eq_card hm change (n4_pairs S).card + (n4_mixed S).card = _ at h2 omega lemma n4_Z_disjoint_right (S : NumericalSemigroup) : Disjoint (w23_Z S) (n4_right S) := by classical apply Finset.disjoint_left.2 intro x hx hy have h3 := ((w23_mem_X S 3 x).1 (Finset.mem_filter.1 hx).1).2 have h4 := ((w23_mem_X S 4 x).1 (Finset.mem_filter.1 hy).1).2 omega lemma n4_pair_bound (S : NumericalSemigroup) (hX1 : w23_X S 1 = ∅) : 2 * ((w23_Z S).card + (n4_pairs S).card) ≤ (w23_X S 2).card * ((w23_X S 2).card + 1) := by classical have hsub : w23_Z S ∪ n4_pairs S ⊆ w23_X S 2 + w23_X S 2 := by intro x hx rcases Finset.mem_union.1 hx with hz | hp · exact n4_Z_subset_two S hX1 hz · exact n4_pairs_subset S hX1 hp have hdis : Disjoint (w23_Z S) (n4_pairs S) := (n4_Z_disjoint_right S).mono_right (by intro x hx exact (Finset.mem_sdiff.1 (Finset.mem_sdiff.1 hx).1).1) have hcard := (Finset.card_le_card hsub).trans (w23_card_two_add_le (w23_X S 2)) rw [Finset.card_union_of_disjoint hdis] at hcard have hmul := Nat.mul_le_mul_left 2 hcard rw [w23_choose_two_mul] at hmul exact hmul lemma n4_mixed_bound (S : NumericalSemigroup) : (n4_mixed S).card ≤ (w23_X S 2).card * (w23_P S 3).card := (Finset.card_le_card (Finset.inter_subset_right : n4_mixed S ⊆ w23_X S 2 + w23_P S 3)).trans (w23_card_add_le _ _) lemma n4_triples_bound (S : NumericalSemigroup) (hX1 : w23_X S 1 = ∅) : 3 * (n4_triples S).card ≤ ((w23_X S 2).card + 2) * (w23_Z S).card := by obtain ⟨E,F,hE,hF,hdiv,he,hf⟩ := m3_reduce (w23_X S 2) (w23_Z S) (n4_triples S) (n4_Z_subset_two S hX1) Finset.inter_subset_right (n4_triples_shadow S) have h := n4_weighted_shadow (r := 2) E F hE hF (by intro β hβ i hi apply hdiv exact (m3_mem_shadow F _).2 ⟨β,hβ,i,hi,rfl⟩) rwa [he,hf] at h lemma n4_deficit_bound (S : NumericalSemigroup) (hX1 : w23_X S 1 = ∅) : (w23_Z S).card + (n4_mixed S).card + (n4_triples S).card ≤ w23_rho S := by classical let K := (w23_Z S ∪ n4_mixed S) ∪ n4_triples S have hmR : n4_mixed S ⊆ n4_right S := by intro x hx exact (Finset.mem_sdiff.1 (Finset.mem_inter.1 hx).1).1 have htR : n4_triples S ⊆ n4_right S := Finset.inter_subset_left have hbm : Disjoint (w23_Z S) (n4_mixed S) := (n4_Z_disjoint_right S).mono_right hmR have hbt : Disjoint (w23_Z S) (n4_triples S) := (n4_Z_disjoint_right S).mono_right htR have hmt : Disjoint (n4_mixed S) (n4_triples S) := by apply Finset.disjoint_left.2 intro x hx ht exact (Finset.mem_sdiff.1 (Finset.mem_inter.1 hx).1).2 ht have hcard : K.card = (w23_Z S).card + (n4_mixed S).card + (n4_triples S).card := by dsimp [K] rw [Finset.card_union_of_disjoint (Finset.disjoint_union_left.2 ⟨hbt,hmt⟩), Finset.card_union_of_disjoint hbm] have haper : K ⊆ w23_apery S := by intro x hx rcases Finset.mem_union.1 hx with hb | ht · rcases Finset.mem_union.1 hb with hb | hm · exact ((w23_mem_X S 3 x).1 (Finset.mem_filter.1 hb).1).1 · exact ((w23_mem_X S 4 x).1 (Finset.mem_filter.1 (hmR hm)).1).1 · exact ((w23_mem_X S 4 x).1 (Finset.mem_filter.1 (htR ht)).1).1 have hcarry : ∀ x ∈ K, ∃ y z : ℕ, x = y + z ∧ w23_level S y + w23_level S z = w23_level S x + 1 := by intro x hx rcases Finset.mem_union.1 hx with hb | ht · rcases Finset.mem_union.1 hb with hb | hm · obtain ⟨y,hy,z,hz,he⟩ := Finset.mem_add.1 (n4_Z_subset_two S hX1 hb) refine ⟨y,z,he.symm,?_⟩ rw [((w23_mem_X S 2 y).1 hy).2,((w23_mem_X S 2 z).1 hz).2, ((w23_mem_X S 3 x).1 (Finset.mem_filter.1 hb).1).2] · obtain ⟨y,hy,z,hz,he⟩ := Finset.mem_add.1 (Finset.mem_inter.1 hm).2 refine ⟨y,z,he.symm,?_⟩ rw [((w23_mem_X S 2 y).1 hy).2,((w23_mem_P S 3 z).1 hz).2, ((w23_mem_X S 4 x).1 (Finset.mem_filter.1 (hmR hm)).1).2] · obtain ⟨z,hz,y,hy,he⟩ := Finset.mem_add.1 (Finset.mem_inter.1 ht).2 have hzB := n4_triples_shadow S x ht y hy z hz (by omega) refine ⟨y,z,by omega,?_⟩ rw [((w23_mem_X S 2 y).1 hy).2, ((w23_mem_X S 3 z).1 (Finset.mem_filter.1 hzB).1).2, ((w23_mem_X S 4 x).1 (Finset.mem_filter.1 (htR ht)).1).2] have h := n4_deficit_card_bound_of_residue_inj K S.multiplicity (w23_rho S) S.multiplicity_pos (Nat.le_of_lt (w23_rho_lt S)) (by intro x hx y hy he; exact w23_apery_residue_inj S (haper hx) (haper hy) he) hcarry rwa [hcard] at h lemma n4_X_primitive_eq_P (S : NumericalSemigroup) (i : ℕ) (hi : 2 ≤ i) : @Finset.filter ℕ S.IsPrimitive (Classical.decPred _) (w23_X S i) = w23_P S i := by classical ext x simp only [Finset.mem_filter,w23_mem_X,w23_mem_P] constructor · rintro ⟨⟨hx,hl⟩,hp⟩ exact ⟨hp,hl⟩ · rintro ⟨hp,hl⟩ refine ⟨⟨w23_primitive_mem_apery S hp ?_,hl⟩,hp⟩ intro he rw [he,w23_level_multiplicity] at hl omega lemma n4_counts (S : NumericalSemigroup) (hq : w23_q S = 4) (hX1 : w23_X S 1 = ∅) : w23_n S = 1 + (w23_X S 2).card + (w23_P S 3).card ∧ S.leftCount = 4 + 2 * (w23_X S 2).card + (w23_P S 3).card + (w23_Z S).card ∧ (w23_D S).card = 1 + (w23_X S 2).card + (w23_P S 3).card + (w23_Z S).card + (n4_pairs S).card + (n4_mixed S).card + (n4_triples S).card := by classical have h2 := n4_X_two_eq_P S hX1 have ha1 := w23_alpha_one S change (w23_X S 1).card + 1 = (w23_P S 1).card at ha1 rw [hX1,Finset.card_empty] at ha1 have ha3 := Finset.card_filter_add_card_filter_not (s := w23_X S 3) S.IsPrimitive rw [n4_X_primitive_eq_P S 3 (by omega)] at ha3 change (w23_P S 3).card + (w23_Z S).card = (w23_X S 3).card at ha3 have hn := w23_n_eq_sum S change w23_n S = ∑ i ∈ Finset.range (w23_q S), (w23_P S i).card at hn rw [hq] at hn norm_num [Finset.sum_range_succ,w23_P_zero] at hn have hl := w23_leftCount_eq S rw [hq] at hl norm_num [Finset.sum_range_succ,w23_alpha,w23_X_zero,hX1] at hl have hmc : S.multiplicity < S.conductor := by have hb := (w23_q_bounds S).1 rw [hq] at hb omega have hd := w23_D_card_eq S hmc rw [hq] at hd have hreq : (@Finset.filter ℕ (fun x => ¬ S.IsPrimitive x) (Classical.decPred _) (w23_X S 4)) = n4_right S := by ext x simp [n4_right] rw [hreq] at hd norm_num [Finset.sum_range_succ,w23_alpha,w23_X_zero,hX1] at hd have hr := n4_right_card_partition S rw [← h2] at hn exact ⟨by omega,by omega,by omega⟩ theorem w23_q4_of_X1_empty (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (hX1 : w23_X S 1 = ∅) : S.SatisfiesWilf := by have hq := w23_q_eq_four S h1 h2 obtain ⟨hn,hl,hd⟩ := n4_counts S hq hX1 have h := n4_no_first_level_count_bound (w23_X S 2).card (w23_P S 3).card (w23_Z S).card (n4_pairs S).card (n4_mixed S).card (n4_triples S).card 0 (w23_rho S) (n4_pair_bound S hX1) (n4_mixed_bound S) (n4_triples_bound S hX1) (n4_deficit_bound S hX1) apply w23_wilf_of_W0 rw [hq,hn,hl,hd] nlinarith theorem t11_below_two_m_primitive (S : NumericalSemigroup) (x : ℕ) (hx : x ∈ S.carrier) (hpos : 0 < x) (hlt : x < 2 * S.multiplicity) : S.IsPrimitive x := by refine ⟨hx, hpos, ?_⟩ intro a b ha hb heq by_cases ha0 : a = 0 · exact Or.inl ha0 by_cases hb0 : b = 0 · exact Or.inr hb0 have hma := S.multiplicity_le (by omega : 0 < a) ha have hmb := S.multiplicity_le (by omega : 0 < b) hb omega noncomputable def t11_erasePrimitive (S : NumericalSemigroup) (g : ℕ) (hg : S.IsPrimitive g) : NumericalSemigroup where carrier := { carrier := {x | x ∈ S.carrier ∧ x ≠ g} zero_mem' := ⟨S.carrier.zero_mem, by have := hg.2.1; omega⟩ add_mem' := by intro a b ha hb refine ⟨S.carrier.add_mem ha.1 hb.1, ?_⟩ intro heq rcases hg.2.2 a b ha.1 hb.1 heq.symm with h | h · exact hb.2 (by omega) · exact ha.2 (by omega) } finite_gaps := by apply (S.finite_gaps.union (Set.finite_singleton g)).subset intro x hx change ¬(x ∈ S.carrier ∧ x ≠ g) at hx change x ∉ S.carrier ∨ x = g by_cases hmem : x ∈ S.carrier · exact Or.inr (by by_contra hne; exact hx ⟨hmem, hne⟩) · exact Or.inl hmem proper := by intro heq have hmem : g ∈ S.carrier ∧ g ≠ g := Eq.mpr (congrArg (fun M : AddSubmonoid ℕ => g ∈ M) heq) (AddSubmonoid.mem_top g) exact hmem.2 rfl theorem t11_mem_erasePrimitive (S : NumericalSemigroup) (g : ℕ) (hg : S.IsPrimitive g) (x : ℕ) : x ∈ (t11_erasePrimitive S g hg).carrier ↔ x ∈ S.carrier ∧ x ≠ g := by rfl theorem t11_erasePrimitive_conductor (S : NumericalSemigroup) (g : ℕ) (hg : S.IsPrimitive g) (hlt : g < S.conductor) : (t11_erasePrimitive S g hg).conductor = S.conductor := by apply Nat.le_antisymm · apply NumericalSemigroup.conductor_le intro x hx exact ⟨S.conductor_spec x hx, by omega⟩ · apply S.conductor_le intro x hx exact ((t11_erasePrimitive S g hg).conductor_spec x hx).1 theorem t11_erasePrimitive_multiplicity (S : NumericalSemigroup) (g : ℕ) (hg : S.IsPrimitive g) (hne : S.multiplicity ≠ g) : (t11_erasePrimitive S g hg).multiplicity = S.multiplicity := by apply Nat.le_antisymm · exact NumericalSemigroup.multiplicity_le _ S.multiplicity_pos ⟨S.multiplicity_mem, hne⟩ · exact S.multiplicity_le (t11_erasePrimitive S g hg).multiplicity_pos (t11_erasePrimitive S g hg).multiplicity_mem.1 theorem t11_erasePrimitive_left (S : NumericalSemigroup) (g : ℕ) (hg : S.IsPrimitive g) (hlt : g < S.conductor) : (t11_erasePrimitive S g hg).leftElements = S.leftElements.erase g := by classical ext x simp only [NumericalSemigroup.mem_leftElements, Finset.mem_erase, t11_erasePrimitive_conductor S g hg hlt, t11_mem_erasePrimitive] tauto theorem t11_erasePrimitive_leftCount (S : NumericalSemigroup) (g : ℕ) (hg : S.IsPrimitive g) (hlt : g < S.conductor) : (t11_erasePrimitive S g hg).leftCount + 1 = S.leftCount := by classical unfold NumericalSemigroup.leftCount rw [t11_erasePrimitive_left S g hg hlt] exact Finset.card_erase_add_one ((S.mem_leftElements g).2 ⟨hlt, hg.1⟩) theorem t11_erasePrimitive_new_primitive (S : NumericalSemigroup) (g x : ℕ) (hg : S.IsPrimitive g) (hq : 3 * S.multiplicity < S.conductor) (hlo : S.conductor ≤ g + S.multiplicity) (hlt : g < S.conductor) (hlate : ∀ a : ℕ, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → S.conductor + S.multiplicity ≤ g + a) (hx : (t11_erasePrimitive S g hg).IsPrimitive x) : S.IsPrimitive x ∨ x = g + S.multiplicity := by classical have hmg : S.multiplicity ≠ g := by omega have hcx : x < S.conductor + S.multiplicity := by have h := (t11_erasePrimitive S g hg).primitive_lt hx rw [t11_erasePrimitive_conductor S g hg hlt, t11_erasePrimitive_multiplicity S g hg hmg] at h exact h by_cases hp : S.IsPrimitive x · exact Or.inl hp apply Or.inr have hdec : ¬ ∀ a b : ℕ, a ∈ S.carrier → b ∈ S.carrier → x = a + b → a = 0 ∨ b = 0 := by intro hall exact hp ⟨hx.1.1, hx.2.1, hall⟩ push Not at hdec obtain ⟨a, b, ha, hb, heq, ha0, hb0⟩ := hdec have hagb : a = g ∨ b = g := by by_contra h push Not at h rcases hx.2.2 a b ⟨ha, h.1⟩ ⟨hb, h.2⟩ heq with hz | hz · exact ha0 hz · exact hb0 hz have helper : ∀ s : ℕ, s ∈ S.carrier → 0 < s → x = g + s → s = S.multiplicity := by intro s hs hspos hsum have hslt : s < 2 * S.multiplicity := by omega have hsprim := t11_below_two_m_primitive S s hs hspos hslt by_contra hsne have hbad := hlate s hsprim (by omega) hsne omega rcases hagb with hag | hbg · subst a have hbm := helper b hb (by omega) heq omega · subst b have ham := helper a ha (by omega) (by omega) omega theorem t11_erasePrimitive_embedding_le (S : NumericalSemigroup) (g : ℕ) (hg : S.IsPrimitive g) (hq : 3 * S.multiplicity < S.conductor) (hlo : S.conductor ≤ g + S.multiplicity) (hlt : g < S.conductor) (hlate : ∀ a : ℕ, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → S.conductor + S.multiplicity ≤ g + a) : (t11_erasePrimitive S g hg).embeddingDimension ≤ S.embeddingDimension := by classical unfold NumericalSemigroup.embeddingDimension let f : ℕ → ℕ := fun x => if x = g + S.multiplicity then g else x apply Finset.card_le_card_of_injOn f · intro x hx have hxp := ((t11_erasePrimitive S g hg).mem_primitiveElements x).1 hx rcases t11_erasePrimitive_new_primitive S g x hg hq hlo hlt hlate hxp with h | h · by_cases heq : x = g + S.multiplicity · simpa [f, heq] using (S.mem_primitiveElements g).2 hg · simpa [f, heq] using (S.mem_primitiveElements x).2 h · simpa [f, h] using (S.mem_primitiveElements g).2 hg · intro x hx y hy hxy have hxg : x ≠ g := (((t11_erasePrimitive S g hg).mem_primitiveElements x).1 hx).1.2 have hyg : y ≠ g := (((t11_erasePrimitive S g hg).mem_primitiveElements y).1 hy).1.2 change (if x = g + S.multiplicity then g else x) = (if y = g + S.multiplicity then g else y) at hxy split_ifs at hxy with hxx hyy · omega · exact False.elim (hyg hxy.symm) · exact False.elim (hxg hxy) · exact hxy theorem t11_erasePrimitive_old_primitive (S : NumericalSemigroup) (g x : ℕ) (hg : S.IsPrimitive g) (hx : S.IsPrimitive x) (hne : x ≠ g) : (t11_erasePrimitive S g hg).IsPrimitive x := by refine ⟨⟨hx.1, hne⟩, hx.2.1, ?_⟩ intro a b ha hb heq exact hx.2.2 a b ha.1 hb.1 heq theorem t11_shift_not_primitive (S : NumericalSemigroup) (g : ℕ) (hg : S.IsPrimitive g) : ¬ S.IsPrimitive (g + S.multiplicity) := by intro hp rcases hp.2.2 g S.multiplicity hg.1 S.multiplicity_mem rfl with h | h · have := hg.2.1 omega · have := S.multiplicity_pos omega noncomputable def t11_newRightCount (S : NumericalSemigroup) (g : ℕ) (hg : S.IsPrimitive g) : ℕ := by classical exact if (t11_erasePrimitive S g hg).IsPrimitive (g + S.multiplicity) then 1 else 0 theorem t11_newRightCount_eq_one (S : NumericalSemigroup) (g : ℕ) (hg : S.IsPrimitive g) : t11_newRightCount S g hg = 1 ↔ (t11_erasePrimitive S g hg).IsPrimitive (g + S.multiplicity) := by classical simp [t11_newRightCount] theorem t11_erasePrimitive_primitiveElements (S : NumericalSemigroup) (g : ℕ) (hg : S.IsPrimitive g) (hq : 3 * S.multiplicity < S.conductor) (hlo : S.conductor ≤ g + S.multiplicity) (hlt : g < S.conductor) (hlate : ∀ a : ℕ, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → S.conductor + S.multiplicity ≤ g + a) : (t11_erasePrimitive S g hg).primitiveElements = if t11_newRightCount S g hg = 1 then insert (g + S.multiplicity) (S.primitiveElements.erase g) else S.primitiveElements.erase g := by classical ext x simp only [NumericalSemigroup.mem_primitiveElements] split_ifs with hnew · have hnewp := (t11_newRightCount_eq_one S g hg).1 hnew simp only [Finset.mem_insert, Finset.mem_erase, NumericalSemigroup.mem_primitiveElements] constructor · intro hx rcases t11_erasePrimitive_new_primitive S g x hg hq hlo hlt hlate hx with h | h · exact Or.inr ⟨hx.1.2, h⟩ · exact Or.inl h · rintro (heq | ⟨hne, hp⟩) · simpa [heq] using hnewp · exact t11_erasePrimitive_old_primitive S g x hg hp hne · have hnewp : ¬ (t11_erasePrimitive S g hg).IsPrimitive (g + S.multiplicity) := fun h => hnew ((t11_newRightCount_eq_one S g hg).2 h) simp only [Finset.mem_erase, NumericalSemigroup.mem_primitiveElements] constructor · intro hx refine ⟨hx.1.2, ?_⟩ rcases t11_erasePrimitive_new_primitive S g x hg hq hlo hlt hlate hx with h | h · exact h · exact False.elim (hnewp (by simpa [← h] using hx)) · rintro ⟨hne, hp⟩ exact t11_erasePrimitive_old_primitive S g x hg hp hne theorem t11_erasePrimitive_embedding_exact (S : NumericalSemigroup) (g : ℕ) (hg : S.IsPrimitive g) (hq : 3 * S.multiplicity < S.conductor) (hlo : S.conductor ≤ g + S.multiplicity) (hlt : g < S.conductor) (hlate : ∀ a : ℕ, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → S.conductor + S.multiplicity ≤ g + a) : (t11_erasePrimitive S g hg).embeddingDimension + 1 = S.embeddingDimension + t11_newRightCount S g hg := by classical have herase := Finset.card_erase_add_one ((S.mem_primitiveElements g).2 hg) have hnot : g + S.multiplicity ∉ S.primitiveElements.erase g := by intro h exact t11_shift_not_primitive S g hg ((S.mem_primitiveElements _).1 (Finset.mem_of_mem_erase h)) unfold NumericalSemigroup.embeddingDimension rw [t11_erasePrimitive_primitiveElements S g hg hq hlo hlt hlate] by_cases hp : (t11_erasePrimitive S g hg).IsPrimitive (g + S.multiplicity) · have hflag := (t11_newRightCount_eq_one S g hg).2 hp rw [if_pos hflag, Finset.card_insert_of_notMem hnot, hflag] omega · have hflag : t11_newRightCount S g hg = 0 := by simp [t11_newRightCount, hp] rw [hflag] simp only [Nat.zero_ne_one, ↓reduceIte, Nat.add_zero] exact herase theorem t11_erasePrimitive_product_exact (S : NumericalSemigroup) (g : ℕ) (hg : S.IsPrimitive g) (hq : 3 * S.multiplicity < S.conductor) (hlo : S.conductor ≤ g + S.multiplicity) (hlt : g < S.conductor) (hlate : ∀ a : ℕ, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → S.conductor + S.multiplicity ≤ g + a) : S.embeddingDimension * S.leftCount = (t11_erasePrimitive S g hg).embeddingDimension * (t11_erasePrimitive S g hg).leftCount + S.embeddingDimension + if t11_newRightCount S g hg = 1 then 0 else (t11_erasePrimitive S g hg).leftCount := by classical have he := t11_erasePrimitive_embedding_exact S g hg hq hlo hlt hlate have hl := t11_erasePrimitive_leftCount S g hg hlt by_cases hp : (t11_erasePrimitive S g hg).IsPrimitive (g + S.multiplicity) · have hflag := (t11_newRightCount_eq_one S g hg).2 hp rw [hflag] at he ⊢ simp only [↓reduceIte, Nat.add_zero] nlinarith · have hflag : t11_newRightCount S g hg = 0 := by simp [t11_newRightCount, hp] rw [hflag] at he ⊢ simp only [Nat.zero_ne_one, ↓reduceIte] at * nlinarith theorem t11_erasePrimitive_product_slack (S : NumericalSemigroup) (g : ℕ) (hg : S.IsPrimitive g) (hq : 3 * S.multiplicity < S.conductor) (hlo : S.conductor ≤ g + S.multiplicity) (hlt : g < S.conductor) (hlate : ∀ a : ℕ, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → S.conductor + S.multiplicity ≤ g + a) : (t11_erasePrimitive S g hg).embeddingDimension * (t11_erasePrimitive S g hg).leftCount + S.embeddingDimension ≤ S.embeddingDimension * S.leftCount := by have he := t11_erasePrimitive_embedding_le S g hg hq hlo hlt hlate have hl := t11_erasePrimitive_leftCount S g hg hlt calc _ ≤ S.embeddingDimension * (t11_erasePrimitive S g hg).leftCount + S.embeddingDimension := Nat.add_le_add_right (Nat.mul_le_mul_right _ he) _ _ = S.embeddingDimension * S.leftCount := by rw [← hl]; ring theorem t11_erasePrimitive_wilf_transfer (S : NumericalSemigroup) (g : ℕ) (hg : S.IsPrimitive g) (hq : 3 * S.multiplicity < S.conductor) (hlo : S.conductor ≤ g + S.multiplicity) (hlt : g < S.conductor) (hlate : ∀ a : ℕ, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → S.conductor + S.multiplicity ≤ g + a) (hchild : (t11_erasePrimitive S g hg).SatisfiesWilf) : S.SatisfiesWilf := by unfold NumericalSemigroup.SatisfiesWilf at hchild ⊢ rw [t11_erasePrimitive_conductor S g hg hlt] at hchild have hslack := t11_erasePrimitive_product_slack S g hg hq hlo hlt hlate omega def t11_IsLatePruned (S : NumericalSemigroup) : Prop := ∀ g : ℕ, S.IsPrimitive g → S.conductor ≤ g + S.multiplicity → g < S.conductor → ∃ a : ℕ, S.IsPrimitive a ∧ a < S.conductor ∧ a ≠ S.multiplicity ∧ g + a < S.conductor + S.multiplicity theorem t11_pruned_needed_small (S : NumericalSemigroup) (g : ℕ) (hq : 3 * S.multiplicity < S.conductor) (hpruned : t11_IsLatePruned S) (hg : S.IsPrimitive g) (hlo : S.conductor ≤ g + S.multiplicity) (hlt : g < S.conductor) : ∃ a : ℕ, S.IsPrimitive a ∧ S.multiplicity < a ∧ a < 2 * S.multiplicity ∧ g + a < S.conductor + S.multiplicity := by obtain ⟨a, ha, hal, hne, hsum⟩ := hpruned g hg hlo hlt have hma := S.multiplicity_le ha.2.1 ha.1 exact ⟨a, ha, by omega, by omega, hsum⟩ theorem t11_pruned_second_generator_bound (S : NumericalSemigroup) (a0 g : ℕ) (ha0 : a0 < 2 * S.multiplicity) (hpruned : t11_IsLatePruned S) (hmin : ∀ a : ℕ, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a0 ≤ a) (hg : S.IsPrimitive g) (hlt : g < S.conductor) : g + a0 < S.conductor + S.multiplicity := by by_cases hlo : S.conductor ≤ g + S.multiplicity · obtain ⟨a, ha, hal, hne, hsum⟩ := hpruned g hg hlo hlt have h := hmin a ha hal hne omega · omega theorem t11_reduce_to_pruned (hbase : ∀ S : NumericalSemigroup, 3 * S.multiplicity < S.conductor → S.conductor ≤ 4 * S.multiplicity → t11_IsLatePruned S → S.SatisfiesWilf) (S : NumericalSemigroup) (hq : 3 * S.multiplicity < S.conductor) (hupper : S.conductor ≤ 4 * S.multiplicity) : S.SatisfiesWilf := by classical have hind : ∀ l : ℕ, ∀ T : NumericalSemigroup, T.leftCount = l → 3 * T.multiplicity < T.conductor → T.conductor ≤ 4 * T.multiplicity → T.SatisfiesWilf := by intro l induction l using Nat.strong_induction_on with | h l ih => intro T hcount htq htupper by_cases hpruned : t11_IsLatePruned T · exact hbase T htq htupper hpruned · unfold t11_IsLatePruned at hpruned push Not at hpruned obtain ⟨g, hg, hlo, hlt, hlate⟩ := hpruned have hlate' : ∀ a : ℕ, T.IsPrimitive a → a < T.conductor → a ≠ T.multiplicity → T.conductor + T.multiplicity ≤ g + a := by intro a ha hal hne have h := hlate a ha hal hne omega let U := t11_erasePrimitive T g hg have hmg : T.multiplicity ≠ g := by omega have hc : U.conductor = T.conductor := t11_erasePrimitive_conductor T g hg hlt have hm : U.multiplicity = T.multiplicity := t11_erasePrimitive_multiplicity T g hg hmg have hl : U.leftCount + 1 = T.leftCount := t11_erasePrimitive_leftCount T g hg hlt have huq : 3 * U.multiplicity < U.conductor := by rw [hc, hm]; exact htq have huupper : U.conductor ≤ 4 * U.multiplicity := by rw [hc, hm]; exact htupper have hchild := ih U.leftCount (by omega) U rfl huq huupper exact t11_erasePrimitive_wilf_transfer T g hg htq hlo hlt hlate' hchild exact hind S.leftCount S rfl hq hupper theorem t11_q_four_iff_pruned : (∀ S : NumericalSemigroup, 3 * S.multiplicity < S.conductor → S.conductor ≤ 4 * S.multiplicity → S.SatisfiesWilf) ↔ (∀ S : NumericalSemigroup, 3 * S.multiplicity < S.conductor → S.conductor ≤ 4 * S.multiplicity → t11_IsLatePruned S → S.SatisfiesWilf) := by constructor · intro h S hq hupper _ exact h S hq hupper · intro h S hq hupper exact t11_reduce_to_pruned h S hq hupper theorem t11_noSmall_arithmetic (m b z t p : ℕ) (hm : m = 1 + b + z + t + p) (hpairs : 2 * t ≤ b * (b + 1)) : 4 * m ≤ (1 + b + z + p) * (4 + 2 * b + z) := by have hmain : 2 * b * (b + 1) ≤ (1 + b + z + p) * (2 * b + z) := by nlinarith [Nat.zero_le (b * z), Nat.zero_le (b * p), Nat.zero_le (z * p), Nat.zero_le (z * z)] nlinarith theorem t11_p3_comparison_arithmetic (a b z u t n0 l0 d0 rho : ℕ) (hn : n0 = 1 + a + b) (hl : 4 + 3 * a + 2 * b ≤ l0) (ht : t ≤ (a + 1) * z + u) (hu : u ≤ b * z) (hrho : u ≤ rho) (hbase : 4 * d0 ≤ n0 * l0 + z * (z + 1)) : 4 * (d0 + t) ≤ (n0 + z) * (l0 + z) + rho := by have hz := Nat.mul_le_mul_left z hl have ht4 := Nat.mul_le_mul_left 4 ht have hu3 := Nat.mul_le_mul_left 3 hu nlinarith def ns_code {k : ℕ} (b : ℕ) (α : Fin k → ℕ) : ℕ := ∑ i, α i * b ^ i.val lemma ns_code_unitAdd {k : ℕ} (b : ℕ) (α : Fin k → ℕ) (i : Fin k) : ns_code b (m3_unitAdd α i) = ns_code b α + b ^ i.val := m3_linear_unitAdd (fun j => b ^ j.val) α i lemma ns_code_parent {k : ℕ} (b : ℕ) (α : Fin k → ℕ) (i : Fin k) (hi : 0 < α i) : ns_code b (m3_parent α i) + b ^ i.val = ns_code b α := by rw [← ns_code_unitAdd, m3_unitAdd_parent α i hi] lemma ns_code_succ (b k : ℕ) (α : Fin (k + 1) → ℕ) : ns_code b α = α 0 + b * ns_code b (fun i : Fin k => α i.succ) := by unfold ns_code rw [Fin.sum_univ_succ] simp only [Fin.val_zero, pow_zero, Nat.mul_one, Fin.val_succ, pow_succ] congr 1 rw [Finset.mul_sum] apply Finset.sum_congr rfl intro i hi ring lemma ns_code_injective (b k : ℕ) (hb : 0 < b) (α β : Fin k → ℕ) (hα : ∀ i, α i < b) (hβ : ∀ i, β i < b) (he : ns_code b α = ns_code b β) : α = β := by induction k with | zero => exact Subsingleton.elim _ _ | succ k ih => rw [ns_code_succ, ns_code_succ] at he have h0 : α 0 = β 0 := by have hm := congrArg (fun n => n % b) he simpa [Nat.add_mod, Nat.mod_eq_of_lt (hα 0), Nat.mod_eq_of_lt (hβ 0)] using hm have ht : ns_code b (fun i : Fin k => α i.succ) = ns_code b (fun i : Fin k => β i.succ) := by nlinarith have hf := ih (fun i => α i.succ) (fun i => β i.succ) (fun i => hα i.succ) (fun i => hβ i.succ) ht funext i exact Fin.cases h0 (fun j => congrFun hf j) i lemma ns_min_exists {k : ℕ} (b : ℕ) (a : Fin k → ℕ) (d v : ℕ) (h : ∃ α, m3_degree α = d ∧ m3_value a α = v) : ∃ α, m3_degree α = d ∧ m3_value a α = v ∧ ∀ β, m3_degree β = d → m3_value a β = v → ns_code b α ≤ ns_code b β := by classical have hq : ∃ n, ∃ α, m3_degree α = d ∧ m3_value a α = v ∧ ns_code b α = n := by obtain ⟨α,hd,hv⟩ := h exact ⟨ns_code b α,α,hd,hv,rfl⟩ obtain ⟨α,hd,hv,hc⟩ := Nat.find_spec hq refine ⟨α,hd,hv,?_⟩ intro β hβd hβv rw [hc] exact Nat.find_min' hq ⟨β,hβd,hβv,rfl⟩ noncomputable def ns_rep {k : ℕ} (b : ℕ) (a : Fin k → ℕ) (d v : ℕ) : Fin k → ℕ := by classical exact if h : ∃ α, m3_degree α = d ∧ m3_value a α = v then Classical.choose (ns_min_exists b a d v h) else fun _ => 0 lemma ns_rep_spec {k : ℕ} (b : ℕ) (a : Fin k → ℕ) (d v : ℕ) (h : ∃ α, m3_degree α = d ∧ m3_value a α = v) : m3_degree (ns_rep b a d v) = d ∧ m3_value a (ns_rep b a d v) = v ∧ ∀ β, m3_degree β = d → m3_value a β = v → ns_code b (ns_rep b a d v) ≤ ns_code b β := by classical simp only [ns_rep, dite_eq_left h] exact Classical.choose_spec (ns_min_exists b a d v h) lemma ns_rep_parent {k : ℕ} (b : ℕ) (a : Fin k → ℕ) (d v : ℕ) (hb : d + 1 < b) (h : ∃ α, m3_degree α = d + 1 ∧ m3_value a α = v) (i : Fin k) (hi : 0 < ns_rep b a (d + 1) v i) : m3_parent (ns_rep b a (d + 1) v) i = ns_rep b a d (m3_value a (m3_parent (ns_rep b a (d + 1) v) i)) := by have hs := ns_rep_spec b a (d + 1) v h let p := m3_parent (ns_rep b a (d + 1) v) i have hpd : m3_degree p = d := by have hd := m3_degree_parent (ns_rep b a (d + 1) v) i hi dsimp [p] omega have ht := ns_rep_spec b a d (m3_value a p) ⟨p,hpd,rfl⟩ have hmin := hs.2.2 (m3_unitAdd (ns_rep b a d (m3_value a p)) i) (by rw [m3_degree_unitAdd, ht.1]) (by rw [m3_value_unitAdd, ht.2.1, m3_value_parent a (ns_rep b a (d + 1) v) i hi, hs.2.1]) rw [ns_code_unitAdd] at hmin have hc := ns_code_parent b (ns_rep b a (d + 1) v) i hi change p = ns_rep b a d (m3_value a p) apply ns_code_injective b k (by omega) · intro j have := m3_coord_le_degree p j omega · intro j have := m3_coord_le_degree (ns_rep b a d (m3_value a p)) j omega · have hp := ht.2.2 p hpd rfl change ns_code b p + b ^ i.val = ns_code b (ns_rep b a (d + 1) v) at hc omega lemma ns_sumset_eq_nsmul (A : Finset ℕ) (r : ℕ) : m3_sumset A r = r • A := by induction r with | zero => rfl | succ r ih => rw [m3_sumset, ih, succ_nsmul] theorem ns_card_succ_nsmul_le (A : Finset ℕ) (r : ℕ) : (r + 1) * ((r + 1) • A).card ≤ (A.card + r) * (r • A).card := by classical let B := (m3_sumset A r).image (ns_rep (r + 2) (m3_enum A) r) let C := (m3_sumset A (r + 1)).image (ns_rep (r + 2) (m3_enum A) (r + 1)) have hs (d v : ℕ) (hv : v ∈ m3_sumset A d) := ns_rep_spec (r + 2) (m3_enum A) d v (m3_rep_exists A d v hv) have hB : ∀ α ∈ B, m3_degree α = r := by intro α hα obtain ⟨v,hv,rfl⟩ := Finset.mem_image.1 hα exact (hs r v hv).1 have hC : ∀ β ∈ C, m3_degree β = r + 1 := by intro β hβ obtain ⟨v,hv,rfl⟩ := Finset.mem_image.1 hβ exact (hs (r+1) v hv).1 have hdiv : ∀ β ∈ C, ∀ i : Fin A.card, 0 < β i → m3_parent β i ∈ B := by intro β hβ i hi obtain ⟨v,hv,rfl⟩ := Finset.mem_image.1 hβ have hd : m3_degree (m3_parent (ns_rep (r + 2) (m3_enum A) (r + 1) v) i) = r := by have := m3_degree_parent (ns_rep (r + 2) (m3_enum A) (r + 1) v) i hi have := (hs (r+1) v hv).1 omega apply Finset.mem_image.2 refine ⟨_,m3_value_mem_sumset A r _ hd,?_⟩ exact (ns_rep_parent (r + 2) (m3_enum A) r v (by omega) (m3_rep_exists A (r + 1) v hv) i hi).symm have hc (d : ℕ) : ((m3_sumset A d).image (ns_rep (r + 2) (m3_enum A) d)).card = (m3_sumset A d).card := by apply Finset.card_image_of_injOn intro v hv w hw he have hv' := (hs d v hv).2.1 have hw' := (hs d w hw).2.1 rw [he] at hv' omega have hw := n4_weighted_shadow B C hB hC hdiv dsimp only [B,C] at hw rw [hc, hc, ns_sumset_eq_nsmul, ns_sumset_eq_nsmul] at hw exact hw theorem ns_hilbert_avg (A : Finset ℕ) (hA : A.Nonempty) : 4 * (4 • A).card ≤ A.card * (1 + A.card + (2 • A).card + (3 • A).card) := by have hk := hA.card_pos have h1 := ns_card_succ_nsmul_le A 1 have h2 := ns_card_succ_nsmul_le A 2 have h3 := ns_card_succ_nsmul_le A 3 simp only [one_nsmul] at h1 nlinarith theorem ns_hilbert_avg_general (A : Finset ℕ) (q : ℕ) : q * (q • A).card ≤ A.card * ∑ i ∈ Finset.range q, (i • A).card := by induction q with | zero => simp | succ q ih => have h := ns_card_succ_nsmul_le A q rw [Finset.sum_range_succ] nlinarith noncomputable def w23_low_A (S : NumericalSemigroup) : Finset ℕ := by classical exact S.primitiveElements.filter (fun a => a < S.conductor) lemma w23_low_mem_A (S : NumericalSemigroup) (a : ℕ) : a ∈ w23_low_A S ↔ S.IsPrimitive a ∧ a < S.conductor := by classical simp [w23_low_A, S.mem_primitiveElements] lemma w23_low_A_card (S : NumericalSemigroup) : (w23_low_A S).card = w23_n S := rfl lemma w23_low_left_repr (S : NumericalSemigroup) (x : ℕ) (hx : x ∈ S.leftElements) : ∃ d : ℕ, x ∈ d • w23_low_A S := by classical induction x using Nat.strong_induction_on with | h x ih => obtain ⟨hlt,hmem⟩ := (S.mem_leftElements x).1 hx by_cases hx0 : x = 0 · subst x exact ⟨0,by simp⟩ by_cases hp : S.IsPrimitive x · exact ⟨1, by simpa using (w23_low_mem_A S x).2 ⟨hp,hlt⟩⟩ obtain ⟨a,b,ha,hb,hap,hbp,he⟩ := w23_decomposable_eq_add S hmem hp (by omega) (by have := S.multiplicity_pos; omega) obtain ⟨d,hd⟩ := ih a (by omega) ha obtain ⟨e,he'⟩ := ih b (by omega) hb refine ⟨d+e,?_⟩ rw [add_nsmul] exact Finset.mem_add.2 ⟨a,hd,b,he',he.symm⟩ lemma ns_nsmul_bounds (A : Finset ℕ) (m c : ℕ) (hA : ∀ a ∈ A, m ≤ a ∧ 3 * a ≤ c) (d x : ℕ) (hx : x ∈ d • A) : d * m ≤ x ∧ 3 * x ≤ d * c := by induction d generalizing x with | zero => have : x = 0 := by simpa using hx subst x simp | succ d ih => rw [succ_nsmul] at hx obtain ⟨y,hy,a,ha,rfl⟩ := Finset.mem_add.1 hx have hb := ih y hy have hab := hA a ha constructor <;> nlinarith lemma ns_nsmul_mem_carrier (S : NumericalSemigroup) (A : Finset ℕ) (hA : ∀ a ∈ A, a ∈ S.carrier) (d x : ℕ) (hx : x ∈ d • A) : x ∈ S.carrier := by induction d generalizing x with | zero => have : x = 0 := by simpa using hx subst x exact S.carrier.zero_mem | succ d ih => rw [succ_nsmul] at hx obtain ⟨y,hy,a,ha,rfl⟩ := Finset.mem_add.1 hx exact S.carrier.add_mem (ih y hy) (hA a ha) lemma w23_low_bounds (S : NumericalSemigroup) (hlow : ∀ a, S.IsPrimitive a → a < S.conductor → 3 * a ≤ S.conductor) (d x : ℕ) (hx : x ∈ d • w23_low_A S) : d * S.multiplicity ≤ x ∧ 3 * x ≤ d * S.conductor := by apply ns_nsmul_bounds (w23_low_A S) S.multiplicity S.conductor _ d x hx intro a ha obtain ⟨hp,hlt⟩ := (w23_low_mem_A S a).1 ha exact ⟨S.multiplicity_le hp.2.1 hp.1, hlow a hp hlt⟩ lemma w23_low_sumset_carrier (S : NumericalSemigroup) (d x : ℕ) (hx : x ∈ d • w23_low_A S) : x ∈ S.carrier := by apply ns_nsmul_mem_carrier S (w23_low_A S) _ d x hx intro a ha exact ((w23_low_mem_A S a).1 ha).1.1 lemma w23_low_degree_lt (S : NumericalSemigroup) (d x : ℕ) (hmem : x ∈ d • w23_low_A S) (hlt : x < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) : d < 4 := by have hm := S.multiplicity_pos have hb : d * S.multiplicity ≤ x := by apply (ns_nsmul_bounds (w23_low_A S) S.multiplicity (3 * (S.conductor + S.multiplicity)) _ d x hmem).1 intro a ha have hp := ((w23_low_mem_A S a).1 ha).1 exact ⟨S.multiplicity_le hp.2.1 hp.1, by have := S.primitive_lt hp; omega⟩ nlinarith noncomputable def w23_low_B (S : NumericalSemigroup) : Finset ℕ := (3 • w23_low_A S).filter (fun x => x < S.conductor) noncomputable def w23_low_C (S : NumericalSemigroup) : Finset ℕ := (4 • w23_low_A S).filter (fun x => x < S.conductor + S.multiplicity) lemma w23_low_left_union (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (hlow : ∀ a, S.IsPrimitive a → a < S.conductor → 3 * a ≤ S.conductor) : S.leftElements = {0} ∪ w23_low_A S ∪ (2 • w23_low_A S) ∪ w23_low_B S := by classical ext x constructor · intro hx obtain ⟨d,hd⟩ := w23_low_left_repr S x hx have hlt := ((S.mem_leftElements x).1 hx).1 have hdlt := w23_low_degree_lt S d x hd hlt h2 interval_cases d · have : x = 0 := by simpa using hd simp [this] · simp only [one_nsmul] at hd simp only [Finset.mem_union] exact Or.inl (Or.inl (Or.inr hd)) · simp only [Finset.mem_union] exact Or.inl (Or.inr hd) · simp only [Finset.mem_union] exact Or.inr (Finset.mem_filter.2 ⟨hd,hlt⟩) · intro hx simp only [Finset.mem_union, Finset.mem_singleton] at hx rcases hx with ((hx | hx) | hx) | hx · subst x exact S.zero_mem_leftElements · exact (S.mem_leftElements x).2 ⟨((w23_low_mem_A S x).1 hx).2, ((w23_low_mem_A S x).1 hx).1.1⟩ · have hb := w23_low_bounds S hlow 2 x hx exact (S.mem_leftElements x).2 ⟨by have := S.conductor_pos; omega, w23_low_sumset_carrier S 2 x hx⟩ · have hb := Finset.mem_filter.1 hx exact (S.mem_leftElements x).2 ⟨hb.2,w23_low_sumset_carrier S 3 x hb.1⟩ lemma w23_low_left_card (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (hlow : ∀ a, S.IsPrimitive a → a < S.conductor → 3 * a ≤ S.conductor) : S.leftCount = 1 + (w23_low_A S).card + (2 • w23_low_A S).card + (w23_low_B S).card := by classical have hm := S.multiplicity_pos have hb1 (x : ℕ) (hx : x ∈ w23_low_A S) : S.multiplicity ≤ x ∧ x < 2 * S.multiplicity := by have h := w23_low_bounds S hlow 1 x (by simpa using hx) constructor <;> omega have hb2 (x : ℕ) (hx : x ∈ 2 • w23_low_A S) : 2 * S.multiplicity ≤ x ∧ x < 3 * S.multiplicity := by have h := w23_low_bounds S hlow 2 x hx constructor <;> omega have hb3 (x : ℕ) (hx : x ∈ w23_low_B S) : 3 * S.multiplicity ≤ x := (w23_low_bounds S hlow 3 x (Finset.mem_filter.1 hx).1).1 have h01 : Disjoint ({0} : Finset ℕ) (w23_low_A S) := by rw [Finset.disjoint_left] intro x hx hx' have := hb1 x hx' simp only [Finset.mem_singleton] at hx omega have h02 : Disjoint ({0} ∪ w23_low_A S) (2 • w23_low_A S) := by rw [Finset.disjoint_left] intro x hx hx' have := hb2 x hx' rcases Finset.mem_union.1 hx with hx | hx · simp only [Finset.mem_singleton] at hx omega · have := hb1 x hx omega have h03 : Disjoint ({0} ∪ w23_low_A S ∪ (2 • w23_low_A S)) (w23_low_B S) := by rw [Finset.disjoint_left] intro x hx hx' have := hb3 x hx' rcases Finset.mem_union.1 hx with hx | hx · rcases Finset.mem_union.1 hx with hx | hx · simp only [Finset.mem_singleton] at hx omega · have := hb1 x hx omega · have := hb2 x hx omega unfold NumericalSemigroup.leftCount rw [w23_low_left_union S h1 h2 hlow, Finset.card_union_of_disjoint h03, Finset.card_union_of_disjoint h02, Finset.card_union_of_disjoint h01, Finset.card_singleton] theorem ns_reduce (A B C : Finset ℕ) (r : ℕ) (hB : B ⊆ r • A) (hC : C ⊆ (r + 1) • A) (hdiv : ∀ c ∈ C, ∀ a ∈ A, ∀ z ∈ r • A, c = z + a → z ∈ B) : ∃ E F : Finset (Fin A.card → ℕ), (∀ α ∈ E, m3_degree α = r) ∧ (∀ β ∈ F, m3_degree β = r + 1) ∧ (∀ β ∈ F, ∀ i, 0 < β i → m3_parent β i ∈ E) ∧ E.card = B.card ∧ F.card = C.card ∧ E = B.image (ns_rep (r+2) (m3_enum A) r) ∧ F = C.image (ns_rep (r+2) (m3_enum A) (r+1)) := by classical let E := B.image (ns_rep (r + 2) (m3_enum A) r) let F := C.image (ns_rep (r + 2) (m3_enum A) (r + 1)) have hb (v : ℕ) (hv : v ∈ B) : ∃ α, m3_degree α = r ∧ m3_value (m3_enum A) α = v := by apply m3_rep_exists A r v rw [ns_sumset_eq_nsmul] exact hB hv have hc (v : ℕ) (hv : v ∈ C) : ∃ α, m3_degree α = r + 1 ∧ m3_value (m3_enum A) α = v := by apply m3_rep_exists A (r+1) v rw [ns_sumset_eq_nsmul] exact hC hv refine ⟨E,F,?_,?_,?_,?_,?_,rfl,rfl⟩ · intro α hα obtain ⟨v,hv,rfl⟩ := Finset.mem_image.1 hα exact (ns_rep_spec _ _ _ _ (hb v hv)).1 · intro β hβ obtain ⟨v,hv,rfl⟩ := Finset.mem_image.1 hβ exact (ns_rep_spec _ _ _ _ (hc v hv)).1 · intro β hβ i hi obtain ⟨v,hv,rfl⟩ := Finset.mem_image.1 hβ have hs := ns_rep_spec (r+2) (m3_enum A) (r+1) v (hc v hv) have hd : m3_degree (m3_parent (ns_rep (r+2) (m3_enum A) (r+1) v) i) = r := by have := m3_degree_parent (ns_rep (r+2) (m3_enum A) (r+1) v) i hi omega have hz := m3_value_mem_sumset A r _ hd rw [ns_sumset_eq_nsmul] at hz have he := m3_value_parent (m3_enum A) (ns_rep (r+2) (m3_enum A) (r+1) v) i hi have hzin := hdiv v hv (m3_enum A i) (m3_enum_mem A i) _ hz (by omega) apply Finset.mem_image.2 refine ⟨_,hzin,?_⟩ exact (ns_rep_parent (r+2) (m3_enum A) r v (by omega) (hc v hv) i hi).symm · apply Finset.card_image_of_injOn intro v hv w hw he have hs := (ns_rep_spec (r+2) (m3_enum A) r v (hb v hv)).2.1 have ht := (ns_rep_spec (r+2) (m3_enum A) r w (hb w hw)).2.1 rw [he] at hs omega · apply Finset.card_image_of_injOn intro v hv w hw he have hs := (ns_rep_spec (r+2) (m3_enum A) (r+1) v (hc v hv)).2.1 have ht := (ns_rep_spec (r+2) (m3_enum A) (r+1) w (hc w hw)).2.1 rw [he] at hs omega theorem ns_restricted_succ_le (A B C : Finset ℕ) (r : ℕ) (hB : B ⊆ r • A) (hC : C ⊆ (r + 1) • A) (hdiv : ∀ c ∈ C, ∀ a ∈ A, ∀ z ∈ r • A, c = z + a → z ∈ B) : (r + 1) * C.card ≤ (A.card + r) * B.card := by obtain ⟨E,F,hE,hF,hd,he,hf,_,_⟩ := ns_reduce A B C r hB hC hdiv have h := n4_weighted_shadow E F hE hF hd simpa only [he,hf] using h lemma w23_low_D_repr (S : NumericalSemigroup) (h2 : S.conductor ≤ 4 * S.multiplicity) (hlow : ∀ a, S.IsPrimitive a → a < S.conductor → 3 * a ≤ S.conductor) (x : ℕ) (hx : x ∈ w23_D S) : x ∈ w23_low_C S ∨ x = S.conductor := by classical obtain ⟨hxI,hxP⟩ := Finset.mem_filter.1 hx obtain ⟨hxc,hxlt⟩ := Finset.mem_Ico.1 hxI obtain ⟨a,b,ha,hb,hap,hbp,he⟩ := w23_decomposable_eq_add S (S.conductor_spec x hxc) hxP (by have := S.conductor_pos; omega) hxlt obtain ⟨d,hd⟩ := w23_low_left_repr S a ha obtain ⟨e,he'⟩ := w23_low_left_repr S b hb have hmem : x ∈ (d+e) • w23_low_A S := by rw [add_nsmul] exact Finset.mem_add.2 ⟨a,hd,b,he',he.symm⟩ have hh := w23_low_bounds S hlow (d+e) x hmem have hm := S.multiplicity_pos have hde : d + e ≤ 4 := by nlinarith by_cases h4 : d+e = 4 · exact Or.inl (Finset.mem_filter.2 ⟨by simpa only [h4] using hmem,hxlt⟩) · have hle : d + e ≤ 3 := by omega have := Nat.mul_le_mul_right S.conductor hle exact Or.inr (by nlinarith) lemma w23_low_C_shadow (S : NumericalSemigroup) (hlow : ∀ a, S.IsPrimitive a → a < S.conductor → 3 * a ≤ S.conductor) : ∀ x ∈ w23_low_C S, ∀ a ∈ w23_low_A S, ∀ z ∈ 3 • w23_low_A S, x = z + a → z ∈ w23_low_B S := by classical intro x hx a ha z hz he have hxlt := (Finset.mem_filter.1 hx).2 have ha' := w23_low_bounds S hlow 1 a (by simpa using ha) refine Finset.mem_filter.2 ⟨hz,?_⟩ omega theorem ns_weighted_shadow_gap {k r : ℕ} (B C : Finset (Fin k → ℕ)) (hB : ∀ α ∈ B, m3_degree α = r) (hC : ∀ β ∈ C, m3_degree β = r + 1) (hdiv : ∀ β ∈ C, ∀ i, 0 < β i → m3_parent β i ∈ B) (α : Fin k → ℕ) (hα : α ∈ B) (j : Fin k) (hgap : m3_unitAdd α j ∉ C) : (r + 1) * C.card + 1 ≤ (k + r) * B.card := by classical have hcoord (i : Fin k) (Q : Finset (Fin k → ℕ)) (hQ : ∀ β ∈ C, 0 < β i → m3_parent β i ∈ Q) : (∑ β ∈ C, β i) ≤ ∑ γ ∈ Q, (γ i + 1) := by let T := C.filter (fun β => 0 < β i) have hf : (∑ β ∈ C, β i) = ∑ β ∈ T, β i := by symm apply Finset.sum_subset (Finset.filter_subset _ _) intro β hβ hn have : ¬ 0 < β i := by intro hp exact hn (Finset.mem_filter.2 ⟨hβ,hp⟩) omega rw [hf] apply Finset.sum_le_sum_of_injOn (fun β => m3_parent β i) · intro β hβ γ hγ he exact n4_parent_injective i (Finset.mem_filter.1 hβ).2 (Finset.mem_filter.1 hγ).2 he · intro γ hγ obtain ⟨β,hβ,rfl⟩ := Finset.mem_image.1 hγ exact hQ β (Finset.mem_filter.1 hβ).1 (Finset.mem_filter.1 hβ).2 · intro β hβ have := (Finset.mem_filter.1 hβ).2 simp [m3_parent] omega · intro γ hγ hn exact Nat.zero_le _ have hle : ∀ i : Fin k, (∑ β ∈ C, β i) ≤ ∑ γ ∈ B, (γ i + 1) := fun i => hcoord i B (fun β hβ hp => hdiv β hβ i hp) have hlt : (∑ β ∈ C, β j) < ∑ γ ∈ B, (γ j + 1) := by have he := hcoord j (B.erase α) (by intro β hβ hp apply Finset.mem_erase.2 refine ⟨?_,hdiv β hβ j hp⟩ intro heq apply hgap have hh := m3_unitAdd_parent β j hp rw [heq] at hh exact hh.symm ▸ hβ) have hs := Finset.sum_erase_add B (fun γ => γ j + 1) hα omega have hsum : (∑ i : Fin k, ∑ β ∈ C, β i) < ∑ i : Fin k, ∑ γ ∈ B, (γ i + 1) := by apply Finset.sum_lt_sum · intro i hi exact hle i · exact ⟨j,Finset.mem_univ j,hlt⟩ have hsum' : (∑ β ∈ C, ∑ i : Fin k, β i) < ∑ γ ∈ B, ∑ i : Fin k, (γ i + 1) := by calc (∑ β ∈ C, ∑ i : Fin k, β i) = ∑ i : Fin k, ∑ β ∈ C, β i := Finset.sum_comm _ < ∑ i : Fin k, ∑ γ ∈ B, (γ i + 1) := hsum _ = ∑ γ ∈ B, ∑ i : Fin k, (γ i + 1) := Finset.sum_comm have hleft : (∑ β ∈ C, ∑ i : Fin k, β i) = (r + 1) * C.card := by change (∑ β ∈ C, m3_degree β) = (r+1) * C.card rw [Finset.sum_congr rfl (fun β hβ => hC β hβ)] simp [Nat.mul_comm] have hright : (∑ γ ∈ B, ∑ i : Fin k, (γ i + 1)) = (k + r) * B.card := by have hh : ∀ γ ∈ B, (∑ i : Fin k, (γ i + 1)) = k + r := by intro γ hγ rw [Finset.sum_add_distrib] have hd := hB γ hγ simp only [m3_degree] at hd rw [hd] simp [Nat.add_comm] rw [Finset.sum_congr rfl hh] simp [Nat.mul_comm] rw [hleft,hright] at hsum' omega theorem ns_restricted_succ_gap (A B C : Finset ℕ) (r : ℕ) (hB : B ⊆ r • A) (hC : C ⊆ (r + 1) • A) (hdiv : ∀ c ∈ C, ∀ a ∈ A, ∀ z ∈ r • A, c = z + a → z ∈ B) (z a : ℕ) (hz : z ∈ B) (ha : a ∈ A) (hmissing : z + a ∉ C) : (r + 1) * C.card + 1 ≤ (A.card + r) * B.card := by classical obtain ⟨E,F,hE,hF,hd,he,hf,hEe,hFe⟩ := ns_reduce A B C r hB hC hdiv have hrep := m3_rep_exists A r z (by rw [ns_sumset_eq_nsmul]; exact hB hz) let α := ns_rep (r+2) (m3_enum A) r z have hs := ns_rep_spec (r+2) (m3_enum A) r z hrep have hα : α ∈ E := by rw [hEe] exact Finset.mem_image.2 ⟨z,hz,rfl⟩ obtain ⟨j,hj⟩ := m3_enum_surjective A a ha have hgap : m3_unitAdd α j ∉ F := by intro hh rw [hFe] at hh obtain ⟨v,hv,hvα⟩ := Finset.mem_image.1 hh have hvrep := ns_rep_spec (r+2) (m3_enum A) (r+1) v (m3_rep_exists A (r+1) v (by rw [ns_sumset_eq_nsmul]; exact hC hv)) have heq : m3_value (m3_enum A) (m3_unitAdd α j) = z + a := by rw [m3_value_unitAdd, hj] exact congrArg (fun n => n + a) hs.2.1 rw [hvα] at hvrep have : v = z + a := by omega exact hmissing (this ▸ hv) have h := ns_weighted_shadow_gap E F hE hF hd α hα j hgap simpa only [he,hf] using h lemma w23_low_B_card (S : NumericalSemigroup) (hlow : ∀ a, S.IsPrimitive a → a < S.conductor → 3 * a ≤ S.conductor) : (3 • w23_low_A S).card = (w23_low_B S).card + (if S.conductor ∈ 3 • w23_low_A S then 1 else 0) := by classical have hb : w23_low_B S = (3 • w23_low_A S).erase S.conductor := by ext x simp only [w23_low_B, Finset.mem_filter, Finset.mem_erase] constructor · intro hx exact ⟨by omega,hx.1⟩ · intro hx have hh := w23_low_bounds S hlow 3 x hx.2 exact ⟨hx.2,by omega⟩ rw [hb] by_cases hc : S.conductor ∈ 3 • w23_low_A S · simp only [hc,↓reduceIte] exact (Finset.card_erase_add_one hc).symm · simp only [hc,↓reduceIte,Finset.erase_eq_of_notMem hc,Nat.add_zero] lemma w23_low_D_card (S : NumericalSemigroup) (h2 : S.conductor ≤ 4 * S.multiplicity) (hlow : ∀ a, S.IsPrimitive a → a < S.conductor → 3 * a ≤ S.conductor) : (w23_D S).card ≤ (w23_low_C S).card + (if S.conductor ∈ 3 • w23_low_A S then 1 else 0) := by classical by_cases hc : S.conductor ∈ 3 • w23_low_A S · simp only [hc,↓reduceIte] have hsub : w23_D S ⊆ insert S.conductor (w23_low_C S) := by intro x hx rcases w23_low_D_repr S h2 hlow x hx with hx | hx · exact Finset.mem_insert_of_mem hx · exact Finset.mem_insert.2 (Or.inl hx) exact (Finset.card_le_card hsub).trans (by have := Finset.card_insert_le S.conductor (w23_low_C S) omega) · simp only [hc,↓reduceIte,Nat.add_zero] apply Finset.card_le_card intro x hx rcases w23_low_D_repr S h2 hlow x hx with hxC | heq · exact hxC · subst x obtain ⟨hxI,hxP⟩ := Finset.mem_filter.1 hx obtain ⟨a,b,ha,hb,hap,hbp,he⟩ := w23_decomposable_eq_add S (S.conductor_spec S.conductor le_rfl) hxP S.conductor_pos (by have := S.multiplicity_pos; omega) obtain ⟨d,hd⟩ := w23_low_left_repr S a ha obtain ⟨e,he'⟩ := w23_low_left_repr S b hb have hmem : S.conductor ∈ (d+e) • w23_low_A S := by rw [add_nsmul] exact Finset.mem_add.2 ⟨a,hd,b,he',he.symm⟩ have hh := w23_low_bounds S hlow (d+e) S.conductor hmem have hde : d+e ≤ 4 := by have := S.multiplicity_pos nlinarith have hlo : 3 ≤ d+e := by by_contra hn have hle : d+e ≤ 2 := by omega have := Nat.mul_le_mul_right S.conductor hle have := S.conductor_pos nlinarith have h4 : d+e = 4 := by by_contra hn have h3 : d+e = 3 := by omega exact hc (by simpa only [h3] using hmem) apply Finset.mem_filter.2 exact ⟨by simpa only [h4] using hmem,by have := S.multiplicity_pos; omega⟩ lemma w23_low_boundary_primitive (S : NumericalSemigroup) (hlow : ∀ a, S.IsPrimitive a → a < S.conductor → 3 * a ≤ S.conductor) (hc : S.conductor ∈ 3 • w23_low_A S) : ∃ a ∈ w23_low_A S, 3 * a = S.conductor := by rw [← ns_sumset_eq_nsmul, m3_sumset_three] at hc obtain ⟨y,hy,a,ha,he⟩ := Finset.mem_add.1 hc obtain ⟨b,hb,d,hd,he'⟩ := Finset.mem_add.1 hy have ha' := w23_low_bounds S hlow 1 a (by simpa using ha) have hb' := w23_low_bounds S hlow 1 b (by simpa using hb) have hd' := w23_low_bounds S hlow 1 d (by simpa using hd) exact ⟨a,ha,by omega⟩ lemma w23_low_boundary_gap (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (hlow : ∀ a, S.IsPrimitive a → a < S.conductor → 3 * a ≤ S.conductor) (hc : S.conductor ∈ 3 • w23_low_A S) : 4 * (w23_low_C S).card + 1 ≤ ((w23_low_A S).card + 3) * (w23_low_B S).card := by classical obtain ⟨a,ha,he⟩ := w23_low_boundary_primitive S hlow hc have hm : S.multiplicity ∈ w23_low_A S := (w23_low_mem_A S S.multiplicity).2 ⟨S.multiplicity_isPrimitive, by have := S.multiplicity_pos omega⟩ have hz : 2 * a + S.multiplicity ∈ w23_low_B S := by apply Finset.mem_filter.2 constructor · rw [← ns_sumset_eq_nsmul, m3_sumset_three] exact Finset.mem_add.2 ⟨a+a,Finset.mem_add.2 ⟨a,ha,a,ha,rfl⟩, S.multiplicity,hm,by omega⟩ · omega apply ns_restricted_succ_gap (w23_low_A S) (w23_low_B S) (w23_low_C S) 3 (Finset.filter_subset _ _) (Finset.filter_subset _ _) (w23_low_C_shadow S hlow) (2*a+S.multiplicity) a hz ha intro hh have := (Finset.mem_filter.1 hh).2 omega theorem w23_q4_low (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (hlow : ∀ a, S.IsPrimitive a → a < S.conductor → 3 * a ≤ S.conductor) : S.SatisfiesWilf := by classical have hleft := w23_low_left_card S h1 h2 hlow have hn := w23_low_A_card S have hD := w23_low_D_card S h2 hlow have hB := w23_low_B_card S hlow have htwo := ns_card_succ_nsmul_le (w23_low_A S) 1 have hthree := ns_card_succ_nsmul_le (w23_low_A S) 2 simp only [one_nsmul] at htwo have hbound : 4 * (w23_D S).card ≤ (w23_low_A S).card * S.leftCount := by by_cases hc : S.conductor ∈ 3 • w23_low_A S · have hgap := w23_low_boundary_gap S h1 hlow hc simp only [hc,↓reduceIte] at hB hD nlinarith · have hfour := ns_restricted_succ_le (w23_low_A S) (w23_low_B S) (w23_low_C S) 3 (Finset.filter_subset _ _) (Finset.filter_subset _ _) (w23_low_C_shadow S hlow) simp only [hc,↓reduceIte,Nat.add_zero] at hB hD nlinarith apply w23_wilf_of_W0 S rw [w23_q_eq_four S h1 h2, ← hn] omega lemma w23_high_primitive_level (S : NumericalSemigroup) (hhigh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 3 * S.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho S ≤ 2 * S.multiplicity) {a : ℕ} (ha : S.IsPrimitive a) (hlt : a < S.conductor) : w23_level S a = 1 := by by_cases he : a = S.multiplicity · rw [he, w23_level_multiplicity] · have hb := hhigh a ha hlt he apply w23_level_one_of_lt S ha.1 ha.2.1 omega lemma w23_high_X1_bounds (S : NumericalSemigroup) (hq : w23_q S = 4) (hhigh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 3 * S.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho S ≤ 2 * S.multiplicity) {a : ℕ} (ha : a ∈ w23_X S 1) : 3 * S.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho S ≤ 2 * S.multiplicity := by classical have hl := ((w23_mem_X S 1 a).1 ha).2 rw [w23_X_one] at ha obtain ⟨hne, hmem⟩ := Finset.mem_erase.1 ha have hp := (S.mem_primitiveElements a).1 (Finset.mem_filter.1 hmem).1 apply hhigh a hp _ hne apply (w23_lt_conductor_iff S a).2 omega lemma w23_high_P_empty (S : NumericalSemigroup) (hq : w23_q S = 4) (hhigh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 3 * S.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho S ≤ 2 * S.multiplicity) (i : ℕ) (hi : 2 ≤ i) (hi4 : i < 4) : w23_P S i = ∅ := by classical apply Finset.eq_empty_iff_forall_notMem.2 intro a ha obtain ⟨hp, hl⟩ := (w23_mem_P S i a).1 ha have hlt : a < S.conductor := (w23_lt_conductor_iff S a).2 (by omega) have := w23_high_primitive_level S hhigh hp hlt omega lemma w23_high_pairs_level (S : NumericalSemigroup) (hq : w23_q S = 4) (hhigh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 3 * S.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho S ≤ 2 * S.multiplicity) {x : ℕ} (hx : x ∈ w23_X S 1 + w23_X S 1) : 3 * S.multiplicity + 1 ≤ x ∧ x + 2 + 2 * w23_rho S ≤ 4 * S.multiplicity ∧ w23_level S x = 3 := by obtain ⟨a, ha, b, hb, rfl⟩ := Finset.mem_add.1 hx have hA := w23_high_X1_bounds S hq hhigh ha have hB := w23_high_X1_bounds S hq hhigh hb have hlo : 3 * S.multiplicity + 1 ≤ a + b := by omega have hhi : a + b + 2 + 2 * w23_rho S ≤ 4 * S.multiplicity := by omega refine ⟨hlo, hhi, (w23_level_eq_iff S (a+b) 3).2 ?_⟩ constructor <;> omega lemma w23_high_X2_empty (S : NumericalSemigroup) (hq : w23_q S = 4) (hhigh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 3 * S.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho S ≤ 2 * S.multiplicity) : w23_X S 2 = ∅ := by classical apply Finset.eq_empty_iff_forall_notMem.2 intro x hx have hl := ((w23_mem_X S 2 x).1 hx).2 have hn : ¬ S.IsPrimitive x := by intro hp have hlt := (w23_lt_conductor_iff S x).2 (show w23_level S x < w23_q S by omega) have := w23_high_primitive_level S hhigh hp hlt omega have hs := w23_X_two_decomp S hx hn have := (w23_high_pairs_level S hq hhigh hs).2.2 omega lemma w23_high_X3_subset (S : NumericalSemigroup) (hq : w23_q S = 4) (hhigh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 3 * S.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho S ≤ 2 * S.multiplicity) : w23_X S 3 ⊆ w23_X S 1 + w23_X S 1 := by intro x hx obtain ⟨hxa, hxl⟩ := (w23_mem_X S 3 x).1 hx have hn : ¬ S.IsPrimitive x := by intro hp have hlt := (w23_lt_conductor_iff S x).2 (show w23_level S x < w23_q S by omega) have := w23_high_primitive_level S hhigh hp hlt omega obtain ⟨y,z,hy,hz,hyp,hzp,he⟩ := w23_apery_split S hxa hn (w23_X_pos S (by omega) hx) have hyS := ((w23_mem_apery S y).1 hy).2.1 have hzS := ((w23_mem_apery S z).1 hz).2.1 have hyl := w23_level_pos_of_mem S hyS hyp have hzl := w23_level_pos_of_mem S hzS hzp have hylt := w23_level_add_ge_of_mem S y hzS hzp have hzlt := w23_level_add_ge_of_mem S z hyS hyp rw [← he] at hylt have hsum : z + y = x := by omega rw [hsum] at hzlt have hX2 := w23_high_X2_empty S hq hhigh have hyne : w23_level S y ≠ 2 := by intro h have hmem := (w23_mem_X S 2 y).2 ⟨hy,h⟩ rw [hX2] at hmem exact Finset.notMem_empty _ hmem have hzne : w23_level S z ≠ 2 := by intro h have hmem := (w23_mem_X S 2 z).2 ⟨hz,h⟩ rw [hX2] at hmem exact Finset.notMem_empty _ hmem exact Finset.mem_add.2 ⟨y, (w23_mem_X S 1 y).2 ⟨hy,by omega⟩, z, (w23_mem_X S 1 z).2 ⟨hz,by omega⟩, he.symm⟩ lemma w23_high_right_subset (S : NumericalSemigroup) (hq : w23_q S = 4) (hhigh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 3 * S.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho S ≤ 2 * S.multiplicity) : n4_right S ⊆ w23_X S 1 + w23_X S 3 := by classical intro x hx obtain ⟨hx4, hn⟩ := Finset.mem_filter.1 hx obtain ⟨hxa, hxl⟩ := (w23_mem_X S 4 x).1 hx4 obtain ⟨y,z,hy,hz,hyp,hzp,he⟩ := w23_apery_split S hxa hn (w23_X_pos S (by omega) hx4) have hyS := ((w23_mem_apery S y).1 hy).2.1 have hzS := ((w23_mem_apery S z).1 hz).2.1 have hyl := w23_level_pos_of_mem S hyS hyp have hzl := w23_level_pos_of_mem S hzS hzp have hylt := w23_level_add_ge_of_mem S y hzS hzp have hzlt := w23_level_add_ge_of_mem S z hyS hyp rw [← he] at hylt have hsum : z + y = x := by omega rw [hsum] at hzlt have hX2 := w23_high_X2_empty S hq hhigh have hyne : w23_level S y ≠ 2 := by intro h have hmem := (w23_mem_X S 2 y).2 ⟨hy,h⟩ rw [hX2] at hmem exact Finset.notMem_empty _ hmem have hzne : w23_level S z ≠ 2 := by intro h have hmem := (w23_mem_X S 2 z).2 ⟨hz,h⟩ rw [hX2] at hmem exact Finset.notMem_empty _ hmem have hnot33 : ¬ (w23_level S y = 3 ∧ w23_level S z = 3) := by rintro ⟨hy3,hz3⟩ have hyb := (w23_level_eq_iff S y 3).1 hy3 have hzb := (w23_level_eq_iff S z 3).1 hz3 have hxb := (w23_level_eq_iff S x 4).1 hxl have hr := w23_rho_lt S omega have hadd := w23_level_add_le S y z rw [← he] at hadd have hc : (w23_level S y = 1 ∧ w23_level S z = 3) ∨ (w23_level S y = 3 ∧ w23_level S z = 1) := by omega rcases hc with ⟨hy1,hz3⟩ | ⟨hy3,hz1⟩ · exact Finset.mem_add.2 ⟨y,(w23_mem_X S 1 y).2 ⟨hy,hy1⟩, z,(w23_mem_X S 3 z).2 ⟨hz,hz3⟩,he.symm⟩ · exact Finset.mem_add.2 ⟨z,(w23_mem_X S 1 z).2 ⟨hz,hz1⟩, y,(w23_mem_X S 3 y).2 ⟨hy,hy3⟩,by omega⟩ lemma w23_high_counts (S : NumericalSemigroup) (hq : w23_q S = 4) (hhigh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 3 * S.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho S ≤ 2 * S.multiplicity) : w23_n S = 1 + (w23_X S 1).card ∧ S.leftCount = 4 + 3 * (w23_X S 1).card + (w23_X S 3).card ∧ (w23_D S).card = 1 + (w23_X S 1).card + (w23_X S 3).card + (n4_right S).card ∧ S.embeddingDimension + (w23_X S 3).card + (n4_right S).card = S.multiplicity := by classical have hP2 := w23_high_P_empty S hq hhigh 2 (by omega) (by omega) have hP3 := w23_high_P_empty S hq hhigh 3 (by omega) (by omega) have hX2 := w23_high_X2_empty S hq hhigh have ha1 := w23_alpha_one S change (w23_X S 1).card + 1 = (w23_P S 1).card at ha1 have hn := w23_n_eq_sum S change w23_n S = ∑ i ∈ Finset.range (w23_q S), (w23_P S i).card at hn rw [hq] at hn norm_num [Finset.sum_range_succ,w23_P_zero,hP2,hP3] at hn have hl := w23_leftCount_eq S rw [hq] at hl norm_num [Finset.sum_range_succ,w23_alpha,w23_X_zero,hX2] at hl have hmc : S.multiplicity < S.conductor := by have hb := (w23_q_bounds S).1 rw [hq] at hb omega have hd := w23_D_card_eq S hmc rw [hq] at hd have hreq : (@Finset.filter ℕ (fun x => ¬ S.IsPrimitive x) (Classical.decPred _) (w23_X S 4)) = n4_right S := by ext x simp [n4_right] rw [hreq] at hd norm_num [Finset.sum_range_succ,w23_alpha,w23_X_zero,hX2] at hd have he := w23_e_eq S have hm := w23_m_eq S exact ⟨by omega,by omega,by omega,by omega⟩ lemma w23_high_pair_card (S : NumericalSemigroup) (hq : w23_q S = 4) (hhigh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 3 * S.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho S ≤ 2 * S.multiplicity) : 2 * (w23_X S 3).card ≤ (w23_X S 1).card * ((w23_X S 1).card + 1) := by have hb := (Finset.card_le_card (w23_high_X3_subset S hq hhigh)).trans (w23_card_two_add_le (w23_X S 1)) have he := w23_choose_two_mul (w23_X S 1).card omega lemma w23_high_right_card_product (S : NumericalSemigroup) (hq : w23_q S = 4) (hhigh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 3 * S.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho S ≤ 2 * S.multiplicity) : (n4_right S).card ≤ (w23_X S 1).card * (w23_X S 3).card := (Finset.card_le_card (w23_high_right_subset S hq hhigh)).trans (w23_card_add_le (w23_X S 1) (w23_X S 3)) lemma w23_high_right_lower (S : NumericalSemigroup) (hq : w23_q S = 4) (hhigh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 3 * S.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho S ≤ 2 * S.multiplicity) {x : ℕ} (hx : x ∈ n4_right S) : 9 * S.multiplicity + 3 ≤ 2 * x := by obtain ⟨a,ha,y,hy,he⟩ := Finset.mem_add.1 (w23_high_right_subset S hq hhigh hx) obtain ⟨b,hb,c,hc,hbc⟩ := Finset.mem_add.1 (w23_high_X3_subset S hq hhigh hy) have hA := w23_high_X1_bounds S hq hhigh ha have hB := w23_high_X1_bounds S hq hhigh hb have hC := w23_high_X1_bounds S hq hhigh hc omega lemma w23_high_interval_card (A : Finset ℕ) (m rho : ℕ) (hm : 2 * rho + 3 ≤ m) (hA : ∀ x ∈ A, 9 * m + 3 ≤ 2 * x ∧ x + rho < 5 * m) : 2 * A.card + 2 * rho + 3 ≤ m := by have hsub : A ⊆ Finset.Ico ((9 * m + 4) / 2) (5 * m - rho) := by intro x hx have hb := hA x hx apply Finset.mem_Ico.2 constructor <;> omega have hc := Finset.card_le_card hsub rw [Nat.card_Ico] at hc omega lemma w23_high_right_card_interval (S : NumericalSemigroup) (hq : w23_q S = 4) (hhigh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 3 * S.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho S ≤ 2 * S.multiplicity) (hne : (w23_X S 1).Nonempty) : 2 * (n4_right S).card + 2 * w23_rho S + 3 ≤ S.multiplicity := by classical obtain ⟨a,ha⟩ := hne have hab := w23_high_X1_bounds S hq hhigh ha apply w23_high_interval_card (n4_right S) S.multiplicity (w23_rho S) (by omega) intro x hx have hlo := w23_high_right_lower S hq hhigh hx have hx4 := (Finset.mem_filter.1 hx).1 have hl := ((w23_mem_X S 4 x).1 hx4).2 have hu := ((w23_level_eq_iff S x 4).1 hl).2 exact ⟨hlo,by omega⟩ lemma th_high_polynomial (k b : ℤ) (hk : 2 ≤ k) (hb : 0 ≤ b) (hbcard : 2 * b ≤ k * (k + 1)) : 0 ≤ 3 * k ^ 2 - k + 8 + (k - 7) * b := by by_cases hk7 : 7 ≤ k · have hterm : 0 ≤ (k - 7) * b := mul_nonneg (by omega) hb have hbase : 0 ≤ k * (k - 1) := mul_nonneg (by omega) (by omega) nlinarith · have hku : k ≤ 6 := by omega interval_cases k <;> nlinarith lemma th_high_lower_bound (k b t e m rho L c : ℤ) (hk : 2 ≤ k) (hb : 0 ≤ b) (he : k + 1 ≤ e) (hecount : e = m - b - t) (ht : 2 * t ≤ m - 2 * rho - 3) (hL : L = 4 + 3 * k + b) (hc : c = 4 * m - rho) : 3 * k ^ 2 - k + 8 + (k - 7) * b + 9 * rho ≤ e * L - c := by have hpacking : m ≤ 2 * e + 2 * b - 2 * rho - 3 := by omega have hL8 : 0 ≤ L - 8 := by omega have hmon : (k + 1) * (L - 8) ≤ e * (L - 8) := mul_le_mul_of_nonneg_right he hL8 nlinarith lemma w23_high_wilf_counts (S : NumericalSemigroup) (k b t rho : ℕ) (hk : 2 ≤ k) (hbcard : 2 * b ≤ k * (k + 1)) (he : k + 1 ≤ S.embeddingDimension) (hecount : S.embeddingDimension + b + t = S.multiplicity) (ht : 2 * t + 2 * rho + 3 ≤ S.multiplicity) (hL : S.leftCount = 4 + 3 * k + b) (hc : S.conductor + rho = 4 * S.multiplicity) : S.SatisfiesWilf := by have hecountZ : (S.embeddingDimension : ℤ) = (S.multiplicity : ℤ) - b - t := by have h : (S.embeddingDimension : ℤ) + b + t = S.multiplicity := by exact_mod_cast hecount omega have htZ : 2 * (t : ℤ) ≤ (S.multiplicity : ℤ) - 2 * rho - 3 := by have h : 2 * (t : ℤ) + 2 * rho + 3 ≤ S.multiplicity := by exact_mod_cast ht omega have hcZ : (S.conductor : ℤ) = 4 * (S.multiplicity : ℤ) - rho := by have h : (S.conductor : ℤ) + rho = 4 * (S.multiplicity : ℤ) := by exact_mod_cast hc omega have hp := th_high_polynomial (k : ℤ) b (by exact_mod_cast hk) (by positivity) (by exact_mod_cast hbcard) have hl := th_high_lower_bound (k : ℤ) b t S.embeddingDimension S.multiplicity rho S.leftCount S.conductor (by exact_mod_cast hk) (by positivity) (by exact_mod_cast he) hecountZ htZ (by exact_mod_cast hL) hcZ have hresult : (S.conductor : ℤ) ≤ (S.embeddingDimension : ℤ) * S.leftCount := by have hr : (0 : ℤ) ≤ rho := by positivity linarith unfold NumericalSemigroup.SatisfiesWilf exact_mod_cast hresult theorem w23_q4_high (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (hhigh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 3 * S.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho S ≤ 2 * S.multiplicity) : S.SatisfiesWilf := by classical have hq := w23_q_eq_four S h1 h2 by_cases hX1 : w23_X S 1 = ∅ · exact w23_q4_of_X1_empty S h1 h2 hX1 have hne : (w23_X S 1).Nonempty := Finset.nonempty_iff_ne_empty.2 hX1 obtain ⟨hn,hl,hd,he⟩ := w23_high_counts S hq hhigh have hpair := w23_high_pair_card S hq hhigh have hright := w23_high_right_card_product S hq hhigh by_cases hk : 2 ≤ (w23_X S 1).card · have hei := w23_e_eq S have hc := w23_q_mul_sub S rw [hq] at hc exact w23_high_wilf_counts S (w23_X S 1).card (w23_X S 3).card (n4_right S).card (w23_rho S) hk hpair (by omega) he (w23_high_right_card_interval S hq hhigh hne) hl hc.symm · have hk1 : (w23_X S 1).card = 1 := by have := Finset.card_pos.2 hne omega have hb : (w23_X S 3).card ≤ 1 := by rw [hk1] at hpair; omega have ht : (n4_right S).card ≤ 1 := by rw [hk1] at hright; omega apply w23_wilf_of_W0 S rw [hq,hn,hl,hd,hk1] nlinarith lemma w23_high_X1_eq_left (S : NumericalSemigroup) (hq : w23_q S = 4) (hhigh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 3 * S.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho S ≤ 2 * S.multiplicity) : w23_X S 1 = (w23_low_A S).erase S.multiplicity := by classical ext a constructor · intro ha have hl := ((w23_mem_X S 1 a).1 ha).2 rw [w23_X_one] at ha obtain ⟨hne, hmem⟩ := Finset.mem_erase.1 ha have hp := (S.mem_primitiveElements a).1 (Finset.mem_filter.1 hmem).1 exact Finset.mem_erase.2 ⟨hne, (w23_low_mem_A S a).2 ⟨hp, (w23_lt_conductor_iff S a).2 (by omega)⟩⟩ · intro ha obtain ⟨hne, hmem⟩ := Finset.mem_erase.1 ha obtain ⟨hp, hlt⟩ := (w23_low_mem_A S a).1 hmem exact (w23_mem_X S 1 a).2 ⟨w23_primitive_mem_apery S hp hne, w23_high_primitive_level S hhigh hp hlt⟩ lemma w23_high_right_triples (S : NumericalSemigroup) (hq : w23_q S = 4) (hhigh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 3 * S.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho S ≤ 2 * S.multiplicity) : n4_right S ⊆ w23_X S 1 + w23_X S 1 + w23_X S 1 := by intro x hx obtain ⟨a,ha,z,hz,he⟩ := Finset.mem_add.1 (w23_high_right_subset S hq hhigh hx) obtain ⟨b,hb,c,hc,hbc⟩ := Finset.mem_add.1 (w23_high_X3_subset S hq hhigh hz) exact Finset.mem_add.2 ⟨a+b,Finset.add_mem_add ha hb,c,hc,by omega⟩ lemma w23_high_level2_elements (S : NumericalSemigroup) (hq : w23_q S = 4) (hhigh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 3 * S.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho S ≤ 2 * S.multiplicity) : S.leftElements.filter (fun x => w23_level S x = 2) = insert (2 * S.multiplicity) ((w23_X S 1).image (fun a => a + S.multiplicity)) := by classical have hX2 := w23_high_X2_empty S hq hhigh ext x constructor · intro hx obtain ⟨hxL,hxl⟩ := Finset.mem_filter.1 hx have hxS := ((S.mem_leftElements x).1 hxL).2 have hpred : ∃ y, y ∈ S.carrier ∧ y + S.multiplicity = x := by by_contra hn have ha := w23_apery_of_no_predecessor S hxS hn have hmem := (w23_mem_X S 2 x).2 ⟨ha,hxl⟩ rw [hX2] at hmem exact Finset.notMem_empty _ hmem obtain ⟨y,hy,he⟩ := hpred have hyl := w23_level_add_mul S y rw [he] at hyl have hy1 : w23_level S y = 1 := by omega by_cases hym : y = S.multiplicity · exact Finset.mem_insert.2 (Or.inl (by omega)) · have hp : S.IsPrimitive y := by apply w23_primitive_of_lt_two_mul S hy · by_contra hn have h0 : y = 0 := by omega rw [h0,w23_level_zero] at hy1 omega · have hb := (w23_level_eq_iff S y 1).1 hy1 omega exact Finset.mem_insert.2 (Or.inr (Finset.mem_image.2 ⟨y,(w23_mem_X S 1 y).2 ⟨w23_primitive_mem_apery S hp hym,hy1⟩,he⟩)) · intro hx rcases Finset.mem_insert.1 hx with h2m | hx · subst x have hl : w23_level S (2 * S.multiplicity) = 2 := by have h := w23_level_add_mul S S.multiplicity rw [w23_level_multiplicity] at h simpa only [two_mul] using h exact Finset.mem_filter.2 ⟨(S.mem_leftElements _).2 ⟨(w23_lt_conductor_iff S _).2 (by omega),w23_mul_mem S 2⟩,hl⟩ · obtain ⟨a,ha,rfl⟩ := Finset.mem_image.1 hx obtain ⟨hap,hal⟩ := (w23_mem_X S 1 a).1 ha have hl : w23_level S (a + S.multiplicity) = 2 := by rw [w23_level_add_mul,hal] exact Finset.mem_filter.2 ⟨(S.mem_leftElements _).2 ⟨(w23_lt_conductor_iff S _).2 (by omega), S.carrier.add_mem ((w23_mem_apery S a).1 hap).2.1 S.multiplicity_mem⟩,hl⟩ lemma w23_lh_primitive_level (S : NumericalSemigroup) (hlh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 2 * a + w23_rho S < 3 * S.multiplicity) {a : ℕ} (ha : S.IsPrimitive a) (hlt : a < S.conductor) : w23_level S a = 1 := by by_cases he : a = S.multiplicity · rw [he, w23_level_multiplicity] · have hb := hlh a ha hlt he have hm := S.multiplicity_le ha.2.1 ha.1 apply w23_level_one_of_lt S ha.1 ha.2.1 omega lemma w23_lh_X1_bounds (S : NumericalSemigroup) (hq : w23_q S = 4) (hlh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 2 * a + w23_rho S < 3 * S.multiplicity) {a : ℕ} (ha : a ∈ w23_X S 1) : S.multiplicity < a ∧ 2 * a + w23_rho S < 3 * S.multiplicity := by classical have hl := ((w23_mem_X S 1 a).1 ha).2 have hg := w23_X_one_gt S ha rw [w23_X_one] at ha obtain ⟨hne, hmem⟩ := Finset.mem_erase.1 ha have hp := (S.mem_primitiveElements a).1 (Finset.mem_filter.1 hmem).1 exact ⟨hg, hlh a hp ((w23_lt_conductor_iff S a).2 (by omega)) hne⟩ lemma w23_lh_P_empty (S : NumericalSemigroup) (hq : w23_q S = 4) (hlh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 2 * a + w23_rho S < 3 * S.multiplicity) (i : ℕ) (hi : 2 ≤ i) (hi4 : i < 4) : w23_P S i = ∅ := by classical apply Finset.eq_empty_iff_forall_notMem.2 intro a ha obtain ⟨hp, hl⟩ := (w23_mem_P S i a).1 ha have hlt : a < S.conductor := (w23_lt_conductor_iff S a).2 (by omega) have := w23_lh_primitive_level S hlh hp hlt omega lemma w23_lh_pairs_level (S : NumericalSemigroup) (hq : w23_q S = 4) (hlh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 2 * a + w23_rho S < 3 * S.multiplicity) {x : ℕ} (hx : x ∈ 2 • w23_X S 1) : w23_level S x = 2 := by rw [two_nsmul] at hx obtain ⟨a, ha, b, hb, rfl⟩ := Finset.mem_add.1 hx have hA := w23_lh_X1_bounds S hq hlh ha have hB := w23_lh_X1_bounds S hq hlh hb apply (w23_level_eq_iff S (a+b) 2).2 constructor <;> omega lemma lh_nsmul_lower (A : Finset ℕ) (m : ℕ) (hA : ∀ a ∈ A, m ≤ a) (d x : ℕ) (hx : x ∈ d • A) : d * m ≤ x := by induction d generalizing x with | zero => have : x = 0 := by simpa using hx subst x simp | succ d ih => rw [succ_nsmul] at hx obtain ⟨y, hy, a, ha, rfl⟩ := Finset.mem_add.1 hx have hb := ih y hy have hab := hA a ha nlinarith lemma w23_lh_sumset_carrier (S : NumericalSemigroup) (d x : ℕ) (hx : x ∈ d • w23_X S 1) : x ∈ S.carrier := by apply ns_nsmul_mem_carrier S (w23_X S 1) _ d x hx intro a ha exact ((w23_mem_apery S a).1 ((w23_mem_X S 1 a).1 ha).1).2.1 lemma w23_lh_degree_le (S : NumericalSemigroup) (d x : ℕ) (hx : x ∈ d • w23_X S 1) : d ≤ w23_level S x := by have hlo := lh_nsmul_lower (w23_X S 1) S.multiplicity (fun a ha => Nat.le_of_lt (w23_X_one_gt S ha)) d x hx have hhi := ((w23_level_eq_iff S x (w23_level S x)).1 rfl).2 have hm := S.multiplicity_pos by_contra hn have hd : w23_level S x + 1 ≤ d := by omega have hmul := Nat.mul_le_mul_right S.multiplicity hd omega lemma w23_lh_remove_m (S : NumericalSemigroup) (hlh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 2 * a + w23_rho S < 3 * S.multiplicity) (d x : ℕ) (hx : x ∈ d • w23_low_A S) (hxa : x ∈ w23_apery S) : x ∈ d • w23_X S 1 := by induction d generalizing x with | zero => simpa using hx | succ d ih => rw [succ_nsmul] at hx ⊢ obtain ⟨y, hy, a, ha, rfl⟩ := Finset.mem_add.1 hx have hyS := w23_low_sumset_carrier S d y hy obtain ⟨hp, hlt⟩ := (w23_low_mem_A S a).1 ha have hya := w23_apery_closed S hxa hyS hp.1 rfl have haa := w23_apery_closed S hxa hp.1 hyS (by omega) have hne : a ≠ S.multiplicity := by intro he rw [he] at haa exact w23_multiplicity_not_mem_apery S haa exact Finset.add_mem_add (ih y hy hya) ((w23_mem_X S 1 a).2 ⟨haa, w23_lh_primitive_level S hlh hp hlt⟩) lemma w23_lh_left_repr (S : NumericalSemigroup) (hlh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 2 * a + w23_rho S < 3 * S.multiplicity) {x : ℕ} (hx : x ∈ w23_apery S) (hlt : x < S.conductor) : ∃ d : ℕ, x ∈ d • w23_X S 1 := by have hxL := (S.mem_leftElements x).2 ⟨hlt, ((w23_mem_apery S x).1 hx).2.1⟩ obtain ⟨d, hd⟩ := w23_low_left_repr S x hxL exact ⟨d, w23_lh_remove_m S hlh d x hd hx⟩ lemma w23_lh_right_repr (S : NumericalSemigroup) (hlh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 2 * a + w23_rho S < 3 * S.multiplicity) {x : ℕ} (hx : x ∈ n4_right S) : ∃ d : ℕ, x ∈ d • w23_X S 1 := by classical obtain ⟨hx4, hn⟩ := Finset.mem_filter.1 hx obtain ⟨hxa, hxl⟩ := (w23_mem_X S 4 x).1 hx4 have hxS := ((w23_mem_apery S x).1 hxa).2.1 obtain ⟨a,b,ha,hb,hap,hbp,he⟩ := w23_decomposable_eq_add S hxS hn (w23_X_pos S (by omega) hx4) (w23_apery_lt S hxa) obtain ⟨d,hd⟩ := w23_low_left_repr S a ha obtain ⟨e,he'⟩ := w23_low_left_repr S b hb have hmem : x ∈ (d+e) • w23_low_A S := by rw [add_nsmul] exact Finset.mem_add.2 ⟨a,hd,b,he',he.symm⟩ exact ⟨d+e,w23_lh_remove_m S hlh (d+e) x hmem hxa⟩ lemma w23_lh_X2_subset (S : NumericalSemigroup) (hq : w23_q S = 4) (hlh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 2 * a + w23_rho S < 3 * S.multiplicity) : w23_X S 2 ⊆ 2 • w23_X S 1 := by intro x hx have hl := ((w23_mem_X S 2 x).1 hx).2 have hn : ¬ S.IsPrimitive x := by intro hp have hlt := (w23_lt_conductor_iff S x).2 (by omega) have := w23_lh_primitive_level S hlh hp hlt omega simpa only [two_nsmul] using w23_X_two_decomp S hx hn lemma w23_lh_X3_subset (S : NumericalSemigroup) (hq : w23_q S = 4) (hlh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 2 * a + w23_rho S < 3 * S.multiplicity) : w23_X S 3 ⊆ 3 • w23_X S 1 := by intro x hx obtain ⟨hxa, hxl⟩ := (w23_mem_X S 3 x).1 hx obtain ⟨d, hd⟩ := w23_lh_left_repr S hlh hxa ((w23_lt_conductor_iff S x).2 (by omega)) have hdle := w23_lh_degree_le S d x hd rw [hxl] at hdle interval_cases d · have hx0 : x = 0 := by simpa using hd rw [hx0,w23_level_zero] at hxl omega · have hl1 := ((w23_mem_X S 1 x).1 (by simpa using hd)).2 omega · have hl2 := w23_lh_pairs_level S hq hlh hd omega · exact hd lemma w23_lh_right_subset (S : NumericalSemigroup) (hq : w23_q S = 4) (hlh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 2 * a + w23_rho S < 3 * S.multiplicity) : n4_right S ⊆ (3 • w23_X S 1) ∪ (4 • w23_X S 1) := by classical intro x hx have hxl := ((w23_mem_X S 4 x).1 (Finset.mem_filter.1 hx).1).2 obtain ⟨d,hd⟩ := w23_lh_right_repr S hlh hx have hdle := w23_lh_degree_le S d x hd rw [hxl] at hdle interval_cases d · have hx0 : x = 0 := by simpa using hd rw [hx0,w23_level_zero] at hxl omega · have hl1 := ((w23_mem_X S 1 x).1 (by simpa using hd)).2 omega · have hl2 := w23_lh_pairs_level S hq hlh hd omega · exact Finset.mem_union.2 (Or.inl hd) · exact Finset.mem_union.2 (Or.inr hd) noncomputable def lh_right_three (S : NumericalSemigroup) : Finset ℕ := n4_right S ∩ (3 • w23_X S 1) noncomputable def lh_right_four (S : NumericalSemigroup) : Finset ℕ := n4_right S ∩ (4 • w23_X S 1) lemma w23_lh_parent (S : NumericalSemigroup) (r : ℕ) {x a z : ℕ} (hx : x ∈ w23_apery S) (ha : a ∈ w23_X S 1) (hz : z ∈ r • w23_X S 1) (he : x = z + a) : z ∈ w23_apery S ∧ w23_level S z + 1 ≤ w23_level S x := by have hzS := w23_lh_sumset_carrier S r z hz have haS := ((w23_mem_apery S a).1 ((w23_mem_X S 1 a).1 ha).1).2.1 have hap := w23_X_pos S (by omega) ha refine ⟨w23_apery_closed S hx hzS haS he, ?_⟩ have hh := w23_level_add_ge_of_mem S z haS hap simpa only [← he] using hh lemma w23_lh_pair_card (S : NumericalSemigroup) (hq : w23_q S = 4) (hlh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 2 * a + w23_rho S < 3 * S.multiplicity) : 2 * (w23_X S 2).card ≤ ((w23_X S 1).card + 1) * (w23_X S 1).card := by have hh := ns_restricted_succ_le (w23_X S 1) (w23_X S 1) (w23_X S 2) 1 (by simp) (w23_lh_X2_subset S hq hlh) (by intro c hc a ha z hz he; simpa only [one_nsmul] using hz) simpa only [Nat.reduceAdd] using hh lemma w23_lh_triple_card (S : NumericalSemigroup) (hq : w23_q S = 4) (hlh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 2 * a + w23_rho S < 3 * S.multiplicity) : 3 * ((w23_X S 3).card + (lh_right_three S).card) ≤ ((w23_X S 1).card + 2) * (w23_X S 2).card := by classical have hC : w23_X S 3 ∪ lh_right_three S ⊆ 3 • w23_X S 1 := by intro x hx rcases Finset.mem_union.1 hx with hx | hx · exact w23_lh_X3_subset S hq hlh hx · exact (Finset.mem_inter.1 hx).2 have hdiv : ∀ x ∈ w23_X S 3 ∪ lh_right_three S, ∀ a ∈ w23_X S 1, ∀ z ∈ 2 • w23_X S 1, x = z + a → z ∈ w23_X S 2 := by intro x hx a ha z hz he have hxa : x ∈ w23_apery S := by rcases Finset.mem_union.1 hx with hx | hx · exact ((w23_mem_X S 3 x).1 hx).1 · exact ((w23_mem_X S 4 x).1 (Finset.mem_filter.1 (Finset.mem_inter.1 hx).1).1).1 exact (w23_mem_X S 2 z).2 ⟨(w23_lh_parent S 2 hxa ha hz he).1,w23_lh_pairs_level S hq hlh hz⟩ have hh := ns_restricted_succ_le (w23_X S 1) (w23_X S 2) (w23_X S 3 ∪ lh_right_three S) 2 (w23_lh_X2_subset S hq hlh) hC hdiv have hdis : Disjoint (w23_X S 3) (lh_right_three S) := by apply Finset.disjoint_left.2 intro x hx3 hxR have h3 := ((w23_mem_X S 3 x).1 hx3).2 have h4 := ((w23_mem_X S 4 x).1 (Finset.mem_filter.1 (Finset.mem_inter.1 hxR).1).1).2 omega rw [Finset.card_union_of_disjoint hdis] at hh exact hh lemma w23_lh_quadruple_card (S : NumericalSemigroup) (hq : w23_q S = 4) (hlh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 2 * a + w23_rho S < 3 * S.multiplicity) : 4 * (lh_right_four S).card ≤ ((w23_X S 1).card + 3) * (w23_X S 3).card := by classical have hdiv : ∀ x ∈ lh_right_four S, ∀ a ∈ w23_X S 1, ∀ z ∈ 3 • w23_X S 1, x = z + a → z ∈ w23_X S 3 := by intro x hx a ha z hz he have hx4 := (Finset.mem_filter.1 (Finset.mem_inter.1 hx).1).1 obtain ⟨hxa,hxl⟩ := (w23_mem_X S 4 x).1 hx4 obtain ⟨hza,hzle⟩ := w23_lh_parent S 3 hxa ha hz he have hzge := w23_lh_degree_le S 3 z hz exact (w23_mem_X S 3 z).2 ⟨hza,by omega⟩ exact ns_restricted_succ_le (w23_X S 1) (w23_X S 3) (lh_right_four S) 3 (w23_lh_X3_subset S hq hlh) (fun x hx => (Finset.mem_inter.1 hx).2) hdiv lemma w23_lh_right_card (S : NumericalSemigroup) (hq : w23_q S = 4) (hlh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 2 * a + w23_rho S < 3 * S.multiplicity) : (n4_right S).card ≤ (lh_right_three S).card + (lh_right_four S).card := by classical have hsub : n4_right S ⊆ lh_right_three S ∪ lh_right_four S := by intro x hx rcases Finset.mem_union.1 (w23_lh_right_subset S hq hlh hx) with h3 | h4 · exact Finset.mem_union.2 (Or.inl (Finset.mem_inter.2 ⟨hx,h3⟩)) · exact Finset.mem_union.2 (Or.inr (Finset.mem_inter.2 ⟨hx,h4⟩)) exact (Finset.card_le_card hsub).trans (Finset.card_union_le _ _) lemma w23_lh_counts (S : NumericalSemigroup) (hq : w23_q S = 4) (hlh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 2 * a + w23_rho S < 3 * S.multiplicity) : w23_n S = 1 + (w23_X S 1).card ∧ S.leftCount = 4 + 3 * (w23_X S 1).card + 2 * (w23_X S 2).card + (w23_X S 3).card ∧ (w23_D S).card = 1 + (w23_X S 1).card + (w23_X S 2).card + (w23_X S 3).card + (n4_right S).card ∧ S.embeddingDimension + (w23_X S 2).card + (w23_X S 3).card + (n4_right S).card = S.multiplicity := by classical have hP2 := w23_lh_P_empty S hq hlh 2 (by omega) (by omega) have hP3 := w23_lh_P_empty S hq hlh 3 (by omega) (by omega) have ha1 := w23_alpha_one S change (w23_X S 1).card + 1 = (w23_P S 1).card at ha1 have hn := w23_n_eq_sum S change w23_n S = ∑ i ∈ Finset.range (w23_q S), (w23_P S i).card at hn rw [hq] at hn norm_num [Finset.sum_range_succ,w23_P_zero,hP2,hP3] at hn have hl := w23_leftCount_eq S rw [hq] at hl norm_num [Finset.sum_range_succ,w23_alpha,w23_X_zero] at hl have hmc : S.multiplicity < S.conductor := by have hb := (w23_q_bounds S).1 rw [hq] at hb omega have hd := w23_D_card_eq S hmc rw [hq] at hd have hreq : (@Finset.filter ℕ (fun x => ¬ S.IsPrimitive x) (Classical.decPred _) (w23_X S 4)) = n4_right S := by ext x simp [n4_right] rw [hreq] at hd norm_num [Finset.sum_range_succ,w23_alpha,w23_X_zero] at hd have he := w23_e_eq S have hm := w23_m_eq S exact ⟨by omega,by omega,by omega,by omega⟩ lemma lh_polynomial (k u v w3 w4 : ℕ) (h2 : 2 * u ≤ (k+1) * k) (h3 : 3 * (v+w3) ≤ (k+2) * u) (h4 : 4 * w4 ≤ (k+3) * v) : 4 * (1+k+u+v+w3+w4) ≤ (1+k) * (4+3*k+2*u+v) := by nlinarith lemma w23_lh_wilf_counts (S : NumericalSemigroup) (k u v w w3 w4 : ℕ) (h2 : 2 * u ≤ (k+1) * k) (h3 : 3 * (v+w3) ≤ (k+2) * u) (h4 : 4 * w4 ≤ (k+3) * v) (hw : w ≤ w3+w4) (he : 1+k ≤ S.embeddingDimension) (hm : S.embeddingDimension + u + v + w = S.multiplicity) (hL : S.leftCount = 4+3*k+2*u+v) (hc : S.conductor + w23_rho S = 4 * S.multiplicity) : S.SatisfiesWilf := by have hpoly := lh_polynomial k u v w3 w4 h2 h3 h4 have hleft : 4 ≤ S.leftCount := by omega have hmon := Nat.mul_le_mul_right (S.leftCount - 4) he have hsub : S.leftCount - 4 + 4 = S.leftCount := by omega unfold NumericalSemigroup.SatisfiesWilf nlinarith theorem w23_q4_lowhalf (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (hlh : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → 2 * a + w23_rho S < 3 * S.multiplicity) : S.SatisfiesWilf := by classical have hq := w23_q_eq_four S h1 h2 by_cases hX1 : w23_X S 1 = ∅ · exact w23_q4_of_X1_empty S h1 h2 hX1 obtain ⟨hn,hL,hD,hm⟩ := w23_lh_counts S hq hlh have he := w23_e_eq S have hc := w23_q_mul_sub S rw [hq] at hc exact w23_lh_wilf_counts S (w23_X S 1).card (w23_X S 2).card (w23_X S 3).card (n4_right S).card (lh_right_three S).card (lh_right_four S).card (w23_lh_pair_card S hq hlh) (w23_lh_triple_card S hq hlh) (w23_lh_quadruple_card S hq hlh) (w23_lh_right_card S hq hlh) (by omega) hm hL hc.symm lemma w23_cm_primitive_level (S : NumericalSemigroup) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) {a : ℕ} (ha : S.IsPrimitive a) (hlt : a < S.conductor) : w23_level S a = 1 := by by_cases he : a = S.multiplicity · rw [he, w23_level_multiplicity] · have hb := hcore a ha hlt he have hm := S.multiplicity_le ha.2.1 ha.1 apply w23_level_one_of_lt S ha.1 ha.2.1 omega lemma w23_cm_P_empty (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) (i : ℕ) (hi : 2 ≤ i) (hi4 : i < 4) : w23_P S i = ∅ := by classical apply Finset.eq_empty_iff_forall_notMem.2 intro a ha obtain ⟨hp, hl⟩ := (w23_mem_P S i a).1 ha have hlt : a < S.conductor := (w23_lt_conductor_iff S a).2 (by omega) have := w23_cm_primitive_level S hcore hp hlt omega lemma w23_cm_remove_m (S : NumericalSemigroup) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) (d x : ℕ) (hx : x ∈ d • w23_low_A S) (hxa : x ∈ w23_apery S) : x ∈ d • w23_X S 1 := by induction d generalizing x with | zero => simpa using hx | succ d ih => rw [succ_nsmul] at hx ⊢ obtain ⟨y, hy, a, ha, rfl⟩ := Finset.mem_add.1 hx have hyS := w23_low_sumset_carrier S d y hy obtain ⟨hp, hlt⟩ := (w23_low_mem_A S a).1 ha have hya := w23_apery_closed S hxa hyS hp.1 rfl have haa := w23_apery_closed S hxa hp.1 hyS (by omega) have hne : a ≠ S.multiplicity := by intro he rw [he] at haa exact w23_multiplicity_not_mem_apery S haa exact Finset.add_mem_add (ih y hy hya) ((w23_mem_X S 1 a).2 ⟨haa, w23_cm_primitive_level S hcore hp hlt⟩) lemma w23_cm_left_repr (S : NumericalSemigroup) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) {x : ℕ} (hx : x ∈ w23_apery S) (hlt : x < S.conductor) : ∃ d : ℕ, x ∈ d • w23_X S 1 := by have hxL := (S.mem_leftElements x).2 ⟨hlt, ((w23_mem_apery S x).1 hx).2.1⟩ obtain ⟨d, hd⟩ := w23_low_left_repr S x hxL exact ⟨d, w23_cm_remove_m S hcore d x hd hx⟩ lemma w23_cm_right_repr (S : NumericalSemigroup) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) {x : ℕ} (hx : x ∈ n4_right S) : ∃ d : ℕ, x ∈ d • w23_X S 1 := by classical obtain ⟨hx4, hn⟩ := Finset.mem_filter.1 hx obtain ⟨hxa, hxl⟩ := (w23_mem_X S 4 x).1 hx4 have hxS := ((w23_mem_apery S x).1 hxa).2.1 obtain ⟨a,b,ha,hb,hap,hbp,he⟩ := w23_decomposable_eq_add S hxS hn (w23_X_pos S (by omega) hx4) (w23_apery_lt S hxa) obtain ⟨d,hd⟩ := w23_low_left_repr S a ha obtain ⟨e,he'⟩ := w23_low_left_repr S b hb have hmem : x ∈ (d+e) • w23_low_A S := by rw [add_nsmul] exact Finset.mem_add.2 ⟨a,hd,b,he',he.symm⟩ exact ⟨d+e,w23_cm_remove_m S hcore (d+e) x hmem hxa⟩ lemma w23_cm_X2_subset (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) : w23_X S 2 ⊆ 2 • w23_X S 1 := by intro x hx have hl := ((w23_mem_X S 2 x).1 hx).2 have hn : ¬ S.IsPrimitive x := by intro hp have hlt := (w23_lt_conductor_iff S x).2 (by omega) have := w23_cm_primitive_level S hcore hp hlt omega simpa only [two_nsmul] using w23_X_two_decomp S hx hn lemma w23_cm_counts (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) : w23_n S = 1 + (w23_X S 1).card ∧ S.leftCount = 4 + 3 * (w23_X S 1).card + 2 * (w23_X S 2).card + (w23_X S 3).card ∧ (w23_D S).card = 1 + (w23_X S 1).card + (w23_X S 2).card + (w23_X S 3).card + (n4_right S).card ∧ S.embeddingDimension + (w23_X S 2).card + (w23_X S 3).card + (n4_right S).card = S.multiplicity := by classical have hP2 := w23_cm_P_empty S hq hcore 2 (by omega) (by omega) have hP3 := w23_cm_P_empty S hq hcore 3 (by omega) (by omega) have ha1 := w23_alpha_one S change (w23_X S 1).card + 1 = (w23_P S 1).card at ha1 have hn := w23_n_eq_sum S change w23_n S = ∑ i ∈ Finset.range (w23_q S), (w23_P S i).card at hn rw [hq] at hn norm_num [Finset.sum_range_succ,w23_P_zero,hP2,hP3] at hn have hl := w23_leftCount_eq S rw [hq] at hl norm_num [Finset.sum_range_succ,w23_alpha,w23_X_zero] at hl have hmc : S.multiplicity < S.conductor := by have hb := (w23_q_bounds S).1 rw [hq] at hb omega have hd := w23_D_card_eq S hmc rw [hq] at hd have hreq : (@Finset.filter ℕ (fun x => ¬ S.IsPrimitive x) (Classical.decPred _) (w23_X S 4)) = n4_right S := by ext x simp [n4_right] rw [hreq] at hd norm_num [Finset.sum_range_succ,w23_alpha,w23_X_zero] at hd have he := w23_e_eq S have hm := w23_m_eq S exact ⟨by omega,by omega,by omega,by omega⟩ lemma w23_cm_sumset_apery_levels (S : NumericalSemigroup) (hq : w23_q S = 4) (r x : ℕ) (hx : x ∈ r • w23_X S 1) (hxa : x ∈ w23_apery S) : r ≤ w23_level S x ∧ w23_level S x ≤ 4 := by exact ⟨w23_lh_degree_le S r x hx,by simpa only [hq] using w23_level_apery_le S hxa⟩ lemma w23_cm_pairs_level (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ 2 • w23_X S 1) : 2 ≤ w23_level S x ∧ w23_level S x ≤ 3 := by have hlo := w23_lh_degree_le S 2 x hx rw [two_nsmul] at hx obtain ⟨a, ha, b, hb, rfl⟩ := Finset.mem_add.1 hx have hA := ((w23_level_eq_iff S a 1).1 ((w23_mem_X S 1 a).1 ha).2).2 have hB := ((w23_level_eq_iff S b 1).1 ((w23_mem_X S 1 b).1 hb).2).2 have hsum := ((w23_level_eq_iff S (a+b) (w23_level S (a+b))).1 rfl).1 have hm := S.multiplicity_pos refine ⟨hlo, ?_⟩ by_contra hn have hh : 4 * S.multiplicity ≤ w23_level S (a+b) * S.multiplicity := Nat.mul_le_mul_right _ (by omega) omega lemma w23_cm_X3_subset (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) : w23_X S 3 ⊆ (2 • w23_X S 1) ∪ (3 • w23_X S 1) := by classical intro x hx obtain ⟨hxa, hxl⟩ := (w23_mem_X S 3 x).1 hx obtain ⟨d, hd⟩ := w23_cm_left_repr S hcore hxa ((w23_lt_conductor_iff S x).2 (by omega)) have hdle := w23_lh_degree_le S d x hd rw [hxl] at hdle interval_cases d · have hx0 : x = 0 := by simpa using hd rw [hx0,w23_level_zero] at hxl omega · have hl1 := ((w23_mem_X S 1 x).1 (by simpa using hd)).2 omega · exact Finset.mem_union.2 (Or.inl hd) · exact Finset.mem_union.2 (Or.inr hd) lemma w23_cm_right_subset (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) : n4_right S ⊆ (3 • w23_X S 1) ∪ (4 • w23_X S 1) := by classical intro x hx have hxl := ((w23_mem_X S 4 x).1 (Finset.mem_filter.1 hx).1).2 obtain ⟨d,hd⟩ := w23_cm_right_repr S hcore hx have hdle := w23_lh_degree_le S d x hd rw [hxl] at hdle interval_cases d · have hx0 : x = 0 := by simpa using hd rw [hx0,w23_level_zero] at hxl omega · have hl1 := ((w23_mem_X S 1 x).1 (by simpa using hd)).2 omega · have hl2 := w23_cm_pairs_level S hd omega · exact Finset.mem_union.2 (Or.inl hd) · exact Finset.mem_union.2 (Or.inr hd) noncomputable def cm_B2 (S : NumericalSemigroup) : Finset ℕ := w23_apery S ∩ (2 • w23_X S 1) noncomputable def cm_b (S : NumericalSemigroup) : Finset ℕ := w23_X S 3 ∩ (2 • w23_X S 1) noncomputable def cm_d (S : NumericalSemigroup) : Finset ℕ := w23_X S 3 \ (2 • w23_X S 1) noncomputable def cm_v (S : NumericalSemigroup) : Finset ℕ := w23_X S 4 ∩ (3 • w23_X S 1) noncomputable def cm_C4 (S : NumericalSemigroup) : Finset ℕ := (w23_apery S ∩ (4 • w23_X S 1)) \ ((2 • w23_X S 1) ∪ (3 • w23_X S 1)) lemma w23_cm_B2_card (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) : (cm_B2 S).card = (w23_X S 2).card + (cm_b S).card := by classical have heq : cm_B2 S = w23_X S 2 ∪ cm_b S := by ext x constructor · intro hx obtain ⟨hxa,hx2⟩ := Finset.mem_inter.1 hx have hl := w23_cm_pairs_level S hx2 by_cases h2 : w23_level S x = 2 · exact Finset.mem_union.2 (Or.inl ((w23_mem_X S 2 x).2 ⟨hxa,h2⟩)) · exact Finset.mem_union.2 (Or.inr (Finset.mem_inter.2 ⟨(w23_mem_X S 3 x).2 ⟨hxa,by omega⟩,hx2⟩)) · intro hx rcases Finset.mem_union.1 hx with hx2 | hx3 · exact Finset.mem_inter.2 ⟨((w23_mem_X S 2 x).1 hx2).1, w23_cm_X2_subset S hq hcore hx2⟩ · exact Finset.mem_inter.2 ⟨((w23_mem_X S 3 x).1 (Finset.mem_inter.1 hx3).1).1,(Finset.mem_inter.1 hx3).2⟩ have hdis : Disjoint (w23_X S 2) (cm_b S) := by apply Finset.disjoint_left.2 intro x hx2 hxb have h2 := ((w23_mem_X S 2 x).1 hx2).2 have h3 := ((w23_mem_X S 3 x).1 (Finset.mem_inter.1 hxb).1).2 omega rw [heq, Finset.card_union_of_disjoint hdis] lemma w23_cm_X3_card (S : NumericalSemigroup) : (w23_X S 3).card = (cm_b S).card + (cm_d S).card := by classical have heq : w23_X S 3 = cm_b S ∪ cm_d S := by ext x simp [cm_b,cm_d] tauto have hdis : Disjoint (cm_b S) (cm_d S) := by apply Finset.disjoint_left.2 intro x hxb hxd exact (Finset.mem_sdiff.1 hxd).2 (Finset.mem_inter.1 hxb).2 conv_lhs => rw [heq] exact Finset.card_union_of_disjoint hdis lemma w23_cm_d_subset (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) : cm_d S ⊆ 3 • w23_X S 1 := by intro x hx obtain ⟨hx3,hn⟩ := Finset.mem_sdiff.1 hx exact (Finset.mem_union.1 (w23_cm_X3_subset S hq hcore hx3)).resolve_left hn lemma w23_cm_right_card (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) : (n4_right S).card ≤ (cm_v S).card + (cm_C4 S).card := by classical have hsub : n4_right S ⊆ cm_v S ∪ cm_C4 S := by intro x hx have hx4 := (Finset.mem_filter.1 hx).1 obtain ⟨hxa,hxl⟩ := (w23_mem_X S 4 x).1 hx4 by_cases h3 : x ∈ 3 • w23_X S 1 · exact Finset.mem_union.2 (Or.inl (Finset.mem_inter.2 ⟨hx4,h3⟩)) · have h4 := (Finset.mem_union.1 (w23_cm_right_subset S hq hcore hx)).resolve_left h3 have h2 : x ∉ 2 • w23_X S 1 := by intro hh have := w23_cm_pairs_level S hh omega exact Finset.mem_union.2 (Or.inr (Finset.mem_sdiff.2 ⟨Finset.mem_inter.2 ⟨hxa,h4⟩,by simpa only [Finset.mem_union,not_or] using And.intro h2 h3⟩)) exact (Finset.card_le_card hsub).trans (Finset.card_union_le _ _) lemma w23_cm_pair_card (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) : 2 * ((w23_X S 2).card + (cm_b S).card) ≤ ((w23_X S 1).card + 1) * (w23_X S 1).card := by have hh := ns_restricted_succ_le (w23_X S 1) (w23_X S 1) (cm_B2 S) 1 (by simp) (fun x hx => (Finset.mem_inter.1 hx).2) (by intro c hc a ha z hz he; simpa only [one_nsmul] using hz) simpa only [Nat.reduceAdd,w23_cm_B2_card S hq hcore] using hh lemma w23_cm_triple_card (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) : 3 * ((cm_d S).card + (cm_v S).card) ≤ ((w23_X S 1).card + 2) * ((w23_X S 2).card + (cm_b S).card) := by classical have hsub : cm_d S ∪ cm_v S ⊆ 3 • w23_X S 1 := by intro x hx rcases Finset.mem_union.1 hx with hd | hv · exact w23_cm_d_subset S hq hcore hd · exact (Finset.mem_inter.1 hv).2 have hdiv : ∀ x ∈ cm_d S ∪ cm_v S, ∀ a ∈ w23_X S 1, ∀ z ∈ 2 • w23_X S 1, x = z + a → z ∈ cm_B2 S := by intro x hx a ha z hz he have hxa : x ∈ w23_apery S := by rcases Finset.mem_union.1 hx with hd | hv · exact ((w23_mem_X S 3 x).1 (Finset.mem_sdiff.1 hd).1).1 · exact ((w23_mem_X S 4 x).1 (Finset.mem_inter.1 hv).1).1 exact Finset.mem_inter.2 ⟨(w23_lh_parent S 2 hxa ha hz he).1,hz⟩ have hh := ns_restricted_succ_le (w23_X S 1) (cm_B2 S) (cm_d S ∪ cm_v S) 2 (fun x hx => (Finset.mem_inter.1 hx).2) hsub hdiv have hdis : Disjoint (cm_d S) (cm_v S) := by apply Finset.disjoint_left.2 intro x hd hv have h3 := ((w23_mem_X S 3 x).1 (Finset.mem_sdiff.1 hd).1).2 have h4 := ((w23_mem_X S 4 x).1 (Finset.mem_inter.1 hv).1).2 omega rw [Finset.card_union_of_disjoint hdis,w23_cm_B2_card S hq hcore] at hh exact hh lemma w23_cm_left_triple_card (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) : 3 * (cm_d S).card ≤ ((w23_X S 1).card + 2) * (w23_X S 2).card := by have hdiv : ∀ x ∈ cm_d S, ∀ a ∈ w23_X S 1, ∀ z ∈ 2 • w23_X S 1, x = z + a → z ∈ w23_X S 2 := by intro x hx a ha z hz he obtain ⟨hxa,hxl⟩ := (w23_mem_X S 3 x).1 (Finset.mem_sdiff.1 hx).1 obtain ⟨hza,hzle⟩ := w23_lh_parent S 2 hxa ha hz he have hzge := w23_lh_degree_le S 2 z hz exact (w23_mem_X S 2 z).2 ⟨hza,by omega⟩ exact ns_restricted_succ_le (w23_X S 1) (w23_X S 2) (cm_d S) 2 (w23_cm_X2_subset S hq hcore) (w23_cm_d_subset S hq hcore) hdiv lemma w23_cm_quadruple_card (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) : 4 * (cm_C4 S).card ≤ ((w23_X S 1).card + 3) * (cm_d S).card := by have hdiv : ∀ x ∈ cm_C4 S, ∀ a ∈ w23_X S 1, ∀ z ∈ 3 • w23_X S 1, x = z + a → z ∈ cm_d S := by intro x hx a ha z hz he obtain ⟨hxI,hxn⟩ := Finset.mem_sdiff.1 hx have hxa := (Finset.mem_inter.1 hxI).1 obtain ⟨hza,hzle⟩ := w23_lh_parent S 3 hxa ha hz he have hxle := w23_level_apery_le S hxa rw [hq] at hxle have hzge := w23_lh_degree_le S 3 z hz have hn : z ∉ 2 • w23_X S 1 := by intro hz2 have hh : x ∈ 3 • w23_X S 1 := by rw [show (3 : ℕ) = 2+1 by omega,add_nsmul,one_nsmul] exact Finset.mem_add.2 ⟨z,hz2,a,ha,he.symm⟩ exact hxn (Finset.mem_union.2 (Or.inr hh)) exact Finset.mem_sdiff.2 ⟨(w23_mem_X S 3 z).2 ⟨hza,by omega⟩,hn⟩ exact ns_restricted_succ_le (w23_X S 1) (cm_d S) (cm_C4 S) 3 (w23_cm_d_subset S hq hcore) (fun x hx => (Finset.mem_inter.1 (Finset.mem_sdiff.1 hx).1).2) hdiv lemma cm_polynomial (k u b d v w p : ℕ) (hk : 1 ≤ k) (h2 : 2 * (u+b) ≤ (k+1) * k) (h3 : 3 * (d+v) ≤ (k+2) * (u+b)) (h3L : 3 * d ≤ (k+2) * u) (h4 : 4 * w ≤ (k+3) * d) (hp : k ≤ 3*p+1) : 4 * (u+b+d+v+w) ≤ (1+k+p) * (3*k+2*u+b+d) := by have hcert : 12 * (u+b+d+v+w) ≤ 3 * (1+k) * (3*k+2*u+b+d) + (k-1) * b := by have hks : k-1+1 = k := by omega nlinarith have hpb := Nat.mul_le_mul_right b (show k-1 ≤ 3*p by omega) have hpt := Nat.mul_le_mul_left (3*p) (show b ≤ 3*k+2*u+b+d by omega) nlinarith lemma w23_cm_wilf_counts (S : NumericalSemigroup) (k u b d v w p t : ℕ) (hk : 1 ≤ k) (h2 : 2 * (u+b) ≤ (k+1) * k) (h3 : 3 * (d+v) ≤ (k+2) * (u+b)) (h3L : 3 * d ≤ (k+2) * u) (h4 : 4 * w ≤ (k+3) * d) (hp : k ≤ 3*p+1) (ht : t ≤ v+w) (he : S.embeddingDimension = 1+k+p) (hm : S.embeddingDimension+u+b+d+t = S.multiplicity) (hL : S.leftCount = 4+3*k+2*u+b+d) (hc : S.conductor ≤ 4*S.multiplicity) : S.SatisfiesWilf := by have hpoly := cm_polynomial k u b d v w p hk h2 h3 h3L h4 hp unfold NumericalSemigroup.SatisfiesWilf nlinarith theorem w23_q4_core_many_right (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) (he : 4 * (w23_X S 1).card + 2 ≤ 3 * S.embeddingDimension) : S.SatisfiesWilf := by classical have hq := w23_q_eq_four S h1 h2 by_cases hX1 : w23_X S 1 = ∅ · exact w23_q4_of_X1_empty S h1 h2 hX1 have hk : 1 ≤ (w23_X S 1).card := by have hh : (w23_X S 1).card ≠ 0 := by intro hz exact hX1 (Finset.card_eq_zero.1 hz) omega obtain ⟨hn,hL,hD,hm⟩ := w23_cm_counts S hq hcore have hX3 := w23_cm_X3_card S have heq := w23_e_eq S exact w23_cm_wilf_counts S (w23_X S 1).card (w23_X S 2).card (cm_b S).card (cm_d S).card (cm_v S).card (cm_C4 S).card (w23_pq S) (n4_right S).card hk (w23_cm_pair_card S hq hcore) (w23_cm_triple_card S hq hcore) (w23_cm_left_triple_card S hq hcore) (w23_cm_quadruple_card S hq hcore) (by omega) (w23_cm_right_card S hq hcore) (by omega) (by omega) (by omega) h2 lemma cs_two_rigidity (u b d v w rho : ℕ) (h2 : 2 * (u+b) ≤ 6) (h3 : 3 * (d+v) ≤ 4 * (u+b)) (h3L : 3 * d ≤ 4 * u) (h4 : 4 * w ≤ 5 * d) (hfail : 3 * (6+2*u+b+d) + rho < 4 * (u+b+d+v+w)) : u = 0 ∧ b = 3 ∧ d = 0 ∧ v = 4 ∧ w = 0 ∧ rho = 0 := by have hu : u ≤ 3 := by omega interval_cases u <;> omega lemma cs_three_rigidity (u b d v w rho : ℕ) (h2 : 2 * (u+b) ≤ 12) (h3 : 3 * (d+v) ≤ 5 * (u+b)) (h3L : 3 * d ≤ 5 * u) (h4 : 4 * w ≤ 6 * d) (hfail : 4 * (9+2*u+b+d) + rho < 4 * (u+b+d+v+w)) : u = 0 ∧ b = 6 ∧ d = 0 ∧ v = 10 ∧ w = 0 ∧ rho ≤ 3 := by have hu : u ≤ 6 := by omega interval_cases u <;> omega lemma w23_cs_saturated_sumsets (S : NumericalSemigroup) (hb : (cm_b S).card = ((w23_X S 1).card + 1).choose 2) (hv : (cm_v S).card = ((w23_X S 1).card + 2).choose 3) : 2 • w23_X S 1 ⊆ w23_X S 3 ∧ 3 • w23_X S 1 ⊆ w23_X S 4 := by classical have htwo : (2 • w23_X S 1).card ≤ (cm_b S).card := by rw [hb] simpa only [two_nsmul] using w23_card_two_add_le (w23_X S 1) have he2 : cm_b S = 2 • w23_X S 1 := Finset.eq_of_subset_of_card_le (fun x hx => (Finset.mem_inter.1 hx).2) htwo have hthree : (3 • w23_X S 1).card ≤ (cm_v S).card := by rw [hv] have he : 3 • w23_X S 1 = w23_X S 1 + w23_X S 1 + w23_X S 1 := by rw [show (3 : ℕ) = 2+1 by rfl, add_nsmul, one_nsmul, two_nsmul] rw [he] exact w23_card_three_add_le _ have he3 : cm_v S = 3 • w23_X S 1 := Finset.eq_of_subset_of_card_le (fun x hx => (Finset.mem_inter.1 hx).2) hthree exact ⟨fun x hx => (Finset.mem_inter.1 (he2.symm ▸ hx)).1, fun x hx => (Finset.mem_inter.1 (he3.symm ▸ hx)).1⟩ lemma w23_cs_extreme_bounds (S : NumericalSemigroup) (hpair : 2 • w23_X S 1 ⊆ w23_X S 3) (htriple : 3 • w23_X S 1 ⊆ w23_X S 4) {a : ℕ} (ha : a ∈ w23_X S 1) : 3 * S.multiplicity ≤ 2 * a + w23_rho S ∧ 3 * a + w23_rho S < 5 * S.multiplicity := by have h2 : a+a ∈ 2 • w23_X S 1 := by simpa only [two_nsmul] using Finset.add_mem_add ha ha have h3 : a+a+a ∈ 3 • w23_X S 1 := by rw [show (3 : ℕ) = 2+1 by rfl, add_nsmul, one_nsmul] exact Finset.add_mem_add h2 ha have hlo := ((w23_level_eq_iff S (a+a) 3).1 ((w23_mem_X S 3 (a+a)).1 (hpair h2)).2).1 have hhi := ((w23_level_eq_iff S (a+a+a) 4).1 ((w23_mem_X S 4 (a+a+a)).1 (htriple h3)).2).2 omega lemma w23_cs_half_not_mem (S : NumericalSemigroup) (htriple : 3 • w23_X S 1 ⊆ w23_X S 4) {a : ℕ} (ha : a ∈ w23_X S 1) : 2 * a ≠ 3 * S.multiplicity := by intro hhalf have h2 : a+a ∈ 2 • w23_X S 1 := by simpa only [two_nsmul] using Finset.add_mem_add ha ha have h3 : a+a+a ∈ 3 • w23_X S 1 := by rw [show (3 : ℕ) = 2+1 by rfl, add_nsmul, one_nsmul] exact Finset.add_mem_add h2 ha have h3a := ((w23_mem_X S 4 (a+a+a)).1 (htriple h3)).1 have haa := ((w23_mem_X S 1 a).1 ha).1 have hr : (a+a+a) % S.multiplicity = a % S.multiplicity := by rw [show a+a+a = a+3*S.multiplicity by omega] simp [Nat.add_mod] have he := w23_apery_residue_inj S h3a haa hr have hm := S.multiplicity_pos omega lemma w23_cs_two_impossible (S : NumericalSemigroup) (hm : S.multiplicity = 10) (hr : w23_rho S = 0) (hK : (w23_X S 1).card = 2) (hpair : 2 • w23_X S 1 ⊆ w23_X S 3) (htriple : 3 • w23_X S 1 ⊆ w23_X S 4) : False := by classical have hsub : w23_X S 1 ⊆ {16} := by intro a ha obtain ⟨hlo,hhi⟩ := w23_cs_extreme_bounds S hpair htriple ha have hn := w23_cs_half_not_mem S htriple ha rw [hm,hr] at hlo hhi rw [hm] at hn simp only [Finset.mem_singleton] omega have hh := Finset.card_le_card hsub simp only [Finset.card_singleton,hK] at hh omega lemma w23_cs_three_impossible (S : NumericalSemigroup) (hm : S.multiplicity = 20) (hr : w23_rho S ≤ 3) (hK : (w23_X S 1).card = 3) (hb : (cm_b S).card = 6) (hpair : 2 • w23_X S 1 ⊆ w23_X S 3) (htriple : 3 • w23_X S 1 ⊆ w23_X S 4) : False := by classical have hbds : ∀ a ∈ w23_X S 1, 60 ≤ 2*a+w23_rho S ∧ 3*a+w23_rho S < 100 ∧ a ≠ 30 := by intro a ha obtain ⟨hlo,hhi⟩ := w23_cs_extreme_bounds S hpair htriple ha have hn := w23_cs_half_not_mem S htriple ha rw [hm] at hlo hhi hn exact ⟨by omega,by omega,by omega⟩ by_cases hr0 : w23_rho S = 0 · have hsub : w23_X S 1 ⊆ {31,32,33} := by intro a ha have hh := hbds a ha simp only [Finset.mem_insert,Finset.mem_singleton] omega have hsub2 : cm_b S ⊆ ({31,32,33} : Finset ℕ) + {31,32,33} := by intro x hx have hx2 := (Finset.mem_inter.1 hx).2 rw [two_nsmul] at hx2 obtain ⟨a,ha,b,hb,rfl⟩ := Finset.mem_add.1 hx2 exact Finset.add_mem_add (hsub ha) (hsub hb) have hh := Finset.card_le_card hsub2 have hc : (({31,32,33} : Finset ℕ) + {31,32,33}).card = 5 := by decide rw [hb,hc] at hh omega · by_cases hr1 : w23_rho S = 1 · have hsub : w23_X S 1 ⊆ {31,32} := by intro a ha have hh := hbds a ha simp only [Finset.mem_insert,Finset.mem_singleton] omega have hh := Finset.card_le_card hsub have hc : ({31,32} : Finset ℕ).card = 2 := by decide rw [hK,hc] at hh omega · have hsub : w23_X S 1 ⊆ {29,31,32} := by intro a ha have hh := hbds a ha simp only [Finset.mem_insert,Finset.mem_singleton] omega have heq : w23_X S 1 = {29,31,32} := by apply Finset.eq_of_subset_of_card_le hsub have hc : ({29,31,32} : Finset ℕ).card = 3 := by decide rw [hK,hc] have h29 : 29 ∈ w23_X S 1 := by rw [heq]; decide have h31 : 31 ∈ w23_X S 1 := by rw [heq]; decide have h60 : 60 ∈ w23_apery S := by have hh : 29+31 ∈ 2 • w23_X S 1 := by simpa only [two_nsmul] using Finset.add_mem_add h29 h31 exact ((w23_mem_X S 3 60).1 (hpair hh)).1 have he := w23_apery_residue_inj S h60 (w23_zero_mem_apery S) (by rw [hm]) omega theorem w23_q4_core_small (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) (hK : (w23_X S 1).card ≤ 3) : S.SatisfiesWilf := by classical by_cases hmany : 4 * (w23_X S 1).card + 2 ≤ 3 * S.embeddingDimension · exact w23_q4_core_many_right S h1 h2 hcore hmany have hq := w23_q_eq_four S h1 h2 obtain ⟨hn,hL,_hD,hm⟩ := w23_cm_counts S hq hcore have hX3 := w23_cm_X3_card S have he := w23_e_eq S have hc := w23_q_mul_sub S rw [hq] at hc let k := (w23_X S 1).card let u := (w23_X S 2).card let b := (cm_b S).card let d := (cm_d S).card let v := (cm_v S).card let w := (cm_C4 S).card let t := (n4_right S).card let p := w23_pq S have heq : S.embeddingDimension = 1+k+p := by omega have hL' : S.leftCount = 4+3*k+2*u+b+d := by omega have hm' : S.embeddingDimension+u+b+d+t = S.multiplicity := by omega have hp : p = 0 := by omega have hk : k = 2 ∨ k = 3 := by omega have htwo : 2 * (u+b) ≤ (k+1) * k := w23_cm_pair_card S hq hcore have hthree : 3 * (d+v) ≤ (k+2) * (u+b) := w23_cm_triple_card S hq hcore have hthreeL : 3 * d ≤ (k+2) * u := w23_cm_left_triple_card S hq hcore have hfour : 4 * w ≤ (k+3) * d := w23_cm_quadruple_card S hq hcore have ht : t ≤ v+w := w23_cm_right_card S hq hcore by_contra hf have hfail : S.embeddingDimension * S.leftCount < S.conductor := by unfold NumericalSemigroup.SatisfiesWilf at hf omega rcases hk with hk | hk · have he3 : S.embeddingDimension = 3 := by omega rw [he3] at hfail hm' rw [hk] at hL' htwo hthree hthreeL hfour have hbad : 3*(6+2*u+b+d)+w23_rho S < 4*(u+b+d+v+w) := by omega obtain ⟨hu,hb,hd,hv,hw,hr⟩ := cs_two_rigidity u b d v w (w23_rho S) htwo hthree hthreeL hfour hbad have hm10 : S.multiplicity = 10 := by omega obtain ⟨hpair,htriple⟩ := w23_cs_saturated_sumsets S (show (cm_b S).card = ((w23_X S 1).card+1).choose 2 from by change b = (k+1).choose 2 rw [hk,hb] decide) (show (cm_v S).card = ((w23_X S 1).card+2).choose 3 from by change v = (k+2).choose 3 rw [hk,hv] decide) exact w23_cs_two_impossible S hm10 hr hk hpair htriple · have he4 : S.embeddingDimension = 4 := by omega rw [he4] at hfail hm' rw [hk] at hL' htwo hthree hthreeL hfour have hbad : 4*(9+2*u+b+d)+w23_rho S < 4*(u+b+d+v+w) := by omega obtain ⟨hu,hb,hd,hv,hw,hr⟩ := cs_three_rigidity u b d v w (w23_rho S) htwo hthree hthreeL hfour hbad have hm20 : S.multiplicity = 20 := by omega obtain ⟨hpair,htriple⟩ := w23_cs_saturated_sumsets S (show (cm_b S).card = ((w23_X S 1).card+1).choose 2 from by change b = (k+1).choose 2 rw [hk,hb] decide) (show (cm_v S).card = ((w23_X S 1).card+2).choose 3 from by change v = (k+2).choose 3 rw [hk,hv] decide) exact w23_cs_three_impossible S hm20 hr hk hb hpair htriple lemma cc_certificate (k u b d v w : ℕ) (hk : 1 ≤ k) (h2 : 2 * (u+b) ≤ (k+1) * k) (h3 : 3 * (d+v) ≤ (k+2) * (u+b)) (h3L : 3 * d ≤ (k+2) * u) (h4 : 4 * w ≤ (k+3) * d) : 12 * (u+b+d+v+w) ≤ 3 * (1+k) * (3*k+2*u+b+d) + (k-1) * b := by have hks : k-1+1 = k := by omega nlinarith lemma cc_polynomial (k u b d v w p ρ : ℕ) (hk : 1 ≤ k) (h2 : 2 * (u+b) ≤ (k+1) * k) (h3 : 3 * (d+v) ≤ (k+2) * (u+b)) (h3L : 3 * d ≤ (k+2) * u) (h4 : 4 * w ≤ (k+3) * d) (hcomp : k * (k*k) ≤ k * (1 + 3*p*(k+7)) + 6*ρ) : 4 * (u+b+d+v+w) ≤ (1+k+p) * (3*k+2*u+b+d) + ρ := by by_cases hp : k ≤ 3*p+1 · have hh := cm_polynomial k u b d v w p hk h2 h3 h3L h4 hp omega · let a := k-1-3*p have hsum : a+3*p+1 = k := by dsimp [a]; omega have hsub : k-1 = a+3*p := by omega have hcert := cc_certificate k u b d v w hk h2 h3 h3L h4 rw [hsub] at hcert have hpair : 2*b ≤ (k+1)*k := by omega have hbound := Nat.mul_le_mul_left a hpair have hmul := congrArg (fun x : ℕ => x * ((k+1)*k)) hsum have hcompensation : a * ((k+1)*k) ≤ 18*k*p + 6*ρ := by nlinarith only [hmul, hcomp] have hpT := Nat.mul_le_mul_left (6*p) (show 3*k+b ≤ 3*k+2*u+b+d by omega) nlinarith only [hcert, hbound, hcompensation, hpT] lemma w23_cc_wilf_counts (S : NumericalSemigroup) (k u b d v w p t ρ : ℕ) (hk : 1 ≤ k) (h2 : 2 * (u+b) ≤ (k+1) * k) (h3 : 3 * (d+v) ≤ (k+2) * (u+b)) (h3L : 3 * d ≤ (k+2) * u) (h4 : 4 * w ≤ (k+3) * d) (hcomp : k * (k*k) ≤ k * (1 + 3*p*(k+7)) + 6*ρ) (ht : t ≤ v+w) (he : S.embeddingDimension = 1+k+p) (hm : S.embeddingDimension+u+b+d+t = S.multiplicity) (hL : S.leftCount = 4+3*k+2*u+b+d) (hc : S.conductor+ρ = 4*S.multiplicity) : S.SatisfiesWilf := by have hpoly := cc_polynomial k u b d v w p ρ hk h2 h3 h3L h4 hcomp unfold NumericalSemigroup.SatisfiesWilf nlinarith theorem w23_q4_core_comp (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) (hcomp : (w23_X S 1).card * ((w23_X S 1).card * (w23_X S 1).card) ≤ (w23_X S 1).card * (1 + 3 * (S.embeddingDimension - 1 - (w23_X S 1).card) * ((w23_X S 1).card + 7)) + 6 * w23_rho S) : S.SatisfiesWilf := by classical have hq := w23_q_eq_four S h1 h2 by_cases hX1 : w23_X S 1 = ∅ · exact w23_q4_of_X1_empty S h1 h2 hX1 have hk : 1 ≤ (w23_X S 1).card := by have hh : (w23_X S 1).card ≠ 0 := by intro hz exact hX1 (Finset.card_eq_zero.1 hz) omega obtain ⟨hn,hL,hD,hm⟩ := w23_cm_counts S hq hcore have hX3 := w23_cm_X3_card S have heq := w23_e_eq S have hpe : S.embeddingDimension - 1 - (w23_X S 1).card = w23_pq S := by omega rw [hpe] at hcomp have hcr := w23_q_mul_sub S rw [hq] at hcr exact w23_cc_wilf_counts S (w23_X S 1).card (w23_X S 2).card (cm_b S).card (cm_d S).card (cm_v S).card (cm_C4 S).card (w23_pq S) (n4_right S).card (w23_rho S) hk (w23_cm_pair_card S hq hcore) (w23_cm_triple_card S hq hcore) (w23_cm_left_triple_card S hq hcore) (w23_cm_quadruple_card S hq hcore) hcomp (w23_cm_right_card S hq hcore) (by omega) (by omega) (by omega) hcr.symm noncomputable def up_weight {k : ℕ} (E : Finset (Fin k → ℕ)) (β : Fin k → ℕ) : ℕ := by classical exact ∑ i, if m3_parent β i ∈ E then β i else 0 theorem up_split_weighted_shadow {k r : ℕ} (E F : Finset (Fin k → ℕ)) (hE : ∀ α ∈ E, m3_degree α = r) : (∑ β ∈ F, up_weight E β) ≤ (k + r) * E.card := by classical have hcoord : ∀ i : Fin k, (∑ β ∈ F, if m3_parent β i ∈ E then β i else 0) ≤ ∑ α ∈ E, (α i + 1) := by intro i let T := F.filter (fun β => 0 < β i ∧ m3_parent β i ∈ E) have hfilter : (∑ β ∈ F, if m3_parent β i ∈ E then β i else 0) = ∑ β ∈ T, β i := by calc _ = ∑ β ∈ T, if m3_parent β i ∈ E then β i else 0 := by symm apply Finset.sum_subset (Finset.filter_subset _ _) intro β hβ hn by_cases hi : 0 < β i · have hp : m3_parent β i ∉ E := by intro hp exact hn (Finset.mem_filter.2 ⟨hβ, hi, hp⟩) simp [hp] · have hz : β i = 0 := by omega simp [hz] _ = _ := Finset.sum_congr rfl (fun β hβ => if_pos (Finset.mem_filter.1 hβ).2.2) rw [hfilter] apply Finset.sum_le_sum_of_injOn (fun β => m3_parent β i) · intro x hx y hy hxy exact n4_parent_injective i (Finset.mem_filter.1 hx).2.1 (Finset.mem_filter.1 hy).2.1 hxy · intro α hα obtain ⟨β, hβ, rfl⟩ := Finset.mem_image.1 hα exact (Finset.mem_filter.1 hβ).2.2 · intro β hβ have hi := (Finset.mem_filter.1 hβ).2.1 simp [m3_parent] omega · intro α hα hn exact Nat.zero_le _ calc (∑ β ∈ F, up_weight E β) = ∑ i : Fin k, ∑ β ∈ F, if m3_parent β i ∈ E then β i else 0 := by unfold up_weight exact Finset.sum_comm _ ≤ ∑ i : Fin k, ∑ α ∈ E, (α i + 1) := Finset.sum_le_sum (fun i _ => hcoord i) _ = ∑ α ∈ E, ∑ i : Fin k, (α i + 1) := Finset.sum_comm _ = (k + r) * E.card := by have he : ∀ α ∈ E, (∑ i : Fin k, (α i + 1)) = k + r := by intro α hα rw [Finset.sum_add_distrib] change m3_degree α + _ = _ rw [hE α hα] simp [Nat.add_comm] rw [Finset.sum_congr rfl he] simp [Nat.mul_comm] lemma up_weight_le {k : ℕ} (E : Finset (Fin k → ℕ)) (β : Fin k → ℕ) : up_weight E β ≤ m3_degree β := by classical unfold up_weight m3_degree apply Finset.sum_le_sum intro i hi split_ifs <;> omega lemma up_weight_eq_degree {k : ℕ} (E : Finset (Fin k → ℕ)) (β : Fin k → ℕ) (hp : ∀ i, 0 < β i → m3_parent β i ∈ E) : up_weight E β = m3_degree β := by classical unfold up_weight m3_degree apply Finset.sum_congr rfl intro i hi by_cases hpos : 0 < β i · simp [hp i hpos] · have hz : β i = 0 := by omega simp [hz] lemma up_weight_eq_degree_iff {k : ℕ} (E : Finset (Fin k → ℕ)) (β : Fin k → ℕ) : up_weight E β = m3_degree β ↔ ∀ i, 0 < β i → m3_parent β i ∈ E := by classical constructor · intro he i hi by_contra hn have hstrict : up_weight E β < m3_degree β := by unfold up_weight m3_degree apply Finset.sum_lt_sum · intro j hj split_ifs <;> omega · exact ⟨i, Finset.mem_univ i, by simp [hn, hi]⟩ omega · exact up_weight_eq_degree E β lemma up_weight_complement {k : ℕ} (E B : Finset (Fin k → ℕ)) (β : Fin k → ℕ) (hp : ∀ i, 0 < β i → m3_parent β i ∈ E) : up_weight (E \ B) β + up_weight B β = m3_degree β := by classical unfold up_weight m3_degree rw [← Finset.sum_add_distrib] apply Finset.sum_congr rfl intro i hi by_cases hpos : 0 < β i · have he := hp i hpos by_cases hb : m3_parent β i ∈ B <;> simp [he, hb] · have hz : β i = 0 := by omega simp [hz] lemma up_lambda_sum_bound {k : ℕ} (E F : Finset (Fin k → ℕ)) (hF : ∀ β ∈ F, m3_degree β = 3) : (∑ β ∈ F, up_weight E β) ≤ 2 * F.card + (F.filter (fun β => up_weight E β = 3)).card := by classical have hp : ∀ β ∈ F, up_weight E β ≤ 2 + if up_weight E β = 3 then 1 else 0 := by intro β hβ have hh := up_weight_le E β rw [hF β hβ] at hh split_ifs <;> omega calc _ ≤ ∑ β ∈ F, (2 + if up_weight E β = 3 then 1 else 0) := Finset.sum_le_sum hp _ = _ := by simp [Finset.sum_add_distrib, Nat.mul_comm] theorem up_unit_price_identity (k b w v t u Λ : ℤ) : (k+2) * (3*k*(k+1) + (2*k-2)*b + (k-3)*(w+v) - 4*(t+u)) = 3*(k+2)*(k*(k+1)-2*(b+w)) + 2*(k+2)*((k+2)*b-3*v-3*t+Λ) + (k+3)*((k+2)*w-Λ) + (k+2)*((k+3)*v-4*u) + 2*(k+2)*t-(k+1)*Λ := by ring theorem up_count_certificate (k b w v t u Λ t3 : ℕ) (hpair : 2*(b+w) ≤ k*(k+1)) (hlow : 3*v+3*t ≤ (k+2)*b+Λ) (hwrap : Λ ≤ (k+2)*w) (hquad : 4*u ≤ (k+3)*v) (hlambda : Λ ≤ 2*t+t3) : 4*(b+w+v+t+u)+w ≤ (1+k)*(3*k+2*b+w+v)+t3 := by nlinarith theorem up_one_high_count_certificate (k b w v t u Λ t3 : ℕ) (hpair : 2*(b+w) ≤ k*(k+1)) (hlow : 3*v+3*t ≤ (k+2)*b+Λ) (hwrap : Λ ≤ (k+2)*w) (hquad : 4*u ≤ (k+3)*v) (hlambda : Λ ≤ 2*t+t3) (hone : t3 ≤ w) : 4*(b+w+v+t+u) ≤ (1+k)*(3*k+2*b+w+v) := by have hh := up_count_certificate k b w v t u Λ t3 hpair hlow hwrap hquad hlambda omega lemma up_weight_disjoint_split {k : ℕ} (P Q : Finset (Fin k → ℕ)) (β : Fin k → ℕ) (hdis : Disjoint P Q) (hp : ∀ i, 0 < β i → m3_parent β i ∈ P ∪ Q) : up_weight P β + up_weight Q β = m3_degree β := by classical unfold up_weight m3_degree rw [← Finset.sum_add_distrib] apply Finset.sum_congr rfl intro i hi by_cases hpos : 0 < β i · have hm := hp i hpos have hd := Finset.disjoint_left.1 hdis rcases Finset.mem_union.1 hm with hP | hQ · have hn : m3_parent β i ∉ Q := fun hQ => hd hP hQ simp [hP, hn] · have hn : m3_parent β i ∉ P := fun hP => hd hP hQ simp [hQ, hn] · have hz : β i = 0 := by omega simp [hz] theorem up_low_wrapped_shadows {k : ℕ} (P Q L T : Finset (Fin k → ℕ)) (hP : ∀ α ∈ P, m3_degree α = 2) (hQ : ∀ α ∈ Q, m3_degree α = 2) (hL : ∀ β ∈ L, m3_degree β = 3) (hT : ∀ β ∈ T, m3_degree β = 3) (hPQ : Disjoint P Q) (hLT : Disjoint L T) (hLp : ∀ β ∈ L, ∀ i, 0 < β i → m3_parent β i ∈ P) (hTp : ∀ β ∈ T, ∀ i, 0 < β i → m3_parent β i ∈ P ∪ Q) : 3*L.card+3*T.card ≤ (k+2)*P.card+(∑ β ∈ T, up_weight Q β) ∧ (∑ β ∈ T, up_weight Q β) ≤ (k+2)*Q.card := by classical have hlow := up_split_weighted_shadow P (L ∪ T) hP rw [Finset.sum_union hLT] at hlow have hLs : (∑ β ∈ L, up_weight P β) = 3*L.card := by rw [Finset.sum_congr rfl (fun β hβ => (up_weight_eq_degree P β (hLp β hβ)).trans (hL β hβ))] simp [Nat.mul_comm] have hTs : (∑ β ∈ T, up_weight P β)+(∑ β ∈ T, up_weight Q β) = 3*T.card := by rw [← Finset.sum_add_distrib] rw [Finset.sum_congr rfl (fun β hβ => (up_weight_disjoint_split P Q β hPQ (hTp β hβ)).trans (hT β hβ))] simp [Nat.mul_comm] exact ⟨by omega, up_split_weighted_shadow Q T hQ⟩ noncomputable def oh_layer (A V : Finset ℕ) (d : ℕ) : Finset (Fin A.card → ℕ) := by classical exact V.image (ns_rep 6 (m3_enum A) d) lemma oh_rep_spec (A V : Finset ℕ) (d : ℕ) (hV : V ⊆ d • A) (x : ℕ) (hx : x ∈ V) : m3_degree (ns_rep 6 (m3_enum A) d x) = d ∧ m3_value (m3_enum A) (ns_rep 6 (m3_enum A) d x) = x := by have hr := m3_rep_exists A d x (by rw [ns_sumset_eq_nsmul]; exact hV hx) have hs := ns_rep_spec 6 (m3_enum A) d x hr exact ⟨hs.1, hs.2.1⟩ lemma oh_layer_spec (A V : Finset ℕ) (d : ℕ) (hV : V ⊆ d • A) {α : Fin A.card → ℕ} (hα : α ∈ oh_layer A V d) : m3_degree α = d ∧ m3_value (m3_enum A) α ∈ V := by classical obtain ⟨x, hx, rfl⟩ := Finset.mem_image.1 hα have hs := oh_rep_spec A V d hV x hx exact ⟨hs.1, by rw [hs.2]; exact hx⟩ lemma oh_layer_card (A V : Finset ℕ) (d : ℕ) (hV : V ⊆ d • A) : (oh_layer A V d).card = V.card := by classical apply Finset.card_image_of_injOn intro x hx y hy he have hs := (oh_rep_spec A V d hV x hx).2 have ht := (oh_rep_spec A V d hV y hy).2 rw [he] at hs omega lemma oh_layer_union (A V W : Finset ℕ) (d : ℕ) : oh_layer A (V ∪ W) d = oh_layer A V d ∪ oh_layer A W d := by classical exact Finset.image_union _ _ lemma oh_layer_disjoint (A V W : Finset ℕ) (d : ℕ) (hV : V ⊆ d • A) (hW : W ⊆ d • A) (hdis : Disjoint V W) : Disjoint (oh_layer A V d) (oh_layer A W d) := by classical apply Finset.disjoint_left.2 intro α hVα hWα exact Finset.disjoint_left.1 hdis (oh_layer_spec A V d hV hVα).2 (oh_layer_spec A W d hW hWα).2 lemma oh_layer_parent (A B C : Finset ℕ) (r : ℕ) (hr : r+1 < 6) (hC : C ⊆ (r+1) • A) (hdiv : ∀ c ∈ C, ∀ a ∈ A, ∀ z ∈ r • A, c = z+a → z ∈ B) {β : Fin A.card → ℕ} (hβ : β ∈ oh_layer A C (r+1)) (i : Fin A.card) (hi : 0 < β i) : m3_parent β i ∈ oh_layer A B r := by classical obtain ⟨x, hx, rfl⟩ := Finset.mem_image.1 hβ have hs := oh_rep_spec A C (r+1) hC x hx have hd : m3_degree (m3_parent (ns_rep 6 (m3_enum A) (r+1) x) i) = r := by have hh := m3_degree_parent (ns_rep 6 (m3_enum A) (r+1) x) i hi omega have hz := m3_value_mem_sumset A r _ hd rw [ns_sumset_eq_nsmul] at hz have he := m3_value_parent (m3_enum A) (ns_rep 6 (m3_enum A) (r+1) x) i hi have hzin := hdiv x hx (m3_enum A i) (m3_enum_mem A i) _ hz (by omega) apply Finset.mem_image.2 refine ⟨_, hzin, ?_⟩ exact (ns_rep_parent 6 (m3_enum A) r x hr ⟨_, hs.1, hs.2⟩ i hi).symm lemma oh_pair_value {k : ℕ} (a : Fin k → ℕ) (i j : Fin k) : m3_value a (m3_pairVector i j) = a i+a j := by rw [m3_pairVector, m3_value_unitAdd, m3_value_unitAdd] simp [m3_value, Nat.add_comm] lemma oh_pair_high {k : ℕ} (a : Fin k → ℕ) (m rho : ℕ) (h : Fin k) (hlow : ∀ i, i ≠ h → 2*a i+rho < 3*m) (α : Fin k → ℕ) (hd : m3_degree α = 2) (hwrap : 3*m ≤ m3_value a α+rho) : 0 < α h := by obtain ⟨i,j,hij,rfl⟩ := m3_degree_two_repr α hd by_contra hn have hz : m3_pairVector i j h = 0 := by omega have hi : i ≠ h := by intro he subst i simp [m3_pairVector, m3_unitAdd] at hz have hj : j ≠ h := by intro he subst j simp [m3_pairVector, m3_unitAdd] at hz have hli := hlow i hi have hlj := hlow j hj rw [oh_pair_value] at hwrap omega theorem oh_full_weight_injection {k : ℕ} (P T : Finset (Fin k → ℕ)) (hT : ∀ β ∈ T, m3_degree β = 3) (h : Fin k) (hP : ∀ α ∈ P, 0 < α h) : (T.filter (fun β => up_weight P β = 3)).card ≤ P.card := by classical let T3 := T.filter (fun β => up_weight P β = 3) have hpos : ∀ β ∈ T3, 0 < β h := by intro β hβ obtain ⟨hb, hw⟩ := Finset.mem_filter.1 hβ have hp := (up_weight_eq_degree_iff P β).1 (by rw [hT β hb]; exact hw) obtain ⟨i, hi⟩ := m3_degree_pos_coord β (by rw [hT β hb]; omega) have hph := hP _ (hp i hi) by_contra hn have hz : β h = 0 := by omega by_cases he : h = i · subst h simp [m3_parent, hz] at hph · simp [m3_parent, Function.update, he, hz] at hph have hmap : ∀ β ∈ T3, m3_parent β h ∈ P := by intro β hβ obtain ⟨hb, hw⟩ := Finset.mem_filter.1 hβ have hp := (up_weight_eq_degree_iff P β).1 (by rw [hT β hb]; exact hw) exact hp h (hpos β hβ) calc (T.filter (fun β => up_weight P β = 3)).card = (T3.image (fun β => m3_parent β h)).card := by symm apply Finset.card_image_of_injOn intro β hβ γ hγ he exact n4_parent_injective h (hpos β hβ) (hpos γ hγ) he _ ≤ P.card := Finset.card_le_card (by intro α hα obtain ⟨β, hβ, rfl⟩ := Finset.mem_image.1 hα exact hmap β hβ) lemma w23_oh_B2_partition (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a+w23_rho S < 2*S.multiplicity) : cm_B2 S = w23_X S 2 ∪ cm_b S := by classical ext x constructor · intro hx obtain ⟨hxa,hx2⟩ := Finset.mem_inter.1 hx have hl := w23_cm_pairs_level S hx2 by_cases h2 : w23_level S x = 2 · exact Finset.mem_union.2 (Or.inl ((w23_mem_X S 2 x).2 ⟨hxa,h2⟩)) · exact Finset.mem_union.2 (Or.inr (Finset.mem_inter.2 ⟨(w23_mem_X S 3 x).2 ⟨hxa,by omega⟩,hx2⟩)) · intro hx rcases Finset.mem_union.1 hx with hx2 | hx3 · exact Finset.mem_inter.2 ⟨((w23_mem_X S 2 x).1 hx2).1, w23_cm_X2_subset S hq hcore hx2⟩ · exact Finset.mem_inter.2 ⟨((w23_mem_X S 3 x).1 (Finset.mem_inter.1 hx3).1).1,(Finset.mem_inter.1 hx3).2⟩ lemma w23_oh_pairs_disjoint (S : NumericalSemigroup) : Disjoint (w23_X S 2) (cm_b S) := by classical apply Finset.disjoint_left.2 intro x hx2 hxb have h2 := ((w23_mem_X S 2 x).1 hx2).2 have h3 := ((w23_mem_X S 3 x).1 (Finset.mem_inter.1 hxb).1).2 omega lemma w23_oh_triples_disjoint (S : NumericalSemigroup) : Disjoint (cm_d S) (cm_v S) := by classical apply Finset.disjoint_left.2 intro x hd hv have h3 := ((w23_mem_X S 3 x).1 (Finset.mem_sdiff.1 hd).1).2 have h4 := ((w23_mem_X S 4 x).1 (Finset.mem_inter.1 hv).1).2 omega lemma w23_oh_left_parent (S : NumericalSemigroup) : ∀ x ∈ cm_d S, ∀ a ∈ w23_X S 1, ∀ z ∈ 2 • w23_X S 1, x = z+a → z ∈ w23_X S 2 := by intro x hx a ha z hz he obtain ⟨hxa,hxl⟩ := (w23_mem_X S 3 x).1 (Finset.mem_sdiff.1 hx).1 obtain ⟨hza,hzle⟩ := w23_lh_parent S 2 hxa ha hz he have hzge := w23_lh_degree_le S 2 z hz exact (w23_mem_X S 2 z).2 ⟨hza,by omega⟩ lemma w23_oh_right_parent (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a+w23_rho S < 2*S.multiplicity) : ∀ x ∈ cm_v S, ∀ a ∈ w23_X S 1, ∀ z ∈ 2 • w23_X S 1, x = z+a → z ∈ w23_X S 2 ∪ cm_b S := by intro x hx a ha z hz he have hxa := ((w23_mem_X S 4 x).1 (Finset.mem_inter.1 hx).1).1 have hzB : z ∈ cm_B2 S := Finset.mem_inter.2 ⟨(w23_lh_parent S 2 hxa ha hz he).1,hz⟩ rwa [w23_oh_B2_partition S hq hcore] at hzB noncomputable def oh_low_pairs (S : NumericalSemigroup) := oh_layer (w23_X S 1) (w23_X S 2) 2 noncomputable def oh_wrapped_pairs (S : NumericalSemigroup) := oh_layer (w23_X S 1) (cm_b S) 2 noncomputable def oh_low_triples (S : NumericalSemigroup) := oh_layer (w23_X S 1) (cm_d S) 3 noncomputable def oh_right_triples (S : NumericalSemigroup) := oh_layer (w23_X S 1) (cm_v S) 3 noncomputable def up_Lambda (S : NumericalSemigroup) : ℕ := ∑ β ∈ oh_right_triples S, up_weight (oh_wrapped_pairs S) β noncomputable def up_t3 (S : NumericalSemigroup) : ℕ := by classical exact ((oh_right_triples S).filter (fun β => up_weight (oh_wrapped_pairs S) β = 3)).card lemma w23_oh_layer_counts (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a+w23_rho S < 2*S.multiplicity) : (oh_low_pairs S).card = (w23_X S 2).card ∧ (oh_wrapped_pairs S).card = (cm_b S).card ∧ (oh_low_triples S).card = (cm_d S).card ∧ (oh_right_triples S).card = (cm_v S).card := by exact ⟨oh_layer_card _ _ _ (w23_cm_X2_subset S hq hcore), oh_layer_card _ _ _ (fun x hx => (Finset.mem_inter.1 hx).2), oh_layer_card _ _ _ (w23_cm_d_subset S hq hcore), oh_layer_card _ _ _ (fun x hx => (Finset.mem_inter.1 hx).2)⟩ theorem w23_oh_split_shadows (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a+w23_rho S < 2*S.multiplicity) : 3*(cm_d S).card+3*(cm_v S).card ≤ ((w23_X S 1).card+2)*(w23_X S 2).card+up_Lambda S ∧ up_Lambda S ≤ ((w23_X S 1).card+2)*(cm_b S).card ∧ up_Lambda S ≤ 2*(cm_v S).card+up_t3 S := by classical have hP := w23_cm_X2_subset S hq hcore have hQ : cm_b S ⊆ 2 • w23_X S 1 := fun x hx => (Finset.mem_inter.1 hx).2 have hL := w23_cm_d_subset S hq hcore have hT : cm_v S ⊆ 3 • w23_X S 1 := fun x hx => (Finset.mem_inter.1 hx).2 have hPd : ∀ α ∈ oh_low_pairs S, m3_degree α = 2 := fun α hα => (oh_layer_spec _ _ _ hP hα).1 have hQd : ∀ α ∈ oh_wrapped_pairs S, m3_degree α = 2 := fun α hα => (oh_layer_spec _ _ _ hQ hα).1 have hLd : ∀ β ∈ oh_low_triples S, m3_degree β = 3 := fun β hβ => (oh_layer_spec _ _ _ hL hβ).1 have hTd : ∀ β ∈ oh_right_triples S, m3_degree β = 3 := fun β hβ => (oh_layer_spec _ _ _ hT hβ).1 have hLp : ∀ β ∈ oh_low_triples S, ∀ i, 0 < β i → m3_parent β i ∈ oh_low_pairs S := by intro β hβ i hi exact oh_layer_parent _ _ _ 2 (by omega) hL (w23_oh_left_parent S) hβ i hi have hTp : ∀ β ∈ oh_right_triples S, ∀ i, 0 < β i → m3_parent β i ∈ oh_low_pairs S ∪ oh_wrapped_pairs S := by intro β hβ i hi have hh := oh_layer_parent _ _ _ 2 (by omega) hT (w23_oh_right_parent S hq hcore) hβ i hi rwa [oh_layer_union] at hh have hs := up_low_wrapped_shadows (oh_low_pairs S) (oh_wrapped_pairs S) (oh_low_triples S) (oh_right_triples S) hPd hQd hLd hTd (oh_layer_disjoint _ _ _ 2 hP hQ (w23_oh_pairs_disjoint S)) (oh_layer_disjoint _ _ _ 3 hL hT (w23_oh_triples_disjoint S)) hLp hTp have hlam := up_lambda_sum_bound (oh_wrapped_pairs S) (oh_right_triples S) hTd obtain ⟨hcP,hcQ,hcL,hcT⟩ := w23_oh_layer_counts S hq hcore change _ ≤ _ + up_Lambda S ∧ up_Lambda S ≤ _ at hs rw [hcP,hcQ,hcL,hcT] at hs change up_Lambda S ≤ 2*(oh_right_triples S).card+up_t3 S at hlam rw [hcT] at hlam exact ⟨hs.1,hs.2,hlam⟩ lemma oh_enum_injective (A : Finset ℕ) : Function.Injective (m3_enum A) := by intro i j he apply (Finset.equivFin A).symm.injective apply Subtype.ext exact he theorem w23_oh_t3_le_wrapped (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a+w23_rho S < 2*S.multiplicity) (h : Fin (w23_X S 1).card) (hlow : ∀ i, i ≠ h → 2*m3_enum (w23_X S 1) i+w23_rho S < 3*S.multiplicity) : up_t3 S ≤ (cm_b S).card := by have hQ : cm_b S ⊆ 2 • w23_X S 1 := fun x hx => (Finset.mem_inter.1 hx).2 have hT : cm_v S ⊆ 3 • w23_X S 1 := fun x hx => (Finset.mem_inter.1 hx).2 have hTd : ∀ β ∈ oh_right_triples S, m3_degree β = 3 := fun β hβ => (oh_layer_spec _ _ _ hT hβ).1 have hQh : ∀ α ∈ oh_wrapped_pairs S, 0 < α h := by intro α hα obtain ⟨hd, hv⟩ := oh_layer_spec _ _ _ hQ hα have hl := ((w23_mem_X S 3 _).1 (Finset.mem_inter.1 hv).1).2 have hb := ((w23_level_eq_iff S _ 3).1 hl).1 exact oh_pair_high (m3_enum (w23_X S 1)) S.multiplicity (w23_rho S) h hlow α hd hb have hh := oh_full_weight_injection (oh_wrapped_pairs S) (oh_right_triples S) hTd h hQh change up_t3 S ≤ (oh_wrapped_pairs S).card at hh rwa [(w23_oh_layer_counts S hq hcore).2.1] at hh theorem w23_oh_wilf_of_t3_le_wrapped (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a+w23_rho S < 2*S.multiplicity) (ht3 : up_t3 S ≤ (cm_b S).card) : S.SatisfiesWilf := by have hp := w23_cm_pair_card S hq hcore obtain ⟨hlo,hwr,hlam⟩ := w23_oh_split_shadows S hq hcore have hquad := w23_cm_quadruple_card S hq hcore have hcount := up_one_high_count_certificate (w23_X S 1).card (w23_X S 2).card (cm_b S).card (cm_d S).card (cm_v S).card (cm_C4 S).card (up_Lambda S) (up_t3 S) (by nlinarith [hp]) hlo hwr hquad hlam ht3 obtain ⟨hn,hL,hD,hm⟩ := w23_cm_counts S hq hcore have hX3 := w23_cm_X3_card S have hright := w23_cm_right_card S hq hcore apply w23_wilf_of_W0 S rw [hq] nlinarith theorem w23_q4_core_one_high (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) (hone : ((w23_X S 1).filter (fun a => 3 * S.multiplicity ≤ 2 * a + w23_rho S)).card ≤ 1) : S.SatisfiesWilf := by classical have hq := w23_q_eq_four S h1 h2 let H := (w23_X S 1).filter (fun a => 3*S.multiplicity ≤ 2*a+w23_rho S) by_cases hH : H.Nonempty · obtain ⟨a,ha⟩ := hH have haA := (Finset.mem_filter.1 ha).1 obtain ⟨h,hh⟩ := m3_enum_surjective (w23_X S 1) a haA have hlow : ∀ i, i ≠ h → 2*m3_enum (w23_X S 1) i+w23_rho S < 3*S.multiplicity := by intro i hi by_contra hn have hiH : m3_enum (w23_X S 1) i ∈ H := Finset.mem_filter.2 ⟨m3_enum_mem _ i,by omega⟩ have he := Finset.card_le_one.1 hone _ hiH a ha rw [← hh] at he exact hi (oh_enum_injective _ he) exact w23_oh_wilf_of_t3_le_wrapped S hq hcore (w23_oh_t3_le_wrapped S hq hcore h hlow) · apply w23_q4_lowhalf S h1 h2 intro a ha hlt hne have haX : a ∈ w23_X S 1 := (w23_mem_X S 1 a).2 ⟨w23_primitive_mem_apery S ha hne,w23_cm_primitive_level S hcore ha hlt⟩ by_contra hn exact hH ⟨a, Finset.mem_filter.2 ⟨haX,by omega⟩⟩ lemma w23_oh_sumset_not_primitive (S : NumericalSemigroup) (r : ℕ) (hr : 1 ≤ r) {x : ℕ} (hx : x ∈ (r+1) • w23_X S 1) : ¬ S.IsPrimitive x := by rw [succ_nsmul] at hx obtain ⟨z,hz,a,ha,rfl⟩ := Finset.mem_add.1 hx have hzS := w23_lh_sumset_carrier S r z hz have haS := w23_lh_sumset_carrier S 1 a (by simpa using ha) have hm := S.multiplicity_pos have hlo := lh_nsmul_lower (w23_X S 1) S.multiplicity (fun a ha => Nat.le_of_lt (w23_X_one_gt S ha)) r z hz have hap := w23_X_one_gt S ha intro hp rcases hp.2.2 z a hzS haS rfl with hz0 | ha0 <;> nlinarith lemma w23_oh_right_partition (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a+w23_rho S < 2*S.multiplicity) : n4_right S = cm_v S ∪ cm_C4 S := by classical apply Finset.Subset.antisymm · intro x hx have hx4 := (Finset.mem_filter.1 hx).1 obtain ⟨hxa,hxl⟩ := (w23_mem_X S 4 x).1 hx4 by_cases h3 : x ∈ 3 • w23_X S 1 · exact Finset.mem_union.2 (Or.inl (Finset.mem_inter.2 ⟨hx4,h3⟩)) · have h4 := (Finset.mem_union.1 (w23_cm_right_subset S hq hcore hx)).resolve_left h3 have h2 : x ∉ 2 • w23_X S 1 := by intro hh have := w23_cm_pairs_level S hh omega exact Finset.mem_union.2 (Or.inr (Finset.mem_sdiff.2 ⟨Finset.mem_inter.2 ⟨hxa,h4⟩,by simpa only [Finset.mem_union,not_or] using And.intro h2 h3⟩)) · intro x hx rcases Finset.mem_union.1 hx with hv | hu · obtain ⟨hx4,hx3⟩ := Finset.mem_inter.1 hv exact Finset.mem_filter.2 ⟨hx4,w23_oh_sumset_not_primitive S 2 (by omega) hx3⟩ · obtain ⟨hxi,hxn⟩ := Finset.mem_sdiff.1 hu obtain ⟨hxa,hx4⟩ := Finset.mem_inter.1 hxi have hge := w23_lh_degree_le S 4 x hx4 have hle := w23_level_apery_le S hxa exact Finset.mem_filter.2 ⟨(w23_mem_X S 4 x).2 ⟨hxa,by omega⟩, w23_oh_sumset_not_primitive S 3 (by omega) hx4⟩ lemma w23_oh_right_card (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a+w23_rho S < 2*S.multiplicity) : (n4_right S).card = (cm_v S).card+(cm_C4 S).card := by classical rw [w23_oh_right_partition S hq hcore] apply Finset.card_union_of_disjoint apply Finset.disjoint_left.2 intro x hv hu exact (Finset.mem_sdiff.1 hu).2 (Finset.mem_union.2 (Or.inr (Finset.mem_inter.1 hv).2)) noncomputable def up_core_surplus (S : NumericalSemigroup) : ℤ := (w23_n S : ℤ)*(S.leftCount : ℤ)-4*((w23_D S).card : ℤ) noncomputable def up_delta2 (S : NumericalSemigroup) : ℤ := ((w23_X S 1).card : ℤ)*((w23_X S 1).card+1)- 2*((w23_X S 2).card+(cm_b S).card) noncomputable def up_Ulow (S : NumericalSemigroup) : ℤ := (((w23_X S 1).card : ℤ)+2)*(w23_X S 2).card- 3*(cm_d S).card-3*(cm_v S).card+up_Lambda S noncomputable def up_Uwr (S : NumericalSemigroup) : ℤ := (((w23_X S 1).card : ℤ)+2)*(cm_b S).card-up_Lambda S noncomputable def up_Utri (S : NumericalSemigroup) : ℤ := (((w23_X S 1).card : ℤ)+3)*(cm_d S).card-4*(cm_C4 S).card lemma w23_oh_core_surplus_eq (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a+w23_rho S < 2*S.multiplicity) : up_core_surplus S = 3*((w23_X S 1).card : ℤ)*((w23_X S 1).card+1)+ (2*((w23_X S 1).card : ℤ)-2)*(w23_X S 2).card+ (((w23_X S 1).card : ℤ)-3)*((cm_b S).card+(cm_d S).card)- 4*((cm_v S).card+(cm_C4 S).card) := by obtain ⟨hn,hL,hD,hm⟩ := w23_cm_counts S hq hcore unfold up_core_surplus rw [hn,hL,hD,w23_cm_X3_card S,w23_oh_right_card S hq hcore] push_cast ring theorem w23_oh_unit_price_slacks (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a+w23_rho S < 2*S.multiplicity) : 0 ≤ up_delta2 S ∧ 0 ≤ up_Ulow S ∧ 0 ≤ up_Uwr S ∧ 0 ≤ up_Utri S := by have hpair : (2 : ℤ)*((w23_X S 2).card+(cm_b S).card) ≤ (((w23_X S 1).card : ℤ)+1)*(w23_X S 1).card := by exact_mod_cast w23_cm_pair_card S hq hcore obtain ⟨hlow,hwrap,hlambda⟩ := w23_oh_split_shadows S hq hcore have hl : (3 : ℤ)*(cm_d S).card+3*(cm_v S).card ≤ (((w23_X S 1).card : ℤ)+2)*(w23_X S 2).card+up_Lambda S := by exact_mod_cast hlow have hw : (up_Lambda S : ℤ) ≤ (((w23_X S 1).card : ℤ)+2)*(cm_b S).card := by exact_mod_cast hwrap have hq4 : (4 : ℤ)*(cm_C4 S).card ≤ (((w23_X S 1).card : ℤ)+3)*(cm_d S).card := by exact_mod_cast w23_cm_quadruple_card S hq hcore unfold up_delta2 up_Ulow up_Uwr up_Utri exact ⟨by nlinarith,by omega,by omega,by omega⟩ lemma up_cost_sum {k : ℕ} (F E : Finset (Fin k → ℕ)) (K : ℤ) : (∑ β ∈ F, (2*(K+2)-(K+1)*(up_weight E β : ℤ))) = 2*(K+2)*(F.card : ℤ)-(K+1)*((∑ β ∈ F, up_weight E β : ℕ) : ℤ) := by classical have hs : (∑ β ∈ F, (K+1)*(up_weight E β : ℤ)) = (K+1)*((∑ β ∈ F, up_weight E β : ℕ) : ℤ) := by simp only [Nat.cast_sum, ← Finset.mul_sum] rw [Finset.sum_sub_distrib, hs] simp only [Finset.sum_const, nsmul_eq_mul] ring theorem w23_oh_unit_price_identity (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a+w23_rho S < 2*S.multiplicity) : (((w23_X S 1).card : ℤ)+2)*up_core_surplus S = 3*(((w23_X S 1).card : ℤ)+2)*up_delta2 S+ 2*(((w23_X S 1).card : ℤ)+2)*up_Ulow S+ (((w23_X S 1).card : ℤ)+3)*up_Uwr S+ (((w23_X S 1).card : ℤ)+2)*up_Utri S+ ∑ β ∈ oh_right_triples S, (2*(((w23_X S 1).card : ℤ)+2)- (((w23_X S 1).card : ℤ)+1)*(up_weight (oh_wrapped_pairs S) β : ℤ)) := by have hsum : (∑ β ∈ oh_right_triples S, (2*(((w23_X S 1).card : ℤ)+2)- (((w23_X S 1).card : ℤ)+1)*(up_weight (oh_wrapped_pairs S) β : ℤ))) = 2*(((w23_X S 1).card : ℤ)+2)*(cm_v S).card- (((w23_X S 1).card : ℤ)+1)*(up_Lambda S : ℤ) := by rw [up_cost_sum, (w23_oh_layer_counts S hq hcore).2.2.2] rfl rw [hsum,w23_oh_core_surplus_eq S hq hcore] unfold up_delta2 up_Ulow up_Uwr up_Utri have hi := up_unit_price_identity ((w23_X S 1).card : ℤ) ((w23_X S 2).card : ℤ) ((cm_b S).card : ℤ) ((cm_d S).card : ℤ) ((cm_v S).card : ℤ) ((cm_C4 S).card : ℤ) (up_Lambda S : ℤ) linear_combination hi theorem w23_oh_C1 (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a+w23_rho S < 2*S.multiplicity) : 3*up_delta2 S+2*up_Ulow S+up_Utri S+(cm_b S).card ≤ up_core_surplus S+up_t3 S := by obtain ⟨hlow,hwrap,hlambda⟩ := w23_oh_split_shadows S hq hcore have hw : (up_Lambda S : ℤ) ≤ (((w23_X S 1).card : ℤ)+2)*(cm_b S).card := by exact_mod_cast hwrap have ht : (up_Lambda S : ℤ) ≤ 2*(cm_v S).card+up_t3 S := by exact_mod_cast hlambda rw [w23_oh_core_surplus_eq S hq hcore] unfold up_delta2 up_Ulow up_Utri nlinarith theorem w23_oh_surplus_nonneg_of_t3 (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a+w23_rho S < 2*S.multiplicity) (ht3 : up_t3 S ≤ (cm_b S).card) : 0 ≤ up_core_surplus S := by have hC := w23_oh_C1 S hq hcore obtain ⟨h2,hlo,hwr,ht⟩ := w23_oh_unit_price_slacks S hq hcore have h3 : (up_t3 S : ℤ) ≤ (cm_b S).card := by exact_mod_cast ht3 linarith lemma w23_gm_X1_primitive (S : NumericalSemigroup) {a : ℕ} (ha : a ∈ w23_X S 1) : S.IsPrimitive a := by classical rw [w23_X_one] at ha exact (S.mem_primitiveElements a).1 (Finset.mem_filter.1 (Finset.mem_erase.1 ha).2).1 lemma w23_gm_noP2_primitive (S : NumericalSemigroup) (hq : w23_q S = 4) (hC : w23_P S 2 = ∅) {a : ℕ} (ha : S.IsPrimitive a) (hlt : a < S.conductor) (hne : a ≠ S.multiplicity) : a ∈ w23_X S 1 ∪ w23_P S 3 := by classical have hpos := w23_primitive_level_pos S ha have hlev := (w23_lt_conductor_iff S a).1 hlt have hn2 : w23_level S a ≠ 2 := by classical intro h2 have : a ∈ w23_P S 2 := (w23_mem_P S 2 a).2 ⟨ha,h2⟩ simpa [hC] using this rw [hq] at hlev by_cases h1 : w23_level S a = 1 · exact Finset.mem_union.2 (Or.inl ((w23_mem_X S 1 a).2 ⟨w23_primitive_mem_apery S ha hne,h1⟩)) · exact Finset.mem_union.2 (Or.inr ((w23_mem_P S 3 a).2 ⟨ha,by omega⟩)) lemma w23_gm_noP2_remove_m (S : NumericalSemigroup) (hq : w23_q S = 4) (hC : w23_P S 2 = ∅) (d x : ℕ) (hx : x ∈ d • w23_low_A S) (hxa : x ∈ w23_apery S) : x ∈ d • (w23_X S 1 ∪ w23_P S 3) := by classical induction d generalizing x with | zero => simpa using hx | succ d ih => rw [succ_nsmul] at hx ⊢ obtain ⟨y,hy,a,ha,rfl⟩ := Finset.mem_add.1 hx have hyS := w23_low_sumset_carrier S d y hy obtain ⟨hp,hlt⟩ := (w23_low_mem_A S a).1 ha have hya := w23_apery_closed S hxa hyS hp.1 rfl have haa := w23_apery_closed S hxa hp.1 hyS (by omega) have hne : a ≠ S.multiplicity := by classical intro he rw [he] at haa exact w23_multiplicity_not_mem_apery S haa exact Finset.add_mem_add (ih y hy hya) (w23_gm_noP2_primitive S hq hC hp hlt hne) lemma w23_gm_noP2_left_repr (S : NumericalSemigroup) (hq : w23_q S = 4) (hC : w23_P S 2 = ∅) {x : ℕ} (hx : x ∈ w23_apery S) (hlt : x < S.conductor) : ∃ d : ℕ, x ∈ d • (w23_X S 1 ∪ w23_P S 3) := by classical have hxL := (S.mem_leftElements x).2 ⟨hlt,((w23_mem_apery S x).1 hx).2.1⟩ obtain ⟨d,hd⟩ := w23_low_left_repr S x hxL exact ⟨d,w23_gm_noP2_remove_m S hq hC d x hd hx⟩ lemma w23_gm_noP2_right_repr (S : NumericalSemigroup) (hq : w23_q S = 4) (hC : w23_P S 2 = ∅) {x : ℕ} (hx : x ∈ n4_right S) : ∃ d : ℕ, x ∈ d • (w23_X S 1 ∪ w23_P S 3) := by classical obtain ⟨hx4,hn⟩ := Finset.mem_filter.1 hx have hxa := ((w23_mem_X S 4 x).1 hx4).1 have hxS := ((w23_mem_apery S x).1 hxa).2.1 obtain ⟨a,b,ha,hb,hap,hbp,he⟩ := w23_decomposable_eq_add S hxS hn (w23_X_pos S (by omega) hx4) (w23_apery_lt S hxa) obtain ⟨d,hd⟩ := w23_low_left_repr S a ha obtain ⟨e,he'⟩ := w23_low_left_repr S b hb have hmem : x ∈ (d+e) • w23_low_A S := by classical rw [add_nsmul] exact Finset.mem_add.2 ⟨a,hd,b,he',he.symm⟩ exact ⟨d+e,w23_gm_noP2_remove_m S hq hC (d+e) x hmem hxa⟩ lemma gm_union_factor (B D : Finset ℕ) (d x : ℕ) (hx : x ∈ d • (B ∪ D)) : x ∈ d • B ∨ ∃ a ∈ D, ∃ y ∈ (d-1) • (B ∪ D), x = y+a := by classical induction d generalizing x with | zero => exact Or.inl (by simpa using hx) | succ d ih => rw [succ_nsmul] at hx obtain ⟨y,hy,a,ha,rfl⟩ := Finset.mem_add.1 hx rcases Finset.mem_union.1 ha with haB | haD · rcases ih y hy with hyB | ⟨b,hb,z,hz,he⟩ · exact Or.inl (by rw [succ_nsmul]; exact Finset.add_mem_add hyB haB) · by_cases hd : d = 0 · subst d have hz0 : z = 0 := by simpa using hz have hy0 : y = 0 := by simpa using hy have hb0 : b = 0 := by omega subst b exact Or.inl (by simp [hy0,haB]) · refine Or.inr ⟨b,hb,z+a,?_,by omega⟩ have hde : d = (d-1)+1 := by omega rw [show d+1-1=d by omega,hde,succ_nsmul] exact Finset.add_mem_add hz (Finset.mem_union.2 (Or.inl haB)) · exact Or.inr ⟨a,haD,y,by simpa using hy,rfl⟩ lemma w23_gm_noP2_bounds (S : NumericalSemigroup) {a : ℕ} (ha : a ∈ w23_X S 1 ∪ w23_P S 3) : S.multiplicity < a := by classical rcases Finset.mem_union.1 ha with ha | ha · exact w23_X_one_gt S ha · have hl := ((w23_mem_P S 3 a).1 ha).2 have hb := ((w23_level_eq_iff S a 3).1 hl).1 have hr := w23_rho_lt S have hm := S.multiplicity_pos omega lemma w23_gm_noP2_degree (S : NumericalSemigroup) (d x : ℕ) (hx : x ∈ d • (w23_X S 1 ∪ w23_P S 3)) : d ≤ w23_level S x := by classical have hlo := lh_nsmul_lower (w23_X S 1 ∪ w23_P S 3) S.multiplicity (fun a ha => Nat.le_of_lt (w23_gm_noP2_bounds S ha)) d x hx have hhi := ((w23_level_eq_iff S x (w23_level S x)).1 rfl).2 have hm := S.multiplicity_pos by_contra hn have hmul := Nat.mul_le_mul_right S.multiplicity (show w23_level S x+1 ≤ d by omega) omega lemma w23_gm_noP2_pure (S : NumericalSemigroup) (hq : w23_q S = 4) (d x : ℕ) (hd : 2 ≤ d) (hx : x ∈ d • (w23_X S 1 ∪ w23_P S 3)) (hbound : x < S.conductor ∨ (3 ≤ d ∧ x < S.conductor+S.multiplicity)) : x ∈ d • w23_X S 1 := by classical rcases gm_union_factor (w23_X S 1) (w23_P S 3) d x hx with hp | ⟨a,ha,y,hy,he⟩ · exact hp · have hlo := lh_nsmul_lower (w23_X S 1 ∪ w23_P S 3) (S.multiplicity+1) (fun b hb => w23_gm_noP2_bounds S hb) (d-1) y hy have haL := ((w23_level_eq_iff S a 3).1 ((w23_mem_P S 3 a).1 ha).2).1 have hc := w23_q_mul_sub S rw [hq] at hc have hm := S.multiplicity_pos rcases hbound with hb | ⟨hd3,hb⟩ · have hmul := Nat.mul_le_mul_right (S.multiplicity+1) (show 1 ≤ d-1 by omega) omega · have hmul := Nat.mul_le_mul_right (S.multiplicity+1) (show 2 ≤ d-1 by omega) omega lemma w23_gm_noP2_X2_subset (S : NumericalSemigroup) (hC : w23_P S 2 = ∅) : w23_X S 2 ⊆ 2 • w23_X S 1 := by classical intro x hx have hn : ¬ S.IsPrimitive x := by classical intro hp have : x ∈ w23_P S 2 := (w23_mem_P S 2 x).2 ⟨hp,((w23_mem_X S 2 x).1 hx).2⟩ simpa [hC] using this simpa only [two_nsmul] using w23_X_two_decomp S hx hn lemma w23_gm_noP2_Z_subset (S : NumericalSemigroup) (hq : w23_q S = 4) (hC : w23_P S 2 = ∅) : w23_Z S ⊆ (2 • w23_X S 1) ∪ (3 • w23_X S 1) := by classical intro x hx obtain ⟨hx3,hn⟩ := Finset.mem_filter.1 hx obtain ⟨hxa,hxl⟩ := (w23_mem_X S 3 x).1 hx3 have hlt := (w23_lt_conductor_iff S x).2 (by omega) obtain ⟨d,hd⟩ := w23_gm_noP2_left_repr S hq hC hxa hlt have hdle := w23_gm_noP2_degree S d x hd rw [hxl] at hdle have hd2 : 2 ≤ d := by classical by_contra hh interval_cases d · have hx0 : x = 0 := by simpa using hd rw [hx0,w23_level_zero] at hxl omega · have hm : x ∈ w23_X S 1 ∪ w23_P S 3 := by simpa using hd rcases Finset.mem_union.1 hm with hm | hm · exact hn (w23_gm_X1_primitive S hm) · exact hn ((w23_mem_P S 3 x).1 hm).1 have hp := w23_gm_noP2_pure S hq d x hd2 hd (Or.inl hlt) interval_cases d · exact Finset.mem_union.2 (Or.inl hp) · exact Finset.mem_union.2 (Or.inr hp) lemma w23_gm_noP2_right_subset (S : NumericalSemigroup) (hq : w23_q S = 4) (hC : w23_P S 2 = ∅) : n4_right S ⊆ (3 • w23_X S 1) ∪ (4 • w23_X S 1) ∪ (w23_X S 1 + w23_P S 3) := by classical intro x hx obtain ⟨hx4,hn⟩ := Finset.mem_filter.1 hx obtain ⟨hxa,hxl⟩ := (w23_mem_X S 4 x).1 hx4 obtain ⟨d,hd⟩ := w23_gm_noP2_right_repr S hq hC hx have hdle := w23_gm_noP2_degree S d x hd rw [hxl] at hdle have hlt := w23_apery_lt S hxa have hd2 : 2 ≤ d := by classical by_contra hh interval_cases d · have hx0 : x = 0 := by simpa using hd rw [hx0,w23_level_zero] at hxl omega · have hm : x ∈ w23_X S 1 ∪ w23_P S 3 := by simpa using hd rcases Finset.mem_union.1 hm with hm | hm · exact hn (w23_gm_X1_primitive S hm) · exact hn ((w23_mem_P S 3 x).1 hm).1 by_cases hd3 : 3 ≤ d · have hp := w23_gm_noP2_pure S hq d x hd2 hd (Or.inr ⟨hd3,hlt⟩) interval_cases d · exact Finset.mem_union.2 (Or.inl (Finset.mem_union.2 (Or.inl hp))) · exact Finset.mem_union.2 (Or.inl (Finset.mem_union.2 (Or.inr hp))) · have hd2e : d = 2 := by omega subst d rcases gm_union_factor (w23_X S 1) (w23_P S 3) 2 x hd with hp | ⟨a,ha,y,hy,he⟩ · have := w23_cm_pairs_level S hp omega · have hyU : y ∈ w23_X S 1 ∪ w23_P S 3 := by simpa using hy rcases Finset.mem_union.1 hyU with hyB | hyD · exact Finset.mem_union.2 (Or.inr (Finset.mem_add.2 ⟨y,hyB,a,ha,he.symm⟩)) · have haL := ((w23_level_eq_iff S a 3).1 ((w23_mem_P S 3 a).1 ha).2).1 have hyL := ((w23_level_eq_iff S y 3).1 ((w23_mem_P S 3 y).1 hyD).2).1 have hc := w23_q_mul_sub S rw [hq] at hc have hr := w23_rho_lt S omega lemma w23_gm_pure_nonprimitive (S : NumericalSemigroup) (d x : ℕ) (hd : 2 ≤ d) (hx : x ∈ d • w23_X S 1) : ¬ S.IsPrimitive x := by classical intro hp have he : d = (d-1)+1 := by omega rw [he,succ_nsmul] at hx obtain ⟨y,hy,a,ha,hx⟩ := Finset.mem_add.1 hx have hyS := w23_lh_sumset_carrier S (d-1) y hy have haS := ((w23_mem_apery S a).1 ((w23_mem_X S 1 a).1 ha).1).2.1 have hylo := lh_nsmul_lower (w23_X S 1) S.multiplicity (fun b hb => Nat.le_of_lt (w23_X_one_gt S hb)) (d-1) y hy have hm := S.multiplicity_pos have hypos : 0 < y := by classical have hh := Nat.mul_le_mul_right S.multiplicity (show 1 ≤ d-1 by omega) omega have hapos := w23_X_one_gt S ha have hbad := hp.2.2 y a hyS haS hx.symm omega noncomputable def gm_v (S : NumericalSemigroup) : Finset ℕ := w23_Z S \ (2 • w23_X S 1) noncomputable def gm_r (S : NumericalSemigroup) : Finset ℕ := n4_right S \ (cm_v S ∪ cm_C4 S) lemma w23_gm_noP2_B2_card (S : NumericalSemigroup) (hC : w23_P S 2 = ∅) : (cm_B2 S).card = (w23_X S 2).card + (cm_b S).card := by classical have heq : cm_B2 S = w23_X S 2 ∪ cm_b S := by classical ext x constructor · intro hx obtain ⟨hxa,hx2⟩ := Finset.mem_inter.1 hx have hl := w23_cm_pairs_level S hx2 by_cases h2 : w23_level S x = 2 · exact Finset.mem_union.2 (Or.inl ((w23_mem_X S 2 x).2 ⟨hxa,h2⟩)) · exact Finset.mem_union.2 (Or.inr (Finset.mem_inter.2 ⟨(w23_mem_X S 3 x).2 ⟨hxa,by omega⟩,hx2⟩)) · intro hx rcases Finset.mem_union.1 hx with hx2 | hx3 · exact Finset.mem_inter.2 ⟨((w23_mem_X S 2 x).1 hx2).1, w23_gm_noP2_X2_subset S hC hx2⟩ · exact Finset.mem_inter.2 ⟨((w23_mem_X S 3 x).1 (Finset.mem_inter.1 hx3).1).1,(Finset.mem_inter.1 hx3).2⟩ have hdis : Disjoint (w23_X S 2) (cm_b S) := by classical apply Finset.disjoint_left.2 intro x hx2 hxb have h2 := ((w23_mem_X S 2 x).1 hx2).2 have h3 := ((w23_mem_X S 3 x).1 (Finset.mem_inter.1 hxb).1).2 omega rw [heq,Finset.card_union_of_disjoint hdis] lemma w23_gm_Z_card (S : NumericalSemigroup) : (w23_Z S).card = (cm_b S).card + (gm_v S).card := by classical have hsub : cm_b S ⊆ w23_Z S := by classical intro x hx obtain ⟨hx3,hx2⟩ := Finset.mem_inter.1 hx exact Finset.mem_filter.2 ⟨hx3,w23_gm_pure_nonprimitive S 2 x (by omega) hx2⟩ have heq : w23_Z S = cm_b S ∪ gm_v S := by classical ext x constructor · intro hx by_cases hx2 : x ∈ 2 • w23_X S 1 · exact Finset.mem_union.2 (Or.inl (Finset.mem_inter.2 ⟨(Finset.mem_filter.1 hx).1,hx2⟩)) · exact Finset.mem_union.2 (Or.inr (Finset.mem_sdiff.2 ⟨hx,hx2⟩)) · intro hx rcases Finset.mem_union.1 hx with hb | hv · exact hsub hb · exact (Finset.mem_sdiff.1 hv).1 have hdis : Disjoint (cm_b S) (gm_v S) := by classical apply Finset.disjoint_left.2 intro x hb hv exact (Finset.mem_sdiff.1 hv).2 (Finset.mem_inter.1 hb).2 conv_lhs => rw [heq] exact Finset.card_union_of_disjoint hdis lemma w23_gm_noP2_v_subset (S : NumericalSemigroup) (hq : w23_q S = 4) (hC : w23_P S 2 = ∅) : gm_v S ⊆ 3 • w23_X S 1 := by classical intro x hx obtain ⟨hxZ,hn⟩ := Finset.mem_sdiff.1 hx exact (Finset.mem_union.1 (w23_gm_noP2_Z_subset S hq hC hxZ)).resolve_left hn lemma w23_gm_noP2_right_card (S : NumericalSemigroup) (hq : w23_q S = 4) (hC : w23_P S 2 = ∅) : (n4_right S).card ≤ (cm_v S).card + (cm_C4 S).card + (gm_r S).card ∧ (gm_r S).card ≤ (w23_X S 1).card * (w23_P S 3).card := by classical have hsub : n4_right S ⊆ cm_v S ∪ cm_C4 S ∪ gm_r S := by classical intro x hx by_cases hm : x ∈ cm_v S ∪ cm_C4 S · exact Finset.mem_union.2 (Or.inl hm) · exact Finset.mem_union.2 (Or.inr (Finset.mem_sdiff.2 ⟨hx,hm⟩)) have hrsub : gm_r S ⊆ w23_X S 1 + w23_P S 3 := by classical intro x hx obtain ⟨hxR,hn⟩ := Finset.mem_sdiff.1 hx have hx4 := (Finset.mem_filter.1 hxR).1 obtain ⟨hxa,hxl⟩ := (w23_mem_X S 4 x).1 hx4 have h3 : x ∉ 3 • w23_X S 1 := by classical intro hh exact hn (Finset.mem_union.2 (Or.inl (Finset.mem_inter.2 ⟨hx4,hh⟩))) have h4 : x ∉ 4 • w23_X S 1 := by classical intro hh have h2 : x ∉ 2 • w23_X S 1 := by classical intro hh have := w23_cm_pairs_level S hh omega exact hn (Finset.mem_union.2 (Or.inr (Finset.mem_sdiff.2 ⟨Finset.mem_inter.2 ⟨hxa,hh⟩,by simp [h2,h3]⟩))) have hh := w23_gm_noP2_right_subset S hq hC hxR exact (Finset.mem_union.1 hh).resolve_left (by simp [h3,h4]) refine ⟨?_,(Finset.card_le_card hrsub).trans (w23_card_add_le _ _)⟩ have hc := (Finset.card_le_card hsub).trans (Finset.card_union_le _ _) have hu := Finset.card_union_le (cm_v S) (cm_C4 S) omega lemma w23_gm_noP2_pair_card (S : NumericalSemigroup) (hC : w23_P S 2 = ∅) : 2 * ((w23_X S 2).card + (cm_b S).card) ≤ ((w23_X S 1).card + 1) * (w23_X S 1).card := by classical have hh := ns_restricted_succ_le (w23_X S 1) (w23_X S 1) (cm_B2 S) 1 (by simp) (fun x hx => (Finset.mem_inter.1 hx).2) (by intro c hc a ha z hz he; simpa only [one_nsmul] using hz) simpa only [Nat.reduceAdd,w23_gm_noP2_B2_card S hC] using hh lemma w23_gm_noP2_triple_card (S : NumericalSemigroup) (hq : w23_q S = 4) (hC : w23_P S 2 = ∅) : 3 * ((gm_v S).card + (cm_v S).card) ≤ ((w23_X S 1).card + 2) * ((w23_X S 2).card + (cm_b S).card) := by classical have hsub : gm_v S ∪ cm_v S ⊆ 3 • w23_X S 1 := by classical intro x hx rcases Finset.mem_union.1 hx with hv | ht · exact w23_gm_noP2_v_subset S hq hC hv · exact (Finset.mem_inter.1 ht).2 have hdiv : ∀ x ∈ gm_v S ∪ cm_v S, ∀ a ∈ w23_X S 1, ∀ z ∈ 2 • w23_X S 1, x = z+a → z ∈ cm_B2 S := by classical intro x hx a ha z hz he have hxa : x ∈ w23_apery S := by classical rcases Finset.mem_union.1 hx with hv | ht · exact ((w23_mem_X S 3 x).1 (Finset.mem_filter.1 (Finset.mem_sdiff.1 hv).1).1).1 · exact ((w23_mem_X S 4 x).1 (Finset.mem_inter.1 ht).1).1 exact Finset.mem_inter.2 ⟨(w23_lh_parent S 2 hxa ha hz he).1,hz⟩ have hh := ns_restricted_succ_le (w23_X S 1) (cm_B2 S) (gm_v S ∪ cm_v S) 2 (fun x hx => (Finset.mem_inter.1 hx).2) hsub hdiv have hdis : Disjoint (gm_v S) (cm_v S) := by classical apply Finset.disjoint_left.2 intro x hv ht have h3 := ((w23_mem_X S 3 x).1 (Finset.mem_filter.1 (Finset.mem_sdiff.1 hv).1).1).2 have h4 := ((w23_mem_X S 4 x).1 (Finset.mem_inter.1 ht).1).2 omega rw [Finset.card_union_of_disjoint hdis,w23_gm_noP2_B2_card S hC] at hh exact hh lemma w23_gm_noP2_left_triple_card (S : NumericalSemigroup) (hq : w23_q S = 4) (hC : w23_P S 2 = ∅) : 3 * (gm_v S).card ≤ ((w23_X S 1).card+2) * (w23_X S 2).card := by classical have hdiv : ∀ x ∈ gm_v S, ∀ a ∈ w23_X S 1, ∀ z ∈ 2 • w23_X S 1, x = z+a → z ∈ w23_X S 2 := by classical intro x hx a ha z hz he obtain ⟨hxa,hxl⟩ := (w23_mem_X S 3 x).1 (Finset.mem_filter.1 (Finset.mem_sdiff.1 hx).1).1 obtain ⟨hza,hzle⟩ := w23_lh_parent S 2 hxa ha hz he have hzge := w23_lh_degree_le S 2 z hz exact (w23_mem_X S 2 z).2 ⟨hza,by omega⟩ exact ns_restricted_succ_le (w23_X S 1) (w23_X S 2) (gm_v S) 2 (w23_gm_noP2_X2_subset S hC) (w23_gm_noP2_v_subset S hq hC) hdiv lemma w23_gm_noP2_quadruple_card (S : NumericalSemigroup) (hq : w23_q S = 4) (hC : w23_P S 2 = ∅) : 4 * (cm_C4 S).card ≤ ((w23_X S 1).card+3) * (gm_v S).card := by classical have hdiv : ∀ x ∈ cm_C4 S, ∀ a ∈ w23_X S 1, ∀ z ∈ 3 • w23_X S 1, x = z+a → z ∈ gm_v S := by classical intro x hx a ha z hz he obtain ⟨hxI,hxn⟩ := Finset.mem_sdiff.1 hx have hxa := (Finset.mem_inter.1 hxI).1 obtain ⟨hza,hzle⟩ := w23_lh_parent S 3 hxa ha hz he have hxle := w23_level_apery_le S hxa rw [hq] at hxle have hzge := w23_lh_degree_le S 3 z hz have hn : z ∉ 2 • w23_X S 1 := by classical intro hz2 have hh : x ∈ 3 • w23_X S 1 := by classical rw [show (3 : ℕ)=2+1 by omega,add_nsmul,one_nsmul] exact Finset.mem_add.2 ⟨z,hz2,a,ha,he.symm⟩ exact hxn (Finset.mem_union.2 (Or.inr hh)) exact Finset.mem_sdiff.2 ⟨Finset.mem_filter.2 ⟨(w23_mem_X S 3 z).2 ⟨hza,by omega⟩,w23_gm_pure_nonprimitive S 3 z (by omega) hz⟩,hn⟩ exact ns_restricted_succ_le (w23_X S 1) (gm_v S) (cm_C4 S) 3 (w23_gm_noP2_v_subset S hq hC) (fun x hx => (Finset.mem_inter.1 (Finset.mem_sdiff.1 hx).1).2) hdiv lemma w23_gm_noP2_counts (S : NumericalSemigroup) (hq : w23_q S = 4) (hC : w23_P S 2 = ∅) : S.embeddingDimension = 1+(w23_X S 1).card+(w23_P S 3).card+w23_pq S ∧ S.leftCount = 4+3*(w23_X S 1).card+(w23_P S 3).card+ 2*(w23_X S 2).card+(cm_b S).card+(gm_v S).card ∧ S.embeddingDimension+(w23_X S 2).card+(cm_b S).card+ (gm_v S).card+(n4_right S).card = S.multiplicity := by classical have ha1 := w23_alpha_one S change (w23_X S 1).card+1=(w23_P S 1).card at ha1 have hn := w23_n_eq_sum S change w23_n S = ∑ i ∈ Finset.range (w23_q S), (w23_P S i).card at hn rw [hq] at hn norm_num [Finset.sum_range_succ,w23_P_zero,hC] at hn have hX3 := Finset.card_filter_add_card_filter_not (s := w23_X S 3) S.IsPrimitive rw [n4_X_primitive_eq_P S 3 (by omega)] at hX3 change (w23_P S 3).card+(w23_Z S).card=(w23_X S 3).card at hX3 rw [w23_gm_Z_card S] at hX3 have hl := w23_leftCount_eq S rw [hq] at hl norm_num [Finset.sum_range_succ,w23_alpha,w23_X_zero] at hl have hmc : S.multiplicity < S.conductor := by classical have hb := (w23_q_bounds S).1 rw [hq] at hb omega have hd := w23_D_card_eq S hmc rw [hq] at hd have hreq : (@Finset.filter ℕ (fun x => ¬ S.IsPrimitive x) (Classical.decPred _) (w23_X S 4)) = n4_right S := by classical ext x simp [n4_right] rw [hreq] at hd norm_num [Finset.sum_range_succ,w23_alpha,w23_X_zero] at hd have he := w23_e_eq S have hm := w23_m_eq S exact ⟨by omega,by omega,by omega⟩ lemma gm_noP2_polynomial (a b w v t u z p r : ℕ) (ha : 1 ≤ a) (h2 : 2*(b+w) ≤ (a+1)*a) (h3 : 3*(v+t) ≤ (a+2)*(b+w)) (h3L : 3*v ≤ (a+2)*b) (h4 : 4*u ≤ (a+3)*v) (hr : r ≤ a*z) (hp : a ≤ 3*(p+z)+1) : 4*(b+w+v+t+u+r) ≤ (1+a+z+p)*(3*a+z+2*b+w+v) := by classical have hcert := cc_certificate a b w v t u ha h2 h3 h3L h4 have hc := Nat.mul_le_mul_right w (show a-1 ≤ 3*(p+z) by omega) have hpt := Nat.mul_le_mul_left (3*p) (show w ≤ 3*a+z+2*b+w+v by omega) have hzr := Nat.mul_le_mul_left 12 hr nlinarith theorem w23_gm_q4_noP2_many_right (S : NumericalSemigroup) (h1 : 3*S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4*S.multiplicity) (hC : w23_P S 2 = ∅) (he : (w23_X S 1).card ≤ 3*((@Finset.filter ℕ S.IsPrimitive (Classical.decPred _) (w23_X S 4)).card+ (@Finset.filter ℕ S.IsPrimitive (Classical.decPred _) (w23_X S 3)).card)+1) : S.SatisfiesWilf := by classical have hq := w23_q_eq_four S h1 h2 by_cases hX1 : w23_X S 1 = ∅ · exact w23_q4_of_X1_empty S h1 h2 hX1 have ha : 1 ≤ (w23_X S 1).card := by classical have hh : (w23_X S 1).card ≠ 0 := by classical intro hz exact hX1 (Finset.card_eq_zero.1 hz) omega rw [n4_X_primitive_eq_P S 3 (by omega)] at he have hpq := w23_pq_eq_X_q_primitives S (by omega : S.multiplicity < S.conductor) rw [hq] at hpq rw [← hpq] at he obtain ⟨heq,hL,hm⟩ := w23_gm_noP2_counts S hq hC obtain ⟨hR,hr⟩ := w23_gm_noP2_right_card S hq hC have hp := gm_noP2_polynomial (w23_X S 1).card (w23_X S 2).card (cm_b S).card (gm_v S).card (cm_v S).card (cm_C4 S).card (w23_P S 3).card (w23_pq S) (gm_r S).card ha (w23_gm_noP2_pair_card S hC) (w23_gm_noP2_triple_card S hq hC) (w23_gm_noP2_left_triple_card S hq hC) (w23_gm_noP2_quadruple_card S hq hC) hr he unfold NumericalSemigroup.SatisfiesWilf nlinarith lemma gm_general_polynomial (a k z b w v t u x y f d h0 h1 j l r s wlow p rho : ℕ) (h2 : 2*(b+w) ≤ a*(a+1)) (h3 : 3*(v+t) ≤ (a+2)*(b+w)) (h3L : 3*v ≤ (a+2)*b) (h4 : 4*u ≤ (a+3)*v) (hBC : x+y ≤ a*k) (hCC : 2*(f+d) ≤ k*(k+1)) (hBD : r ≤ a*z) (hCD : s ≤ k*z) (hgood : h0 ≤ k*b) (hshadow : 3*(h0+h1+j+l) ≤ k*(b+wlow)+(a+k+2)*(x+f)) (hstrip : f+h1+j+l+s ≤ rho) (hlow : wlow ≤ w) (he : a ≤ 3*(p+z)+1) : 4*(b+w+v+t+u+x+y+f+d+h0+h1+j+l+r+s) ≤ (1+a+k+z+p)*(3*a+2*k+z+2*b+w+v+x+f)+rho := by have hcert : 12*(b+w+v+t+u+x+y+f+d+h0+h1+j+l+r+s)+w+3*a*k+ 3*k*(w+v)+3*z*(1+z+2*b+w+v+x+f) ≤ 3*(1+a+k+z)*(3*a+2*k+z+2*b+w+v+x+f)+3*rho+a*w+3*x+3*k*wlow := by nlinarith only [h2,h3,h3L,h4,hBC,hCC,hBD,hCD,hgood,hshadow,hstrip] have hAW := Nat.mul_le_mul_right w he have hX : 3*x ≤ 3*(a*k) := by omega have hLow := Nat.mul_le_mul_left (3*k) hlow have hP := Nat.mul_le_mul_left (3*p) (show w ≤ 3*a+2*k+z+2*b+w+v+x+f by omega) nlinarith only [hcert,hAW,hX,hLow,hP] lemma w23_gm_general_wilf_counts (S : NumericalSemigroup) (a k z b w v t u x y f d h0 h1 j l r s wlow p rho R : ℕ) (h2 : 2*(b+w) ≤ a*(a+1)) (h3 : 3*(v+t) ≤ (a+2)*(b+w)) (h3L : 3*v ≤ (a+2)*b) (h4 : 4*u ≤ (a+3)*v) (hBC : x+y ≤ a*k) (hCC : 2*(f+d) ≤ k*(k+1)) (hBD : r ≤ a*z) (hCD : s ≤ k*z) (hgood : h0 ≤ k*b) (hshadow : 3*(h0+h1+j+l) ≤ k*(b+wlow)+(a+k+2)*(x+f)) (hstrip : f+h1+j+l+s ≤ rho) (hlow : wlow ≤ w) (hcomp : a ≤ 3*(p+z)+1) (hR : R ≤ t+u+y+d+h0+h1+j+l+r+s) (he : S.embeddingDimension = 1+a+k+z+p) (hL : S.leftCount = 4+3*a+2*k+z+2*b+w+v+x+f) (hm : S.multiplicity = S.embeddingDimension+b+w+v+x+f+R) (hc : S.conductor+rho = 4*S.multiplicity) : S.SatisfiesWilf := by have hp := gm_general_polynomial a k z b w v t u x y f d h0 h1 j l r s wlow p rho h2 h3 h3L h4 hBC hCC hBD hCD hgood hshadow hstrip hlow hcomp unfold NumericalSemigroup.SatisfiesWilf have ht : 4*(b+w+v+x+f+R) ≤ (1+a+k+z+p)*(3*a+2*k+z+2*b+w+v+x+f)+rho := by omega nlinarith only [he,hL,hm,hc,ht] noncomputable def gm_A (S : NumericalSemigroup) : Finset ℕ := (w23_low_A S).erase S.multiplicity lemma w23_gm_mem_A (S : NumericalSemigroup) (a : ℕ) : a ∈ gm_A S ↔ S.IsPrimitive a ∧ a < S.conductor ∧ a ≠ S.multiplicity := by classical simp only [gm_A,Finset.mem_erase,w23_low_mem_A] tauto lemma w23_gm_A_bounds (S : NumericalSemigroup) {a : ℕ} (ha : a ∈ gm_A S) : S.multiplicity < a := by obtain ⟨hp,hlt,hne⟩ := (w23_gm_mem_A S a).1 ha have hm := S.multiplicity_le hp.2.1 hp.1 omega lemma w23_gm_remove_m (S : NumericalSemigroup) (d x : ℕ) (hx : x ∈ d • w23_low_A S) (hxa : x ∈ w23_apery S) : x ∈ d • gm_A S := by classical induction d generalizing x with | zero => simpa using hx | succ d ih => rw [succ_nsmul] at hx ⊢ obtain ⟨y,hy,a,ha,rfl⟩ := Finset.mem_add.1 hx have hyS := w23_low_sumset_carrier S d y hy obtain ⟨hp,hlt⟩ := (w23_low_mem_A S a).1 ha have hya := w23_apery_closed S hxa hyS hp.1 rfl have haa := w23_apery_closed S hxa hp.1 hyS (by omega) have hne : a ≠ S.multiplicity := by intro he rw [he] at haa exact w23_multiplicity_not_mem_apery S haa exact Finset.add_mem_add (ih y hy hya) ((w23_gm_mem_A S a).2 ⟨hp,hlt,hne⟩) lemma w23_gm_left_repr (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ w23_apery S) (hlt : x < S.conductor) : ∃ d : ℕ, x ∈ d • gm_A S := by have hxL := (S.mem_leftElements x).2 ⟨hlt,((w23_mem_apery S x).1 hx).2.1⟩ obtain ⟨d,hd⟩ := w23_low_left_repr S x hxL exact ⟨d,w23_gm_remove_m S d x hd hx⟩ lemma w23_gm_right_repr (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ n4_right S) : ∃ d : ℕ, x ∈ d • gm_A S := by classical obtain ⟨hx4,hn⟩ := Finset.mem_filter.1 hx have hxa := ((w23_mem_X S 4 x).1 hx4).1 have hxS := ((w23_mem_apery S x).1 hxa).2.1 obtain ⟨a,b,ha,hb,hap,hbp,he⟩ := w23_decomposable_eq_add S hxS hn (w23_X_pos S (by omega) hx4) (w23_apery_lt S hxa) obtain ⟨d,hd⟩ := w23_low_left_repr S a ha obtain ⟨e,he'⟩ := w23_low_left_repr S b hb have hmem : x ∈ (d+e) • w23_low_A S := by rw [add_nsmul] exact Finset.mem_add.2 ⟨a,hd,b,he',he.symm⟩ exact ⟨d+e,w23_gm_remove_m S (d+e) x hmem hxa⟩ lemma w23_gm_degree_le (S : NumericalSemigroup) (d x : ℕ) (hx : x ∈ d • gm_A S) : d ≤ w23_level S x := by have hlo := lh_nsmul_lower (gm_A S) S.multiplicity (fun a ha => Nat.le_of_lt (w23_gm_A_bounds S ha)) d x hx have hhi := ((w23_level_eq_iff S x (w23_level S x)).1 rfl).2 have hm := S.multiplicity_pos by_contra hn have hmul := Nat.mul_le_mul_right S.multiplicity (show w23_level S x+1 ≤ d by omega) omega noncomputable def gm_degree (A : Finset ℕ) (x : ℕ) : ℕ := by classical exact if h : ∃ d : ℕ, x ∈ d • A then Nat.find h else 0 lemma gm_degree_spec (A : Finset ℕ) (x : ℕ) (h : ∃ d : ℕ, x ∈ d • A) : x ∈ gm_degree A x • A ∧ ∀ d : ℕ, x ∈ d • A → gm_degree A x ≤ d := by classical simp only [gm_degree,dite_eq_left h] exact ⟨Nat.find_spec h,fun d hd => Nat.find_min' h hd⟩ noncomputable def gm_rep (A : Finset ℕ) (x : ℕ) : Fin A.card → ℕ := ns_rep 6 (m3_enum A) (gm_degree A x) x lemma gm_rep_spec (A : Finset ℕ) (x : ℕ) (h : ∃ d : ℕ, x ∈ d • A) : m3_degree (gm_rep A x) = gm_degree A x ∧ m3_value (m3_enum A) (gm_rep A x) = x := by have hv := (gm_degree_spec A x h).1 rw [← ns_sumset_eq_nsmul] at hv have hs := ns_rep_spec 6 (m3_enum A) (gm_degree A x) x (m3_rep_exists A _ x hv) exact ⟨hs.1,hs.2.1⟩ lemma gm_rep_parent (A : Finset ℕ) (x : ℕ) (h : ∃ d : ℕ, x ∈ d • A) (hd4 : gm_degree A x ≤ 4) (i : Fin A.card) (hi : 0 < gm_rep A x i) : m3_parent (gm_rep A x) i = gm_rep A (m3_value (m3_enum A) (m3_parent (gm_rep A x) i)) := by classical let alpha := gm_rep A x let y := m3_value (m3_enum A) (m3_parent alpha i) let d := gm_degree A x - 1 have hs := gm_rep_spec A x h have hpdeg := m3_degree_parent alpha i hi have hd : m3_degree (m3_parent alpha i) = d := by dsimp [alpha,d] at *; omega have hy : y ∈ d • A := by rw [← ns_sumset_eq_nsmul] exact m3_value_mem_sumset A d _ hd have hdy := gm_degree_spec A y ⟨d,hy⟩ have hys := gm_rep_spec A y ⟨d,hy⟩ have hxx : x ∈ (gm_degree A y+1) • A := by rw [← ns_sumset_eq_nsmul] have hyval := m3_value_unitAdd (m3_enum A) (gm_rep A y) i have hxval := m3_value_parent (m3_enum A) alpha i hi rw [hys.2] at hyval rw [show m3_value (m3_enum A) alpha = x from hs.2] at hxval dsimp [y] at hyval have hv : m3_value (m3_enum A) (m3_unitAdd (gm_rep A y) i) = x := by rw [hyval,hxval] rw [← hv] exact m3_value_mem_sumset A _ (m3_unitAdd (gm_rep A y) i) (by rw [m3_degree_unitAdd,hys.1]) have hxdeg := (gm_degree_spec A x h).2 _ hxx have hyd := hdy.2 d hy have hdeq : gm_degree A y = d := by dsimp [d] at * omega have hdx : gm_degree A x = d+1 := by dsimp [alpha,d] at *; omega have hre : ∃ beta, m3_degree beta = d+1 ∧ m3_value (m3_enum A) beta = x := by refine ⟨gm_rep A x,?_,hs.2⟩ omega have hp := ns_rep_parent 6 (m3_enum A) d x (by dsimp [d]; omega) hre i (by simpa only [← hdx,gm_rep] using hi) change m3_parent (ns_rep 6 (m3_enum A) (gm_degree A x) x) i = ns_rep 6 (m3_enum A) (gm_degree A y) y rw [hdx,hdeq] simpa only [y,alpha,gm_rep,hdx] using hp noncomputable def gm_values (S : NumericalSemigroup) : Finset ℕ := by classical exact (w23_apery S).filter (fun x => w23_level S x < 4 ∨ ¬ S.IsPrimitive x) lemma w23_gm_values_repr (S : NumericalSemigroup) (hq : w23_q S = 4) {x : ℕ} (hx : x ∈ gm_values S) : ∃ d : ℕ, x ∈ d • gm_A S := by classical obtain ⟨hxa,hxcase⟩ := Finset.mem_filter.1 hx rcases hxcase with hleft | hn · exact w23_gm_left_repr S hxa ((w23_lt_conductor_iff S x).2 (by omega)) · by_cases hleft : w23_level S x < 4 · exact w23_gm_left_repr S hxa ((w23_lt_conductor_iff S x).2 (by omega)) · have hlev := w23_level_apery_le S hxa rw [hq] at hlev exact w23_gm_right_repr S (Finset.mem_filter.2 ⟨(w23_mem_X S 4 x).2 ⟨hxa,by omega⟩,hn⟩) lemma w23_gm_values_degree_le (S : NumericalSemigroup) (hq : w23_q S = 4) {x : ℕ} (hx : x ∈ gm_values S) : gm_degree (gm_A S) x ≤ 4 := by classical have hr := w23_gm_values_repr S hq hx have hv := (gm_degree_spec (gm_A S) x hr).1 have hlev := w23_gm_degree_le S _ x hv have h4 := w23_level_apery_le S (Finset.mem_filter.1 hx).1 rw [hq] at h4 omega lemma w23_gm_values_parent (S : NumericalSemigroup) (hq : w23_q S = 4) {x : ℕ} (hx : x ∈ gm_values S) (i : Fin (gm_A S).card) (hi : 0 < gm_rep (gm_A S) x i) : m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) ∈ gm_values S ∧ m3_parent (gm_rep (gm_A S) x) i = gm_rep (gm_A S) (m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i)) := by classical let alpha := gm_rep (gm_A S) x let y := m3_value (m3_enum (gm_A S)) (m3_parent alpha i) let a := m3_enum (gm_A S) i have hr := w23_gm_values_repr S hq hx have hs := gm_rep_spec (gm_A S) x hr have he := m3_value_parent (m3_enum (gm_A S)) alpha i hi have hySum : y ∈ m3_degree (m3_parent alpha i) • gm_A S := by rw [← ns_sumset_eq_nsmul] exact m3_value_mem_sumset _ _ _ rfl have hyS := ns_nsmul_mem_carrier S (gm_A S) (fun b hb => ((w23_gm_mem_A S b).1 hb).1.1) _ y hySum have ha := (w23_gm_mem_A S a).1 (m3_enum_mem (gm_A S) i) have hya := w23_apery_closed S (Finset.mem_filter.1 hx).1 hyS ha.1.1 (by change x = y+a change y+a = m3_value (m3_enum (gm_A S)) alpha at he rw [hs.2] at he omega) have hapos := w23_gm_A_bounds S (m3_enum_mem (gm_A S) i) change S.multiplicity < a at hapos have hlt := w23_apery_lt S (Finset.mem_filter.1 hx).1 have hylt : y < S.conductor := by change y+a = m3_value (m3_enum (gm_A S)) alpha at he rw [hs.2] at he omega refine ⟨Finset.mem_filter.2 ⟨hya,Or.inl ?_⟩,?_⟩ · change w23_level S y < 4 have hyL := (w23_lt_conductor_iff S y).1 hylt omega · exact gm_rep_parent (gm_A S) x hr (w23_gm_values_degree_le S hq hx) i hi lemma gm_rep_image_card (A V : Finset ℕ) (hV : ∀ x ∈ V, ∃ d : ℕ, x ∈ d • A) : (V.image (gm_rep A)).card = V.card := by classical apply Finset.card_image_of_injOn intro x hx y hy he have hxs := (gm_rep_spec A x (hV x hx)).2 have hys := (gm_rep_spec A y (hV y hy)).2 rw [he] at hxs omega noncomputable def gm_indices (S : NumericalSemigroup) (j : ℕ) : Finset (Fin (gm_A S).card) := by classical exact Finset.univ.filter (fun i => w23_level S (m3_enum (gm_A S) i) = j) noncomputable def gm_group (S : NumericalSemigroup) (j : ℕ) (alpha : Fin (gm_A S).card → ℕ) : ℕ := ∑ i ∈ gm_indices S j, alpha i lemma w23_gm_enum_levels (S : NumericalSemigroup) (hq : w23_q S = 4) (i : Fin (gm_A S).card) : w23_level S (m3_enum (gm_A S) i) = 1 ∨ w23_level S (m3_enum (gm_A S) i) = 2 ∨ w23_level S (m3_enum (gm_A S) i) = 3 := by obtain ⟨hp,hlt,hne⟩ := (w23_gm_mem_A S _).1 (m3_enum_mem (gm_A S) i) have hpos := w23_primitive_level_pos S hp have hlev := (w23_lt_conductor_iff S _).1 hlt omega lemma w23_gm_group_degree (S : NumericalSemigroup) (hq : w23_q S = 4) (alpha : Fin (gm_A S).card → ℕ) : m3_degree alpha = gm_group S 1 alpha+gm_group S 2 alpha+gm_group S 3 alpha := by classical unfold m3_degree gm_group gm_indices simp only [Finset.sum_filter] rw [← Finset.sum_add_distrib,← Finset.sum_add_distrib] apply Finset.sum_congr rfl intro i hi rcases w23_gm_enum_levels S hq i with h1 | h2 | h3 <;> simp_all lemma w23_gm_group_lower (S : NumericalSemigroup) (hq : w23_q S = 4) (alpha : Fin (gm_A S).card → ℕ) : (S.multiplicity+1)*gm_group S 1 alpha+2*S.multiplicity*gm_group S 2 alpha+ 3*S.multiplicity*gm_group S 3 alpha ≤ m3_value (m3_enum (gm_A S)) alpha+w23_rho S*(gm_group S 2 alpha+gm_group S 3 alpha) := by classical have hcoord (i : Fin (gm_A S).card) : (if w23_level S (m3_enum (gm_A S) i) = 1 then (S.multiplicity+1)*alpha i else 0)+ (if w23_level S (m3_enum (gm_A S) i) = 2 then 2*S.multiplicity*alpha i else 0)+ (if w23_level S (m3_enum (gm_A S) i) = 3 then 3*S.multiplicity*alpha i else 0) ≤ alpha i*m3_enum (gm_A S) i+w23_rho S* ((if w23_level S (m3_enum (gm_A S) i) = 2 then alpha i else 0)+ (if w23_level S (m3_enum (gm_A S) i) = 3 then alpha i else 0)) := by have hbounds := w23_gm_A_bounds S (m3_enum_mem (gm_A S) i) rcases w23_gm_enum_levels S hq i with h1 | h2 | h3 · simp only [h1] norm_num simpa only [Nat.mul_comm] using Nat.mul_le_mul_right (alpha i) hbounds · have hb := ((w23_level_eq_iff S _ 2).1 h2).1 have hh := Nat.mul_le_mul_right (alpha i) hb simp only [h2] norm_num nlinarith only [hh] · have hb := ((w23_level_eq_iff S _ 3).1 h3).1 have hh := Nat.mul_le_mul_right (alpha i) hb simp only [h3] norm_num nlinarith only [hh] have hh := Finset.sum_le_sum (fun i (_ : i ∈ Finset.univ) => hcoord i) simpa only [gm_group,gm_indices,Finset.sum_filter,m3_value,Finset.sum_add_distrib, Finset.mul_sum,Nat.mul_add,mul_ite,Nat.mul_zero] using hh noncomputable def gm_type (S : NumericalSemigroup) (level b c d : ℕ) : Finset ℕ := by classical exact (w23_X S level).filter (fun x => ¬ S.IsPrimitive x ∧ gm_group S 1 (gm_rep (gm_A S) x) = b ∧ gm_group S 2 (gm_rep (gm_A S) x) = c ∧ gm_group S 3 (gm_rep (gm_A S) x) = d) lemma w23_gm_nonprimitive_degree (S : NumericalSemigroup) (hq : w23_q S = 4) {x : ℕ} (hx : x ∈ gm_values S) (hx0 : 0 < x) (hn : ¬ S.IsPrimitive x) : 2 ≤ gm_degree (gm_A S) x := by classical have hr := w23_gm_values_repr S hq hx have hv := (gm_degree_spec (gm_A S) x hr).1 by_contra hh interval_cases gm_degree (gm_A S) x · have : x = 0 := by simpa using hv omega · have : x ∈ gm_A S := by simpa using hv exact hn ((w23_gm_mem_A S x).1 this).1 lemma w23_gm_nonprimitive_type_bounds (S : NumericalSemigroup) (hq : w23_q S = 4) {j x : ℕ} (hj : 0 < j) (hx : x ∈ w23_X S j) (hn : ¬ S.IsPrimitive x) : 2 ≤ gm_group S 1 (gm_rep (gm_A S) x)+gm_group S 2 (gm_rep (gm_A S) x)+ gm_group S 3 (gm_rep (gm_A S) x) ∧ gm_group S 1 (gm_rep (gm_A S) x)+gm_group S 2 (gm_rep (gm_A S) x)+ gm_group S 3 (gm_rep (gm_A S) x) ≤ j ∧ (S.multiplicity+1)*gm_group S 1 (gm_rep (gm_A S) x)+ 2*S.multiplicity*gm_group S 2 (gm_rep (gm_A S) x)+ 3*S.multiplicity*gm_group S 3 (gm_rep (gm_A S) x) ≤ x+w23_rho S*(gm_group S 2 (gm_rep (gm_A S) x)+gm_group S 3 (gm_rep (gm_A S) x)) := by classical have hV : x ∈ gm_values S := Finset.mem_filter.2 ⟨((w23_mem_X S j x).1 hx).1,Or.inr hn⟩ have hr := w23_gm_values_repr S hq hV have hs := gm_rep_spec (gm_A S) x hr have hd2 := w23_gm_nonprimitive_degree S hq hV (w23_X_pos S hj hx) hn have hdj := w23_gm_degree_le S _ x (gm_degree_spec (gm_A S) x hr).1 rw [((w23_mem_X S j x).1 hx).2] at hdj have hg := w23_gm_group_degree S hq (gm_rep (gm_A S) x) have hlo := w23_gm_group_lower S hq (gm_rep (gm_A S) x) rw [hs.2] at hlo exact ⟨by omega,by omega,hlo⟩ lemma w23_gm_group_zero (S : NumericalSemigroup) (j : ℕ) (alpha : Fin (gm_A S).card → ℕ) (hj : gm_group S j alpha = 0) {i : Fin (gm_A S).card} (hi : w23_level S (m3_enum (gm_A S) i) = j) : alpha i = 0 := by classical have hm : i ∈ gm_indices S j := by simp [gm_indices,hi] have hh := Finset.single_le_sum (fun b (_ : b ∈ gm_indices S j) => Nat.zero_le (alpha b)) hm change alpha i ≤ gm_group S j alpha at hh omega lemma w23_gm_pure_upper (S : NumericalSemigroup) (hq : w23_q S = 4) (alpha : Fin (gm_A S).card → ℕ) (hC : gm_group S 2 alpha = 0) (hD : gm_group S 3 alpha = 0) : m3_value (m3_enum (gm_A S)) alpha+(w23_rho S+1)*m3_degree alpha ≤ 2*S.multiplicity*m3_degree alpha := by classical have hcoord (i : Fin (gm_A S).card) : alpha i*m3_enum (gm_A S) i+(w23_rho S+1)*alpha i ≤ 2*S.multiplicity*alpha i := by rcases w23_gm_enum_levels S hq i with h1 | h2 | h3 · have hb := ((w23_level_eq_iff S _ 1).1 h1).2 have hh := Nat.mul_le_mul_right (alpha i) (show m3_enum (gm_A S) i+w23_rho S+1 ≤ 2*S.multiplicity by omega) nlinarith only [hh] · rw [w23_gm_group_zero S 2 alpha hC h2] simp · rw [w23_gm_group_zero S 3 alpha hD h3] simp have hh := Finset.sum_le_sum (fun i (_ : i ∈ Finset.univ) => hcoord i) simpa only [m3_value,m3_degree,Finset.sum_add_distrib,Finset.mul_sum] using hh lemma gm_type_table_arithmetic (m rho x level b c d : ℕ) (hm : 0 < m) (hr : rho < m) (hj : 2 ≤ level) (hj4 : level ≤ 4) (hd2 : 2 ≤ b+c+d) (hdj : b+c+d ≤ level) (hlo : (m+1)*b+2*m*c+3*m*d ≤ x+rho*(c+d)) (hlevel : level*m ≤ x+rho) (hhi : x+rho < (level+1)*m) (hpure : c = 0 → d = 0 → x+(rho+1)*(b+c+d) ≤ 2*m*(b+c+d)) : (level = 2 ∧ b = 2 ∧ c = 0 ∧ d = 0) ∨ (level = 3 ∧ ((b = 2 ∧ c = 0 ∧ d = 0) ∨ (b = 3 ∧ c = 0 ∧ d = 0) ∨ (b = 1 ∧ c = 1 ∧ d = 0) ∨ (b = 0 ∧ c = 2 ∧ d = 0))) ∨ (level = 4 ∧ ((b = 3 ∧ c = 0 ∧ d = 0) ∨ (b = 4 ∧ c = 0 ∧ d = 0) ∨ (b = 1 ∧ c = 1 ∧ d = 0) ∨ (b = 0 ∧ c = 2 ∧ d = 0) ∨ (b = 2 ∧ c = 1 ∧ d = 0) ∨ (b = 1 ∧ c = 2 ∧ d = 0) ∨ (b = 0 ∧ c = 3 ∧ d = 0) ∨ (b = 1 ∧ c = 0 ∧ d = 1) ∨ (b = 0 ∧ c = 1 ∧ d = 1))) := by have hb : b ≤ 4 := by omega have hc : c ≤ 4 := by omega have hd : d ≤ 4 := by omega interval_cases level <;> interval_cases b <;> interval_cases c <;> interval_cases d <;> norm_num at * <;> omega lemma w23_gm_type_table (S : NumericalSemigroup) (hq : w23_q S = 4) {j x : ℕ} (hj : 2 ≤ j) (hx : x ∈ w23_X S j) (hn : ¬ S.IsPrimitive x) : (j = 2 ∧ x ∈ gm_type S 2 2 0 0) ∨ (j = 3 ∧ x ∈ gm_type S 3 2 0 0 ∪ gm_type S 3 3 0 0 ∪ gm_type S 3 1 1 0 ∪ gm_type S 3 0 2 0) ∨ (j = 4 ∧ x ∈ gm_type S 4 3 0 0 ∪ gm_type S 4 4 0 0 ∪ gm_type S 4 1 1 0 ∪ gm_type S 4 0 2 0 ∪ gm_type S 4 2 1 0 ∪ gm_type S 4 1 2 0 ∪ gm_type S 4 0 3 0 ∪ gm_type S 4 1 0 1 ∪ gm_type S 4 0 1 1) := by classical have hV : x ∈ gm_values S := Finset.mem_filter.2 ⟨((w23_mem_X S j x).1 hx).1,Or.inr hn⟩ have hr := w23_gm_values_repr S hq hV have hs := gm_rep_spec (gm_A S) x hr have hgd := w23_gm_group_degree S hq (gm_rep (gm_A S) x) have ht := w23_gm_nonprimitive_type_bounds S hq (by omega : 0 < j) hx hn have hhi := ((w23_level_eq_iff S x j).1 ((w23_mem_X S j x).1 hx).2).2 have hj4 := w23_level_apery_le S ((w23_mem_X S j x).1 hx).1 rw [((w23_mem_X S j x).1 hx).2,hq] at hj4 have hu := w23_gm_pure_upper S hq (gm_rep (gm_A S) x) rw [hs.2,hgd] at hu have htab := gm_type_table_arithmetic S.multiplicity (w23_rho S) x j (gm_group S 1 (gm_rep (gm_A S) x)) (gm_group S 2 (gm_rep (gm_A S) x)) (gm_group S 3 (gm_rep (gm_A S) x)) S.multiplicity_pos (w23_rho_lt S) hj hj4 ht.1 ht.2.1 ht.2.2 (((w23_level_eq_iff S x j).1 ((w23_mem_X S j x).1 hx).2).1) hhi hu rcases htab with ⟨rfl,hcase⟩ | ⟨rfl,hcase⟩ | ⟨rfl,hcase⟩ · left refine ⟨rfl,?_⟩ exact Finset.mem_filter.2 ⟨hx,hn,hcase⟩ · right; left refine ⟨rfl,?_⟩ rcases hcase with hc0 | hc1 | hc2 | hc3 · have hm : x ∈ gm_type S 3 2 0 0 := Finset.mem_filter.2 ⟨hx,hn,hc0⟩ simp only [Finset.mem_union] exact Or.inl (Or.inl (Or.inl (hm))) · have hm : x ∈ gm_type S 3 3 0 0 := Finset.mem_filter.2 ⟨hx,hn,hc1⟩ simp only [Finset.mem_union] exact Or.inl (Or.inl (Or.inr (hm))) · have hm : x ∈ gm_type S 3 1 1 0 := Finset.mem_filter.2 ⟨hx,hn,hc2⟩ simp only [Finset.mem_union] exact Or.inl (Or.inr (hm)) · have hm : x ∈ gm_type S 3 0 2 0 := Finset.mem_filter.2 ⟨hx,hn,hc3⟩ simp only [Finset.mem_union] exact Or.inr (hm) · right; right refine ⟨rfl,?_⟩ rcases hcase with hc0 | hc1 | hc2 | hc3 | hc4 | hc5 | hc6 | hc7 | hc8 · have hm : x ∈ gm_type S 4 3 0 0 := Finset.mem_filter.2 ⟨hx,hn,hc0⟩ simp only [Finset.mem_union] exact Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (hm)))))))) · have hm : x ∈ gm_type S 4 4 0 0 := Finset.mem_filter.2 ⟨hx,hn,hc1⟩ simp only [Finset.mem_union] exact Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inr (hm)))))))) · have hm : x ∈ gm_type S 4 1 1 0 := Finset.mem_filter.2 ⟨hx,hn,hc2⟩ simp only [Finset.mem_union] exact Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inr (hm))))))) · have hm : x ∈ gm_type S 4 0 2 0 := Finset.mem_filter.2 ⟨hx,hn,hc3⟩ simp only [Finset.mem_union] exact Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inr (hm)))))) · have hm : x ∈ gm_type S 4 2 1 0 := Finset.mem_filter.2 ⟨hx,hn,hc4⟩ simp only [Finset.mem_union] exact Or.inl (Or.inl (Or.inl (Or.inl (Or.inr (hm))))) · have hm : x ∈ gm_type S 4 1 2 0 := Finset.mem_filter.2 ⟨hx,hn,hc5⟩ simp only [Finset.mem_union] exact Or.inl (Or.inl (Or.inl (Or.inr (hm)))) · have hm : x ∈ gm_type S 4 0 3 0 := Finset.mem_filter.2 ⟨hx,hn,hc6⟩ simp only [Finset.mem_union] exact Or.inl (Or.inl (Or.inr (hm))) · have hm : x ∈ gm_type S 4 1 0 1 := Finset.mem_filter.2 ⟨hx,hn,hc7⟩ simp only [Finset.mem_union] exact Or.inl (Or.inr (hm)) · have hm : x ∈ gm_type S 4 0 1 1 := Finset.mem_filter.2 ⟨hx,hn,hc8⟩ simp only [Finset.mem_union] exact Or.inr (hm) theorem gm_weighted_shadow {k r : ℕ} (J : Finset (Fin k)) (B C : Finset (Fin k → ℕ)) (hB : ∀ a ∈ B, (∑ i ∈ J, a i) = r) (hC : ∀ b ∈ C, (∑ i ∈ J, b i) = r + 1) (hdiv : ∀ b ∈ C, ∀ i : Fin k, i ∈ J → 0 < b i → Function.update b i (b i - 1) ∈ B) : (r + 1) * C.card ≤ (J.card + r) * B.card := by classical have hcoord : ∀ i : Fin k, i ∈ J → (∑ b ∈ C, b i) ≤ ∑ a ∈ B, (a i + 1) := by intro i hiJ let T := C.filter (fun b => 0 < b i) have hfilter : (∑ b ∈ C, b i) = ∑ b ∈ T, b i := by symm apply Finset.sum_subset (Finset.filter_subset _ _) intro b hb hbt have : ¬ 0 < b i := by intro hi exact hbt (Finset.mem_filter.mpr ⟨hb, hi⟩) omega rw [hfilter] apply Finset.sum_le_sum_of_injOn (fun b => Function.update b i (b i - 1)) · intro x hx y hy hxy exact n4_parent_injective i (Finset.mem_filter.mp hx).2 (Finset.mem_filter.mp hy).2 hxy · intro a ha obtain ⟨b, hb, rfl⟩ := Finset.mem_image.mp ha have hb' := Finset.mem_filter.mp hb exact hdiv b hb'.1 i hiJ hb'.2 · intro b hb have hb' := (Finset.mem_filter.mp hb).2 simp omega · intro a ha hnot exact Nat.zero_le _ have hsum : (∑ b ∈ C, ∑ i ∈ J, b i) ≤ ∑ a ∈ B, ∑ i ∈ J, (a i + 1) := by calc (∑ b ∈ C, ∑ i ∈ J, b i) = ∑ i ∈ J, ∑ b ∈ C, b i := Finset.sum_comm _ ≤ ∑ i ∈ J, ∑ a ∈ B, (a i + 1) := Finset.sum_le_sum (fun i hi => hcoord i hi) _ = ∑ a ∈ B, ∑ i ∈ J, (a i + 1) := Finset.sum_comm have hleft : (∑ b ∈ C, ∑ i ∈ J, b i) = (r + 1) * C.card := by rw [Finset.sum_congr rfl (fun b hb => hC b hb)] simp [Nat.mul_comm] have hright : (∑ a ∈ B, ∑ i ∈ J, (a i + 1)) = (J.card + r) * B.card := by have he : ∀ a ∈ B, (∑ i ∈ J, (a i + 1)) = J.card + r := by intro a ha rw [Finset.sum_add_distrib, hB a ha] simp [Nat.add_comm] rw [Finset.sum_congr rfl he] simp [Nat.mul_comm] rwa [hleft, hright] at hsum theorem gm_mixed_parent_shadow {N : ℕ} (I J : Finset (Fin N)) (hIJ : I ⊆ J) (U0 U1 H : Finset (Fin N → ℕ)) (hd : Disjoint U0 U1) (hU0 : ∀ u ∈ U0, (∑ i ∈ I, u i) = 0) (hU1 : ∀ u ∈ U1, (∑ i ∈ J, u i) = 2) (hH : ∀ q ∈ H, (∑ i ∈ J, q i) = 3 ∧ 0 < ∑ i ∈ I, q i) (hdiv : ∀ q ∈ H, ∀ i, i ∈ J → 0 < q i → Function.update q i (q i - 1) ∈ U0 ∪ U1) : 3*H.card ≤ I.card*U0.card + (J.card+2)*U1.card := by classical have hcoord : ∀ i : Fin N, i ∈ J → (∑ q ∈ H, q i) ≤ (∑ u ∈ U1, (u i+1)) + if i ∈ I then ∑ u ∈ U0, (u i+1) else 0 := by intro i hiJ let T := H.filter (fun q => 0 < q i) let Ui := if i ∈ I then U0 ∪ U1 else U1 have hfilter : (∑ q ∈ H, q i) = ∑ q ∈ T, q i := by symm apply Finset.sum_subset (Finset.filter_subset _ _) intro q hq hqt have : ¬ 0 < q i := by intro hqi exact hqt (Finset.mem_filter.mpr ⟨hq,hqi⟩) omega have hparent : ∀ q ∈ T, Function.update q i (q i-1) ∈ Ui := by intro q hq obtain ⟨hqH,hqi⟩ := Finset.mem_filter.mp hq have hm := hdiv q hqH i hiJ hqi by_cases hi : i ∈ I · simpa [Ui,hi] using hm · have hp1 : Function.update q i (q i-1) ∈ U1 := by rcases Finset.mem_union.mp hm with hp0 | hp1 · have hz := hU0 _ hp0 have he : (∑ j ∈ I, Function.update q i (q i-1) j) = ∑ j ∈ I, q j := by apply Finset.sum_congr rfl intro j hj have hji : j ≠ i := by intro hji subst j exact hi hj simp [Function.update,hji] rw [he] at hz have hpos := (hH q hqH).2 omega · exact hp1 simpa [Ui,hi] using hp1 have hc : (∑ q ∈ H, q i) ≤ ∑ u ∈ Ui, (u i+1) := by rw [hfilter] apply Finset.sum_le_sum_of_injOn (fun q => Function.update q i (q i-1)) · intro x hx y hy hxy exact n4_parent_injective i (Finset.mem_filter.mp hx).2 (Finset.mem_filter.mp hy).2 hxy · intro u hu obtain ⟨q,hq,rfl⟩ := Finset.mem_image.mp hu exact hparent q hq · intro q hq have hp := (Finset.mem_filter.mp hq).2 simp omega · intro u hu hnot exact Nat.zero_le _ by_cases hi : i ∈ I · simpa [Ui,hi,Finset.sum_union hd,Nat.add_comm] using hc · simpa [Ui,hi] using hc have hsum : (∑ q ∈ H, ∑ i ∈ J, q i) ≤ ∑ i ∈ J, ((∑ u ∈ U1, (u i+1)) + if i ∈ I then ∑ u ∈ U0, (u i+1) else 0) := by rw [Finset.sum_comm] exact Finset.sum_le_sum (fun i hi => hcoord i hi) have hleft : (∑ q ∈ H, ∑ i ∈ J, q i) = 3*H.card := by rw [Finset.sum_congr rfl (fun q hq => (hH q hq).1)] simp [Nat.mul_comm] have hright1 : (∑ i ∈ J, ∑ u ∈ U1, (u i+1)) = (J.card+2)*U1.card := by rw [Finset.sum_comm] have he : ∀ u ∈ U1, (∑ i ∈ J, (u i+1)) = J.card+2 := by intro u hu rw [Finset.sum_add_distrib,hU1 u hu] simp [Nat.add_comm] rw [Finset.sum_congr rfl he] simp [Nat.mul_comm] have hright0 : (∑ i ∈ J, if i ∈ I then ∑ u ∈ U0, (u i+1) else 0) = I.card*U0.card := by have he : (∑ i ∈ J, if i ∈ I then ∑ u ∈ U0, (u i+1) else 0) = ∑ i ∈ I, ∑ u ∈ U0, (u i+1) := by calc _ = ∑ i ∈ I, (if i ∈ I then ∑ u ∈ U0, (u i+1) else 0) := by symm apply Finset.sum_subset hIJ intro i hi hnot simp [hnot] _ = _ := Finset.sum_congr rfl (fun i hi => by simp [hi]) rw [he,Finset.sum_comm] have hc : ∀ u ∈ U0, (∑ i ∈ I, (u i+1)) = I.card := by intro u hu rw [Finset.sum_add_distrib,hU0 u hu] simp rw [Finset.sum_congr rfl hc] simp [Nat.mul_comm] rw [hleft,Finset.sum_add_distrib,hright1,hright0] at hsum omega lemma gm_group_unitAdd {N : ℕ} (J : Finset (Fin N)) (alpha : Fin N → ℕ) (i : Fin N) : (∑ k ∈ J, m3_unitAdd alpha i k) = (∑ k ∈ J, alpha k)+if i ∈ J then 1 else 0 := by classical simp [m3_unitAdd,Finset.sum_add_distrib] lemma gm_group_parent {N : ℕ} (J : Finset (Fin N)) (alpha : Fin N → ℕ) (i : Fin N) (hi : 0 < alpha i) : (∑ k ∈ J, m3_parent alpha i k)+(if i ∈ J then 1 else 0) = ∑ k ∈ J, alpha k := by rw [← gm_group_unitAdd,m3_unitAdd_parent alpha i hi] lemma w23_gm_restricted_shadow (S : NumericalSemigroup) (hq : w23_q S = 4) (J : Finset (Fin (gm_A S).card)) (B C : Finset ℕ) (r : ℕ) (hB : B ⊆ gm_values S) (hC : C ⊆ gm_values S) (hBd : ∀ x ∈ B, (∑ i ∈ J, gm_rep (gm_A S) x i) = r) (hCd : ∀ x ∈ C, (∑ i ∈ J, gm_rep (gm_A S) x i) = r+1) (hdiv : ∀ x ∈ C, ∀ i ∈ J, 0 < gm_rep (gm_A S) x i → m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) ∈ B) : (r+1)*C.card ≤ (J.card+r)*B.card := by classical let E := B.image (gm_rep (gm_A S)) let F := C.image (gm_rep (gm_A S)) have hE : ∀ alpha ∈ E, (∑ i ∈ J, alpha i) = r := by intro alpha ha obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha exact hBd x hx have hF : ∀ alpha ∈ F, (∑ i ∈ J, alpha i) = r+1 := by intro alpha ha obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha exact hCd x hx have hparent : ∀ alpha ∈ F, ∀ i ∈ J, 0 < alpha i → m3_parent alpha i ∈ E := by intro alpha ha i hi hpos obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha have he := (w23_gm_values_parent S hq (hC hx) i hpos).2 exact Finset.mem_image.2 ⟨_,hdiv x hx i hi hpos,he.symm⟩ have hh := gm_weighted_shadow J E F hE hF hparent have he := gm_rep_image_card (gm_A S) B (fun x hx => w23_gm_values_repr S hq (hB hx)) have hf := gm_rep_image_card (gm_A S) C (fun x hx => w23_gm_values_repr S hq (hC hx)) simpa only [E,F,he,hf] using hh lemma w23_gm_restricted_mixed_shadow (S : NumericalSemigroup) (hq : w23_q S = 4) (I J : Finset (Fin (gm_A S).card)) (hIJ : I ⊆ J) (U0 U1 H : Finset ℕ) (hU0 : U0 ⊆ gm_values S) (hU1 : U1 ⊆ gm_values S) (hH : H ⊆ gm_values S) (hd : Disjoint U0 U1) (hd0 : ∀ x ∈ U0, (∑ i ∈ I, gm_rep (gm_A S) x i) = 0) (hd1 : ∀ x ∈ U1, (∑ i ∈ J, gm_rep (gm_A S) x i) = 2) (hdH : ∀ x ∈ H, (∑ i ∈ J, gm_rep (gm_A S) x i) = 3 ∧ 0 < ∑ i ∈ I, gm_rep (gm_A S) x i) (hdiv : ∀ x ∈ H, ∀ i ∈ J, 0 < gm_rep (gm_A S) x i → m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) ∈ U0 ∪ U1) : 3*H.card ≤ I.card*U0.card+(J.card+2)*U1.card := by classical let E0 := U0.image (gm_rep (gm_A S)) let E1 := U1.image (gm_rep (gm_A S)) let F := H.image (gm_rep (gm_A S)) have h0 : ∀ alpha ∈ E0, (∑ i ∈ I, alpha i) = 0 := by intro alpha ha obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha exact hd0 x hx have h1 : ∀ alpha ∈ E1, (∑ i ∈ J, alpha i) = 2 := by intro alpha ha obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha exact hd1 x hx have hF : ∀ alpha ∈ F, (∑ i ∈ J, alpha i) = 3 ∧ 0 < ∑ i ∈ I, alpha i := by intro alpha ha obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha exact hdH x hx have hdis : Disjoint E0 E1 := by apply Finset.disjoint_left.2 intro alpha ha hb obtain ⟨x,hx,he⟩ := Finset.mem_image.1 ha obtain ⟨y,hy,he'⟩ := Finset.mem_image.1 hb have hxv := (gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq (hU0 hx))).2 have hyv := (gm_rep_spec (gm_A S) y (w23_gm_values_repr S hq (hU1 hy))).2 rw [he] at hxv rw [he'] at hyv have hxy : x = y := by omega exact Finset.disjoint_left.1 hd hx (hxy.symm ▸ hy) have hparent : ∀ alpha ∈ F, ∀ i ∈ J, 0 < alpha i → m3_parent alpha i ∈ E0 ∪ E1 := by intro alpha ha i hi hpos obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha have he := (w23_gm_values_parent S hq (hH hx) i hpos).2 rcases Finset.mem_union.1 (hdiv x hx i hi hpos) with hp0 | hp1 · exact Finset.mem_union.2 (Or.inl (Finset.mem_image.2 ⟨_,hp0,he.symm⟩)) · exact Finset.mem_union.2 (Or.inr (Finset.mem_image.2 ⟨_,hp1,he.symm⟩)) have hh := gm_mixed_parent_shadow I J hIJ E0 E1 F hdis h0 h1 hF hparent have he0 := gm_rep_image_card (gm_A S) U0 (fun x hx => w23_gm_values_repr S hq (hU0 hx)) have he1 := gm_rep_image_card (gm_A S) U1 (fun x hx => w23_gm_values_repr S hq (hU1 hx)) have hf := gm_rep_image_card (gm_A S) H (fun x hx => w23_gm_values_repr S hq (hH hx)) simpa only [E0,E1,F,he0,he1,hf] using hh lemma gm_type_disjoint (S : NumericalSemigroup) (j b c d j' b' c' d' : ℕ) (hne : j ≠ j' ∨ b ≠ b' ∨ c ≠ c' ∨ d ≠ d') : Disjoint (gm_type S j b c d) (gm_type S j' b' c' d') := by classical apply Finset.disjoint_left.2 intro x hx hy obtain ⟨hxj,hn,hb,hc,hd⟩ := Finset.mem_filter.1 hx obtain ⟨hyj,hn',hb',hc',hd'⟩ := Finset.mem_filter.1 hy have hj := ((w23_mem_X S j x).1 hxj).2 have hj' := ((w23_mem_X S j' x).1 hyj).2 omega lemma w23_gm_type_values (S : NumericalSemigroup) (j b c d : ℕ) : gm_type S j b c d ⊆ gm_values S := by classical intro x hx obtain ⟨hxj,hn,_,_,_⟩ := Finset.mem_filter.1 hx exact Finset.mem_filter.2 ⟨((w23_mem_X S j x).1 hxj).1,Or.inr hn⟩ lemma w23_gm_X2_card (S : NumericalSemigroup) (hq : w23_q S = 4) : (w23_X S 2).card = (w23_P S 2).card+(gm_type S 2 2 0 0).card := by classical have heq : (w23_X S 2).filter (fun x => ¬ S.IsPrimitive x) = gm_type S 2 2 0 0 := by ext x constructor · intro hx obtain ⟨hx2,hn⟩ := Finset.mem_filter.1 hx have ht := w23_gm_type_table S hq (by omega : 2 ≤ 2) hx2 hn rcases ht with ⟨_,hh⟩ | ⟨hfalse,_⟩ | ⟨hfalse,_⟩ · exact hh · omega · omega · intro hx obtain ⟨hx2,hn,_,_,_⟩ := Finset.mem_filter.1 hx exact Finset.mem_filter.2 ⟨hx2,hn⟩ have hh := Finset.card_filter_add_card_filter_not (s := w23_X S 2) S.IsPrimitive rw [n4_X_primitive_eq_P S 2 (by omega),heq] at hh omega lemma w23_gm_X3_card (S : NumericalSemigroup) (hq : w23_q S = 4) : (w23_X S 3).card = (w23_P S 3).card+(gm_type S 3 2 0 0).card+ (gm_type S 3 3 0 0).card+(gm_type S 3 1 1 0).card+(gm_type S 3 0 2 0).card := by classical have heq : w23_Z S = gm_type S 3 2 0 0 ∪ gm_type S 3 3 0 0 ∪ gm_type S 3 1 1 0 ∪ gm_type S 3 0 2 0 := by ext x constructor · intro hx obtain ⟨hx3,hn⟩ := Finset.mem_filter.1 hx have ht := w23_gm_type_table S hq (by omega : 2 ≤ 3) hx3 hn rcases ht with ⟨hfalse,_⟩ | ⟨_,hh⟩ | ⟨hfalse,_⟩ · omega · exact hh · omega · intro hx simp only [Finset.mem_union] at hx rcases hx with ((hx | hx) | hx) | hx <;> exact Finset.mem_filter.2 ⟨(Finset.mem_filter.1 hx).1,(Finset.mem_filter.1 hx).2.1⟩ have hdis1 : Disjoint (gm_type S 3 2 0 0) (gm_type S 3 3 0 0) := gm_type_disjoint S 3 2 0 0 3 3 0 0 (by omega) have hdis2 : Disjoint (gm_type S 3 2 0 0 ∪ gm_type S 3 3 0 0) (gm_type S 3 1 1 0) := by rw [Finset.disjoint_union_left] exact ⟨gm_type_disjoint S 3 2 0 0 3 1 1 0 (by omega), gm_type_disjoint S 3 3 0 0 3 1 1 0 (by omega)⟩ have hdis3 : Disjoint (gm_type S 3 2 0 0 ∪ gm_type S 3 3 0 0 ∪ gm_type S 3 1 1 0) (gm_type S 3 0 2 0) := by simp only [Finset.disjoint_union_left] exact ⟨⟨gm_type_disjoint S 3 2 0 0 3 0 2 0 (by omega), gm_type_disjoint S 3 3 0 0 3 0 2 0 (by omega)⟩, gm_type_disjoint S 3 1 1 0 3 0 2 0 (by omega)⟩ have hZ : (w23_Z S).card = (gm_type S 3 2 0 0).card+(gm_type S 3 3 0 0).card+ (gm_type S 3 1 1 0).card+(gm_type S 3 0 2 0).card := by rw [heq,Finset.card_union_of_disjoint hdis3,Finset.card_union_of_disjoint hdis2, Finset.card_union_of_disjoint hdis1] have hh := Finset.card_filter_add_card_filter_not (s := w23_X S 3) S.IsPrimitive rw [n4_X_primitive_eq_P S 3 (by omega)] at hh change (w23_P S 3).card+(w23_Z S).card=(w23_X S 3).card at hh omega lemma gm_enum_injective (A : Finset ℕ) : Function.Injective (m3_enum A) := by intro i j hij apply (Finset.equivFin A).symm.injective exact Subtype.ext hij lemma w23_gm_indices_card_P (S : NumericalSemigroup) (hq : w23_q S = 4) (j : ℕ) (hj : 2 ≤ j) (hj4 : j < 4) : (gm_indices S j).card = (w23_P S j).card := by classical apply Finset.card_bij (fun i _ => m3_enum (gm_A S) i) · intro i hi have hlev : w23_level S (m3_enum (gm_A S) i) = j := by simpa [gm_indices] using hi have hp := ((w23_gm_mem_A S _).1 (m3_enum_mem (gm_A S) i)).1 exact (w23_mem_P S j _).2 ⟨hp,hlev⟩ · intro i hi k hk he exact gm_enum_injective _ he · intro a ha obtain ⟨hp,hl⟩ := (w23_mem_P S j a).1 ha have hlt : a < S.conductor := (w23_lt_conductor_iff S a).2 (by omega) have hne : a ≠ S.multiplicity := by intro he rw [he,w23_level_multiplicity] at hl omega obtain ⟨i,hi⟩ := m3_enum_surjective (gm_A S) a ((w23_gm_mem_A S a).2 ⟨hp,hlt,hne⟩) exact ⟨i,by simp [gm_indices,hi,hl],hi⟩ lemma w23_gm_indices_card_B (S : NumericalSemigroup) (hq : w23_q S = 4) : (gm_indices S 1).card = (w23_X S 1).card := by classical apply Finset.card_bij (fun i _ => m3_enum (gm_A S) i) · intro i hi have hlev : w23_level S (m3_enum (gm_A S) i) = 1 := by simpa [gm_indices] using hi obtain ⟨hp,hlt,hne⟩ := (w23_gm_mem_A S _).1 (m3_enum_mem (gm_A S) i) exact (w23_mem_X S 1 _).2 ⟨w23_primitive_mem_apery S hp hne,hlev⟩ · intro i hi k hk he exact gm_enum_injective _ he · intro a ha obtain ⟨hap,hl⟩ := (w23_mem_X S 1 a).1 ha have hp := w23_gm_X1_primitive S ha have hlt : a < S.conductor := (w23_lt_conductor_iff S a).2 (by omega) have hne : a ≠ S.multiplicity := by intro he rw [he] at hap exact w23_multiplicity_not_mem_apery S hap obtain ⟨i,hi⟩ := m3_enum_surjective (gm_A S) a ((w23_gm_mem_A S a).2 ⟨hp,hlt,hne⟩) exact ⟨i,by simp [gm_indices,hi,hl],hi⟩ noncomputable def gm_piece (S : NumericalSemigroup) (j : ℕ) (alpha : Fin (gm_A S).card → ℕ) : ℕ := ∑ i ∈ gm_indices S j, alpha i*m3_enum (gm_A S) i lemma w23_gm_piece_value (S : NumericalSemigroup) (hq : w23_q S = 4) (alpha : Fin (gm_A S).card → ℕ) : m3_value (m3_enum (gm_A S)) alpha = gm_piece S 1 alpha+gm_piece S 2 alpha+gm_piece S 3 alpha := by classical unfold m3_value gm_piece gm_indices simp only [Finset.sum_filter] rw [← Finset.sum_add_distrib,← Finset.sum_add_distrib] apply Finset.sum_congr rfl intro i hi rcases w23_gm_enum_levels S hq i with h1 | h2 | h3 <;> simp_all lemma w23_gm_piece_zero (S : NumericalSemigroup) (j : ℕ) (alpha : Fin (gm_A S).card → ℕ) (hj : gm_group S j alpha = 0) : gm_piece S j alpha = 0 := by classical apply Finset.sum_eq_zero intro i hi have hlev : w23_level S (m3_enum (gm_A S) i) = j := by simpa [gm_indices] using hi rw [w23_gm_group_zero S j alpha hj hlev,Nat.zero_mul] noncomputable def gm_h0 (S : NumericalSemigroup) : Finset ℕ := by classical exact (gm_type S 4 2 1 0).filter (fun x => gm_piece S 1 (gm_rep (gm_A S) x)+w23_rho S < 3*S.multiplicity) noncomputable def gm_h1 (S : NumericalSemigroup) : Finset ℕ := by classical exact (gm_type S 4 2 1 0).filter (fun x => ¬ gm_piece S 1 (gm_rep (gm_A S) x)+w23_rho S < 3*S.multiplicity) noncomputable def gm_wlow (S : NumericalSemigroup) : Finset ℕ := by classical exact (gm_type S 3 2 0 0).filter (fun x => x < 3*S.multiplicity) lemma gm_h_card (S : NumericalSemigroup) : (gm_h0 S).card+(gm_h1 S).card=(gm_type S 4 2 1 0).card := by classical exact Finset.card_filter_add_card_filter_not (s := gm_type S 4 2 1 0) _ lemma gm_wlow_card (S : NumericalSemigroup) : (gm_wlow S).card ≤ (gm_type S 3 2 0 0).card := by classical exact Finset.card_le_card (Finset.filter_subset _ _) lemma w23_gm_right_card (S : NumericalSemigroup) (hq : w23_q S = 4) : (n4_right S).card ≤ (gm_type S 4 3 0 0).card+(gm_type S 4 4 0 0).card+ (gm_type S 4 1 1 0).card+(gm_type S 4 0 2 0).card+(gm_h0 S).card+(gm_h1 S).card+ (gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card+ (gm_type S 4 1 0 1).card+(gm_type S 4 0 1 1).card := by classical have hsub : n4_right S ⊆ gm_type S 4 3 0 0 ∪ gm_type S 4 4 0 0 ∪ gm_type S 4 1 1 0 ∪ gm_type S 4 0 2 0 ∪ gm_type S 4 2 1 0 ∪ gm_type S 4 1 2 0 ∪ gm_type S 4 0 3 0 ∪ gm_type S 4 1 0 1 ∪ gm_type S 4 0 1 1 := by intro x hx obtain ⟨hx4,hn⟩ := Finset.mem_filter.1 hx have ht := w23_gm_type_table S hq (by omega : 2 ≤ 4) hx4 hn rcases ht with ⟨hfalse,_⟩ | ⟨hfalse,_⟩ | ⟨_,hh⟩ · omega · omega · exact hh have hc := Finset.card_le_card hsub have hh := gm_h_card S have h0 := Finset.card_union_le (gm_type S 4 3 0 0) (gm_type S 4 4 0 0) have h1 := Finset.card_union_le (gm_type S 4 3 0 0 ∪ gm_type S 4 4 0 0) (gm_type S 4 1 1 0) have h2 := Finset.card_union_le (gm_type S 4 3 0 0 ∪ gm_type S 4 4 0 0 ∪ gm_type S 4 1 1 0) (gm_type S 4 0 2 0) have h3 := Finset.card_union_le (gm_type S 4 3 0 0 ∪ gm_type S 4 4 0 0 ∪ gm_type S 4 1 1 0 ∪ gm_type S 4 0 2 0) (gm_type S 4 2 1 0) have h4 := Finset.card_union_le (gm_type S 4 3 0 0 ∪ gm_type S 4 4 0 0 ∪ gm_type S 4 1 1 0 ∪ gm_type S 4 0 2 0 ∪ gm_type S 4 2 1 0) (gm_type S 4 1 2 0) have h5 := Finset.card_union_le (gm_type S 4 3 0 0 ∪ gm_type S 4 4 0 0 ∪ gm_type S 4 1 1 0 ∪ gm_type S 4 0 2 0 ∪ gm_type S 4 2 1 0 ∪ gm_type S 4 1 2 0) (gm_type S 4 0 3 0) have h6 := Finset.card_union_le (gm_type S 4 3 0 0 ∪ gm_type S 4 4 0 0 ∪ gm_type S 4 1 1 0 ∪ gm_type S 4 0 2 0 ∪ gm_type S 4 2 1 0 ∪ gm_type S 4 1 2 0 ∪ gm_type S 4 0 3 0) (gm_type S 4 1 0 1) have h7 := Finset.card_union_le (gm_type S 4 3 0 0 ∪ gm_type S 4 4 0 0 ∪ gm_type S 4 1 1 0 ∪ gm_type S 4 0 2 0 ∪ gm_type S 4 2 1 0 ∪ gm_type S 4 1 2 0 ∪ gm_type S 4 0 3 0 ∪ gm_type S 4 1 0 1) (gm_type S 4 0 1 1) omega lemma w23_gm_general_counts (S : NumericalSemigroup) (hq : w23_q S = 4) : S.embeddingDimension = 1+(w23_X S 1).card+(w23_P S 2).card+(w23_P S 3).card+w23_pq S ∧ S.leftCount = 4+3*(w23_X S 1).card+2*(w23_P S 2).card+(w23_P S 3).card+ 2*(gm_type S 2 2 0 0).card+(gm_type S 3 2 0 0).card+(gm_type S 3 3 0 0).card+ (gm_type S 3 1 1 0).card+(gm_type S 3 0 2 0).card ∧ S.multiplicity = S.embeddingDimension+(gm_type S 2 2 0 0).card+(gm_type S 3 2 0 0).card+ (gm_type S 3 3 0 0).card+(gm_type S 3 1 1 0).card+(gm_type S 3 0 2 0).card+ (n4_right S).card := by classical have ha1 := w23_alpha_one S change (w23_X S 1).card+1=(w23_P S 1).card at ha1 have hn := w23_n_eq_sum S change w23_n S = ∑ i ∈ Finset.range (w23_q S), (w23_P S i).card at hn rw [hq] at hn norm_num [Finset.sum_range_succ,w23_P_zero] at hn have hX2 := w23_gm_X2_card S hq have hX3 := w23_gm_X3_card S hq have hl := w23_leftCount_eq S rw [hq] at hl norm_num [Finset.sum_range_succ,w23_alpha,w23_X_zero] at hl have hmc : S.multiplicity < S.conductor := by have hb := (w23_q_bounds S).1 rw [hq] at hb omega have hd := w23_D_card_eq S hmc rw [hq] at hd have hreq : (@Finset.filter ℕ (fun x => ¬ S.IsPrimitive x) (Classical.decPred _) (w23_X S 4)) = n4_right S := by ext x simp [n4_right] rw [hreq] at hd norm_num [Finset.sum_range_succ,w23_alpha,w23_X_zero] at hd have he := w23_e_eq S have hm := w23_m_eq S exact ⟨by omega,by omega,by omega⟩ lemma gm_positive_in_group {N : ℕ} (I : Finset (Fin N)) (alpha : Fin N → ℕ) (hpos : 0 < ∑ i ∈ I, alpha i) : ∃ i ∈ I, 0 < alpha i := by classical by_contra hn push_neg at hn have hz : (∑ i ∈ I, alpha i) = 0 := by apply Finset.sum_eq_zero intro i hi have := hn i hi omega omega noncomputable def gm_generators (S : NumericalSemigroup) (j : ℕ) : Finset ℕ := by classical exact (gm_A S).filter (fun a => w23_level S a = j) lemma w23_gm_generators_B (S : NumericalSemigroup) (hq : w23_q S = 4) : gm_generators S 1 = w23_X S 1 := by classical ext a constructor · intro ha obtain ⟨haA,hl⟩ := Finset.mem_filter.1 ha obtain ⟨hp,hlt,hne⟩ := (w23_gm_mem_A S a).1 haA exact (w23_mem_X S 1 a).2 ⟨w23_primitive_mem_apery S hp hne,hl⟩ · intro ha obtain ⟨hap,hl⟩ := (w23_mem_X S 1 a).1 ha have hp := w23_gm_X1_primitive S ha have hlt : a < S.conductor := (w23_lt_conductor_iff S a).2 (by omega) have hne : a ≠ S.multiplicity := by intro he rw [he] at hap exact w23_multiplicity_not_mem_apery S hap exact Finset.mem_filter.2 ⟨(w23_gm_mem_A S a).2 ⟨hp,hlt,hne⟩,hl⟩ lemma w23_gm_generators_P (S : NumericalSemigroup) (hq : w23_q S = 4) (j : ℕ) (hj : 2 ≤ j) (hj4 : j < 4) : gm_generators S j = w23_P S j := by classical ext a constructor · intro ha obtain ⟨haA,hl⟩ := Finset.mem_filter.1 ha exact (w23_mem_P S j a).2 ⟨((w23_gm_mem_A S a).1 haA).1,hl⟩ · intro ha obtain ⟨hp,hl⟩ := (w23_mem_P S j a).1 ha have hlt : a < S.conductor := (w23_lt_conductor_iff S a).2 (by omega) have hne : a ≠ S.multiplicity := by intro he rw [he,w23_level_multiplicity] at hl omega exact Finset.mem_filter.2 ⟨(w23_gm_mem_A S a).2 ⟨hp,hlt,hne⟩,hl⟩ lemma w23_gm_group_single_value (S : NumericalSemigroup) (j : ℕ) (alpha : Fin (gm_A S).card → ℕ) (hd : m3_degree alpha = 1) (hj : gm_group S j alpha = 1) : m3_value (m3_enum (gm_A S)) alpha ∈ gm_generators S j := by classical obtain ⟨i,hi,hpos⟩ := gm_positive_in_group (gm_indices S j) alpha (by change 0 < gm_group S j alpha; omega) have hpd := m3_degree_parent alpha i hpos have hz := m3_degree_zero (m3_parent alpha i) (by omega) have he := m3_value_parent (m3_enum (gm_A S)) alpha i hpos rw [hz] at he have hzv : m3_value (m3_enum (gm_A S)) (fun _ => 0) = 0 := by simp [m3_value] rw [hzv,zero_add] at he rw [← he] exact Finset.mem_filter.2 ⟨m3_enum_mem (gm_A S) i,by simpa [gm_indices] using hi⟩ lemma w23_gm_group_pair_value (S : NumericalSemigroup) (j k : ℕ) (hjk : j ≠ k) (alpha : Fin (gm_A S).card → ℕ) (hd : m3_degree alpha = 2) (hj : gm_group S j alpha = 1) (hk : gm_group S k alpha = 1) : m3_value (m3_enum (gm_A S)) alpha ∈ gm_generators S j+gm_generators S k := by classical obtain ⟨i,hi,hpos⟩ := gm_positive_in_group (gm_indices S j) alpha (by change 0 < gm_group S j alpha; omega) have hiJ : w23_level S (m3_enum (gm_A S) i) = j := by simpa [gm_indices] using hi have hiK : i ∉ gm_indices S k := by intro hiK have hiK' : w23_level S (m3_enum (gm_A S) i) = k := by simpa [gm_indices] using hiK omega have hpd := m3_degree_parent alpha i hpos have hpg := gm_group_parent (gm_indices S k) alpha i hpos have hpk : gm_group S k (m3_parent alpha i) = 1 := by change gm_group S k (m3_parent alpha i)+(if i ∈ gm_indices S k then 1 else 0)=gm_group S k alpha at hpg rw [if_neg hiK,add_zero] at hpg exact hpg.trans hk have hpval := w23_gm_group_single_value S k (m3_parent alpha i) (by omega) hpk have hival : m3_enum (gm_A S) i ∈ gm_generators S j := Finset.mem_filter.2 ⟨m3_enum_mem (gm_A S) i,hiJ⟩ have he := m3_value_parent (m3_enum (gm_A S)) alpha i hpos exact Finset.mem_add.2 ⟨_,hival,_,hpval,by omega⟩ lemma gm_value_supported (A B : Finset ℕ) (alpha : Fin A.card → ℕ) (hs : ∀ i, 0 < alpha i → m3_enum A i ∈ B) : m3_value (m3_enum A) alpha ∈ m3_degree alpha • B := by classical generalize hd : m3_degree alpha = d induction d using Nat.strong_induction_on generalizing alpha with | h d ih => by_cases hd0 : d = 0 · have hz := m3_degree_zero alpha (by omega) simp [hz,m3_value,hd0] · obtain ⟨i,hi,hpos⟩ := gm_positive_in_group Finset.univ alpha (by change 0 < m3_degree alpha; omega) have hpd := m3_degree_parent alpha i hpos have hs' : ∀ k, 0 < m3_parent alpha i k → m3_enum A k ∈ B := by intro k hk apply hs k by_cases hki : k = i · subst k exact hpos · simpa [m3_parent,Function.update,hki] using hk have hp := ih (m3_degree (m3_parent alpha i)) (by omega) (m3_parent alpha i) hs' rfl have he := m3_value_parent (m3_enum A) alpha i hpos have hd' : d = m3_degree (m3_parent alpha i)+1 := by omega rw [hd',succ_nsmul] exact Finset.mem_add.2 ⟨_,hp,_,hs i hpos,he⟩ lemma w23_gm_group_pure_value (S : NumericalSemigroup) (hq : w23_q S = 4) (j : ℕ) (alpha : Fin (gm_A S).card → ℕ) (hj : gm_group S j alpha = m3_degree alpha) : m3_value (m3_enum (gm_A S)) alpha ∈ m3_degree alpha • gm_generators S j := by classical apply gm_value_supported intro i hi have hsum : (∑ k ∈ (Finset.univ \ gm_indices S j), alpha k) = 0 := by have hh := Finset.sum_sdiff (Finset.subset_univ (gm_indices S j)) (f := alpha) change (∑ k ∈ Finset.univ \ gm_indices S j, alpha k)+gm_group S j alpha=m3_degree alpha at hh omega have hm : i ∈ gm_indices S j := by by_contra hm have him : i ∈ Finset.univ \ gm_indices S j := by simp [hm] have hh := Finset.single_le_sum (fun k hk => Nat.zero_le (alpha k)) him omega exact Finset.mem_filter.2 ⟨m3_enum_mem (gm_A S) i,by simpa [gm_indices] using hm⟩ lemma w23_gm_type_pure_value (S : NumericalSemigroup) (hq : w23_q S = 4) (j b : ℕ) : gm_type S j b 0 0 ⊆ b • w23_X S 1 := by classical intro x hx obtain ⟨hxj,hn,hb,hc,hd⟩ := Finset.mem_filter.1 hx have hV := w23_gm_type_values S j b 0 0 hx have hs := gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq hV) have hdeg := w23_gm_group_degree S hq (gm_rep (gm_A S) x) have hdb : m3_degree (gm_rep (gm_A S) x) = b := by omega have hv := w23_gm_group_pure_value S hq 1 (gm_rep (gm_A S) x) (by omega) rwa [hs.2,hdb,w23_gm_generators_B S hq] at hv lemma w23_gm_rep_degree_nonprimitive (S : NumericalSemigroup) (hq : w23_q S = 4) {x : ℕ} (hx : x ∈ gm_values S) (hd : 2 ≤ gm_degree (gm_A S) x) : ¬ S.IsPrimitive x := by classical intro hp obtain ⟨hxa,hcase⟩ := Finset.mem_filter.1 hx have hl4 : w23_level S x < 4 := hcase.resolve_right (by tauto) have hlt : x < S.conductor := (w23_lt_conductor_iff S x).2 (by omega) have hne : x ≠ S.multiplicity := by intro he rw [he] at hxa exact w23_multiplicity_not_mem_apery S hxa have ha := (w23_gm_mem_A S x).2 ⟨hp,hlt,hne⟩ have hdeg := (gm_degree_spec (gm_A S) x (w23_gm_values_repr S hq hx)).2 1 (by simpa using ha) omega lemma w23_gm_parent_pure (S : NumericalSemigroup) (hq : w23_q S = 4) (j b : ℕ) (hb : 3 ≤ b) {x : ℕ} (hx : x ∈ gm_type S j b 0 0) {i : Fin (gm_A S).card} (hi : i ∈ gm_indices S 1) (hpos : 0 < gm_rep (gm_A S) x i) : let y := m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) y ∈ gm_type S (w23_level S y) (b-1) 0 0 ∧ b-1 ≤ w23_level S y ∧ w23_level S y+1 ≤ j := by classical let alpha := gm_rep (gm_A S) x let y := m3_value (m3_enum (gm_A S)) (m3_parent alpha i) obtain ⟨hxj,hn,hB,hC,hD⟩ := Finset.mem_filter.1 hx have hV := w23_gm_type_values S j b 0 0 hx obtain ⟨hyV,hrep⟩ := w23_gm_values_parent S hq hV i hpos have hiL : w23_level S (m3_enum (gm_A S) i) = 1 := by simpa [gm_indices] using hi have hi2 : i ∉ gm_indices S 2 := by simp [gm_indices,hiL] have hi3 : i ∉ gm_indices S 3 := by simp [gm_indices,hiL] have hB' := gm_group_parent (gm_indices S 1) alpha i hpos have hC' := gm_group_parent (gm_indices S 2) alpha i hpos have hD' := gm_group_parent (gm_indices S 3) alpha i hpos change gm_group S 1 (m3_parent alpha i)+(if i ∈ gm_indices S 1 then 1 else 0)=gm_group S 1 alpha at hB' change gm_group S 2 (m3_parent alpha i)+(if i ∈ gm_indices S 2 then 1 else 0)=gm_group S 2 alpha at hC' change gm_group S 3 (m3_parent alpha i)+(if i ∈ gm_indices S 3 then 1 else 0)=gm_group S 3 alpha at hD' simp only [hi,hi2,hi3,ite_eq_left,ite_eq_right,add_zero] at hB' hC' hD' change m3_parent alpha i=gm_rep (gm_A S) y at hrep rw [hrep] at hB' hC' hD' have hpB : gm_group S 1 (gm_rep (gm_A S) y)=b-1 := by change gm_group S 1 alpha=b at hB; omega have hpC : gm_group S 2 (gm_rep (gm_A S) y)=0 := by change gm_group S 2 alpha=0 at hC; omega have hpD : gm_group S 3 (gm_rep (gm_A S) y)=0 := by change gm_group S 3 alpha=0 at hD; omega have hyr := w23_gm_values_repr S hq hyV have hys := gm_rep_spec (gm_A S) y hyr have hgd := w23_gm_group_degree S hq (gm_rep (gm_A S) y) have hydeg : gm_degree (gm_A S) y=b-1 := by omega have hyp := w23_gm_rep_degree_nonprimitive S hq (show y ∈ gm_values S from hyV) (by rw [hydeg] <;> omega) have hlev := w23_gm_degree_le S _ y (gm_degree_spec (gm_A S) y hyr).1 rw [hydeg] at hlev have he := m3_value_parent (m3_enum (gm_A S)) alpha i hpos have hxs := gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq hV) change y+m3_enum (gm_A S) i=m3_value (m3_enum (gm_A S)) alpha at he rw [show m3_value (m3_enum (gm_A S)) alpha=x from hxs.2] at he have hiA := (w23_gm_mem_A S _).1 (m3_enum_mem (gm_A S) i) have hyL := w23_level_add_ge_of_mem S y hiA.1.1 hiA.1.2.1 rw [he,((w23_mem_X S j x).1 hxj).2] at hyL refine ⟨Finset.mem_filter.2 ⟨(w23_mem_X S _ y).2 ⟨(Finset.mem_filter.1 hyV).1,rfl⟩, hyp,hpB,hpC,hpD⟩,hlev,hyL⟩ lemma w23_gm_pure_pair_card (S : NumericalSemigroup) (hq : w23_q S = 4) : 2*((gm_type S 2 2 0 0).card+(gm_type S 3 2 0 0).card) ≤ (w23_X S 1).card*((w23_X S 1).card+1) := by classical have hsub : gm_type S 2 2 0 0 ∪ gm_type S 3 2 0 0 ⊆ 2 • w23_X S 1 := Finset.union_subset (w23_gm_type_pure_value S hq 2 2) (w23_gm_type_pure_value S hq 3 2) have hdis := gm_type_disjoint S 2 2 0 0 3 2 0 0 (by omega) have hcard := Finset.card_le_card hsub rw [Finset.card_union_of_disjoint hdis] at hcard have hh := ns_card_succ_nsmul_le (w23_X S 1) 1 simp only [Nat.reduceAdd,one_nsmul] at hh nlinarith only [hcard,hh] lemma w23_gm_pure_triple_card (S : NumericalSemigroup) (hq : w23_q S = 4) : 3*((gm_type S 3 3 0 0).card+(gm_type S 4 3 0 0).card) ≤ ((w23_X S 1).card+2)*((gm_type S 2 2 0 0).card+(gm_type S 3 2 0 0).card) := by classical let B := gm_type S 2 2 0 0 ∪ gm_type S 3 2 0 0 let C := gm_type S 3 3 0 0 ∪ gm_type S 4 3 0 0 have hdiv : ∀ x ∈ C, ∀ i ∈ gm_indices S 1, 0 < gm_rep (gm_A S) x i → m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) ∈ B := by intro x hx i hi hp let y := m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) have hd : y ∈ gm_type S (w23_level S y) 2 0 0 ∧ 2 ≤ w23_level S y ∧ w23_level S y ≤ 3 := by rcases Finset.mem_union.1 hx with hx3 | hx4 · have ht := w23_gm_parent_pure S hq 3 3 (by omega) hx3 hi hp change y ∈ gm_type S (w23_level S y) 2 0 0 ∧ 2 ≤ w23_level S y ∧ w23_level S y+1 ≤ 3 at ht exact ⟨ht.1,ht.2.1,by omega⟩ · have ht := w23_gm_parent_pure S hq 4 3 (by omega) hx4 hi hp change y ∈ gm_type S (w23_level S y) 2 0 0 ∧ 2 ≤ w23_level S y ∧ w23_level S y+1 ≤ 4 at ht exact ⟨ht.1,ht.2.1,by omega⟩ by_cases h2 : w23_level S y=2 · exact Finset.mem_union.2 (Or.inl (by simpa only [h2] using hd.1)) · have h3 : w23_level S y=3 := by omega exact Finset.mem_union.2 (Or.inr (by simpa only [h3] using hd.1)) have hh := w23_gm_restricted_shadow S hq (gm_indices S 1) B C 2 (Finset.union_subset (w23_gm_type_values S 2 2 0 0) (w23_gm_type_values S 3 2 0 0)) (Finset.union_subset (w23_gm_type_values S 3 3 0 0) (w23_gm_type_values S 4 3 0 0)) (by intro x hx; rcases Finset.mem_union.1 hx with hx | hx <;> exact (Finset.mem_filter.1 hx).2.2.1) (by intro x hx; rcases Finset.mem_union.1 hx with hx | hx <;> exact (Finset.mem_filter.1 hx).2.2.1) hdiv dsimp only [B,C] at hh rw [w23_gm_indices_card_B S hq, Finset.card_union_of_disjoint (gm_type_disjoint S 2 2 0 0 3 2 0 0 (by omega)), Finset.card_union_of_disjoint (gm_type_disjoint S 3 3 0 0 4 3 0 0 (by omega))] at hh exact hh lemma w23_gm_pure_left_triple_card (S : NumericalSemigroup) (hq : w23_q S = 4) : 3*(gm_type S 3 3 0 0).card ≤ ((w23_X S 1).card+2)*(gm_type S 2 2 0 0).card := by classical have hdiv : ∀ x ∈ gm_type S 3 3 0 0, ∀ i ∈ gm_indices S 1, 0 < gm_rep (gm_A S) x i → m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) ∈ gm_type S 2 2 0 0 := by intro x hx i hi hp have ht := w23_gm_parent_pure S hq 3 3 (by omega) hx hi hp have hl : w23_level S (m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i))=2 := by omega simpa only [hl] using ht.1 have hh := w23_gm_restricted_shadow S hq (gm_indices S 1) (gm_type S 2 2 0 0) (gm_type S 3 3 0 0) 2 (w23_gm_type_values S 2 2 0 0) (w23_gm_type_values S 3 3 0 0) (by intro x hx; exact (Finset.mem_filter.1 hx).2.2.1) (by intro x hx; exact (Finset.mem_filter.1 hx).2.2.1) hdiv rwa [w23_gm_indices_card_B S hq] at hh lemma w23_gm_pure_quadruple_card (S : NumericalSemigroup) (hq : w23_q S = 4) : 4*(gm_type S 4 4 0 0).card ≤ ((w23_X S 1).card+3)*(gm_type S 3 3 0 0).card := by classical have hdiv : ∀ x ∈ gm_type S 4 4 0 0, ∀ i ∈ gm_indices S 1, 0 < gm_rep (gm_A S) x i → m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) ∈ gm_type S 3 3 0 0 := by intro x hx i hi hp have ht := w23_gm_parent_pure S hq 4 4 (by omega) hx hi hp have hl : w23_level S (m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i))=3 := by omega simpa only [hl] using ht.1 have hh := w23_gm_restricted_shadow S hq (gm_indices S 1) (gm_type S 3 3 0 0) (gm_type S 4 4 0 0) 3 (w23_gm_type_values S 3 3 0 0) (w23_gm_type_values S 4 4 0 0) (by intro x hx; exact (Finset.mem_filter.1 hx).2.2.1) (by intro x hx; exact (Finset.mem_filter.1 hx).2.2.1) hdiv rwa [w23_gm_indices_card_B S hq] at hh lemma w23_gm_type_BC_subset (S : NumericalSemigroup) (hq : w23_q S = 4) (j : ℕ) : gm_type S j 1 1 0 ⊆ w23_X S 1+w23_P S 2 := by classical intro x hx obtain ⟨hxj,hn,hb,hc,hd⟩ := Finset.mem_filter.1 hx have hV := w23_gm_type_values S j 1 1 0 hx have hs := gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq hV) have hgd := w23_gm_group_degree S hq (gm_rep (gm_A S) x) have hv := w23_gm_group_pair_value S 1 2 (by omega) (gm_rep (gm_A S) x) (by omega) hb hc rwa [hs.2,w23_gm_generators_B S hq,w23_gm_generators_P S hq 2 (by omega) (by omega)] at hv lemma w23_gm_type_CC_subset (S : NumericalSemigroup) (hq : w23_q S = 4) (j : ℕ) : gm_type S j 0 2 0 ⊆ 2 • w23_P S 2 := by classical intro x hx obtain ⟨hxj,hn,hb,hc,hd⟩ := Finset.mem_filter.1 hx have hV := w23_gm_type_values S j 0 2 0 hx have hs := gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq hV) have hgd := w23_gm_group_degree S hq (gm_rep (gm_A S) x) have hdeg : m3_degree (gm_rep (gm_A S) x)=2 := by omega have hv := w23_gm_group_pure_value S hq 2 (gm_rep (gm_A S) x) (by omega) rwa [hs.2,hdeg,w23_gm_generators_P S hq 2 (by omega) (by omega)] at hv lemma w23_gm_type_BD_subset (S : NumericalSemigroup) (hq : w23_q S = 4) : gm_type S 4 1 0 1 ⊆ w23_X S 1+w23_P S 3 := by classical intro x hx obtain ⟨hxj,hn,hb,hc,hd⟩ := Finset.mem_filter.1 hx have hV := w23_gm_type_values S 4 1 0 1 hx have hs := gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq hV) have hgd := w23_gm_group_degree S hq (gm_rep (gm_A S) x) have hv := w23_gm_group_pair_value S 1 3 (by omega) (gm_rep (gm_A S) x) (by omega) hb hd rwa [hs.2,w23_gm_generators_B S hq,w23_gm_generators_P S hq 3 (by omega) (by omega)] at hv lemma w23_gm_type_CD_subset (S : NumericalSemigroup) (hq : w23_q S = 4) : gm_type S 4 0 1 1 ⊆ w23_P S 2+w23_P S 3 := by classical intro x hx obtain ⟨hxj,hn,hb,hc,hd⟩ := Finset.mem_filter.1 hx have hV := w23_gm_type_values S 4 0 1 1 hx have hs := gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq hV) have hgd := w23_gm_group_degree S hq (gm_rep (gm_A S) x) have hv := w23_gm_group_pair_value S 2 3 (by omega) (gm_rep (gm_A S) x) (by omega) hc hd rwa [hs.2,w23_gm_generators_P S hq 2 (by omega) (by omega), w23_gm_generators_P S hq 3 (by omega) (by omega)] at hv lemma w23_gm_BC_card (S : NumericalSemigroup) (hq : w23_q S = 4) : (gm_type S 3 1 1 0).card+(gm_type S 4 1 1 0).card ≤ (w23_X S 1).card*(w23_P S 2).card := by classical have hc := Finset.card_le_card (Finset.union_subset (w23_gm_type_BC_subset S hq 3) (w23_gm_type_BC_subset S hq 4)) rw [Finset.card_union_of_disjoint (gm_type_disjoint S 3 1 1 0 4 1 1 0 (by omega))] at hc exact hc.trans (w23_card_add_le _ _) lemma w23_gm_CC_card (S : NumericalSemigroup) (hq : w23_q S = 4) : 2*((gm_type S 3 0 2 0).card+(gm_type S 4 0 2 0).card) ≤ (w23_P S 2).card*((w23_P S 2).card+1) := by classical have hc := Finset.card_le_card (Finset.union_subset (w23_gm_type_CC_subset S hq 3) (w23_gm_type_CC_subset S hq 4)) rw [Finset.card_union_of_disjoint (gm_type_disjoint S 3 0 2 0 4 0 2 0 (by omega))] at hc have hh := ns_card_succ_nsmul_le (w23_P S 2) 1 simp only [Nat.reduceAdd,one_nsmul] at hh nlinarith only [hc,hh] lemma w23_gm_BD_card (S : NumericalSemigroup) (hq : w23_q S = 4) : (gm_type S 4 1 0 1).card ≤ (w23_X S 1).card*(w23_P S 3).card := (Finset.card_le_card (w23_gm_type_BD_subset S hq)).trans (w23_card_add_le _ _) lemma w23_gm_CD_card (S : NumericalSemigroup) (hq : w23_q S = 4) : (gm_type S 4 0 1 1).card ≤ (w23_P S 2).card*(w23_P S 3).card := (Finset.card_le_card (w23_gm_type_CD_subset S hq)).trans (w23_card_add_le _ _) lemma w23_gm_parent_groups (S : NumericalSemigroup) (hq : w23_q S = 4) {x : ℕ} (hx : x ∈ gm_values S) {i : Fin (gm_A S).card} (hpos : 0 < gm_rep (gm_A S) x i) (j : ℕ) : let y := m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) gm_group S j (gm_rep (gm_A S) y)+(if i ∈ gm_indices S j then 1 else 0)= gm_group S j (gm_rep (gm_A S) x) := by classical have hh := gm_group_parent (gm_indices S j) (gm_rep (gm_A S) x) i hpos change gm_group S j (m3_parent (gm_rep (gm_A S) x) i)+ (if i ∈ gm_indices S j then 1 else 0)=gm_group S j (gm_rep (gm_A S) x) at hh rw [(w23_gm_values_parent S hq hx i hpos).2] at hh exact hh lemma w23_gm_parent_level (S : NumericalSemigroup) (hq : w23_q S = 4) {x : ℕ} (hx : x ∈ gm_values S) {i : Fin (gm_A S).card} (hpos : 0 < gm_rep (gm_A S) x i) : let y := m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) w23_level S y+1 ≤ w23_level S x := by let y := m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) have he := m3_value_parent (m3_enum (gm_A S)) (gm_rep (gm_A S) x) i hpos have hs := gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq hx) rw [hs.2] at he have hp := ((w23_gm_mem_A S _).1 (m3_enum_mem (gm_A S) i)).1 have hh := w23_level_add_ge_of_mem S y hp.1 hp.2.1 rwa [he] at hh lemma gm_piece_unitAdd (S : NumericalSemigroup) (j : ℕ) (alpha : Fin (gm_A S).card → ℕ) (i : Fin (gm_A S).card) : gm_piece S j (m3_unitAdd alpha i) = gm_piece S j alpha+ (if i ∈ gm_indices S j then m3_enum (gm_A S) i else 0) := by classical unfold gm_piece simp [m3_unitAdd,Nat.add_mul,Finset.sum_add_distrib] lemma gm_piece_parent (S : NumericalSemigroup) (j : ℕ) (alpha : Fin (gm_A S).card → ℕ) (i : Fin (gm_A S).card) (hpos : 0 < alpha i) : gm_piece S j (m3_parent alpha i)+(if i ∈ gm_indices S j then m3_enum (gm_A S) i else 0)= gm_piece S j alpha := by rw [← gm_piece_unitAdd,m3_unitAdd_parent alpha i hpos] lemma w23_gm_BBC_parent (S : NumericalSemigroup) (hq : w23_q S = 4) {x : ℕ} (hx : x ∈ gm_type S 4 2 1 0) {i : Fin (gm_A S).card} (hi : i ∈ gm_indices S 2) (hpos : 0 < gm_rep (gm_A S) x i) : let y := m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) y = gm_piece S 1 (gm_rep (gm_A S) x) ∧ y ∈ gm_type S (w23_level S y) 2 0 0 ∧ 2 ≤ w23_level S y ∧ w23_level S y ≤ 3 ∧ x = y+m3_enum (gm_A S) i := by classical let alpha := gm_rep (gm_A S) x let y := m3_value (m3_enum (gm_A S)) (m3_parent alpha i) obtain ⟨hx4,hn,hB,hC,hD⟩ := Finset.mem_filter.1 hx have hV := w23_gm_type_values S 4 2 1 0 hx obtain ⟨hyV,hrep⟩ := w23_gm_values_parent S hq hV i hpos change y ∈ gm_values S at hyV change m3_parent alpha i = gm_rep (gm_A S) y at hrep have hiL : w23_level S (m3_enum (gm_A S) i) = 2 := by simpa [gm_indices] using hi have hi1 : i ∉ gm_indices S 1 := by simp [gm_indices,hiL] have hi3 : i ∉ gm_indices S 3 := by simp [gm_indices,hiL] have hpB := w23_gm_parent_groups S hq hV hpos 1 have hpC := w23_gm_parent_groups S hq hV hpos 2 have hpD := w23_gm_parent_groups S hq hV hpos 3 change gm_group S 1 (gm_rep (gm_A S) y)+(if i ∈ gm_indices S 1 then 1 else 0)=gm_group S 1 alpha at hpB change gm_group S 2 (gm_rep (gm_A S) y)+(if i ∈ gm_indices S 2 then 1 else 0)=gm_group S 2 alpha at hpC change gm_group S 3 (gm_rep (gm_A S) y)+(if i ∈ gm_indices S 3 then 1 else 0)=gm_group S 3 alpha at hpD rw [if_neg hi1,add_zero] at hpB rw [if_pos hi] at hpC rw [if_neg hi3,add_zero] at hpD change gm_group S 1 alpha=2 at hB change gm_group S 2 alpha=1 at hC change gm_group S 3 alpha=0 at hD have hpB2 : gm_group S 1 (gm_rep (gm_A S) y)=2 := by omega have hpC0 : gm_group S 2 (gm_rep (gm_A S) y)=0 := by omega have hpD0 : gm_group S 3 (gm_rep (gm_A S) y)=0 := by omega have hys := gm_rep_spec (gm_A S) y (w23_gm_values_repr S hq hyV) have hgd := w23_gm_group_degree S hq (gm_rep (gm_A S) y) have hydeg : gm_degree (gm_A S) y=2 := by omega have hyp := w23_gm_rep_degree_nonprimitive S hq hyV (by rw [hydeg] <;> omega) have hylev := w23_gm_degree_le S _ y (gm_degree_spec (gm_A S) y (w23_gm_values_repr S hq hyV)).1 rw [hydeg] at hylev have hlev := w23_gm_parent_level S hq hV hpos change w23_level S y+1 ≤ w23_level S x at hlev rw [((w23_mem_X S 4 x).1 hx4).2] at hlev have hpPiece := gm_piece_parent S 1 alpha i hpos rw [if_neg hi1,add_zero,hrep] at hpPiece have hpValue := w23_gm_piece_value S hq (gm_rep (gm_A S) y) rw [hys.2,w23_gm_piece_zero S 2 _ hpC0,w23_gm_piece_zero S 3 _ hpD0,add_zero,add_zero] at hpValue have hyeq : y=gm_piece S 1 alpha := by omega have he := m3_value_parent (m3_enum (gm_A S)) alpha i hpos have hxs := gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq hV) change y+m3_enum (gm_A S) i=m3_value (m3_enum (gm_A S)) alpha at he rw [show m3_value (m3_enum (gm_A S)) alpha=x from hxs.2] at he have hyupper : w23_level S y ≤ 3 := by omega exact ⟨hyeq,Finset.mem_filter.2 ⟨(w23_mem_X S _ y).2 ⟨(Finset.mem_filter.1 hyV).1,rfl⟩, hyp,hpB2,hpC0,hpD0⟩,hylev,hyupper,he.symm⟩ lemma w23_gm_h0_card (S : NumericalSemigroup) (hq : w23_q S = 4) : (gm_h0 S).card ≤ (w23_P S 2).card*(gm_type S 2 2 0 0).card := by classical have hsub : gm_h0 S ⊆ w23_P S 2+gm_type S 2 2 0 0 := by intro x hx obtain ⟨hxtype,hgood⟩ := Finset.mem_filter.1 hx have hC := (Finset.mem_filter.1 hxtype).2.2.2.1 obtain ⟨i,hi,hpos⟩ := gm_positive_in_group (gm_indices S 2) (gm_rep (gm_A S) x) (by change 0 < gm_group S 2 (gm_rep (gm_A S) x); omega) have hp := w23_gm_BBC_parent S hq hxtype hi hpos let y := m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) change y=gm_piece S 1 (gm_rep (gm_A S) x) ∧ y ∈ gm_type S (w23_level S y) 2 0 0 ∧ 2 ≤ w23_level S y ∧ w23_level S y ≤ 3 ∧ x=y+m3_enum (gm_A S) i at hp have hylev : w23_level S y=2 := by by_contra hn have hb := ((w23_level_eq_iff S y (w23_level S y)).1 rfl).1 rw [← hp.1] at hgood have hm := S.multiplicity_pos have hmul := Nat.mul_le_mul_right S.multiplicity (show 3 ≤ w23_level S y by omega) omega have hy : y ∈ gm_type S 2 2 0 0 := by simpa only [hylev] using hp.2.1 have hiL : w23_level S (m3_enum (gm_A S) i)=2 := by simpa [gm_indices] using hi have hival : m3_enum (gm_A S) i ∈ w23_P S 2 := (w23_mem_P S 2 _).2 ⟨((w23_gm_mem_A S _).1 (m3_enum_mem (gm_A S) i)).1,hiL⟩ exact Finset.mem_add.2 ⟨_,hival,y,hy,by omega⟩ exact (Finset.card_le_card hsub).trans (w23_card_add_le _ _) noncomputable def gm_H (S : NumericalSemigroup) : Finset ℕ := gm_type S 4 2 1 0 ∪ gm_type S 4 1 2 0 ∪ gm_type S 4 0 3 0 lemma w23_gm_H_data (S : NumericalSemigroup) (hq : w23_q S = 4) {x : ℕ} (hx : x ∈ gm_H S) : x ∈ gm_values S ∧ w23_level S x=4 ∧ gm_group S 1 (gm_rep (gm_A S) x)+gm_group S 2 (gm_rep (gm_A S) x)=3 ∧ 0 < gm_group S 2 (gm_rep (gm_A S) x) ∧ gm_group S 3 (gm_rep (gm_A S) x)=0 := by classical rcases Finset.mem_union.1 hx with hx | hx · rcases Finset.mem_union.1 hx with hx | hx · obtain ⟨hx4,hn,hb,hc,hd⟩ := Finset.mem_filter.1 hx exact ⟨Finset.mem_filter.2 ⟨((w23_mem_X S 4 x).1 hx4).1,Or.inr hn⟩, ((w23_mem_X S 4 x).1 hx4).2,by omega,by omega,hd⟩ · obtain ⟨hx4,hn,hb,hc,hd⟩ := Finset.mem_filter.1 hx exact ⟨Finset.mem_filter.2 ⟨((w23_mem_X S 4 x).1 hx4).1,Or.inr hn⟩, ((w23_mem_X S 4 x).1 hx4).2,by omega,by omega,hd⟩ · obtain ⟨hx4,hn,hb,hc,hd⟩ := Finset.mem_filter.1 hx exact ⟨Finset.mem_filter.2 ⟨((w23_mem_X S 4 x).1 hx4).1,Or.inr hn⟩, ((w23_mem_X S 4 x).1 hx4).2,by omega,by omega,hd⟩ lemma w23_gm_H_parent (S : NumericalSemigroup) (hq : w23_q S = 4) {x : ℕ} (hx : x ∈ gm_H S) {i : Fin (gm_A S).card} (hi : i ∈ gm_indices S 1 ∪ gm_indices S 2) (hpos : 0 < gm_rep (gm_A S) x i) : m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) ∈ (gm_type S 2 2 0 0 ∪ gm_wlow S) ∪ (gm_type S 3 1 1 0 ∪ gm_type S 3 0 2 0) := by classical let alpha := gm_rep (gm_A S) x let y := m3_value (m3_enum (gm_A S)) (m3_parent alpha i) obtain ⟨hV,hxlev,hgroups,hCpos,hD0⟩ := w23_gm_H_data S hq hx obtain ⟨hyV,hrep⟩ := w23_gm_values_parent S hq hV i hpos change y ∈ gm_values S at hyV change m3_parent alpha i=gm_rep (gm_A S) y at hrep have hxs := gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq hV) have hys := gm_rep_spec (gm_A S) y (w23_gm_values_repr S hq hyV) have hxd := w23_gm_group_degree S hq alpha change gm_group S 1 alpha+gm_group S 2 alpha=3 at hgroups change gm_group S 3 alpha=0 at hD0 have hdegx : m3_degree alpha=3 := by omega have hpd := m3_degree_parent alpha i hpos rw [hrep] at hpd have hydeg : gm_degree (gm_A S) y=2 := by omega have hylev := w23_gm_degree_le S _ y (gm_degree_spec (gm_A S) y (w23_gm_values_repr S hq hyV)).1 rw [hydeg] at hylev have hupper := w23_gm_parent_level S hq hV hpos change w23_level S y+1 ≤ w23_level S x at hupper rw [hxlev] at hupper have hi3 : i ∉ gm_indices S 3 := by rcases Finset.mem_union.1 hi with hi1 | hi2 · have hil : w23_level S (m3_enum (gm_A S) i)=1 := by simpa [gm_indices] using hi1 simp [gm_indices,hil] · have hil : w23_level S (m3_enum (gm_A S) i)=2 := by simpa [gm_indices] using hi2 simp [gm_indices,hil] have hpD := w23_gm_parent_groups S hq hV hpos 3 change gm_group S 3 (gm_rep (gm_A S) y)+(if i ∈ gm_indices S 3 then 1 else 0)=gm_group S 3 alpha at hpD rw [if_neg hi3,add_zero] at hpD have hyD0 : gm_group S 3 (gm_rep (gm_A S) y)=0 := by omega have hyg := w23_gm_group_degree S hq (gm_rep (gm_A S) y) have hygroups : gm_group S 1 (gm_rep (gm_A S) y)+gm_group S 2 (gm_rep (gm_A S) y)=2 := by omega have hyn := w23_gm_rep_degree_nonprimitive S hq hyV (by rw [hydeg] <;> omega) have hyA := (Finset.mem_filter.1 hyV).1 have he := m3_value_parent (m3_enum (gm_A S)) alpha i hpos change y+m3_enum (gm_A S) i=m3_value (m3_enum (gm_A S)) alpha at he rw [show m3_value (m3_enum (gm_A S)) alpha=x from hxs.2] at he by_cases hyC0 : gm_group S 2 (gm_rep (gm_A S) y)=0 · have hyB2 : gm_group S 1 (gm_rep (gm_A S) y)=2 := by omega have hyType : y ∈ gm_type S (w23_level S y) 2 0 0 := Finset.mem_filter.2 ⟨(w23_mem_X S _ y).2 ⟨hyA,rfl⟩,hyn,hyB2,hyC0,hyD0⟩ have hpC := w23_gm_parent_groups S hq hV hpos 2 change gm_group S 2 (gm_rep (gm_A S) y)+(if i ∈ gm_indices S 2 then 1 else 0)=gm_group S 2 alpha at hpC have hi2 : i ∈ gm_indices S 2 := by by_contra hi2 rw [if_neg hi2,add_zero] at hpC change 0 < gm_group S 2 alpha at hCpos omega have haLo := ((w23_level_eq_iff S _ 2).1 (by simpa [gm_indices] using hi2)).1 have hxlt := w23_apery_lt S (Finset.mem_filter.1 hV).1 have hc := w23_q_mul_sub S rw [hq] at hc have hylt : y < 3*S.multiplicity := by omega by_cases hy2 : w23_level S y=2 · exact Finset.mem_union.2 (Or.inl (Finset.mem_union.2 (Or.inl (by simpa only [hy2] using hyType)))) · have hy3 : w23_level S y=3 := by omega exact Finset.mem_union.2 (Or.inl (Finset.mem_union.2 (Or.inr (Finset.mem_filter.2 ⟨by simpa only [hy3] using hyType,hylt⟩)))) · have hyCpos : 0 < gm_group S 2 (gm_rep (gm_A S) y) := by omega have hy3 : w23_level S y=3 := by by_contra hy3 have hy2 : w23_level S y=2 := by omega have ht := w23_gm_type_table S hq (by omega : 2 ≤ 2) ((w23_mem_X S 2 y).2 ⟨hyA,hy2⟩) hyn rcases ht with ⟨_,ht⟩ | ⟨hfalse,_⟩ | ⟨hfalse,_⟩ · have hz := (Finset.mem_filter.1 ht).2.2.2.1 omega · omega · omega have hyX3 := (w23_mem_X S 3 y).2 ⟨hyA,hy3⟩ by_cases hyC1 : gm_group S 2 (gm_rep (gm_A S) y)=1 · have hyB1 : gm_group S 1 (gm_rep (gm_A S) y)=1 := by omega exact Finset.mem_union.2 (Or.inr (Finset.mem_union.2 (Or.inl (Finset.mem_filter.2 ⟨hyX3,hyn,hyB1,hyC1,hyD0⟩)))) · have hyC2 : gm_group S 2 (gm_rep (gm_A S) y)=2 := by omega have hyB0 : gm_group S 1 (gm_rep (gm_A S) y)=0 := by omega exact Finset.mem_union.2 (Or.inr (Finset.mem_union.2 (Or.inr (Finset.mem_filter.2 ⟨hyX3,hyn,hyB0,hyC2,hyD0⟩)))) lemma gm_indices_disjoint (S : NumericalSemigroup) (j k : ℕ) (hjk : j ≠ k) : Disjoint (gm_indices S j) (gm_indices S k) := by classical apply Finset.disjoint_left.2 intro i hi hk have hi' : w23_level S (m3_enum (gm_A S) i)=j := by simpa [gm_indices] using hi have hk' : w23_level S (m3_enum (gm_A S) i)=k := by simpa [gm_indices] using hk omega lemma w23_gm_mixed_card (S : NumericalSemigroup) (hq : w23_q S = 4) : 3*((gm_h0 S).card+(gm_h1 S).card+(gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card) ≤ (w23_P S 2).card*((gm_type S 2 2 0 0).card+(gm_wlow S).card)+ ((w23_X S 1).card+(w23_P S 2).card+2)* ((gm_type S 3 1 1 0).card+(gm_type S 3 0 2 0).card) := by classical let I := gm_indices S 2 let J := gm_indices S 1 ∪ gm_indices S 2 let U0 := gm_type S 2 2 0 0 ∪ gm_wlow S let U1 := gm_type S 3 1 1 0 ∪ gm_type S 3 0 2 0 have hJ (alpha : Fin (gm_A S).card → ℕ) : (∑ i ∈ J, alpha i)=gm_group S 1 alpha+gm_group S 2 alpha := Finset.sum_union (gm_indices_disjoint S 1 2 (by omega)) have hU0 : U0 ⊆ gm_values S := by intro x hx rcases Finset.mem_union.1 hx with hb | hw · exact w23_gm_type_values S 2 2 0 0 hb · exact w23_gm_type_values S 3 2 0 0 (Finset.mem_filter.1 hw).1 have hU1 : U1 ⊆ gm_values S := Finset.union_subset (w23_gm_type_values S 3 1 1 0) (w23_gm_type_values S 3 0 2 0) have hH : gm_H S ⊆ gm_values S := fun x hx => (w23_gm_H_data S hq hx).1 have hd0 : ∀ x ∈ U0, (∑ i ∈ I, gm_rep (gm_A S) x i)=0 := by intro x hx rcases Finset.mem_union.1 hx with hb | hw · exact (Finset.mem_filter.1 hb).2.2.2.1 · exact (Finset.mem_filter.1 (Finset.mem_filter.1 hw).1).2.2.2.1 have hd1 : ∀ x ∈ U1, (∑ i ∈ J, gm_rep (gm_A S) x i)=2 := by intro x hx rw [hJ] rcases Finset.mem_union.1 hx with hx | hx <;> obtain ⟨_,_,hb,hc,_⟩ := Finset.mem_filter.1 hx <;> omega have hdH : ∀ x ∈ gm_H S, (∑ i ∈ J, gm_rep (gm_A S) x i)=3 ∧ 0 < ∑ i ∈ I, gm_rep (gm_A S) x i := by intro x hx rw [hJ] obtain ⟨_,_,hdeg,hpos,_⟩ := w23_gm_H_data S hq hx exact ⟨hdeg,hpos⟩ have hdis : Disjoint U0 U1 := by apply Finset.disjoint_left.2 intro x hx hy have hz := hd0 x hx change gm_group S 2 (gm_rep (gm_A S) x)=0 at hz rcases Finset.mem_union.1 hy with hy | hy <;> have hp := (Finset.mem_filter.1 hy).2.2.2.1 <;> omega have hh := w23_gm_restricted_mixed_shadow S hq I J (by exact Finset.subset_union_right) U0 U1 (gm_H S) hU0 hU1 hH hdis hd0 hd1 hdH (fun x hx i hi hp => w23_gm_H_parent S hq hx hi hp) have hI : I.card=(w23_P S 2).card := w23_gm_indices_card_P S hq 2 (by omega) (by omega) have hJcard : J.card=(w23_X S 1).card+(w23_P S 2).card := by rw [Finset.card_union_of_disjoint (gm_indices_disjoint S 1 2 (by omega)), w23_gm_indices_card_B S hq,w23_gm_indices_card_P S hq 2 (by omega) (by omega)] have hdis0 : Disjoint (gm_type S 2 2 0 0) (gm_wlow S) := by apply Finset.disjoint_left.2 intro x hx hy exact Finset.disjoint_left.1 (gm_type_disjoint S 2 2 0 0 3 2 0 0 (by omega)) hx (Finset.mem_filter.1 hy).1 have h0 : U0.card=(gm_type S 2 2 0 0).card+(gm_wlow S).card := Finset.card_union_of_disjoint hdis0 have h1 : U1.card=(gm_type S 3 1 1 0).card+(gm_type S 3 0 2 0).card := Finset.card_union_of_disjoint (gm_type_disjoint S 3 1 1 0 3 0 2 0 (by omega)) have hdisH : Disjoint (gm_type S 4 2 1 0 ∪ gm_type S 4 1 2 0) (gm_type S 4 0 3 0) := by rw [Finset.disjoint_union_left] exact ⟨gm_type_disjoint S 4 2 1 0 4 0 3 0 (by omega),gm_type_disjoint S 4 1 2 0 4 0 3 0 (by omega)⟩ have hHcard : (gm_H S).card=(gm_h0 S).card+(gm_h1 S).card+ (gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card := by rw [gm_H,Finset.card_union_of_disjoint hdisH, Finset.card_union_of_disjoint (gm_type_disjoint S 4 2 1 0 4 1 2 0 (by omega)),← gm_h_card S] rwa [hI,hJcard,h0,h1,hHcard] at hh lemma w23_gm_strip_lower_types (S : NumericalSemigroup) (hq : w23_q S = 4) {x : ℕ} (hx : x ∈ gm_type S 4 1 2 0 ∪ gm_type S 4 0 3 0 ∪ gm_type S 4 0 1 1) : S.conductor+S.multiplicity ≤ x+w23_rho S := by classical have hc := w23_q_mul_sub S rw [hq] at hc have hr := w23_rho_lt S rcases Finset.mem_union.1 hx with hx | hx · rcases Finset.mem_union.1 hx with hx | hx · have hV := w23_gm_type_values S 4 1 2 0 hx have hs := gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq hV) obtain ⟨_,_,hB,hC,hD⟩ := Finset.mem_filter.1 hx have hlo := w23_gm_group_lower S hq (gm_rep (gm_A S) x) rw [hB,hC,hD,hs.2] at hlo omega · have hV := w23_gm_type_values S 4 0 3 0 hx have hs := gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq hV) obtain ⟨_,_,hB,hC,hD⟩ := Finset.mem_filter.1 hx have hlo := w23_gm_group_lower S hq (gm_rep (gm_A S) x) rw [hB,hC,hD,hs.2] at hlo omega · have hV := w23_gm_type_values S 4 0 1 1 hx have hs := gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq hV) obtain ⟨_,_,hB,hC,hD⟩ := Finset.mem_filter.1 hx have hlo := w23_gm_group_lower S hq (gm_rep (gm_A S) x) rw [hB,hC,hD,hs.2] at hlo omega lemma w23_gm_h1_strip_lower (S : NumericalSemigroup) (hq : w23_q S = 4) {x : ℕ} (hx : x ∈ gm_h1 S) : S.conductor+S.multiplicity ≤ x+w23_rho S := by classical obtain ⟨hxtype,hbad⟩ := Finset.mem_filter.1 hx have hC := (Finset.mem_filter.1 hxtype).2.2.2.1 obtain ⟨i,hi,hpos⟩ := gm_positive_in_group (gm_indices S 2) (gm_rep (gm_A S) x) (by change 0 < gm_group S 2 (gm_rep (gm_A S) x); omega) have hp := w23_gm_BBC_parent S hq hxtype hi hpos let y := m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) change y=gm_piece S 1 (gm_rep (gm_A S) x) ∧ y ∈ gm_type S (w23_level S y) 2 0 0 ∧ 2 ≤ w23_level S y ∧ w23_level S y ≤ 3 ∧ x=y+m3_enum (gm_A S) i at hp have hiL : w23_level S (m3_enum (gm_A S) i)=2 := by simpa [gm_indices] using hi have haLo := ((w23_level_eq_iff S _ 2).1 hiL).1 have hc := w23_q_mul_sub S rw [hq] at hc omega lemma w23_gm_strip_card (S : NumericalSemigroup) (hq : w23_q S = 4) : (gm_type S 3 0 2 0).card+(gm_h1 S).card+(gm_type S 4 1 2 0).card+ (gm_type S 4 0 3 0).card+(gm_type S 4 0 1 1).card ≤ w23_rho S := by classical let R := gm_h1 S ∪ gm_type S 4 1 2 0 ∪ gm_type S 4 0 3 0 ∪ gm_type S 4 0 1 1 let F := (gm_type S 3 0 2 0).image (fun x => x+S.multiplicity) let hi := S.conductor+S.multiplicity let lo := hi-w23_rho S have hRaper : R ⊆ w23_apery S := by intro x hx simp only [R,Finset.mem_union] at hx rcases hx with ((hx | hx) | hx) | hx · exact ((w23_mem_X S 4 x).1 (Finset.mem_filter.1 (Finset.mem_filter.1 hx).1).1).1 · exact ((w23_mem_X S 4 x).1 (Finset.mem_filter.1 hx).1).1 · exact ((w23_mem_X S 4 x).1 (Finset.mem_filter.1 hx).1).1 · exact ((w23_mem_X S 4 x).1 (Finset.mem_filter.1 hx).1).1 have hRlo : ∀ x ∈ R, hi ≤ x+w23_rho S := by intro x hx simp only [R,Finset.mem_union] at hx rcases hx with ((hx | hx) | hx) | hx · exact w23_gm_h1_strip_lower S hq hx · exact w23_gm_strip_lower_types S hq (Finset.mem_union.2 (Or.inl (Finset.mem_union.2 (Or.inl hx)))) · exact w23_gm_strip_lower_types S hq (Finset.mem_union.2 (Or.inl (Finset.mem_union.2 (Or.inr hx)))) · exact w23_gm_strip_lower_types S hq (Finset.mem_union.2 (Or.inr hx)) have hRsub : R ⊆ Finset.Ico lo hi := by intro x hx have hlt := w23_apery_lt S (hRaper hx) have hlo := hRlo x hx exact Finset.mem_Ico.2 ⟨by dsimp [lo,hi] at *; omega,hlt⟩ have hFsub : F ⊆ Finset.Ico lo hi := by intro x hx obtain ⟨y,hy,rfl⟩ := Finset.mem_image.1 hx obtain ⟨hy3,hn,hB,hC,hD⟩ := Finset.mem_filter.1 hy have hV := w23_gm_type_values S 3 0 2 0 hy have hs := gm_rep_spec (gm_A S) y (w23_gm_values_repr S hq hV) have hlo := w23_gm_group_lower S hq (gm_rep (gm_A S) y) rw [hB,hC,hD,hs.2] at hlo have hlt : y < S.conductor := (w23_lt_conductor_iff S y).2 (by rw [((w23_mem_X S 3 y).1 hy3).2,hq] omega) have hc := w23_q_mul_sub S rw [hq] at hc exact Finset.mem_Ico.2 ⟨by dsimp [lo,hi]; omega,by dsimp [hi]; omega⟩ have hdis : Disjoint F R := by apply Finset.disjoint_left.2 intro x hx hr obtain ⟨y,hy,rfl⟩ := Finset.mem_image.1 hx have hyA := ((w23_mem_X S 3 y).1 (Finset.mem_filter.1 hy).1).1 have hyS := ((w23_mem_apery S y).1 hyA).2.1 exact ((w23_mem_apery S (y+S.multiplicity)).1 (hRaper hr)).2.2 ⟨y,hyS,rfl⟩ have hFcard : F.card=(gm_type S 3 0 2 0).card := by apply Finset.card_image_of_injOn intro x hx y hy he exact Nat.add_right_cancel he have hdis1 : Disjoint (gm_h1 S) (gm_type S 4 1 2 0) := by apply Finset.disjoint_left.2 intro x hx hy exact Finset.disjoint_left.1 (gm_type_disjoint S 4 2 1 0 4 1 2 0 (by omega)) (Finset.mem_filter.1 hx).1 hy have hdis2 : Disjoint (gm_h1 S ∪ gm_type S 4 1 2 0) (gm_type S 4 0 3 0) := by rw [Finset.disjoint_union_left] refine ⟨?_,gm_type_disjoint S 4 1 2 0 4 0 3 0 (by omega)⟩ apply Finset.disjoint_left.2 intro x hx hy exact Finset.disjoint_left.1 (gm_type_disjoint S 4 2 1 0 4 0 3 0 (by omega)) (Finset.mem_filter.1 hx).1 hy have hdis3 : Disjoint (gm_h1 S ∪ gm_type S 4 1 2 0 ∪ gm_type S 4 0 3 0) (gm_type S 4 0 1 1) := by simp only [Finset.disjoint_union_left] refine ⟨⟨?_,gm_type_disjoint S 4 1 2 0 4 0 1 1 (by omega)⟩, gm_type_disjoint S 4 0 3 0 4 0 1 1 (by omega)⟩ apply Finset.disjoint_left.2 intro x hx hy exact Finset.disjoint_left.1 (gm_type_disjoint S 4 2 1 0 4 0 1 1 (by omega)) (Finset.mem_filter.1 hx).1 hy have hRcard : R.card=(gm_h1 S).card+(gm_type S 4 1 2 0).card+ (gm_type S 4 0 3 0).card+(gm_type S 4 0 1 1).card := by rw [Finset.card_union_of_disjoint hdis3,Finset.card_union_of_disjoint hdis2, Finset.card_union_of_disjoint hdis1] have hbound := Finset.card_le_card (Finset.union_subset hFsub hRsub) rw [Finset.card_union_of_disjoint hdis,Nat.card_Ico,hFcard,hRcard] at hbound have hwidth : hi-lo=w23_rho S := by have hr := w23_rho_lt S dsimp [hi,lo] omega rw [hwidth] at hbound omega theorem w23_q4_gen_many_right (S : NumericalSemigroup) (h1 : 3*S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4*S.multiplicity) (he : (w23_X S 1).card ≤ 3*((@Finset.filter ℕ S.IsPrimitive (Classical.decPred _) (w23_X S 4)).card+ (@Finset.filter ℕ S.IsPrimitive (Classical.decPred _) (w23_X S 3)).card)+1) : S.SatisfiesWilf := by classical have hq := w23_q_eq_four S h1 h2 rw [n4_X_primitive_eq_P S 3 (by omega)] at he have hpq := w23_pq_eq_X_q_primitives S (by omega : S.multiplicity < S.conductor) rw [hq] at hpq rw [← hpq] at he obtain ⟨heq,hL,hm⟩ := w23_gm_general_counts S hq have hc := w23_q_mul_sub S rw [hq] at hc exact w23_gm_general_wilf_counts S (w23_X S 1).card (w23_P S 2).card (w23_P S 3).card (gm_type S 2 2 0 0).card (gm_type S 3 2 0 0).card (gm_type S 3 3 0 0).card (gm_type S 4 3 0 0).card (gm_type S 4 4 0 0).card (gm_type S 3 1 1 0).card (gm_type S 4 1 1 0).card (gm_type S 3 0 2 0).card (gm_type S 4 0 2 0).card (gm_h0 S).card (gm_h1 S).card (gm_type S 4 1 2 0).card (gm_type S 4 0 3 0).card (gm_type S 4 1 0 1).card (gm_type S 4 0 1 1).card (gm_wlow S).card (w23_pq S) (w23_rho S) (n4_right S).card (w23_gm_pure_pair_card S hq) (w23_gm_pure_triple_card S hq) (w23_gm_pure_left_triple_card S hq) (w23_gm_pure_quadruple_card S hq) (w23_gm_BC_card S hq) (w23_gm_CC_card S hq) (w23_gm_BD_card S hq) (w23_gm_CD_card S hq) (w23_gm_h0_card S hq) (w23_gm_mixed_card S hq) (w23_gm_strip_card S hq) (gm_wlow_card S) he (w23_gm_right_card S hq) heq hL hm hc.symm theorem col_cube_nonneg (C A B D J Z r s t : ℝ) (hr : 0 ≤ r ∧ r ≤ 1) (hs : 0 ≤ s ∧ s ≤ 1) (ht : 0 ≤ t ∧ t ≤ 1) (h000 : 0 ≤ C) (h100 : 0 ≤ C + A) (h010 : 0 ≤ C + B) (h001 : 0 ≤ C + D) (h110 : 0 ≤ C + A + B - J) (h101 : 0 ≤ C + A + D) (h011 : 0 ≤ C + B + D - Z) (h111 : 0 ≤ C + A + B + D - J - Z) : 0 ≤ C + A*r + B*s + D*t - J*min r s - Z*min s t := by rcases le_total r s with hrs | hsr · rcases le_total s t with hst | hts · rw [min_eq_left hrs, min_eq_left hst] have h0 := mul_nonneg (sub_nonneg.mpr ht.2) h000 have h1 := mul_nonneg (sub_nonneg.mpr hst) h001 have h2 := mul_nonneg (sub_nonneg.mpr hrs) h011 have h3 := mul_nonneg hr.1 h111 nlinarith · rcases le_total r t with hrt | htr · rw [min_eq_left hrs, min_eq_right hts] have h0 := mul_nonneg (sub_nonneg.mpr hs.2) h000 have h1 := mul_nonneg (sub_nonneg.mpr hts) h010 have h2 := mul_nonneg (sub_nonneg.mpr hrt) h011 have h3 := mul_nonneg hr.1 h111 nlinarith · rw [min_eq_left hrs, min_eq_right hts] have h0 := mul_nonneg (sub_nonneg.mpr hs.2) h000 have h1 := mul_nonneg (sub_nonneg.mpr hrs) h010 have h2 := mul_nonneg (sub_nonneg.mpr htr) h110 have h3 := mul_nonneg ht.1 h111 nlinarith · rcases le_total r t with hrt | htr · rw [min_eq_right hsr, min_eq_left (le_trans hsr hrt)] have h0 := mul_nonneg (sub_nonneg.mpr ht.2) h000 have h1 := mul_nonneg (sub_nonneg.mpr hrt) h001 have h2 := mul_nonneg (sub_nonneg.mpr hsr) h101 have h3 := mul_nonneg hs.1 h111 nlinarith · rcases le_total s t with hst | hts · rw [min_eq_right hsr, min_eq_left hst] have h0 := mul_nonneg (sub_nonneg.mpr hr.2) h000 have h1 := mul_nonneg (sub_nonneg.mpr htr) h100 have h2 := mul_nonneg (sub_nonneg.mpr hst) h101 have h3 := mul_nonneg hs.1 h111 nlinarith · rw [min_eq_right hsr, min_eq_right hts] have h0 := mul_nonneg (sub_nonneg.mpr hr.2) h000 have h1 := mul_nonneg (sub_nonneg.mpr hsr) h100 have h2 := mul_nonneg (sub_nonneg.mpr hts) h110 have h3 := mul_nonneg ht.1 h111 nlinarith theorem col_cube_lower (C A B D J Z r s t μ : ℝ) (hr : 0 ≤ r ∧ r ≤ 1) (hs : 0 ≤ s ∧ s ≤ 1) (ht : 0 ≤ t ∧ t ≤ 1) (h000 : μ ≤ C) (h100 : μ ≤ C + A) (h010 : μ ≤ C + B) (h001 : μ ≤ C + D) (h110 : μ ≤ C + A + B - J) (h101 : μ ≤ C + A + D) (h011 : μ ≤ C + B + D - Z) (h111 : μ ≤ C + A + B + D - J - Z) : μ ≤ C + A*r + B*s + D*t - J*min r s - Z*min s t := by have H := col_cube_nonneg (C-μ) A B D J Z r s t hr hs ht (by linarith) (by linarith) (by linarith) (by linarith) (by linarith) (by linarith) (by linarith) (by linarith) linarith theorem col_two_high_shadow_bound (l b₀ b₁ w₁ w₂ v₀ v₁ t₀ t₁ t₂ t₃ u₀ u₁ : ℝ) (hl : 1 ≤ l) (ht₀ : 0 ≤ t₀) (hw₁ : w₁ ≤ 2*l) (hw₂ : w₂ ≤ 3) (hT₀ : 3*(v₀+t₀) ≤ (l+2)*b₀) (hT₁ : 2*(v₁+t₁) ≤ (l+1)*(b₁+w₁)) (ht₂ : t₂ ≤ l*w₂) (ht₃ : 3*t₃ ≤ 4*w₂) (hu₀ : 4*u₀ ≤ (l+3)*v₀) (hu₁a : 3*u₁ ≤ (l+2)*v₁) (hu₁b : u₁ ≤ 2*v₀) : l^2 - 1 ≤ 3*(l+2)*(l+3) + (2*l+2)*(b₀+b₁) + (l-1)*(w₁+w₂+v₀+v₁) - 4*(t₀+t₁+t₂+t₃+u₀+u₁) := by have hlp : 0 < l+2 := by linarith have hA : 0 ≤ (l-1) * (2*v₀-u₁) := mul_nonneg (by linarith) (by linarith) have hB : 0 ≤ (l+3) * ((l+2)*v₁-3*u₁) := mul_nonneg (by linarith) (by linarith) have hC : 0 ≤ (l+2) * ((l+3)*v₀-4*u₀) := mul_nonneg (le_of_lt hlp) (by linarith) have hD : 0 ≤ (l-1)*t₀ := mul_nonneg (by linarith) ht₀ have hE : 0 ≤ (l+1)*((l+2)*b₀-3*(v₀+t₀)) := mul_nonneg (by linarith) (by linarith) have hF : 0 ≤ (l+2)*((l+1)*(b₁+w₁)-2*(v₁+t₁)) := mul_nonneg (le_of_lt hlp) (by linarith) have hshadow : 4*(t₀+t₁+u₀+u₁) - (l-1)*(v₀+v₁) ≤ 2*(l+1)*(b₀+b₁+w₁) := by have hmul : 0 ≤ (l+2) * (2*(l+1)*(b₀+b₁+w₁) - (4*(t₀+t₁+u₀+u₁) - (l-1)*(v₀+v₁))) := by nlinarith only [hA,hB,hC,hD,hE,hF] exact sub_nonneg.mp ((mul_nonneg_iff_of_pos_left hlp).mp hmul) have hg := mul_nonneg (show 0 ≤ 3*l+19/3 by linarith) (show 0 ≤ 3-w₂ by linarith) have hh := mul_nonneg (show 0 ≤ l+3 by linarith) (show 0 ≤ 2*l-w₁ by linarith) nlinarith only [hshadow,ht₂,ht₃,hg,hh] theorem col_caseA_cube_deficit (l h r s t : ℝ) (hl : 0 ≤ l) (hh : 3 ≤ h) (hr : 0 ≤ r ∧ r ≤ 1) (hs : 0 ≤ s ∧ s ≤ 1) (ht : 0 ≤ t ∧ t ≤ 1) : min 0 ((l+h+1)*(3*l*(l+1)-(l+h)*(l+h-1))/6) ≤ 3*(l+h)*(l+h+1) + ((2*(l+h)-2-4*(l+2)/3)*l*(l+1)/2)*r + ((l+h-3)*l*h)*s + ((l+h-3-4*(h+2)/3)*h*(h+1)/2)*t - (2*h*l*(l+1))*min r s - (2*l*h*(h+1))*min s t := by let F := (l+h+1)*(3*l*(l+1)-(l+h)*(l+h-1))/6 let C := 3*(l+h)*(l+h+1) let A := (2*(l+h)-2-4*(l+2)/3)*l*(l+1)/2 let B := (l+h-3)*l*h let D := (l+h-3-4*(h+2)/3)*h*(h+1)/2 let J := 2*h*l*(l+1) let Z := 2*l*h*(h+1) have hh0 : 0 ≤ h := by linarith have hK : 0 ≤ l+h-3 := by linarith have hA0 : 0 ≤ 2*(l+h)-2-4*(l+2)/3 := by linarith have hC : 0 ≤ C := by dsimp [C]; positivity have hA : 0 ≤ A := by dsimp [A]; positivity have hB : 0 ≤ B := by dsimp [B]; positivity have hF0 : min 0 F ≤ 0 := min_le_left _ _ have hFF : min 0 F ≤ F := min_le_right _ _ have h110 : 0 ≤ C+A+B-J := by have hid : C+A+B-J = (3*h^2*l+9*h^2+6*h*l+9*h+l^3+3*l^2+2*l)/3 := by dsimp [C,A,B,J]; ring rw [hid]; positivity have h101 : F ≤ C+A+D := by have hid : C+A+D-F = h*l*(h+l+7) := by dsimp [C,A,D,F]; ring have hnon : 0 ≤ h*l*(h+l+7) := by positivity linarith have h111 : C+A+B+D-J-Z = F := by dsimp [C,A,B,D,J,Z,F]; ring have h001 : min 0 F ≤ C+D := by rcases le_total l h with hlh | hhl · have hid : C+D-F = l*(3*h^2+18*h-l^2+6*l+7)/3 := by dsimp [C,D,F]; ring have hsquare : l^2 ≤ h^2 := by nlinarith have hinner : 0 ≤ 3*h^2+18*h-l^2+6*l+7 := by nlinarith [sq_nonneg h] have hnon : 0 ≤ l*(3*h^2+18*h-l^2+6*l+7)/3 := by positivity linarith · have hy : 0 ≤ l-h := sub_nonneg.mpr hhl have hid : 6*(C+D) = 2*h^3+57*h^2+19*h+18*(l-h)^2 +(3*h^2+75*h+18)*(l-h) := by dsimp [C,D]; ring have hnon : 0 ≤ 2*h^3+57*h^2+19*h+18*(l-h)^2 +(3*h^2+75*h+18)*(l-h) := by positivity linarith have h011 : min 0 F ≤ C+B+D-Z := by rcases le_total l h with hlh | hhl · have hid : C+B+D-Z-F = l*(l+1)*(3*h-l+7)/3 := by dsimp [C,B,D,Z,F]; ring have hinner : 0 ≤ 3*h-l+7 := by linarith have hnon : 0 ≤ l*(l+1)*(3*h-l+7)/3 := by positivity linarith · have hy : 0 ≤ l-h := sub_nonneg.mpr hhl have hid : 6*(C+B+D-Z) = 2*h^3+27*h^2+19*h +(6*h+18)*(l-h)^2+(9*h^2+45*h+18)*(l-h) := by dsimp [C,B,D,Z]; ring have hnon : 0 ≤ 2*h^3+27*h^2+19*h +(6*h+18)*(l-h)^2+(9*h^2+45*h+18)*(l-h) := by positivity linarith exact col_cube_lower C A B D J Z r s t (min 0 F) hr hs ht (by linarith) (by linarith) (by linarith) h001 (by linarith) (by linarith) h011 (by rw [h111]; exact hFF) theorem col_caseB_cube_nonneg (l h r s t : ℝ) (hh : 3 ≤ h) (hlh : h ≤ l) (hr : 0 ≤ r ∧ r ≤ 1) (hs : 0 ≤ s ∧ s ≤ 1) (ht : 0 ≤ t ∧ t ≤ 1) : 0 ≤ 3*(l+h)*(l+h+1) + (((h-2)*(h+3))*l*(l+1)/2)*r + ((l+h-3)*l*h)*s + ((l+h-3-4*(h+2)/3)*h*(h+1)/2)*t - (2*h*l*(l+1))*min r s - (2*l*h*(h+1))*min s t := by let C := 3*(l+h)*(l+h+1) let A := (h-2)*(h+3)*l*(l+1)/2 let B := (l+h-3)*l*h let D := (l+h-3-4*(h+2)/3)*h*(h+1)/2 let J := 2*h*l*(l+1) let Z := 2*l*h*(h+1) have hh0 : 0 ≤ h := by linarith have hl0 : 0 ≤ l := by linarith have hm2 : 0 ≤ h-2 := by linarith have hm1 : 0 ≤ h-1 := by linarith have hK : 0 ≤ l+h-3 := by linarith have hy : 0 ≤ l-h := sub_nonneg.mpr hlh have hC : 0 ≤ C := by dsimp [C]; positivity have hA : 0 ≤ A := by dsimp [A]; positivity have hB : 0 ≤ B := by dsimp [B]; positivity have h001 : 0 ≤ C+D := by have hid : 6*(C+D) = 2*h^3+57*h^2+19*h+18*(l-h)^2 +(3*h^2+75*h+18)*(l-h) := by dsimp [C,D]; ring have hnon : 0 ≤ 2*h^3+57*h^2+19*h+18*(l-h)^2 +(3*h^2+75*h+18)*(l-h) := by positivity linarith have h011 : 0 ≤ C+B+D-Z := by have hid : 6*(C+B+D-Z) = 2*h^3+27*h^2+19*h +(6*h+18)*(l-h)^2+(9*h^2+45*h+18)*(l-h) := by dsimp [C,B,D,Z]; ring have hnon : 0 ≤ 2*h^3+27*h^2+19*h +(6*h+18)*(l-h)^2+(9*h^2+45*h+18)*(l-h) := by positivity linarith have h110 : 0 ≤ C+A+B-J := by have hid : 2*(C+A+B-J) = h*((h-1)*l^2+3*(h+1)*l+6*(h+1)) := by dsimp [C,A,B,J]; ring have hnon : 0 ≤ h*((h-1)*l^2+3*(h+1)*l+6*(h+1)) := by positivity linarith have h111 : 0 ≤ C+A+B+D-J-Z := by have hid : 6*(C+A+B+D-J-Z) = h*(h-1)*(3*l^2-h-1) := by dsimp [C,A,B,D,J,Z]; ring have hinner : 0 ≤ 3*l^2-h-1 := by nlinarith have hnon : 0 ≤ h*(h-1)*(3*l^2-h-1) := by positivity linarith exact col_cube_nonneg C A B D J Z r s t hr hs ht hC (by linarith) (by linarith) h001 h110 (by linarith) h011 h111 theorem col_caseA_quartic (l h v₀ v₁ u₀ u₁ : ℝ) (hh : 3 ≤ h) (hv₁ : 0 ≤ v₁) (hcase : 2*(l+2) ≤ 3*h*(h-1)) (hu₀ : 4*u₀ ≤ (l+3)*v₀) (hu₁a : 3*u₁ ≤ (l+2)*v₁) (hu₁b : u₁ ≤ h*v₀) : 4*(u₀+u₁) ≤ (l+h+1)*(v₀+v₁) := by have hA := mul_nonneg (show 0 ≤ h-2 by linarith) (show 0 ≤ h*v₀-u₁ by linarith) have hB := mul_nonneg (show 0 ≤ h+2/3 by linarith) (show 0 ≤ (l+2)*v₁-3*u₁ by linarith) have hC := mul_nonneg (show 0 ≤ h by linarith) (show 0 ≤ (l+3)*v₀-4*u₀ by linarith) have hD := mul_nonneg (show 0 ≤ 3*h*(h-1)-2*(l+2) by linarith) hv₁ have hmul : 0 ≤ h*((l+h+1)*(v₀+v₁)-4*(u₀+u₁)) := by nlinarith only [hA,hB,hC,hD] exact sub_nonneg.mp ((mul_nonneg_iff_of_pos_left (show 0 < h by linarith)).mp hmul) theorem col_caseB_quartic (l h b₀ v₀ v₁ t₀ u₀ u₁ : ℝ) (hh : 3 ≤ h) (ht₀ : 0 ≤ t₀) (hcase : 3*h*(h-1) ≤ 2*(l+2)) (hT₀ : 3*(v₀+t₀) ≤ (l+2)*b₀) (hu₀ : 4*u₀ ≤ (l+3)*v₀) (hu₁a : 3*u₁ ≤ (l+2)*v₁) (hu₁b : u₁ ≤ h*v₀) : 4*(t₀+u₀+u₁)-(l+h-3)*(v₀+v₁) ≤ (2*(l+2)-h*(h-1))*b₀+4*v₁ := by have hprod : 0 ≤ (h-1)*(h-2) := mul_nonneg (by linarith) (by linarith) have hD : 0 ≤ l-3*h+5 := by nlinarith only [hcase,hprod] have hlh : h ≤ l := by nlinarith [sq_nonneg (h-3)] have hlp : 0 < l+2 := by linarith have hR : 0 ≤ 2*(l+2)-h*(h-1) := by nlinarith [hprod] have hA := mul_nonneg hD (show 0 ≤ h*v₀-u₁ by linarith) have hB := mul_nonneg (show 0 ≤ l+h+1 by linarith) (show 0 ≤ (l+2)*v₁-3*u₁ by linarith) have hC := mul_nonneg (le_of_lt hlp) (show 0 ≤ (l+3)*v₀-4*u₀ by linarith) have hE := mul_nonneg (show 0 ≤ 2*(l+2)-3*h*(h-1) by linarith) ht₀ have hF := mul_nonneg hR (show 0 ≤ (l+2)*b₀-3*(v₀+t₀) by linarith) have hmul : 0 ≤ (l+2)*((2*(l+2)-h*(h-1))*b₀+4*v₁ -(4*(t₀+u₀+u₁)-(l+h-3)*(v₀+v₁))) := by nlinarith only [hA,hB,hC,hE,hF] exact sub_nonneg.mp ((mul_nonneg_iff_of_pos_left hlp).mp hmul) theorem col_normalized_pair_bounds (l h b x d T U : ℝ) (hl : 0 < l) (hh : 0 < h) (hT₁ : T ≤ h*b) (hT₂ : 2*T ≤ (l+1)*x) (hU₁ : U ≤ l*d) (hU₂ : 2*U ≤ (h+1)*x) : T ≤ (h*l*(l+1)/2)*min (b/(l*(l+1)/2)) (x/(l*h)) ∧ U ≤ (l*h*(h+1)/2)*min (x/(l*h)) (d/(h*(h+1)/2)) := by have hlne : l ≠ 0 := ne_of_gt hl have hhne : h ≠ 0 := ne_of_gt hh have hl1ne : l+1 ≠ 0 := by positivity have hh1ne : h+1 ≠ 0 := by positivity have hid₁ : (h*l*(l+1)/2)*(b/(l*(l+1)/2)) = h*b := by field_simp have hid₂ : (h*l*(l+1)/2)*(x/(l*h)) = (l+1)*x/2 := by field_simp have hid₃ : (l*h*(h+1)/2)*(x/(l*h)) = (h+1)*x/2 := by field_simp have hid₄ : (l*h*(h+1)/2)*(d/(h*(h+1)/2)) = l*d := by field_simp constructor · rw [mul_min_of_nonneg _ _ (show 0 ≤ h*l*(l+1)/2 by positivity),hid₁,hid₂] exact le_min hT₁ (by linarith) · rw [mul_min_of_nonneg _ _ (show 0 ≤ l*h*(h+1)/2 by positivity),hid₃,hid₄] exact le_min (by linarith) hU₁ theorem col_colored_shadow_deficit (l h b₀ b₁ w₁ w₂ v₀ v₁ t₀ t₁ t₂ t₃ u₀ u₁ : ℝ) (hl : 0 < l) (hh : 3 ≤ h) (hb₀ : 0 ≤ b₀) (hb₁ : 0 ≤ b₁) (hw₁ : 0 ≤ w₁) (hw₂ : 0 ≤ w₂) (hv₁ : 0 ≤ v₁) (ht₀ : 0 ≤ t₀) (hcap₀ : b₀ ≤ l*(l+1)/2) (hcap₁ : b₁+w₁ ≤ l*h) (hcap₂ : w₂ ≤ h*(h+1)/2) (hT₀ : 3*(v₀+t₀) ≤ (l+2)*b₀) (hT₁a : v₁+t₁ ≤ h*b₀) (hT₁b : 2*(v₁+t₁) ≤ (l+1)*(b₁+w₁)) (hT₂a : t₂ ≤ l*w₂) (hT₂b : 2*t₂ ≤ (h+1)*(b₁+w₁)) (hT₃ : 3*t₃ ≤ (h+2)*w₂) (hu₀ : 4*u₀ ≤ (l+3)*v₀) (hu₁a : 3*u₁ ≤ (l+2)*v₁) (hu₁b : u₁ ≤ h*v₀) : min 0 ((l+h+1)*(3*l*(l+1)-(l+h)*(l+h-1))/6) ≤ 3*(l+h)*(l+h+1)+(2*(l+h)-2)*(b₀+b₁) +(l+h-3)*(w₁+w₂+v₀+v₁)-4*(t₀+t₁+t₂+t₃+u₀+u₁) := by let r := b₀/(l*(l+1)/2) let s := (b₁+w₁)/(l*h) let t := w₂/(h*(h+1)/2) have hhpos : 0 < h := by linarith have hl0 : 0 ≤ l := le_of_lt hl have hh0 : 0 ≤ h := le_of_lt hhpos have hlne : l ≠ 0 := ne_of_gt hl have hhne : h ≠ 0 := ne_of_gt hhpos have hl1ne : l+1 ≠ 0 := by positivity have hh1ne : h+1 ≠ 0 := by positivity have hr : 0 ≤ r ∧ r ≤ 1 := by dsimp [r]; constructor · positivity · exact (div_le_one (by positivity)).mpr hcap₀ have hs : 0 ≤ s ∧ s ≤ 1 := by dsimp [s]; constructor · positivity · exact (div_le_one (by positivity)).mpr hcap₁ have ht : 0 ≤ t ∧ t ≤ 1 := by dsimp [t]; constructor · positivity · exact (div_le_one (by positivity)).mpr hcap₂ have hnorm := col_normalized_pair_bounds l h b₀ (b₁+w₁) w₂ (v₁+t₁) t₂ hl hhpos hT₁a hT₁b hT₂a hT₂b change v₁+t₁ ≤ (h*l*(l+1)/2)*min r s ∧ t₂ ≤ (l*h*(h+1)/2)*min s t at hnorm have hBnorm : ((l+h-3)*l*h)*s = (l+h-3)*(b₁+w₁) := by dsimp [s]; field_simp have hDnorm : ((l+h-3-4*(h+2)/3)*h*(h+1)/2)*t = (l+h-3-4*(h+2)/3)*w₂ := by dsimp [t]; field_simp have hextra := mul_nonneg (show 0 ≤ l+h+1 by positivity) hb₁ rcases le_total (2*(l+2)) (3*h*(h-1)) with hcase | hcase · have hquartic := col_caseA_quartic l h v₀ v₁ u₀ u₁ hh hv₁ hcase hu₀ hu₁a hu₁b have hcube := col_caseA_cube_deficit l h r s t hl0 hh hr hs ht have hAnorm : ((2*(l+h)-2-4*(l+2)/3)*l*(l+1)/2)*r = (2*(l+h)-2-4*(l+2)/3)*b₀ := by dsimp [r]; field_simp rw [hAnorm,hBnorm,hDnorm] at hcube nlinarith only [hquartic,hcube,hT₀,hT₃,hextra,hnorm.1,hnorm.2] · have hquartic := col_caseB_quartic l h b₀ v₀ v₁ t₀ u₀ u₁ hh ht₀ hcase hT₀ hu₀ hu₁a hu₁b have hlh : h ≤ l := by nlinarith [sq_nonneg (h-3)] have hcube := col_caseB_cube_nonneg l h r s t hh hlh hr hs ht have hAnorm : (((h-2)*(h+3))*l*(l+1)/2)*r = (h-2)*(h+3)*b₀ := by dsimp [r]; field_simp rw [hAnorm,hBnorm,hDnorm] at hcube have hμ := min_le_left (0 : ℝ) ((l+h+1)*(3*l*(l+1)-(l+h)*(l+h-1))/6) nlinarith only [hquartic,hcube,hT₃,hextra,hnorm.1,hnorm.2,hμ] theorem col_colored_shadow_population (l h b₀ b₁ w₁ w₂ v₀ v₁ t₀ t₁ t₂ t₃ u₀ u₁ : ℝ) (hl : 0 < l) (hh : 3 ≤ h) (hb₀ : 0 ≤ b₀) (hb₁ : 0 ≤ b₁) (hw₁ : 0 ≤ w₁) (hw₂ : 0 ≤ w₂) (hv₁ : 0 ≤ v₁) (ht₀ : 0 ≤ t₀) (hcap₀ : b₀ ≤ l*(l+1)/2) (hcap₁ : b₁+w₁ ≤ l*h) (hcap₂ : w₂ ≤ h*(h+1)/2) (hT₀ : 3*(v₀+t₀) ≤ (l+2)*b₀) (hT₁a : v₁+t₁ ≤ h*b₀) (hT₁b : 2*(v₁+t₁) ≤ (l+1)*(b₁+w₁)) (hT₂a : t₂ ≤ l*w₂) (hT₂b : 2*t₂ ≤ (h+1)*(b₁+w₁)) (hT₃ : 3*t₃ ≤ (h+2)*w₂) (hu₀ : 4*u₀ ≤ (l+3)*v₀) (hu₁a : 3*u₁ ≤ (l+2)*v₁) (hu₁b : u₁ ≤ h*v₀) (hpop : (l+h)*(l+h-1) ≤ 3*l*(l+1)) : 0 ≤ 3*(l+h)*(l+h+1)+(2*(l+h)-2)*(b₀+b₁) +(l+h-3)*(w₁+w₂+v₀+v₁)-4*(t₀+t₁+t₂+t₃+u₀+u₁) := by have hF : 0 ≤ (l+h+1)*(3*l*(l+1)-(l+h)*(l+h-1))/6 := div_nonneg (mul_nonneg (by linarith) (by linarith)) (by norm_num) have H := col_colored_shadow_deficit l h b₀ b₁ w₁ w₂ v₀ v₁ t₀ t₁ t₂ t₃ u₀ u₁ hl hh hb₀ hb₁ hw₁ hw₂ hv₁ ht₀ hcap₀ hcap₁ hcap₂ hT₀ hT₁a hT₁b hT₂a hT₂b hT₃ hu₀ hu₁a hu₁b simpa only [min_eq_left hF] using H theorem col_zero_one_high_certificate (K b w v u j₀ j₁ j₂ j₃ : ℝ) (hj₀ : 0 ≤ j₀) (hj₁ : 0 ≤ j₁) (hwrap : j₃ ≤ w) (hpair : 2*(b+w) ≤ K*(K+1)) (hlow : 3*v+3*j₀+2*j₁+j₂ ≤ (K+2)*b) (hhigh : j₁+2*j₂+3*j₃ ≤ (K+2)*w) (hquartic : 4*u ≤ (K+3)*v) : 0 ≤ 3*K*(K+1)+(2*K-2)*b+(K-3)*(w+v) -4*(j₀+j₁+j₂+j₃+u) := by nlinarith only [hj₀,hj₁,hwrap,hpair,hlow,hhigh,hquartic] theorem col_general_profile_comparison (a k z b w wlow v t u x y f d H₀ H₁ j g r s ρ : ℝ) (hBC : x+y ≤ a*k) (hCC : 2*(f+d) ≤ k*(k+1)) (hBD : r ≤ a*z) (hCD : s ≤ k*z) (hgood : H₀ ≤ k*b) (hshadow : 3*(H₀+H₁+j+g) ≤ k*(b+wlow)+(a+k+2)*(x+f)) (hstrip : f+H₁+j+g+s ≤ ρ) : 3*a*(a+1)+(2*a-2)*b+(a-3)*(w+v)-4*(t+u) +(a*k-x)+k*(w-wlow+v)+z*(1+z+2*b+w+v+x+f) ≤ ρ+(1+a+k+z)*(3*a+2*k+z+2*b+w+v+x+f) -4*(b+w+v+t+u+x+y+f+d+H₀+H₁+j+g+r+s) := by nlinarith only [hBC,hCC,hBD,hCD,hgood,hshadow,hstrip] noncomputable def col_H (S : NumericalSemigroup) : Finset (Fin (gm_A S).card) := by classical exact (gm_indices S 1).filter (fun i => 3*S.multiplicity ≤ 2*m3_enum (gm_A S) i+w23_rho S) noncomputable def col_L (S : NumericalSemigroup) : Finset (Fin (gm_A S).card) := gm_indices S 1 \ col_H S noncomputable def col_highdeg (S : NumericalSemigroup) (alpha : Fin (gm_A S).card → ℕ) : ℕ := ∑ i ∈ col_H S, alpha i noncomputable def col_lowdeg (S : NumericalSemigroup) (alpha : Fin (gm_A S).card → ℕ) : ℕ := ∑ i ∈ col_L S, alpha i lemma w23_col_degrees (S : NumericalSemigroup) (alpha : Fin (gm_A S).card → ℕ) : col_lowdeg S alpha+col_highdeg S alpha = gm_group S 1 alpha := by classical exact Finset.sum_sdiff (Finset.filter_subset _ _) (f := alpha) lemma w23_col_indices_cards (S : NumericalSemigroup) (hq : w23_q S = 4) : (col_H S).card = ((w23_X S 1).filter (fun a => 3*S.multiplicity ≤ 2*a+w23_rho S)).card ∧ (col_L S).card = ((w23_X S 1).filter (fun a => 2*a+w23_rho S < 3*S.multiplicity)).card ∧ (col_L S).card+(col_H S).card = (w23_X S 1).card := by classical have hH : (col_H S).card = ((w23_X S 1).filter (fun a => 3*S.multiplicity ≤ 2*a+w23_rho S)).card := by apply Finset.card_bij (fun i _ => m3_enum (gm_A S) i) · intro i hi obtain ⟨hiB,hiH⟩ := Finset.mem_filter.1 hi have hiX : m3_enum (gm_A S) i ∈ w23_X S 1 := by rw [← w23_gm_generators_B S hq] exact Finset.mem_filter.2 ⟨m3_enum_mem _ i,by simpa [gm_indices] using hiB⟩ exact Finset.mem_filter.2 ⟨hiX,hiH⟩ · intro i hi j hj he exact gm_enum_injective _ he · intro a ha obtain ⟨haX,haH⟩ := Finset.mem_filter.1 ha have haGen : a ∈ gm_generators S 1 := by rw [w23_gm_generators_B S hq]; exact haX have haA : a ∈ gm_A S := (Finset.mem_filter.1 haGen).1 obtain ⟨i,hi⟩ := m3_enum_surjective (gm_A S) a haA refine ⟨i,Finset.mem_filter.2 ⟨?_,by simpa [hi] using haH⟩,hi⟩ have hl := ((w23_mem_X S 1 a).1 haX).2 simp [gm_indices,hi,hl] have hsum : (col_L S).card+(col_H S).card = (w23_X S 1).card := by rw [col_L,Finset.card_sdiff_add_card_eq_card (show col_H S ⊆ gm_indices S 1 from Finset.filter_subset _ _),w23_gm_indices_card_B S hq] have hparts := Finset.card_filter_add_card_filter_not (s := w23_X S 1) (fun a => 3*S.multiplicity ≤ 2*a+w23_rho S) have hnot : ((w23_X S 1).filter (fun a => ¬ 3*S.multiplicity ≤ 2*a+w23_rho S)) = ((w23_X S 1).filter (fun a => 2*a+w23_rho S < 3*S.multiplicity)) := by ext a; simp only [Finset.mem_filter,not_le] rw [hnot] at hparts exact ⟨hH,by omega,hsum⟩ noncomputable def col_type (S : NumericalSemigroup) (j d h : ℕ) : Finset ℕ := by classical exact (gm_type S j d 0 0).filter (fun x => col_highdeg S (gm_rep (gm_A S) x) = h) noncomputable def col_all (S : NumericalSemigroup) (d h : ℕ) : Finset ℕ := col_type S d d h ∪ col_type S (d+1) d h lemma w23_col_type_spec (S : NumericalSemigroup) (hq : w23_q S = 4) {j d h x : ℕ} (hx : x ∈ col_type S j d h) : x ∈ gm_type S j d 0 0 ∧ col_highdeg S (gm_rep (gm_A S) x) = h ∧ col_lowdeg S (gm_rep (gm_A S) x)+h = d ∧ h ≤ d := by classical obtain ⟨hxt,hhigh⟩ := Finset.mem_filter.1 hx have hB := (Finset.mem_filter.1 hxt).2.2.1 have hc := w23_col_degrees S (gm_rep (gm_A S) x) exact ⟨hxt,hhigh,by omega,by omega⟩ lemma w23_col_all_spec (S : NumericalSemigroup) (hq : w23_q S = 4) {d h x : ℕ} (hx : x ∈ col_all S d h) : x ∈ gm_type S (w23_level S x) d 0 0 ∧ (w23_level S x = d ∨ w23_level S x = d+1) ∧ col_highdeg S (gm_rep (gm_A S) x) = h ∧ col_lowdeg S (gm_rep (gm_A S) x)+h = d ∧ h ≤ d := by classical rcases Finset.mem_union.1 hx with hx | hx · have hs := w23_col_type_spec S hq hx have hl := ((w23_mem_X S d x).1 (Finset.mem_filter.1 hs.1).1).2 exact ⟨by simpa [hl] using hs.1,Or.inl hl,hs.2⟩ · have hs := w23_col_type_spec S hq hx have hl := ((w23_mem_X S (d+1) x).1 (Finset.mem_filter.1 hs.1).1).2 exact ⟨by simpa [hl] using hs.1,Or.inr hl,hs.2⟩ lemma w23_col_all_values (S : NumericalSemigroup) (d h : ℕ) : col_all S d h ⊆ gm_values S := by classical intro x hx rcases Finset.mem_union.1 hx with hx | hx <;> exact w23_gm_type_values S _ _ 0 0 (Finset.mem_filter.1 hx).1 lemma w23_col_parent (S : NumericalSemigroup) (hq : w23_q S = 4) {d h x : ℕ} (hd : 3 ≤ d) (hx : x ∈ col_all S d h) {i : Fin (gm_A S).card} (hi : i ∈ gm_indices S 1) (hp : 0 < gm_rep (gm_A S) x i) : let y := m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) y ∈ col_all S (d-1) (h-(if i ∈ col_H S then 1 else 0)) ∧ col_highdeg S (gm_rep (gm_A S) y)+(if i ∈ col_H S then 1 else 0) = h ∧ w23_level S y+1 ≤ w23_level S x := by classical let y := m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) have hs := w23_col_all_spec S hq hx have hv := w23_col_all_values S d h hx have hy := w23_gm_parent_pure S hq (w23_level S x) d hd hs.1 hi hp change y ∈ gm_type S (w23_level S y) (d-1) 0 0 ∧ d-1 ≤ w23_level S y ∧ w23_level S y+1 ≤ w23_level S x at hy have hrep := (w23_gm_values_parent S hq hv i hp).2 change m3_parent (gm_rep (gm_A S) x) i = gm_rep (gm_A S) y at hrep have hcolor := gm_group_parent (col_H S) (gm_rep (gm_A S) x) i hp change col_highdeg S (m3_parent (gm_rep (gm_A S) x) i)+ (if i ∈ col_H S then 1 else 0) = col_highdeg S (gm_rep (gm_A S) x) at hcolor rw [hrep,hs.2.2.1] at hcolor have hcol : col_highdeg S (gm_rep (gm_A S) y) = h-(if i ∈ col_H S then 1 else 0) := by omega have hj : w23_level S y=d-1 ∨ w23_level S y=(d-1)+1 := by omega refine ⟨?_,hcolor,hy.2.2⟩ rcases hj with hj | hj · apply Finset.mem_union.2; left exact Finset.mem_filter.2 ⟨by simpa [hj] using hy.1,hcol⟩ · apply Finset.mem_union.2; right exact Finset.mem_filter.2 ⟨by simpa [hj] using hy.1,hcol⟩ lemma w23_col_high_shadow (S : NumericalSemigroup) (hq : w23_q S = 4) (d h : ℕ) (hd : 2 ≤ d) : (h+1)*(col_all S (d+1) (h+1)).card ≤ ((col_H S).card+h)*(col_all S d h).card := by classical apply w23_gm_restricted_shadow S hq (col_H S) _ _ h (w23_col_all_values S d h) (w23_col_all_values S (d+1) (h+1)) · intro x hx; exact (w23_col_all_spec S hq hx).2.2.1 · intro x hx; exact (w23_col_all_spec S hq hx).2.2.1 · intro x hx i hi hp have hiB := (Finset.mem_filter.1 hi).1 have ht := w23_col_parent S hq (by omega : 3 ≤ d+1) hx hiB hp simpa only [if_pos hi,Nat.add_sub_cancel,Nat.add_sub_cancel_right] using ht.1 lemma w23_col_low_shadow (S : NumericalSemigroup) (hq : w23_q S = 4) (d h : ℕ) (hd : 2 ≤ d) (hh : h ≤ d) : (d-h+1)*(col_all S (d+1) h).card ≤ ((col_L S).card+(d-h))*(col_all S d h).card := by classical apply w23_gm_restricted_shadow S hq (col_L S) _ _ (d-h) (w23_col_all_values S d h) (w23_col_all_values S (d+1) h) · intro x hx have hs := w23_col_all_spec S hq hx change col_lowdeg S (gm_rep (gm_A S) x) = d-h omega · intro x hx have hs := w23_col_all_spec S hq hx change col_lowdeg S (gm_rep (gm_A S) x) = d-h+1 omega · intro x hx i hi hp obtain ⟨hiB,hiH⟩ := Finset.mem_sdiff.1 hi have ht := w23_col_parent S hq (by omega : 3 ≤ d+1) hx hiB hp simpa only [if_neg hiH,Nat.sub_zero,Nat.add_sub_cancel] using ht.1 lemma w23_col_pure_support (S : NumericalSemigroup) (hq : w23_q S = 4) (alpha : Fin (gm_A S).card → ℕ) (hC : gm_group S 2 alpha = 0) (hD : gm_group S 3 alpha = 0) {i : Fin (gm_A S).card} (hi : 0 < alpha i) : i ∈ gm_indices S 1 := by classical rcases w23_gm_enum_levels S hq i with h1 | h2 | h3 · simp [gm_indices,h1] · have hz := w23_gm_group_zero S 2 alpha hC h2 omega · have hz := w23_gm_group_zero S 3 alpha hD h3 omega lemma w23_col_type_degree (S : NumericalSemigroup) (hq : w23_q S = 4) {j d h x : ℕ} (hx : x ∈ col_type S j d h) : m3_degree (gm_rep (gm_A S) x) = d ∧ m3_value (m3_enum (gm_A S)) (gm_rep (gm_A S) x) = x := by classical have ht := (w23_col_type_spec S hq hx).1 obtain ⟨_,_,hB,hC,hD⟩ := Finset.mem_filter.1 ht have hs := gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq (w23_gm_type_values S j d 0 0 ht)) have hdeg := w23_gm_group_degree S hq (gm_rep (gm_A S) x) exact ⟨by omega,hs.2⟩ lemma w23_col_lower (S : NumericalSemigroup) (hq : w23_q S = 4) (alpha : Fin (gm_A S).card → ℕ) (hC : gm_group S 2 alpha = 0) (hD : gm_group S 3 alpha = 0) : (2*S.multiplicity+2)*col_lowdeg S alpha+3*S.multiplicity*col_highdeg S alpha ≤ 2*m3_value (m3_enum (gm_A S)) alpha+w23_rho S*col_highdeg S alpha := by classical have hcoord (i : Fin (gm_A S).card) : (if i ∈ col_L S then (2*S.multiplicity+2)*alpha i else 0)+ (if i ∈ col_H S then 3*S.multiplicity*alpha i else 0) ≤ 2*(alpha i*m3_enum (gm_A S) i)+w23_rho S*(if i ∈ col_H S then alpha i else 0) := by by_cases hz : alpha i = 0 · simp [hz] · have hiB := w23_col_pure_support S hq alpha hC hD (by omega : 0 < alpha i) have ha := w23_gm_A_bounds S (m3_enum_mem (gm_A S) i) by_cases hiH : i ∈ col_H S · have hiL : i ∉ col_L S := by simp [col_L,hiH] have hb := (Finset.mem_filter.1 hiH).2 have hh := Nat.mul_le_mul_right (alpha i) hb simp only [if_neg hiL,if_pos hiH,zero_add] nlinarith only [hh] · have hiL : i ∈ col_L S := Finset.mem_sdiff.2 ⟨hiB,hiH⟩ have hh := Nat.mul_le_mul_right (alpha i) (show S.multiplicity+1 ≤ m3_enum (gm_A S) i by omega) simp only [if_pos hiL,if_neg hiH,add_zero,mul_zero] nlinarith only [hh] have hh := Finset.sum_le_sum (fun i (_ : i ∈ Finset.univ) => hcoord i) simpa only [col_lowdeg,col_highdeg,m3_value,Finset.sum_filter,Finset.sum_add_distrib, ← Finset.mul_sum,Finset.sum_ite_mem,Finset.univ_inter,mul_ite,mul_zero] using hh lemma w23_col_zero_high_upper (S : NumericalSemigroup) (hq : w23_q S = 4) (alpha : Fin (gm_A S).card → ℕ) (hC : gm_group S 2 alpha = 0) (hD : gm_group S 3 alpha = 0) (hH : col_highdeg S alpha = 0) : 2*m3_value (m3_enum (gm_A S)) alpha+(w23_rho S+1)*m3_degree alpha ≤ 3*S.multiplicity*m3_degree alpha := by classical have hcoord (i : Fin (gm_A S).card) : 2*(alpha i*m3_enum (gm_A S) i)+(w23_rho S+1)*alpha i ≤ 3*S.multiplicity*alpha i := by by_cases hz : alpha i = 0 · simp [hz] · have hiB := w23_col_pure_support S hq alpha hC hD (by omega : 0 < alpha i) have hiH : i ∉ col_H S := by intro hiH have hh := Finset.single_le_sum (fun j hj => Nat.zero_le (alpha j)) hiH change alpha i ≤ col_highdeg S alpha at hh omega have ha : 2*m3_enum (gm_A S) i+w23_rho S < 3*S.multiplicity := by by_contra hn exact hiH (Finset.mem_filter.2 ⟨hiB,by omega⟩) have hh := Nat.mul_le_mul_right (alpha i) (show 2*m3_enum (gm_A S) i+w23_rho S+1 ≤ 3*S.multiplicity by omega) nlinarith only [hh] have hh := Finset.sum_le_sum (fun i (_ : i ∈ Finset.univ) => hcoord i) simpa only [m3_value,m3_degree,Finset.sum_add_distrib,← Finset.mul_sum] using hh lemma w23_col_low_no_two_high (S : NumericalSemigroup) (hq : w23_q S = 4) {d h x : ℕ} (hx : x ∈ col_type S d d h) : h ≤ 1 := by classical have hs := w23_col_type_spec S hq hx have ht := Finset.mem_filter.1 hs.1 have hl := ((w23_level_eq_iff S x d).1 ((w23_mem_X S d x).1 ht.1).2).2 have hb := w23_col_lower S hq (gm_rep (gm_A S) x) ht.2.2.2.1 ht.2.2.2.2 rw [(w23_col_type_degree S hq hx).2,hs.2.1] at hb have hr := w23_rho_lt S by_contra hn have hh : 2 ≤ h := by omega have hmul := Nat.mul_le_mul_left (S.multiplicity-w23_rho S) hh have he : S.multiplicity-w23_rho S+w23_rho S=S.multiplicity := Nat.sub_add_cancel (by omega) nlinarith [hs.2.2.1] lemma w23_col_wrapped_not_zero (S : NumericalSemigroup) (hq : w23_q S = 4) {x : ℕ} (hx : x ∈ col_type S 3 2 0) : False := by classical have hs := w23_col_type_spec S hq hx have ht := Finset.mem_filter.1 hs.1 have hl := ((w23_level_eq_iff S x 3).1 ((w23_mem_X S 3 x).1 ht.1).2).1 have hb := w23_col_zero_high_upper S hq (gm_rep (gm_A S) x) ht.2.2.2.1 ht.2.2.2.2 hs.2.1 rw [(w23_col_type_degree S hq hx).1,(w23_col_type_degree S hq hx).2] at hb omega lemma w23_col_next_empty (S : NumericalSemigroup) (hq : w23_q S = 4) (d h : ℕ) (hd : 4 ≤ d) : col_type S (d+1) d h = ∅ := by classical apply Finset.eq_empty_iff_forall_notMem.2 intro x hx have ht := (w23_col_type_spec S hq hx).1 have hX := (Finset.mem_filter.1 ht).1 have hl := w23_level_apery_le S ((w23_mem_X S (d+1) x).1 hX).1 rw [((w23_mem_X S (d+1) x).1 hX).2,hq] at hl omega lemma w23_col_quad_shadow (S : NumericalSemigroup) (hq : w23_q S = 4) (h : ℕ) (hh : h ≤ 3) : (4-h)*(col_type S 4 4 h).card ≤ ((col_L S).card+(3-h))*(col_type S 3 3 h).card ∧ (h+1)*(col_type S 4 4 (h+1)).card ≤ ((col_H S).card+h)*(col_type S 3 3 h).card := by classical have hlow := w23_col_low_shadow S hq 3 h (by omega) hh have hhigh := w23_col_high_shadow S hq 3 h (by omega) have hparent : ∀ hc, ∀ x ∈ col_type S 4 4 hc, ∀ i ∈ gm_indices S 1, 0 < gm_rep (gm_A S) x i → let y := m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) y ∈ col_type S 3 3 (hc-(if i ∈ col_H S then 1 else 0)) := by intro hc x hx i hi hp have ht := w23_col_parent S hq (by omega : 3 ≤ 4) (Finset.mem_union.2 (Or.inl hx) : x ∈ col_all S 4 hc) hi hp have hs := w23_col_all_spec S hq ht.1 have hlx := ((w23_mem_X S 4 x).1 (Finset.mem_filter.1 (Finset.mem_filter.1 hx).1).1).2 have hly : w23_level S (m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i)) = 3 := by omega exact Finset.mem_filter.2 ⟨by simpa only [hly] using hs.1,hs.2.2.1⟩ constructor · have he : 3-h+1=4-h := by omega rw [← he] apply w23_gm_restricted_shadow S hq (col_L S) _ _ (3-h) (fun x hx => w23_gm_type_values S 3 3 0 0 (Finset.mem_filter.1 hx).1) (fun x hx => w23_gm_type_values S 4 4 0 0 (Finset.mem_filter.1 hx).1) · intro x hx; have hs := w23_col_type_spec S hq hx change col_lowdeg S (gm_rep (gm_A S) x)=3-h; omega · intro x hx; have hs := w23_col_type_spec S hq hx change col_lowdeg S (gm_rep (gm_A S) x)=3-h+1; omega · intro x hx i hi hp obtain ⟨hiB,hiH⟩ := Finset.mem_sdiff.1 hi simpa only [col_type,if_neg hiH,Nat.sub_zero] using hparent h x hx i hiB hp · apply w23_gm_restricted_shadow S hq (col_H S) _ _ h (fun x hx => w23_gm_type_values S 3 3 0 0 (Finset.mem_filter.1 hx).1) (fun x hx => w23_gm_type_values S 4 4 0 0 (Finset.mem_filter.1 hx).1) · intro x hx; exact (w23_col_type_spec S hq hx).2.1 · intro x hx; exact (w23_col_type_spec S hq hx).2.1 · intro x hx i hi hp simpa only [col_type,if_pos hi,Nat.add_sub_cancel] using hparent (h+1) x hx i (Finset.mem_filter.1 hi).1 hp noncomputable def col_generators (S : NumericalSemigroup) (high : Bool) : Finset ℕ := (if high then col_H S else col_L S).image (m3_enum (gm_A S)) lemma w23_col_generator_card (S : NumericalSemigroup) (high : Bool) : (col_generators S high).card = (if high then (col_H S).card else (col_L S).card) := by classical unfold col_generators rw [Finset.card_image_of_injective _ (gm_enum_injective _)] split <;> rfl lemma col_pair_group {k : ℕ} (J : Finset (Fin k)) (i j : Fin k) : (∑ a ∈ J, m3_pairVector i j a) = (if i ∈ J then 1 else 0)+(if j ∈ J then 1 else 0) := by classical rw [m3_pairVector,gm_group_unitAdd,gm_group_unitAdd] simp [Nat.add_comm] lemma w23_col_pair_same_subset (S : NumericalSemigroup) (hq : w23_q S = 4) (high : Bool) : col_all S 2 (if high then 2 else 0) ⊆ 2 • col_generators S high := by classical intro x hx have hs := w23_col_all_spec S hq hx have hr := gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq (w23_col_all_values S _ _ hx)) have ht := Finset.mem_filter.1 hs.1 have hdg := w23_gm_group_degree S hq (gm_rep (gm_A S) x) have hd : m3_degree (gm_rep (gm_A S) x) = 2 := by omega have hv : m3_value (m3_enum (gm_A S)) (gm_rep (gm_A S) x) ∈ m3_degree (gm_rep (gm_A S) x) • col_generators S high := by apply gm_value_supported intro i hi have hiB := w23_col_pure_support S hq _ ht.2.2.2.1 ht.2.2.2.2 hi have hiJ : i ∈ (if high then col_H S else col_L S) := by cases high with | false => simp only [Bool.false_eq_true,ite_false] have hiH : i ∉ col_H S := by intro hiH have hh := Finset.single_le_sum (fun j hj => Nat.zero_le (gm_rep (gm_A S) x j)) hiH change gm_rep (gm_A S) x i ≤ col_highdeg S (gm_rep (gm_A S) x) at hh simp only [Bool.false_eq_true,ite_false] at hs omega exact Finset.mem_sdiff.2 ⟨hiB,hiH⟩ | true => simp only [ite_true] by_contra hiH have hiL : i ∈ col_L S := Finset.mem_sdiff.2 ⟨hiB,hiH⟩ have hh := Finset.single_le_sum (fun j hj => Nat.zero_le (gm_rep (gm_A S) x j)) hiL change gm_rep (gm_A S) x i ≤ col_lowdeg S (gm_rep (gm_A S) x) at hh simp only [ite_true] at hs omega exact Finset.mem_image.2 ⟨i,hiJ,rfl⟩ rwa [hr.2,hd] at hv lemma w23_col_pair_mixed_subset (S : NumericalSemigroup) (hq : w23_q S = 4) : col_all S 2 1 ⊆ col_generators S false+col_generators S true := by classical intro x hx have hs := w23_col_all_spec S hq hx have ht := Finset.mem_filter.1 hs.1 have hr := gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq (w23_col_all_values S _ _ hx)) have hdg := w23_gm_group_degree S hq (gm_rep (gm_A S) x) have hd : m3_degree (gm_rep (gm_A S) x)=2 := by omega obtain ⟨i,j,hij,he⟩ := m3_degree_two_repr (gm_rep (gm_A S) x) hd have hi : 0 < gm_rep (gm_A S) x i := by rw [he]; simp [m3_pairVector,m3_unitAdd] have hj : 0 < gm_rep (gm_A S) x j := by rw [he]; simp [m3_pairVector,m3_unitAdd] have hiB := w23_col_pure_support S hq _ ht.2.2.2.1 ht.2.2.2.2 hi have hjB := w23_col_pure_support S hq _ ht.2.2.2.1 ht.2.2.2.2 hj have hc := hs.2.2.1 rw [he] at hc change (∑ a ∈ col_H S, m3_pairVector i j a)=1 at hc rw [col_pair_group] at hc have hv : m3_enum (gm_A S) i+m3_enum (gm_A S) j=x := by rw [he,oh_pair_value] at hr exact hr.2 by_cases hiH : i ∈ col_H S · have hjH : j ∉ col_H S := by intro hjH; simp [hiH,hjH] at hc have hiG : m3_enum (gm_A S) i ∈ col_generators S true := Finset.mem_image.2 ⟨i,hiH,rfl⟩ have hjG : m3_enum (gm_A S) j ∈ col_generators S false := Finset.mem_image.2 ⟨j,Finset.mem_sdiff.2 ⟨hjB,hjH⟩,rfl⟩ exact Finset.mem_add.2 ⟨_,hjG,_,hiG,by omega⟩ · have hjH : j ∈ col_H S := by by_contra hjH; simp [hiH,hjH] at hc have hiG : m3_enum (gm_A S) i ∈ col_generators S false := Finset.mem_image.2 ⟨i,Finset.mem_sdiff.2 ⟨hiB,hiH⟩,rfl⟩ have hjG : m3_enum (gm_A S) j ∈ col_generators S true := Finset.mem_image.2 ⟨j,hjH,rfl⟩ exact Finset.mem_add.2 ⟨_,hiG,_,hjG,hv⟩ lemma w23_col_pair_caps (S : NumericalSemigroup) (hq : w23_q S = 4) : 2*(col_all S 2 0).card ≤ (col_L S).card*((col_L S).card+1) ∧ (col_all S 2 1).card ≤ (col_L S).card*(col_H S).card ∧ 2*(col_all S 2 2).card ≤ (col_H S).card*((col_H S).card+1) := by have h0 := Finset.card_le_card (w23_col_pair_same_subset S hq false) have h2 := Finset.card_le_card (w23_col_pair_same_subset S hq true) have h1 := Finset.card_le_card (w23_col_pair_mixed_subset S hq) have hc0 := ns_card_succ_nsmul_le (col_generators S false) 1 have hc2 := ns_card_succ_nsmul_le (col_generators S true) 1 simp only [Nat.reduceAdd,one_nsmul,w23_col_generator_card,Bool.false_eq_true,ite_false,ite_true] at * have hcm := w23_card_add_le (col_generators S false) (col_generators S true) rw [w23_col_generator_card,w23_col_generator_card] at hcm exact ⟨by nlinarith,by simpa using h1.trans hcm,by nlinarith⟩ lemma w23_col_all_card (S : NumericalSemigroup) (d h : ℕ) : (col_all S d h).card = (col_type S d d h).card+(col_type S (d+1) d h).card := by classical unfold col_all apply Finset.card_union_of_disjoint exact Finset.disjoint_of_subset_left (Finset.filter_subset _ _) (Finset.disjoint_of_subset_right (Finset.filter_subset _ _) (gm_type_disjoint S d d 0 0 (d+1) d 0 0 (by omega))) lemma w23_col_low_high_empty (S : NumericalSemigroup) (hq : w23_q S = 4) (d h : ℕ) (hh : 2 ≤ h) : col_type S d d h = ∅ := by classical apply Finset.eq_empty_iff_forall_notMem.2 intro x hx have ht := w23_col_low_no_two_high S hq hx omega lemma w23_col_wrap_zero_empty (S : NumericalSemigroup) (hq : w23_q S = 4) : col_type S 3 2 0=∅ := by classical exact Finset.eq_empty_iff_forall_notMem.2 (fun x hx => w23_col_wrapped_not_zero S hq hx) lemma w23_col_partition (S : NumericalSemigroup) (hq : w23_q S = 4) (j d : ℕ) : ∑ h ∈ Finset.range (d+1), (col_type S j d h).card = (gm_type S j d 0 0).card := by classical simp only [col_type] rw [Finset.sum_card_fiberwise_eq_card_filter] congr 1 apply Finset.filter_true_of_mem intro x hx have hB := (Finset.mem_filter.1 hx).2.2.1 have hd := w23_col_degrees S (gm_rep (gm_A S) x) simp only [Finset.mem_range] omega lemma w23_col_partitions (S : NumericalSemigroup) (hq : w23_q S = 4) : (gm_type S 2 2 0 0).card = (col_type S 2 2 0).card+(col_type S 2 2 1).card ∧ (gm_type S 3 2 0 0).card = (col_type S 3 2 1).card+(col_type S 3 2 2).card ∧ (gm_type S 3 3 0 0).card = (col_type S 3 3 0).card+(col_type S 3 3 1).card ∧ (gm_type S 4 3 0 0).card = (col_type S 4 3 0).card+(col_type S 4 3 1).card+ (col_type S 4 3 2).card+(col_type S 4 3 3).card ∧ (gm_type S 4 4 0 0).card = (col_type S 4 4 0).card+(col_type S 4 4 1).card := by have h2 := w23_col_partition S hq 2 2 have hw := w23_col_partition S hq 3 2 have hv := w23_col_partition S hq 3 3 have ht := w23_col_partition S hq 4 3 have hu := w23_col_partition S hq 4 4 simp only [Finset.sum_range_succ,Finset.sum_range_zero,zero_add, w23_col_low_high_empty S hq 2 2 (by omega), w23_col_low_high_empty S hq 3 2 (by omega),w23_col_low_high_empty S hq 3 3 (by omega), w23_col_low_high_empty S hq 4 2 (by omega),w23_col_low_high_empty S hq 4 3 (by omega), w23_col_low_high_empty S hq 4 4 (by omega),w23_col_wrap_zero_empty S hq, Finset.card_empty,add_zero] at h2 hw hv ht hu exact ⟨h2.symm,hw.symm,hv.symm,ht.symm,hu.symm⟩ lemma w23_col_shadows (S : NumericalSemigroup) (hq : w23_q S = 4) : 2*(col_type S 2 2 0).card ≤ (col_L S).card*((col_L S).card+1) ∧ (col_type S 2 2 1).card+(col_type S 3 2 1).card ≤ (col_L S).card*(col_H S).card ∧ 2*(col_type S 3 2 2).card ≤ (col_H S).card*((col_H S).card+1) ∧ 3*((col_type S 3 3 0).card+(col_type S 4 3 0).card) ≤ ((col_L S).card+2)*(col_type S 2 2 0).card ∧ (col_type S 3 3 1).card+(col_type S 4 3 1).card ≤ (col_H S).card*(col_type S 2 2 0).card ∧ 2*((col_type S 3 3 1).card+(col_type S 4 3 1).card) ≤ ((col_L S).card+1)*((col_type S 2 2 1).card+(col_type S 3 2 1).card) ∧ (col_type S 4 3 2).card ≤ (col_L S).card*(col_type S 3 2 2).card ∧ 2*(col_type S 4 3 2).card ≤ ((col_H S).card+1)*((col_type S 2 2 1).card+(col_type S 3 2 1).card) ∧ 3*(col_type S 4 3 3).card ≤ ((col_H S).card+2)*(col_type S 3 2 2).card ∧ 4*(col_type S 4 4 0).card ≤ ((col_L S).card+3)*(col_type S 3 3 0).card ∧ 3*(col_type S 4 4 1).card ≤ ((col_L S).card+2)*(col_type S 3 3 1).card ∧ (col_type S 4 4 1).card ≤ (col_H S).card*(col_type S 3 3 0).card := by have hc := w23_col_pair_caps S hq have h00 := w23_col_low_shadow S hq 2 0 (by omega) (by omega) have h10 := w23_col_high_shadow S hq 2 0 (by omega) have h11 := w23_col_low_shadow S hq 2 1 (by omega) (by omega) have h21 := w23_col_low_shadow S hq 2 2 (by omega) (by omega) have h22 := w23_col_high_shadow S hq 2 1 (by omega) have h33 := w23_col_high_shadow S hq 2 2 (by omega) have hu0 := (w23_col_quad_shadow S hq 0 (by omega)).1 have hu1 := (w23_col_quad_shadow S hq 1 (by omega)).1 have huH := (w23_col_quad_shadow S hq 0 (by omega)).2 simp only [w23_col_all_card,Nat.reduceAdd,Nat.reduceSub, w23_col_low_high_empty S hq 2 2 (by omega), w23_col_low_high_empty S hq 3 2 (by omega),w23_col_low_high_empty S hq 3 3 (by omega), w23_col_wrap_zero_empty S hq,Finset.card_empty,add_zero,zero_add,one_mul,mul_one] at * exact ⟨hc.1,hc.2.1,hc.2.2,h00,h10,h11,h21,h22,h33,hu0,hu1,huH⟩ theorem col_one_high_shadow_nonneg (l b₀ b₁ w₁ w₂ v₀ v₁ t₀ t₁ t₂ t₃ u₀ u₁ : ℝ) (hl : 2 ≤ l) (hb₁ : 0 ≤ b₁) (ht₀ : 0 ≤ t₀) (hcap₀ : 2*b₀ ≤ l*(l+1)) (hcap₂ : w₂ ≤ 1) (hT₀ : 3*(v₀+t₀) ≤ (l+2)*b₀) (hT₁a : v₁+t₁ ≤ b₀) (hT₁b : 2*(v₁+t₁) ≤ (l+1)*(b₁+w₁)) (ht₂ : t₂ ≤ l*w₂) (ht₃ : t₃ ≤ w₂) (hu₀ : 4*u₀ ≤ (l+3)*v₀) (hu₁a : 3*u₁ ≤ (l+2)*v₁) (hu₁b : u₁ ≤ v₀) : 0 ≤ 3*(l+1)*(l+2)+2*l*(b₀+b₁)+(l-2)*(w₁+w₂+v₀+v₁) -4*(t₀+t₁+t₂+t₃+u₀+u₁) := by have hA := mul_nonneg (show 0 ≤ 3*(l+2) by linarith) (show 0 ≤ l*(l+1)-2*b₀ by linarith) have hB := mul_nonneg (show 0 ≤ 3*(l+2)*(l+1) by positivity) (show 0 ≤ 1-w₂ by linarith) have hC := mul_nonneg (show 0 ≤ 2*(l+1) by linarith) (show 0 ≤ (l+2)*b₀-3*(v₀+t₀) by linarith) have hD := mul_nonneg (show 0 ≤ 2*(l+4) by linarith) (show 0 ≤ b₀-v₁-t₁ by linarith) have hE := mul_nonneg (show 0 ≤ l-2 by linarith) (show 0 ≤ (l+1)*(b₁+w₁)-2*(v₁+t₁) by linarith) have hF := mul_nonneg (show 0 ≤ 4*(l+1) by linarith) (show 0 ≤ l*w₂-t₂ by linarith) have hG := mul_nonneg (show 0 ≤ 4*(l+1) by linarith) (show 0 ≤ w₂-t₃ by linarith) have hH := mul_nonneg (show 0 ≤ l+1 by linarith) (show 0 ≤ (l+3)*v₀-4*u₀ by linarith) have hI := mul_nonneg (show 0 ≤ l+1 by linarith) (show 0 ≤ (l+2)*v₁-3*u₁ by linarith) have hJ := mul_nonneg (show 0 ≤ l+1 by linarith) (show 0 ≤ v₀-u₁ by linarith) have hK := mul_nonneg (show 0 ≤ (l+1)*(l+2) by positivity) hb₁ have hN := mul_nonneg (show 0 ≤ 2*(l+1) by linarith) ht₀ have hm : 0 ≤ (l+1)*(3*(l+1)*(l+2)+2*l*(b₀+b₁)+(l-2)*(w₁+w₂+v₀+v₁) -4*(t₀+t₁+t₂+t₃+u₀+u₁)) := by nlinarith only [hA,hB,hC,hD,hE,hF,hG,hH,hI,hJ,hK,hN] exact (mul_nonneg_iff_of_pos_left (show 0 < l+1 by linarith)).1 hm noncomputable def col_surplus (S : NumericalSemigroup) : ℝ := 3*((w23_X S 1).card : ℝ)*((w23_X S 1).card+1)+ (2*((w23_X S 1).card : ℝ)-2)*(gm_type S 2 2 0 0).card+ (((w23_X S 1).card : ℝ)-3)*((gm_type S 3 2 0 0).card+(gm_type S 3 3 0 0).card)- 4*((gm_type S 4 3 0 0).card+(gm_type S 4 4 0 0).card) lemma w23_col_surplus_eq (S : NumericalSemigroup) (hq : w23_q S = 4) : col_surplus S = 3*((col_L S).card+(col_H S).card : ℝ)*((col_L S).card+(col_H S).card+1)+ (2*((col_L S).card+(col_H S).card : ℝ)-2)*((col_type S 2 2 0).card+(col_type S 2 2 1).card)+ (((col_L S).card+(col_H S).card : ℝ)-3)* ((col_type S 3 2 1).card+(col_type S 3 2 2).card+(col_type S 3 3 0).card+(col_type S 3 3 1).card)- 4*((col_type S 4 3 0).card+(col_type S 4 3 1).card+(col_type S 4 3 2).card+ (col_type S 4 3 3).card+(col_type S 4 4 0).card+(col_type S 4 4 1).card) := by have hc := (w23_col_indices_cards S hq).2.2 obtain ⟨hb,hw,hv,ht,hu⟩ := w23_col_partitions S hq unfold col_surplus rw [← hc,hb,hw,hv,ht,hu] push_cast ring lemma col_nat_population (l h b0 b1 w1 w2 v0 v1 t0 t1 t2 t3 u0 u1 : ℕ) (hcap0 : 2*b0 ≤ l*(l+1)) (hcap1 : b1+w1 ≤ l*h) (hcap2 : 2*w2 ≤ h*(h+1)) (hT0 : 3*(v0+t0) ≤ (l+2)*b0) (hT1a : v1+t1 ≤ h*b0) (hT1b : 2*(v1+t1) ≤ (l+1)*(b1+w1)) (hT2a : t2 ≤ l*w2) (hT2b : 2*t2 ≤ (h+1)*(b1+w1)) (hT3 : 3*t3 ≤ (h+2)*w2) (hu0 : 4*u0 ≤ (l+3)*v0) (hu1a : 3*u1 ≤ (l+2)*v1) (hu1b : u1 ≤ h*v0) (hpop : (l+h)*(l+h-1) ≤ 3*l*(l+1)) : 0 ≤ 3*((l : ℝ)+h)*(l+h+1)+(2*((l : ℝ)+h)-2)*((b0 : ℝ)+b1)+ ((l : ℝ)+h-3)*((w1 : ℝ)+w2+v0+v1)-4*((t0 : ℝ)+t1+t2+t3+u0+u1) := by let L : ℝ := l let H : ℝ := h let B0 : ℝ := b0 let B1 : ℝ := b1 let W1 : ℝ := w1 let W2 : ℝ := w2 let V0 : ℝ := v0 let V1 : ℝ := v1 let T0 : ℝ := t0 let T1 : ℝ := t1 let T2 : ℝ := t2 let T3 : ℝ := t3 let U0 : ℝ := u0 let U1 : ℝ := u1 have nL : 0 ≤ L := by positivity have nH : 0 ≤ H := by positivity have nB0 : 0 ≤ B0 := by positivity have nB1 : 0 ≤ B1 := by positivity have nW1 : 0 ≤ W1 := by positivity have nW2 : 0 ≤ W2 := by positivity have nV0 : 0 ≤ V0 := by positivity have nV1 : 0 ≤ V1 := by positivity have nT0 : 0 ≤ T0 := by positivity have nT1 : 0 ≤ T1 := by positivity have nT2 : 0 ≤ T2 := by positivity have nT3 : 0 ≤ T3 := by positivity have nU0 : 0 ≤ U0 := by positivity have nU1 : 0 ≤ U1 := by positivity have rcap0 : 2*B0 ≤ L*(L+1) := by dsimp only [L,H,B0,B1,W1,W2,V0,V1,T0,T1,T2,T3,U0,U1]; exact_mod_cast hcap0 have rcap1 : B1+W1 ≤ L*H := by dsimp only [L,H,B0,B1,W1,W2,V0,V1,T0,T1,T2,T3,U0,U1]; exact_mod_cast hcap1 have rcap2 : 2*W2 ≤ H*(H+1) := by dsimp only [L,H,B0,B1,W1,W2,V0,V1,T0,T1,T2,T3,U0,U1]; exact_mod_cast hcap2 have rT0 : 3*(V0+T0) ≤ (L+2)*B0 := by dsimp only [L,H,B0,B1,W1,W2,V0,V1,T0,T1,T2,T3,U0,U1]; exact_mod_cast hT0 have rT1a : V1+T1 ≤ H*B0 := by dsimp only [L,H,B0,B1,W1,W2,V0,V1,T0,T1,T2,T3,U0,U1]; exact_mod_cast hT1a have rT1b : 2*(V1+T1) ≤ (L+1)*(B1+W1) := by dsimp only [L,H,B0,B1,W1,W2,V0,V1,T0,T1,T2,T3,U0,U1]; exact_mod_cast hT1b have rT2a : T2 ≤ L*W2 := by dsimp only [L,H,B0,B1,W1,W2,V0,V1,T0,T1,T2,T3,U0,U1]; exact_mod_cast hT2a have rT2b : 2*T2 ≤ (H+1)*(B1+W1) := by dsimp only [L,H,B0,B1,W1,W2,V0,V1,T0,T1,T2,T3,U0,U1]; exact_mod_cast hT2b have rT3 : 3*T3 ≤ (H+2)*W2 := by dsimp only [L,H,B0,B1,W1,W2,V0,V1,T0,T1,T2,T3,U0,U1]; exact_mod_cast hT3 have ru0 : 4*U0 ≤ (L+3)*V0 := by dsimp only [L,H,B0,B1,W1,W2,V0,V1,T0,T1,T2,T3,U0,U1]; exact_mod_cast hu0 have ru1a : 3*U1 ≤ (L+2)*V1 := by dsimp only [L,H,B0,B1,W1,W2,V0,V1,T0,T1,T2,T3,U0,U1]; exact_mod_cast hu1a have ru1b : U1 ≤ H*V0 := by dsimp only [L,H,B0,B1,W1,W2,V0,V1,T0,T1,T2,T3,U0,U1]; exact_mod_cast hu1b change 0 ≤ 3*(L+H)*(L+H+1)+(2*(L+H)-2)*(B0+B1)+(L+H-3)*(W1+W2+V0+V1)-4*(T0+T1+T2+T3+U0+U1) by_cases hh0 : h=0 · have hH : H=0 := by simp [H,hh0] simp only [hH] at * have zB1 : B1=0 := by nlinarith only [rcap1,nB1,nW1] have zW1 : W1=0 := by nlinarith only [rcap1,nB1,nW1] have zW2 : W2=0 := by nlinarith only [rcap2,nW2] have zV1 : V1=0 := by nlinarith only [rT1a,nV1,nT1] have zT1 : T1=0 := by nlinarith only [rT1a,nV1,nT1] have zT2 : T2=0 := by nlinarith only [rT2b,nT2,zB1,zW1] have zT3 : T3=0 := by nlinarith only [rT3,nT3,zW2] have zU1 : U1=0 := by nlinarith only [ru1b,nU1] simp only [zB1,zW1,zW2,zV1,zT1,zT2,zT3,zU1] at * nlinarith only [rcap0,rT0,ru0,nT0] · by_cases hh1 : h=1 · have hH : H=1 := by simp [H,hh1] simp only [hH] at * by_cases hl2 : 2 ≤ l · have hL : 2 ≤ L := by dsimp only [L,H,B0,B1,W1,W2,V0,V1,T0,T1,T2,T3,U0,U1]; exact_mod_cast hl2 have Hproof := col_one_high_shadow_nonneg L B0 B1 W1 W2 V0 V1 T0 T1 T2 T3 U0 U1 hL nB1 nT0 rcap0 (by linarith only [rcap2]) rT0 (by simpa using rT1a) rT1b rT2a (by linarith only [rT3]) ru0 ru1a (by simpa using ru1b) nlinarith only [Hproof] · have hlcases : l=0 ∨ l=1 := by omega rcases hlcases with hl0 | hl1 · have hL : L=0 := by simp [L,hl0] simp only [hL] at * nlinarith only [rcap0,rcap1,rcap2,rT0,rT1a,rT1b,rT2a,rT3,ru0,ru1a,ru1b, nB0,nB1,nW1,nV0,nV1,nT0,nT1,nT2,nU0,nU1] · have hL : L=1 := by simp [L,hl1] simp only [hL] at * nlinarith only [rcap0,rcap1,rcap2,rT0,rT1a,rT1b,rT2a,rT3,ru0,ru1a,ru1b,nB1,nT0] · have hK : 1 ≤ l+h := by omega have rpop : (L+H)*(L+H-1) ≤ 3*L*(L+1) := by have hp : (((l+h)*(l+h-1) : ℕ) : ℝ) ≤ ((3*l*(l+1) : ℕ) : ℝ) := by exact_mod_cast hpop simpa only [Nat.cast_mul,Nat.cast_add,Nat.cast_sub hK,Nat.cast_one,Nat.cast_ofNat,L,H] using hp by_cases hh2 : h=2 · have hH : H=2 := by simp [H,hh2] simp only [hH] at * have hl1 : 1 ≤ l := by by_contra hn have hl0 : l=0 := by omega simp [hh2,hl0] at hpop have hL : 1 ≤ L := by dsimp only [L,H,B0,B1,W1,W2,V0,V1,T0,T1,T2,T3,U0,U1]; exact_mod_cast hl1 have Hproof := col_two_high_shadow_bound L B0 B1 W1 W2 V0 V1 T0 T1 T2 T3 U0 U1 hL nT0 (by nlinarith only [rcap1,nB1]) (by linarith only [rcap2]) rT0 rT1b rT2a (by nlinarith only [rT3]) ru0 ru1a (by simpa using ru1b) nlinarith only [Hproof,hL] · have hh3 : 3 ≤ h := by omega have hlpos : 0 < l := by by_contra hn have hl0 : l=0 := by omega have hp := hpop simp only [hl0,zero_add,zero_mul,mul_zero] at hp have hsub : h-1+1=h := by omega nlinarith only [hp,hsub,hh3] have hL : 0 < L := by dsimp only [L,H,B0,B1,W1,W2,V0,V1,T0,T1,T2,T3,U0,U1]; exact_mod_cast hlpos have hH : 3 ≤ H := by dsimp only [L,H,B0,B1,W1,W2,V0,V1,T0,T1,T2,T3,U0,U1]; exact_mod_cast hh3 exact col_colored_shadow_population L H B0 B1 W1 W2 V0 V1 T0 T1 T2 T3 U0 U1 hL hH nB0 nB1 nW1 nW2 nV1 nT0 (by linarith only [rcap0]) rcap1 (by linarith only [rcap2]) rT0 rT1a rT1b rT2a rT2b rT3 ru0 ru1a ru1b rpop lemma w23_col_surplus_nonneg (S : NumericalSemigroup) (hq : w23_q S = 4) (hpop : (w23_X S 1).card*((w23_X S 1).card-1) ≤ 3*((w23_X S 1).filter (fun a => 2*a+w23_rho S < 3*S.multiplicity)).card* (((w23_X S 1).filter (fun a => 2*a+w23_rho S < 3*S.multiplicity)).card+1)) : 0 ≤ col_surplus S := by classical have hc := w23_col_indices_cards S hq have hp : ((col_L S).card+(col_H S).card)*((col_L S).card+(col_H S).card-1) ≤ 3*(col_L S).card*((col_L S).card+1) := by rw [hc.2.2,hc.2.1] exact hpop obtain ⟨h0,h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11⟩ := w23_col_shadows S hq have H := col_nat_population (col_L S).card (col_H S).card (col_type S 2 2 0).card (col_type S 2 2 1).card (col_type S 3 2 1).card (col_type S 3 2 2).card (col_type S 3 3 0).card (col_type S 3 3 1).card (col_type S 4 3 0).card (col_type S 4 3 1).card (col_type S 4 3 2).card (col_type S 4 3 3).card (col_type S 4 4 0).card (col_type S 4 4 1).card h0 h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 h11 hp rw [w23_col_surplus_eq S hq] convert H using 1 <;> push_cast <;> ring lemma col_general_wilf_counts (S : NumericalSemigroup) (a k z b w wlow v t u x y f d H0 H1 j g r s p rho R : ℕ) (hBC : x+y ≤ a*k) (hCC : 2*(f+d) ≤ k*(k+1)) (hBD : r ≤ a*z) (hCD : s ≤ k*z) (hgood : H0 ≤ k*b) (hshadow : 3*(H0+H1+j+g) ≤ k*(b+wlow)+(a+k+2)*(x+f)) (hstrip : f+H1+j+g+s ≤ rho) (hlow : wlow ≤ w) (hpure : 0 ≤ 3*(a : ℝ)*(a+1)+(2*(a : ℝ)-2)*b+ ((a : ℝ)-3)*((w : ℝ)+v)-4*((t : ℝ)+u)) (hR : R ≤ t+u+y+d+H0+H1+j+g+r+s) (he : S.embeddingDimension=1+a+k+z+p) (hL : S.leftCount=4+3*a+2*k+z+2*b+w+v+x+f) (hm : S.multiplicity=S.embeddingDimension+b+w+v+x+f+R) (hc : S.conductor+rho=4*S.multiplicity) : S.SatisfiesWilf := by have rBC : (x : ℝ)+y ≤ (a : ℝ)*k := by exact_mod_cast hBC have rCC : 2*((f : ℝ)+d) ≤ (k : ℝ)*(k+1) := by exact_mod_cast hCC have rBD : (r : ℝ) ≤ (a : ℝ)*z := by exact_mod_cast hBD have rCD : (s : ℝ) ≤ (k : ℝ)*z := by exact_mod_cast hCD have rgood : (H0 : ℝ) ≤ (k : ℝ)*b := by exact_mod_cast hgood have rshadow : 3*((H0 : ℝ)+H1+j+g) ≤ (k : ℝ)*((b : ℝ)+wlow)+ ((a : ℝ)+k+2)*((x : ℝ)+f) := by exact_mod_cast hshadow have rstrip : (f : ℝ)+H1+j+g+s ≤ (rho : ℝ) := by exact_mod_cast hstrip have H := col_general_profile_comparison (a : ℝ) k z b w wlow v t u x y f d H0 H1 j g r s rho rBC rCC rBD rCD rgood rshadow rstrip have ha : 0 ≤ (a : ℝ)*k-x := by have hy : 0 ≤ (y : ℝ) := by positivity nlinarith only [rBC,hy] have hw : 0 ≤ (w : ℝ)-wlow+v := by have hwl : (wlow : ℝ) ≤ (w : ℝ) := by exact_mod_cast hlow have hv : 0 ≤ (v : ℝ) := by positivity linarith only [hwl,hv] have hk := mul_nonneg (Nat.cast_nonneg (α := ℝ) k) hw have hz : 0 ≤ (z : ℝ)*(1+(z : ℝ)+2*(b : ℝ)+w+v+x+f) := by positivity have hT : 0 ≤ 3*(a : ℝ)+2*k+z+2*b+w+v+x+f := by positivity have hP := mul_nonneg (Nat.cast_nonneg (α := ℝ) p) hT have rR : (R : ℝ) ≤ (t : ℝ)+u+y+d+H0+H1+j+g+r+s := by exact_mod_cast hR have hcountR : 4*((b : ℝ)+w+v+x+f+R) ≤ (1+(a : ℝ)+k+z+p)*(3*(a : ℝ)+2*k+z+2*b+w+v+x+f)+rho := by nlinarith only [H,hpure,ha,hk,hz,hP,rR] have hcount : 4*(b+w+v+x+f+R) ≤ (1+a+k+z+p)*(3*a+2*k+z+2*b+w+v+x+f)+rho := by exact_mod_cast hcountR unfold NumericalSemigroup.SatisfiesWilf rw [he] at hm rw [he,hL] nlinarith only [hm,hc,hcount] theorem w23_q4_gen_lowpop (S : NumericalSemigroup) (h1 : 3*S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4*S.multiplicity) (hpop : (w23_X S 1).card*((w23_X S 1).card-1) ≤ 3*((w23_X S 1).filter (fun a => 2*a+w23_rho S < 3*S.multiplicity)).card* (((w23_X S 1).filter (fun a => 2*a+w23_rho S < 3*S.multiplicity)).card+1)) : S.SatisfiesWilf := by classical have hq := w23_q_eq_four S h1 h2 obtain ⟨he,hL,hm⟩ := w23_gm_general_counts S hq have hc := w23_q_mul_sub S rw [hq] at hc apply col_general_wilf_counts S (w23_X S 1).card (w23_P S 2).card (w23_P S 3).card (gm_type S 2 2 0 0).card (gm_type S 3 2 0 0).card (gm_wlow S).card (gm_type S 3 3 0 0).card (gm_type S 4 3 0 0).card (gm_type S 4 4 0 0).card (gm_type S 3 1 1 0).card (gm_type S 4 1 1 0).card (gm_type S 3 0 2 0).card (gm_type S 4 0 2 0).card (gm_h0 S).card (gm_h1 S).card (gm_type S 4 1 2 0).card (gm_type S 4 0 3 0).card (gm_type S 4 1 0 1).card (gm_type S 4 0 1 1).card (w23_pq S) (w23_rho S) (n4_right S).card (w23_gm_BC_card S hq) (w23_gm_CC_card S hq) (w23_gm_BD_card S hq) (w23_gm_CD_card S hq) (w23_gm_h0_card S hq) (w23_gm_mixed_card S hq) (w23_gm_strip_card S hq) (gm_wlow_card S) (w23_col_surplus_nonneg S hq hpop) (w23_gm_right_card S hq) he hL hm hc.symm lemma col_population_of_two (K l h : ℕ) (hK : 3 ≤ K) (he : l+h=K) (hh : h ≤ 2) : K*(K-1) ≤ 3*l*(l+1) := by have hl : 1 ≤ l := by omega have hKl : K ≤ l+2 := by omega have hKm : K-1 ≤ l+1 := by omega have H := Nat.mul_le_mul hKl hKm nlinarith only [H,hl] theorem w23_q4_gen_two_high (S : NumericalSemigroup) (h1 : 3*S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4*S.multiplicity) (hh : ((w23_X S 1).filter (fun a => 3*S.multiplicity ≤ 2*a+w23_rho S)).card ≤ 2) (hK : 3 ≤ (w23_X S 1).card) : S.SatisfiesWilf := by classical apply w23_q4_gen_lowpop S h1 h2 have hc := w23_col_indices_cards S (w23_q_eq_four S h1 h2) rw [← hc.2.1] apply col_population_of_two _ _ _ hK hc.2.2 rwa [hc.1] theorem w23_q4_core_two_high (S : NumericalSemigroup) (h1 : 3*S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4*S.multiplicity) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a+w23_rho S < 2*S.multiplicity) (hh : ((w23_X S 1).filter (fun a => 3*S.multiplicity ≤ 2*a+w23_rho S)).card ≤ 2) (hK : 3 ≤ (w23_X S 1).card) : S.SatisfiesWilf := by exact w23_q4_gen_two_high S h1 h2 hh hK theorem w23_q4_core_lowpop (S : NumericalSemigroup) (h1 : 3*S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4*S.multiplicity) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a+w23_rho S < 2*S.multiplicity) (hpop : (w23_X S 1).card*((w23_X S 1).card-1) ≤ 3*((w23_X S 1).filter (fun a => 2*a+w23_rho S < 3*S.multiplicity)).card* (((w23_X S 1).filter (fun a => 2*a+w23_rho S < 3*S.multiplicity)).card+1)) : S.SatisfiesWilf := by exact w23_q4_gen_lowpop S h1 h2 hpop theorem t31_parent_injective {N : ℕ} (i : Fin N) {x y : Fin N → ℕ} (hx : 0 < x i) (hy : 0 < y i) (h : Function.update x i (x i - 1) = Function.update y i (y i - 1)) : x = y := by funext j by_cases hji : j = i · subst j have he := congrFun h i simp at he omega · have he := congrFun h j simpa [Function.update, hji] using he theorem t31_restricted_shadow {N r : ℕ} (I : Finset (Fin N)) (E F : Finset (Fin N → ℕ)) (hE : ∀ alpha ∈ E, (∑ i ∈ I, alpha i) = r) (hF : ∀ beta ∈ F, (∑ i ∈ I, beta i) = r+1) (hp : ∀ beta ∈ F, ∀ i ∈ I, 0 < beta i → Function.update beta i (beta i-1) ∈ E) : (r+1)*F.card ≤ (I.card+r)*E.card := by classical have hc : ∀ i ∈ I, (∑ beta ∈ F, beta i) ≤ ∑ alpha ∈ E, (alpha i+1) := by intro i hi let T := F.filter (fun beta => 0 < beta i) have hf : (∑ beta ∈ F, beta i) = ∑ beta ∈ T, beta i := by symm apply Finset.sum_subset (Finset.filter_subset _ _) intro beta hb hn have hz : ¬ 0 < beta i := by intro hpos exact hn (Finset.mem_filter.2 ⟨hb,hpos⟩) omega rw [hf] apply Finset.sum_le_sum_of_injOn (fun beta => Function.update beta i (beta i-1)) · intro x hx y hy he exact t31_parent_injective i (Finset.mem_filter.1 hx).2 (Finset.mem_filter.1 hy).2 he · intro alpha ha obtain ⟨beta,hb,rfl⟩ := Finset.mem_image.1 ha exact hp beta (Finset.mem_filter.1 hb).1 i hi (Finset.mem_filter.1 hb).2 · intro beta hb have hpos := (Finset.mem_filter.1 hb).2 simp omega · intro alpha ha hn exact Nat.zero_le _ have hs : (∑ beta ∈ F, ∑ i ∈ I, beta i) ≤ ∑ alpha ∈ E, ∑ i ∈ I, (alpha i+1) := by calc _ = ∑ i ∈ I, ∑ beta ∈ F, beta i := Finset.sum_comm _ ≤ ∑ i ∈ I, ∑ alpha ∈ E, (alpha i+1) := Finset.sum_le_sum (fun i hi => hc i hi) _ = _ := Finset.sum_comm have hleft : (∑ beta ∈ F, ∑ i ∈ I, beta i) = (r+1)*F.card := by rw [Finset.sum_congr rfl hF] simp [Nat.mul_comm] have hright : (∑ alpha ∈ E, ∑ i ∈ I, (alpha i+1)) = (I.card+r)*E.card := by have he : ∀ alpha ∈ E, (∑ i ∈ I, (alpha i+1)) = I.card+r := by intro alpha ha rw [Finset.sum_add_distrib,hE alpha ha] simp [Nat.add_comm] rw [Finset.sum_congr rfl he] simp [Nat.mul_comm] rwa [hleft,hright] at hs theorem t31_high_shadow {N : ℕ} (I : Finset (Fin N)) (QHL QHH T2 T3 : Finset (Fin N → ℕ)) (hI : 1 ≤ I.card) (hHL : ∀ alpha ∈ QHL, (∑ i ∈ I, alpha i) = 1) (hHH : ∀ alpha ∈ QHH, (∑ i ∈ I, alpha i) = 2) (h2 : ∀ beta ∈ T2, (∑ i ∈ I, beta i) = 2) (h3 : ∀ beta ∈ T3, (∑ i ∈ I, beta i) = 3) (hp2 : ∀ beta ∈ T2, ∀ i ∈ I, 0 < beta i → Function.update beta i (beta i-1) ∈ QHL) (hp3 : ∀ beta ∈ T3, ∀ i ∈ I, 0 < beta i → Function.update beta i (beta i-1) ∈ QHH) : 2*(T2.card+T3.card) ≤ (I.card+1)*(QHL.card+QHH.card) := by have hs2 := t31_restricted_shadow I QHL T2 hHL h2 hp2 have hs3 := t31_restricted_shadow I QHH T3 hHH h3 hp3 have hr : 2*(I.card+2) ≤ 3*(I.card+1) := by omega have hm := Nat.mul_le_mul_right QHH.card hr nlinarith only [hs2,hs3,hm] theorem t31_general_unit_price_identity (a k z b w v t u x y f d h0 h1 j l r s wlow p rho Lambda t3 W : ℤ) (hW : W = (1+a+k+z+p)*(3*a+2*k+z+2*b+w+v+x+f) -4*(b+w+v+t+u+x+y+f+d+h0+h1+j+l+r+s)+rho) : W = w-t3 +3*(a*(a+1)-2*(b+w)) +2*((a+2)*b-3*v-3*t+Lambda) +((a+3)*v-4*u) +((a+2)*w-Lambda)+(2*t+t3-Lambda) +(a*k-x)+k*(w-wlow+v)+z*(1+z+2*b+w+v+x+f) +4*(a*k-x-y)+2*(k*(k+1)-2*(f+d)) +4*(a*z-r)+3*(k*z-s) +(rho-f-h1-j-l-s) +(k*(b+wlow)+(a+k+2)*(x+f)-3*(h0+h1+j+l)) +(k*b-h0)+p*(3*a+2*k+z+2*b+w+v+x+f) := by rw [hW] ring theorem t31_general_mixed_certificate (a k z b w v t u x y f d h0 h1 j l r s wlow rho t3 : ℕ) (hpure : 4*(b+w+v+t+u)+w ≤ (1+a)*(3*a+2*b+w+v)+t3) (hBC : x+y ≤ a*k) (hCC : 2*(f+d) ≤ k*(k+1)) (hBD : r ≤ a*z) (hCD : s ≤ k*z) (hgood : h0 ≤ k*b) (hshadow : 3*(h0+h1+j+l) ≤ k*(b+wlow)+(a+k+2)*(x+f)) (hstrip : f+h1+j+l+s ≤ rho) : 4*(b+w+v+t+u+x+y+f+d+h0+h1+j+l+r+s)+w+a*k +k*(w+v)+z*(1+z+2*b+w+v+x+f) ≤ (1+a+k+z)*(3*a+2*k+z+2*b+w+v+x+f)+rho+t3+x+k*wlow := by nlinarith only [hpure,hBC,hCC,hBD,hCD,hgood,hshadow,hstrip] theorem t31_general_one_high_counts (a k z b w v t u x y f d h0 h1 j l r s wlow rho t3 : ℕ) (hpure : 4*(b+w+v+t+u)+w ≤ (1+a)*(3*a+2*b+w+v)+t3) (hBC : x+y ≤ a*k) (hCC : 2*(f+d) ≤ k*(k+1)) (hBD : r ≤ a*z) (hCD : s ≤ k*z) (hgood : h0 ≤ k*b) (hshadow : 3*(h0+h1+j+l) ≤ k*(b+wlow)+(a+k+2)*(x+f)) (hstrip : f+h1+j+l+s ≤ rho) (hlow : wlow ≤ w) (hone : t3 ≤ w) : 4*(b+w+v+t+u+x+y+f+d+h0+h1+j+l+r+s) ≤ (1+a+k+z)*(3*a+2*k+z+2*b+w+v+x+f)+rho := by have hc := t31_general_mixed_certificate a k z b w v t u x y f d h0 h1 j l r s wlow rho t3 hpure hBC hCC hBD hCD hgood hshadow hstrip have hkw := Nat.mul_le_mul_left k hlow have hax : x ≤ a*k := by omega nlinarith only [hc,hkw,hax,hone] theorem t31_general_high_counts (a k z b w v t u x y f d h0 h1 j l r s p rho t3 h : ℕ) (hpure : 4*(b+w+v+t+u)+w ≤ (1+a)*(3*a+2*b+w+v)+t3) (hBC : x+y ≤ a*k) (hCC : 2*(f+d) ≤ k*(k+1)) (hBD : r ≤ a*z) (hCD : s ≤ k*z) (hgood : h0 ≤ k*b) (hshadow : 3*(h0+h1+j+l) ≤ k*b+(a+k+2)*(x+f)) (hstrip : f+h1+j+l+s ≤ rho) (hhigh : 2*t3 ≤ (h+1)*w) (hcomp : h ≤ 2*(k+z+p)+1) : 4*(b+w+v+t+u+x+y+f+d+h0+h1+j+l+r+s) ≤ (1+a+k+z+p)*(3*a+2*k+z+2*b+w+v+x+f)+rho := by have hc := t31_general_mixed_certificate a k z b w v t u x y f d h0 h1 j l r s 0 rho t3 hpure hBC hCC hBD hCD hgood (by simpa using hshadow) hstrip have hax : x ≤ a*k := by omega have hh := Nat.mul_le_mul_right w hcomp nlinarith only [hc,hax,hh,hhigh] theorem t31_wilf_of_count_certificate (S : NumericalSemigroup) (a k z b w v x f p rho R : ℕ) (he : S.embeddingDimension = 1+a+k+z+p) (hL : S.leftCount = 4+3*a+2*k+z+2*b+w+v+x+f) (hm : S.multiplicity = S.embeddingDimension+b+w+v+x+f+R) (hc : S.conductor+rho = 4*S.multiplicity) (hbound : 4*(b+w+v+x+f+R) ≤ (1+a+k+z+p)*(3*a+2*k+z+2*b+w+v+x+f)+rho) : S.SatisfiesWilf := by unfold NumericalSemigroup.SatisfiesWilf nlinarith only [he,hL,hm,hc,hbound] theorem t31_shifted_high_counts (a k z b w v t u x y f d h0 h1 j l r s wd p rho delta t3 h : ℕ) (hpure : 4*(b+w+v+t+u)+w ≤ (1+a)*(3*a+2*b+w+v)+t3) (hBC : x+y ≤ a*k) (hCC : 2*(f+d) ≤ k*(k+1)) (hBD : r ≤ a*z) (hCD : s ≤ k*z) (hgood : h0 ≤ k*b) (hshadow : 3*(h0+h1+j+l) ≤ k*(b+wd)+(a+k+2)*(x+f)) (hstrip : f+h1+j+l+s+delta ≤ rho) (hwd : wd+delta ≤ rho) (hhigh : 2*t3 ≤ (h+1)*w) (hcomp : h ≤ 2*(k+z+p)+1) (hbudget : k*(rho-delta) ≤ delta+p*(3*a+2*k+z)) : 4*(b+w+v+t+u+x+y+f+d+h0+h1+j+l+r+s) ≤ (1+a+k+z+p)*(3*a+2*k+z+2*b+w+v+x+f)+rho := by have hs : f+h1+j+l+s ≤ rho-delta := by omega have hc := t31_general_mixed_certificate a k z b w v t u x y f d h0 h1 j l r s wd (rho-delta) t3 hpure hBC hCC hBD hCD hgood hshadow hs have hax : x ≤ a*k := by omega have hh := Nat.mul_le_mul_right w hcomp have hkw := Nat.mul_le_mul_left k (show wd ≤ rho-delta by omega) have hde : rho-delta+delta=rho := by omega nlinarith only [hc,hax,hh,hhigh,hkw,hde,hbudget] theorem t31_supported_split_shadow {N r : ℕ} (I : Finset (Fin N)) (E F : Finset (Fin N → ℕ)) (hE : ∀ alpha ∈ E, (∑ i ∈ I, alpha i) = r) (hF : ∀ beta ∈ F, ∀ i, i ∉ I → beta i = 0) : (∑ beta ∈ F, up_weight E beta) ≤ (I.card+r)*E.card := by classical have hc : ∀ i, (∑ beta ∈ F, if m3_parent beta i ∈ E then beta i else 0) ≤ ∑ alpha ∈ E, (alpha i+1) := by intro i let T := F.filter (fun beta => 0 < beta i ∧ m3_parent beta i ∈ E) have hf : (∑ beta ∈ F, if m3_parent beta i ∈ E then beta i else 0) = ∑ beta ∈ T, beta i := by calc _ = ∑ beta ∈ T, if m3_parent beta i ∈ E then beta i else 0 := by symm apply Finset.sum_subset (Finset.filter_subset _ _) intro beta hb hn by_cases hpos : 0 < beta i · have hp : m3_parent beta i ∉ E := by intro hp exact hn (Finset.mem_filter.2 ⟨hb,hpos,hp⟩) simp [hp] · have hz : beta i = 0 := by omega simp [hz] _ = _ := Finset.sum_congr rfl (fun beta hb => if_pos (Finset.mem_filter.1 hb).2.2) rw [hf] apply Finset.sum_le_sum_of_injOn (fun beta => m3_parent beta i) · intro x hx y hy he exact n4_parent_injective i (Finset.mem_filter.1 hx).2.1 (Finset.mem_filter.1 hy).2.1 he · intro alpha ha obtain ⟨beta,hb,rfl⟩ := Finset.mem_image.1 ha exact (Finset.mem_filter.1 hb).2.2 · intro beta hb have hp := (Finset.mem_filter.1 hb).2.1 simp [m3_parent] omega · intro alpha ha hn exact Nat.zero_le _ have hs : (∑ beta ∈ F, up_weight E beta) = ∑ i ∈ I, ∑ beta ∈ F, if m3_parent beta i ∈ E then beta i else 0 := by unfold up_weight rw [Finset.sum_comm] symm apply Finset.sum_subset (Finset.subset_univ I) intro i hi hn apply Finset.sum_eq_zero intro beta hb simp [hF beta hb i hn] rw [hs] calc _ ≤ ∑ i ∈ I, ∑ alpha ∈ E, (alpha i+1) := Finset.sum_le_sum (fun i hi => hc i) _ = ∑ alpha ∈ E, ∑ i ∈ I, (alpha i+1) := Finset.sum_comm _ = _ := by have he : ∀ alpha ∈ E, (∑ i ∈ I, (alpha i+1)) = I.card+r := by intro alpha ha rw [Finset.sum_add_distrib,hE alpha ha] simp [Nat.add_comm] rw [Finset.sum_congr rfl he] simp [Nat.mul_comm] noncomputable def t31_layer (S : NumericalSemigroup) (j b : ℕ) : Finset (Fin (gm_A S).card → ℕ) := by classical exact (gm_type S j b 0 0).image (gm_rep (gm_A S)) lemma t31_layer_spec (S : NumericalSemigroup) (hq : w23_q S = 4) (j b : ℕ) {alpha : Fin (gm_A S).card → ℕ} (ha : alpha ∈ t31_layer S j b) : m3_degree alpha = b ∧ gm_group S 1 alpha = b ∧ gm_group S 2 alpha = 0 ∧ gm_group S 3 alpha = 0 ∧ m3_value (m3_enum (gm_A S)) alpha ∈ gm_type S j b 0 0 := by classical obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha obtain ⟨hxj,hn,hB,hC,hD⟩ := Finset.mem_filter.1 hx have hv := w23_gm_type_values S j b 0 0 hx have hr := gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq hv) have hd := w23_gm_group_degree S hq (gm_rep (gm_A S) x) refine ⟨by omega,hB,hC,hD,?_⟩ simpa only [hr.2] using hx lemma t31_layer_card (S : NumericalSemigroup) (hq : w23_q S = 4) (j b : ℕ) : (t31_layer S j b).card = (gm_type S j b 0 0).card := by classical exact gm_rep_image_card (gm_A S) _ (fun x hx => w23_gm_values_repr S hq (w23_gm_type_values S j b 0 0 hx)) lemma t31_layer_support (S : NumericalSemigroup) (hq : w23_q S = 4) (j b : ℕ) {alpha : Fin (gm_A S).card → ℕ} (ha : alpha ∈ t31_layer S j b) (i : Fin (gm_A S).card) (hi : i ∉ gm_indices S 1) : alpha i = 0 := by have hs := t31_layer_spec S hq j b ha rcases w23_gm_enum_levels S hq i with hl | hl | hl · exact False.elim (hi (by simp [gm_indices,hl])) · exact w23_gm_group_zero S 2 alpha hs.2.2.1 hl · exact w23_gm_group_zero S 3 alpha hs.2.2.2.1 hl lemma t31_layer_disjoint (S : NumericalSemigroup) (hq : w23_q S = 4) (j k b : ℕ) (hjk : j ≠ k) : Disjoint (t31_layer S j b) (t31_layer S k b) := by apply Finset.disjoint_left.2 intro alpha ha hb exact Finset.disjoint_left.1 (gm_type_disjoint S j b 0 0 k b 0 0 (by omega)) (t31_layer_spec S hq j b ha).2.2.2.2 (t31_layer_spec S hq k b hb).2.2.2.2 lemma t31_layer_parent (S : NumericalSemigroup) (hq : w23_q S = 4) (j b : ℕ) (hb : 3 ≤ b) {alpha : Fin (gm_A S).card → ℕ} (ha : alpha ∈ t31_layer S j b) (i : Fin (gm_A S).card) (hi : 0 < alpha i) : m3_parent alpha i ∈ t31_layer S (w23_level S (m3_value (m3_enum (gm_A S)) (m3_parent alpha i))) (b-1) ∧ b-1 ≤ w23_level S (m3_value (m3_enum (gm_A S)) (m3_parent alpha i)) ∧ w23_level S (m3_value (m3_enum (gm_A S)) (m3_parent alpha i))+1 ≤ j := by classical have hiB : i ∈ gm_indices S 1 := by by_contra hn have hz := t31_layer_support S hq j b ha i hn omega obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha have hp := w23_gm_parent_pure S hq j b hb hx hiB hi have he := (w23_gm_values_parent S hq (w23_gm_type_values S j b 0 0 hx) i hi).2 exact ⟨Finset.mem_image.2 ⟨_,hp.1,he.symm⟩,hp.2⟩ noncomputable def t31_Lambda (S : NumericalSemigroup) : ℕ := ∑ beta ∈ t31_layer S 4 3, up_weight (t31_layer S 3 2) beta noncomputable def t31_t3 (S : NumericalSemigroup) : ℕ := by classical exact ((t31_layer S 4 3).filter (fun beta => up_weight (t31_layer S 3 2) beta = 3)).card theorem t31_general_split_shadows (S : NumericalSemigroup) (hq : w23_q S = 4) : 3*(gm_type S 3 3 0 0).card+3*(gm_type S 4 3 0 0).card ≤ ((w23_X S 1).card+2)*(gm_type S 2 2 0 0).card+t31_Lambda S ∧ t31_Lambda S ≤ ((w23_X S 1).card+2)*(gm_type S 3 2 0 0).card ∧ t31_Lambda S ≤ 2*(gm_type S 4 3 0 0).card+t31_t3 S := by classical let P := t31_layer S 2 2 let Q := t31_layer S 3 2 let L := t31_layer S 3 3 let T := t31_layer S 4 3 have hLp : ∀ beta ∈ L, ∀ i, 0 < beta i → m3_parent beta i ∈ P := by intro beta hb i hi have hp := t31_layer_parent S hq 3 3 (by omega) hb i hi have hl : w23_level S (m3_value (m3_enum (gm_A S)) (m3_parent beta i))=2 := by omega simpa only [hl] using hp.1 have hTp : ∀ beta ∈ T, ∀ i, 0 < beta i → m3_parent beta i ∈ P ∪ Q := by intro beta hb i hi have hp := t31_layer_parent S hq 4 3 (by omega) hb i hi by_cases hl : w23_level S (m3_value (m3_enum (gm_A S)) (m3_parent beta i))=2 · exact Finset.mem_union.2 (Or.inl (by simpa only [hl] using hp.1)) · have hl3 : w23_level S (m3_value (m3_enum (gm_A S)) (m3_parent beta i))=3 := by omega exact Finset.mem_union.2 (Or.inr (by simpa only [hl3] using hp.1)) have hlow := t31_supported_split_shadow (gm_indices S 1) P (L ∪ T) (fun alpha ha => (t31_layer_spec S hq 2 2 ha).2.1) (by intro beta hb i hi rcases Finset.mem_union.1 hb with hb | hb · exact t31_layer_support S hq 3 3 hb i hi · exact t31_layer_support S hq 4 3 hb i hi) rw [Finset.sum_union (t31_layer_disjoint S hq 3 4 3 (by omega))] at hlow have hLs : (∑ beta ∈ L, up_weight P beta)=3*L.card := by rw [Finset.sum_congr rfl (fun beta hb => (up_weight_eq_degree P beta (hLp beta hb)).trans (t31_layer_spec S hq 3 3 hb).1)] simp [Nat.mul_comm] have hTs : (∑ beta ∈ T, up_weight P beta)+(∑ beta ∈ T, up_weight Q beta)=3*T.card := by rw [← Finset.sum_add_distrib] rw [Finset.sum_congr rfl (fun beta hb => (up_weight_disjoint_split P Q beta (t31_layer_disjoint S hq 2 3 2 (by omega)) (hTp beta hb)).trans (t31_layer_spec S hq 4 3 hb).1)] simp [Nat.mul_comm] have hwrap := t31_supported_split_shadow (gm_indices S 1) Q T (fun alpha ha => (t31_layer_spec S hq 3 2 ha).2.1) (fun beta hb i hi => t31_layer_support S hq 4 3 hb i hi) have hlam := up_lambda_sum_bound Q T (fun beta hb => (t31_layer_spec S hq 4 3 hb).1) have hcP := t31_layer_card S hq 2 2 have hcQ := t31_layer_card S hq 3 2 have hcL := t31_layer_card S hq 3 3 have hcT := t31_layer_card S hq 4 3 change (∑ beta ∈ L, up_weight P beta)+(∑ beta ∈ T, up_weight P beta) ≤ ((gm_indices S 1).card+2)*P.card at hlow rw [hLs] at hlow change t31_Lambda S ≤ ((gm_indices S 1).card+2)*Q.card at hwrap change _+t31_Lambda S=3*T.card at hTs change t31_Lambda S ≤ _+t31_t3 S at hlam change L.card=_ at hcL change T.card=_ at hcT change P.card=_ at hcP change Q.card=_ at hcQ rw [w23_gm_indices_card_B S hq,hcP] at hlow rw [w23_gm_indices_card_B S hq,hcQ] at hwrap rw [hcT] at hlam rw [hcL] at hlow rw [hcT] at hTs exact ⟨by omega,hwrap,hlam⟩ lemma t31_supported_pair_high {N : ℕ} (I : Finset (Fin N)) (A : Fin N → ℕ) (alpha : Fin N → ℕ) (m rho : ℕ) (h : Fin N) (hsupport : ∀ i, i ∉ I → alpha i=0) (hlow : ∀ i ∈ I, i ≠ h → 2*A i+rho < 3*m) (hdeg : m3_degree alpha=2) (hwrap : 3*m ≤ m3_value A alpha+rho) : 0 < alpha h := by by_contra hn have hz : alpha h=0 := by omega have hc : ∀ i, 2*(alpha i*A i)+rho*alpha i+alpha i ≤ 3*m*alpha i := by intro i by_cases hi : i ∈ I · by_cases he : i=h · subst i simp [hz] · have hb : 2*A i+rho+1 ≤ 3*m := by have := hlow i hi he; omega have hm := Nat.mul_le_mul_right (alpha i) hb nlinarith only [hm] · simp [hsupport i hi] have hs := Finset.sum_le_sum (fun i (_ : i ∈ Finset.univ) => hc i) have ht : 2*m3_value A alpha+rho*m3_degree alpha+m3_degree alpha ≤ 3*m*m3_degree alpha := by simpa only [m3_value,m3_degree,Finset.sum_add_distrib,Finset.mul_sum] using hs rw [hdeg] at ht omega lemma t31_wrapped_pair_high (S : NumericalSemigroup) (hq : w23_q S=4) (h : Fin (gm_A S).card) (hlow : ∀ i ∈ gm_indices S 1, i ≠ h → 2*m3_enum (gm_A S) i+w23_rho S < 3*S.multiplicity) {alpha : Fin (gm_A S).card → ℕ} (ha : alpha ∈ t31_layer S 3 2) : 0 < alpha h := by classical have hs := t31_layer_spec S hq 3 2 ha have hx := (w23_mem_X S 3 _).1 (Finset.mem_filter.1 hs.2.2.2.2).1 have hl := (w23_level_eq_iff S _ 3).1 hx.2 exact t31_supported_pair_high (gm_indices S 1) (m3_enum (gm_A S)) alpha S.multiplicity (w23_rho S) h (t31_layer_support S hq 3 2 ha) hlow hs.1 hl.1 theorem t31_general_t3_le_wrapped (S : NumericalSemigroup) (hq : w23_q S=4) (h : Fin (gm_A S).card) (hlow : ∀ i ∈ gm_indices S 1, i ≠ h → 2*m3_enum (gm_A S) i+w23_rho S < 3*S.multiplicity) : t31_t3 S ≤ (gm_type S 3 2 0 0).card := by have hc := oh_full_weight_injection (t31_layer S 3 2) (t31_layer S 4 3) (fun beta hb => (t31_layer_spec S hq 4 3 hb).1) h (fun alpha ha => t31_wrapped_pair_high S hq h hlow ha) change t31_t3 S ≤ (t31_layer S 3 2).card at hc rwa [t31_layer_card S hq 3 2] at hc theorem t31_general_one_high_index (S : NumericalSemigroup) (hq : w23_q S=4) (h : Fin (gm_A S).card) (hlow : ∀ i ∈ gm_indices S 1, i ≠ h → 2*m3_enum (gm_A S) i+w23_rho S < 3*S.multiplicity) : S.SatisfiesWilf := by have hs := t31_general_split_shadows S hq have hpure := up_count_certificate (w23_X S 1).card (gm_type S 2 2 0 0).card (gm_type S 3 2 0 0).card (gm_type S 3 3 0 0).card (gm_type S 4 3 0 0).card (gm_type S 4 4 0 0).card (t31_Lambda S) (t31_t3 S) (w23_gm_pure_pair_card S hq) hs.1 hs.2.1 (w23_gm_pure_quadruple_card S hq) hs.2.2 have hbound := t31_general_one_high_counts (w23_X S 1).card (w23_P S 2).card (w23_P S 3).card (gm_type S 2 2 0 0).card (gm_type S 3 2 0 0).card (gm_type S 3 3 0 0).card (gm_type S 4 3 0 0).card (gm_type S 4 4 0 0).card (gm_type S 3 1 1 0).card (gm_type S 4 1 1 0).card (gm_type S 3 0 2 0).card (gm_type S 4 0 2 0).card (gm_h0 S).card (gm_h1 S).card (gm_type S 4 1 2 0).card (gm_type S 4 0 3 0).card (gm_type S 4 1 0 1).card (gm_type S 4 0 1 1).card (gm_wlow S).card (w23_rho S) (t31_t3 S) hpure (w23_gm_BC_card S hq) (w23_gm_CC_card S hq) (w23_gm_BD_card S hq) (w23_gm_CD_card S hq) (w23_gm_h0_card S hq) (w23_gm_mixed_card S hq) (w23_gm_strip_card S hq) (gm_wlow_card S) (t31_general_t3_le_wrapped S hq h hlow) obtain ⟨he,hL,hm⟩ := w23_gm_general_counts S hq have hc := w23_q_mul_sub S rw [hq] at hc apply t31_wilf_of_count_certificate S (w23_X S 1).card (w23_P S 2).card (w23_P S 3).card (gm_type S 2 2 0 0).card (gm_type S 3 2 0 0).card (gm_type S 3 3 0 0).card (gm_type S 3 1 1 0).card (gm_type S 3 0 2 0).card (w23_pq S) (w23_rho S) (n4_right S).card he hL hm hc.symm have hR := w23_gm_right_card S hq nlinarith only [hbound,hR] lemma t31_index_mem_X1 (S : NumericalSemigroup) (hq : w23_q S=4) (i : Fin (gm_A S).card) (hi : i ∈ gm_indices S 1) : m3_enum (gm_A S) i ∈ w23_X S 1 := by classical rw [← w23_gm_generators_B S hq] exact Finset.mem_filter.2 ⟨m3_enum_mem (gm_A S) i,by simpa [gm_indices] using hi⟩ theorem w23_q4_gen_one_high (S : NumericalSemigroup) (h1 : 3*S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4*S.multiplicity) (hone : ((w23_X S 1).filter (fun a => 3*S.multiplicity ≤ 2*a+w23_rho S)).card ≤ 1) : S.SatisfiesWilf := by classical have hq := w23_q_eq_four S h1 h2 by_cases hX : w23_X S 1 = ∅ · exact w23_q4_of_X1_empty S h1 h2 hX · let H := (w23_X S 1).filter (fun a => 3*S.multiplicity ≤ 2*a+w23_rho S) have hn : (w23_X S 1).Nonempty := Finset.nonempty_iff_ne_empty.2 hX have hex : ∃ b ∈ w23_X S 1, ∀ a ∈ w23_X S 1, a ≠ b → 2*a+w23_rho S < 3*S.multiplicity := by by_cases hH : H.Nonempty · obtain ⟨b,hb⟩ := hH refine ⟨b,(Finset.mem_filter.1 hb).1,?_⟩ intro a ha hab by_contra hlow have haH : a ∈ H := Finset.mem_filter.2 ⟨ha,by omega⟩ have heq := Finset.card_le_one.1 hone a haH b hb exact hab heq · obtain ⟨b,hb⟩ := hn refine ⟨b,hb,?_⟩ intro a ha hab by_contra hlow exact hH ⟨a,Finset.mem_filter.2 ⟨ha,by omega⟩⟩ obtain ⟨b,hb,hlow⟩ := hex have hbA : b ∈ gm_A S := by rw [← w23_gm_generators_B S hq] at hb exact (Finset.mem_filter.1 hb).1 obtain ⟨h,he⟩ := m3_enum_surjective (gm_A S) b hbA apply t31_general_one_high_index S hq h intro i hi hih apply hlow _ (t31_index_mem_X1 S hq i hi) intro hv have hie : m3_enum (gm_A S) i = m3_enum (gm_A S) h := by omega exact hih (gm_enum_injective (gm_A S) hie) lemma t31_two_filter_cards {X : Type*} [DecidableEq X] (F : Finset X) (f : X → ℕ) (r s : ℕ) (hrs : r ≠ s) (hf : ∀ x ∈ F, f x=r ∨ f x=s) : (F.filter (fun x => f x=r)).card+(F.filter (fun x => f x=s)).card=F.card := by classical have hu : F.filter (fun x => f x=r) ∪ F.filter (fun x => f x=s)=F := by ext x simp only [Finset.mem_union,Finset.mem_filter] constructor · rintro (⟨hx,_⟩|⟨hx,_⟩) <;> exact hx · intro hx rcases hf x hx with he | he · exact Or.inl ⟨hx,he⟩ · exact Or.inr ⟨hx,he⟩ have hd : Disjoint (F.filter (fun x => f x=r)) (F.filter (fun x => f x=s)) := by apply Finset.disjoint_left.2 intro x hx hy exact hrs (by have := (Finset.mem_filter.1 hx).2; have := (Finset.mem_filter.1 hy).2; omega) have hc := Finset.card_union_of_disjoint hd rw [hu] at hc exact hc.symm theorem t31_full_wrapped_high_shadow {N : ℕ} (I : Finset (Fin N)) (Q T : Finset (Fin N → ℕ)) (hQd : ∀ alpha ∈ Q, m3_degree alpha=2) (hTd : ∀ beta ∈ T, m3_degree beta=3) (hQhigh : ∀ alpha ∈ Q, 1 ≤ ∑ i ∈ I, alpha i) (hp : ∀ beta ∈ T, ∀ i, 0 < beta i → m3_parent beta i ∈ Q) : 2*T.card ≤ (I.card+1)*Q.card := by classical have hQupper : ∀ alpha ∈ Q, (∑ i ∈ I, alpha i) ≤ 2 := by intro alpha ha have hs := Finset.sum_le_sum_of_subset (Finset.subset_univ I) (f := alpha) change _ ≤ m3_degree alpha at hs rwa [hQd alpha ha] at hs have hTupper : ∀ beta ∈ T, (∑ i ∈ I, beta i) ≤ 3 := by intro beta hb have hs := Finset.sum_le_sum_of_subset (Finset.subset_univ I) (f := beta) change _ ≤ m3_degree beta at hs rwa [hTd beta hb] at hs have hTlower : ∀ beta ∈ T, 2 ≤ ∑ i ∈ I, beta i := by intro beta hb by_contra hn by_cases hz : (∑ i ∈ I, beta i)=0 · obtain ⟨i,hi⟩ := m3_degree_pos_coord beta (by rw [hTd beta hb]; omega) have hpar := gm_group_parent I beta i hi have hhigh := hQhigh _ (hp beta hb i hi) omega · have he : (∑ i ∈ I, beta i)=1 := by omega obtain ⟨i,hi,hpos⟩ := gm_positive_in_group I beta (by omega) have hpar := gm_group_parent I beta i hpos simp only [hi,ite_eq_left] at hpar have hhigh := hQhigh _ (hp beta hb i hpos) omega by_cases hI : 1 ≤ I.card · let QHL := Q.filter (fun alpha => (∑ i ∈ I, alpha i)=1) let QHH := Q.filter (fun alpha => (∑ i ∈ I, alpha i)=2) let T2 := T.filter (fun beta => (∑ i ∈ I, beta i)=2) let T3 := T.filter (fun beta => (∑ i ∈ I, beta i)=3) have hs := t31_high_shadow I QHL QHH T2 T3 hI (fun alpha ha => (Finset.mem_filter.1 ha).2) (fun alpha ha => (Finset.mem_filter.1 ha).2) (fun beta hb => (Finset.mem_filter.1 hb).2) (fun beta hb => (Finset.mem_filter.1 hb).2) (by intro beta hb i hi hpos have hpar := gm_group_parent I beta i hpos simp only [hi,ite_eq_left] at hpar have hb2 := (Finset.mem_filter.1 hb).2 change (∑ j ∈ I, beta j)=2 at hb2 refine Finset.mem_filter.2 ⟨hp beta (Finset.mem_filter.1 hb).1 i hpos,?_⟩ change (∑ j ∈ I, m3_parent beta i j)=1 omega) (by intro beta hb i hi hpos have hpar := gm_group_parent I beta i hpos simp only [hi,ite_eq_left] at hpar have hb3 := (Finset.mem_filter.1 hb).2 change (∑ j ∈ I, beta j)=3 at hb3 refine Finset.mem_filter.2 ⟨hp beta (Finset.mem_filter.1 hb).1 i hpos,?_⟩ change (∑ j ∈ I, m3_parent beta i j)=2 omega) have hqc := t31_two_filter_cards Q (fun alpha => ∑ i ∈ I, alpha i) 1 2 (by omega) (by intro alpha ha; have := hQhigh alpha ha; have := hQupper alpha ha; omega) have htc := t31_two_filter_cards T (fun beta => ∑ i ∈ I, beta i) 2 3 (by omega) (by intro beta hb; have := hTlower beta hb; have := hTupper beta hb; omega) change QHL.card+QHH.card=Q.card at hqc change T2.card+T3.card=T.card at htc rwa [hqc,htc] at hs · have hIe : I=∅ := Finset.card_eq_zero.1 (by omega) have hTe : T=∅ := by apply Finset.eq_empty_iff_forall_notMem.2 intro beta hb have hl := hTlower beta hb simp [hIe] at hl simp [hTe] noncomputable def t31_high_indices (S : NumericalSemigroup) : Finset (Fin (gm_A S).card) := by classical exact (gm_indices S 1).filter (fun i => 3*S.multiplicity ≤ 2*m3_enum (gm_A S) i+w23_rho S) lemma t31_high_indices_card (S : NumericalSemigroup) (hq : w23_q S=4) : (t31_high_indices S).card = ((w23_X S 1).filter (fun a => 3*S.multiplicity ≤ 2*a+w23_rho S)).card := by classical have he : (t31_high_indices S).image (m3_enum (gm_A S))= (w23_X S 1).filter (fun a => 3*S.multiplicity ≤ 2*a+w23_rho S) := by ext a constructor · intro ha obtain ⟨i,hi,rfl⟩ := Finset.mem_image.1 ha obtain ⟨hiB,hhigh⟩ := Finset.mem_filter.1 hi exact Finset.mem_filter.2 ⟨t31_index_mem_X1 S hq i hiB,hhigh⟩ · intro ha obtain ⟨haB,hhigh⟩ := Finset.mem_filter.1 ha have haA : a ∈ gm_A S := by rw [← w23_gm_generators_B S hq] at haB exact (Finset.mem_filter.1 haB).1 obtain ⟨i,rfl⟩ := m3_enum_surjective (gm_A S) a haA have hiB : i ∈ gm_indices S 1 := by simp only [gm_indices,Finset.mem_filter,Finset.mem_univ,true_and] exact ((w23_mem_X S 1 _).1 haB).2 exact Finset.mem_image.2 ⟨i,Finset.mem_filter.2 ⟨hiB,hhigh⟩,rfl⟩ have hc := Finset.card_image_of_injective (t31_high_indices S) (gm_enum_injective (gm_A S)) rw [he] at hc exact hc.symm lemma t31_wrapped_has_high (S : NumericalSemigroup) (hq : w23_q S=4) {alpha : Fin (gm_A S).card → ℕ} (ha : alpha ∈ t31_layer S 3 2) : 1 ≤ ∑ i ∈ t31_high_indices S, alpha i := by classical by_contra hn have hz : (∑ i ∈ t31_high_indices S, alpha i)=0 := by omega have hs := t31_layer_spec S hq 3 2 ha have hc : ∀ i, 2*(alpha i*m3_enum (gm_A S) i)+w23_rho S*alpha i+alpha i ≤ 3*S.multiplicity*alpha i := by intro i by_cases hi : i ∈ gm_indices S 1 · by_cases hh : i ∈ t31_high_indices S · have hi0 : alpha i=0 := by have ht := Finset.single_le_sum (fun j hj => Nat.zero_le (alpha j)) hh omega simp [hi0] · have hl : 2*m3_enum (gm_A S) i+w23_rho S+1 ≤ 3*S.multiplicity := by have hnh : ¬ 3*S.multiplicity ≤ 2*m3_enum (gm_A S) i+w23_rho S := by intro hhpos exact hh (Finset.mem_filter.2 ⟨hi,hhpos⟩) omega have hm := Nat.mul_le_mul_right (alpha i) hl nlinarith only [hm] · simp [t31_layer_support S hq 3 2 ha i hi] have he := Finset.sum_le_sum (fun i (_ : i ∈ Finset.univ) => hc i) have ht : 2*m3_value (m3_enum (gm_A S)) alpha+w23_rho S*m3_degree alpha+m3_degree alpha ≤ 3*S.multiplicity*m3_degree alpha := by simpa only [m3_value,m3_degree,Finset.sum_add_distrib,Finset.mul_sum] using he rw [hs.1] at ht have hx := (w23_mem_X S 3 _).1 (Finset.mem_filter.1 hs.2.2.2.2).1 have hlo := ((w23_level_eq_iff S _ 3).1 hx.2).1 omega theorem t31_semigroup_high_shadow (S : NumericalSemigroup) (hq : w23_q S=4) : 2*t31_t3 S ≤ ((t31_high_indices S).card+1)*(gm_type S 3 2 0 0).card := by classical let T := (t31_layer S 4 3).filter (fun beta => up_weight (t31_layer S 3 2) beta=3) have hs := t31_full_wrapped_high_shadow (t31_high_indices S) (t31_layer S 3 2) T (fun alpha ha => (t31_layer_spec S hq 3 2 ha).1) (fun beta hb => (t31_layer_spec S hq 4 3 (Finset.mem_filter.1 hb).1).1) (fun alpha ha => t31_wrapped_has_high S hq ha) (by intro beta hb i hi have hd := (t31_layer_spec S hq 4 3 (Finset.mem_filter.1 hb).1).1 exact (up_weight_eq_degree_iff (t31_layer S 3 2) beta).1 (by rw [hd]; exact (Finset.mem_filter.1 hb).2) i hi) change 2*t31_t3 S ≤ ((t31_high_indices S).card+1)*(t31_layer S 3 2).card at hs rwa [t31_layer_card S hq 3 2] at hs theorem w23_q4_gen_few_high (S : NumericalSemigroup) (h1 : 3*S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4*S.multiplicity) (hwl : gm_wlow S=∅) (hcomp : ((w23_X S 1).filter (fun a => 3*S.multiplicity ≤ 2*a+w23_rho S)).card ≤ 2*((w23_P S 2).card+(w23_P S 3).card+w23_pq S)+1) : S.SatisfiesWilf := by classical have hq := w23_q_eq_four S h1 h2 have hs := t31_general_split_shadows S hq have hpure := up_count_certificate (w23_X S 1).card (gm_type S 2 2 0 0).card (gm_type S 3 2 0 0).card (gm_type S 3 3 0 0).card (gm_type S 4 3 0 0).card (gm_type S 4 4 0 0).card (t31_Lambda S) (t31_t3 S) (w23_gm_pure_pair_card S hq) hs.1 hs.2.1 (w23_gm_pure_quadruple_card S hq) hs.2.2 have hshadow := w23_gm_mixed_card S hq rw [hwl] at hshadow simp only [Finset.card_empty,Nat.add_zero] at hshadow have hbound := t31_general_high_counts (w23_X S 1).card (w23_P S 2).card (w23_P S 3).card (gm_type S 2 2 0 0).card (gm_type S 3 2 0 0).card (gm_type S 3 3 0 0).card (gm_type S 4 3 0 0).card (gm_type S 4 4 0 0).card (gm_type S 3 1 1 0).card (gm_type S 4 1 1 0).card (gm_type S 3 0 2 0).card (gm_type S 4 0 2 0).card (gm_h0 S).card (gm_h1 S).card (gm_type S 4 1 2 0).card (gm_type S 4 0 3 0).card (gm_type S 4 1 0 1).card (gm_type S 4 0 1 1).card (w23_pq S) (w23_rho S) (t31_t3 S) (t31_high_indices S).card hpure (w23_gm_BC_card S hq) (w23_gm_CC_card S hq) (w23_gm_BD_card S hq) (w23_gm_CD_card S hq) (w23_gm_h0_card S hq) hshadow (w23_gm_strip_card S hq) (t31_semigroup_high_shadow S hq) (by rwa [t31_high_indices_card S hq]) obtain ⟨he,hL,hm⟩ := w23_gm_general_counts S hq have hc := w23_q_mul_sub S rw [hq] at hc apply t31_wilf_of_count_certificate S (w23_X S 1).card (w23_P S 2).card (w23_P S 3).card (gm_type S 2 2 0 0).card (gm_type S 3 2 0 0).card (gm_type S 3 3 0 0).card (gm_type S 3 1 1 0).card (gm_type S 3 0 2 0).card (w23_pq S) (w23_rho S) (n4_right S).card he hL hm hc.symm have hR := w23_gm_right_card S hq nlinarith only [hbound,hR] theorem w23_q4_gen_few_high_rho_zero (S : NumericalSemigroup) (h1 : 3*S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4*S.multiplicity) (hrho : w23_rho S=0) (hcomp : ((w23_X S 1).filter (fun a => 3*S.multiplicity ≤ 2*a+w23_rho S)).card ≤ 2*((w23_P S 2).card+(w23_P S 3).card+w23_pq S)+1) : S.SatisfiesWilf := by classical have hwl : gm_wlow S=∅ := by apply Finset.eq_empty_iff_forall_notMem.2 intro x hx obtain ⟨hxt,hxlt⟩ := Finset.mem_filter.1 hx have hl := ((w23_mem_X S 3 x).1 (Finset.mem_filter.1 hxt).1).2 have hlo := ((w23_level_eq_iff S x 3).1 hl).1 rw [hrho] at hlo omega exact w23_q4_gen_few_high S h1 h2 hwl hcomp theorem w23_gs_q4_gen_one (S : NumericalSemigroup) (h1 : 3*S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4*S.multiplicity) (hK : (w23_X S 1).card ≤ 1) : S.SatisfiesWilf := by classical apply w23_q4_gen_many_right S h1 h2 omega lemma gs_two_rigidity (k b w v t u x y f d h0 h j l wlow rho R : ℕ) (h2 : 2*(b+w) ≤ 6) (h3 : 3*(v+t) ≤ 4*(b+w)) (h3L : 3*v ≤ 4*b) (h4 : 4*u ≤ 5*v) (hBC : x+y ≤ 2*k) (hCC : 2*(f+d) ≤ k*(k+1)) (hgood : h0 ≤ k*b) (hshadow : 3*(h0+h+j+l) ≤ k*(b+wlow)+(k+4)*(x+f)) (hstrip : f+h+j+l ≤ rho) (hlow : wlow ≤ w) (hR : R ≤ t+u+y+d+h0+h+j+l) (hfail : (3+k)*(6+2*k+2*b+w+v+x+f)+rho < 4*(b+w+v+x+f+R)) : b=0 ∧ w=3 ∧ v=0 ∧ t=4 ∧ u=0 ∧ h0=0 ∧ x=2*k ∧ y=0 ∧ 2*(f+d)=k*(k+1) ∧ rho=f+h+j+l ∧ 3*(h+j+l)=3*k+(k+4)*(2*k+f) ∧ k*wlow=3*k ∧ R=4+d+h+j+l := by have hcert : 12*(b+w+v+t+u+x+y+f+d+h0+h+j+l)+w+6*k+3*k*(w+v) ≤ 3*(3+k)*(6+2*k+2*b+w+v+x+f)+3*rho+2*w+3*x+3*k*wlow := by nlinarith only [h2,h3,h3L,h4,hBC,hCC,hgood,hshadow,hstrip] have hLow := Nat.mul_le_mul_left (3*k) hlow have hw3 : w ≤ 3 := by omega have hx : x ≤ 2*k := by omega have hw : w=3 := by nlinarith only [hcert,hfail,hR,hLow,hx,hw3] have hb : b=0 := by omega have hv : v=0 := by omega have hu : u=0 := by omega have ht : t≤4 := by omega have hxE : x=2*k := by nlinarith only [hcert,hfail,hR,hLow,hx,hw] have hy : y=0 := by omega have hh0 : h0=0 := by rw [hb] at hgood; omega subst b w v u x y h0 have hkw : k*wlow=3*k := by nlinarith only [hcert,hfail,hR,hLow] have htE : t=4 := by nlinarith only [h2,h3,h3L,h4,hBC,hCC,hshadow,hstrip,hfail,hR,hkw] subst t have hccE : 2*(f+d)=k*(k+1) := by nlinarith only [hCC,hshadow,hstrip,hfail,hR,hkw] have hstripE : rho=f+h+j+l := by nlinarith only [hCC,hshadow,hstrip,hfail,hR,hkw] have hshadowE : 3*(h+j+l)=3*k+(k+4)*(2*k+f) := by nlinarith only [hCC,hshadow,hstrip,hfail,hR,hkw] have hRE : R=4+d+h+j+l := by nlinarith only [hCC,hshadow,hstrip,hfail,hR,hkw] exact ⟨rfl,rfl,rfl,rfl,rfl,rfl,rfl,rfl,hccE,hstripE,hshadowE,hkw,hRE⟩ noncomputable def gs_weight {N : ℕ} (J : Finset (Fin N)) (E : Finset (Fin N → ℕ)) (q : Fin N → ℕ) : ℕ := by classical exact ∑ i ∈ J, if m3_parent q i ∈ E then q i else 0 lemma gs_weight_capacity {N : ℕ} (J : Finset (Fin N)) (E F : Finset (Fin N → ℕ)) : (∑ q ∈ F, gs_weight J E q) ≤ ∑ u ∈ E, ∑ i ∈ J, (u i+1) := by classical have hc (i : Fin N) : (∑ q ∈ F, if m3_parent q i ∈ E then q i else 0) ≤ ∑ u ∈ E, (u i+1) := by let T := F.filter (fun q => 0 < q i ∧ m3_parent q i ∈ E) have hf : (∑ q ∈ F, if m3_parent q i ∈ E then q i else 0) = ∑ q ∈ T, q i := by calc _ = ∑ q ∈ T, if m3_parent q i ∈ E then q i else 0 := by symm apply Finset.sum_subset (Finset.filter_subset _ _) intro q hq hn by_cases hi : 0 < q i · have hp : m3_parent q i ∉ E := by intro hp exact hn (Finset.mem_filter.2 ⟨hq,hi,hp⟩) simp [hp] · have hz : q i=0 := by omega simp [hz] _ = _ := Finset.sum_congr rfl (fun q hq => if_pos (Finset.mem_filter.1 hq).2.2) rw [hf] apply Finset.sum_le_sum_of_injOn (fun q => m3_parent q i) · intro q hq q' hq' he exact n4_parent_injective i (Finset.mem_filter.1 hq).2.1 (Finset.mem_filter.1 hq').2.1 he · intro u hu obtain ⟨q,hq,rfl⟩ := Finset.mem_image.1 hu exact (Finset.mem_filter.1 hq).2.2 · intro q hq have hi := (Finset.mem_filter.1 hq).2.1 simp [m3_parent] omega · intro u hu hn exact Nat.zero_le _ calc _ = ∑ i ∈ J, ∑ q ∈ F, if m3_parent q i ∈ E then q i else 0 := by unfold gs_weight exact Finset.sum_comm _ ≤ ∑ i ∈ J, ∑ u ∈ E, (u i+1) := Finset.sum_le_sum (fun i hi => hc i) _ = _ := Finset.sum_comm lemma gs_weight_unitAdd_pos {N : ℕ} (J : Finset (Fin N)) (E : Finset (Fin N → ℕ)) {u : Fin N → ℕ} (hu : u ∈ E) {i : Fin N} (hi : i ∈ J) : 0 < gs_weight J E (m3_unitAdd u i) := by classical have hp : m3_parent (m3_unitAdd u i) i=u := m3_parent_unitAdd u i have hh : m3_unitAdd u i i ≤ gs_weight J E (m3_unitAdd u i) := by unfold gs_weight have h := Finset.single_le_sum (fun j hj => Nat.zero_le (if m3_parent (m3_unitAdd u i) j ∈ E then m3_unitAdd u i j else 0)) hi simpa only [hp,if_pos hu] using h simp only [m3_unitAdd,ite_true] at hh omega lemma gs_mixed_weight_eq {N : ℕ} (I J : Finset (Fin N)) (hIJ : I ⊆ J) (U0 U1 : Finset (Fin N → ℕ)) (hd : Disjoint U0 U1) (h0 : ∀ u ∈ U0, (∑ i ∈ I, u i)=0) {q : Fin N → ℕ} (hq : (∑ i ∈ J, q i)=3 ∧ 0 < ∑ i ∈ I, q i) (hp : ∀ i ∈ J, 0 < q i → m3_parent q i ∈ U0 ∪ U1) : gs_weight I U0 q + gs_weight J U1 q=3 := by classical have hI : gs_weight I U0 q = ∑ i ∈ J, if m3_parent q i ∈ U0 then q i else 0 := by unfold gs_weight apply Finset.sum_subset hIJ intro i hi hn by_cases hz : q i=0 · simp [hz] · have hp0 : m3_parent q i ∉ U0 := by intro hp0 have he := h0 _ hp0 have hu : (∑ j ∈ I, m3_parent q i j)=∑ j ∈ I, q j := by apply Finset.sum_congr rfl intro j hj have hji : j ≠ i := by intro he; subst j; exact hn hj simp [m3_parent,Function.update,hji] rw [hu] at he omega simp [hp0] rw [hI,gs_weight,← Finset.sum_add_distrib] calc _ = ∑ i ∈ J, q i := by apply Finset.sum_congr rfl intro i hi by_cases hz : q i=0 · simp [hz] · rcases Finset.mem_union.1 (hp i hi (by omega)) with hp0 | hp1 · have hn : m3_parent q i ∉ U1 := fun hh => Finset.disjoint_left.1 hd hp0 hh simp [hp0,hn] · have hn : m3_parent q i ∉ U0 := fun hh => Finset.disjoint_left.1 hd hh hp1 simp [hp1,hn] _ = 3 := hq.1 lemma gs_mixed_saturated {N : ℕ} (I J : Finset (Fin N)) (hIJ : I ⊆ J) (U0 U1 H : Finset (Fin N → ℕ)) (hd : Disjoint U0 U1) (h0 : ∀ u ∈ U0, (∑ i ∈ I, u i)=0) (h1 : ∀ u ∈ U1, (∑ i ∈ J, u i)=2) (hH : ∀ q ∈ H, (∑ i ∈ J, q i)=3 ∧ 0 < ∑ i ∈ I, q i) (hp : ∀ q ∈ H, ∀ i ∈ J, 0 < q i → m3_parent q i ∈ U0 ∪ U1) (he : 3*H.card=I.card*U0.card+(J.card+2)*U1.card) : (∀ u ∈ U0, ∀ i ∈ I, m3_unitAdd u i ∈ H) ∧ (∀ u ∈ U1, ∀ i ∈ J, m3_unitAdd u i ∈ H) := by classical have hcap (F : Finset (Fin N → ℕ)) : (∑ q ∈ F, (gs_weight I U0 q+gs_weight J U1 q)) ≤ I.card*U0.card+(J.card+2)*U1.card := by have hA := gs_weight_capacity I U0 F have hB := gs_weight_capacity J U1 F have hc0 : (∑ u ∈ U0, ∑ i ∈ I, (u i+1))=I.card*U0.card := by have hs (u : Fin N → ℕ) (hu : u ∈ U0) : (∑ i ∈ I, (u i+1))=I.card := by rw [Finset.sum_add_distrib,h0 u hu] simp simp only [Finset.sum_congr rfl hs,Finset.sum_const,smul_eq_mul,Nat.mul_comm] have hc1 : (∑ u ∈ U1, ∑ i ∈ J, (u i+1))=(J.card+2)*U1.card := by have hs (u : Fin N → ℕ) (hu : u ∈ U1) : (∑ i ∈ J, (u i+1))=J.card+2 := by rw [Finset.sum_add_distrib,h1 u hu] simp [Nat.add_comm] simp only [Finset.sum_congr rfl hs,Finset.sum_const,smul_eq_mul,Nat.mul_comm] rw [hc0] at hA rw [hc1] at hB rw [Finset.sum_add_distrib] omega have hsum : (∑ q ∈ H, (gs_weight I U0 q+gs_weight J U1 q))=3*H.card := by rw [Finset.sum_congr rfl (fun q hq => gs_mixed_weight_eq I J hIJ U0 U1 hd h0 (hH q hq) (hp q hq))] simp [Nat.mul_comm] constructor · intro u hu i hi by_contra hn have hc := hcap (insert (m3_unitAdd u i) H) rw [Finset.sum_insert hn,hsum,he] at hc have hp := gs_weight_unitAdd_pos I U0 hu hi omega · intro u hu i hi by_contra hn have hc := hcap (insert (m3_unitAdd u i) H) rw [Finset.sum_insert hn,hsum,he] at hc have hp := gs_weight_unitAdd_pos J U1 hu hi omega lemma w23_gs_lift_mixed_saturated (S : NumericalSemigroup) (hq : w23_q S = 4) (I J : Finset (Fin (gm_A S).card)) (hIJ : I ⊆ J) (U0 U1 H : Finset ℕ) (hU0 : U0 ⊆ gm_values S) (hU1 : U1 ⊆ gm_values S) (hH : H ⊆ gm_values S) (hd : Disjoint U0 U1) (hd0 : ∀ x ∈ U0, (∑ i ∈ I, gm_rep (gm_A S) x i) = 0) (hd1 : ∀ x ∈ U1, (∑ i ∈ J, gm_rep (gm_A S) x i) = 2) (hdH : ∀ x ∈ H, (∑ i ∈ J, gm_rep (gm_A S) x i) = 3 ∧ 0 < ∑ i ∈ I, gm_rep (gm_A S) x i) (hdiv : ∀ x ∈ H, ∀ i ∈ J, 0 < gm_rep (gm_A S) x i → m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) ∈ U0 ∪ U1) (hsat : 3*H.card=I.card*U0.card+(J.card+2)*U1.card) : (∀ x ∈ U0, ∀ i ∈ I, m3_unitAdd (gm_rep (gm_A S) x) i ∈ H.image (gm_rep (gm_A S))) ∧ (∀ x ∈ U1, ∀ i ∈ J, m3_unitAdd (gm_rep (gm_A S) x) i ∈ H.image (gm_rep (gm_A S))) := by classical let E0 := U0.image (gm_rep (gm_A S)) let E1 := U1.image (gm_rep (gm_A S)) let F := H.image (gm_rep (gm_A S)) have h0 : ∀ alpha ∈ E0, (∑ i ∈ I, alpha i) = 0 := by intro alpha ha obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha exact hd0 x hx have h1 : ∀ alpha ∈ E1, (∑ i ∈ J, alpha i) = 2 := by intro alpha ha obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha exact hd1 x hx have hF : ∀ alpha ∈ F, (∑ i ∈ J, alpha i) = 3 ∧ 0 < ∑ i ∈ I, alpha i := by intro alpha ha obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha exact hdH x hx have hdis : Disjoint E0 E1 := by apply Finset.disjoint_left.2 intro alpha ha hb obtain ⟨x,hx,he⟩ := Finset.mem_image.1 ha obtain ⟨y,hy,he'⟩ := Finset.mem_image.1 hb have hxv := (gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq (hU0 hx))).2 have hyv := (gm_rep_spec (gm_A S) y (w23_gm_values_repr S hq (hU1 hy))).2 rw [he] at hxv rw [he'] at hyv have hxy : x = y := by omega exact Finset.disjoint_left.1 hd hx (hxy.symm ▸ hy) have hparent : ∀ alpha ∈ F, ∀ i ∈ J, 0 < alpha i → m3_parent alpha i ∈ E0 ∪ E1 := by intro alpha ha i hi hpos obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha have he := (w23_gm_values_parent S hq (hH hx) i hpos).2 rcases Finset.mem_union.1 (hdiv x hx i hi hpos) with hp0 | hp1 · exact Finset.mem_union.2 (Or.inl (Finset.mem_image.2 ⟨_,hp0,he.symm⟩)) · exact Finset.mem_union.2 (Or.inr (Finset.mem_image.2 ⟨_,hp1,he.symm⟩)) have he0 := gm_rep_image_card (gm_A S) U0 (fun x hx => w23_gm_values_repr S hq (hU0 hx)) have he1 := gm_rep_image_card (gm_A S) U1 (fun x hx => w23_gm_values_repr S hq (hU1 hx)) have hf := gm_rep_image_card (gm_A S) H (fun x hx => w23_gm_values_repr S hq (hH hx)) have he : 3*F.card=I.card*E0.card+(J.card+2)*E1.card := by simpa only [E0,E1,F,he0,he1,hf] using hsat obtain ⟨hcl0,hcl1⟩ := gs_mixed_saturated I J hIJ E0 E1 F hdis h0 h1 hF hparent he exact ⟨fun x hx i hi => hcl0 _ (Finset.mem_image.2 ⟨x,hx,rfl⟩) i hi, fun x hx i hi => hcl1 _ (Finset.mem_image.2 ⟨x,hx,rfl⟩) i hi⟩ lemma w23_gs_mixed_saturated (S : NumericalSemigroup) (hq : w23_q S = 4) (hsat : 3*((gm_h0 S).card+(gm_h1 S).card+(gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card) = (w23_P S 2).card*((gm_type S 2 2 0 0).card+(gm_wlow S).card)+ ((w23_X S 1).card+(w23_P S 2).card+2)* ((gm_type S 3 1 1 0).card+(gm_type S 3 0 2 0).card)) : (∀ x ∈ gm_type S 2 2 0 0 ∪ gm_wlow S, ∀ i ∈ gm_indices S 2, m3_unitAdd (gm_rep (gm_A S) x) i ∈ (gm_H S).image (gm_rep (gm_A S))) ∧ (∀ x ∈ gm_type S 3 1 1 0 ∪ gm_type S 3 0 2 0, ∀ i ∈ gm_indices S 1 ∪ gm_indices S 2, m3_unitAdd (gm_rep (gm_A S) x) i ∈ (gm_H S).image (gm_rep (gm_A S))) := by classical let I := gm_indices S 2 let J := gm_indices S 1 ∪ gm_indices S 2 let U0 := gm_type S 2 2 0 0 ∪ gm_wlow S let U1 := gm_type S 3 1 1 0 ∪ gm_type S 3 0 2 0 have hJ (alpha : Fin (gm_A S).card → ℕ) : (∑ i ∈ J, alpha i)=gm_group S 1 alpha+gm_group S 2 alpha := Finset.sum_union (gm_indices_disjoint S 1 2 (by omega)) have hU0 : U0 ⊆ gm_values S := by intro x hx rcases Finset.mem_union.1 hx with hb | hw · exact w23_gm_type_values S 2 2 0 0 hb · exact w23_gm_type_values S 3 2 0 0 (Finset.mem_filter.1 hw).1 have hU1 : U1 ⊆ gm_values S := Finset.union_subset (w23_gm_type_values S 3 1 1 0) (w23_gm_type_values S 3 0 2 0) have hH : gm_H S ⊆ gm_values S := fun x hx => (w23_gm_H_data S hq hx).1 have hd0 : ∀ x ∈ U0, (∑ i ∈ I, gm_rep (gm_A S) x i)=0 := by intro x hx rcases Finset.mem_union.1 hx with hb | hw · exact (Finset.mem_filter.1 hb).2.2.2.1 · exact (Finset.mem_filter.1 (Finset.mem_filter.1 hw).1).2.2.2.1 have hd1 : ∀ x ∈ U1, (∑ i ∈ J, gm_rep (gm_A S) x i)=2 := by intro x hx rw [hJ] rcases Finset.mem_union.1 hx with hx | hx <;> obtain ⟨_,_,hb,hc,_⟩ := Finset.mem_filter.1 hx <;> omega have hdH : ∀ x ∈ gm_H S, (∑ i ∈ J, gm_rep (gm_A S) x i)=3 ∧ 0 < ∑ i ∈ I, gm_rep (gm_A S) x i := by intro x hx rw [hJ] obtain ⟨_,_,hdeg,hpos,_⟩ := w23_gm_H_data S hq hx exact ⟨hdeg,hpos⟩ have hdis : Disjoint U0 U1 := by apply Finset.disjoint_left.2 intro x hx hy have hz := hd0 x hx change gm_group S 2 (gm_rep (gm_A S) x)=0 at hz rcases Finset.mem_union.1 hy with hy | hy <;> have hp := (Finset.mem_filter.1 hy).2.2.2.1 <;> omega have hI : I.card=(w23_P S 2).card := w23_gm_indices_card_P S hq 2 (by omega) (by omega) have hJcard : J.card=(w23_X S 1).card+(w23_P S 2).card := by rw [Finset.card_union_of_disjoint (gm_indices_disjoint S 1 2 (by omega)), w23_gm_indices_card_B S hq,w23_gm_indices_card_P S hq 2 (by omega) (by omega)] have hdis0 : Disjoint (gm_type S 2 2 0 0) (gm_wlow S) := by apply Finset.disjoint_left.2 intro x hx hy exact Finset.disjoint_left.1 (gm_type_disjoint S 2 2 0 0 3 2 0 0 (by omega)) hx (Finset.mem_filter.1 hy).1 have h0 : U0.card=(gm_type S 2 2 0 0).card+(gm_wlow S).card := Finset.card_union_of_disjoint hdis0 have h1 : U1.card=(gm_type S 3 1 1 0).card+(gm_type S 3 0 2 0).card := Finset.card_union_of_disjoint (gm_type_disjoint S 3 1 1 0 3 0 2 0 (by omega)) have hdisH : Disjoint (gm_type S 4 2 1 0 ∪ gm_type S 4 1 2 0) (gm_type S 4 0 3 0) := by rw [Finset.disjoint_union_left] exact ⟨gm_type_disjoint S 4 2 1 0 4 0 3 0 (by omega),gm_type_disjoint S 4 1 2 0 4 0 3 0 (by omega)⟩ have hHcard : (gm_H S).card=(gm_h0 S).card+(gm_h1 S).card+ (gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card := by rw [gm_H,Finset.card_union_of_disjoint hdisH, Finset.card_union_of_disjoint (gm_type_disjoint S 4 2 1 0 4 1 2 0 (by omega)),← gm_h_card S] have he : 3*(gm_H S).card=I.card*U0.card+(J.card+2)*U1.card := by rwa [hI,hJcard,h0,h1,hHcard] exact w23_gs_lift_mixed_saturated S hq I J (by exact Finset.subset_union_right) U0 U1 (gm_H S) hU0 hU1 hH hdis hd0 hd1 hdH (fun x hx i hi hp => w23_gm_H_parent S hq hx hi hp) he lemma w23_gs_rep_image_value (S : NumericalSemigroup) (hq : w23_q S=4) (V : Finset ℕ) (hV : V ⊆ gm_values S) {alpha : Fin (gm_A S).card → ℕ} (ha : alpha ∈ V.image (gm_rep (gm_A S))) : m3_value (m3_enum (gm_A S)) alpha ∈ V ∧ gm_rep (gm_A S) (m3_value (m3_enum (gm_A S)) alpha)=alpha := by classical obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha have hs := (gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq (hV hx))).2 rw [hs] exact ⟨hx,rfl⟩ lemma gs_pair_cross_injective {N : ℕ} (B C : Finset (Fin N)) (hd : Disjoint B C) : Set.InjOn (fun p : Fin N × Fin N => m3_pairVector p.1 p.2) (B.product C : Set _) := by intro p hp q hq he obtain ⟨hpB,hpC⟩ := Finset.mem_product.1 hp obtain ⟨hqB,hqC⟩ := Finset.mem_product.1 hq have hpc : p.1 ≠ q.2 := by intro hh; exact Finset.disjoint_left.1 hd hpB (hh.symm ▸ hqC) have hpp : p.1 ≠ p.2 := by intro hh; exact Finset.disjoint_left.1 hd hpB (hh.symm ▸ hpC) have hpq : p.1=q.1 := by by_contra hn have h := congrFun he p.1 simp [m3_pairVector,m3_unitAdd,hpc,hpp,hn] at h have hsecond := m3_unitAdd_injective p.1 (by simpa only [m3_pairVector,← hpq] using he) have hpq2 : p.2=q.2 := by by_contra hn have h := congrFun hsecond p.2 simp [m3_unitAdd,hn] at h exact Prod.ext hpq hpq2 lemma gs_group_pair {N : ℕ} (J : Finset (Fin N)) (i j : Fin N) : (∑ k ∈ J, m3_pairVector i j k)= (if i ∈ J then 1 else 0)+(if j ∈ J then 1 else 0) := by classical simp [m3_pairVector,m3_unitAdd,Finset.sum_add_distrib,Nat.add_comm] lemma gs_pair_repr_cross {N : ℕ} (B C : Finset (Fin N)) (hd : Disjoint B C) (alpha : Fin N → ℕ) (hdeg : m3_degree alpha=2) (hB : (∑ i ∈ B, alpha i)=1) (hC : (∑ i ∈ C, alpha i)=1) : alpha ∈ (B.product C).image (fun p => m3_pairVector p.1 p.2) := by classical obtain ⟨i,j,hij,he⟩ := m3_degree_two_repr alpha hdeg rw [he,gs_group_pair] at hB hC by_cases hi : i ∈ B · have hj : j ∈ C := by have hn : i ∉ C := fun hh => Finset.disjoint_left.1 hd hi hh simp only [if_neg hn] at hC by_contra hn' simp [hn'] at hC exact Finset.mem_image.2 ⟨(i,j),Finset.mem_product.2 ⟨hi,hj⟩,he.symm⟩ · have hj : j ∈ B := by by_contra hn simp [hi,hn] at hB have hiC : i ∈ C := by have hn : j ∉ C := fun hh => Finset.disjoint_left.1 hd hj hh simp only [if_neg hn] at hC by_contra hn' simp [hn'] at hC exact Finset.mem_image.2 ⟨(j,i),Finset.mem_product.2 ⟨hj,hiC⟩, (m3_pairVector_comm j i).trans he.symm⟩ lemma w23_gs_BC_saturated (S : NumericalSemigroup) (hq : w23_q S=4) (he : (gm_type S 3 1 1 0).card=(w23_X S 1).card*(w23_P S 2).card) {i j : Fin (gm_A S).card} (hi : i ∈ gm_indices S 1) (hj : j ∈ gm_indices S 2) : m3_pairVector i j ∈ (gm_type S 3 1 1 0).image (gm_rep (gm_A S)) := by classical let E := (gm_type S 3 1 1 0).image (gm_rep (gm_A S)) let F := ((gm_indices S 1).product (gm_indices S 2)).image (fun p => m3_pairVector p.1 p.2) have hsub : E ⊆ F := by intro alpha ha obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha have hV := w23_gm_type_values S 3 1 1 0 hx have hs := gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq hV) have hg := w23_gm_group_degree S hq (gm_rep (gm_A S) x) obtain ⟨_,_,hb,hc,hd⟩ := Finset.mem_filter.1 hx apply gs_pair_repr_cross _ _ (gm_indices_disjoint S 1 2 (by omega)) · omega · exact hb · exact hc have hcE : E.card=(gm_type S 3 1 1 0).card := gm_rep_image_card (gm_A S) _ (fun x hx => w23_gm_values_repr S hq (w23_gm_type_values S 3 1 1 0 hx)) have hcF : F.card=(w23_X S 1).card*(w23_P S 2).card := by rw [Finset.card_image_of_injOn (gs_pair_cross_injective _ _ (gm_indices_disjoint S 1 2 (by omega))), show ((gm_indices S 1).product (gm_indices S 2)).card = (gm_indices S 1).card*(gm_indices S 2).card from by rw [Finset.product_eq_sprod,Finset.card_product], w23_gm_indices_card_B S hq, w23_gm_indices_card_P S hq 2 (by omega) (by omega)] have hEF : E=F := Finset.eq_of_subset_of_card_le hsub (by omega) rw [show (gm_type S 3 1 1 0).image (gm_rep (gm_A S))=F from hEF] exact Finset.mem_image.2 ⟨(i,j),Finset.mem_product.2 ⟨hi,hj⟩,rfl⟩ noncomputable def gs_Canon (S : NumericalSemigroup) (alpha : Fin (gm_A S).card → ℕ) : Prop := m3_value (m3_enum (gm_A S)) alpha ∈ gm_values S ∧ gm_rep (gm_A S) (m3_value (m3_enum (gm_A S)) alpha)=alpha lemma w23_gs_canon_of_image (S : NumericalSemigroup) (hq : w23_q S=4) (V : Finset ℕ) (hV : V ⊆ gm_values S) {alpha : Fin (gm_A S).card → ℕ} (ha : alpha ∈ V.image (gm_rep (gm_A S))) : gs_Canon S alpha := by have h := w23_gs_rep_image_value S hq V hV ha exact ⟨hV h.1,h.2⟩ lemma w23_gs_canon_parent (S : NumericalSemigroup) (hq : w23_q S=4) {alpha : Fin (gm_A S).card → ℕ} (ha : gs_Canon S alpha) (i : Fin (gm_A S).card) (hi : 0 < alpha i) : gs_Canon S (m3_parent alpha i) := by have hp := w23_gm_values_parent S hq ha.1 i (by rw [ha.2]; exact hi) rw [ha.2] at hp exact ⟨hp.1,hp.2.symm⟩ lemma gs_unitAdd_pair_permute {N : ℕ} (i j k : Fin N) : m3_unitAdd (m3_pairVector i j) k=m3_unitAdd (m3_pairVector i k) j := by funext n simp only [m3_pairVector,m3_unitAdd] omega lemma gs_parent_pair_add {N : ℕ} (i j k : Fin N) : m3_parent (m3_unitAdd (m3_pairVector i j) k) j=m3_pairVector i k := by rw [gs_unitAdd_pair_permute,m3_parent_unitAdd] lemma w23_gs_indices_noP3 (S : NumericalSemigroup) (hq : w23_q S=4) (hz : (w23_P S 3).card=0) : ∀ i : Fin (gm_A S).card, i ∈ gm_indices S 1 ∨ i ∈ gm_indices S 2 := by intro i rcases w23_gm_enum_levels S hq i with h | h | h · exact Or.inl (by simpa [gm_indices] using h) · exact Or.inr (by simpa [gm_indices] using h) · have hp := ((w23_gm_mem_A S _).1 (m3_enum_mem (gm_A S) i)).1 have he : w23_P S 3=∅ := Finset.card_eq_zero.1 hz have hm : m3_enum (gm_A S) i ∈ w23_P S 3 := (w23_mem_P S 3 _).2 ⟨hp,h⟩ simpa [he] using hm lemma gs_image_extend {N : ℕ} (rep : ℕ → Fin N → ℕ) (V H : Finset ℕ) (J : Finset (Fin N)) (he : ∀ x ∈ V, ∀ i ∈ J, m3_unitAdd (rep x) i ∈ H.image rep) {alpha : Fin N → ℕ} (ha : alpha ∈ V.image rep) {i : Fin N} (hi : i ∈ J) : m3_unitAdd alpha i ∈ H.image rep := by obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha exact he x hx i hi lemma w23_gs_all_pairs_canonical (S : NumericalSemigroup) (hq : w23_q S=4) (hz : (w23_P S 3).card=0) (hBpos : (gm_indices S 1).Nonempty) (hCpos : (gm_indices S 2).Nonempty) (hBC : ∀ i ∈ gm_indices S 1, ∀ j ∈ gm_indices S 2, m3_pairVector i j ∈ (gm_type S 3 1 1 0).image (gm_rep (gm_A S))) (hcl : ∀ x ∈ gm_type S 3 1 1 0 ∪ gm_type S 3 0 2 0, ∀ i ∈ gm_indices S 1 ∪ gm_indices S 2, m3_unitAdd (gm_rep (gm_A S) x) i ∈ (gm_H S).image (gm_rep (gm_A S))) : ∀ i j : Fin (gm_A S).card, gs_Canon S (m3_pairVector i j) := by classical have hH : gm_H S ⊆ gm_values S := fun x hx => (w23_gm_H_data S hq hx).1 have hBCsub : (gm_type S 3 1 1 0).image (gm_rep (gm_A S)) ⊆ (gm_type S 3 1 1 0 ∪ gm_type S 3 0 2 0).image (gm_rep (gm_A S)) := Finset.image_subset_image Finset.subset_union_left intro i j rcases w23_gs_indices_noP3 S hq hz i with hi | hi <;> rcases w23_gs_indices_noP3 S hq hz j with hj | hj · obtain ⟨k,hk⟩ := hCpos have hpair := hBCsub (hBC i hi k hk) have htr := gs_image_extend (gm_rep (gm_A S)) _ _ _ hcl hpair (Finset.mem_union.2 (Or.inl hj)) have hc := w23_gs_canon_of_image S hq (gm_H S) hH htr have hp : 0 < m3_unitAdd (m3_pairVector i k) j k := by simp only [m3_pairVector,m3_unitAdd,ite_true] omega have hcanon := w23_gs_canon_parent S hq hc k hp simpa only [gs_parent_pair_add] using hcanon · exact w23_gs_canon_of_image S hq _ (w23_gm_type_values S 3 1 1 0) (hBC i hi j hj) · rw [m3_pairVector_comm] exact w23_gs_canon_of_image S hq _ (w23_gm_type_values S 3 1 1 0) (hBC j hj i hi) · obtain ⟨k,hk⟩ := hBpos have hpair := hBCsub (hBC k hk i hi) have htr := gs_image_extend (gm_rep (gm_A S)) _ _ _ hcl hpair (Finset.mem_union.2 (Or.inr hj)) have hc := w23_gs_canon_of_image S hq (gm_H S) hH htr have hp : 0 < m3_unitAdd (m3_pairVector k i) j k := by simp only [m3_pairVector,m3_unitAdd,ite_true] omega have hcanon := w23_gs_canon_parent S hq hc k hp have he : m3_parent (m3_unitAdd (m3_pairVector k i) j) k=m3_pairVector i j := by rw [m3_pairVector_comm k i,gs_parent_pair_add] simpa only [he] using hcanon lemma w23_gs_CC_left (S : NumericalSemigroup) (hq : w23_q S=4) (hBpos : (gm_indices S 1).Nonempty) (hBC : ∀ i ∈ gm_indices S 1, ∀ j ∈ gm_indices S 2, m3_pairVector i j ∈ (gm_type S 3 1 1 0).image (gm_rep (gm_A S))) (hcl : ∀ x ∈ gm_type S 3 1 1 0 ∪ gm_type S 3 0 2 0, ∀ i ∈ gm_indices S 1 ∪ gm_indices S 2, m3_unitAdd (gm_rep (gm_A S) x) i ∈ (gm_H S).image (gm_rep (gm_A S))) {i j : Fin (gm_A S).card} (hi : i ∈ gm_indices S 2) (hj : j ∈ gm_indices S 2) : m3_enum (gm_A S) i+m3_enum (gm_A S) j (w23_gm_H_data S hq hx).1) htr have hlt := w23_apery_lt S (Finset.mem_filter.1 ((w23_gm_H_data S hq hdata.1).1)).1 rw [m3_value_unitAdd,oh_pair_value] at hlt have hklo := w23_gm_A_bounds S (m3_enum_mem (gm_A S) k) omega lemma w23_gs_canon_degree (S : NumericalSemigroup) (hq : w23_q S=4) {alpha : Fin (gm_A S).card → ℕ} (ha : gs_Canon S alpha) : gm_degree (gm_A S) (m3_value (m3_enum (gm_A S)) alpha)=m3_degree alpha := by have hs := (gm_rep_spec (gm_A S) _ (w23_gm_values_repr S hq ha.1)).1 rw [ha.2] at hs exact hs.symm lemma w23_gs_BB_type (S : NumericalSemigroup) (hq : w23_q S=4) (hb : (gm_type S 2 2 0 0).card=0) {i j : Fin (gm_A S).card} (hi : i ∈ gm_indices S 1) (hj : j ∈ gm_indices S 1) (ha : gs_Canon S (m3_pairVector i j)) : m3_value (m3_enum (gm_A S)) (m3_pairVector i j) ∈ gm_type S 3 2 0 0 := by classical let x := m3_value (m3_enum (gm_A S)) (m3_pairVector i j) change x ∈ gm_type S 3 2 0 0 have hdeg : gm_degree (gm_A S) x=2 := by simpa only [m3_degree_pairVector] using w23_gs_canon_degree S hq ha have hn := w23_gm_rep_degree_nonprimitive S hq ha.1 (by change 2 ≤ gm_degree (gm_A S) x; omega) have hl := w23_gm_degree_le S _ x (gm_degree_spec (gm_A S) x (w23_gm_values_repr S hq ha.1)).1 rw [hdeg] at hl have hlev := w23_level_apery_le S (Finset.mem_filter.1 ha.1).1 rw [hq] at hlev have hX : x ∈ w23_X S (w23_level S x) := (w23_mem_X S _ x).2 ⟨(Finset.mem_filter.1 ha.1).1,rfl⟩ have ht := w23_gm_type_table S hq hl hX hn have hB : gm_group S 1 (gm_rep (gm_A S) x)=2 := by rw [ha.2] change (∑ k ∈ gm_indices S 1, m3_pairVector i j k)=2 rw [gs_group_pair] simp [hi,hj] have hC : gm_group S 2 (gm_rep (gm_A S) x)=0 := by rw [ha.2] have hi2 : i ∉ gm_indices S 2 := fun hh => Finset.disjoint_left.1 (gm_indices_disjoint S 1 2 (by omega)) hi hh have hj2 : j ∉ gm_indices S 2 := fun hh => Finset.disjoint_left.1 (gm_indices_disjoint S 1 2 (by omega)) hj hh change (∑ k ∈ gm_indices S 2, m3_pairVector i j k)=0 simp [gs_group_pair,hi2,hj2] have hD : gm_group S 3 (gm_rep (gm_A S) x)=0 := by have hg := w23_gm_group_degree S hq (gm_rep (gm_A S) x) have hs := (gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq ha.1)).1 omega have he : gm_type S 2 2 0 0=∅ := Finset.card_eq_zero.1 hb rcases ht with ⟨h2,h2type⟩ | ⟨h3,h3type⟩ | ⟨h4,h4type⟩ · simpa [he] using h2type · simpa [Finset.mem_union,gm_type,hB,hC,hD] using h3type · simp only [Finset.mem_union,gm_type,Finset.mem_filter,hB,hC,hD] at h4type omega lemma w23_gs_CC_type (S : NumericalSemigroup) (hq : w23_q S=4) {i j : Fin (gm_A S).card} (hi : i ∈ gm_indices S 2) (hj : j ∈ gm_indices S 2) (ha : gs_Canon S (m3_pairVector i j)) (hleft : m3_enum (gm_A S) i+m3_enum (gm_A S) j Finset.disjoint_left.1 (gm_indices_disjoint S 1 2 (by omega)) hh hi have hj1 : j ∉ gm_indices S 1 := fun hh => Finset.disjoint_left.1 (gm_indices_disjoint S 1 2 (by omega)) hh hj exact by simp [gm_group,gs_group_pair,hi1,hj1] have hC : gm_group S 2 (m3_pairVector i j)=2 := by simp [gm_group,gs_group_pair,hi,hj] have hD : gm_group S 3 (m3_pairVector i j)=0 := by have hg := w23_gm_group_degree S hq (m3_pairVector i j) rw [m3_degree_pairVector] at hg omega rw [hB,hC,hD] at hlo have hlt : x (Finset.mem_filter.1 hx).2.2.1 have hdC : ∀ x ∈ C, (∑ i ∈ J, gm_rep (gm_A S) x i)=3 ∧ 0 < ∑ i ∈ J, gm_rep (gm_A S) x i := by intro x hx have hg := (Finset.mem_filter.1 hx).2.2.1 exact ⟨hg,by change 0 < gm_group S 1 (gm_rep (gm_A S) x); omega⟩ have hparent : ∀ x ∈ C, ∀ i ∈ J, 0 < gm_rep (gm_A S) x i → m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) ∈ (∅ : Finset ℕ) ∪ B := by intro x hx i hi hp have ht := w23_gm_parent_pure S hq 4 3 (by omega) hx hi hp let y := m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) change y ∈ gm_type S (w23_level S y) 2 0 0 ∧ 2 ≤ w23_level S y ∧ w23_level S y+1 ≤ 4 at ht have hy3 : w23_level S y=3 := by by_contra hn have hy2 : w23_level S y=2 := by omega have hm : y ∈ gm_type S 2 2 0 0 := by simpa only [hy2] using ht.1 have he : gm_type S 2 2 0 0=∅ := Finset.card_eq_zero.1 hb simpa [he] using hm exact Finset.mem_union.2 (Or.inr (by simpa only [hy3] using ht.1)) have he : 3*C.card=J.card*(∅ : Finset ℕ).card+(J.card+2)*B.card := by simpa only [Finset.card_empty,Nat.mul_zero,Nat.zero_add] using hsat have hh := (w23_gs_lift_mixed_saturated S hq J J (fun _ h => h) ∅ B C (by simp) hB hC (by simp) (by simp) hdB hdC hparent he).2 exact hh lemma w23_gs_all_triples_canonical (S : NumericalSemigroup) (hq : w23_q S=4) (hz : (w23_P S 3).card=0) (hb : (gm_type S 2 2 0 0).card=0) (hBpos : (gm_indices S 1).Nonempty) (hBC : ∀ i ∈ gm_indices S 1, ∀ j ∈ gm_indices S 2, m3_pairVector i j ∈ (gm_type S 3 1 1 0).image (gm_rep (gm_A S))) (hpair : ∀ i j : Fin (gm_A S).card, gs_Canon S (m3_pairVector i j)) (hcl : ∀ x ∈ gm_type S 3 1 1 0 ∪ gm_type S 3 0 2 0, ∀ i ∈ gm_indices S 1 ∪ gm_indices S 2, m3_unitAdd (gm_rep (gm_A S) x) i ∈ (gm_H S).image (gm_rep (gm_A S))) (hpure : ∀ x ∈ gm_type S 3 2 0 0, ∀ i ∈ gm_indices S 1, m3_unitAdd (gm_rep (gm_A S) x) i ∈ (gm_type S 4 3 0 0).image (gm_rep (gm_A S))) : ∀ i j k : Fin (gm_A S).card, gs_Canon S (m3_unitAdd (m3_pairVector i j) k) := by classical have hH : gm_H S ⊆ gm_values S := fun x hx => (w23_gm_H_data S hq hx).1 have hBCsub : (gm_type S 3 1 1 0).image (gm_rep (gm_A S)) ⊆ (gm_type S 3 1 1 0 ∪ gm_type S 3 0 2 0).image (gm_rep (gm_A S)) := Finset.image_subset_image Finset.subset_union_left have hI (i : Fin (gm_A S).card) : i ∈ gm_indices S 1 ∪ gm_indices S 2 := Finset.mem_union.2 (w23_gs_indices_noP3 S hq hz i) intro i j k rcases w23_gs_indices_noP3 S hq hz i with hi | hi <;> rcases w23_gs_indices_noP3 S hq hz j with hj | hj · rcases w23_gs_indices_noP3 S hq hz k with hk | hk · have hx := w23_gs_BB_type S hq hb hi hj (hpair i j) have hc := (hpair i j).2 have hm := hpure _ hx k hk rw [hc] at hm exact w23_gs_canon_of_image S hq _ (w23_gm_type_values S 4 3 0 0) hm · have hm := gs_image_extend (gm_rep (gm_A S)) _ _ _ hcl (hBCsub (hBC i hi k hk)) (hI j) rw [← gs_unitAdd_pair_permute] at hm exact w23_gs_canon_of_image S hq _ hH hm · exact w23_gs_canon_of_image S hq _ hH (gs_image_extend (gm_rep (gm_A S)) _ _ _ hcl (hBCsub (hBC i hi j hj)) (hI k)) · rw [m3_pairVector_comm] exact w23_gs_canon_of_image S hq _ hH (gs_image_extend (gm_rep (gm_A S)) _ _ _ hcl (hBCsub (hBC j hj i hi)) (hI k)) · have hleft := w23_gs_CC_left S hq hBpos hBC hcl hi hj have hx := w23_gs_CC_type S hq hi hj (hpair i j) hleft have hm := hcl _ (Finset.mem_union.2 (Or.inr hx)) k (hI k) rw [(hpair i j).2] at hm exact w23_gs_canon_of_image S hq _ hH hm lemma w23_gs_ball_canonical (S : NumericalSemigroup) (hq : w23_q S=4) (hpos : (gm_A S).Nonempty) (hpairs : ∀ i j : Fin (gm_A S).card, gs_Canon S (m3_pairVector i j)) (htriples : ∀ i j k : Fin (gm_A S).card, gs_Canon S (m3_unitAdd (m3_pairVector i j) k)) : ∀ alpha : Fin (gm_A S).card → ℕ, m3_degree alpha≤3 → gs_Canon S alpha := by have hN : 0 < (gm_A S).card := Finset.card_pos.2 hpos let i : Fin (gm_A S).card := ⟨0,hN⟩ have hunit (j : Fin (gm_A S).card) : gs_Canon S (m3_unitAdd (fun _ => 0) j) := by have hh := w23_gs_canon_parent S hq (hpairs j j) j (by simp [m3_pairVector,m3_unitAdd]) simpa only [m3_pairVector,m3_parent_unitAdd] using hh have hzero : gs_Canon S (fun _ => 0) := by have hh := w23_gs_canon_parent S hq (hunit i) i (by simp [m3_unitAdd]) simpa only [m3_parent_unitAdd] using hh intro alpha hd have ha := Nat.zero_le (m3_degree alpha) interval_cases hdeg : m3_degree alpha · rw [m3_degree_zero alpha hdeg] exact hzero · obtain ⟨j,hj⟩ := m3_degree_one_repr alpha hdeg rw [hj] exact hunit j · obtain ⟨j,k,_,he⟩ := m3_degree_two_repr alpha hdeg rw [he] exact hpairs j k · obtain ⟨j,k,l,_,_,he⟩ := m3_degree_three_repr alpha hdeg rw [he,m3_tripleVector] exact htriples k l j def gs_signed_index (n : ℕ) := {v : Fin n × Fin n × Fin n // v.1 ≤ v.2.1 ∧ v.1 ≠ v.2.2 ∧ v.2.1 ≠ v.2.2} theorem gs_signed_injective {G : Type*} [AddCommGroup G] (n : ℕ) (f : Fin n → G) (hB3 : ∀ a b c d e g : Fin n, f a + f b + f c = f d + f e + f g → ({a, b, c} : Multiset (Fin n)) = {d, e, g}) : Function.Injective (fun v : gs_signed_index n => f v.val.1 + f v.val.2.1 - f v.val.2.2) := by rintro ⟨⟨a, b, c⟩, hab, hac, hbc⟩ ⟨⟨d, e, g⟩, hde, hdg, heg⟩ hval dsimp at hab hac hbc hde hdg heg change f a + f b - f c = f d + f e - f g at hval have hm := hB3 a b g d e c ((sub_eq_sub_iff_add_eq_add).mp hval) have hmc : c ∈ ({a, b, g} : Multiset (Fin n)) := by rw [hm] simp [Multiset.insert_eq_cons] have hcg : c = g := by simp only [Multiset.insert_eq_cons, Multiset.mem_cons, Multiset.mem_singleton] at hmc rcases hmc with h | h | h · exact False.elim (hac h.symm) · exact False.elim (hbc h.symm) · exact h subst g have hp : ({a, b} : Multiset (Fin n)) = {d, e} := by apply add_right_cancel (b := ({c} : Multiset (Fin n))) simpa only [Multiset.insert_eq_cons, Multiset.cons_add, Multiset.singleton_add] using hm have hma : a = d ∨ a = e := by have h : a ∈ ({d, e} : Multiset (Fin n)) := by rw [← hp]; simp [Multiset.insert_eq_cons] simpa only [Multiset.insert_eq_cons, Multiset.mem_cons, Multiset.mem_singleton] using h have hmd : d = a ∨ d = b := by have h : d ∈ ({a, b} : Multiset (Fin n)) := by rw [hp]; simp [Multiset.insert_eq_cons] simpa only [Multiset.insert_eq_cons, Multiset.mem_cons, Multiset.mem_singleton] using h have had : a = d := by rcases hma with h | h · exact h · rcases hmd with h' | h' · exact h'.symm · omega subst d have hbe : b = e := by have hp' : a ::ₘ ({b} : Multiset (Fin n)) = a ::ₘ {e} := by simpa only [Multiset.insert_eq_cons] using hp simpa only [Multiset.singleton_inj] using (Multiset.cons_inj_right a).mp hp' apply Subtype.ext simp [hbe] theorem gs_signed_not_generator {G : Type*} [AddCommGroup G] (n : ℕ) (f : Fin n → G) (hB3 : ∀ a b c d e g : Fin n, f a + f b + f c = f d + f e + f g → ({a, b, c} : Multiset (Fin n)) = {d, e, g}) (v : gs_signed_index n) (i : Fin n) : f v.val.1 + f v.val.2.1 - f v.val.2.2 ≠ f i := by rcases v with ⟨⟨a, b, c⟩, hab, hac, hbc⟩ dsimp at hab hac hbc intro hval change f a + f b - f c = f i at hval have hpair : f a + f b = f c + f i := by apply (sub_eq_iff_eq_add).mp at hval simpa [add_comm] using hval have hm := hB3 a b a c i a (congrArg (fun x => x + f a) hpair) have hp : ({a, b} : Multiset (Fin n)) = {c, i} := by apply add_right_cancel (b := ({a} : Multiset (Fin n))) simpa only [Multiset.insert_eq_cons, Multiset.cons_add, Multiset.singleton_add] using hm have hmc : c ∈ ({a, b} : Multiset (Fin n)) := by rw [hp]; simp [Multiset.insert_eq_cons] simp only [Multiset.insert_eq_cons, Multiset.mem_cons, Multiset.mem_singleton] at hmc rcases hmc with h | h · exact hac h.symm · exact hbc h.symm theorem gs_signed_packing_injection {G : Type*} [AddCommGroup G] (n : ℕ) (f : Fin n → G) (hB3 : ∀ a b c d e g : Fin n, f a + f b + f c = f d + f e + f g → ({a, b, c} : Multiset (Fin n)) = {d, e, g}) : Function.Injective (Sum.elim f (fun v : gs_signed_index n => f v.val.1 + f v.val.2.1 - f v.val.2.2)) := by have hfinj : Function.Injective f := by intro i j hij have hm := hB3 i i i j i i (by rw [hij]) have hm' : i ::ₘ ({i, i} : Multiset (Fin n)) = j ::ₘ {i, i} := by simpa only [Multiset.insert_eq_cons] using hm exact (Multiset.cons_inj_left ({i, i} : Multiset (Fin n))).mp hm' intro v w hvw cases v with | inl i => cases w with | inl j => exact congrArg Sum.inl (hfinj hvw) | inr u => exact False.elim (gs_signed_not_generator n f hB3 u i hvw.symm) | inr u => cases w with | inl i => exact False.elim (gs_signed_not_generator n f hB3 u i hvw) | inr v => exact congrArg Sum.inr (gs_signed_injective n f hB3 hvw) theorem gs_signed_packing_card {G : Type*} [AddCommGroup G] [Fintype G] (n : ℕ) (f : Fin n → G) (hB3 : ∀ a b c d e g : Fin n, f a + f b + f c = f d + f e + f g → ({a, b, c} : Multiset (Fin n)) = {d, e, g}) : n + Nat.card (gs_signed_index n) ≤ Fintype.card G := by classical letI : Fintype (gs_signed_index n) := by unfold gs_signed_index infer_instance have h := Fintype.card_le_of_injective _ (gs_signed_packing_injection n f hB3) simpa only [Fintype.card_sum, Fintype.card_fin, Nat.card_eq_fintype_card] using h theorem gs_ordered_pair_card {α : Type*} [Fintype α] [LinearOrder α] : Fintype.card {p : α × α // p.1 ≤ p.2} = (Fintype.card α).choose 2 + Fintype.card α := by classical have hsplit : (Finset.univ.filter (fun p : α × α => p.1 ≤ p.2)) = Finset.univ.filter (fun p : α × α => p.1 < p.2) ∪ Finset.univ.filter (fun p : α × α => p.1 = p.2) := by ext p simp [le_iff_lt_or_eq] have hdisj : Disjoint (Finset.univ.filter (fun p : α × α => p.1 < p.2)) (Finset.univ.filter (fun p : α × α => p.1 = p.2)) := by apply Finset.disjoint_left.mpr intro p hp hq simp only [Finset.mem_filter] at hp hq exact (ne_of_lt hp.2) hq.2 have hdiag : (Finset.univ.filter (fun p : α × α => p.1 = p.2)) = (Finset.univ : Finset α).image (fun a => (a, a)) := by ext p simp only [Finset.mem_filter, Finset.mem_univ, true_and, Finset.mem_image] constructor · intro hp exact ⟨p.1, by ext <;> simp [hp]⟩ · rintro ⟨a, hp⟩ rw [← hp] rw [Fintype.card_subtype, hsplit, Finset.card_union_of_disjoint hdisj, Fintype.card_product_filter_lt, hdiag, Finset.card_image_of_injective] · simp only [Finset.card_univ] · intro a b hab exact congrArg Prod.fst hab def gs_signed_index_equiv (n : ℕ) : gs_signed_index n ≃ Σ c : Fin n, {p : {i : Fin n // i ≠ c} × {i : Fin n // i ≠ c} // p.1 ≤ p.2} where toFun v := ⟨v.val.2.2, ⟨(⟨v.val.1, v.property.2.1⟩, ⟨v.val.2.1, v.property.2.2⟩), v.property.1⟩⟩ invFun v := ⟨(v.2.val.1.val, v.2.val.2.val, v.1), v.2.property, v.2.val.1.property, v.2.val.2.property⟩ left_inv v := by cases v; rfl right_inv v := by cases v; rfl theorem gs_avoiding_pair_card (n : ℕ) (c : Fin n) : Fintype.card {p : {i : Fin n // i ≠ c} × {i : Fin n // i ≠ c} // p.1 ≤ p.2} = n.choose 2 := by classical have hcard : Fintype.card {i : Fin n // i ≠ c} = n - 1 := by simpa only [Fintype.card_fin, Fintype.card_subtype_eq] using Fintype.card_subtype_compl (fun i : Fin n => i = c) have hn : 0 < n := by have := c.isLt; omega have hsucc : n - 1 + 1 = n := by omega rw [gs_ordered_pair_card, hcard] conv_rhs => rw [← hsucc, Nat.choose_succ_succ', Nat.choose_one_right] exact Nat.add_comm _ _ theorem gs_signed_index_card (n : ℕ) : Nat.card (gs_signed_index n) = n * n.choose 2 := by classical letI : Fintype (gs_signed_index n) := by unfold gs_signed_index infer_instance rw [Nat.card_eq_fintype_card, Fintype.card_congr (gs_signed_index_equiv n), Fintype.card_sigma] simp only [gs_avoiding_pair_card, Finset.sum_const, Finset.card_univ, Fintype.card_fin, smul_eq_mul] theorem gs_signed_B3_card_bound {G : Type*} [AddCommGroup G] [Fintype G] (n : ℕ) (f : Fin n → G) (hB3 : ∀ a b c d e g : Fin n, f a + f b + f c = f d + f e + f g → ({a, b, c} : Multiset (Fin n)) = {d, e, g}) : n + n * n.choose 2 ≤ Fintype.card G := by have h := gs_signed_packing_card n f hB3 rwa [gs_signed_index_card] at h theorem gs_cyclic_B3_card_bound (m n : ℕ) [NeZero m] (f : Fin n → ZMod m) (hB3 : ∀ a b c d e g : Fin n, f a + f b + f c = f d + f e + f g → ({a, b, c} : Multiset (Fin n)) = {d, e, g}) : n + n * n.choose 2 ≤ m := by simpa only [ZMod.card] using gs_signed_B3_card_bound n f hB3 lemma gs_triple_multiset_eq {N : ℕ} (a b c d e f : Fin N) (h : m3_tripleVector a b c=m3_tripleVector d e f) : ({a,b,c} : Multiset (Fin N))={d,e,f} := by classical apply Multiset.ext.2 intro i have hh := congrFun h i simp only [m3_tripleVector,m3_pairVector,m3_unitAdd] at hh simpa [Multiset.insert_eq_cons,Multiset.count_cons,Multiset.count_singleton,eq_comm] using hh lemma w23_gs_ball_B3_bound (S : NumericalSemigroup) (hq : w23_q S=4) (hball : ∀ alpha : Fin (gm_A S).card → ℕ, m3_degree alpha≤3 → gs_Canon S alpha) : (gm_A S).card+1+((gm_A S).card+1)*((gm_A S).card+1).choose 2≤S.multiplicity := by classical let N := (gm_A S).card let val : Fin (N+1) → ℕ := Fin.cases 0 (m3_enum (gm_A S)) let f : Fin (N+1) → ZMod S.multiplicity := fun i => (val i : ZMod S.multiplicity) letI : NeZero S.multiplicity := ⟨S.multiplicity_pos.ne'⟩ have hB3 : ∀ a b c d e g : Fin (N+1), f a+f b+f c=f d+f e+f g → ({a,b,c} : Multiset (Fin (N+1)))={d,e,g} := by intro a b c d e g hcast let alpha := m3_tripleVector a b c let beta := m3_tripleVector d e g let atail : Fin N → ℕ := fun i => alpha i.succ let btail : Fin N → ℕ := fun i => beta i.succ have ha3 : m3_degree alpha=3 := m3_degree_tripleVector a b c have hb3 : m3_degree beta=3 := m3_degree_tripleVector d e g have hda : alpha 0+m3_degree atail=3 := by simpa only [m3_degree,Fin.sum_univ_succ,atail] using ha3 have hdb : beta 0+m3_degree btail=3 := by simpa only [m3_degree,Fin.sum_univ_succ,btail] using hb3 have hac := hball atail (by omega) have hbc := hball btail (by omega) have hvalueA : m3_value (m3_enum (gm_A S)) atail=val a+val b+val c := by have hh : m3_value val alpha=val a+val b+val c := by change m3_value val (m3_tripleVector a b c)=val a+val b+val c rw [m3_tripleVector,m3_value_unitAdd,oh_pair_value] omega simpa [m3_value,Fin.sum_univ_succ,val,atail] using hh have hvalueB : m3_value (m3_enum (gm_A S)) btail=val d+val e+val g := by have hh : m3_value val beta=val d+val e+val g := by change m3_value val (m3_tripleVector d e g)=val d+val e+val g rw [m3_tripleVector,m3_value_unitAdd,oh_pair_value] omega simpa [m3_value,Fin.sum_univ_succ,val,btail] using hh have hres : (m3_value (m3_enum (gm_A S)) atail : ZMod S.multiplicity)= (m3_value (m3_enum (gm_A S)) btail : ZMod S.multiplicity) := by rw [hvalueA,hvalueB] simpa only [f,Nat.cast_add] using hcast have hvals := w23_apery_residue_inj S (Finset.mem_filter.1 hac.1).1 (Finset.mem_filter.1 hbc.1).1 ((ZMod.natCast_eq_natCast_iff' _ _ _).1 hres) have htail : atail=btail := by rw [← hac.2,← hbc.2,hvals] have hfull : alpha=beta := by funext i refine Fin.cases ?_ (fun j => ?_) i · have hd := congrArg m3_degree htail omega · exact congrFun htail j exact gs_triple_multiset_eq a b c d e g hfull simpa only [N,Nat.add_assoc] using gs_cyclic_B3_card_bound S.multiplicity (N+1) f hB3 lemma w23_gs_CC_right_empty (S : NumericalSemigroup) (hq : w23_q S=4) (hleft : ∀ i ∈ gm_indices S 2, ∀ j ∈ gm_indices S 2, m3_enum (gm_A S) i+m3_enum (gm_A S) j omega have hj : j ∈ gm_indices S 2 := by by_contra hh; simp [hh] at hC; split_ifs at hC <;> omega have hv : x=m3_enum (gm_A S) i+m3_enum (gm_A S) j := by rw [he,oh_pair_value] at hs exact hs.2.symm have hlt := (w23_lt_conductor_iff S x).1 (by rw [hv]; exact hleft i hi j hj) rw [((w23_mem_X S 4 x).1 hx4).2,hq] at hlt omega lemma gs_two_count_contradiction (k f H m : ℕ) (hCC : 2*f=k*(k+1)) (hH : 3*H=3*k+(k+4)*(2*k+f)) (hm : m=10+3*k+f+H) (hpack : k+3+(k+3)*(k+3).choose 2≤m) : False := by have hp : 2*(k+3).choose 2=(k+3)*(k+2) := by simpa only [Nat.choose_one_right,Nat.mul_comm,Nat.reduceAdd,Nat.add_assoc] using (Nat.add_one_mul_choose_eq (k+2) 1).symm have hm6 : 6*m=(k+3)*(k+4)*(k+5) := by nlinarith have hpos : 0 < (k+1)*(k+2)*(k+3) := by positivity nlinarith lemma w23_gs_many_right (S : NumericalSemigroup) (h1 : 3*S.multiplicity w23_gs_BC_saturated S hq (by rw [hK2]; exact hxE) hi hj have hmixE : 3*((gm_h0 S).card+(gm_h1 S).card+(gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card)= (w23_P S 2).card*((gm_type S 2 2 0 0).card+(gm_wlow S).card)+ ((w23_X S 1).card+(w23_P S 2).card+2)* ((gm_type S 3 1 1 0).card+(gm_type S 3 0 2 0).card) := by rw [hK2] change 3*(h0+h+j+l)=k*(b+wlow)+(2+k+2)*(x+f) nlinarith only [hh00,hb0,hxE,hshadowE,hkw] have hcl := (w23_gs_mixed_saturated S hq hmixE).2 have hallpair := w23_gs_all_pairs_canonical S hq hz hBpos hCpos hBCsat hcl have hpure := w23_gs_pure_saturated S hq hb0 (by rw [w23_gm_indices_card_B S hq,hK2] change 3*t=(2+2)*w omega) have halltriple := w23_gs_all_triples_canonical S hq hz hb0 hBpos hBCsat hallpair hcl hpure have hApos : (gm_A S).Nonempty := by obtain ⟨i,hi⟩ := hBpos exact ⟨m3_enum (gm_A S) i,m3_enum_mem (gm_A S) i⟩ have hball := w23_gs_ball_canonical S hq hApos hallpair halltriple have hpack := w23_gs_ball_B3_bound S hq hball have hmA : S.multiplicity ∈ w23_low_A S := (w23_low_mem_A S _).2 ⟨S.multiplicity_isPrimitive,by omega⟩ have hAc := Finset.card_erase_add_one hmA change (gm_A S).card+1=w23_n S at hAc have hne := w23_e_eq S have hAc2 : (gm_A S).card=2+k := by omega rw [hAc2] at hpack have hd0 : d=0 := w23_gs_CC_right_empty S hq (fun i hi j hj => w23_gs_CC_left S hq hBpos hBCsat hcl hi hj) apply gs_two_count_contradiction k f (h+j+l) S.multiplicity · omega · exact hshadowE · omega · rw [show 2+k+1=k+3 from by omega] at hpack exact hpack lemma gs_three_pure_rigidity (b w v t u : ℕ) (h2 : 2*(b+w)≤12) (h3 : 3*(v+t)≤5*(b+w)) (h3L : 3*v≤5*b) (h4 : 4*u≤6*v) (hbad : 36+4*b<4*(t+u)) : b=0 ∧ w=6 ∧ v=0 ∧ t=10 ∧ u=0 := by omega lemma gs_three_rigidity (k b w v t u x y f d h0 h j l wlow rho R : ℕ) (h2 : 2*(b+w)≤12) (h3 : 3*(v+t)≤5*(b+w)) (h3L : 3*v≤5*b) (h4 : 4*u≤6*v) (hBC : x+y≤3*k) (hCC : 2*(f+d)≤k*(k+1)) (hgood : h0≤k*b) (hshadow : 3*(h0+h+j+l)≤k*(b+wlow)+(k+5)*(x+f)) (hstrip : f+h+j+l≤rho) (hlow : wlow≤w) (hR : R≤t+u+y+d+h0+h+j+l) (hfail : (4+k)*(9+2*k+2*b+w+v+x+f)+rho<4*(b+w+v+x+f+R)) : b=0 ∧ w=6 ∧ v=0 ∧ t=10 ∧ u=0 ∧ h0=0 ∧ x+y=3*k ∧ 2*(f+d)=k*(k+1) ∧ y+k*(6-wlow)+(rho-(f+h+j+l))+ (k*wlow+(k+5)*(x+f)-3*(h+j+l))≤3 := by have hLow := Nat.mul_le_mul_left k hlow have hx : x≤3*k := by omega have hbad : 36+4*b<4*(t+u) := by nlinarith only [hfail,hR,hBC,hCC,hgood,hshadow,hstrip,hLow,hx] obtain ⟨hb,hw,hv,ht,hu⟩ := gs_three_pure_rigidity b w v t u h2 h3 h3L h4 hbad have hh0 : h0=0 := by rw [hb] at hgood; omega subst b w v t u h0 simp only [Nat.zero_add,Nat.add_zero] at hshadow let ell := 6-wlow let sigma := rho-(f+h+j+l) let theta := k*wlow+(k+5)*(x+f)-3*(h+j+l) have he : ell+wlow=6 := by dsimp [ell]; omega have hs : sigma+f+h+j+l=rho := by dsimp [sigma]; omega have hth : theta+3*(h+j+l)=k*wlow+(k+5)*(x+f) := by dsimp [theta]; omega let qBC := 3*k-x-y let qCC := k*(k+1)-2*(f+d) have hqb : qBC+x+y=3*k := by dsimp [qBC]; omega have hqc : qCC+2*(f+d)=k*(k+1) := by dsimp [qCC]; omega have hbd : y+k*ell+sigma+theta+4*qBC+2*qCC≤3 := by nlinarith only [hfail,hR,hqb,hqc,he,hs,hth] have hb0 : qBC=0 := by omega have heven : ∃ a : ℕ, k*(k+1)=a+a := Nat.even_mul_succ_self k obtain ⟨a,ha⟩ := heven have hc0 : qCC=0 := by omega refine ⟨rfl,rfl,rfl,rfl,rfl,rfl,?_,?_,?_⟩ · omega · omega · change y+k*ell+sigma+theta≤3 omega lemma gs_mixed_capacity {N : ℕ} (I J : Finset (Fin N)) (U0 U1 F : Finset (Fin N → ℕ)) (h0 : ∀ u ∈ U0, (∑ i ∈ I, u i)=0) (h1 : ∀ u ∈ U1, (∑ i ∈ J, u i)=2) : (∑ q ∈ F, (gs_weight I U0 q+gs_weight J U1 q)) ≤ I.card*U0.card+(J.card+2)*U1.card := by classical have hA := gs_weight_capacity I U0 F have hB := gs_weight_capacity J U1 F have hc0 : (∑ u ∈ U0, ∑ i ∈ I, (u i+1))=I.card*U0.card := by have hs (u : Fin N → ℕ) (hu : u ∈ U0) : (∑ i ∈ I, (u i+1))=I.card := by rw [Finset.sum_add_distrib,h0 u hu] simp simp only [Finset.sum_congr rfl hs,Finset.sum_const,smul_eq_mul,Nat.mul_comm] have hc1 : (∑ u ∈ U1, ∑ i ∈ J, (u i+1))=(J.card+2)*U1.card := by have hs (u : Fin N → ℕ) (hu : u ∈ U1) : (∑ i ∈ J, (u i+1))=J.card+2 := by rw [Finset.sum_add_distrib,h1 u hu] simp [Nat.add_comm] simp only [Finset.sum_congr rfl hs,Finset.sum_const,smul_eq_mul,Nat.mul_comm] rw [hc0] at hA rw [hc1] at hB rw [Finset.sum_add_distrib] omega lemma gs_mixed_missing_budget {N : ℕ} (I J : Finset (Fin N)) (hIJ : I ⊆ J) (U0 U1 H M : Finset (Fin N → ℕ)) (hd : Disjoint U0 U1) (h0 : ∀ u ∈ U0, (∑ i ∈ I, u i)=0) (h1 : ∀ u ∈ U1, (∑ i ∈ J, u i)=2) (hH : ∀ q ∈ H, (∑ i ∈ J, q i)=3 ∧ 0 < ∑ i ∈ I, q i) (hp : ∀ q ∈ H, ∀ i ∈ J, 0 < q i → m3_parent q i ∈ U0 ∪ U1) (hM : Disjoint M H) : (∑ q ∈ M, (gs_weight I U0 q+gs_weight J U1 q))+3*H.card≤ I.card*U0.card+(J.card+2)*U1.card := by classical have hc := gs_mixed_capacity I J U0 U1 (M ∪ H) h0 h1 have hs : (∑ q ∈ H, (gs_weight I U0 q+gs_weight J U1 q))=3*H.card := by rw [Finset.sum_congr rfl (fun q hq => gs_mixed_weight_eq I J hIJ U0 U1 hd h0 (hH q hq) (hp q hq))] simp [Nat.mul_comm] rwa [Finset.sum_union hM,hs] at hc lemma gs_shadow_missing_unique {N : ℕ} (E F : Finset (Fin N → ℕ)) (hE : ∀ alpha ∈ E, m3_degree alpha=2) (hF : ∀ alpha ∈ F, m3_degree alpha=3) (hp : ∀ alpha : Fin N → ℕ, m3_degree alpha=3 → ∀ i, 0 < alpha i → m3_parent alpha i ∈ E) (hbudget : (N+2)*E.card≤3*F.card+3) {alpha beta : Fin N → ℕ} (ha : m3_degree alpha=3) (hb : m3_degree beta=3) (haF : alpha ∉ F) (hbF : beta ∉ F) : alpha=beta := by classical by_contra hn have hin : alpha ∉ insert beta F := by simp [hn,haF] have hc := up_split_weighted_shadow (r := 2) E (insert alpha (insert beta F)) hE have hs : (∑ q ∈ F, up_weight E q)=3*F.card := by rw [Finset.sum_congr rfl (fun q hq => (up_weight_eq_degree E q (hp q (hF q hq))).trans (hF q hq))] simp [Nat.mul_comm] have hwa : up_weight E alpha=3 := (up_weight_eq_degree E alpha (hp alpha ha)).trans ha have hwb : up_weight E beta=3 := (up_weight_eq_degree E beta (hp beta hb)).trans hb rw [Finset.sum_insert hin,Finset.sum_insert hbF,hwa,hwb,hs] at hc omega lemma gs_general_no_wlow_polynomial (a k z b w v t u x y f d h0 h1 j l r s p rho : ℕ) (h2 : 2*(b+w)≤a*(a+1)) (h3 : 3*(v+t)≤(a+2)*(b+w)) (h3L : 3*v≤(a+2)*b) (h4 : 4*u≤(a+3)*v) (hBC : x+y≤a*k) (hCC : 2*(f+d)≤k*(k+1)) (hBD : r≤a*z) (hCD : s≤k*z) (hgood : h0≤k*b) (hshadow : 3*(h0+h1+j+l)≤k*b+(a+k+2)*(x+f)) (hstrip : f+h1+j+l+s≤rho) (he : a≤3*(p+k+z)+1) : 4*(b+w+v+t+u+x+y+f+d+h0+h1+j+l+r+s)≤ (1+a+k+z+p)*(3*a+2*k+z+2*b+w+v+x+f)+rho := by have hcert : 12*(b+w+v+t+u+x+y+f+d+h0+h1+j+l+r+s)+w+3*a*k+ 3*k*(w+v)+3*z*(1+z+2*b+w+v+x+f) ≤ 3*(1+a+k+z)*(3*a+2*k+z+2*b+w+v+x+f)+3*rho+a*w+3*x := by nlinarith only [h2,h3,h3L,h4,hBC,hCC,hBD,hCD,hgood,hshadow,hstrip] have hAW := Nat.mul_le_mul_right w he have hX : 3*x≤3*(a*k) := by omega have hP := Nat.mul_le_mul_left (3*p) (show w≤3*a+2*k+z+2*b+w+v+x+f by omega) nlinarith only [hcert,hAW,hX,hP] lemma w23_gs_no_wlow_counts (S : NumericalSemigroup) (a k z b w v t u x y f d h0 h1 j l r s p rho R : ℕ) (h2 : 2*(b+w) ≤ a*(a+1)) (h3 : 3*(v+t) ≤ (a+2)*(b+w)) (h3L : 3*v ≤ (a+2)*b) (h4 : 4*u ≤ (a+3)*v) (hBC : x+y ≤ a*k) (hCC : 2*(f+d) ≤ k*(k+1)) (hBD : r ≤ a*z) (hCD : s ≤ k*z) (hgood : h0 ≤ k*b) (hshadow : 3*(h0+h1+j+l) ≤ k*b+(a+k+2)*(x+f)) (hstrip : f+h1+j+l+s ≤ rho) (hcomp : a ≤ 3*(p+k+z)+1) (hR : R ≤ t+u+y+d+h0+h1+j+l+r+s) (he : S.embeddingDimension = 1+a+k+z+p) (hL : S.leftCount = 4+3*a+2*k+z+2*b+w+v+x+f) (hm : S.multiplicity = S.embeddingDimension+b+w+v+x+f+R) (hc : S.conductor+rho = 4*S.multiplicity) : S.SatisfiesWilf := by have hp := gs_general_no_wlow_polynomial a k z b w v t u x y f d h0 h1 j l r s p rho h2 h3 h3L h4 hBC hCC hBD hCD hgood hshadow hstrip hcomp unfold NumericalSemigroup.SatisfiesWilf have ht : 4*(b+w+v+x+f+R) ≤ (1+a+k+z+p)*(3*a+2*k+z+2*b+w+v+x+f)+rho := by omega nlinarith only [he,hL,hm,hc,ht] theorem w23_gs_q4_no_wlow (S : NumericalSemigroup) (h1 : 3*S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4*S.multiplicity) (hwl : (gm_wlow S).card=0) (he : (w23_X S 1).card≤3*(w23_pq S+(w23_P S 2).card+(w23_P S 3).card)+1) : S.SatisfiesWilf := by classical have hq := w23_q_eq_four S h1 h2 obtain ⟨heq,hL,hm⟩ := w23_gm_general_counts S hq have hc := w23_q_mul_sub S rw [hq] at hc exact w23_gs_no_wlow_counts S (w23_X S 1).card (w23_P S 2).card (w23_P S 3).card (gm_type S 2 2 0 0).card (gm_type S 3 2 0 0).card (gm_type S 3 3 0 0).card (gm_type S 4 3 0 0).card (gm_type S 4 4 0 0).card (gm_type S 3 1 1 0).card (gm_type S 4 1 1 0).card (gm_type S 3 0 2 0).card (gm_type S 4 0 2 0).card (gm_h0 S).card (gm_h1 S).card (gm_type S 4 1 2 0).card (gm_type S 4 0 3 0).card (gm_type S 4 1 0 1).card (gm_type S 4 0 1 1).card (w23_pq S) (w23_rho S) (n4_right S).card (w23_gm_pure_pair_card S hq) (w23_gm_pure_triple_card S hq) (w23_gm_pure_left_triple_card S hq) (w23_gm_pure_quadruple_card S hq) (w23_gm_BC_card S hq) (w23_gm_CC_card S hq) (w23_gm_BD_card S hq) (w23_gm_CD_card S hq) (w23_gm_h0_card S hq) (by simpa only [hwl,Nat.add_zero] using w23_gm_mixed_card S hq) (w23_gm_strip_card S hq) (by omega) (w23_gm_right_card S hq) heq hL hm hc.symm theorem w23_gs_q4_gen_small_nowrap (S : NumericalSemigroup) (h1 : 3*S.multiplicity hnot (w23_gs_many_right S h1 h2 hh) have hp : w23_pq S=0 := by omega have hz : (w23_P S 3).card=0 := by omega have hq := w23_q_eq_four S h1 h2 have hk0 : (w23_P S 2).card≠0 := by intro hh exact hnot (w23_q4_core_small S h1 h2 (w23_gs_core_of_no_higher S hq hh hz) (by omega)) unfold gs_ThreeObstruction let k := (w23_P S 2).card let b := (gm_type S 2 2 0 0).card let w := (gm_type S 3 2 0 0).card let v := (gm_type S 3 3 0 0).card let t := (gm_type S 4 3 0 0).card let u := (gm_type S 4 4 0 0).card let x := (gm_type S 3 1 1 0).card let y := (gm_type S 4 1 1 0).card let f := (gm_type S 3 0 2 0).card let d := (gm_type S 4 0 2 0).card let h0 := (gm_h0 S).card let h := (gm_h1 S).card let j := (gm_type S 4 1 2 0).card let l := (gm_type S 4 0 3 0).card let r := (gm_type S 4 1 0 1).card let s := (gm_type S 4 0 1 1).card let wlow := (gm_wlow S).card let rho := w23_rho S let R := (n4_right S).card have hpairB : 2*(b+w)≤12 := by have hh := w23_gm_pure_pair_card S hq rw [hK2] at hh exact hh have htripleB : 3*(v+t)≤5*(b+w) := by have hh := w23_gm_pure_triple_card S hq rw [hK2] at hh exact hh have htripleL : 3*v≤5*b := by have hh := w23_gm_pure_left_triple_card S hq rw [hK2] at hh exact hh have hquadB : 4*u≤6*v := by have hh := w23_gm_pure_quadruple_card S hq rw [hK2] at hh exact hh have hBC : x+y≤3*k := by have hh := w23_gm_BC_card S hq rw [hK2] at hh exact hh have hCC : 2*(f+d)≤k*(k+1) := w23_gm_CC_card S hq have hr0 : r=0 := by have hh := w23_gm_BD_card S hq rw [hz] at hh omega have hs0 : s=0 := by have hh := w23_gm_CD_card S hq rw [hz] at hh omega have hgood : h0≤k*b := w23_gm_h0_card S hq have hshadow : 3*(h0+h+j+l)≤k*(b+wlow)+(k+5)*(x+f) := by have hh := w23_gm_mixed_card S hq rw [hK2] at hh change 3*(h0+h+j+l)≤k*(b+wlow)+(3+k+2)*(x+f) at hh rw [show 3+k+2=k+5 from by omega] at hh exact hh have hstrip : f+h+j+l≤rho := by have hh := w23_gm_strip_card S hq change f+h+j+l+s≤rho at hh omega have hlow : wlow≤w := gm_wlow_card S have hR : R≤t+u+y+d+h0+h+j+l := by have hh := w23_gm_right_card S hq change R≤t+u+y+d+h0+h+j+l+r+s at hh omega obtain ⟨heq,hL,hm⟩ := w23_gm_general_counts S hq have he3 : S.embeddingDimension=4+k := by omega have hL' : S.leftCount=4+9+2*k+2*b+w+v+x+f := by omega have hm' : S.multiplicity=S.embeddingDimension+b+w+v+x+f+R := hm have hc := w23_q_mul_sub S rw [hq] at hc have hfail : S.embeddingDimension*S.leftCount (Finset.mem_filter.1 (he2.symm ▸ hx)).1, fun x hx => (Finset.mem_filter.1 (he3.symm ▸ hx)).1⟩ lemma w23_gs_deleted_coordinate_B3_bound (S : NumericalSemigroup) (h : Fin (gm_A S).card) (hball : ∀ alpha : Fin (gm_A S).card → ℕ, m3_degree alpha≤3 → alpha h=0 → gs_Canon S alpha) : (gm_A S).card+(gm_A S).card*(gm_A S).card.choose 2≤S.multiplicity := by classical let N := (gm_A S).card let T := {i : Fin (N+1) // i ≠ h.succ} have hcard : Fintype.card T=N := by simpa only [Fintype.card_fin,Fintype.card_subtype_eq,Nat.add_sub_cancel] using Fintype.card_subtype_compl (fun i : Fin (N+1) => i=h.succ) let e : Fin N ≃ T := (Fintype.equivFinOfCardEq hcard).symm let g : Fin N → Fin (N+1) := fun i => (e i).val have hg : Function.Injective g := fun i j he => e.injective (Subtype.ext he) have hgh (i : Fin N) : g i≠h.succ := (e i).property let val : Fin (N+1) → ℕ := Fin.cases 0 (m3_enum (gm_A S)) let f : Fin N → ZMod S.multiplicity := fun i => (val (g i) : ZMod S.multiplicity) letI : NeZero S.multiplicity := ⟨S.multiplicity_pos.ne'⟩ have hB3 : ∀ a b c d ee gg : Fin N, f a+f b+f c=f d+f ee+f gg → ({a,b,c} : Multiset (Fin N))={d,ee,gg} := by intro a b c d ee gg hcast let alpha := m3_tripleVector (g a) (g b) (g c) let beta := m3_tripleVector (g d) (g ee) (g gg) let atail : Fin N → ℕ := fun i => alpha i.succ let btail : Fin N → ℕ := fun i => beta i.succ have ha3 : m3_degree alpha=3 := m3_degree_tripleVector _ _ _ have hb3 : m3_degree beta=3 := m3_degree_tripleVector _ _ _ have hda : alpha 0+m3_degree atail=3 := by simpa only [m3_degree,Fin.sum_univ_succ,atail] using ha3 have hdb : beta 0+m3_degree btail=3 := by simpa only [m3_degree,Fin.sum_univ_succ,btail] using hb3 have haz : atail h=0 := by simp [atail,alpha,m3_tripleVector,m3_pairVector,m3_unitAdd,Ne.symm (hgh a),Ne.symm (hgh b),Ne.symm (hgh c)] have hbz : btail h=0 := by simp [btail,beta,m3_tripleVector,m3_pairVector,m3_unitAdd,Ne.symm (hgh d),Ne.symm (hgh ee),Ne.symm (hgh gg)] have hac := hball atail (by omega) haz have hbc := hball btail (by omega) hbz have hvalueA : m3_value (m3_enum (gm_A S)) atail=val (g a)+val (g b)+val (g c) := by have hh : m3_value val alpha=val (g a)+val (g b)+val (g c) := by change m3_value val (m3_tripleVector (g a) (g b) (g c))=val (g a)+val (g b)+val (g c) rw [m3_tripleVector,m3_value_unitAdd,oh_pair_value] omega simpa [m3_value,Fin.sum_univ_succ,val,atail] using hh have hvalueB : m3_value (m3_enum (gm_A S)) btail=val (g d)+val (g ee)+val (g gg) := by have hh : m3_value val beta=val (g d)+val (g ee)+val (g gg) := by change m3_value val (m3_tripleVector (g d) (g ee) (g gg))=val (g d)+val (g ee)+val (g gg) rw [m3_tripleVector,m3_value_unitAdd,oh_pair_value] omega simpa [m3_value,Fin.sum_univ_succ,val,btail] using hh have hres : (m3_value (m3_enum (gm_A S)) atail : ZMod S.multiplicity)= (m3_value (m3_enum (gm_A S)) btail : ZMod S.multiplicity) := by rw [hvalueA,hvalueB] simpa only [f,Nat.cast_add] using hcast have hvals := w23_apery_residue_inj S (Finset.mem_filter.1 hac.1).1 (Finset.mem_filter.1 hbc.1).1 ((ZMod.natCast_eq_natCast_iff' _ _ _).1 hres) have htail : atail=btail := by rw [← hac.2,← hbc.2,hvals] have hfull : alpha=beta := by funext i refine Fin.cases ?_ (fun j => ?_) i · have hd := congrArg m3_degree htail omega · exact congrFun htail j have hm := gs_triple_multiset_eq (g a) (g b) (g c) (g d) (g ee) (g gg) hfull apply Multiset.map_injective hg simpa only [Multiset.insert_eq_cons,Multiset.map_cons,Multiset.map_singleton] using hm exact gs_cyclic_B3_card_bound S.multiplicity N f hB3 lemma gs_three_deleted_count_contradiction (k f H m : ℕ) (hk : 3≤k) (hCC : 2*f=k*(k+1)) (hH : 3*H≤6*k+(k+5)*(3*k+f)) (hm : m≤20+4*k+f+H) (hpack : k+3+(k+3)*(k+3).choose 2≤m) : False := by have hp : 2*(k+3).choose 2=(k+3)*(k+2) := by have hh := w23_choose_two_self (k+3) nlinarith have hm6 : 6*m≤(k+4)*(k+5)*(k+6) := by nlinarith obtain ⟨d,hd⟩ := Nat.exists_eq_add_of_le hk have hstrict : (k+4)*(k+5)*(k+6)<6*(k+3)+3*(k+3)*(k+3)*(k+2) := by rw [hd] nlinarith only [Nat.zero_le d,Nat.zero_le (d*d),Nat.zero_le (d*d*d)] nlinarith noncomputable def gs_pair_family {N : ℕ} (J : Finset (Fin N)) : Finset (Fin N → ℕ) := by classical exact ((J.product J).filter (fun p => p.1≤p.2)).image (fun p => m3_pairVector p.1 p.2) lemma gs_pair_family_mem {N : ℕ} (J : Finset (Fin N)) {i j : Fin N} (hi : i ∈ J) (hj : j ∈ J) : m3_pairVector i j ∈ gs_pair_family J := by classical rcases le_total i j with hij | hji · exact Finset.mem_image.2 ⟨(i,j),Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨hi,hj⟩,hij⟩,rfl⟩ · exact Finset.mem_image.2 ⟨(j,i),Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨hj,hi⟩,hji⟩,m3_pairVector_comm j i⟩ lemma gs_pair_family_card {N : ℕ} (J : Finset (Fin N)) : (gs_pair_family J).card=(J.card+1).choose 2 := by classical let T := (J.product J).filter (fun p => p.1≤p.2) have hT : T.card=Fintype.card {p : {i : Fin N // i ∈ J} × {i : Fin N // i ∈ J} // p.1≤p.2} := by rw [Fintype.card_subtype] apply Finset.card_bij (fun p hp => (⟨p.1,(Finset.mem_product.1 (Finset.mem_filter.1 hp).1).1⟩, ⟨p.2,(Finset.mem_product.1 (Finset.mem_filter.1 hp).1).2⟩)) · intro p hp exact Finset.mem_filter.2 ⟨Finset.mem_univ _,(Finset.mem_filter.1 hp).2⟩ · intro p hp q hq he exact Prod.ext (congrArg (fun a => a.1.val) he) (congrArg (fun a => a.2.val) he) · intro q hq refine ⟨(q.1.val,q.2.val),Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨q.1.property,q.2.property⟩,(Finset.mem_filter.1 hq).2⟩,?_⟩ rfl have hinj : Set.InjOn (fun p : Fin N × Fin N => m3_pairVector p.1 p.2) (T : Set _) := by intro p hp q hq he have hh := m3_pairVector_sorted_inj p.1 p.2 q.1 q.2 (Finset.mem_filter.1 hp).2 (Finset.mem_filter.1 hq).2 he exact Prod.ext hh.1 hh.2 have hcard : T.card=J.card.choose 2+J.card := by rw [hT,gs_ordered_pair_card,Fintype.card_coe] unfold gs_pair_family change (T.image _).card=(J.card+1).choose 2 rw [Finset.card_image_of_injOn hinj,hcard] rw [Nat.choose_succ_succ',Nat.choose_one_right] simp only [Nat.reduceAdd] omega lemma gs_pair_repr_supported {N : ℕ} (J : Finset (Fin N)) (alpha : Fin N → ℕ) (hd : m3_degree alpha=2) (hJ : (∑ i ∈ J, alpha i)=2) : alpha ∈ gs_pair_family J := by classical obtain ⟨i,j,_,he⟩ := m3_degree_two_repr alpha hd rw [he,gs_group_pair] at hJ have hi : i ∈ J := by by_contra hh; simp [hh] at hJ; split_ifs at hJ <;> omega have hj : j ∈ J := by by_contra hh; simp [hh] at hJ; split_ifs at hJ <;> omega rw [he] exact gs_pair_family_mem J hi hj lemma gs_pair_family_saturated {N : ℕ} (J : Finset (Fin N)) (E : Finset (Fin N → ℕ)) (hE : ∀ alpha ∈ E, m3_degree alpha=2 ∧ (∑ i ∈ J, alpha i)=2) (hc : E.card=(J.card+1).choose 2) : ∀ i ∈ J, ∀ j ∈ J, m3_pairVector i j ∈ E := by classical have hsub : E ⊆ gs_pair_family J := fun alpha ha => gs_pair_repr_supported J alpha (hE alpha ha).1 (hE alpha ha).2 have he : E=gs_pair_family J := Finset.eq_of_subset_of_card_le hsub (by rw [gs_pair_family_card,hc]) intro i hi j hj rw [he] exact gs_pair_family_mem J hi hj lemma gs_cross_family_saturated {N : ℕ} (B C : Finset (Fin N)) (hd : Disjoint B C) (E : Finset (Fin N → ℕ)) (hE : ∀ alpha ∈ E, m3_degree alpha=2 ∧ (∑ i ∈ B, alpha i)=1 ∧ (∑ i ∈ C, alpha i)=1) (hc : E.card=B.card*C.card) : ∀ i ∈ B, ∀ j ∈ C, m3_pairVector i j ∈ E := by classical let F := (B.product C).image (fun p => m3_pairVector p.1 p.2) have hsub : E ⊆ F := fun alpha ha => gs_pair_repr_cross B C hd alpha (hE alpha ha).1 (hE alpha ha).2.1 (hE alpha ha).2.2 have hcF : F.card=B.card*C.card := by rw [Finset.card_image_of_injOn (gs_pair_cross_injective B C hd),Finset.product_eq_sprod,Finset.card_product] have he : E=F := Finset.eq_of_subset_of_card_le hsub (by omega) intro i hi j hj rw [he] exact Finset.mem_image.2 ⟨(i,j),Finset.mem_product.2 ⟨hi,hj⟩,rfl⟩ lemma w23_gs_type_image_data (S : NumericalSemigroup) (hq : w23_q S=4) (j b c d : ℕ) {alpha : Fin (gm_A S).card → ℕ} (ha : alpha ∈ (gm_type S j b c d).image (gm_rep (gm_A S))) : m3_degree alpha=b+c+d ∧ gm_group S 1 alpha=b ∧ gm_group S 2 alpha=c ∧ gm_group S 3 alpha=d := by classical obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha obtain ⟨_,_,hB,hC,hD⟩ := Finset.mem_filter.1 hx have hg := w23_gm_group_degree S hq (gm_rep (gm_A S) x) exact ⟨by omega,hB,hC,hD⟩ lemma w23_gs_type_union_image_data (S : NumericalSemigroup) (hq : w23_q S=4) (j1 j2 b c d : ℕ) {alpha : Fin (gm_A S).card → ℕ} (ha : alpha ∈ (gm_type S j1 b c d ∪ gm_type S j2 b c d).image (gm_rep (gm_A S))) : m3_degree alpha=b+c+d ∧ gm_group S 1 alpha=b ∧ gm_group S 2 alpha=c ∧ gm_group S 3 alpha=d := by rw [Finset.image_union] at ha rcases Finset.mem_union.1 ha with ha | ha · exact w23_gs_type_image_data S hq j1 b c d ha · exact w23_gs_type_image_data S hq j2 b c d ha lemma w23_gs_type_image_card (S : NumericalSemigroup) (hq : w23_q S=4) (j b c d : ℕ) : ((gm_type S j b c d).image (gm_rep (gm_A S))).card=(gm_type S j b c d).card := gm_rep_image_card (gm_A S) _ (fun x hx => w23_gm_values_repr S hq (w23_gm_type_values S j b c d hx)) lemma w23_gs_type_union_image_card (S : NumericalSemigroup) (hq : w23_q S=4) (j1 j2 b c d : ℕ) (hne : j1≠j2) : ((gm_type S j1 b c d ∪ gm_type S j2 b c d).image (gm_rep (gm_A S))).card= (gm_type S j1 b c d).card+(gm_type S j2 b c d).card := by rw [gm_rep_image_card (gm_A S) _ (fun x hx => w23_gm_values_repr S hq (Finset.union_subset (w23_gm_type_values S j1 b c d) (w23_gm_type_values S j2 b c d) hx)), Finset.card_union_of_disjoint (gm_type_disjoint S j1 b c d j2 b c d (by omega))] lemma w23_gs_three_all_pairs (S : NumericalSemigroup) (hq : w23_q S=4) (hK : (w23_X S 1).card=3) (ho : gs_ThreeObstruction S) : ∀ i j : Fin (gm_A S).card, gs_Canon S (m3_pairVector i j) := by classical obtain ⟨_,hz,_,_,hw,_,_,_,_,hBC,hCC,_⟩ := ho have hBcard : (gm_indices S 1).card=3 := by rw [w23_gm_indices_card_B S hq,hK] have hCcard : (gm_indices S 2).card=(w23_P S 2).card := w23_gm_indices_card_P S hq 2 (by omega) (by omega) have hBB := gs_pair_family_saturated (gm_indices S 1) ((gm_type S 3 2 0 0).image (gm_rep (gm_A S))) (fun alpha ha => ⟨(w23_gs_type_image_data S hq 3 2 0 0 ha).1, (w23_gs_type_image_data S hq 3 2 0 0 ha).2.1⟩) (by rw [w23_gs_type_image_card S hq,hBcard,hw]; decide) have hBCsat := gs_cross_family_saturated (gm_indices S 1) (gm_indices S 2) (gm_indices_disjoint S 1 2 (by omega)) ((gm_type S 3 1 1 0 ∪ gm_type S 4 1 1 0).image (gm_rep (gm_A S))) (fun alpha ha => ⟨(w23_gs_type_union_image_data S hq 3 4 1 1 0 ha).1, (w23_gs_type_union_image_data S hq 3 4 1 1 0 ha).2.1, (w23_gs_type_union_image_data S hq 3 4 1 1 0 ha).2.2.1⟩) (by rw [w23_gs_type_union_image_card S hq 3 4 1 1 0 (by omega),hBcard,hCcard]; exact hBC) have hCCcard : (gm_type S 3 0 2 0).card+(gm_type S 4 0 2 0).card= ((w23_P S 2).card+1).choose 2 := by have hh := w23_choose_two_mul (w23_P S 2).card omega have hCCsat := gs_pair_family_saturated (gm_indices S 2) ((gm_type S 3 0 2 0 ∪ gm_type S 4 0 2 0).image (gm_rep (gm_A S))) (fun alpha ha => ⟨(w23_gs_type_union_image_data S hq 3 4 0 2 0 ha).1, (w23_gs_type_union_image_data S hq 3 4 0 2 0 ha).2.2.1⟩) (by rw [w23_gs_type_union_image_card S hq 3 4 0 2 0 (by omega),hCcard]; exact hCCcard) intro i j rcases w23_gs_indices_noP3 S hq hz i with hi | hi <;> rcases w23_gs_indices_noP3 S hq hz j with hj | hj · exact w23_gs_canon_of_image S hq _ (w23_gm_type_values S 3 2 0 0) (hBB i hi j hj) · exact w23_gs_canon_of_image S hq _ (Finset.union_subset (w23_gm_type_values S 3 1 1 0) (w23_gm_type_values S 4 1 1 0)) (hBCsat i hi j hj) · rw [m3_pairVector_comm] exact w23_gs_canon_of_image S hq _ (Finset.union_subset (w23_gm_type_values S 3 1 1 0) (w23_gm_type_values S 4 1 1 0)) (hBCsat j hj i hi) · exact w23_gs_canon_of_image S hq _ (Finset.union_subset (w23_gm_type_values S 3 0 2 0) (w23_gm_type_values S 4 0 2 0)) (hCCsat i hi j hj) lemma w23_gs_lift_mixed_missing (S : NumericalSemigroup) (hq : w23_q S = 4) (I J : Finset (Fin (gm_A S).card)) (hIJ : I ⊆ J) (U0 U1 H : Finset ℕ) (hU0 : U0 ⊆ gm_values S) (hU1 : U1 ⊆ gm_values S) (hH : H ⊆ gm_values S) (hd : Disjoint U0 U1) (hd0 : ∀ x ∈ U0, (∑ i ∈ I, gm_rep (gm_A S) x i) = 0) (hd1 : ∀ x ∈ U1, (∑ i ∈ J, gm_rep (gm_A S) x i) = 2) (hdH : ∀ x ∈ H, (∑ i ∈ J, gm_rep (gm_A S) x i) = 3 ∧ 0 < ∑ i ∈ I, gm_rep (gm_A S) x i) (hdiv : ∀ x ∈ H, ∀ i ∈ J, 0 < gm_rep (gm_A S) x i → m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) ∈ U0 ∪ U1) (M : Finset (Fin (gm_A S).card → ℕ)) (hM : Disjoint M (H.image (gm_rep (gm_A S)))) : (∑ alpha ∈ M, (gs_weight I (U0.image (gm_rep (gm_A S))) alpha+ gs_weight J (U1.image (gm_rep (gm_A S))) alpha))+3*H.card≤ I.card*U0.card+(J.card+2)*U1.card := by classical let E0 := U0.image (gm_rep (gm_A S)) let E1 := U1.image (gm_rep (gm_A S)) let F := H.image (gm_rep (gm_A S)) have h0 : ∀ alpha ∈ E0, (∑ i ∈ I, alpha i) = 0 := by intro alpha ha obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha exact hd0 x hx have h1 : ∀ alpha ∈ E1, (∑ i ∈ J, alpha i) = 2 := by intro alpha ha obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha exact hd1 x hx have hF : ∀ alpha ∈ F, (∑ i ∈ J, alpha i) = 3 ∧ 0 < ∑ i ∈ I, alpha i := by intro alpha ha obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha exact hdH x hx have hdis : Disjoint E0 E1 := by apply Finset.disjoint_left.2 intro alpha ha hb obtain ⟨x,hx,he⟩ := Finset.mem_image.1 ha obtain ⟨y,hy,he'⟩ := Finset.mem_image.1 hb have hxv := (gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq (hU0 hx))).2 have hyv := (gm_rep_spec (gm_A S) y (w23_gm_values_repr S hq (hU1 hy))).2 rw [he] at hxv rw [he'] at hyv have hxy : x = y := by omega exact Finset.disjoint_left.1 hd hx (hxy.symm ▸ hy) have hparent : ∀ alpha ∈ F, ∀ i ∈ J, 0 < alpha i → m3_parent alpha i ∈ E0 ∪ E1 := by intro alpha ha i hi hpos obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 ha have he := (w23_gm_values_parent S hq (hH hx) i hpos).2 rcases Finset.mem_union.1 (hdiv x hx i hi hpos) with hp0 | hp1 · exact Finset.mem_union.2 (Or.inl (Finset.mem_image.2 ⟨_,hp0,he.symm⟩)) · exact Finset.mem_union.2 (Or.inr (Finset.mem_image.2 ⟨_,hp1,he.symm⟩)) have he0 := gm_rep_image_card (gm_A S) U0 (fun x hx => w23_gm_values_repr S hq (hU0 hx)) have he1 := gm_rep_image_card (gm_A S) U1 (fun x hx => w23_gm_values_repr S hq (hU1 hx)) have hf := gm_rep_image_card (gm_A S) H (fun x hx => w23_gm_values_repr S hq (hH hx)) have hh := gs_mixed_missing_budget I J hIJ E0 E1 F M hdis h0 h1 hF hparent hM simpa only [E0,E1,F,he0,he1,hf] using hh noncomputable def gs_mixedCharge (S : NumericalSemigroup) (alpha : Fin (gm_A S).card → ℕ) : ℕ := gs_weight (gm_indices S 2) ((gm_type S 2 2 0 0 ∪ gm_wlow S).image (gm_rep (gm_A S))) alpha+ gs_weight (gm_indices S 1 ∪ gm_indices S 2) ((gm_type S 3 1 1 0 ∪ gm_type S 3 0 2 0).image (gm_rep (gm_A S))) alpha lemma w23_gs_mixed_charge_bound (S : NumericalSemigroup) (hq : w23_q S = 4) (M : Finset (Fin (gm_A S).card → ℕ)) (hM : Disjoint M ((gm_H S).image (gm_rep (gm_A S)))) : (∑ alpha ∈ M, gs_mixedCharge S alpha)+ 3*((gm_h0 S).card+(gm_h1 S).card+(gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card)≤ (w23_P S 2).card*((gm_type S 2 2 0 0).card+(gm_wlow S).card)+ ((w23_X S 1).card+(w23_P S 2).card+2)* ((gm_type S 3 1 1 0).card+(gm_type S 3 0 2 0).card) := by classical let I := gm_indices S 2 let J := gm_indices S 1 ∪ gm_indices S 2 let U0 := gm_type S 2 2 0 0 ∪ gm_wlow S let U1 := gm_type S 3 1 1 0 ∪ gm_type S 3 0 2 0 have hJ (alpha : Fin (gm_A S).card → ℕ) : (∑ i ∈ J, alpha i)=gm_group S 1 alpha+gm_group S 2 alpha := Finset.sum_union (gm_indices_disjoint S 1 2 (by omega)) have hU0 : U0 ⊆ gm_values S := by intro x hx rcases Finset.mem_union.1 hx with hb | hw · exact w23_gm_type_values S 2 2 0 0 hb · exact w23_gm_type_values S 3 2 0 0 (Finset.mem_filter.1 hw).1 have hU1 : U1 ⊆ gm_values S := Finset.union_subset (w23_gm_type_values S 3 1 1 0) (w23_gm_type_values S 3 0 2 0) have hH : gm_H S ⊆ gm_values S := fun x hx => (w23_gm_H_data S hq hx).1 have hd0 : ∀ x ∈ U0, (∑ i ∈ I, gm_rep (gm_A S) x i)=0 := by intro x hx rcases Finset.mem_union.1 hx with hb | hw · exact (Finset.mem_filter.1 hb).2.2.2.1 · exact (Finset.mem_filter.1 (Finset.mem_filter.1 hw).1).2.2.2.1 have hd1 : ∀ x ∈ U1, (∑ i ∈ J, gm_rep (gm_A S) x i)=2 := by intro x hx rw [hJ] rcases Finset.mem_union.1 hx with hx | hx <;> obtain ⟨_,_,hb,hc,_⟩ := Finset.mem_filter.1 hx <;> omega have hdH : ∀ x ∈ gm_H S, (∑ i ∈ J, gm_rep (gm_A S) x i)=3 ∧ 0 < ∑ i ∈ I, gm_rep (gm_A S) x i := by intro x hx rw [hJ] obtain ⟨_,_,hdeg,hpos,_⟩ := w23_gm_H_data S hq hx exact ⟨hdeg,hpos⟩ have hdis : Disjoint U0 U1 := by apply Finset.disjoint_left.2 intro x hx hy have hz := hd0 x hx change gm_group S 2 (gm_rep (gm_A S) x)=0 at hz rcases Finset.mem_union.1 hy with hy | hy <;> have hp := (Finset.mem_filter.1 hy).2.2.2.1 <;> omega have hI : I.card=(w23_P S 2).card := w23_gm_indices_card_P S hq 2 (by omega) (by omega) have hJcard : J.card=(w23_X S 1).card+(w23_P S 2).card := by rw [Finset.card_union_of_disjoint (gm_indices_disjoint S 1 2 (by omega)), w23_gm_indices_card_B S hq,w23_gm_indices_card_P S hq 2 (by omega) (by omega)] have hdis0 : Disjoint (gm_type S 2 2 0 0) (gm_wlow S) := by apply Finset.disjoint_left.2 intro x hx hy exact Finset.disjoint_left.1 (gm_type_disjoint S 2 2 0 0 3 2 0 0 (by omega)) hx (Finset.mem_filter.1 hy).1 have h0 : U0.card=(gm_type S 2 2 0 0).card+(gm_wlow S).card := Finset.card_union_of_disjoint hdis0 have h1 : U1.card=(gm_type S 3 1 1 0).card+(gm_type S 3 0 2 0).card := Finset.card_union_of_disjoint (gm_type_disjoint S 3 1 1 0 3 0 2 0 (by omega)) have hdisH : Disjoint (gm_type S 4 2 1 0 ∪ gm_type S 4 1 2 0) (gm_type S 4 0 3 0) := by rw [Finset.disjoint_union_left] exact ⟨gm_type_disjoint S 4 2 1 0 4 0 3 0 (by omega),gm_type_disjoint S 4 1 2 0 4 0 3 0 (by omega)⟩ have hHcard : (gm_H S).card=(gm_h0 S).card+(gm_h1 S).card+ (gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card := by rw [gm_H,Finset.card_union_of_disjoint hdisH, Finset.card_union_of_disjoint (gm_type_disjoint S 4 2 1 0 4 1 2 0 (by omega)),← gm_h_card S] have hh := w23_gs_lift_mixed_missing S hq I J (by exact Finset.subset_union_right) U0 U1 (gm_H S) hU0 hU1 hH hdis hd0 hd1 hdH (fun x hx i hi hp => w23_gm_H_parent S hq hx hi hp) M hM change (∑ alpha ∈ M, gs_mixedCharge S alpha)+3*(gm_H S).card≤ I.card*U0.card+(J.card+2)*U1.card at hh rwa [hI,hJcard,h0,h1,hHcard] at hh lemma w23_gs_not_H_of_large_value (S : NumericalSemigroup) (hq : w23_q S=4) (alpha : Fin (gm_A S).card → ℕ) (hlarge : S.conductor+S.multiplicity≤m3_value (m3_enum (gm_A S)) alpha) : alpha ∉ (gm_H S).image (gm_rep (gm_A S)) := by classical intro hm have hd := w23_gs_rep_image_value S hq (gm_H S) (fun x hx => (w23_gm_H_data S hq hx).1) hm have hlt := w23_apery_lt S (Finset.mem_filter.1 ((w23_gm_H_data S hq hd.1).1)).1 omega lemma gs_fixed_pair_injective {N : ℕ} (i : Fin N) : Function.Injective (fun j : Fin N => m3_pairVector i j) := by intro j k he have hh := m3_unitAdd_injective i he by_contra hn have hd := congrFun hh j simp [m3_unitAdd,hn] at hd lemma w23_gs_three_BC_right_empty (S : NumericalSemigroup) (hq : w23_q S=4) (hK : (w23_X S 1).card=3) (ho : gs_ThreeObstruction S) : (gm_type S 4 1 1 0).card=0 := by classical apply Finset.card_eq_zero.2 apply Finset.eq_empty_iff_forall_notMem.2 intro a ha have hocopy := ho obtain ⟨hp,hz,hk,hb,hw,hv,ht,hu,hh0,hBC,hCC,hbudget⟩ := hocopy have hallpair := w23_gs_three_all_pairs S hq hK ho let k := (w23_P S 2).card let wlow := (gm_wlow S).card let f := (gm_type S 3 0 2 0).card let x := (gm_type S 3 1 1 0).card let y := (gm_type S 4 1 1 0).card let H := (gm_h1 S).card+(gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card let theta := k*wlow+(k+5)*(x+f)-3*H have hypos : 1≤y := by have hh := Finset.card_pos.2 (show (gm_type S 4 1 1 0).Nonempty from ⟨a,ha⟩) omega have hwl : wlow≤6 := by have hh := gm_wlow_card S; rw [hw] at hh; exact hh have hsh := w23_gm_mixed_card S hq rw [hK,hb,hh0] at hsh have hsh' : 3*H≤k*wlow+(k+5)*(x+f) := by change 3*(0+(gm_h1 S).card+(gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card)≤ k*(0+wlow)+(3+k+2)*(x+f) at hsh rw [show 3+k+2=k+5 from by omega] at hsh simpa only [H,Nat.zero_add,Nat.add_assoc] using hsh have htheta : theta+3*H=k*wlow+(k+5)*(x+f) := by dsimp [theta]; omega have hbd : y+k*(6-wlow)+theta≤3 := by change y+k*(6-wlow)+(w23_rho S-((gm_type S 3 0 2 0).card+(gm_h1 S).card+ (gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card))+theta≤3 at hbudget omega have hdata := w23_gs_type_image_data S hq 4 1 1 0 (Finset.mem_image.2 ⟨a,ha,rfl⟩) have hpairs := gs_pair_repr_cross (gm_indices S 1) (gm_indices S 2) (gm_indices_disjoint S 1 2 (by omega)) (gm_rep (gm_A S) a) hdata.1 hdata.2.1 hdata.2.2.1 obtain ⟨ij,hij,heij⟩ := Finset.mem_image.1 hpairs obtain ⟨hi,hj⟩ := Finset.mem_product.1 hij let i := ij.1 let j := ij.2 have hav : a=m3_enum (gm_A S) i+m3_enum (gm_A S) j := by have hs := (gm_rep_spec (gm_A S) a (w23_gm_values_repr S hq (w23_gm_type_values S 4 1 1 0 ha))).2 rw [← heij,oh_pair_value] at hs exact hs.symm have haright : S.conductor≤a := by have hlo := ((w23_level_eq_iff S a 4).1 ((w23_mem_X S 4 a).1 (Finset.mem_filter.1 ha).1).2).1 have hc := w23_q_mul_sub S rw [hq] at hc omega let B := gm_indices S 1 let EB := (gm_type S 3 2 0 0).image (gm_rep (gm_A S)) let EW := (gm_wlow S).image (gm_rep (gm_A S)) let T := B.image (fun t => m3_pairVector i t) let V := T ∩ EW let M := V.image (fun alpha => m3_unitAdd alpha j) have hTcard : T.card=3 := by rw [Finset.card_image_of_injective _ (gs_fixed_pair_injective i),w23_gm_indices_card_B S hq,hK] have hEWcard : EW.card=wlow := gm_rep_image_card (gm_A S) _ (fun a ha => w23_gm_values_repr S hq (w23_gm_type_values S 3 2 0 0 (Finset.mem_filter.1 ha).1)) have hEBcard : EB.card=6 := by rw [w23_gs_type_image_card S hq,hw] have hTsub : T ⊆ EB := by intro alpha hα obtain ⟨b,hbB,rfl⟩ := Finset.mem_image.1 hα have hc := hallpair i b have htype := w23_gs_BB_type S hq hb hi hbB hc exact Finset.mem_image.2 ⟨_,htype,hc.2⟩ have hEWsub : EW ⊆ EB := Finset.image_subset_image (Finset.filter_subset _ _) have hVcard : 3+wlow≤6+V.card := by have hh := Finset.card_le_card (Finset.union_subset hTsub hEWsub) rw [hEBcard] at hh have hd := Finset.card_union_add_card_inter T EW rw [hTcard,hEWcard] at hd change _ + V.card = _ at hd omega have hMcard : M.card=V.card := Finset.card_image_of_injective _ (m3_unitAdd_injective j) have hMdis : Disjoint M ((gm_H S).image (gm_rep (gm_A S))) := by apply Finset.disjoint_left.2 intro beta hbeta hH obtain ⟨alpha,hα,rfl⟩ := Finset.mem_image.1 hbeta obtain ⟨b,hbB,he⟩ := Finset.mem_image.1 (Finset.mem_inter.1 hα).1 rw [← he] at hH apply w23_gs_not_H_of_large_value S hq _ ?_ hH rw [m3_value_unitAdd,oh_pair_value] have hbgt := w23_gm_A_bounds S (m3_enum_mem (gm_A S) b) omega have hcharge : ∀ beta ∈ M, 1≤gs_mixedCharge S beta := by intro beta hbeta obtain ⟨alpha,hα,rfl⟩ := Finset.mem_image.1 hbeta have hEW := (Finset.mem_inter.1 hα).2 have he0 : alpha ∈ (gm_type S 2 2 0 0 ∪ gm_wlow S).image (gm_rep (gm_A S)) := Finset.image_subset_image Finset.subset_union_right hEW have hh := gs_weight_unitAdd_pos (gm_indices S 2) _ he0 (show j ∈ gm_indices S 2 from hj) unfold gs_mixedCharge omega have hsum : M.card≤∑ beta ∈ M, gs_mixedCharge S beta := by calc M.card = ∑ beta ∈ M, 1 := by simp _ ≤ _ := Finset.sum_le_sum hcharge have hmiss := w23_gs_mixed_charge_bound S hq M hMdis rw [hK,hb,hh0] at hmiss have hmiss' : (∑ beta ∈ M, gs_mixedCharge S beta)+3*H≤k*wlow+(k+5)*(x+f) := by change (∑ beta ∈ M, gs_mixedCharge S beta)+ 3*(0+(gm_h1 S).card+(gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card)≤ k*(0+wlow)+(3+k+2)*(x+f) at hmiss rw [show 3+k+2=k+5 from by omega] at hmiss simpa only [H,Nat.zero_add,Nat.add_assoc] using hmiss have hVtheta : V.card≤theta := by omega have hmul : 6-wlow≤k*(6-wlow) := by have hh := Nat.mul_le_mul_right (6-wlow) (show 1≤k from by omega) simpa only [Nat.one_mul] using hh omega lemma gs_unitAdd_index_injective {N : ℕ} (alpha : Fin N → ℕ) : Function.Injective (fun i => m3_unitAdd alpha i) := by intro i j he by_contra hn have hh := congrFun he i simp [m3_unitAdd,hn] at hh lemma w23_gs_three_CC_right_empty (S : NumericalSemigroup) (hq : w23_q S=4) (hK : (w23_X S 1).card=3) (ho : gs_ThreeObstruction S) : (gm_type S 4 0 2 0).card=0 := by classical have hocopy := ho obtain ⟨hp,hz,hk,hb,hw,hv,ht,hu,hh0,hBC,hCC,hbudget⟩ := hocopy have hy := w23_gs_three_BC_right_empty S hq hK ho have hx : (gm_type S 3 1 1 0).card=(w23_X S 1).card*(w23_P S 2).card := by rw [hK]; omega apply Finset.card_eq_zero.2 apply Finset.eq_empty_iff_forall_notMem.2 intro a ha have hd := w23_gs_type_image_data S hq 4 0 2 0 (Finset.mem_image.2 ⟨a,ha,rfl⟩) have hsupp := gs_pair_repr_supported (gm_indices S 2) (gm_rep (gm_A S) a) hd.1 hd.2.2.1 obtain ⟨ij,hij,heij⟩ := Finset.mem_image.1 hsupp obtain ⟨hij',_⟩ := Finset.mem_filter.1 hij obtain ⟨hi,hj⟩ := Finset.mem_product.1 hij' let i := ij.1 let j := ij.2 let alpha := m3_pairVector i j have hav : a=m3_enum (gm_A S) i+m3_enum (gm_A S) j := by have hs := (gm_rep_spec (gm_A S) a (w23_gm_values_repr S hq (w23_gm_type_values S 4 0 2 0 ha))).2 rw [← heij,oh_pair_value] at hs exact hs.symm have haright : S.conductor≤a := by have hlo := ((w23_level_eq_iff S a 4).1 ((w23_mem_X S 4 a).1 (Finset.mem_filter.1 ha).1).2).1 have hc := w23_q_mul_sub S rw [hq] at hc omega let M := (gm_indices S 1).image (m3_unitAdd alpha) have hMcard : M.card=3 := by rw [Finset.card_image_of_injective _ (gs_unitAdd_index_injective alpha),w23_gm_indices_card_B S hq,hK] have hMdis : Disjoint M ((gm_H S).image (gm_rep (gm_A S))) := by apply Finset.disjoint_left.2 intro beta hbeta hm obtain ⟨b,hbB,rfl⟩ := Finset.mem_image.1 hbeta apply w23_gs_not_H_of_large_value S hq _ ?_ hm rw [m3_value_unitAdd,oh_pair_value] have hbgt := w23_gm_A_bounds S (m3_enum_mem (gm_A S) b) omega let E1 := (gm_type S 3 1 1 0 ∪ gm_type S 3 0 2 0).image (gm_rep (gm_A S)) have hcharge : ∀ beta ∈ M, 2≤gs_mixedCharge S beta := by intro beta hbeta obtain ⟨b,hbB,rfl⟩ := Finset.mem_image.1 hbeta have hbC : b ∉ gm_indices S 2 := fun hh => Finset.disjoint_left.1 (gm_indices_disjoint S 1 2 (by omega)) hbB hh have hpc : ∀ r ∈ gm_indices S 2, 0 Nat.zero_le _) change 2≤_+gs_weight (gm_indices S 1 ∪ gm_indices S 2) E1 (m3_unitAdd alpha b) omega have hsum : 6≤∑ beta ∈ M, gs_mixedCharge S beta := by have hh := Finset.sum_le_sum hcharge have he : (∑ beta ∈ M, 2)=6 := by simp [hMcard] rw [he] at hh exact hh have hmiss := w23_gs_mixed_charge_bound S hq M hMdis rw [hK,hb,hh0] at hmiss have hsh := w23_gm_mixed_card S hq rw [hK,hb,hh0] at hsh let k := (w23_P S 2).card let f := (gm_type S 3 0 2 0).card let H := (gm_h1 S).card+(gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card let wl := (gm_wlow S).card have hmiss' : (∑ beta ∈ M, gs_mixedCharge S beta)+3*H≤k*wl+(k+5)*((gm_type S 3 1 1 0).card+f) := by change (∑ beta ∈ M, gs_mixedCharge S beta)+3*(0+(gm_h1 S).card+(gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card)≤ k*(0+wl)+(3+k+2)*((gm_type S 3 1 1 0).card+f) at hmiss rw [show 3+k+2=k+5 from by omega] at hmiss simpa only [H,Nat.zero_add,Nat.add_assoc] using hmiss change _+_+_+(k*wl+(k+5)*((gm_type S 3 1 1 0).card+f)-3*H)≤3 at hbudget omega noncomputable def gs_threeF (S : NumericalSemigroup) : Finset (Fin (gm_A S).card → ℕ) := (gm_type S 4 3 0 0 ∪ gm_H S).image (gm_rep (gm_A S)) lemma w23_gs_H_card (S : NumericalSemigroup) : (gm_H S).card=(gm_h0 S).card+(gm_h1 S).card+ (gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card := by classical have hd : Disjoint (gm_type S 4 2 1 0 ∪ gm_type S 4 1 2 0) (gm_type S 4 0 3 0) := by rw [Finset.disjoint_union_left] exact ⟨gm_type_disjoint S 4 2 1 0 4 0 3 0 (by omega),gm_type_disjoint S 4 1 2 0 4 0 3 0 (by omega)⟩ rw [gm_H,Finset.card_union_of_disjoint hd, Finset.card_union_of_disjoint (gm_type_disjoint S 4 2 1 0 4 1 2 0 (by omega)),← gm_h_card S] lemma w23_gs_threeF_data (S : NumericalSemigroup) (hq : w23_q S=4) : (gs_threeF S).card=(gm_type S 4 3 0 0).card+(gm_H S).card ∧ ∀ alpha ∈ gs_threeF S, m3_degree alpha=3 ∧ gs_Canon S alpha := by classical have hV : gm_type S 4 3 0 0 ∪ gm_H S ⊆ gm_values S := Finset.union_subset (w23_gm_type_values S 4 3 0 0) (fun x hx => (w23_gm_H_data S hq hx).1) have hd : Disjoint (gm_type S 4 3 0 0) (gm_H S) := by unfold gm_H simp only [Finset.disjoint_union_right] exact ⟨⟨gm_type_disjoint S 4 3 0 0 4 2 1 0 (by omega), gm_type_disjoint S 4 3 0 0 4 1 2 0 (by omega)⟩, gm_type_disjoint S 4 3 0 0 4 0 3 0 (by omega)⟩ refine ⟨?_,?_⟩ · rw [gs_threeF,gm_rep_image_card (gm_A S) _ (fun x hx => w23_gm_values_repr S hq (hV hx)), Finset.card_union_of_disjoint hd] · intro alpha ha have hc := w23_gs_canon_of_image S hq _ hV ha refine ⟨?_,hc⟩ obtain ⟨a,ha,he⟩ := Finset.mem_image.1 ha rcases Finset.mem_union.1 ha with hp | hm · rw [← he] exact (w23_gs_type_image_data S hq 4 3 0 0 (Finset.mem_image.2 ⟨a,hp,rfl⟩)).1 · have hh := w23_gm_H_data S hq hm have hg := w23_gm_group_degree S hq (gm_rep (gm_A S) a) rw [← he] omega lemma w23_gs_threeF_right_card (S : NumericalSemigroup) (hq : w23_q S=4) : (gs_threeF S).card≤(n4_right S).card := by classical have hsub (b c d : ℕ) : gm_type S 4 b c d ⊆ n4_right S := by intro a ha obtain ⟨hX,hn,_,_,_⟩ := Finset.mem_filter.1 ha exact Finset.mem_filter.2 ⟨hX,hn⟩ have hH : gm_H S ⊆ n4_right S := by unfold gm_H exact Finset.union_subset (Finset.union_subset (hsub 2 1 0) (hsub 1 2 0)) (hsub 0 3 0) have hV : gm_type S 4 3 0 0 ∪ gm_H S ⊆ gm_values S := Finset.union_subset (w23_gm_type_values S 4 3 0 0) (fun a ha => (w23_gm_H_data S hq ha).1) rw [gs_threeF,gm_rep_image_card (gm_A S) _ (fun a ha => w23_gm_values_repr S hq (hV ha))] exact Finset.card_le_card (Finset.union_subset (hsub 3 0 0) hH) lemma gs_three_shadow_budget (k f H wl rho : ℕ) (hCC : 2*f=k*(k+1)) (hwl : wl≤6) (hstrip : f+H≤rho) (hsh : 3*H≤k*wl+(k+5)*(3*k+f)) (hb : k*(6-wl)+(rho-(f+H))+(k*wl+(k+5)*(3*k+f)-3*H)≤3) : (k+5)*(k+4).choose 2≤3*(10+H)+3 ∧ 6*k+(k+5)*(3*k+f)≤3*H+3 ∧ (6*k+(k+5)*(3*k+f)=3*H+3 → rho=f+H) := by have hc := w23_choose_two_mul (k+3) have hdiff : (6-wl)+wl=6 := by omega have hmul := congrArg (fun z => k*z) hdiff rw [Nat.mul_add] at hmul have hsub : (k*wl+(k+5)*(3*k+f)-3*H)+3*H=k*wl+(k+5)*(3*k+f) := by omega have hineq : 6*k+(k+5)*(3*k+f)+(rho-(f+H))≤3*H+3 := by nlinarith only [hb,hmul,hsub] have hchoose : (k+5)*(k+4).choose 2=30+6*k+(k+5)*(3*k+f) := by nlinarith only [hc,hCC] refine ⟨by omega,by omega,?_⟩ intro he omega lemma w23_gs_three_count_data (S : NumericalSemigroup) (hq : w23_q S=4) (hK : (w23_X S 1).card=3) (ho : gs_ThreeObstruction S) : let k := (w23_P S 2).card let f := (gm_type S 3 0 2 0).card let H := (gm_H S).card (gm_A S).card=k+3 ∧ 2*f=k*(k+1) ∧ S.multiplicity=20+4*k+f+H ∧ 6*k+(k+5)*(3*k+f)≤3*H+3 ∧ ((gm_A S).card+2)*((gm_A S).card+1).choose 2≤3*(gs_threeF S).card+3 ∧ (6*k+(k+5)*(3*k+f)=3*H+3 → w23_rho S=f+H) := by classical have hy := w23_gs_three_BC_right_empty S hq hK ho have hd := w23_gs_three_CC_right_empty S hq hK ho obtain ⟨hp,hz,hk,hb,hw,hv,ht,hu,hh0,hBC,hCC,hbudget⟩ := ho let k := (w23_P S 2).card let f := (gm_type S 3 0 2 0).card let H := (gm_H S).card have hH : H=(gm_h1 S).card+(gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card := by dsimp [H] rw [w23_gs_H_card,hh0,Nat.zero_add] have hx : (gm_type S 3 1 1 0).card=3*k := by omega have hcc : 2*f=k*(k+1) := by rw [hd,Nat.add_zero] at hCC; exact hCC have hr := w23_gm_BD_card S hq have hs := w23_gm_CD_card S hq rw [hz] at hr hs have hR := w23_gm_right_card S hq have hReq : (n4_right S).card≤10+H := by rw [ht,hu,hy,hd,hh0] at hR; dsimp [H]; rw [w23_gs_H_card,hh0]; omega obtain ⟨he,hL,hm⟩ := w23_gm_general_counts S hq have hAc : (gm_A S).card=k+3 := by have hmC : S.multiplicity ((w23_gs_threeF_data S hq).2 a ha).1) hp hbudget ha hb haF hbF lemma w23_gs_three_missing_numbers (S : NumericalSemigroup) (hq : w23_q S=4) (hK : (w23_X S 1).card=3) (ho : gs_ThreeObstruction S) (alpha : Fin (gm_A S).card → ℕ) (ha : m3_degree alpha=3) (haF : alpha ∉ gs_threeF S) : 6*(w23_P S 2).card+((w23_P S 2).card+5)*(3*(w23_P S 2).card+(gm_type S 3 0 2 0).card)= 3*(gm_H S).card+3 ∧ w23_rho S=(gm_type S 3 0 2 0).card+(gm_H S).card := by classical obtain ⟨hAc,hcc,hm,hup,hbudget,hrho⟩ := w23_gs_three_count_data S hq hK ho let E := gs_pair_family (Finset.univ : Finset (Fin (gm_A S).card)) have hE : ∀ beta ∈ E, m3_degree beta=2 := by intro beta hb obtain ⟨ij,_,rfl⟩ := Finset.mem_image.1 hb exact m3_degree_pairVector ij.1 ij.2 have hp : ∀ beta, m3_degree beta=3 →∀ i, 0 (up_weight_eq_degree E beta (hp beta ((w23_gs_threeF_data S hq).2 beta hb).1)).trans ((w23_gs_threeF_data S hq).2 beta hb).1)] simp [Nat.mul_comm] rw [Finset.sum_insert haF,hweight,hsum,gs_pair_family_card,Finset.card_univ,Fintype.card_fin] at hc have hcap : ((gm_A S).card+2)*((gm_A S).card+1).choose 2=3*(gs_threeF S).card+3 := by omega have hFc : (gs_threeF S).card=10+(gm_H S).card := by rw [(w23_gs_threeF_data S hq).1] obtain ⟨_,_,_,_,_,_,ht,_⟩ := ho rw [ht] let k := (w23_P S 2).card let f := (gm_type S 3 0 2 0).card let H := (gm_H S).card have hchoose := w23_choose_two_mul (k+3) rw [hFc,hAc,show k+3+2=k+5 from by omega,show k+3+1=k+4 from by omega] at hcap have he : 6*k+(k+5)*(3*k+f)=3*H+3 := by nlinarith only [hcap,hchoose,hcc] exact ⟨he,hrho he⟩ lemma w23_gs_threeF_not_of_large (S : NumericalSemigroup) (hq : w23_q S=4) (alpha : Fin (gm_A S).card → ℕ) (hl : S.conductor+S.multiplicity≤m3_value (m3_enum (gm_A S)) alpha) : alpha ∉ gs_threeF S := by classical intro ha have hc := ((w23_gs_threeF_data S hq).2 alpha ha).2 have hlt := w23_apery_lt S (Finset.mem_filter.1 hc.1).1 omega lemma w23_gs_three_low_degree (S : NumericalSemigroup) (hq : w23_q S=4) (hK : (w23_X S 1).card=3) (ho : gs_ThreeObstruction S) (alpha : Fin (gm_A S).card → ℕ) (ha : m3_degree alpha≤2) : gs_Canon S alpha := by have hpairs := w23_gs_three_all_pairs S hq hK ho have hN : 0<(gm_A S).card := by have hh := (w23_gs_three_count_data S hq hK ho).1 omega let i : Fin (gm_A S).card := ⟨0,hN⟩ have hunit (j : Fin (gm_A S).card) : gs_Canon S (m3_unitAdd (fun _ => 0) j) := by have hh := w23_gs_canon_parent S hq (hpairs j j) j (by simp [m3_pairVector,m3_unitAdd]) simpa only [m3_pairVector,m3_parent_unitAdd] using hh have hzero : gs_Canon S (fun _ => 0) := by have hh := w23_gs_canon_parent S hq (hunit i) i (by simp [m3_unitAdd]) simpa only [m3_parent_unitAdd] using hh interval_cases hd : m3_degree alpha · rw [m3_degree_zero alpha hd]; exact hzero · obtain ⟨j,hj⟩ := m3_degree_one_repr alpha hd rw [hj]; exact hunit j · obtain ⟨j,k,_,he⟩ := m3_degree_two_repr alpha hd rw [he]; exact hpairs j k lemma w23_gs_three_B_lower (S : NumericalSemigroup) (hq : w23_q S=4) (hK : (w23_X S 1).card=3) (ho : gs_ThreeObstruction S) (i : Fin (gm_A S).card) (hi : i ∈ gm_indices S 1) : 3*S.multiplicity≤2*m3_enum (gm_A S) i+w23_rho S := by classical have hb : (gm_type S 2 2 0 0).card=0 := ho.2.2.2.1 have hcan := w23_gs_three_all_pairs S hq hK ho i i have htype := w23_gs_BB_type S hq hb hi hi hcan have hl := ((w23_level_eq_iff S _ 3).1 ((w23_mem_X S 3 _).1 (Finset.mem_filter.1 htype).1).2).1 rw [oh_pair_value] at hl omega lemma w23_gs_C_lower (S : NumericalSemigroup) (i : Fin (gm_A S).card) (hi : i ∈ gm_indices S 2) : 2*S.multiplicity≤m3_enum (gm_A S) i+w23_rho S := by have hl : w23_level S (m3_enum (gm_A S) i)=2 := by simpa [gm_indices] using hi exact ((w23_level_eq_iff S _ 2).1 hl).1 lemma gs_cube_injective {N : ℕ} : Function.Injective (fun i : Fin N => m3_unitAdd (m3_pairVector i i) i) := by intro i j he by_contra hn have hh := congrFun he i simp [m3_pairVector,m3_unitAdd,hn] at hh lemma w23_gs_three_missing_small_impossible (S : NumericalSemigroup) (hq : w23_q S=4) (hK : (w23_X S 1).card=3) (ho : gs_ThreeObstruction S) (hk2 : (w23_P S 2).card≤2) (alpha : Fin (gm_A S).card → ℕ) (ha : m3_degree alpha=3) (haF : alpha ∉ gs_threeF S) : False := by classical obtain ⟨hAc,hCC,hm,hupper,_,_⟩ := w23_gs_three_count_data S hq hK ho obtain ⟨hE,hrho⟩ := w23_gs_three_missing_numbers S hq hK ho alpha ha haF have hkpos : 0<(w23_P S 2).card := ho.2.2.1 have hBcard : (gm_indices S 1).card=3 := by rw [w23_gm_indices_card_B S hq,hK] have hCcard : (gm_indices S 2).card=(w23_P S 2).card := w23_gm_indices_card_P S hq 2 (by omega) (by omega) have hc := w23_q_mul_sub S rw [hq] at hc interval_cases hk : (w23_P S 2).card · norm_num [hk] at hCC hE hm have hf : (gm_type S 3 0 2 0).card=1 := by omega have hH : (gm_H S).card=9 := by omega have hr : w23_rho S=10 := by omega have hmc : S.multiplicity=34 := by omega obtain ⟨i,hi,j,hj,hij⟩ := Finset.one_lt_card.1 (show 1<(gm_indices S 1).card from by omega) obtain ⟨k,hkC⟩ := Finset.card_pos.1 (show 0<(gm_indices S 2).card from by omega) have hiL := w23_gs_three_B_lower S hq hK ho i hi have hjL := w23_gs_three_B_lower S hq hK ho j hj have hkL := w23_gs_C_lower S k hkC let beta := m3_unitAdd (m3_pairVector k k) i let gamma := m3_unitAdd (m3_pairVector k k) j have hbF : beta ∉ gs_threeF S := by apply w23_gs_threeF_not_of_large S hq change S.conductor+S.multiplicity≤m3_value (m3_enum (gm_A S)) (m3_unitAdd (m3_pairVector k k) i) rw [m3_value_unitAdd,oh_pair_value] omega have hgF : gamma ∉ gs_threeF S := by apply w23_gs_threeF_not_of_large S hq change S.conductor+S.multiplicity≤m3_value (m3_enum (gm_A S)) (m3_unitAdd (m3_pairVector k k) j) rw [m3_value_unitAdd,oh_pair_value] omega have heq := w23_gs_three_missing_unique S hq hK ho (by simp [beta,m3_degree_unitAdd,m3_degree_pairVector]) (by simp [gamma,m3_degree_unitAdd,m3_degree_pairVector]) hbF hgF exact hij (gs_unitAdd_index_injective (m3_pairVector k k) heq) · norm_num [hk] at hCC hE hm have hf : (gm_type S 3 0 2 0).card=3 := by omega have hH : (gm_H S).card=24 := by omega have hr : w23_rho S=27 := by omega have hmc : S.multiplicity=55 := by omega obtain ⟨i,hi,j,hj,hij⟩ := Finset.one_lt_card.1 (show 1<(gm_indices S 2).card from by omega) have hiL := w23_gs_C_lower S i hi have hjL := w23_gs_C_lower S j hj let beta := m3_unitAdd (m3_pairVector i i) i let gamma := m3_unitAdd (m3_pairVector j j) j have hbF : beta ∉ gs_threeF S := by apply w23_gs_threeF_not_of_large S hq change S.conductor+S.multiplicity≤m3_value (m3_enum (gm_A S)) (m3_unitAdd (m3_pairVector i i) i) rw [m3_value_unitAdd,oh_pair_value] omega have hgF : gamma ∉ gs_threeF S := by apply w23_gs_threeF_not_of_large S hq change S.conductor+S.multiplicity≤m3_value (m3_enum (gm_A S)) (m3_unitAdd (m3_pairVector j j) j) rw [m3_value_unitAdd,oh_pair_value] omega have heq := w23_gs_three_missing_unique S hq hK ho (by simp [beta,m3_degree_unitAdd,m3_degree_pairVector]) (by simp [gamma,m3_degree_unitAdd,m3_degree_pairVector]) hbF hgF exact hij (gs_cube_injective heq) lemma gs_three_full_count_contradiction (k f H m : ℕ) (hCC : 2*f=k*(k+1)) (hH : 3*H≤6*k+(k+5)*(3*k+f)) (hm : m≤20+4*k+f+H) (hpack : k+4+(k+4)*(k+4).choose 2≤m) : False := by have hp : 2*(k+4).choose 2=(k+4)*(k+3) := by have hh := w23_choose_two_self (k+4) nlinarith have hm6 : 6*m≤(k+4)*(k+5)*(k+6) := by nlinarith have hstrict : (k+4)*(k+5)*(k+6)<6*(k+4)+3*(k+4)*(k+4)*(k+3) := by nlinarith only [Nat.zero_le k,Nat.zero_le (k*k),Nat.zero_le (k*k*k)] nlinarith theorem w23_gs_q4_gen_three (S : NumericalSemigroup) (h1 : 3*S.multiplicity 3 * S.multiplicity + 1 ≤ 2 * a ∧ 3 * a + w23_rho S + 1 ≤ 5 * S.multiplicity) noncomputable def bd_bad (S : NumericalSemigroup) : Finset ℕ := by classical exact (w23_X S 1).filter (fun a => ¬ (3 * S.multiplicity + 1 ≤ 2 * a ∧ 3 * a + w23_rho S + 1 ≤ 5 * S.multiplicity)) noncomputable def bd_gap (S : NumericalSemigroup) : Finset ℕ := Finset.Icc (4 * S.multiplicity + (S.multiplicity + 1) / 3) (4 * S.multiplicity + S.multiplicity / 2) noncomputable def bd_excluded (S : NumericalSemigroup) : Finset ℕ := insert 0 (insert S.multiplicity (insert (2 * S.multiplicity) (w23_X S 1))) noncomputable def bd_remaining (S : NumericalSemigroup) : Finset ℕ := S.leftElements \ bd_excluded S lemma bd_X1_spec (S : NumericalSemigroup) (hq : w23_q S = 4) {a : ℕ} (ha : a ∈ w23_X S 1) : S.IsPrimitive a ∧ a < S.conductor ∧ S.multiplicity < a ∧ a + w23_rho S < 2 * S.multiplicity := by classical have hl := ((w23_mem_X S 1 a).1 ha).2 have hb := ((w23_level_eq_iff S a 1).1 hl).2 have hgt := w23_X_one_gt S ha have hlt := (w23_lt_conductor_iff S a).2 (by omega) rw [w23_X_one] at ha have hp := (S.mem_primitiveElements a).1 (Finset.mem_filter.1 (Finset.mem_erase.1 ha).2).1 exact ⟨hp, hlt, hgt, by omega⟩ lemma bd_left_generators (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) : w23_low_A S = insert S.multiplicity (w23_X S 1) := by classical ext a rw [w23_low_mem_A, Finset.mem_insert] constructor · rintro ⟨hp,hlt⟩ by_cases he : a = S.multiplicity · exact Or.inl he · exact Or.inr ((w23_mem_X S 1 a).2 ⟨w23_primitive_mem_apery S hp he, w23_cm_primitive_level S hcore hp hlt⟩) · rintro (rfl | ha) · have hb := (w23_q_bounds S).1 rw [hq] at hb exact ⟨S.multiplicity_isPrimitive, by omega⟩ · exact ⟨(bd_X1_spec S hq ha).1, (bd_X1_spec S hq ha).2.1⟩ lemma bd_generator_partition (S : NumericalSemigroup) : insert S.multiplicity (w23_X S 1) = insert S.multiplicity (bd_good S) ∪ bd_bad S := by classical ext a simp only [bd_good, bd_bad, Finset.mem_insert, Finset.mem_union, Finset.mem_filter] tauto lemma bd_insert_repr (A : Finset ℕ) (m d x : ℕ) (hx : x ∈ d • insert m A) : ∃ j k y : ℕ, j + k = d ∧ y ∈ j • A ∧ x = y + k * m := by classical induction d generalizing x with | zero => have he : x = 0 := by simpa using hx exact ⟨0,0,0,rfl,by simp,by omega⟩ | succ d ih => rw [succ_nsmul] at hx obtain ⟨y,hy,a,ha,rfl⟩ := Finset.mem_add.1 hx obtain ⟨j,k,z,hjk,hz,he⟩ := ih y hy rcases Finset.mem_insert.1 ha with rfl | ha · exact ⟨j,k+1,z,by omega,hz,by nlinarith⟩ · refine ⟨j+1,k,z+a,by omega,?_,by omega⟩ rw [succ_nsmul] exact Finset.add_mem_add hz ha lemma bd_good_sum_bounds (S : NumericalSemigroup) (j y : ℕ) (hy : y ∈ j • bd_good S) : j * (3 * S.multiplicity + 1) ≤ 2 * y ∧ 3 * y + j * (w23_rho S + 1) ≤ j * (5 * S.multiplicity) := by classical induction j generalizing y with | zero => have he : y = 0 := by simpa using hy subst y simp | succ j ih => rw [succ_nsmul] at hy obtain ⟨z,hz,a,ha,rfl⟩ := Finset.mem_add.1 hy obtain ⟨hlo,hhi⟩ := ih z hz have ha' := (Finset.mem_filter.1 ha).2 change 3*S.multiplicity+1 ≤ 2*a ∧ 3*a+w23_rho S+1 ≤ 5*S.multiplicity at ha' constructor <;> nlinarith lemma bd_good_scalar_exclusion (m rho x j k y : ℕ) (hcount : j + k ≤ 4) (hlo : j * (3 * m + 1) ≤ 2 * y) (hhi : 3 * y + j * (rho + 1) ≤ j * (5 * m)) (hval : x = y + k * m) (hx0 : 4 * m < x) (hx3 : 13 * m ≤ 3 * x + 1) (hx2 : 2 * x ≤ 9 * m) : False := by have hj : j ≤ 4 := by omega have hk : k ≤ 4 := by omega interval_cases j <;> interval_cases k <;> nlinarith lemma bd_gap_bounds (S : NumericalSemigroup) (hq : w23_q S = 4) (hrho : 2 * w23_rho S + 2 ≤ S.multiplicity) {x : ℕ} (hx : x ∈ bd_gap S) : 4 * S.multiplicity < x ∧ S.conductor ≤ x ∧ x < S.conductor + S.multiplicity ∧ 13 * S.multiplicity ≤ 3 * x + 1 ∧ 2 * x ≤ 9 * S.multiplicity := by have hb := Finset.mem_Icc.1 hx change 4*S.multiplicity+(S.multiplicity+1)/3 ≤ x ∧ x ≤ 4*S.multiplicity+S.multiplicity/2 at hb have hc := w23_q_mul_sub S rw [hq] at hc omega lemma bd_gap_six (S : NumericalSemigroup) (hrho : 2 * w23_rho S + 2 ≤ S.multiplicity) : S.multiplicity ≤ 6 * (bd_gap S).card := by rw [bd_gap, Nat.card_Icc] omega lemma bd_good_misses (S : NumericalSemigroup) (hq : w23_q S = 4) (hrho : 2 * w23_rho S + 2 ≤ S.multiplicity) (d x : ℕ) (hx : x ∈ bd_gap S) : x ∉ d • insert S.multiplicity (bd_good S) := by intro hmem obtain ⟨j,k,y,hjk,hy,he⟩ := bd_insert_repr (bd_good S) S.multiplicity d x hmem obtain ⟨hx0,hxc,hxt,hx3,hx2⟩ := bd_gap_bounds S hq hrho hx obtain ⟨hlo,hhi⟩ := bd_good_sum_bounds S j y hy have hb : d*S.multiplicity ≤ x := by apply lh_nsmul_lower (insert S.multiplicity (bd_good S)) S.multiplicity _ d x hmem intro a ha rcases Finset.mem_insert.1 ha with rfl | ha · rfl · exact Nat.le_of_lt (w23_X_one_gt S (Finset.mem_filter.1 ha).1) have hm := S.multiplicity_pos have hc := w23_q_mul_sub S rw [hq] at hc have hcount : j+k ≤ 4 := by nlinarith exact bd_good_scalar_exclusion S.multiplicity (w23_rho S) x j k y hcount hlo hhi he hx0 hx3 hx2 lemma bd_excluded_card (S : NumericalSemigroup) (hq : w23_q S = 4) : (bd_excluded S).card = (w23_X S 1).card + 3 := by classical have hmpos := S.multiplicity_pos have hb (a : ℕ) (ha : a ∈ w23_X S 1) : S.multiplicity < a ∧ a < 2*S.multiplicity := by have hs := bd_X1_spec S hq ha exact ⟨hs.2.2.1,by omega⟩ have htwo : 2*S.multiplicity ∉ w23_X S 1 := by intro ha have hh := hb _ ha omega have hm : S.multiplicity ∉ insert (2*S.multiplicity) (w23_X S 1) := by intro ha rcases Finset.mem_insert.1 ha with he | ha · omega · have hh := hb _ ha omega have hz : 0 ∉ insert S.multiplicity (insert (2*S.multiplicity) (w23_X S 1)) := by intro ha rcases Finset.mem_insert.1 ha with he | ha · omega rcases Finset.mem_insert.1 ha with he | ha · omega · have hh := hb _ ha omega rw [bd_excluded,Finset.card_insert_of_notMem hz,Finset.card_insert_of_notMem hm, Finset.card_insert_of_notMem htwo] lemma bd_excluded_subset (S : NumericalSemigroup) (hq : w23_q S = 4) : bd_excluded S ⊆ S.leftElements := by classical have hc := (w23_q_bounds S).1 rw [hq] at hc intro x hx simp only [bd_excluded,Finset.mem_insert] at hx rcases hx with rfl | rfl | rfl | hx · exact S.zero_mem_leftElements · exact (S.mem_leftElements _).2 ⟨by omega,S.multiplicity_mem⟩ · exact (S.mem_leftElements _).2 ⟨by omega,w23_mul_mem S 2⟩ · exact (S.mem_leftElements _).2 ⟨(bd_X1_spec S hq hx).2.1,(bd_X1_spec S hq hx).1.1⟩ lemma bd_excluded_le (S : NumericalSemigroup) (hq : w23_q S = 4) {x : ℕ} (hx : x ∈ bd_excluded S) : x ≤ 2*S.multiplicity := by classical simp only [bd_excluded,Finset.mem_insert] at hx rcases hx with rfl | rfl | rfl | hx · omega · omega · rfl · have hb := (bd_X1_spec S hq hx).2.2.2 omega lemma bd_remaining_card (S : NumericalSemigroup) (hq : w23_q S = 4) : (bd_remaining S).card + (w23_X S 1).card + 3 = S.leftCount := by classical have hh := Finset.card_sdiff_add_card_eq_card (bd_excluded_subset S hq) rw [bd_excluded_card S hq] at hh change (S.leftElements \ bd_excluded S).card + ((w23_X S 1).card+3) = S.leftElements.card at hh change (S.leftElements \ bd_excluded S).card + (w23_X S 1).card+3 = S.leftElements.card omega lemma bd_decomposable_repr (S : NumericalSemigroup) {x : ℕ} (hxS : x ∈ S.carrier) (hn : ¬ S.IsPrimitive x) (hx0 : 0 < x) (hxtop : x < S.conductor+S.multiplicity) : ∃ d : ℕ, x ∈ d • w23_low_A S := by obtain ⟨a,b,ha,hb,_,_,he⟩ := w23_decomposable_eq_add S hxS hn hx0 hxtop obtain ⟨d,hd⟩ := w23_low_left_repr S a ha obtain ⟨e,he'⟩ := w23_low_left_repr S b hb refine ⟨d+e,?_⟩ rw [add_nsmul] exact Finset.mem_add.2 ⟨a,hd,b,he',he.symm⟩ noncomputable def bd_right_primitives (S : NumericalSemigroup) : Finset ℕ := by classical exact S.primitiveElements.filter (fun x => S.conductor ≤ x) lemma bd_gap_coverage (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) (hrho : 2 * w23_rho S + 2 ≤ S.multiplicity) : ∀ x ∈ bd_gap S, x ∈ bd_right_primitives S ∨ ∃ a ∈ bd_bad S, ∃ y ∈ bd_remaining S, x = a+y := by classical intro x hx obtain ⟨hxlo,hxc,hxtop,_,_⟩ := bd_gap_bounds S hq hrho hx have hxS := S.conductor_spec x hxc by_cases hp : S.IsPrimitive x · exact Or.inl (Finset.mem_filter.2 ⟨(S.mem_primitiveElements x).2 hp,hxc⟩) obtain ⟨d,hd⟩ := bd_decomposable_repr S hxS hp (by omega) hxtop rw [bd_left_generators S hq hcore,bd_generator_partition S] at hd rcases gm_union_factor (insert S.multiplicity (bd_good S)) (bd_bad S) d x hd with hg | ⟨a,ha,y,hy,he⟩ · exact (bd_good_misses S hq hrho d x hx hg).elim · have haX := (Finset.mem_filter.1 ha).1 change a ∈ w23_X S 1 at haX obtain ⟨_,_,ham,ha2⟩ := bd_X1_spec S hq haX have hyS : y ∈ S.carrier := by apply ns_nsmul_mem_carrier S (insert S.multiplicity (bd_good S) ∪ bd_bad S) _ (d-1) y hy intro b hb rw [← bd_generator_partition S, ← bd_left_generators S hq hcore] at hb exact ((w23_low_mem_A S b).1 hb).1.1 have hylo : 2*S.multiplicity < y := by omega have hyc : y < S.conductor := by omega refine Or.inr ⟨a,ha,y,Finset.mem_sdiff.2 ⟨(S.mem_leftElements y).2 ⟨hyc,hyS⟩,?_⟩,by omega⟩ intro hyF have hF := bd_excluded_le S hq hyF omega lemma bd_gap_card_bound (E L J P : Finset ℕ) (hcover : ∀ x ∈ J, x ∈ P ∨ ∃ a ∈ E, ∃ y ∈ L, x = a+y) : J.card ≤ P.card + E.card*L.card := by classical have hsub : J ⊆ P ∪ (E ×ˢ L).image (fun q => q.1+q.2) := by intro x hx rcases hcover x hx with hp | ⟨a,ha,y,hy,hxy⟩ · exact Finset.mem_union_left _ hp · apply Finset.mem_union_right exact Finset.mem_image.mpr ⟨(a,y), Finset.mem_product.mpr ⟨ha,hy⟩,hxy.symm⟩ calc J.card ≤ (P ∪ (E ×ˢ L).image (fun q => q.1+q.2)).card := Finset.card_le_card hsub _ ≤ P.card + ((E ×ˢ L).image (fun q => q.1+q.2)).card := Finset.card_union_le _ _ _ ≤ P.card + (E ×ˢ L).card := Nat.add_le_add_left (Finset.card_image_le) _ _ = P.card + E.card*L.card := by rw [Finset.card_product] lemma bd_coverage_count (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) (hrho : 2 * w23_rho S + 2 ≤ S.multiplicity) : (bd_gap S).card ≤ w23_pq S + (bd_bad S).card*(bd_remaining S).card := bd_gap_card_bound (bd_bad S) (bd_remaining S) (bd_gap S) (bd_right_primitives S) (bd_gap_coverage S hq hcore hrho) lemma bd_density_certificate (K r ell p m g : ℤ) (hK : 0 ≤ K) (hr : 1 ≤ r) (hp : 0 ≤ p) (hm : 0 < m) (hg : 0 < g) (hell : 3*K+4 ≤ ell) (hcover : g ≤ p+r*(ell-K-3)) (hdense : 4*r*m ≤ (K+1)*g) : 0 ≤ (K+1+p)*ell-4*m := by have hell0 : 0 ≤ ell := by linarith have hfirst : 0 ≤ ((K+1)*g-4*r*m)*ell := mul_nonneg (by linarith) hell0 have hsecond : 0 ≤ 4*r*m*(K+3) := by positivity have hsmall : K+1 ≤ ell := by linarith have hge : 4*m ≤ g*ell := by have h1 : 4*m ≤ 4*r*m := by nlinarith have h2 : (K+1)*g ≤ ell*g := mul_le_mul_of_nonneg_right hsmall (le_of_lt hg) nlinarith have hthird : 0 ≤ p*(g*ell-4*m) := mul_nonneg hp (by linarith) have hfourth : 0 ≤ 4*m*(p+r*(ell-K-3)-g) := mul_nonneg (by positivity) (by linarith) have hid : g*((K+1+p)*ell-4*m) = ((K+1)*g-4*r*m)*ell + 4*r*m*(K+3) + p*(g*ell-4*m) + 4*m*(p+r*(ell-K-3)-g) := by ring have hh : 0 ≤ g*((K+1+p)*ell-4*m) := by linarith nlinarith lemma bd_scale_density (K r m g : ℕ) (hgap : m ≤ 6*g) (hpop : 24*r ≤ K+1) : 4*r*m ≤ (K+1)*g := by have h1 := Nat.mul_le_mul_left (4*r) hgap have h2 := Nat.mul_le_mul_right g hpop nlinarith only [h1,h2] lemma w23_l1_band_density (S : NumericalSemigroup) (hq : w23_q S = 4) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) (hrho : 2 * w23_rho S + 2 ≤ S.multiplicity) (hbad : 1 ≤ (bd_bad S).card) (hdense : 4 * (bd_bad S).card * S.multiplicity ≤ ((w23_X S 1).card + 1) * (bd_gap S).card) : S.SatisfiesWilf := by obtain ⟨hn,hL,_,_⟩ := w23_cm_counts S hq hcore have he := w23_e_eq S have hrem := bd_remaining_card S hq have hcover := bd_coverage_count S hq hcore hrho have hgap := bd_gap_six S hrho have hg : 0 < (bd_gap S).card := by have hm := S.multiplicity_pos omega have hremZ : ((bd_remaining S).card : ℤ) + (w23_X S 1).card + 3 = S.leftCount := by exact_mod_cast hrem have hcoverZ : ((bd_gap S).card : ℤ) ≤ (w23_pq S : ℤ) + ((bd_bad S).card : ℤ)*((S.leftCount : ℤ)-(w23_X S 1).card-3) := by have hc : ((bd_gap S).card : ℤ) ≤ (w23_pq S : ℤ) + ((bd_bad S).card : ℤ)*(bd_remaining S).card := by exact_mod_cast hcover have hr : ((bd_remaining S).card : ℤ) = (S.leftCount : ℤ)-(w23_X S 1).card-3 := by omega rwa [hr] at hc have hbound := bd_density_certificate ((w23_X S 1).card : ℤ) ((bd_bad S).card : ℤ) (S.leftCount : ℤ) (w23_pq S : ℤ) (S.multiplicity : ℤ) ((bd_gap S).card : ℤ) (by positivity) (by exact_mod_cast hbad) (by positivity) (by exact_mod_cast S.multiplicity_pos) (by exact_mod_cast hg) (by exact_mod_cast (show 3*(w23_X S 1).card+4 ≤ S.leftCount by omega)) hcoverZ (by exact_mod_cast hdense) have heZ : (S.embeddingDimension : ℤ) = (w23_X S 1).card+1+(w23_pq S : ℤ) := by exact_mod_cast (show S.embeddingDimension = (w23_X S 1).card+1+w23_pq S by omega) have hboundZ : (4 : ℤ)*S.multiplicity ≤ (S.embeddingDimension : ℤ)*S.leftCount := by rw [heZ] linarith have hboundN : 4*S.multiplicity ≤ S.embeddingDimension*S.leftCount := by exact_mod_cast hboundZ have hc := (w23_q_bounds S).2 rw [hq] at hc exact le_trans hc hboundN theorem w23_q4_core_band24 (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (hcore : ∀ a, S.IsPrimitive a → a < S.conductor → a ≠ S.multiplicity → a + w23_rho S < 2 * S.multiplicity) (hrho : 2 * w23_rho S + 2 ≤ S.multiplicity) (hr : 24 * ((w23_X S 1).filter (fun a => ¬ (3 * S.multiplicity + 1 ≤ 2 * a ∧ 3 * a + w23_rho S + 1 ≤ 5 * S.multiplicity))).card ≤ (w23_X S 1).card + 1) : S.SatisfiesWilf := by classical have hq := w23_q_eq_four S h1 h2 change 24*(bd_bad S).card ≤ (w23_X S 1).card+1 at hr by_cases hbad : (bd_bad S).card = 0 · have hemp : bd_bad S = ∅ := Finset.card_eq_zero.1 hbad apply w23_q4_high S h1 h2 intro a hp hlt hne have ha : a ∈ w23_X S 1 := (w23_mem_X S 1 a).2 ⟨w23_primitive_mem_apery S hp hne,w23_cm_primitive_level S hcore hp hlt⟩ have hg : 3*S.multiplicity+1 ≤ 2*a ∧ 3*a+w23_rho S+1 ≤ 5*S.multiplicity := by by_contra hn have hh : a ∈ bd_bad S := Finset.mem_filter.2 ⟨ha,hn⟩ rw [hemp] at hh exact Finset.notMem_empty a hh exact ⟨hg.1,by have hh := hcore a hp hlt hne; omega⟩ · exact w23_l1_band_density S hq hcore hrho (by omega) (bd_scale_density (w23_X S 1).card (bd_bad S).card S.multiplicity (bd_gap S).card (bd_gap_six S hrho) hr) -- Additional partial cases audited 2026-10-08; the full q=4 case is still open. open Math30 Math30.Wilf noncomputable def t37_overflow_slots {N : ℕ} (I : Finset (Fin N)) (A : Fin N → ℕ) (Q : Finset (Fin N → ℕ)) (cut : ℕ) : ℕ := by classical exact ∑ alpha ∈ Q, ∑ i ∈ I, if cut ≤ m3_value A alpha+A i then alpha i+1 else 0 theorem t37_position_shadow {N r : ℕ} (I : Finset (Fin N)) (A : Fin N → ℕ) (Q T : Finset (Fin N → ℕ)) (cut : ℕ) (hQ : ∀ alpha ∈ Q, (∑ i ∈ I, alpha i)=r) (hT : ∀ beta ∈ T, ∀ i, i ∉ I → beta i=0) (hcut : ∀ beta ∈ T, m3_value A beta < cut) : (∑ beta ∈ T, up_weight Q beta)+t37_overflow_slots I A Q cut ≤ (I.card+r)*Q.card := by classical have hs : (∑ beta ∈ T, up_weight Q beta) = ∑ i ∈ I, ∑ beta ∈ T, if m3_parent beta i ∈ Q then beta i else 0 := by unfold up_weight rw [Finset.sum_comm] symm apply Finset.sum_subset (Finset.subset_univ I) intro i hi hn apply Finset.sum_eq_zero intro beta hb simp [hT beta hb i hn] have hc : ∀ i ∈ I, (∑ beta ∈ T, if m3_parent beta i ∈ Q then beta i else 0) ≤ ∑ alpha ∈ Q, if m3_value A alpha+A i < cut then alpha i+1 else 0 := by intro i hi let F := T.filter (fun beta => 0 < beta i ∧ m3_parent beta i ∈ Q) let E := Q.filter (fun alpha => m3_value A alpha+A i < cut) have hf : (∑ beta ∈ T, if m3_parent beta i ∈ Q then beta i else 0) = ∑ beta ∈ F, beta i := by calc _ = ∑ beta ∈ F, if m3_parent beta i ∈ Q then beta i else 0 := by symm apply Finset.sum_subset (Finset.filter_subset _ _) intro beta hb hn by_cases hp : 0 < beta i · have hnot : m3_parent beta i ∉ Q := by intro hm exact hn (Finset.mem_filter.2 ⟨hb,hp,hm⟩) simp [hnot] · have hz : beta i=0 := by omega simp [hz] _ = _ := Finset.sum_congr rfl (fun beta hb => if_pos (Finset.mem_filter.1 hb).2.2) have he : (∑ alpha ∈ Q, if m3_value A alpha+A i < cut then alpha i+1 else 0) = ∑ alpha ∈ E, (alpha i+1) := by simp only [E, Finset.sum_filter] rw [hf,he] apply Finset.sum_le_sum_of_injOn (fun beta => m3_parent beta i) · intro beta hb gamma hg heq exact n4_parent_injective i (Finset.mem_filter.1 hb).2.1 (Finset.mem_filter.1 hg).2.1 heq · intro alpha ha obtain ⟨beta,hb,rfl⟩ := Finset.mem_image.1 ha have hp := (Finset.mem_filter.1 hb).2.1 refine Finset.mem_filter.2 ⟨(Finset.mem_filter.1 hb).2.2,?_⟩ rw [m3_value_parent A beta i hp] exact hcut beta (Finset.mem_filter.1 hb).1 · intro beta hb have hp := (Finset.mem_filter.1 hb).2.1 simp [m3_parent] omega · intro alpha ha hn exact Nat.zero_le _ have htotal : (∑ i ∈ I, ∑ alpha ∈ Q, if m3_value A alpha+A i < cut then alpha i+1 else 0) +t37_overflow_slots I A Q cut = (I.card+r)*Q.card := by rw [Finset.sum_comm] unfold t37_overflow_slots rw [← Finset.sum_add_distrib] have hinner : ∀ alpha ∈ Q, (∑ i ∈ I, if m3_value A alpha+A i < cut then alpha i+1 else 0)+ (∑ i ∈ I, if cut ≤ m3_value A alpha+A i then alpha i+1 else 0) = I.card+r := by intro alpha ha rw [← Finset.sum_add_distrib] calc _ = ∑ i ∈ I, (alpha i+1) := by apply Finset.sum_congr rfl intro i hi by_cases h : m3_value A alpha+A i < cut · simp [h, show ¬ cut ≤ m3_value A alpha+A i by omega] · simp [h, show cut ≤ m3_value A alpha+A i by omega] _ = I.card+r := by rw [Finset.sum_add_distrib,hQ alpha ha] simp [Nat.add_comm] rw [Finset.sum_congr rfl hinner] simp [Nat.mul_comm] rw [hs] have hb := Finset.sum_le_sum hc omega noncomputable def t37_overflow (S : NumericalSemigroup) : ℕ := t37_overflow_slots (gm_indices S 1) (m3_enum (gm_A S)) (t31_layer S 3 2) (S.conductor+S.multiplicity) theorem t37_wrapped_overflow_bound (S : NumericalSemigroup) (hq : w23_q S=4) : t31_Lambda S+t37_overflow S ≤ ((w23_X S 1).card+2)*(gm_type S 3 2 0 0).card := by classical have h := t37_position_shadow (gm_indices S 1) (m3_enum (gm_A S)) (t31_layer S 3 2) (t31_layer S 4 3) (S.conductor+S.multiplicity) (fun alpha ha => (t31_layer_spec S hq 3 2 ha).2.1) (fun beta hb i hi => t31_layer_support S hq 4 3 hb i hi) (by intro beta hb have hs := t31_layer_spec S hq 4 3 hb have hv := w23_gm_type_values S 4 3 0 0 hs.2.2.2.2 exact ((w23_mem_apery S _).1 (Finset.mem_filter.1 hv).1).1) change t31_Lambda S+t37_overflow S ≤ ((gm_indices S 1).card+2)*(t31_layer S 3 2).card at h rwa [w23_gm_indices_card_B S hq,t31_layer_card S hq 3 2] at h theorem t37_pure_overflow_counts (K b w v t u O : ℕ) (hpair : 2*(b+w) ≤ K*(K+1)) (htriple : 3*(v+t)+O ≤ (K+2)*(b+w)) (hleft : 3*v ≤ (K+2)*b) (hquad : 4*u ≤ (K+3)*v) (hbudget : K*w ≤ w+4*O) : 4*(b+w+v+t+u) ≤ (K+1)*(3*K+2*b+w+v) := by nlinarith only [hpair,htriple,hleft,hquad,hbudget] theorem w23_q4_gen_overflow (S : NumericalSemigroup) (h1 : 3*S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4*S.multiplicity) (hbudget : (w23_X S 1).card*(gm_type S 3 2 0 0).card ≤ (gm_type S 3 2 0 0).card+4*t37_overflow S) : S.SatisfiesWilf := by have hq := w23_q_eq_four S h1 h2 have hs := t31_general_split_shadows S hq have ho := t37_wrapped_overflow_bound S hq have htriple : 3*((gm_type S 3 3 0 0).card+(gm_type S 4 3 0 0).card)+ t37_overflow S ≤ ((w23_X S 1).card+2)* ((gm_type S 2 2 0 0).card+(gm_type S 3 2 0 0).card) := by nlinarith only [hs.1,ho] have hpure := t37_pure_overflow_counts (w23_X S 1).card (gm_type S 2 2 0 0).card (gm_type S 3 2 0 0).card (gm_type S 3 3 0 0).card (gm_type S 4 3 0 0).card (gm_type S 4 4 0 0).card (t37_overflow S) (w23_gm_pure_pair_card S hq) htriple (w23_gm_pure_left_triple_card S hq) (w23_gm_pure_quadruple_card S hq) hbudget have hbound := t31_general_one_high_counts (w23_X S 1).card (w23_P S 2).card (w23_P S 3).card (gm_type S 2 2 0 0).card (gm_type S 3 2 0 0).card (gm_type S 3 3 0 0).card (gm_type S 4 3 0 0).card (gm_type S 4 4 0 0).card (gm_type S 3 1 1 0).card (gm_type S 4 1 1 0).card (gm_type S 3 0 2 0).card (gm_type S 4 0 2 0).card (gm_h0 S).card (gm_h1 S).card (gm_type S 4 1 2 0).card (gm_type S 4 0 3 0).card (gm_type S 4 1 0 1).card (gm_type S 4 0 1 1).card (gm_wlow S).card (w23_rho S) (gm_type S 3 2 0 0).card (by nlinarith only [hpure]) (w23_gm_BC_card S hq) (w23_gm_CC_card S hq) (w23_gm_BD_card S hq) (w23_gm_CD_card S hq) (w23_gm_h0_card S hq) (w23_gm_mixed_card S hq) (w23_gm_strip_card S hq) (gm_wlow_card S) (Nat.le_refl _) have heL := w23_gm_general_counts S hq have hR := w23_gm_right_card S hq have hcounts := w23_q_mul_sub S rw [hq] at hcounts apply t31_wilf_of_count_certificate S (w23_X S 1).card (w23_P S 2).card (w23_P S 3).card (gm_type S 2 2 0 0).card (gm_type S 3 2 0 0).card (gm_type S 3 3 0 0).card (gm_type S 3 1 1 0).card (gm_type S 3 0 2 0).card (w23_pq S) (w23_rho S) (n4_right S).card heL.1 heL.2.1 heL.2.2 hcounts.symm have hsum := Nat.mul_le_mul_left 4 hR have hp := Nat.zero_le (w23_pq S) nlinarith only [hbound,hsum,hp] open Math30 Math30.Wilf theorem t40_wilf_of_t3_le_wrapped (S : NumericalSemigroup) (hq : w23_q S=4) (ht3 : t31_t3 S ≤ (gm_type S 3 2 0 0).card) : S.SatisfiesWilf := by have hs := t31_general_split_shadows S hq have hpure := up_count_certificate (w23_X S 1).card (gm_type S 2 2 0 0).card (gm_type S 3 2 0 0).card (gm_type S 3 3 0 0).card (gm_type S 4 3 0 0).card (gm_type S 4 4 0 0).card (t31_Lambda S) (t31_t3 S) (w23_gm_pure_pair_card S hq) hs.1 hs.2.1 (w23_gm_pure_quadruple_card S hq) hs.2.2 have hbound := t31_general_one_high_counts (w23_X S 1).card (w23_P S 2).card (w23_P S 3).card (gm_type S 2 2 0 0).card (gm_type S 3 2 0 0).card (gm_type S 3 3 0 0).card (gm_type S 4 3 0 0).card (gm_type S 4 4 0 0).card (gm_type S 3 1 1 0).card (gm_type S 4 1 1 0).card (gm_type S 3 0 2 0).card (gm_type S 4 0 2 0).card (gm_h0 S).card (gm_h1 S).card (gm_type S 4 1 2 0).card (gm_type S 4 0 3 0).card (gm_type S 4 1 0 1).card (gm_type S 4 0 1 1).card (gm_wlow S).card (w23_rho S) (t31_t3 S) hpure (w23_gm_BC_card S hq) (w23_gm_CC_card S hq) (w23_gm_BD_card S hq) (w23_gm_CD_card S hq) (w23_gm_h0_card S hq) (w23_gm_mixed_card S hq) (w23_gm_strip_card S hq) (gm_wlow_card S) ht3 obtain ⟨he,hL,hm⟩ := w23_gm_general_counts S hq have hc := w23_q_mul_sub S rw [hq] at hc apply t31_wilf_of_count_certificate S (w23_X S 1).card (w23_P S 2).card (w23_P S 3).card (gm_type S 2 2 0 0).card (gm_type S 3 2 0 0).card (gm_type S 3 3 0 0).card (gm_type S 3 1 1 0).card (gm_type S 3 0 2 0).card (w23_pq S) (w23_rho S) (n4_right S).card he hL hm hc.symm have hR := w23_gm_right_card S hq nlinarith only [hbound,hR] lemma t40_cubic_contains_exception {N : ℕ} (I : Finset (Fin N)) (A beta : Fin N → ℕ) (cut : ℕ) (h : Fin N) (hdeg : m3_degree beta=3) (hsupport : ∀ i, i ∉ I → beta i=0) (hvalue : m3_value A beta < cut) (hlarge : ∀ i ∈ I, i ≠ h → cut ≤ 3*A i) : 0 < beta h := by classical by_contra hn have hz : beta h=0 := by omega have hc : ∀ i, cut*beta i ≤ 3*(beta i*A i) := by intro i by_cases hi : i ∈ I · by_cases he : i=h · subst i simp [hz] · have hm := Nat.mul_le_mul_right (beta i) (hlarge i hi he) nlinarith only [hm] · simp [hsupport i hi] have hs := Finset.sum_le_sum (fun i (_ : i ∈ Finset.univ) => hc i) have ht : cut*m3_degree beta ≤ 3*m3_value A beta := by simpa only [m3_degree,m3_value,Finset.mul_sum] using hs rw [hdeg] at ht omega theorem t40_general_t3_le_wrapped (S : NumericalSemigroup) (hq : w23_q S=4) (h : Fin (gm_A S).card) (hlarge : ∀ i ∈ gm_indices S 1, i ≠ h → S.conductor+S.multiplicity ≤ 3*m3_enum (gm_A S) i) : t31_t3 S ≤ (gm_type S 3 2 0 0).card := by classical let T := (t31_layer S 4 3).filter (fun beta => up_weight (t31_layer S 3 2) beta=3) have hpos : ∀ beta ∈ T, 0 < beta h := by intro beta hb have hbt := (Finset.mem_filter.1 hb).1 have hs := t31_layer_spec S hq 4 3 hbt have hv := w23_gm_type_values S 4 3 0 0 hs.2.2.2.2 exact t40_cubic_contains_exception (gm_indices S 1) (m3_enum (gm_A S)) beta (S.conductor+S.multiplicity) h hs.1 (t31_layer_support S hq 4 3 hbt) (((w23_mem_apery S _).1 (Finset.mem_filter.1 hv).1).1) hlarge have hmap : ∀ beta ∈ T, m3_parent beta h ∈ t31_layer S 3 2 := by intro beta hb have hd := (t31_layer_spec S hq 4 3 (Finset.mem_filter.1 hb).1).1 have hp := (up_weight_eq_degree_iff (t31_layer S 3 2) beta).1 (by rw [hd]; exact (Finset.mem_filter.1 hb).2) exact hp h (hpos beta hb) have hc : T.card ≤ (t31_layer S 3 2).card := by calc _ = (T.image (fun beta => m3_parent beta h)).card := by symm apply Finset.card_image_of_injOn intro beta hb gamma hg he exact n4_parent_injective h (hpos beta hb) (hpos gamma hg) he _ ≤ _ := Finset.card_le_card (by intro alpha ha obtain ⟨beta,hb,rfl⟩ := Finset.mem_image.1 ha exact hmap beta hb) change t31_t3 S ≤ (t31_layer S 3 2).card at hc rwa [t31_layer_card S hq 3 2] at hc theorem w23_q4_gen_one_small (S : NumericalSemigroup) (h1 : 3*S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4*S.multiplicity) (hone : ((w23_X S 1).filter (fun a => 3*a < S.conductor+S.multiplicity)).card ≤ 1) : S.SatisfiesWilf := by classical have hq := w23_q_eq_four S h1 h2 by_cases hX : w23_X S 1 = ∅ · exact w23_q4_of_X1_empty S h1 h2 hX · let H := (w23_X S 1).filter (fun a => 3*a < S.conductor+S.multiplicity) have hn : (w23_X S 1).Nonempty := Finset.nonempty_iff_ne_empty.2 hX have hex : ∃ b ∈ w23_X S 1, ∀ a ∈ w23_X S 1, a ≠ b → S.conductor+S.multiplicity ≤ 3*a := by by_cases hH : H.Nonempty · obtain ⟨b,hb⟩ := hH refine ⟨b,(Finset.mem_filter.1 hb).1,?_⟩ intro a ha hab by_contra hlarge have haH : a ∈ H := Finset.mem_filter.2 ⟨ha,by omega⟩ have heq := Finset.card_le_one.1 hone a haH b hb exact hab heq · obtain ⟨b,hb⟩ := hn refine ⟨b,hb,?_⟩ intro a ha hab by_contra hlarge exact hH ⟨a,Finset.mem_filter.2 ⟨ha,by omega⟩⟩ obtain ⟨b,hb,hlarge⟩ := hex have hbA : b ∈ gm_A S := by rw [← w23_gm_generators_B S hq] at hb exact (Finset.mem_filter.1 hb).1 obtain ⟨h,he⟩ := m3_enum_surjective (gm_A S) b hbA apply t40_wilf_of_t3_le_wrapped S hq apply t40_general_t3_le_wrapped S hq h intro i hi hih apply hlarge _ (t31_index_mem_X1 S hq i hi) intro hv have hie : m3_enum (gm_A S) i = m3_enum (gm_A S) h := by omega exact hih (gm_enum_injective (gm_A S) hie) /-- Quarter-prefix slice from the 2026-10-09 uniform-bounds pass. -/ theorem qpa_macaulay_linear_bound (x y b M : ℤ) (hx : 1 ≤ x) (hy : 0 ≤ y) (hyx : y < x) (hb : 2*b = x*(x-1)+2*y) (hM : 6*M ≤ (x+1)*x*(x-1)+3*(y+1)*y) : 3*M ≤ (x+2)*b := by have hp : 0 ≤ (x-y)*(x+3*y-1) := mul_nonneg (by omega) (by omega) have he := congrArg (fun z : ℤ => (x+2)*z) hb nlinarith theorem qpa_macaulay_small_pair_bound (K x y b M : ℤ) (hK : 46 ≤ K) (hx : 1 ≤ x) (hy : 0 ≤ y) (hyx : y < x) (hb0 : 0 ≤ b) (hb : 2*b = x*(x-1)+2*y) (hbu : 6*b ≤ K*(K-1)) (hM : 6*M ≤ (x+1)*x*(x-1)+3*(y+1)*y) : 16*M ≤ (4*K-28)*b := by have hdim : 4*(x+2) ≤ 3*K-21 := by by_contra hh have hp : 0 ≤ (4*x-3*K+28)*(4*x+3*K-32) := mul_nonneg (by omega) (by omega) have hquad : 0 ≤ (K-46)*(11*K-50) := mul_nonneg (by omega) (by omega) nlinarith have hm := qpa_macaulay_linear_bound x y b M hx hy hyx hb hM have hp : 0 ≤ (3*K-21-4*(x+2))*b := mul_nonneg (by omega) hb0 nlinarith theorem qpa_prefix_large (K b w p m x y M : ℤ) (hK : 46 ≤ K) (hb0 : 0 ≤ b) (hw0 : 0 ≤ w) (hp0 : 0 ≤ p) (hpair : 2*(b+w) ≤ K*(K+1)) (hx : 1 ≤ x) (hy : 0 ≤ y) (hyx : y < x) (hb : 2*b = x*(x-1)+2*y) (hM : 6*M ≤ (x+1)*x*(x-1)+3*(y+1)*y) (hprefix : m ≤ 4+4*w+4*M+4*p) (hshadow : 3*m ≤ 3+3*K+3*p+(K+5)*(b+w)) : 4*m ≤ (K+1+p)*(4+3*K+2*b+w) := by by_contra hh have hpl : 0 ≤ p*(3*K+2*b+w) := mul_nonneg hp0 (by omega) have hbad : 9*K*(K+1)+(2*K-14)*b-(K+17)*w < 0 := by nlinarith have hbu : 6*b ≤ K*(K-1) := by have hcap : 0 ≤ (K+17)*(K*(K+1)-2*(b+w)) := mul_nonneg (by omega) (by omega) by_contra hnb have hprod : 0 ≤ (K+1)*(6*b-K*(K-1)) := mul_nonneg (by omega) (by omega) nlinarith have hwb : 2*b < w := by by_contra hn have hprod : 0 ≤ (K+17)*(2*b-w) := mul_nonneg (by omega) (by omega) have hquad : 0 ≤ K*(K+17) := mul_nonneg (by omega) (by omega) nlinarith have hm := qpa_macaulay_small_pair_bound K x y b M hK hx hy hyx hb0 hb hbu hM have hww : 0 ≤ (K-15)*(w-2*b) := mul_nonneg (by omega) (by omega) have hpp : 0 ≤ p*(3*K+2*b+w-12) := mul_nonneg hp0 (by omega) nlinarith [sq_nonneg K] def qpa_macAux : ℕ → ℕ → ℕ → ℕ | 0, b, x => Nat.choose (x+1) 3 + Nat.choose (b+1) 2 | fuel+1, b, x => if b < x then Nat.choose (x+1) 3 + Nat.choose (b+1) 2 else qpa_macAux fuel (b-x) (x+1) def qpa_mac3 (b : ℕ) : ℕ := qpa_macAux (b+1) b 1 def qpa_scalarCheck (k B : ℕ) : Bool := let K : ℤ := k let b : ℤ := B let M : ℤ := qpa_mac3 B decide (13 ≤ k → 0 ≤ 18*K*(K+1)+(4*K-28)*b-(K+17)*(K*(K+1)-2*b) ∨ (if 15 ≤ k then 0 ≤ (K-15)*(9*K*(K+1)+(2*K-14)*b) + (K+17)*(3*K*K+7*K-12+(2*K+2)*b-16*M) else 0 ≤ 2*(3*K*K+7*K-12+(2*K+2)*b-16*M) + (K-15)*(K*(K+1)-2*b))) def qpa_smallCheck : Bool := (List.range 46).all fun K => (List.range (K*(K+1)/2+1)).all fun b => qpa_scalarCheck K b theorem qpa_small_certificate : qpa_smallCheck = true := by decide +kernel def qpa_macSemanticsCheck : Bool := (List.range 47).all fun x => (List.range x).all fun y => decide (Nat.choose x 2+y ≤ 1035 → qpa_mac3 (Nat.choose x 2+y)=Nat.choose (x+1) 3+Nat.choose (y+1) 2) theorem qpa_mac_semantics_certificate : qpa_macSemanticsCheck = true := by decide +kernel theorem qpa_mac3_eq_binomial (b x y : ℕ) (hy : y simp | succ d ih => rw [succ_nsmul] at hx obtain ⟨y,hy,a,ha,rfl⟩ := Finset.mem_add.1 hx have h1 := ih y hy have h2 := hquarter a ha nlinarith lemma qp_no_quartic (S : NumericalSemigroup) (hc : S.conductor=4*S.multiplicity) (hquarter : ∀ a ∈ w23_X S 1, 5*S.multiplicity ≤ 4*a) {x : ℕ} (hx : x ∈ w23_apery S) : x ∉ 4 • w23_X S 1 := by intro hh have h := qp_sum_lower S hquarter 4 x hh have ht := w23_apery_lt S hx rw [hc] at ht omega lemma qp_level_residue (S : NumericalSemigroup) (hrho : w23_rho S=0) {x j : ℕ} (hj : w23_level S x=j) : x = j*S.multiplicity+x%S.multiplicity := by have hd : x/S.multiplicity=j := by simpa [w23_level,hrho] using hj have hm := Nat.mod_add_div x S.multiplicity rw [hd] at hm nlinarith noncomputable def qp_prefix (S : NumericalSemigroup) : Finset ℕ := by classical exact (w23_apery S).filter (fun x => 4*(x%S.multiplicity) 4*(x%S.multiplicity) ((x:ℤ)+1)*z) hx2i have hbi : (b:ℤ)=(x.choose 2:ℤ)+y := by exact_mod_cast hb constructor · nlinarith only [hx2i,hbi] · push_cast nlinarith only [hxmul,hy2i,hx3i] lemma qp_quarter_count_finish (K b w p m x y : ℕ) (hK : 13≤K) (hy : y interval_cases k <;> interval_cases r <;> linarith /-- CL_{23/13}, `a ≥ 11`, `4 ≤ r`, `24 r ≤ 14 a + 21` (concave region, chord argument). -/ lemma cr_CL_C1 (a k β P r M : ℤ) (ha : 11 ≤ a) (hk : 1 ≤ k) (hβ0 : 0 ≤ β) (hr4 : 4 ≤ r) (hrhi : 24*r ≤ 14*a + 21) (hM1 : M ≤ 2*a + 2*β) (hM2 : M ≤ r*(r+1)) (hQ1 : 9*a*(a-1) + (4*a+16)*β ≤ (a+16)*P) : 0 ≤ 26*P - 46*a - 49*(k+1) + 2*(13*a+13*k+75)*r - 75*M := by -- E1s(a,1,r) = 84a² − 1484a − 1568 + (26a² + 569a + 1824) r − (23a + 992) r² have hpos : (0:ℤ) < a+16 := by linarith have hq3 : 0 ≤ 162*a*a + 16*a - 5024 := by nlinarith have hQ2 : 0 ≤ 4228*a*a*a + 44716*a*a - 548583*a - 421344 := by obtain ⟨t, ht, rfl⟩ : ∃ t : ℤ, 0 ≤ t ∧ a = 11 + t := ⟨a - 11, by linarith, by ring⟩ have h2 := mul_nonneg ht ht have h3 := mul_nonneg h2 ht nlinarith have hE : 0 ≤ 84*a*a - 1484*a - 1568 + (26*a*a + 569*a + 1824)*r - (23*a + 992)*(r*r) := by have hR : (0:ℤ) < 14*a + 21 - 72 := by linarith have e1 : 0 ≤ (14*a + 21 - 24*r) * (162*a*a + 16*a - 5024) := mul_nonneg (by linarith) hq3 have e2 : 0 ≤ (r - 3) * (4228*a*a*a + 44716*a*a - 548583*a - 421344) := mul_nonneg (by linarith) hQ2 have e3 : 0 ≤ (23*a + 992) * (14*a + 21 - 72) * ((r - 3) * (14*a + 21 - 24*r)) := mul_nonneg (mul_nonneg (by linarith) hR.le) (mul_nonneg (by linarith) (by linarith)) have key : 576*(14*a + 21 - 72) * (84*a*a - 1484*a - 1568 + (26*a*a + 569*a + 1824)*r - (23*a + 992)*(r*r)) = 576*(14*a + 21 - 24*r) * (162*a*a + 16*a - 5024) + 24*(r - 3) * (4228*a*a*a + 44716*a*a - 548583*a - 421344) + 24*((23*a + 992) * (14*a + 21 - 72) * ((r - 3) * (14*a + 21 - 24*r))) := by ring by_contra hneg push_neg at hneg have := mul_neg_of_pos_of_neg (show (0:ℤ) < 576*(14*a + 21 - 72) by linarith) hneg linarith have hk' : 0 ≤ (a+16)*(k-1)*(26*r - 49) := mul_nonneg (mul_nonneg hpos.le (by linarith)) (by linarith) have w1 : 52*(a+4)*M ≤ 52*(a+4)*(2*a + 2*β) := mul_le_mul_of_nonneg_left hM1 (by linarith) have w2 : (23*a+992)*M ≤ (23*a+992)*(r*(r+1)) := mul_le_mul_of_nonneg_left hM2 (by linarith) have key : 84*a*a - 1484*a - 1568 + (26*a*a + 569*a + 1824)*r - (23*a + 992)*(r*r) ≤ (a+16)*(26*P - 46*a - 49*(k+1) + 2*(13*a+13*k+75)*r - 75*M) := by nlinarith by_contra hneg push_neg at hneg have := mul_neg_of_pos_of_neg hpos hneg linarith /-- CL_{23/13}, `a ≥ 11`, `24 r > 14 a + 21` (only `M ≤ 2a + 2β`; split at `β* = (a−1)(a−2)/6`). -/ lemma cr_CL_C2 (a k β P r M : ℤ) (ha : 11 ≤ a) (hk : 1 ≤ k) (hβ0 : 0 ≤ β) (hr4 : 4 ≤ r) (hrlo : 14*a + 22 ≤ 24*r) (hM1 : M ≤ 2*a + 2*β) (hQ1 : 9*a*(a-1) + (4*a+16)*β ≤ (a+16)*P) (hQ2 : 6*(a+2)*β - a*(a-1)*(a-8) ≤ 12*P) : 0 ≤ 26*P - 46*a - 49*(k+1) + 2*(13*a+13*k+75)*r - 75*M := by have hpos : (0:ℤ) < a+16 := by linarith have hk' : 0 ≤ (k-1)*(26*r - 49) := mul_nonneg (by linarith) (by linarith) have hr : (26*a+176)*(14*a+22) ≤ (26*a+176)*(24*r) := mul_le_mul_of_nonneg_left hrlo (by linarith) -- lower bound for X := 26P - 150β have hX : 180*a*a*a + 2388*a*a - 7344*a + 8448 ≤ 24*(a+16)*(26*P - 150*β) + (a+16)*(24*(-196*a - 98) + (26*a+176)*(14*a+22)) ∨ 180*a*a - 492*a + 528 ≤ 24*(26*P - 150*β) + 24*(-196*a - 98) + (26*a+176)*(14*a+22) := by rcases le_total (6*β) ((a-1)*(a-2)) with hb | hb · left have h1 : (46*a+1984)*(6*β) ≤ (46*a+1984)*((a-1)*(a-2)) := mul_le_mul_of_nonneg_left hb (by linarith) nlinarith · right have h1 : (156*a-1488)*((a-1)*(a-2)) ≤ (156*a-1488)*(6*β) := mul_le_mul_of_nonneg_left hb (by linarith) nlinarith have c1 : 0 < 180*a*a*a + 2388*a*a - 7344*a + 8448 := by obtain ⟨t, ht, rfl⟩ : ∃ t : ℤ, 0 ≤ t ∧ a = 11 + t := ⟨a - 11, by linarith, by ring⟩ have h2 := mul_nonneg ht ht have h3 := mul_nonneg h2 ht nlinarith have c2 : 0 < 180*a*a - 492*a + 528 := by nlinarith have hbase : 26*P - 150*β - 196*a - 98 + (26*a+176)*r ≤ 26*P - 46*a - 49*(k+1) + 2*(13*a+13*k+75)*r - 75*M := by nlinarith rcases hX with hX | hX · by_contra hneg push_neg at hneg have h24 : 24*(26*P - 150*β - 196*a - 98) + (26*a+176)*(14*a+22) < 0 := by linarith have := mul_neg_of_pos_of_neg hpos h24 nlinarith · nlinarith /-- A4's Lemma CL_{23/13} (non-strict, 26-scaled; R4: minimum 0 at `a = 6`). -/ lemma cr_CL (a k β P r : ℤ) (ha : 6 ≤ a) (hk : 1 ≤ k) (hk3 : 3*k + 3 ≤ a) (hβ0 : 0 ≤ β) (hr0 : 0 ≤ r) (hra : r ≤ a) (hQ1 : 9*a*(a-1) + (4*a+16)*β ≤ (a+16)*P) (hQ2 : 6*(a+2)*β - a*(a-1)*(a-8) ≤ 12*P) : 0 ≤ 26*P - 46*a - 49*(k+1) + 2*(13*a+13*k+75)*r - 75 * min (2*a+2*β) (r*(r+1)) + (if r = 0 then 150 else 0) := by have hm1 := min_le_left (2*a+2*β) (r*(r+1)) have hm2 := min_le_right (2*a+2*β) (r*(r+1)) generalize min (2*a+2*β) (r*(r+1)) = M at hm1 hm2 ⊢ rcases (show r = 0 ∨ 1 ≤ r by omega) with rfl | hr1 · simp only [if_true] have hM0 : M ≤ 0 := by simpa using hm2 have := cr_CL_r0 a k β P ha hk3 hβ0 hQ1 nlinarith rw [if_neg (by omega)] rcases (show r ≤ 3 ∨ 4 ≤ r by omega) with hr3 | hr4 · have := cr_CL_r123 a k β P r M ha hk hk3 hβ0 hr1 hr3 hm2 hQ1 linarith rcases (show a ≤ 10 ∨ 11 ≤ a by omega) with ha10 | ha11 · have := cr_CL_small a k β P r M ha ha10 hk hk3 hβ0 hr4 hra hm1 hm2 hQ1 hQ2 linarith rcases (show 24*r ≤ 14*a + 21 ∨ 14*a + 22 ≤ 24*r by omega) with hlo | hhi · have := cr_CL_C1 a k β P r M ha11 hk hβ0 hr4 hlo hm1 hm2 hQ1 linarith · have := cr_CL_C2 a k β P r M ha11 hk hβ0 hr4 hhi hm1 hQ1 hQ2 linarith /-- A6 (4.3) via the integer `2h` shift: the per-fibre summand with strip generators. -/ lemma cr_fibre_arith (a0 h k b b0 Q r : ℤ) (ha : 6 ≤ a0) (hh : 0 ≤ h) (hk : 1 ≤ k) (hk3 : 3*k + 3 ≤ a0) (hb : 0 ≤ b) (hb0 : b0 ≤ a0 + b) (hr0 : 0 ≤ r) (hra : r ≤ a0) (hQ1 : 9*a0*(a0-1) + (4*a0+16)*b ≤ (a0+16)*(2*b+Q-3*h)) (hQ2 : 6*(a0+2)*b - a0*(a0-1)*(a0-8) ≤ 12*(2*b+Q-3*h)) : 0 ≤ 26*(2*b+Q-h) - 46*(a0+h) - 49*(k+1) + 2*(13*(a0+h)+13*k+75)*r - 75 * min (2*b0) (r*(r+1)) + (if r = 0 then 150 else 0) := by have hCL := cr_CL a0 k b (2*b+Q-3*h) r ha hk hk3 hb hr0 hra hQ1 hQ2 have hmin : min (2*b0) (r*(r+1)) ≤ min (2*a0+2*b) (r*(r+1)) := min_le_min_right _ (by linarith) have hhr : 0 ≤ h*r := mul_nonneg hh hr0 nlinarith /-- A6 stage 2 (`z ≥ 1`): `13(1 + P + 2k + z) ≥ 23a` with `P = 2b + Q − h`, `a = a0 + h`. -/ lemma cr_stage2_arith (a0 h k z b Q : ℤ) (ha : 6 ≤ a0) (hh : 0 ≤ h) (hk : 0 ≤ k) (hz : 0 ≤ z) (hb : 0 ≤ b) (hQ1 : 9*a0*(a0-1) + (4*a0+16)*b ≤ (a0+16)*(2*b+Q-3*h)) : 0 ≤ 13*(1 + (2*b+Q-h) + 2*k + z) - 23*(a0+h) := by have h1 : 0 ≤ (4*a0+16)*b := mul_nonneg (by linarith) hb have hpos : (0:ℤ) < a0+16 := by linarith have key : 94*a0*a0 - 472*a0 + 208 ≤ (a0+16)*(13 + 13*(2*b+Q-3*h) - 23*a0) := by nlinarith have h2 : 0 < 94*a0*a0 - 472*a0 + 208 := by nlinarith have h3 : 0 ≤ 13 + 13*(2*b+Q-3*h) - 23*a0 := by by_contra hneg have := mul_neg_of_pos_of_neg hpos (lt_of_not_ge hneg) linarith linarith /-- Summing the per-fibre bounds; empty fibres are paid by `R` (A4 L1.4 / A6 §4(c)). -/ lemma cr_fibre_sum (C : Finset ℕ) (r : ℕ → ℕ) (f : ℕ → ℤ) (R : ℕ) (hz : (C.filter (fun c => r c = 0)).card ≤ R) (hf : ∀ c ∈ C, 0 ≤ f c + (if r c = 0 then 150 else 0)) : 0 ≤ ∑ c ∈ C, f c + 150 * (R : ℤ) := by classical have h1 : 0 ≤ ∑ c ∈ C, (f c + (if r c = 0 then (150:ℤ) else 0)) := Finset.sum_nonneg hf rw [Finset.sum_add_distrib] at h1 have h2 : (∑ c ∈ C, (if r c = 0 then (150:ℤ) else 0)) = 150 * ((C.filter (fun c => r c = 0)).card : ℤ) := by rw [← Finset.sum_filter] simp [Finset.sum_const, mul_comm] have h3 : ((C.filter (fun c => r c = 0)).card : ℤ) ≤ R := by exact_mod_cast hz linarith /-- A4 (2.1) / A6 (4.1)–(4.2): algebraic assembly of Theorem A (pure ℤ). -/ lemma cr_thmA_arith (a k z lT lS nT nS dS dT sr R smin P : ℤ) (hnT : nT = a) (hnS : nS = a + k + z) (hlS : lT + k + sr + z ≤ lS) (hlT : 1 + 3*a + P ≤ lT) (ha : 0 ≤ a) (hk : 0 ≤ k) (hz : 0 ≤ z) (hsr : 0 ≤ sr) (hright : 2*(dS + sr + R) ≤ 2*dT + 2*a*k + k*(k+1) + smin + 2*a*z) (hfib : 0 ≤ k*(26*P - 46*a - 49*(k+1)) + (26*(a+k)+150)*sr - 75*smin + 150*R) (hst : 0 ≤ z*(13*(1 + P + 2*k + z) - 23*a)) : 23*(dS - dT) ≤ 13*((nS*lS - 4*dS) - (nT*lT - 4*dT)) := by rw [hnT, hnS] have e1 : (a+k+z)*(lT + k + sr + z) ≤ (a+k+z)*lS := mul_le_mul_of_nonneg_left hlS (by linarith) have e2 : (k+z)*(1 + 3*a + P) ≤ (k+z)*lT := mul_le_mul_of_nonneg_left hlT (by linarith) have e3 : 0 ≤ z*sr := mul_nonneg hz hsr nlinarith /-- The S-side certificate (A6 Lemma 2.1(a), Lemma 2.3 = H1°, Prop. 3.1 + the `2h` shift), pure ℤ. `K = |X₁|, h = #strip, k = #ordinary level-2, z = #level-3` left primitives; `P' = 2b + w + v + xh − 3h`. -/ lemma cr_S_arith (K h k z b w v t u xh xo y f d h0 h1 j l r s wl R ρ : ℤ) (hK : 0 ≤ K) (hh : 0 ≤ h) (hk : 0 ≤ k) (hz : 0 ≤ z) (hb : 0 ≤ b) (hw : 0 ≤ w) (hv : 0 ≤ v) (ht : 0 ≤ t) (hu : 0 ≤ u) (hxh : 0 ≤ xh) (hxo : 0 ≤ xo) (hy : 0 ≤ y) (hf : 0 ≤ f) (hd : 0 ≤ d) (hh0 : 0 ≤ h0) (hh1 : 0 ≤ h1) (hj : 0 ≤ j) (hl : 0 ≤ l) (hr : 0 ≤ r) (hs : 0 ≤ s) (hwl : 0 ≤ wl) (h2 : 2*(b+w) ≤ K*(K+1)) (h3 : 3*(v+t) ≤ (K+2)*(b+w)) (h3L : 3*v ≤ (K+2)*b) (h4 : 4*u ≤ (K+3)*v) (hBCs : xh ≤ K*h) (hBCo : xo + y ≤ K*k) (hCC : 2*(f+d) ≤ (h+k)*(h+k+1)) (hBD : r ≤ K*z) (hCD : s ≤ (h+k)*z) (hgood : h0 ≤ (h+k)*b) (hsh : 3*(h0+h1+j+l) ≤ (h+k)*(b+wl) + (K+h+k+2)*(xh+xo+f)) (hsh' : 3*(h0+h1+j+l) ≤ k*b + h*(b+wl) + (K+h+k+2)*(xh+xo+f)) (hstrip : f+h1+j+l+s ≤ ρ) (hlow : wl ≤ w) (hR : R ≤ t+u+y+d+h0+h1+j+l+r+s) (hneg : (1+K+h+k+z)*(4+3*K+2*(h+k)+z+2*b+w+v+xh+xo+f) - 4*(1+K+h+k+z+b+w+v+xh+xo+f+R) + ρ < 0) : 3*(k+z) + 3 ≤ K + 1 ∧ (1 ≤ k + z → 9*(K+1)*((K+1)-1) + (4*(K+1)+16)*b ≤ ((K+1)+16)*(2*b+w+v+xh-3*h) ∧ 6*((K+1)+2)*b - (K+1)*((K+1)-1)*((K+1)-8) ≤ 12*(2*b+w+v+xh-3*h)) := by have p1 : 0 ≤ k*v := mul_nonneg hk hv have p2 : 0 ≤ h*(w-wl+v) := mul_nonneg hh (by linarith) have p3 : 0 ≤ z*(1+z+2*b+v+xh+xo+f) := mul_nonneg hz (by linarith) have hH1 : 3*(k+z) + 3 ≤ K + 1 := by by_contra hc have hc' : 0 ≤ 3*(k+z) - K + 1 := by linarith have p4 : 0 ≤ (3*(k+z) - K + 1)*w := mul_nonneg hc' hw linarith refine ⟨hH1, fun hkz => ?_⟩ have hK5 : 5 ≤ K := by linarith have p5 : 0 ≤ (h+k)*(w-wl+v) := mul_nonneg (by linarith) (by linarith) have p6 : 0 ≤ z*(1+z+2*b+w+v+xh+xo+f) := mul_nonneg hz (by linarith) have p7 : 0 ≤ (12*(K+1)-63)*h := mul_nonneg (by linarith) hh have p8 : 0 ≤ ((K+1)+1)*xh := mul_nonneg (by linarith) hxh have p9 : 0 ≤ ((K+1)+10)*v := mul_nonneg (by linarith) hv have p10 : 0 ≤ (12*(K+1)-48)*h := mul_nonneg (by linarith) hh have p11 : 0 ≤ ((K+1)+10)*((K+1)*((K+1)-1) - 2*(b+w)) := mul_nonneg (by linarith) (by linarith) constructor · linarith · linarith -- ===== M5I.lean ===== /-! M5 Part 0 and Part I: `W₀`, Wilf from the core-type inequality, and the generalized core `T° = ⟨A⟩ ∪ [c, ∞)`, `A = P(S) ∩ [m, 2m)`, as a genuine `NumericalSemigroup` (A6 §1, R1 G1, R4 LG4). -/ /-- `W₀ = nℓ − 4d + ρ` (A6 §1). -/ noncomputable def cr_W0 (S : NumericalSemigroup) : ℤ := (w23_n S : ℤ) * (S.leftCount : ℤ) - 4 * ((w23_D S).card : ℤ) + (w23_rho S : ℤ) /-- Wilf from `W₀ ≥ 0`. -/ theorem cr_wilf_of_W0_nonneg (S : NumericalSemigroup) (hq : w23_q S = 4) (h : 0 ≤ cr_W0 S) : S.SatisfiesWilf := by apply w23_wilf_of_W0 rw [hq] unfold cr_W0 at h have : ((4 * (w23_D S).card : ℕ) : ℤ) ≤ ((w23_n S * S.leftCount + w23_rho S : ℕ) : ℤ) := by push_cast linarith exact_mod_cast this /-- Wilf from the core-type inequality `13 W₀ + 23 p ≥ 0` (A6 Corollary B end game; `ℓ ≥ 6`). -/ theorem cr_wilf_of_F (S : NumericalSemigroup) (hq : w23_q S = 4) (hl : 6 ≤ S.leftCount) (hF : 0 ≤ 13 * cr_W0 S + 23 * (w23_pq S : ℤ)) : S.SatisfiesWilf := by unfold NumericalSemigroup.SatisfiesWilf have he := w23_e_eq S have hm := w23_m_eq S have hc := w23_q_mul_sub S rw [hq] at hc unfold cr_W0 at hF have hl' : (6:ℤ) ≤ S.leftCount := by exact_mod_cast hl have hp : (0:ℤ) ≤ w23_pq S := by positivity have hpl : (6:ℤ) * w23_pq S ≤ (w23_pq S : ℤ) * S.leftCount := by nlinarith have hcz : (4:ℤ) * S.multiplicity = S.conductor + w23_rho S := by exact_mod_cast hc have hez : (S.embeddingDimension : ℤ) = w23_n S + w23_pq S := by exact_mod_cast he have hmz : (S.multiplicity : ℤ) = w23_pq S + (w23_D S).card := by exact_mod_cast hm have key : (S.conductor : ℤ) ≤ (S.embeddingDimension : ℤ) * S.leftCount := by rw [hez] nlinarith exact_mod_cast key lemma cr_multiplicity_ge_two (S : NumericalSemigroup) : 2 ≤ S.multiplicity := by by_contra h have h1 : S.multiplicity = 1 := by have := S.multiplicity_pos; omega apply S.proper ext n simp only [AddSubmonoid.mem_top, iff_true] have h1m : (1:ℕ) ∈ S.carrier := h1 ▸ S.multiplicity_mem have := S.carrier.nsmul_mem h1m n simpa using this /-- `A = P(S) ∩ [m, 2m)` (left primitives below `2m`). -/ noncomputable def cr_A (S : NumericalSemigroup) : Finset ℕ := by classical exact (w23_low_A S).filter (fun a => a < 2 * S.multiplicity) lemma cr_mem_A (S : NumericalSemigroup) (a : ℕ) : a ∈ cr_A S ↔ S.IsPrimitive a ∧ a < S.conductor ∧ a < 2 * S.multiplicity := by classical unfold cr_A rw [Finset.mem_filter, w23_low_mem_A] tauto lemma cr_A_carrier (S : NumericalSemigroup) {a : ℕ} (ha : a ∈ cr_A S) : a ∈ S.carrier := ((cr_mem_A S a).1 ha).1.1 lemma cr_A_ge (S : NumericalSemigroup) {a : ℕ} (ha : a ∈ cr_A S) : S.multiplicity ≤ a := by obtain ⟨hp, _, _⟩ := (cr_mem_A S a).1 ha exact S.multiplicity_le hp.2.1 hp.1 lemma cr_nsmul_carrier (S : NumericalSemigroup) (d x : ℕ) (hx : x ∈ d • cr_A S) : x ∈ S.carrier := ns_nsmul_mem_carrier S (cr_A S) (fun a ha => cr_A_carrier S ha) d x hx lemma cr_nsmul_lower (S : NumericalSemigroup) (d x : ℕ) (hx : x ∈ d • cr_A S) : d * S.multiplicity ≤ x := lh_nsmul_lower (cr_A S) S.multiplicity (fun a ha => cr_A_ge S ha) d x hx /-- An `S`-primitive element of `d • A` lies in `A`. -/ lemma cr_primitive_nsmul (S : NumericalSemigroup) {d x : ℕ} (hx : x ∈ d • cr_A S) (hp : S.IsPrimitive x) : x ∈ cr_A S := by rcases d with _ | d · have : x = 0 := by simpa using hx exact absurd this (by have := hp.2.1; omega) rcases d with _ | d · simpa using hx · rw [succ_nsmul] at hx obtain ⟨y, hy, a, ha, rfl⟩ := Finset.mem_add.1 hx have hyS := cr_nsmul_carrier S _ y hy have hy0 := cr_nsmul_lower S _ y hy have ha0 := cr_A_ge S ha have hm := S.multiplicity_pos rcases hp.2.2 y a hyS (cr_A_carrier S ha) rfl with h | h · have : (d + 1) * S.multiplicity ≥ S.multiplicity := Nat.le_mul_of_pos_left _ (by omega) omega · omega /-- The carrier of the generalized core `T°`. -/ noncomputable def cr_carrier (S : NumericalSemigroup) : AddSubmonoid ℕ where carrier := {n | (∃ d : ℕ, n ∈ d • cr_A S) ∨ S.conductor ≤ n} zero_mem' := Or.inl ⟨0, by simp⟩ add_mem' := by rintro x y (⟨d, hd⟩ | hx) (⟨e, he⟩ | hy) · exact Or.inl ⟨d + e, by rw [add_nsmul]; exact Finset.add_mem_add hd he⟩ · exact Or.inr (by omega) · exact Or.inr (by omega) · exact Or.inr (by omega) lemma cr_mem_carrier (S : NumericalSemigroup) (n : ℕ) : n ∈ cr_carrier S ↔ (∃ d : ℕ, n ∈ d • cr_A S) ∨ S.conductor ≤ n := Iff.rfl lemma cr_one_not_mem (S : NumericalSemigroup) : (1 : ℕ) ∉ cr_carrier S := by rw [cr_mem_carrier] have hm2 := cr_multiplicity_ge_two S have hmc := w22_multiplicity_le_conductor S rintro (⟨d, hd⟩ | h) · have hlo := cr_nsmul_lower S d 1 hd rcases d with _ | d · simp at hd · have : (d + 1) * S.multiplicity ≥ S.multiplicity := Nat.le_mul_of_pos_left _ (by omega) omega · omega /-- The generalized core `T° = ⟨A⟩ ∪ [c, ∞)` as a numerical semigroup. -/ noncomputable def cr_core (S : NumericalSemigroup) : NumericalSemigroup where carrier := cr_carrier S finite_gaps := by apply (Finset.range S.conductor).finite_toSet.subset intro n hn simp only [Finset.coe_range, Set.mem_Iio] by_contra h exact hn (Or.inr (by omega)) proper := by intro h apply cr_one_not_mem S rw [h] exact AddSubmonoid.mem_top 1 lemma cr_mem_core (S : NumericalSemigroup) (n : ℕ) : n ∈ (cr_core S).carrier ↔ (∃ d : ℕ, n ∈ d • cr_A S) ∨ S.conductor ≤ n := Iff.rfl lemma cr_core_le (S : NumericalSemigroup) {n : ℕ} (h : n ∈ (cr_core S).carrier) : n ∈ S.carrier := by rcases (cr_mem_core S n).1 h with ⟨d, hd⟩ | hc · exact cr_nsmul_carrier S d n hd · exact S.conductor_spec n hc lemma cr_A_mem_core (S : NumericalSemigroup) {a : ℕ} (ha : a ∈ cr_A S) : a ∈ (cr_core S).carrier := (cr_mem_core S a).2 (Or.inl ⟨1, by simpa using ha⟩) lemma cr_nsmul_mem_core (S : NumericalSemigroup) {d x : ℕ} (hx : x ∈ d • cr_A S) : x ∈ (cr_core S).carrier := (cr_mem_core S x).2 (Or.inl ⟨d, hx⟩) lemma cr_core_conductor (S : NumericalSemigroup) : (cr_core S).conductor = S.conductor := by apply Nat.le_antisymm · exact (cr_core S).conductor_le (fun n hn => (cr_mem_core S n).2 (Or.inr hn)) · by_contra h have hc := S.conductor_pos have hmem : S.conductor - 1 ∈ (cr_core S).carrier := (cr_core S).conductor_spec _ (by omega) exact w22_frobenius_not_mem S (cr_core_le S hmem) lemma cr_multiplicity_mem_A (S : NumericalSemigroup) (h : S.multiplicity < S.conductor) : S.multiplicity ∈ cr_A S := by rw [cr_mem_A] have := S.multiplicity_pos exact ⟨S.multiplicity_isPrimitive, h, by omega⟩ lemma cr_core_multiplicity (S : NumericalSemigroup) (h : S.multiplicity < S.conductor) : (cr_core S).multiplicity = S.multiplicity := by apply Nat.le_antisymm · exact (cr_core S).multiplicity_le S.multiplicity_pos (cr_A_mem_core S (cr_multiplicity_mem_A S h)) · exact S.multiplicity_le (cr_core S).multiplicity_pos (cr_core_le S (cr_core S).multiplicity_mem) lemma cr_core_q (S : NumericalSemigroup) (h : S.multiplicity < S.conductor) : w23_q (cr_core S) = w23_q S := by unfold w23_q rw [cr_core_conductor, cr_core_multiplicity S h] lemma cr_core_rho (S : NumericalSemigroup) (h : S.multiplicity < S.conductor) : w23_rho (cr_core S) = w23_rho S := by unfold w23_rho rw [cr_core_q S h, cr_core_conductor, cr_core_multiplicity S h] lemma cr_core_level (S : NumericalSemigroup) (h : S.multiplicity < S.conductor) (x : ℕ) : w23_level (cr_core S) x = w23_level S x := by unfold w23_level rw [cr_core_rho S h, cr_core_multiplicity S h] /-- `T°`-primitive elements below `c` are exactly `A` (L1 I.9). -/ lemma cr_core_primitive_iff (S : NumericalSemigroup) {a : ℕ} (ha : a < S.conductor) : (cr_core S).IsPrimitive a ↔ a ∈ cr_A S := by constructor · rintro ⟨hmem, hpos, hind⟩ rcases (cr_mem_core S a).1 hmem with ⟨d, hd⟩ | hc · rcases d with _ | d · have : a = 0 := by simpa using hd omega rcases d with _ | d · simpa using hd · rw [succ_nsmul] at hd obtain ⟨y, hy, b, hb, rfl⟩ := Finset.mem_add.1 hd have hy0 := cr_nsmul_lower S _ y hy have hb0 := cr_A_ge S hb have hm := S.multiplicity_pos rcases hind y b (cr_nsmul_mem_core S hy) (cr_A_mem_core S hb) rfl with h | h · have : (d + 1) * S.multiplicity ≥ S.multiplicity := Nat.le_mul_of_pos_left _ (by omega) omega · omega · omega · intro hA obtain ⟨hp, _, _⟩ := (cr_mem_A S a).1 hA refine ⟨cr_A_mem_core S hA, hp.2.1, ?_⟩ intro x y hx hy he exact hp.2.2 x y (cr_core_le S hx) (cr_core_le S hy) he /-- `S`-primitive elements `≥ 2m` are not in `T°` (below `c`). -/ lemma cr_primitive_not_mem_core (S : NumericalSemigroup) {x : ℕ} (hp : S.IsPrimitive x) (hlt : x < S.conductor) (hge : 2 * S.multiplicity ≤ x) : x ∉ (cr_core S).carrier := by intro hx rcases (cr_mem_core S x).1 hx with ⟨d, hd⟩ | hc · have := cr_primitive_nsmul S hd hp have := ((cr_mem_A S x).1 this).2.2 omega · omega /-- generalized core: every left primitive lies below `2m` (R4 §5). -/ def cr_IsGenCore (T : NumericalSemigroup) : Prop := ∀ a, T.IsPrimitive a → a < T.conductor → a < 2 * T.multiplicity lemma cr_core_isGenCore (S : NumericalSemigroup) (h : S.multiplicity < S.conductor) : cr_IsGenCore (cr_core S) := by intro a hp hlt rw [cr_core_conductor] at hlt rw [cr_core_multiplicity S h] exact ((cr_mem_A S a).1 ((cr_core_primitive_iff S hlt).1 hp)).2.2 lemma cr_core_n (S : NumericalSemigroup) : w23_n (cr_core S) = (cr_A S).card := by classical unfold w23_n congr 1 ext a rw [Finset.mem_filter, NumericalSemigroup.mem_primitiveElements, cr_core_conductor] constructor · rintro ⟨hp, hlt⟩ exact (cr_core_primitive_iff S hlt).1 hp · intro hA have hlt := ((cr_mem_A S a).1 hA).2.1 exact ⟨(cr_core_primitive_iff S hlt).2 hA, hlt⟩ lemma cr_core_X1 (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) : w23_X (cr_core S) 1 = w23_X S 1 := by classical have hmc : S.multiplicity < S.conductor := by omega have hq := w23_q_eq_four S h1 h2 rw [w23_X_one, w23_X_one, cr_core_multiplicity S hmc] ext x simp only [Finset.mem_erase, Finset.mem_filter, NumericalSemigroup.mem_primitiveElements, cr_core_level S hmc] constructor · rintro ⟨hne, hp, hl⟩ have hlt : x < S.conductor := (w23_lt_conductor_iff S x).2 (by omega) have hA := (cr_core_primitive_iff S hlt).1 hp exact ⟨hne, ((cr_mem_A S x).1 hA).1, hl⟩ · rintro ⟨hne, hp, hl⟩ have hlt : x < S.conductor := (w23_lt_conductor_iff S x).2 (by omega) have hb := ((w23_level_eq_iff S x 1).1 hl).2 have hA : x ∈ cr_A S := (cr_mem_A S x).2 ⟨hp, hlt, by omega⟩ exact ⟨hne, (cr_core_primitive_iff S hlt).2 hA, hl⟩ lemma cr_core_D_subset (S : NumericalSemigroup) (h : S.multiplicity < S.conductor) : w23_D (cr_core S) ⊆ w23_D S := by classical intro y hy unfold w23_D at hy ⊢ rw [cr_core_conductor, cr_core_multiplicity S h] at hy obtain ⟨hyI, hn⟩ := Finset.mem_filter.1 hy refine Finset.mem_filter.2 ⟨hyI, fun hp => hn ?_⟩ have hyc := (Finset.mem_Ico.1 hyI).1 refine ⟨(cr_mem_core S y).2 (Or.inr hyc), hp.2.1, ?_⟩ intro a b ha hb he exact hp.2.2 a b (cr_core_le S ha) (cr_core_le S hb) he /-- hypotheses of a generalized core inherited from the Lean residual (L1 §2). -/ def cr_CoreHyp (T : NumericalSemigroup) : Prop := 3 * T.multiplicity < T.conductor ∧ T.conductor ≤ 4 * T.multiplicity ∧ cr_IsGenCore T ∧ 1 < ((w23_X T 1).filter (fun a => 3*a < T.conductor+T.multiplicity)).card ∧ 4 ≤ (w23_X T 1).card ∧ 3 * ((w23_X T 1).filter (fun a => 2 * a + w23_rho T < 3 * T.multiplicity)).card * (((w23_X T 1).filter (fun a => 2 * a + w23_rho T < 3 * T.multiplicity)).card + 1) < (w23_X T 1).card * ((w23_X T 1).card - 1) ∧ 3 ≤ ((w23_X T 1).filter (fun a => 3 * T.multiplicity ≤ 2 * a + w23_rho T)).card lemma cr_core_inherits (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (hsmall : 1 < ((w23_X S 1).filter (fun a => 3*a < S.conductor+S.multiplicity)).card) (hK4 : 4 ≤ (w23_X S 1).card) (hpop : 3 * ((w23_X S 1).filter (fun a => 2 * a + w23_rho S < 3 * S.multiplicity)).card * (((w23_X S 1).filter (fun a => 2 * a + w23_rho S < 3 * S.multiplicity)).card + 1) < (w23_X S 1).card * ((w23_X S 1).card - 1)) (hh3 : 3 ≤ ((w23_X S 1).filter (fun a => 3 * S.multiplicity ≤ 2 * a + w23_rho S)).card) : cr_CoreHyp (cr_core S) := by have hmc : S.multiplicity < S.conductor := by omega unfold cr_CoreHyp rw [cr_core_X1 S h1 h2, cr_core_conductor, cr_core_multiplicity S hmc, cr_core_rho S hmc] refine ⟨h1, h2, ?_, hsmall, hK4, hpop, hh3⟩ intro a hp hlt rw [cr_core_conductor] at hlt rw [cr_core_multiplicity S hmc] exact ((cr_mem_A S a).1 ((cr_core_primitive_iff S hlt).1 hp)).2.2 -- ===== M5II.lean ===== /-! M5 Part 0.6 + Part II: strip/ordinary split of the level-2 primitives, the refined mixed shadow, the BC split (R4 LG1, LG2) and Part III: `ℓ(T°)` lower bound and `b₀ ≤ a₀ + b` (A6 Lemma 2.2). -/ /-- strip generators `A_h = P(S) ∩ [2m − ρ, 2m)` -/ noncomputable def cr_strip (S : NumericalSemigroup) : Finset ℕ := by classical exact (w23_P S 2).filter (fun a => a < 2 * S.multiplicity) /-- ordinary level-2 primitives `C = P(S) ∩ [2m, 3m − ρ)` -/ noncomputable def cr_ord (S : NumericalSemigroup) : Finset ℕ := by classical exact (w23_P S 2).filter (fun a => ¬ a < 2 * S.multiplicity) lemma cr_mem_strip (S : NumericalSemigroup) (a : ℕ) : a ∈ cr_strip S ↔ S.IsPrimitive a ∧ w23_level S a = 2 ∧ a < 2 * S.multiplicity := by classical unfold cr_strip rw [Finset.mem_filter, w23_mem_P] tauto lemma cr_mem_ord (S : NumericalSemigroup) (a : ℕ) : a ∈ cr_ord S ↔ S.IsPrimitive a ∧ w23_level S a = 2 ∧ 2 * S.multiplicity ≤ a := by classical unfold cr_ord rw [Finset.mem_filter, w23_mem_P] constructor · rintro ⟨⟨hp, hl⟩, h⟩ exact ⟨hp, hl, by omega⟩ · rintro ⟨hp, hl, h⟩ exact ⟨⟨hp, hl⟩, by omega⟩ lemma cr_P2_card (S : NumericalSemigroup) : (w23_P S 2).card = (cr_strip S).card + (cr_ord S).card := by classical unfold cr_strip cr_ord exact (Finset.card_filter_add_card_filter_not (s := w23_P S 2) _).symm lemma cr_strip_ord_subset (S : NumericalSemigroup) : cr_strip S ⊆ w23_P S 2 ∧ cr_ord S ⊆ w23_P S 2 := by classical exact ⟨Finset.filter_subset _ _, Finset.filter_subset _ _⟩ lemma cr_ord_bounds (S : NumericalSemigroup) {c : ℕ} (hc : c ∈ cr_ord S) : 2 * S.multiplicity ≤ c ∧ c + w23_rho S < 3 * S.multiplicity := by obtain ⟨_, hl, h2⟩ := (cr_mem_ord S c).1 hc have := ((w23_level_eq_iff S c 2).1 hl).2 constructor <;> omega lemma cr_strip_bounds (S : NumericalSemigroup) {g : ℕ} (hg : g ∈ cr_strip S) : 2 * S.multiplicity ≤ g + w23_rho S ∧ g < 2 * S.multiplicity := by obtain ⟨_, hl, h2⟩ := (cr_mem_strip S g).1 hg have := ((w23_level_eq_iff S g 2).1 hl).1 constructor <;> omega lemma cr_P1_bounds (S : NumericalSemigroup) {a : ℕ} (ha : a ∈ w23_P S 1) : S.multiplicity ≤ a ∧ a + w23_rho S < 2 * S.multiplicity := by obtain ⟨hp, hl⟩ := (w23_mem_P S 1 a).1 ha have := ((w23_level_eq_iff S a 1).1 hl).2 exact ⟨S.multiplicity_le hp.2.1 hp.1, by omega⟩ lemma cr_A_eq (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) : cr_A S = w23_P S 1 ∪ cr_strip S := by classical have hq := w23_q_eq_four S h1 h2 ext a rw [Finset.mem_union, cr_mem_A, cr_mem_strip, w23_mem_P] constructor · rintro ⟨hp, hlt, h2m⟩ have hge := S.multiplicity_le hp.2.1 hp.1 have hr := w23_rho_lt S have hlev1 := w23_primitive_level_pos S hp have hlev2 : w23_level S a ≤ 2 := by by_contra hc have := ((w23_level_eq_iff S a (w23_level S a)).1 rfl).1 have hm := Nat.mul_le_mul_right S.multiplicity (show 3 ≤ w23_level S a by omega) omega rcases (show w23_level S a = 1 ∨ w23_level S a = 2 by omega) with h | h · exact Or.inl ⟨hp, h⟩ · exact Or.inr ⟨hp, h, h2m⟩ · rintro (⟨hp, hl⟩ | ⟨hp, hl, h2m⟩) · have hlt : a < S.conductor := (w23_lt_conductor_iff S a).2 (by omega) have := ((w23_level_eq_iff S a 1).1 hl).2 exact ⟨hp, hlt, by omega⟩ · exact ⟨hp, (w23_lt_conductor_iff S a).2 (by omega), h2m⟩ lemma cr_A_card (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) : (cr_A S).card = (w23_X S 1).card + 1 + (cr_strip S).card := by classical rw [cr_A_eq S h1 h2, Finset.card_union_of_disjoint] · have := w23_alpha_one S change (w23_X S 1).card + 1 = (w23_P S 1).card at this omega · apply Finset.disjoint_left.2 intro a ha hb have := ((w23_mem_P S 1 a).1 ha).2 have := ((cr_mem_strip S a).1 hb).2.1 omega lemma cr_P1_subset_A (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) : w23_P S 1 ⊆ cr_A S := by rw [cr_A_eq S h1 h2]; exact Finset.subset_union_left lemma cr_strip_subset_A (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) : cr_strip S ⊆ cr_A S := by rw [cr_A_eq S h1 h2]; exact Finset.subset_union_right lemma cr_X1_subset_A (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) : w23_X S 1 ⊆ cr_A S := by classical intro a ha apply cr_P1_subset_A S h1 h2 rw [w23_X_one] at ha obtain ⟨_, ha⟩ := Finset.mem_erase.1 ha obtain ⟨hp, hl⟩ := Finset.mem_filter.1 ha exact (w23_mem_P S 1 a).2 ⟨(S.mem_primitiveElements a).1 hp, hl⟩ /-- small positive elements are in `A` (L1 0.7). -/ lemma cr_small_mem_A (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) {x : ℕ} (hx : x ∈ S.carrier) (h0 : 0 < x) (hlt : x < 2 * S.multiplicity) : x ∈ cr_A S := (cr_mem_A S x).2 ⟨w23_primitive_of_lt_two_mul S hx h0 hlt, by omega, hlt⟩ lemma cr_low_mem_P1 (S : NumericalSemigroup) {x : ℕ} (hx : x ∈ S.carrier) (h0 : 0 < x) (hlt : x + w23_rho S < 2 * S.multiplicity) : x ∈ w23_P S 1 := by refine (w23_mem_P S 1 x).2 ⟨w23_primitive_of_lt_two_mul S hx h0 (by omega), ?_⟩ apply (w23_level_eq_iff S x 1).2 have := S.multiplicity_le h0 hx constructor <;> omega /-! ### Index split of the level-2 generators -/ noncomputable def cr_stripIdx (S : NumericalSemigroup) : Finset (Fin (gm_A S).card) := by classical exact (gm_indices S 2).filter (fun i => m3_enum (gm_A S) i < 2 * S.multiplicity) noncomputable def cr_ordIdx (S : NumericalSemigroup) : Finset (Fin (gm_A S).card) := by classical exact (gm_indices S 2).filter (fun i => ¬ m3_enum (gm_A S) i < 2 * S.multiplicity) lemma cr_stripIdx_card (S : NumericalSemigroup) (hq : w23_q S = 4) : (cr_stripIdx S).card = (cr_strip S).card := by classical apply Finset.card_bij (fun i _ => m3_enum (gm_A S) i) · intro i hi obtain ⟨hi2, hlt⟩ := Finset.mem_filter.1 hi have hlev : w23_level S (m3_enum (gm_A S) i) = 2 := by simpa [gm_indices] using hi2 have hp := ((w23_gm_mem_A S _).1 (m3_enum_mem (gm_A S) i)).1 exact (cr_mem_strip S _).2 ⟨hp, hlev, hlt⟩ · intro i hi k hk he exact gm_enum_injective _ he · intro a ha obtain ⟨hp, hl, hlt2⟩ := (cr_mem_strip S a).1 ha have hlt : a < S.conductor := (w23_lt_conductor_iff S a).2 (by omega) have hne : a ≠ S.multiplicity := by intro he rw [he, w23_level_multiplicity] at hl omega obtain ⟨i, hi⟩ := m3_enum_surjective (gm_A S) a ((w23_gm_mem_A S a).2 ⟨hp, hlt, hne⟩) refine ⟨i, Finset.mem_filter.2 ⟨by simp [gm_indices, hi, hl], by rw [hi]; exact hlt2⟩, hi⟩ lemma cr_ordIdx_card (S : NumericalSemigroup) (hq : w23_q S = 4) : (cr_ordIdx S).card = (cr_ord S).card := by classical apply Finset.card_bij (fun i _ => m3_enum (gm_A S) i) · intro i hi obtain ⟨hi2, hlt⟩ := Finset.mem_filter.1 hi have hlev : w23_level S (m3_enum (gm_A S) i) = 2 := by simpa [gm_indices] using hi2 have hp := ((w23_gm_mem_A S _).1 (m3_enum_mem (gm_A S) i)).1 exact (cr_mem_ord S _).2 ⟨hp, hlev, by omega⟩ · intro i hi k hk he exact gm_enum_injective _ he · intro a ha obtain ⟨hp, hl, hge⟩ := (cr_mem_ord S a).1 ha have hlt : a < S.conductor := (w23_lt_conductor_iff S a).2 (by omega) have hne : a ≠ S.multiplicity := by intro he rw [he, w23_level_multiplicity] at hl omega obtain ⟨i, hi⟩ := m3_enum_surjective (gm_A S) a ((w23_gm_mem_A S a).2 ⟨hp, hlt, hne⟩) refine ⟨i, Finset.mem_filter.2 ⟨by simp [gm_indices, hi, hl], by rw [hi]; omega⟩, hi⟩ /-- Generic mixed parent shadow with a per-coordinate parent family on `I` (R2 F9 / R4 LG2). -/ theorem cr_mixed_shadow_gen {N : ℕ} (I J : Finset (Fin N)) (hIJ : I ⊆ J) (U0 : Finset (Fin N → ℕ)) (V : Fin N → Finset (Fin N → ℕ)) (U1 H : Finset (Fin N → ℕ)) (hVU : ∀ i ∈ I, V i ⊆ U0) (hd : Disjoint U0 U1) (hU0 : ∀ u ∈ U0, (∑ i ∈ I, u i) = 0) (hU1 : ∀ u ∈ U1, (∑ i ∈ J, u i) = 2) (hH : ∀ q ∈ H, (∑ i ∈ J, q i) = 3 ∧ 0 < ∑ i ∈ I, q i) (hdiv : ∀ q ∈ H, ∀ i, i ∈ J → 0 < q i → Function.update q i (q i - 1) ∈ U0 ∪ U1) (hdivI : ∀ q ∈ H, ∀ i, i ∈ I → 0 < q i → Function.update q i (q i - 1) ∈ V i ∪ U1) : 3*H.card ≤ (∑ i ∈ I, (V i).card) + (J.card+2)*U1.card := by classical have hzero : ∀ i ∈ I, ∀ u ∈ U0, u i = 0 := by intro i hi u hu have h := hU0 u hu have := Finset.single_le_sum (f := fun j => u j) (fun j _ => Nat.zero_le _) hi omega have hcoord : ∀ i : Fin N, i ∈ J → (∑ q ∈ H, q i) ≤ (∑ u ∈ U1, (u i+1)) + if i ∈ I then (V i).card else 0 := by intro i hiJ let T := H.filter (fun q => 0 < q i) let Ui := if i ∈ I then V i ∪ U1 else U1 have hfilter : (∑ q ∈ H, q i) = ∑ q ∈ T, q i := by symm apply Finset.sum_subset (Finset.filter_subset _ _) intro q hq hqt have : ¬ 0 < q i := by intro hqi exact hqt (Finset.mem_filter.mpr ⟨hq,hqi⟩) omega have hparent : ∀ q ∈ T, Function.update q i (q i-1) ∈ Ui := by intro q hq obtain ⟨hqH,hqi⟩ := Finset.mem_filter.mp hq by_cases hi : i ∈ I · simpa [Ui,hi] using hdivI q hqH i hi hqi · have hm := hdiv q hqH i hiJ hqi have hp1 : Function.update q i (q i-1) ∈ U1 := by rcases Finset.mem_union.mp hm with hp0 | hp1 · have hz := hU0 _ hp0 have he : (∑ j ∈ I, Function.update q i (q i-1) j) = ∑ j ∈ I, q j := by apply Finset.sum_congr rfl intro j hj have hji : j ≠ i := by intro hji subst j exact hi hj simp [Function.update,hji] rw [he] at hz have hpos := (hH q hqH).2 omega · exact hp1 simpa [Ui,hi] using hp1 have hc : (∑ q ∈ H, q i) ≤ ∑ u ∈ Ui, (u i+1) := by rw [hfilter] apply Finset.sum_le_sum_of_injOn (fun q => Function.update q i (q i-1)) · intro x hx y hy hxy exact n4_parent_injective i (Finset.mem_filter.mp hx).2 (Finset.mem_filter.mp hy).2 hxy · intro u hu obtain ⟨q,hq,rfl⟩ := Finset.mem_image.mp hu exact hparent q hq · intro q hq have hp := (Finset.mem_filter.mp hq).2 simp omega · intro u hu hnot exact Nat.zero_le _ by_cases hi : i ∈ I · have hdV : Disjoint (V i) U1 := Finset.disjoint_of_subset_left (hVU i hi) hd have hV : (∑ u ∈ V i, (u i+1)) = (V i).card := by rw [Finset.card_eq_sum_ones] apply Finset.sum_congr rfl intro u hu rw [hzero i hi u (hVU i hi hu)] have hc' : (∑ q ∈ H, q i) ≤ ∑ u ∈ V i ∪ U1, (u i+1) := by simpa [Ui,hi] using hc rw [Finset.sum_union hdV, hV] at hc' simp only [hi, if_true] omega · simpa [Ui,hi] using hc have hsum : (∑ q ∈ H, ∑ i ∈ J, q i) ≤ ∑ i ∈ J, ((∑ u ∈ U1, (u i+1)) + if i ∈ I then (V i).card else 0) := by rw [Finset.sum_comm] exact Finset.sum_le_sum (fun i hi => hcoord i hi) have hleft : (∑ q ∈ H, ∑ i ∈ J, q i) = 3*H.card := by rw [Finset.sum_congr rfl (fun q hq => (hH q hq).1)] simp [Nat.mul_comm] have hright1 : (∑ i ∈ J, ∑ u ∈ U1, (u i+1)) = (J.card+2)*U1.card := by rw [Finset.sum_comm] have he : ∀ u ∈ U1, (∑ i ∈ J, (u i+1)) = J.card+2 := by intro u hu rw [Finset.sum_add_distrib,hU1 u hu] simp [Nat.add_comm] rw [Finset.sum_congr rfl he] simp [Nat.mul_comm] have hright0 : (∑ i ∈ J, if i ∈ I then (V i).card else 0) = ∑ i ∈ I, (V i).card := by calc _ = ∑ i ∈ I, (if i ∈ I then (V i).card else 0) := by symm apply Finset.sum_subset hIJ intro i hi hnot simp [hnot] _ = _ := Finset.sum_congr rfl (fun i hi => by simp [hi]) rw [hleft,Finset.sum_add_distrib,hright1,hright0] at hsum omega /-- The refined mixed shadow (A6 Lemma 2.3: `qshadow′ ≥ 0`). -/ lemma cr_gm_mixed_card_split (S : NumericalSemigroup) (hq : w23_q S = 4) : 3*((gm_h0 S).card+(gm_h1 S).card+(gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card) ≤ (cr_ordIdx S).card*(gm_type S 2 2 0 0).card + (cr_stripIdx S).card*((gm_type S 2 2 0 0).card+(gm_wlow S).card) + ((w23_X S 1).card+(w23_P S 2).card+2)* ((gm_type S 3 1 1 0).card+(gm_type S 3 0 2 0).card) := by classical let I := gm_indices S 2 let J := gm_indices S 1 ∪ gm_indices S 2 let U0 := gm_type S 2 2 0 0 ∪ gm_wlow S let U1 := gm_type S 3 1 1 0 ∪ gm_type S 3 0 2 0 let rep := gm_rep (gm_A S) let E0 := U0.image rep let Eb := (gm_type S 2 2 0 0).image rep let E1 := U1.image rep let F := (gm_H S).image rep let V : Fin (gm_A S).card → Finset (Fin (gm_A S).card → ℕ) := fun i => if m3_enum (gm_A S) i < 2 * S.multiplicity then E0 else Eb have hJ (alpha : Fin (gm_A S).card → ℕ) : (∑ i ∈ J, alpha i)=gm_group S 1 alpha+gm_group S 2 alpha := Finset.sum_union (gm_indices_disjoint S 1 2 (by omega)) have hU0 : U0 ⊆ gm_values S := by intro x hx rcases Finset.mem_union.1 hx with hb | hw · exact w23_gm_type_values S 2 2 0 0 hb · exact w23_gm_type_values S 3 2 0 0 (Finset.mem_filter.1 hw).1 have hU1 : U1 ⊆ gm_values S := Finset.union_subset (w23_gm_type_values S 3 1 1 0) (w23_gm_type_values S 3 0 2 0) have hH : gm_H S ⊆ gm_values S := fun x hx => (w23_gm_H_data S hq hx).1 have hd0 : ∀ x ∈ U0, (∑ i ∈ I, gm_rep (gm_A S) x i)=0 := by intro x hx rcases Finset.mem_union.1 hx with hb | hw · exact (Finset.mem_filter.1 hb).2.2.2.1 · exact (Finset.mem_filter.1 (Finset.mem_filter.1 hw).1).2.2.2.1 have hd1 : ∀ x ∈ U1, (∑ i ∈ J, gm_rep (gm_A S) x i)=2 := by intro x hx rw [hJ] rcases Finset.mem_union.1 hx with hx | hx <;> obtain ⟨_,_,hb,hc,_⟩ := Finset.mem_filter.1 hx <;> omega have hdis : Disjoint U0 U1 := by apply Finset.disjoint_left.2 intro x hx hy have hz := hd0 x hx change gm_group S 2 (gm_rep (gm_A S) x)=0 at hz rcases Finset.mem_union.1 hy with hy | hy <;> have hp := (Finset.mem_filter.1 hy).2.2.2.1 <;> omega have hrepval : ∀ x ∈ gm_values S, m3_value (m3_enum (gm_A S)) (rep x) = x := fun x hx => (gm_rep_spec (gm_A S) x (w23_gm_values_repr S hq hx)).2 have hEdis : Disjoint E0 E1 := by apply Finset.disjoint_left.2 intro alpha ha hb obtain ⟨x,hx,he⟩ := Finset.mem_image.1 ha obtain ⟨y,hy,he'⟩ := Finset.mem_image.1 hb have hxv := hrepval x (hU0 hx) have hyv := hrepval y (hU1 hy) rw [he] at hxv rw [he'] at hyv have hxy : x = y := by omega exact Finset.disjoint_left.1 hdis hx (hxy.symm ▸ hy) have hVU : ∀ i ∈ I, V i ⊆ E0 := by intro i _ by_cases h : m3_enum (gm_A S) i < 2 * S.multiplicity · simp only [V, h, if_true]; exact Finset.Subset.refl _ · simp only [V, h, if_false] exact Finset.image_subset_image Finset.subset_union_left have hE0 : ∀ u ∈ E0, (∑ i ∈ I, u i) = 0 := by intro u hu obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 hu exact hd0 x hx have hE1 : ∀ u ∈ E1, (∑ i ∈ J, u i) = 2 := by intro u hu obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 hu exact hd1 x hx have hF : ∀ q ∈ F, (∑ i ∈ J, q i) = 3 ∧ 0 < ∑ i ∈ I, q i := by intro q hqF obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 hqF rw [hJ] obtain ⟨_,_,hdeg,hpos,_⟩ := w23_gm_H_data S hq hx exact ⟨hdeg,hpos⟩ have hdiv : ∀ q ∈ F, ∀ i, i ∈ J → 0 < q i → Function.update q i (q i - 1) ∈ E0 ∪ E1 := by intro q hqF i hi hpos obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 hqF have he := (w23_gm_values_parent S hq (hH hx) i hpos).2 change m3_parent (rep x) i = _ at he unfold m3_parent at he rw [he] rcases Finset.mem_union.1 (w23_gm_H_parent S hq hx hi hpos) with hp0 | hp1 · exact Finset.mem_union.2 (Or.inl (Finset.mem_image.2 ⟨_,hp0,rfl⟩)) · exact Finset.mem_union.2 (Or.inr (Finset.mem_image.2 ⟨_,hp1,rfl⟩)) have hdivI : ∀ q ∈ F, ∀ i, i ∈ I → 0 < q i → Function.update q i (q i - 1) ∈ V i ∪ E1 := by intro q hqF i hi hpos have hm := hdiv q hqF i (Finset.mem_union_right _ hi) hpos by_cases hs : m3_enum (gm_A S) i < 2 * S.multiplicity · simpa only [V, hs, if_true] using hm · simp only [V, hs, if_false] obtain ⟨x,hx,rfl⟩ := Finset.mem_image.1 hqF have he := (w23_gm_values_parent S hq (hH hx) i hpos).2 change m3_parent (rep x) i = _ at he unfold m3_parent at he rw [he] rcases Finset.mem_union.1 (w23_gm_H_parent S hq hx (Finset.mem_union_right _ hi) hpos) with hp0 | hp1 · apply Finset.mem_union.2 left apply Finset.mem_image.2 refine ⟨_, ?_, rfl⟩ rcases Finset.mem_union.1 hp0 with hb | hw · exact hb · exfalso -- a parent of level 3 contradicts the value bound for an ordinary generator let y := m3_value (m3_enum (gm_A S)) (m3_parent (gm_rep (gm_A S) x) i) have hy3 := ((w23_mem_X S 3 y).1 (Finset.mem_filter.1 (Finset.mem_filter.1 hw).1).1).2 have hylo := ((w23_level_eq_iff S y 3).1 hy3).1 have hval := m3_value_parent (m3_enum (gm_A S)) (gm_rep (gm_A S) x) i hpos have hxs := hrepval x (hH hx) change y + m3_enum (gm_A S) i = m3_value (m3_enum (gm_A S)) (gm_rep (gm_A S) x) at hval rw [hxs] at hval have hxlt := w23_apery_lt S (Finset.mem_filter.1 (hH hx)).1 have hc := w23_q_mul_sub S rw [hq] at hc omega · exact Finset.mem_union.2 (Or.inr (Finset.mem_image.2 ⟨_,hp1,rfl⟩)) have hh := cr_mixed_shadow_gen I J Finset.subset_union_right E0 V E1 F hVU hEdis hE0 hE1 hF hdiv hdivI have hinj : ∀ X : Finset ℕ, X ⊆ gm_values S → (X.image rep).card = X.card := fun X hX => gm_rep_image_card (gm_A S) X (fun x hx => w23_gm_values_repr S hq (hX hx)) have hsumV : (∑ i ∈ I, (V i).card) = (cr_stripIdx S).card * E0.card + (cr_ordIdx S).card * Eb.card := by have hV : ∀ i, (V i).card = if m3_enum (gm_A S) i < 2 * S.multiplicity then E0.card else Eb.card := by intro i simp only [V] split_ifs <;> rfl rw [Finset.sum_congr rfl (fun i _ => hV i), Finset.sum_ite, Finset.sum_const, Finset.sum_const, smul_eq_mul, smul_eq_mul] rfl have hE0c : E0.card = (gm_type S 2 2 0 0).card + (gm_wlow S).card := by rw [hinj U0 hU0] apply Finset.card_union_of_disjoint apply Finset.disjoint_left.2 intro x hx hy exact Finset.disjoint_left.1 (gm_type_disjoint S 2 2 0 0 3 2 0 0 (by omega)) hx (Finset.mem_filter.1 hy).1 have hEbc : Eb.card = (gm_type S 2 2 0 0).card := hinj _ (w23_gm_type_values S 2 2 0 0) have hE1c : E1.card = (gm_type S 3 1 1 0).card + (gm_type S 3 0 2 0).card := by rw [hinj U1 hU1] exact Finset.card_union_of_disjoint (gm_type_disjoint S 3 1 1 0 3 0 2 0 (by omega)) have hJcard : J.card=(w23_X S 1).card+(w23_P S 2).card := by rw [Finset.card_union_of_disjoint (gm_indices_disjoint S 1 2 (by omega)), w23_gm_indices_card_B S hq,w23_gm_indices_card_P S hq 2 (by omega) (by omega)] have hdisH : Disjoint (gm_type S 4 2 1 0 ∪ gm_type S 4 1 2 0) (gm_type S 4 0 3 0) := by rw [Finset.disjoint_union_left] exact ⟨gm_type_disjoint S 4 2 1 0 4 0 3 0 (by omega),gm_type_disjoint S 4 1 2 0 4 0 3 0 (by omega)⟩ have hFc : F.card=(gm_h0 S).card+(gm_h1 S).card+ (gm_type S 4 1 2 0).card+(gm_type S 4 0 3 0).card := by rw [hinj _ hH, gm_H,Finset.card_union_of_disjoint hdisH, Finset.card_union_of_disjoint (gm_type_disjoint S 4 2 1 0 4 1 2 0 (by omega)),← gm_h_card S] rw [hsumV, hE0c, hEbc, hE1c, hJcard, hFc] at hh linarith /-! ### BC split by value (R4 LG1) -/ noncomputable def cr_xhi (S : NumericalSemigroup) : Finset ℕ := by classical exact (gm_type S 3 1 1 0).filter (fun x => x ∈ w23_X S 1 + cr_strip S) noncomputable def cr_xord (S : NumericalSemigroup) : Finset ℕ := by classical exact (gm_type S 3 1 1 0).filter (fun x => x ∉ w23_X S 1 + cr_strip S) lemma cr_x_split (S : NumericalSemigroup) : (cr_xhi S).card + (cr_xord S).card = (gm_type S 3 1 1 0).card := by classical unfold cr_xhi cr_xord exact Finset.card_filter_add_card_filter_not (s := gm_type S 3 1 1 0) _ lemma cr_xhi_card (S : NumericalSemigroup) : (cr_xhi S).card ≤ (w23_X S 1).card * (cr_strip S).card := by classical have : cr_xhi S ⊆ w23_X S 1 + cr_strip S := fun x hx => (Finset.mem_filter.1 hx).2 exact (Finset.card_le_card this).trans (w23_card_add_le _ _) lemma cr_xord_y_card (S : NumericalSemigroup) (hq : w23_q S = 4) : (cr_xord S).card + (gm_type S 4 1 1 0).card ≤ (w23_X S 1).card * (cr_ord S).card := by classical have hsub : cr_xord S ∪ gm_type S 4 1 1 0 ⊆ w23_X S 1 + cr_ord S := by intro x hx rcases Finset.mem_union.1 hx with hx | hx · obtain ⟨hxt, hns⟩ := Finset.mem_filter.1 hx obtain ⟨b, hb, g, hg, rfl⟩ := Finset.mem_add.1 (w23_gm_type_BC_subset S hq 3 hxt) refine Finset.mem_add.2 ⟨b, hb, g, ?_, rfl⟩ obtain ⟨hp, hl⟩ := (w23_mem_P S 2 g).1 hg refine (cr_mem_ord S g).2 ⟨hp, hl, ?_⟩ by_contra hlt exact hns (Finset.mem_add.2 ⟨b, hb, g, (cr_mem_strip S g).2 ⟨hp, hl, by omega⟩, rfl⟩) · obtain ⟨b, hb, g, hg, rfl⟩ := Finset.mem_add.1 (w23_gm_type_BC_subset S hq 4 hx) refine Finset.mem_add.2 ⟨b, hb, g, ?_, rfl⟩ obtain ⟨hp, hl⟩ := (w23_mem_P S 2 g).1 hg refine (cr_mem_ord S g).2 ⟨hp, hl, ?_⟩ have h4 := ((w23_mem_X S 4 _).1 (Finset.mem_filter.1 hx).1).2 have hb1 := ((w23_level_eq_iff S b 1).1 ((w23_mem_X S 1 b).1 hb).2).2 have hge := ((w23_level_eq_iff S _ 4).1 h4).1 omega have hdis : Disjoint (cr_xord S) (gm_type S 4 1 1 0) := by apply Finset.disjoint_left.2 intro x hx hy exact Finset.disjoint_left.1 (gm_type_disjoint S 3 1 1 0 4 1 1 0 (by omega)) (Finset.mem_filter.1 hx).1 hy have hc := Finset.card_le_card hsub rw [Finset.card_union_of_disjoint hdis] at hc exact hc.trans (w23_card_add_le _ _) /-! ### Part III: the `T°` side (A6 Lemma 2.2) -/ lemma cr_apery_core (S : NumericalSemigroup) (h : S.multiplicity < S.conductor) {x : ℕ} (hx : x ∈ w23_apery S) (hT : x ∈ (cr_core S).carrier) : x ∈ w23_apery (cr_core S) := by rw [w23_mem_apery, cr_core_conductor, cr_core_multiplicity S h] obtain ⟨hlt, _, hn⟩ := (w23_mem_apery S x).1 hx exact ⟨hlt, hT, fun ⟨y, hy, he⟩ => hn ⟨y, cr_core_le S hy, he⟩⟩ lemma cr_nsmul_mono (S : NumericalSemigroup) {X : Finset ℕ} (hX : X ⊆ cr_A S) (d : ℕ) {x : ℕ} (hx : x ∈ d • X) : x ∈ (cr_core S).carrier := cr_nsmul_mem_core S (Finset.nsmul_subset_nsmul_left hX hx) /-- `ℓ(T°) ≥ 4 + 3K + 2(h + b) + (w + v + x^hi)` (A6 Lemma 2.2, lower-bound form). -/ lemma cr_core_leftCount_ge (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) : 4 + 3*(w23_X S 1).card + 2*((cr_strip S).card + (gm_type S 2 2 0 0).card) + ((gm_type S 3 2 0 0).card + (gm_type S 3 3 0 0).card + (cr_xhi S).card) ≤ (cr_core S).leftCount := by classical have hmc : S.multiplicity < S.conductor := by omega have hq := w23_q_eq_four S h1 h2 have hqT : w23_q (cr_core S) = 4 := by rw [cr_core_q S hmc, hq] have hl := w23_leftCount_eq (cr_core S) rw [hqT] at hl norm_num [Finset.sum_range_succ, w23_alpha, w23_X_zero] at hl rw [cr_core_X1 S h1 h2] at hl have hX1A := cr_X1_subset_A S h1 h2 -- level-2 part have hsub2 : cr_strip S ∪ gm_type S 2 2 0 0 ⊆ w23_X (cr_core S) 2 := by intro x hx rw [w23_mem_X, cr_core_level S hmc] rcases Finset.mem_union.1 hx with hx | hx · obtain ⟨hp, hlv, _⟩ := (cr_mem_strip S x).1 hx have hne : x ≠ S.multiplicity := by intro he; rw [he, w23_level_multiplicity] at hlv; omega exact ⟨cr_apery_core S hmc (w23_primitive_mem_apery S hp hne) (cr_A_mem_core S (cr_strip_subset_A S h1 h2 hx)), hlv⟩ · have hx2 := (Finset.mem_filter.1 hx).1 obtain ⟨hxa, hlv⟩ := (w23_mem_X S 2 x).1 hx2 exact ⟨cr_apery_core S hmc hxa (cr_nsmul_mono S hX1A 2 (w23_gm_type_pure_value S hq 2 2 hx)), hlv⟩ have hdis2 : Disjoint (cr_strip S) (gm_type S 2 2 0 0) := by apply Finset.disjoint_left.2 intro x hx hy exact (Finset.mem_filter.1 hy).2.1 ((cr_mem_strip S x).1 hx).1 have hc2 := Finset.card_le_card hsub2 rw [Finset.card_union_of_disjoint hdis2] at hc2 -- level-3 part have hsub3 : gm_type S 3 2 0 0 ∪ gm_type S 3 3 0 0 ∪ cr_xhi S ⊆ w23_X (cr_core S) 3 := by intro x hx rw [w23_mem_X, cr_core_level S hmc] have hmem : x ∈ gm_type S 3 2 0 0 ∪ gm_type S 3 3 0 0 ∪ gm_type S 3 1 1 0 ∧ x ∈ (cr_core S).carrier := by rcases Finset.mem_union.1 hx with hx | hx · rcases Finset.mem_union.1 hx with hx | hx · exact ⟨by simp [hx], cr_nsmul_mono S hX1A 2 (w23_gm_type_pure_value S hq 3 2 hx)⟩ · exact ⟨by simp [hx], cr_nsmul_mono S hX1A 3 (w23_gm_type_pure_value S hq 3 3 hx)⟩ · obtain ⟨hxt, hxs⟩ := Finset.mem_filter.1 hx refine ⟨by simp [hxt], ?_⟩ apply cr_nsmul_mono S (Finset.union_subset hX1A (cr_strip_subset_A S h1 h2)) 2 obtain ⟨b, hb, g, hg, rfl⟩ := Finset.mem_add.1 hxs rw [two_nsmul] exact Finset.add_mem_add (Finset.mem_union_left _ hb) (Finset.mem_union_right _ hg) obtain ⟨hmem, hT⟩ := hmem have hx3 : x ∈ w23_X S 3 := by rcases Finset.mem_union.1 hmem with hx | hx · rcases Finset.mem_union.1 hx with hx | hx · exact (Finset.mem_filter.1 hx).1 · exact (Finset.mem_filter.1 hx).1 · exact (Finset.mem_filter.1 hx).1 obtain ⟨hxa, hlv⟩ := (w23_mem_X S 3 x).1 hx3 exact ⟨cr_apery_core S hmc hxa hT, hlv⟩ have hdis3a : Disjoint (gm_type S 3 2 0 0) (gm_type S 3 3 0 0) := gm_type_disjoint S 3 2 0 0 3 3 0 0 (by omega) have hdis3b : Disjoint (gm_type S 3 2 0 0 ∪ gm_type S 3 3 0 0) (cr_xhi S) := by rw [Finset.disjoint_union_left] constructor · exact Finset.disjoint_of_subset_right (Finset.filter_subset _ _) (gm_type_disjoint S 3 2 0 0 3 1 1 0 (by omega)) · exact Finset.disjoint_of_subset_right (Finset.filter_subset _ _) (gm_type_disjoint S 3 3 0 0 3 1 1 0 (by omega)) have hc3 := Finset.card_le_card hsub3 rw [Finset.card_union_of_disjoint hdis3b, Finset.card_union_of_disjoint hdis3a] at hc3 omega /-- `b₀ := |T° ∩ [2m, 3m − ρ)|` -/ noncomputable def cr_b0 (S : NumericalSemigroup) : ℕ := by classical exact ((Finset.Ico (2*S.multiplicity) (3*S.multiplicity - w23_rho S)).filter (fun y => y ∈ (cr_core S).carrier)).card /-- `b₀ ≤ a₀ + b` (A6 §2.2(i), L1 III.4). -/ lemma cr_b0_le (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) : cr_b0 S ≤ (w23_X S 1).card + 1 + (gm_type S 2 2 0 0).card := by classical have hmc : S.multiplicity < S.conductor := by omega have hq := w23_q_eq_four S h1 h2 have hc := w23_q_mul_sub S rw [hq] at hc have hr := w23_rho_lt S have hsub : (Finset.Ico (2*S.multiplicity) (3*S.multiplicity - w23_rho S)).filter (fun y => y ∈ (cr_core S).carrier) ⊆ (w23_P S 1).image (fun a => a + S.multiplicity) ∪ gm_type S 2 2 0 0 := by intro y hy obtain ⟨hyI, hyT⟩ := Finset.mem_filter.1 hy obtain ⟨hy2, hy3⟩ := Finset.mem_Ico.1 hyI have hyS := cr_core_le S hyT by_cases hpred : y - S.multiplicity ∈ S.carrier · apply Finset.mem_union_left refine Finset.mem_image.2 ⟨y - S.multiplicity, ?_, by omega⟩ exact cr_low_mem_P1 S hpred (by omega) (by omega) · apply Finset.mem_union_right have hya : y ∈ w23_apery S := by apply w23_apery_of_no_predecessor S hyS rintro ⟨z, hz, he⟩ apply hpred rw [show y - S.multiplicity = z by omega] exact hz have hlv : w23_level S y = 2 := (w23_level_eq_iff S y 2).2 (by constructor <;> omega) have hnp : ¬ S.IsPrimitive y := by intro hp rcases (cr_mem_core S y).1 hyT with ⟨d, hd⟩ | hcy · have := ((cr_mem_A S y).1 (cr_primitive_nsmul S hd hp)).2.2 omega · omega have ht := w23_gm_type_table S hq (by omega : 2 ≤ 2) ((w23_mem_X S 2 y).2 ⟨hya, hlv⟩) hnp rcases ht with ⟨_, hh⟩ | ⟨hfalse, _⟩ | ⟨hfalse, _⟩ · exact hh · omega · omega have hcard := Finset.card_le_card hsub have hu := Finset.card_union_le ((w23_P S 1).image (fun a => a + S.multiplicity)) (gm_type S 2 2 0 0) have him := Finset.card_image_le (s := w23_P S 1) (f := fun a => a + S.multiplicity) have ha1 := w23_alpha_one S change (w23_X S 1).card + 1 = (w23_P S 1).card at ha1 unfold cr_b0 omega -- ===== M5IV.lean ===== /-! M5 Part IV: the fibre bridge `S ↔ T°` (A4 L1/L2 = R1 BR1–BR6, A6 §4 (a)–(e), R4 LG6). -/ /-- fibre of an ordinary level-2 primitive `c` over `T°` (A4's "largest C" rule; guard per R1 M6). -/ noncomputable def cr_fib (S : NumericalSemigroup) (c : ℕ) : Finset ℕ := by classical exact (cr_A S).filter (fun x => c + x < S.conductor ∧ c + x ∉ (cr_core S).carrier ∧ ∀ c' ∈ cr_ord S, c < c' → c' ≤ c + x → c + x - c' ∉ cr_A S) /-- `R = #{c ∈ C : c + m ∈ T°}` -/ noncomputable def cr_R (S : NumericalSemigroup) : ℕ := by classical exact ((cr_ord S).filter (fun c => c + S.multiplicity ∈ (cr_core S).carrier)).card lemma cr_mem_fib (S : NumericalSemigroup) (c x : ℕ) : x ∈ cr_fib S c ↔ x ∈ cr_A S ∧ c + x < S.conductor ∧ c + x ∉ (cr_core S).carrier ∧ ∀ c' ∈ cr_ord S, c < c' → c' ≤ c + x → c + x - c' ∉ cr_A S := by classical unfold cr_fib rw [Finset.mem_filter] lemma cr_basic (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) : w23_q S = 4 ∧ 4 * S.multiplicity = S.conductor + w23_rho S ∧ w23_rho S < S.multiplicity ∧ 2 ≤ S.multiplicity := by have hq := w23_q_eq_four S h1 h2 have hc := w23_q_mul_sub S rw [hq] at hc exact ⟨hq, hc, w23_rho_lt S, cr_multiplicity_ge_two S⟩ lemma cr_P3_bounds (S : NumericalSemigroup) {g : ℕ} (hg : g ∈ w23_P S 3) : S.IsPrimitive g ∧ 3 * S.multiplicity ≤ g + w23_rho S := by obtain ⟨hp, hl⟩ := (w23_mem_P S 3 g).1 hg exact ⟨hp, ((w23_level_eq_iff S g 3).1 hl).1⟩ /-- A6 §4(a): fibres consist of non-strip generators. -/ lemma cr_fib_sub_P1 (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) {c : ℕ} (hc : c ∈ cr_ord S) : cr_fib S c ⊆ w23_P S 1 := by intro x hx obtain ⟨hxA, hlt, _, _⟩ := (cr_mem_fib S c x).1 hx obtain ⟨_, hcl, hcm⟩ := (cr_mem_ord S c).1 hc have hb := cr_basic S h1 h2 rw [cr_A_eq S h1 h2] at hxA rcases Finset.mem_union.1 hxA with h | h · exact h · have := (cr_strip_bounds S h).1 omega lemma cr_fib_card_le (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) {c : ℕ} (hc : c ∈ cr_ord S) : (cr_fib S c).card ≤ (w23_X S 1).card + 1 := by have := Finset.card_le_card (cr_fib_sub_P1 S h1 h2 hc) have ha1 := w23_alpha_one S change (w23_X S 1).card + 1 = (w23_P S 1).card at ha1 omega /-- A6 §4(c): an empty fibre forces `c + m ∈ T°`. -/ lemma cr_zero_fibres (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) : ((cr_ord S).filter (fun c => (cr_fib S c).card = 0)).card ≤ cr_R S := by classical unfold cr_R apply Finset.card_le_card intro c hc obtain ⟨hco, hz⟩ := Finset.mem_filter.1 hc refine Finset.mem_filter.2 ⟨hco, ?_⟩ by_contra hT have hb := cr_basic S h1 h2 have hcb := cr_ord_bounds S hco have hm : S.multiplicity ∈ cr_fib S c := by rw [cr_mem_fib] refine ⟨cr_multiplicity_mem_A S (by omega), by omega, hT, ?_⟩ intro c' hc' hlt hle hA have := cr_A_ge S hA omega rw [Finset.card_eq_zero] at hz rw [hz] at hm simp at hm /-- L1 IV.4: new left elements of `S` over `T°` are `C`, `D` or `C + A`. -/ lemma cr_left_new (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (v : ℕ) : v ∈ S.carrier → v < S.conductor → v ∉ (cr_core S).carrier → v ∈ cr_ord S ∨ v ∈ w23_P S 3 ∨ ∃ c ∈ cr_ord S, ∃ x ∈ cr_A S, v = c + x := by have hb := cr_basic S h1 h2 induction v using Nat.strong_induction_on with | _ v ih => intro hv hlt hT have hv0 : 0 < v := by by_contra h0 exact hT (by rw [show v = 0 by omega]; exact (cr_core S).carrier.zero_mem) by_cases hp : S.IsPrimitive v · have hnA : v ∉ cr_A S := fun hA => hT (cr_A_mem_core S hA) have hv2 : 2 * S.multiplicity ≤ v := by by_contra h exact hnA ((cr_mem_A S v).2 ⟨hp, hlt, by omega⟩) have hlv := (w23_lt_conductor_iff S v).1 hlt have hl2 : 2 ≤ w23_level S v := by by_contra h have := ((w23_level_eq_iff S v (w23_level S v)).1 rfl).2 have hm := Nat.mul_le_mul_right S.multiplicity (show w23_level S v + 1 ≤ 2 by omega) omega rcases (show w23_level S v = 2 ∨ w23_level S v = 3 by omega) with h | h · exact Or.inl ((cr_mem_ord S v).2 ⟨hp, h, hv2⟩) · exact Or.inr (Or.inl ((w23_mem_P S 3 v).2 ⟨hp, h⟩)) · obtain ⟨a, b, ha, hb', hap, hbp, he⟩ := w23_decomposable_eq_add S hv hp hv0 (by omega) obtain ⟨halt, haS⟩ := (S.mem_leftElements a).1 ha obtain ⟨hblt, hbS⟩ := (S.mem_leftElements b).1 hb' have key : ∀ a b, a ∈ S.carrier → b ∈ S.carrier → 0 < a → 0 < b → v = a + b → a ∉ (cr_core S).carrier → v ∈ cr_ord S ∨ v ∈ w23_P S 3 ∨ ∃ c ∈ cr_ord S, ∃ x ∈ cr_A S, v = c + x := by intro a b haS hbS hap hbp he haT have hma := S.multiplicity_le hap haS have hmb := S.multiplicity_le hbp hbS rcases ih a (by omega) haS (by omega) haT with hc | hd | ⟨c', hc', x, hx, hax⟩ · have hcb := cr_ord_bounds S hc right; right exact ⟨a, hc, b, cr_small_mem_A S h1 hbS hbp (by omega), he⟩ · have := (cr_P3_bounds S hd).2 omega · have hcb := cr_ord_bounds S hc' have := cr_A_ge S hx omega by_cases haT : a ∈ (cr_core S).carrier · have hbT : b ∉ (cr_core S).carrier := by intro hbT exact hT (he ▸ (cr_core S).carrier.add_mem haT hbT) exact key b a hbS haS hbp hap (by omega) hbT · exact key a b haS hbS hap hbp he haT /-- L1 IV.5 (lower-bound form, A6 §4(b)): `ℓ(S) ≥ ℓ(T°) + k + Σ r_c + z`. -/ lemma cr_leftCount_bridge (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) : (cr_core S).leftCount + (cr_ord S).card + ∑ c ∈ cr_ord S, (cr_fib S c).card + (w23_P S 3).card ≤ S.leftCount := by classical have hb := cr_basic S h1 h2 have hmc : S.multiplicity < S.conductor := by omega let N := ((cr_ord S).sigma (cr_fib S)).image (fun p => p.1 + p.2) have hNcard : N.card = ∑ c ∈ cr_ord S, (cr_fib S c).card := by rw [← Finset.card_sigma] apply Finset.card_image_of_injOn rintro ⟨c₁, x₁⟩ hp₁ ⟨c₂, x₂⟩ hp₂ he simp only [Finset.coe_sigma, Set.mem_sigma_iff, Finset.mem_coe] at hp₁ hp₂ simp only at he obtain ⟨hc₁, hx₁⟩ := hp₁ obtain ⟨hc₂, hx₂⟩ := hp₂ have hx₁' := (cr_mem_fib S c₁ x₁).1 hx₁ have hx₂' := (cr_mem_fib S c₂ x₂).1 hx₂ rcases lt_trichotomy c₁ c₂ with hlt | heq | hgt · exact absurd (by rw [show c₁ + x₁ - c₂ = x₂ by omega]; exact hx₂'.1) (hx₁'.2.2.2 c₂ hc₂ hlt (by omega)) · subst heq have : x₁ = x₂ := by omega subst this rfl · exact absurd (by rw [show c₂ + x₂ - c₁ = x₁ by omega]; exact hx₁'.1) (hx₂'.2.2.2 c₁ hc₁ hgt (by omega)) have hLT : (cr_core S).leftElements ⊆ S.leftElements := by intro x hx rw [NumericalSemigroup.mem_leftElements, cr_core_conductor] at hx exact (S.mem_leftElements x).2 ⟨hx.1, cr_core_le S hx.2⟩ have hordL : cr_ord S ⊆ S.leftElements := by intro c hc obtain ⟨hp, hl, _⟩ := (cr_mem_ord S c).1 hc exact (S.mem_leftElements c).2 ⟨(w23_lt_conductor_iff S c).2 (by omega), hp.1⟩ have hP3L : w23_P S 3 ⊆ S.leftElements := by intro g hg obtain ⟨hp, hl⟩ := (w23_mem_P S 3 g).1 hg exact (S.mem_leftElements g).2 ⟨(w23_lt_conductor_iff S g).2 (by omega), hp.1⟩ have hNL : N ⊆ S.leftElements := by intro y hy obtain ⟨⟨c, x⟩, hp, rfl⟩ := Finset.mem_image.1 hy obtain ⟨hc, hx⟩ : c ∈ cr_ord S ∧ x ∈ cr_fib S c := Finset.mem_sigma.1 hp obtain ⟨hxA, hlt, _, _⟩ := (cr_mem_fib S c x).1 hx exact (S.mem_leftElements _).2 ⟨hlt, S.carrier.add_mem ((cr_mem_ord S c).1 hc).1.1 (cr_A_carrier S hxA)⟩ have hnotprimN : ∀ y ∈ N, ¬ S.IsPrimitive y := by intro y hy hp obtain ⟨⟨c, x⟩, hpr, rfl⟩ := Finset.mem_image.1 hy obtain ⟨hc, hx⟩ : c ∈ cr_ord S ∧ x ∈ cr_fib S c := Finset.mem_sigma.1 hpr have hxA := ((cr_mem_fib S c x).1 hx).1 have hcb := cr_ord_bounds S hc have := cr_A_ge S hxA rcases hp.2.2 c x ((cr_mem_ord S c).1 hc).1.1 (cr_A_carrier S hxA) rfl with h | h <;> omega have hd1 : Disjoint (cr_core S).leftElements (cr_ord S) := by apply Finset.disjoint_left.2 intro c hcT hc obtain ⟨hp, hl, h2m⟩ := (cr_mem_ord S c).1 hc exact cr_primitive_not_mem_core S hp ((w23_lt_conductor_iff S c).2 (by omega)) h2m ((NumericalSemigroup.mem_leftElements _ _).1 hcT).2 have hd2 : Disjoint ((cr_core S).leftElements ∪ cr_ord S) (w23_P S 3) := by rw [Finset.disjoint_union_left] constructor · apply Finset.disjoint_left.2 intro g hgT hg obtain ⟨hp, hl⟩ := (w23_mem_P S 3 g).1 hg have := ((w23_level_eq_iff S g 3).1 hl).1 exact cr_primitive_not_mem_core S hp ((w23_lt_conductor_iff S g).2 (by omega)) (by omega) ((NumericalSemigroup.mem_leftElements _ _).1 hgT).2 · apply Finset.disjoint_left.2 intro g hc hg have := ((cr_mem_ord S g).1 hc).2.1 have := ((w23_mem_P S 3 g).1 hg).2 omega have hd3 : Disjoint ((cr_core S).leftElements ∪ cr_ord S ∪ w23_P S 3) N := by rw [Finset.disjoint_union_left, Finset.disjoint_union_left] refine ⟨⟨?_, ?_⟩, ?_⟩ · apply Finset.disjoint_left.2 intro y hyT hy obtain ⟨⟨c, x⟩, hpr, rfl⟩ := Finset.mem_image.1 hy obtain ⟨hc, hx⟩ : c ∈ cr_ord S ∧ x ∈ cr_fib S c := Finset.mem_sigma.1 hpr exact ((cr_mem_fib S c x).1 hx).2.2.1 ((NumericalSemigroup.mem_leftElements _ _).1 hyT).2 · apply Finset.disjoint_left.2 intro y hc hy exact hnotprimN y hy ((cr_mem_ord S y).1 hc).1 · apply Finset.disjoint_left.2 intro y hg hy exact hnotprimN y hy ((w23_mem_P S 3 y).1 hg).1 have hsub : (cr_core S).leftElements ∪ cr_ord S ∪ w23_P S 3 ∪ N ⊆ S.leftElements := Finset.union_subset (Finset.union_subset (Finset.union_subset hLT hordL) hP3L) hNL have hc := Finset.card_le_card hsub rw [Finset.card_union_of_disjoint hd3, Finset.card_union_of_disjoint hd2, Finset.card_union_of_disjoint hd1, hNcard] at hc unfold NumericalSemigroup.leftCount omega /-- L1 IV.6: new right decomposables of `S` over `T°`. -/ lemma cr_newright_cases (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) {y : ℕ} (hy : y ∈ w23_D S) (hyT : y ∉ w23_D (cr_core S)) : (∃ g ∈ w23_P S 3, ∃ x ∈ cr_A S, y = g + x) ∨ (∃ c ∈ cr_ord S, ∃ x ∈ cr_A S, y = c + x) ∨ (∃ c ∈ cr_ord S, ∃ c' ∈ cr_ord S, y = c + c') ∨ (∃ c ∈ cr_ord S, ∃ x ∈ cr_A S, ∃ x' ∈ cr_A S, y = c + x + x') := by classical have hb := cr_basic S h1 h2 have hmc : S.multiplicity < S.conductor := by omega unfold w23_D at hy hyT rw [cr_core_conductor, cr_core_multiplicity S hmc] at hyT obtain ⟨hyI, hnp⟩ := Finset.mem_filter.1 hy obtain ⟨hyc, hyc'⟩ := Finset.mem_Ico.1 hyI have hTp : (cr_core S).IsPrimitive y := by by_contra h exact hyT (Finset.mem_filter.2 ⟨hyI, h⟩) have hyS : y ∈ S.carrier := S.conductor_spec y hyc obtain ⟨a, b, ha, hb', hap, hbp, he⟩ := w23_decomposable_eq_add S hyS hnp (by omega) hyc' obtain ⟨halt, haS⟩ := (S.mem_leftElements a).1 ha obtain ⟨hblt, hbS⟩ := (S.mem_leftElements b).1 hb' have key : ∀ a b, a ∈ S.carrier → b ∈ S.carrier → 0 < a → 0 < b → a < S.conductor → y = a + b → a ∉ (cr_core S).carrier → (∃ g ∈ w23_P S 3, ∃ x ∈ cr_A S, y = g + x) ∨ (∃ c ∈ cr_ord S, ∃ x ∈ cr_A S, y = c + x) ∨ (∃ c ∈ cr_ord S, ∃ c' ∈ cr_ord S, y = c + c') ∨ (∃ c ∈ cr_ord S, ∃ x ∈ cr_A S, ∃ x' ∈ cr_A S, y = c + x + x') := by intro a b haS hbS hap hbp halt he haT have hma := S.multiplicity_le hap haS have hmb := S.multiplicity_le hbp hbS rcases cr_left_new S h1 h2 a haS halt haT with hc | hd | ⟨c, hc, x, hx, hax⟩ · have hcb := cr_ord_bounds S hc by_cases hb2 : b < 2 * S.multiplicity · exact Or.inr (Or.inl ⟨a, hc, b, cr_small_mem_A S h1 hbS hbp hb2, he⟩) · by_cases hbp' : S.IsPrimitive b · have hlv : w23_level S b = 2 := (w23_level_eq_iff S b 2).2 (by constructor <;> omega) exact Or.inr (Or.inr (Or.inl ⟨a, hc, b, (cr_mem_ord S b).2 ⟨hbp', hlv, by omega⟩, he⟩)) · obtain ⟨u, w, hu, hw, hup, hwp, hbe⟩ := w23_decomposable_eq_add S hbS hbp' hbp (by omega) have huS := ((S.mem_leftElements u).1 hu).2 have hwS := ((S.mem_leftElements w).1 hw).2 have hmu := S.multiplicity_le hup huS have hmw := S.multiplicity_le hwp hwS refine Or.inr (Or.inr (Or.inr ⟨a, hc, u, cr_small_mem_A S h1 huS hup (by omega), w, cr_small_mem_A S h1 hwS hwp (by omega), by omega⟩)) · have := (cr_P3_bounds S hd).2 exact Or.inl ⟨a, hd, b, cr_small_mem_A S h1 hbS hbp (by omega), he⟩ · have hcb := cr_ord_bounds S hc have := cr_A_ge S hx exact Or.inr (Or.inr (Or.inr ⟨c, hc, x, hx, b, cr_small_mem_A S h1 hbS hbp (by omega), by omega⟩)) by_cases haT : a ∈ (cr_core S).carrier · have hbT : b ∉ (cr_core S).carrier := by intro hbT rcases hTp.2.2 a b haT hbT he with h | h <;> omega exact key b a hbS haS hbp hap hblt (by omega) hbT · exact key a b haS hbS hap hbp halt he haT /-- the largest ordinary `c` in a `C + A + A` representation of `y` -/ noncomputable def cr_cset (S : NumericalSemigroup) (y : ℕ) : Finset ℕ := by classical exact (cr_ord S).filter (fun c => ∃ x ∈ cr_A S, ∃ x' ∈ cr_A S, y = c + x + x') noncomputable def cr_cmax (S : NumericalSemigroup) (y : ℕ) : ℕ := if h : (cr_cset S y).Nonempty then (cr_cset S y).max' h else 0 lemma cr_mem_cset (S : NumericalSemigroup) (y c : ℕ) : c ∈ cr_cset S y ↔ c ∈ cr_ord S ∧ ∃ x ∈ cr_A S, ∃ x' ∈ cr_A S, y = c + x + x' := by classical unfold cr_cset rw [Finset.mem_filter] /-- A4 L1.6(b): for `y ∈ D_S ∖ D_T` with a `CAA` representation at `c = cmax y`, both `A`-summands lie in `fib(c)`. -/ lemma cr_caa_fib (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) {y : ℕ} (hy : y ∈ w23_D S) (hyT : y ∉ w23_D (cr_core S)) (hne : (cr_cset S y).Nonempty) {x x' : ℕ} (hx : x ∈ cr_A S) (hx' : x' ∈ cr_A S) (he : y = cr_cmax S y + x + x') : x ∈ cr_fib S (cr_cmax S y) := by classical have hb := cr_basic S h1 h2 have hmc : S.multiplicity < S.conductor := by omega have hcm : cr_cmax S y = (cr_cset S y).max' hne := by simp [cr_cmax, hne] have hcmem := Finset.max'_mem (cr_cset S y) hne rw [← hcm] at hcmem obtain ⟨hco, _⟩ := (cr_mem_cset S y _).1 hcmem have hcb := cr_ord_bounds S hco have hma := cr_A_ge S hx have hma' := cr_A_ge S hx' unfold w23_D at hy hyT rw [cr_core_conductor, cr_core_multiplicity S hmc] at hyT obtain ⟨hyI, hnp⟩ := Finset.mem_filter.1 hy obtain ⟨hyc, hyc'⟩ := Finset.mem_Ico.1 hyI rw [cr_mem_fib] refine ⟨hx, by omega, ?_, ?_⟩ · intro hT apply hyT refine Finset.mem_filter.2 ⟨hyI, fun hTp => ?_⟩ rcases hTp.2.2 (cr_cmax S y + x) x' hT (cr_A_mem_core S hx') (by omega) with h | h <;> omega · intro c' hc' hlt hle hA have hmem : c' ∈ cr_cset S y := (cr_mem_cset S y c').2 ⟨hc', cr_cmax S y + x - c', hA, x', hx', by omega⟩ have := Finset.le_max' (cr_cset S y) c' hmem rw [← hcm] at this omega /-- L1 IV.7 (BR3–BR6 + L2.2, A6 §4(d)–(e)): the right bridge, multiplied by 2. -/ lemma cr_right_bridge (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) : 2 * ((w23_D S).card + ∑ c ∈ cr_ord S, (cr_fib S c).card + cr_R S) ≤ 2 * (w23_D (cr_core S)).card + 2 * (cr_A S).card * (cr_ord S).card + (cr_ord S).card * ((cr_ord S).card + 1) + ∑ c ∈ cr_ord S, min (2 * cr_b0 S) ((cr_fib S c).card * ((cr_fib S c).card + 1)) + 2 * (cr_A S).card * (w23_P S 3).card := by classical have hb := cr_basic S h1 h2 have hmc : S.multiplicity < S.conductor := by omega set A := cr_A S with hA set C := cr_ord S with hC set D := w23_P S 3 with hD set V := w23_D S \ w23_D (cr_core S) with hV have hDsub := cr_core_D_subset S hmc have hVcard : (w23_D S).card = (w23_D (cr_core S)).card + V.card := by rw [hV, Finset.card_sdiff_of_subset hDsub] have := Finset.card_le_card hDsub omega -- the four pieces let Phi := (C ×ˢ A).filter (fun p => S.conductor ≤ p.1 + p.2) let VCA := Phi.image (fun p => p.1 + p.2) let V' := V.filter (fun y => (cr_cset S y).Nonempty) have hVsub : V ⊆ (D + A) ∪ VCA ∪ (C + C) ∪ V' := by intro y hy obtain ⟨hyD, hyT⟩ := Finset.mem_sdiff.1 hy have hyc : S.conductor ≤ y := by unfold w23_D at hyD exact (Finset.mem_Ico.1 (Finset.mem_filter.1 hyD).1).1 rcases cr_newright_cases S h1 h2 hyD hyT with ⟨g, hg, x, hx, he⟩ | ⟨c, hc, x, hx, he⟩ | ⟨c, hc, c', hc', he⟩ | ⟨c, hc, x, hx, x', hx', he⟩ · exact Finset.mem_union_left _ (Finset.mem_union_left _ (Finset.mem_union_left _ (Finset.mem_add.2 ⟨g, hg, x, hx, he.symm⟩))) · exact Finset.mem_union_left _ (Finset.mem_union_left _ (Finset.mem_union_right _ (Finset.mem_image.2 ⟨(c, x), Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨hc, hx⟩, by simp only; omega⟩, he.symm⟩))) · exact Finset.mem_union_left _ (Finset.mem_union_right _ (Finset.mem_add.2 ⟨c, hc, c', hc', he.symm⟩)) · exact Finset.mem_union_right _ (Finset.mem_filter.2 ⟨hy, ⟨c, (cr_mem_cset S y c).2 ⟨hc, x, hx, x', hx', he⟩⟩⟩) have hVle : V.card ≤ (D + A).card + VCA.card + (C + C).card + V'.card := by have := Finset.card_le_card hVsub have h1' := Finset.card_union_le ((D + A) ∪ VCA ∪ (C + C)) V' have h2' := Finset.card_union_le ((D + A) ∪ VCA) (C + C) have h3' := Finset.card_union_le (D + A) VCA omega -- DA have hDA : (D + A).card ≤ D.card * A.card := w23_card_add_le _ _ -- CC have hCC : 2 * (C + C).card ≤ C.card * (C.card + 1) := by have hh := ns_card_succ_nsmul_le C 1 simp only [Nat.reduceAdd, one_nsmul, two_nsmul] at hh nlinarith only [hh] -- CA together with the fibre pairs and the R pairs have hCA : VCA.card + ∑ c ∈ C, (cr_fib S c).card + cr_R S ≤ A.card * C.card := by let Qf := (C.sigma (cr_fib S)).image (fun p => (p.1, p.2)) let Qr := (C.filter (fun c => c + S.multiplicity ∈ (cr_core S).carrier)).image (fun c => (c, S.multiplicity)) have hQf : Qf.card = ∑ c ∈ C, (cr_fib S c).card := by rw [← Finset.card_sigma] apply Finset.card_image_of_injOn rintro ⟨c₁, x₁⟩ _ ⟨c₂, x₂⟩ _ he simp only [Prod.mk.injEq] at he obtain ⟨rfl, rfl⟩ := he rfl have hQr : Qr.card = cr_R S := by unfold cr_R apply Finset.card_image_of_injOn intro c₁ _ c₂ _ he simp only [Prod.mk.injEq] at he exact he.1 have hsubQ : Qf ∪ Qr ⊆ (C ×ˢ A).filter (fun p => ¬ S.conductor ≤ p.1 + p.2) := by intro p hp rcases Finset.mem_union.1 hp with hp | hp · obtain ⟨⟨c, x⟩, hcx, rfl⟩ := Finset.mem_image.1 hp obtain ⟨hc, hx⟩ : c ∈ C ∧ x ∈ cr_fib S c := Finset.mem_sigma.1 hcx obtain ⟨hxA, hlt, _, _⟩ := (cr_mem_fib S c x).1 hx exact Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨hc, hxA⟩, by simp only; omega⟩ · obtain ⟨c, hc, rfl⟩ := Finset.mem_image.1 hp obtain ⟨hc, _⟩ := Finset.mem_filter.1 hc have hcb := cr_ord_bounds S hc exact Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨hc, cr_multiplicity_mem_A S hmc⟩, by simp only; omega⟩ have hdisQ : Disjoint Qf Qr := by apply Finset.disjoint_left.2 intro p hpf hpr obtain ⟨⟨c, x⟩, hcx, rfl⟩ := Finset.mem_image.1 hpf obtain ⟨c', hc', he⟩ := Finset.mem_image.1 hpr simp only [Prod.mk.injEq] at he obtain ⟨rfl, rfl⟩ := he obtain ⟨_, hx⟩ := Finset.mem_sigma.1 hcx exact ((cr_mem_fib S _ _).1 hx).2.2.1 (Finset.mem_filter.1 hc').2 have hc1 := Finset.card_le_card hsubQ rw [Finset.card_union_of_disjoint hdisQ, hQf, hQr] at hc1 have hc2 := Finset.card_filter_add_card_filter_not (s := C ×ˢ A) (fun p => S.conductor ≤ p.1 + p.2) rw [Finset.card_product] at hc2 have hc3 : VCA.card ≤ Phi.card := Finset.card_image_le change VCA.card ≤ ((C ×ˢ A).filter (fun p => S.conductor ≤ p.1 + p.2)).card at hc3 rw [Nat.mul_comm] at hc2 omega -- CAA have hV' : 2 * V'.card ≤ ∑ c ∈ C, min (2 * cr_b0 S) ((cr_fib S c).card * ((cr_fib S c).card + 1)) := by have hmaps : ∀ y ∈ V', cr_cmax S y ∈ C := by intro y hy obtain ⟨_, hne⟩ := Finset.mem_filter.1 hy have hcm : cr_cmax S y = (cr_cset S y).max' hne := by simp [cr_cmax, hne] have := Finset.max'_mem (cr_cset S y) hne rw [← hcm] at this exact ((cr_mem_cset S y _).1 this).1 rw [Finset.card_eq_sum_card_fiberwise hmaps, Finset.mul_sum] apply Finset.sum_le_sum intro c hc let Fc := V'.filter (fun y => cr_cmax S y = c) let B0 := (Finset.Ico (2*S.multiplicity) (3*S.multiplicity - w23_rho S)).filter (fun y => y ∈ (cr_core S).carrier) have himg : Fc.image (fun y => y - c) ⊆ (cr_fib S c + cr_fib S c) ∩ B0 := by intro u hu obtain ⟨y, hy, rfl⟩ := Finset.mem_image.1 hu obtain ⟨hyV', hyc⟩ := Finset.mem_filter.1 hy obtain ⟨hyV, hne⟩ := Finset.mem_filter.1 hyV' obtain ⟨hyD, hyT⟩ := Finset.mem_sdiff.1 hyV have hcm : cr_cmax S y = (cr_cset S y).max' hne := by simp [cr_cmax, hne] have hcmem := Finset.max'_mem (cr_cset S y) hne rw [← hcm] at hcmem obtain ⟨_, x, hx, x', hx', he⟩ := (cr_mem_cset S y _).1 hcmem have hfx := cr_caa_fib S h1 h2 hyD hyT hne hx hx' he have hfx' := cr_caa_fib S h1 h2 hyD hyT hne hx' hx (by omega) rw [hyc] at hfx hfx' he have hyup : y < S.conductor + S.multiplicity := by unfold w23_D at hyD exact (Finset.mem_Ico.1 (Finset.mem_filter.1 hyD).1).2 have hcb := cr_ord_bounds S hc have hma := cr_A_ge S hx have hma' := cr_A_ge S hx' refine Finset.mem_inter.2 ⟨Finset.mem_add.2 ⟨x, hfx, x', hfx', by omega⟩, ?_⟩ refine Finset.mem_filter.2 ⟨Finset.mem_Ico.2 ⟨by omega, by omega⟩, ?_⟩ rw [show y - c = x + x' by omega] exact (cr_core S).carrier.add_mem (cr_A_mem_core S hx) (cr_A_mem_core S hx') have hinj : Set.InjOn (fun y => y - c) Fc := by intro y₁ hy₁ y₂ hy₂ he simp only at he have hc₁ := (Finset.mem_filter.1 hy₁).2 have hc₂ := (Finset.mem_filter.1 hy₂).2 have hge : ∀ y ∈ Fc, c ≤ y := by intro y hy obtain ⟨hyV', hyc⟩ := Finset.mem_filter.1 hy obtain ⟨_, hne⟩ := Finset.mem_filter.1 hyV' have hcm : cr_cmax S y = (cr_cset S y).max' hne := by simp [cr_cmax, hne] have hcmem := Finset.max'_mem (cr_cset S y) hne rw [← hcm, hyc] at hcmem obtain ⟨_, x, _, x', _, he⟩ := (cr_mem_cset S y _).1 hcmem omega have := hge y₁ hy₁ have := hge y₂ hy₂ omega have hcard := Finset.card_le_card himg rw [Finset.card_image_of_injOn hinj] at hcard have hle1 : Fc.card ≤ (cr_fib S c + cr_fib S c).card := hcard.trans (Finset.card_le_card Finset.inter_subset_left) have hle2 : Fc.card ≤ cr_b0 S := by have := hcard.trans (Finset.card_le_card Finset.inter_subset_right) unfold cr_b0 exact this have hss := ns_card_succ_nsmul_le (cr_fib S c) 1 simp only [Nat.reduceAdd, one_nsmul, two_nsmul] at hss change 2 * Fc.card ≤ _ apply le_min · omega · nlinarith only [hle1, hss] -- assemble have hAk : A.card * C.card = A.card * C.card := rfl nlinarith only [hVcard, hVle, hDA, hCC, hCA, hV'] -- ===== M5VI.lean ===== /-! M5 Part VI: A6 Theorem A (λ = 23/13, all ρ, all σ) and Corollary B (R4 LG8). -/ /-- The S-side data of Theorem A: H1° and the shifted core inequalities (Q1′), (Q2′) for `P′ = 2b + w + v + x^hi − 3h` (A6 Lemma 2.1, 2.3, Prop. 3.1, L1 II.7). -/ lemma cr_S_bounds (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (hneg : cr_W0 S < 0) (K h k z b w v xh : ℤ) (hK : K = (w23_X S 1).card) (hh : h = (cr_strip S).card) (hk : k = (cr_ord S).card) (hz : z = (w23_P S 3).card) (hb : b = (gm_type S 2 2 0 0).card) (hw : w = (gm_type S 3 2 0 0).card) (hv : v = (gm_type S 3 3 0 0).card) (hxh : xh = (cr_xhi S).card) : 3*(k+z) + 3 ≤ K + 1 ∧ (1 ≤ k + z → 9*(K+1)*((K+1)-1) + (4*(K+1)+16)*b ≤ ((K+1)+16)*(2*b+w+v+xh-3*h) ∧ 6*((K+1)+2)*b - (K+1)*((K+1)-1)*((K+1)-8) ≤ 12*(2*b+w+v+xh-3*h)) := by have hbs := cr_basic S h1 h2 have hq := hbs.1 obtain ⟨heq, hL, hm⟩ := w23_gm_general_counts S hq have he := w23_e_eq S have hmm := w23_m_eq S have hP2 := cr_P2_card S have hx := cr_x_split S have hsplit := cr_gm_mixed_card_split S hq rw [cr_ordIdx_card S hq, cr_stripIdx_card S hq] at hsplit have hmix := w23_gm_mixed_card S hq have hCC := w23_gm_CC_card S hq have hCD := w23_gm_CD_card S hq have hh0 := w23_gm_h0_card S hq rw [hP2] at hCC hCD hh0 hmix hsplit rw [← hx] at hmix hsplit obtain ⟨t, ht⟩ : ∃ t : ℤ, t = (gm_type S 4 3 0 0).card := ⟨_, rfl⟩ obtain ⟨u, hu⟩ : ∃ u : ℤ, u = (gm_type S 4 4 0 0).card := ⟨_, rfl⟩ obtain ⟨xo, hxo⟩ : ∃ xo : ℤ, xo = (cr_xord S).card := ⟨_, rfl⟩ obtain ⟨y, hy⟩ : ∃ y : ℤ, y = (gm_type S 4 1 1 0).card := ⟨_, rfl⟩ obtain ⟨f, hf⟩ : ∃ f : ℤ, f = (gm_type S 3 0 2 0).card := ⟨_, rfl⟩ obtain ⟨d, hd⟩ : ∃ d : ℤ, d = (gm_type S 4 0 2 0).card := ⟨_, rfl⟩ obtain ⟨g0, hg0⟩ : ∃ g0 : ℤ, g0 = (gm_h0 S).card := ⟨_, rfl⟩ obtain ⟨g1, hg1⟩ : ∃ g1 : ℤ, g1 = (gm_h1 S).card := ⟨_, rfl⟩ obtain ⟨j, hj⟩ : ∃ j : ℤ, j = (gm_type S 4 1 2 0).card := ⟨_, rfl⟩ obtain ⟨l, hl⟩ : ∃ l : ℤ, l = (gm_type S 4 0 3 0).card := ⟨_, rfl⟩ obtain ⟨r, hr⟩ : ∃ r : ℤ, r = (gm_type S 4 1 0 1).card := ⟨_, rfl⟩ obtain ⟨s, hs⟩ : ∃ s : ℤ, s = (gm_type S 4 0 1 1).card := ⟨_, rfl⟩ obtain ⟨wl, hwl⟩ : ∃ wl : ℤ, wl = (gm_wlow S).card := ⟨_, rfl⟩ obtain ⟨R, hR⟩ : ∃ R : ℤ, R = (n4_right S).card := ⟨_, rfl⟩ obtain ⟨ρ, hρ⟩ : ∃ ρ : ℤ, ρ = w23_rho S := ⟨_, rfl⟩ have e2 : 2*(b+w) ≤ K*(K+1) := by subst hb hw hK; exact_mod_cast w23_gm_pure_pair_card S hq have e3 : 3*(v+t) ≤ (K+2)*(b+w) := by subst hb hw hK hv ht; exact_mod_cast w23_gm_pure_triple_card S hq have e3L : 3*v ≤ (K+2)*b := by subst hb hK hv; exact_mod_cast w23_gm_pure_left_triple_card S hq have e4 : 4*u ≤ (K+3)*v := by subst hu hK hv; exact_mod_cast w23_gm_pure_quadruple_card S hq have eBCs : xh ≤ K*h := by subst hxh hK hh; exact_mod_cast cr_xhi_card S have eBCo : xo + y ≤ K*k := by subst hxo hy hK hk; exact_mod_cast cr_xord_y_card S hq have eCC : 2*(f+d) ≤ (h+k)*(h+k+1) := by subst hf hd hh hk; exact_mod_cast hCC have eBD : r ≤ K*z := by subst hr hK hz; exact_mod_cast w23_gm_BD_card S hq have eCD : s ≤ (h+k)*z := by subst hs hh hk hz; exact_mod_cast hCD have egood : g0 ≤ (h+k)*b := by subst hg0 hh hk hb; exact_mod_cast hh0 have esh : 3*(g0+g1+j+l) ≤ (h+k)*(b+wl) + (K+(h+k)+2)*(xh+xo+f) := by subst hg0 hg1 hj hl hh hk hb hwl hK hxh hxo hf; exact_mod_cast hmix have esh' : 3*(g0+g1+j+l) ≤ k*b + h*(b+wl) + (K+(h+k)+2)*(xh+xo+f) := by subst hg0 hg1 hj hl hh hk hb hwl hK hxh hxo hf; exact_mod_cast hsplit have estrip : f+g1+j+l+s ≤ ρ := by subst hf hg1 hj hl hs hρ; exact_mod_cast w23_gm_strip_card S hq have elow : wl ≤ w := by subst hwl hw; exact_mod_cast gm_wlow_card S have eR : R ≤ t+u+y+d+g0+g1+j+l+r+s := by subst hR ht hu hy hd hg0 hg1 hj hl hr hs; exact_mod_cast w23_gm_right_card S hq have hn : w23_n S = 1 + (w23_X S 1).card + (cr_strip S).card + (cr_ord S).card + (w23_P S 3).card := by omega have hdS : (w23_D S).card = w23_n S + (gm_type S 2 2 0 0).card + (gm_type S 3 2 0 0).card + (gm_type S 3 3 0 0).card + (cr_xhi S).card + (cr_xord S).card + (gm_type S 3 0 2 0).card + (n4_right S).card := by omega have hL' : S.leftCount = 4 + 3*(w23_X S 1).card + 2*((cr_strip S).card + (cr_ord S).card) + (w23_P S 3).card + 2*(gm_type S 2 2 0 0).card + (gm_type S 3 2 0 0).card + (gm_type S 3 3 0 0).card + (cr_xhi S).card + (cr_xord S).card + (gm_type S 3 0 2 0).card := by omega have eneg : (1+K+h+k+z)*(4+3*K+2*(h+k)+z+2*b+w+v+xh+xo+f) - 4*(1+K+h+k+z+b+w+v+xh+xo+f+R) + ρ < 0 := by have hnz : (w23_n S : ℤ) = 1+K+h+k+z := by subst hK hh hk hz; rw [hn]; push_cast; ring have hdz : ((w23_D S).card : ℤ) = 1+K+h+k+z+b+w+v+xh+xo+f+R := by subst hK hh hk hz hb hw hv hxh hxo hf hR; rw [hdS, hn]; push_cast; ring have hlz : (S.leftCount : ℤ) = 4+3*K+2*(h+k)+z+2*b+w+v+xh+xo+f := by subst hK hh hk hz hb hw hv hxh hxo hf; rw [hL']; push_cast; ring have h0 := hneg unfold cr_W0 at h0 rw [hnz, hdz, hlz, ← hρ] at h0 linarith have hK0 : 0 ≤ K := by subst hK; exact Int.natCast_nonneg _ have hh0' : 0 ≤ h := by subst hh; exact Int.natCast_nonneg _ have hk0 : 0 ≤ k := by subst hk; exact Int.natCast_nonneg _ have hz0 : 0 ≤ z := by subst hz; exact Int.natCast_nonneg _ have hb0 : 0 ≤ b := by subst hb; exact Int.natCast_nonneg _ have hw0 : 0 ≤ w := by subst hw; exact Int.natCast_nonneg _ have hv0 : 0 ≤ v := by subst hv; exact Int.natCast_nonneg _ have ht0 : 0 ≤ t := by subst ht; exact Int.natCast_nonneg _ have hu0 : 0 ≤ u := by subst hu; exact Int.natCast_nonneg _ have hxh0 : 0 ≤ xh := by subst hxh; exact Int.natCast_nonneg _ have hxo0 : 0 ≤ xo := by subst hxo; exact Int.natCast_nonneg _ have hy0 : 0 ≤ y := by subst hy; exact Int.natCast_nonneg _ have hf0 : 0 ≤ f := by subst hf; exact Int.natCast_nonneg _ have hd0 : 0 ≤ d := by subst hd; exact Int.natCast_nonneg _ have hg00 : 0 ≤ g0 := by subst hg0; exact Int.natCast_nonneg _ have hg10 : 0 ≤ g1 := by subst hg1; exact Int.natCast_nonneg _ have hj0 : 0 ≤ j := by subst hj; exact Int.natCast_nonneg _ have hl0 : 0 ≤ l := by subst hl; exact Int.natCast_nonneg _ have hr0 : 0 ≤ r := by subst hr; exact Int.natCast_nonneg _ have hs0 : 0 ≤ s := by subst hs; exact Int.natCast_nonneg _ have hwl0 : 0 ≤ wl := by subst hwl; exact Int.natCast_nonneg _ exact cr_S_arith K h k z b w v t u xh xo y f d g0 g1 j l r s wl R ρ hK0 hh0' hk0 hz0 hb0 hw0 hv0 ht0 hu0 hxh0 hxo0 hy0 hf0 hd0 hg00 hg10 hj0 hl0 hr0 hs0 hwl0 e2 e3 e3L e4 eBCs eBCo eCC eBD eCD egood (by linarith) (by linarith) estrip elow eR eneg /-- The total fibre inequality (A6 (4.1), Theorem A fibre part; `k ≥ 0`). -/ lemma cr_fib_total (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (a0 h k b Q sr sm : ℤ) (ha0 : a0 = (w23_X S 1).card + 1) (hh : h = (cr_strip S).card) (hk : k = (cr_ord S).card) (hbdef : b = (gm_type S 2 2 0 0).card) (hsr : sr = ∑ c ∈ cr_ord S, ((cr_fib S c).card : ℤ)) (hsm : sm = ∑ c ∈ cr_ord S, ((min (2 * cr_b0 S) ((cr_fib S c).card * ((cr_fib S c).card + 1)) : ℕ) : ℤ)) (ha6 : 6 ≤ a0) (hk3 : 3*k + 3 ≤ a0) (hQ1 : 9*a0*(a0-1) + (4*a0+16)*b ≤ (a0+16)*(2*b+Q-3*h)) (hQ2 : 6*(a0+2)*b - a0*(a0-1)*(a0-8) ≤ 12*(2*b+Q-3*h)) : 0 ≤ k*(26*(2*b+Q-h) - 46*(a0+h) - 49*(k+1)) + (26*((a0+h)+k)+150)*sr - 75*sm + 150*(cr_R S : ℤ) := by classical by_cases hk0 : (cr_ord S).card = 0 · rw [Finset.card_eq_zero] at hk0 have hR : cr_R S = 0 := by unfold cr_R; rw [hk0]; simp rw [hk, hsr, hsm, hk0, hR] simp have hk1 : 1 ≤ k := by have := Nat.pos_of_ne_zero hk0 subst hk; exact_mod_cast this have hb0 : (cr_b0 S : ℤ) ≤ a0 + b := by have := cr_b0_le S h1 h2 subst ha0 hbdef; push_cast; exact_mod_cast this have hb0' : 0 ≤ b := by subst hbdef; exact Int.natCast_nonneg _ have hh0 : 0 ≤ h := by subst hh; exact Int.natCast_nonneg _ let f : ℕ → ℤ := fun c => 26*(2*b+Q-h) - 46*(a0+h) - 49*(k+1) + 2*(13*(a0+h)+13*k+75)*((cr_fib S c).card : ℤ) - 75 * min (2*(cr_b0 S : ℤ)) (((cr_fib S c).card : ℤ)*(((cr_fib S c).card : ℤ)+1)) have hsum := cr_fibre_sum (cr_ord S) (fun c => (cr_fib S c).card) f (cr_R S) (cr_zero_fibres S h1 h2) (by intro c hc have hra : ((cr_fib S c).card : ℤ) ≤ a0 := by have := cr_fib_card_le S h1 h2 hc subst ha0; exact_mod_cast this have := cr_fibre_arith a0 h k b (cr_b0 S) Q ((cr_fib S c).card) ha6 hh0 hk1 hk3 hb0' hb0 (Int.natCast_nonneg _) hra hQ1 hQ2 simp only [f] by_cases hr0 : (cr_fib S c).card = 0 · simp only [hr0, if_true, Nat.cast_zero] at this ⊢ exact this · have hr0' : ((cr_fib S c).card : ℤ) ≠ 0 := by exact_mod_cast hr0 simp only [hr0, if_false, hr0'] at this ⊢ exact this) have hmin : ∀ c, (((min (2 * cr_b0 S) ((cr_fib S c).card * ((cr_fib S c).card + 1))) : ℕ) : ℤ) = min (2*(cr_b0 S : ℤ)) (((cr_fib S c).card : ℤ)*(((cr_fib S c).card : ℤ)+1)) := by intro c rw [Nat.cast_min] push_cast rfl have hf : ∑ c ∈ cr_ord S, f c = k*(26*(2*b+Q-h) - 46*(a0+h) - 49*(k+1)) + (26*((a0+h)+k)+150)*sr - 75*sm := by rw [hsr, hsm, Finset.sum_congr rfl (fun c _ => hmin c)] simp only [f] rw [Finset.sum_sub_distrib, Finset.sum_add_distrib, Finset.sum_const, ← Finset.mul_sum, ← Finset.mul_sum, nsmul_eq_mul, ← hk] ring rw [hf] at hsum linarith /-- A6 Theorem A at λ = 23/13 (all ρ, all σ): `23 (d_S − d_T) ≤ 13 (W₀(S) − W₀(T°))`. -/ theorem cr_thmA (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (hCD : (cr_ord S).Nonempty ∨ (w23_P S 3).Nonempty) (hneg : cr_W0 S < 0) : 23 * (((w23_D S).card : ℤ) - (w23_D (cr_core S)).card) ≤ 13 * (cr_W0 S - cr_W0 (cr_core S)) := by classical have hbs := cr_basic S h1 h2 have hq := hbs.1 have hmc : S.multiplicity < S.conductor := by omega obtain ⟨K, hK⟩ : ∃ K : ℤ, K = (w23_X S 1).card := ⟨_, rfl⟩ obtain ⟨hh, hhh⟩ : ∃ hh : ℤ, hh = (cr_strip S).card := ⟨_, rfl⟩ obtain ⟨k, hk⟩ : ∃ k : ℤ, k = (cr_ord S).card := ⟨_, rfl⟩ obtain ⟨z, hz⟩ : ∃ z : ℤ, z = (w23_P S 3).card := ⟨_, rfl⟩ obtain ⟨b, hb⟩ : ∃ b : ℤ, b = (gm_type S 2 2 0 0).card := ⟨_, rfl⟩ obtain ⟨w, hw⟩ : ∃ w : ℤ, w = (gm_type S 3 2 0 0).card := ⟨_, rfl⟩ obtain ⟨v, hv⟩ : ∃ v : ℤ, v = (gm_type S 3 3 0 0).card := ⟨_, rfl⟩ obtain ⟨xh, hxh⟩ : ∃ xh : ℤ, xh = (cr_xhi S).card := ⟨_, rfl⟩ obtain ⟨hH1, hQ⟩ := cr_S_bounds S h1 h2 hneg K hh k z b w v xh hK hhh hk hz hb hw hv hxh have hk0 : 0 ≤ k := by subst hk; exact Int.natCast_nonneg _ have hz0 : 0 ≤ z := by subst hz; exact Int.natCast_nonneg _ have hh0 : 0 ≤ hh := by subst hhh; exact Int.natCast_nonneg _ have hb0 : 0 ≤ b := by subst hb; exact Int.natCast_nonneg _ have hkz : 1 ≤ k + z := by rcases hCD with h | h · have := h.card_pos have : (1:ℤ) ≤ k := by subst hk; exact_mod_cast this linarith · have := h.card_pos have : (1:ℤ) ≤ z := by subst hz; exact_mod_cast this linarith obtain ⟨hQ1, hQ2⟩ := hQ hkz have ha6 : 6 ≤ K + 1 := by linarith have hk3 : 3*k + 3 ≤ K + 1 := by linarith have hQ1' : 9*(K+1)*((K+1)-1) + (4*(K+1)+16)*b ≤ ((K+1)+16)*(2*b+(w+v+xh)-3*hh) := by linarith have hQ2' : 6*((K+1)+2)*b - (K+1)*((K+1)-1)*((K+1)-8) ≤ 12*(2*b+(w+v+xh)-3*hh) := by linarith have hst : 0 ≤ z * (13*(1 + (2*b+(w+v+xh)-hh) + 2*k + z) - 23*((K+1)+hh)) := mul_nonneg hz0 (cr_stage2_arith (K+1) hh k z b (w+v+xh) ha6 hh0 hk0 hz0 hb0 hQ1') -- counts obtain ⟨heq, hL, hm⟩ := w23_gm_general_counts S hq have he := w23_e_eq S have hmm := w23_m_eq S have hP2 := cr_P2_card S have hnS : (w23_n S : ℤ) = ((K+1)+hh) + k + z := by have : w23_n S = 1 + (w23_X S 1).card + (cr_strip S).card + (cr_ord S).card + (w23_P S 3).card := by omega rw [this, hK, hhh, hk, hz]; push_cast; ring have hnT : (w23_n (cr_core S) : ℤ) = (K+1)+hh := by rw [cr_core_n, cr_A_card S h1 h2, hK, hhh]; push_cast; ring have hlT : 1 + 3*((K+1)+hh) + (2*b+(w+v+xh)-hh) ≤ ((cr_core S).leftCount : ℤ) := by have := cr_core_leftCount_ge S h1 h2 have h' : ((4 + 3*(w23_X S 1).card + 2*((cr_strip S).card + (gm_type S 2 2 0 0).card) + ((gm_type S 3 2 0 0).card + (gm_type S 3 3 0 0).card + (cr_xhi S).card) : ℕ) : ℤ) ≤ ((cr_core S).leftCount : ℤ) := by exact_mod_cast this push_cast at h' subst hK hhh hb hw hv hxh linarith obtain ⟨sr, hsr⟩ : ∃ sr : ℤ, sr = ∑ c ∈ cr_ord S, ((cr_fib S c).card : ℤ) := ⟨_, rfl⟩ obtain ⟨sm, hsm⟩ : ∃ sm : ℤ, sm = ∑ c ∈ cr_ord S, ((min (2 * cr_b0 S) ((cr_fib S c).card * ((cr_fib S c).card + 1)) : ℕ) : ℤ) := ⟨_, rfl⟩ have hlS : ((cr_core S).leftCount : ℤ) + k + sr + z ≤ S.leftCount := by have := cr_leftCount_bridge S h1 h2 have h' : (((cr_core S).leftCount + (cr_ord S).card + ∑ c ∈ cr_ord S, (cr_fib S c).card + (w23_P S 3).card : ℕ) : ℤ) ≤ (S.leftCount : ℤ) := by exact_mod_cast this push_cast at h' subst hk hz hsr linarith have hright : 2*(((w23_D S).card : ℤ) + sr + (cr_R S : ℤ)) ≤ 2*((w23_D (cr_core S)).card : ℤ) + 2*((K+1)+hh)*k + k*(k+1) + sm + 2*((K+1)+hh)*z := by have := cr_right_bridge S h1 h2 rw [cr_A_card S h1 h2] at this have h' : ((2 * ((w23_D S).card + ∑ c ∈ cr_ord S, (cr_fib S c).card + cr_R S) : ℕ) : ℤ) ≤ ((2 * (w23_D (cr_core S)).card + 2 * ((w23_X S 1).card + 1 + (cr_strip S).card) * (cr_ord S).card + (cr_ord S).card * ((cr_ord S).card + 1) + ∑ c ∈ cr_ord S, min (2 * cr_b0 S) ((cr_fib S c).card * ((cr_fib S c).card + 1)) + 2 * ((w23_X S 1).card + 1 + (cr_strip S).card) * (w23_P S 3).card : ℕ) : ℤ) := by exact_mod_cast this push_cast at h' subst hK hhh hk hz hsr hsm push_cast linarith have hfib' := cr_fib_total S h1 h2 (K+1) hh k b (w+v+xh) sr sm (by rw [hK]) hhh hk hb hsr hsm ha6 hk3 hQ1' hQ2' have hsr0 : 0 ≤ sr := by subst hsr; exact Finset.sum_nonneg (fun c _ => Int.natCast_nonneg _) have hres := cr_thmA_arith ((K+1)+hh) k z (cr_core S).leftCount S.leftCount (w23_n (cr_core S)) (w23_n S) (w23_D S).card (w23_D (cr_core S)).card sr (cr_R S) sm (2*b+(w+v+xh)-hh) hnT hnS hlS hlT (by linarith) hk0 hz0 hsr0 hright hfib' hst unfold cr_W0 rw [cr_core_rho S hmc] linarith /-- CORE°_{23/13} on inherited generalized cores (R4 REPORT §5, L1 §2). -/ def cr_CORE : Prop := ∀ T : NumericalSemigroup, cr_CoreHyp T → cr_W0 T < 0 → 0 ≤ 13 * cr_W0 T + 23 * (w23_pq T : ℤ) /-- A6 Corollary B restricted to the Lean residual: CORE° ⇒ Wilf. -/ theorem cr_core_reduction (hcore : cr_CORE) (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (hsmall : 1 < ((w23_X S 1).filter (fun a => 3*a < S.conductor+S.multiplicity)).card) (hK4 : 4 ≤ (w23_X S 1).card) (hpop : 3 * ((w23_X S 1).filter (fun a => 2 * a + w23_rho S < 3 * S.multiplicity)).card * (((w23_X S 1).filter (fun a => 2 * a + w23_rho S < 3 * S.multiplicity)).card + 1) < (w23_X S 1).card * ((w23_X S 1).card - 1)) (hh3 : 3 ≤ ((w23_X S 1).filter (fun a => 3 * S.multiplicity ≤ 2 * a + w23_rho S)).card) : S.SatisfiesWilf := by classical have hb := cr_basic S h1 h2 have hq := hb.1 have hmc : S.multiplicity < S.conductor := by omega obtain ⟨_, hL, _⟩ := w23_gm_general_counts S hq have hl6 : 6 ≤ S.leftCount := by omega by_cases hW : 0 ≤ cr_W0 S · exact cr_wilf_of_W0_nonneg S hq hW have hneg : cr_W0 S < 0 := lt_of_not_ge hW apply cr_wilf_of_F S hq hl6 by_cases hCD : (cr_ord S).Nonempty ∨ (w23_P S 3).Nonempty · have hA := cr_thmA S h1 h2 hCD hneg have hDsub := Finset.card_le_card (cr_core_D_subset S hmc) have hDsub' : ((w23_D (cr_core S)).card : ℤ) ≤ (w23_D S).card := by exact_mod_cast hDsub have hT : cr_W0 (cr_core S) < 0 := by linarith have hc := hcore (cr_core S) (cr_core_inherits S h1 h2 hsmall hK4 hpop hh3) hT have hmS := w23_m_eq S have hmT := w23_m_eq (cr_core S) rw [cr_core_multiplicity S hmc] at hmT have hmS' : (S.multiplicity : ℤ) = w23_pq S + (w23_D S).card := by exact_mod_cast hmS have hmT' : (S.multiplicity : ℤ) = w23_pq (cr_core S) + (w23_D (cr_core S)).card := by exact_mod_cast hmT linarith · push Not at hCD have hgc : cr_IsGenCore S := by intro a hp hlt have hlv := (w23_lt_conductor_iff S a).1 hlt have hl1 := w23_primitive_level_pos S hp by_contra h2m rcases (show w23_level S a = 1 ∨ w23_level S a = 2 ∨ w23_level S a = 3 by omega) with hl | hl | hl · have := ((w23_level_eq_iff S a 1).1 hl).2 omega · have hmem : a ∈ cr_ord S := (cr_mem_ord S a).2 ⟨hp, hl, by omega⟩ rw [hCD.1] at hmem simp at hmem · have hmem : a ∈ w23_P S 3 := (w23_mem_P S 3 a).2 ⟨hp, hl⟩ rw [hCD.2] at hmem simp at hmem exact hcore S ⟨h1, h2, hgc, hsmall, hK4, hpop, hh3⟩ hneg -- ===== M1L.lean ===== /-! M1 (part L): the window model of a generalized core (BLUEPRINT2 D1, D3) and the LINK lemma (M1.4). A model is `(m, ρ, B)` with offsets `B ⊆ [1, m)`; it stands for the semigroup `⟨m, m + b : b ∈ B⟩ ∪ [4m − ρ, ∞)`. Positions are shifted window coordinates `u = x + ρ ∈ [0, m)`; an element `v` sits at position `(v + ρ) % m` and has level `(v + ρ) / m`. A sum of `t` generators `t·m + s` (`s ∈ t • ({0} ∪ B)`) has level `t + (s + ρ)/m`. -/ /-- Level model (D3): the positions carrying an element of level `≤ k` of `⟨m, m + b : b ∈ B⟩`. -/ noncomputable def wm_B (m ρ : ℕ) (B : Finset ℕ) (k : ℕ) : Finset ℕ := by classical exact (Finset.range (k + 1)).biUnion (fun t => ((t • insert 0 B).filter (fun s => t + (s + ρ) / m ≤ k)).image (fun s => (s + ρ) % m)) lemma wm_mem_B (m ρ : ℕ) (B : Finset ℕ) (k u : ℕ) : u ∈ wm_B m ρ B k ↔ ∃ t s, s ∈ t • insert 0 B ∧ t + (s + ρ) / m ≤ k ∧ (s + ρ) % m = u := by classical unfold wm_B simp only [Finset.mem_biUnion, Finset.mem_range, Finset.mem_image, Finset.mem_filter] constructor · rintro ⟨t, _, s, ⟨hs, hk⟩, rfl⟩ exact ⟨t, s, hs, hk, rfl⟩ · rintro ⟨t, s, hs, hk, rfl⟩ exact ⟨t, Nat.lt_succ_of_le (le_trans (Nat.le_add_right t _) hk), s, ⟨hs, hk⟩, rfl⟩ /-- Window offsets (`b + ρ < m`, i.e. `b < N`) and strip offsets (`m ≤ b + ρ`). -/ noncomputable def wm_win (m ρ : ℕ) (B : Finset ℕ) : Finset ℕ := by classical exact B.filter (fun b => b + ρ < m) noncomputable def wm_strip (m ρ : ℕ) (B : Finset ℕ) : Finset ℕ := by classical exact B.filter (fun b => m ≤ b + ρ) lemma wm_mem_win (m ρ : ℕ) (B : Finset ℕ) (b : ℕ) : b ∈ wm_win m ρ B ↔ b ∈ B ∧ b + ρ < m := by classical unfold wm_win exact Finset.mem_filter /-- `ℓ`, `d`, `p`, `W₀` of the model. -/ noncomputable def wm_ell (m ρ : ℕ) (B : Finset ℕ) : ℕ := ∑ k ∈ Finset.range 4, (wm_B m ρ B k).card noncomputable def wm_d (m ρ : ℕ) (B : Finset ℕ) : ℕ := (wm_B m ρ B 4).card noncomputable def wm_p (m ρ : ℕ) (B : Finset ℕ) : ℤ := (m : ℤ) - wm_d m ρ B noncomputable def wm_W0 (m ρ : ℕ) (B : Finset ℕ) : ℤ := ((B.card : ℤ) + 1) * wm_ell m ρ B - 4 * wm_d m ρ B + ρ /-- Residual hypotheses on the window offsets `O` (GAP-1): `hsmall`, `K ≥ 4`, `hpop`, `h ≥ 3`. -/ def wm_Residual (m ρ : ℕ) (O : Finset ℕ) : Prop := 1 < (O.filter (fun b => 3 * b + ρ < 2 * m)).card ∧ 4 ≤ O.card ∧ 3 * (O.filter (fun b => 2 * b + ρ < m)).card * ((O.filter (fun b => 2 * b + ρ < m)).card + 1) < O.card * (O.card - 1) ∧ 3 ≤ (O.filter (fun b => m ≤ 2 * b + ρ)).card /-! ### Pure model lemmas -/ lemma wm_nsmul_zero_mono {H : Finset ℕ} (h0 : 0 ∈ H) {t s : ℕ} (hs : s ∈ t • H) (e : ℕ) : s ∈ (t + e) • H := by induction e with | zero => simpa using hs | succ e ih => rw [← add_assoc, succ_nsmul] exact Finset.mem_add.2 ⟨s, ih, 0, h0, by simp⟩ lemma wm_nsmul_le {H : Finset ℕ} {m : ℕ} (hH : ∀ h ∈ H, h < m) (t : ℕ) : ∀ s, s ∈ t • H → s + t ≤ t * m := by induction t with | zero => intro s hs have : s = 0 := by simpa using hs simp [this] | succ t ih => intro s hs rw [succ_nsmul] at hs obtain ⟨y, hy, a, ha, rfl⟩ := Finset.mem_add.1 hs have h1 := ih y hy have h2 := hH a ha rw [Nat.succ_mul] omega lemma wm_nsmul_add {H : Finset ℕ} {t1 t2 s1 s2 : ℕ} (h1 : s1 ∈ t1 • H) (h2 : s2 ∈ t2 • H) : s1 + s2 ∈ (t1 + t2) • H := by rw [add_nsmul] exact Finset.mem_add.2 ⟨s1, h1, s2, h2, rfl⟩ lemma wm_B_spec {m ρ : ℕ} {B : Finset ℕ} {k u : ℕ} (hm : 0 < m) (hu : u ∈ wm_B m ρ B k) : u < m ∧ ∃ t s, s ∈ t • insert 0 B ∧ k * m + u = t * m + s + ρ := by obtain ⟨t, s, hs, hk, rfl⟩ := (wm_mem_B m ρ B k u).1 hu refine ⟨Nat.mod_lt _ hm, ?_⟩ obtain ⟨e, he⟩ := Nat.exists_eq_add_of_le hk refine ⟨t + e, s, wm_nsmul_zero_mono (Finset.mem_insert_self 0 B) hs e, ?_⟩ have hdm := Nat.div_add_mod' (s + ρ) m rw [he] generalize (s + ρ) / m = j at hdm ⊢ generalize (s + ρ) % m = r at hdm ⊢ nlinarith lemma wm_B_of_sum {m ρ : ℕ} {B : Finset ℕ} {k u t s : ℕ} (hm : 0 < m) (hs : s ∈ t • insert 0 B) (hu : u < m) (he : k * m + u = t * m + s + ρ) : u ∈ wm_B m ρ B k := by have htk : t ≤ k := by by_contra hn have := Nat.mul_le_mul_right m (show k + 1 ≤ t by omega) rw [Nat.add_mul, Nat.one_mul] at this omega obtain ⟨e, rfl⟩ := Nat.exists_eq_add_of_le htk have hse : s + ρ = u + e * m := by rw [Nat.add_mul] at he omega refine (wm_mem_B m ρ B (t + e) u).2 ⟨t, s, hs, ?_, ?_⟩ · rw [hse, Nat.add_mul_div_right _ _ hm, Nat.div_eq_of_lt hu] omega · rw [hse, Nat.add_mul_mod_self_right, Nat.mod_eq_of_lt hu] lemma wm_B_sub_range {m ρ : ℕ} {B : Finset ℕ} (hm : 0 < m) (k : ℕ) : wm_B m ρ B k ⊆ Finset.range m := fun _ hu => Finset.mem_range.2 (wm_B_spec hm hu).1 lemma wm_p_nonneg {m ρ : ℕ} {B : Finset ℕ} (hm : 0 < m) : 0 ≤ wm_p m ρ B := by have := Finset.card_le_card (wm_B_sub_range (ρ := ρ) (B := B) hm 4) rw [Finset.card_range] at this unfold wm_p wm_d omega /-! ### The semigroup side -/ /-- Offsets of a semigroup: `b ∈ [1, m)` with `m + b ∈ T`. -/ noncomputable def wm_offsets (T : NumericalSemigroup) : Finset ℕ := by classical exact (Finset.range T.multiplicity).filter (fun b => 0 < b ∧ T.multiplicity + b ∈ T.carrier) lemma wm_mem_offsets (T : NumericalSemigroup) (b : ℕ) : b ∈ wm_offsets T ↔ 0 < b ∧ b < T.multiplicity ∧ T.multiplicity + b ∈ T.carrier := by classical unfold wm_offsets rw [Finset.mem_filter, Finset.mem_range] tauto lemma wm_mem_crA (T : NumericalSemigroup) (h : 2 * T.multiplicity ≤ T.conductor) (x : ℕ) : x ∈ cr_A T ↔ ∃ b ∈ insert 0 (wm_offsets T), x = T.multiplicity + b := by constructor · intro hx obtain ⟨hp, _, h2m⟩ := (cr_mem_A T x).1 hx have hm := T.multiplicity_le hp.2.1 hp.1 refine ⟨x - T.multiplicity, ?_, by omega⟩ by_cases h0 : x = T.multiplicity · rw [h0, Nat.sub_self] exact Finset.mem_insert_self _ _ · apply Finset.mem_insert_of_mem rw [wm_mem_offsets] refine ⟨by omega, by omega, ?_⟩ rw [show T.multiplicity + (x - T.multiplicity) = x by omega] exact hp.1 · rintro ⟨b, hb, rfl⟩ have hm := T.multiplicity_pos rcases Finset.mem_insert.1 hb with hb0 | hb · subst hb0 simpa using cr_multiplicity_mem_A T (by omega) · obtain ⟨hb0, hbm, hmem⟩ := (wm_mem_offsets T b).1 hb rw [cr_mem_A] refine ⟨⟨hmem, by omega, ?_⟩, by omega, by omega⟩ intro y z hy hz he by_contra hne push Not at hne have := T.multiplicity_le (Nat.pos_of_ne_zero hne.1) hy have := T.multiplicity_le (Nat.pos_of_ne_zero hne.2) hz omega lemma wm_nsmul_shift {A H : Finset ℕ} {m : ℕ} (hA : ∀ x, x ∈ A ↔ ∃ h ∈ H, x = m + h) : ∀ (t x : ℕ), x ∈ t • A ↔ ∃ s ∈ t • H, x = t * m + s := by intro t induction t with | zero => intro x simp only [zero_nsmul, Finset.mem_zero, zero_mul, zero_add] constructor · intro hx exact ⟨0, rfl, hx⟩ · rintro ⟨s, hs, rfl⟩ exact hs | succ t ih => intro x rw [succ_nsmul, succ_nsmul] constructor · intro hx obtain ⟨y, hy, a, ha, rfl⟩ := Finset.mem_add.1 hx obtain ⟨s, hs, rfl⟩ := (ih y).1 hy obtain ⟨h, hh, rfl⟩ := (hA a).1 ha exact ⟨s + h, Finset.mem_add.2 ⟨s, hs, h, hh, rfl⟩, by ring⟩ · rintro ⟨s', hs', rfl⟩ obtain ⟨s, hs, h, hh, rfl⟩ := Finset.mem_add.1 hs' exact Finset.mem_add.2 ⟨t * m + s, (ih _).2 ⟨s, hs, rfl⟩, m + h, (hA _).2 ⟨h, hh, rfl⟩, by ring⟩ lemma wm_low_A_eq (T : NumericalSemigroup) (hgc : cr_IsGenCore T) : w23_low_A T = cr_A T := by ext a rw [w23_low_mem_A, cr_mem_A] constructor · rintro ⟨hp, hc⟩ exact ⟨hp, hc, hgc a hp hc⟩ · rintro ⟨hp, hc, _⟩ exact ⟨hp, hc⟩ lemma wm_elem_repr (T : NumericalSemigroup) (h1 : 3 * T.multiplicity < T.conductor) (hgc : cr_IsGenCore T) {x : ℕ} (hx : x ∈ T.carrier) (hxc : x < T.conductor) : ∃ t s, s ∈ t • insert 0 (wm_offsets T) ∧ x = t * T.multiplicity + s := by obtain ⟨t, ht⟩ := w23_low_left_repr T x ((T.mem_leftElements x).2 ⟨hxc, hx⟩) rw [wm_low_A_eq T hgc] at ht obtain ⟨s, hs, he⟩ := (wm_nsmul_shift (wm_mem_crA T (by omega)) t x).1 ht exact ⟨t, s, hs, he⟩ lemma wm_sum_mem (T : NumericalSemigroup) (h1 : 3 * T.multiplicity < T.conductor) {t s : ℕ} (hs : s ∈ t • insert 0 (wm_offsets T)) : t * T.multiplicity + s ∈ T.carrier := cr_nsmul_carrier T t _ ((wm_nsmul_shift (wm_mem_crA T (by omega)) t _).2 ⟨s, hs, rfl⟩) /-- LINK, levels `k ≤ 3`: position `u` carries an element of level `≤ k` iff the element `k·m + u − ρ` lies in `T`. -/ lemma wm_link_mem (T : NumericalSemigroup) (h1 : 3 * T.multiplicity < T.conductor) (h2 : T.conductor ≤ 4 * T.multiplicity) (hgc : cr_IsGenCore T) {k u : ℕ} (hk : k ≤ 3) (hu : u < T.multiplicity) (hρ : w23_rho T ≤ k * T.multiplicity + u) : u ∈ wm_B T.multiplicity (w23_rho T) (wm_offsets T) k ↔ k * T.multiplicity + u - w23_rho T ∈ T.carrier := by obtain ⟨_, hc, hρm, hm2⟩ := cr_basic T h1 h2 constructor · intro hB obtain ⟨_, t, s, hs, he⟩ := wm_B_spec (by omega) hB rw [show k * T.multiplicity + u - w23_rho T = t * T.multiplicity + s by omega] exact wm_sum_mem T h1 hs · intro hx have hkm : k * T.multiplicity ≤ 3 * T.multiplicity := Nat.mul_le_mul_right _ hk obtain ⟨t, s, hs, he⟩ := wm_elem_repr T h1 hgc hx (by omega) exact wm_B_of_sum (by omega) hs hu (by omega) /-- LINK, level 4: position `u` is in `B₄` iff the element `4m + u − ρ ∈ [c, c + m)` is decomposable. -/ lemma wm_link_mem4 (T : NumericalSemigroup) (h1 : 3 * T.multiplicity < T.conductor) (h2 : T.conductor ≤ 4 * T.multiplicity) (hgc : cr_IsGenCore T) {u : ℕ} (hu : u < T.multiplicity) : u ∈ wm_B T.multiplicity (w23_rho T) (wm_offsets T) 4 ↔ ¬ T.IsPrimitive (4 * T.multiplicity + u - w23_rho T) := by obtain ⟨_, hc, hρm, hm2⟩ := cr_basic T h1 h2 constructor · intro hB hp obtain ⟨_, t, s, hs, he⟩ := wm_B_spec (by omega) hB have hle := wm_nsmul_le (H := insert 0 (wm_offsets T)) (m := T.multiplicity) (fun h hh => by rcases Finset.mem_insert.1 hh with h0 | h0 · omega · exact ((wm_mem_offsets T h).1 h0).2.1) t s hs have ht2 : 2 ≤ t := by by_contra hn have := Nat.mul_le_mul_right T.multiplicity (show t ≤ 1 by omega) omega obtain ⟨t', rfl⟩ : ∃ t', t = t' + 1 + 1 := ⟨t - 2, by omega⟩ rw [succ_nsmul] at hs obtain ⟨s', hs', h, hh, rfl⟩ := Finset.mem_add.1 hs have hy' := wm_sum_mem T h1 hs' have ha : 1 * T.multiplicity + h ∈ T.carrier := wm_sum_mem T h1 (by simpa using hh) have hm1 : T.multiplicity ≤ (t' + 1) * T.multiplicity := Nat.le_mul_of_pos_left _ (by omega) have hexp : (t' + 1 + 1) * T.multiplicity = (t' + 1) * T.multiplicity + T.multiplicity := by ring rcases hp.2.2 _ _ hy' ha (by rw [Nat.one_mul]; omega) with h0 | h0 · omega · omega · intro hnp have hy : 4 * T.multiplicity + u - w23_rho T ∈ T.carrier := T.conductor_spec _ (by omega) obtain ⟨a, b, ha, hb, ha0, hb0, he⟩ := w23_decomposable_eq_add T hy hnp (by omega) (by omega) obtain ⟨haL, haS⟩ := (T.mem_leftElements a).1 ha obtain ⟨hbL, hbS⟩ := (T.mem_leftElements b).1 hb obtain ⟨t1, s1, hs1, he1⟩ := wm_elem_repr T h1 hgc haS haL obtain ⟨t2, s2, hs2, he2⟩ := wm_elem_repr T h1 hgc hbS hbL refine wm_B_of_sum (t := t1 + t2) (s := s1 + s2) (by omega) (wm_nsmul_add hs1 hs2) hu ?_ rw [Nat.add_mul] omega /-! ### Counting: ℓ, d, n, p and the window -/ lemma wm_level_fibre_card (T : NumericalSemigroup) (h1 : 3 * T.multiplicity < T.conductor) (h2 : T.conductor ≤ 4 * T.multiplicity) (hgc : cr_IsGenCore T) {k : ℕ} (hk : k ≤ 3) : (T.leftElements.filter (fun x => (x + w23_rho T) / T.multiplicity = k)).card = (wm_B T.multiplicity (w23_rho T) (wm_offsets T) k).card := by classical obtain ⟨_, hc, hρm, hm2⟩ := cr_basic T h1 h2 have hkm : k * T.multiplicity ≤ 3 * T.multiplicity := Nat.mul_le_mul_right _ hk apply Finset.card_nbij' (fun x => (x + w23_rho T) % T.multiplicity) (fun u => k * T.multiplicity + u - w23_rho T) · intro x hx simp only [Finset.coe_filter, Set.mem_ofPred_eq] at hx obtain ⟨hxL, hxk⟩ := hx obtain ⟨hxc, hxS⟩ := (T.mem_leftElements x).1 hxL have hdm := Nat.div_add_mod' (x + w23_rho T) T.multiplicity rw [hxk] at hdm have hlt := Nat.mod_lt (x + w23_rho T) (show 0 < T.multiplicity by omega) simp only [Finset.mem_coe] apply (wm_link_mem T h1 h2 hgc hk hlt (by omega)).2 rw [show k * T.multiplicity + (x + w23_rho T) % T.multiplicity - w23_rho T = x by omega] exact hxS · intro u hu simp only [Finset.mem_coe] at hu obtain ⟨hum, t, s, hs, he⟩ := wm_B_spec (by omega) hu have hmem := (wm_link_mem T h1 h2 hgc hk hum (by omega)).1 hu simp only [Finset.coe_filter, Set.mem_ofPred_eq] refine ⟨(T.mem_leftElements _).2 ⟨by omega, hmem⟩, ?_⟩ rw [show k * T.multiplicity + u - w23_rho T + w23_rho T = u + k * T.multiplicity by omega, Nat.add_mul_div_right _ _ (by omega), Nat.div_eq_of_lt hum, Nat.zero_add] · intro x hx simp only [Finset.coe_filter, Set.mem_ofPred_eq] at hx have hdm := Nat.div_add_mod' (x + w23_rho T) T.multiplicity rw [hx.2] at hdm show k * T.multiplicity + (x + w23_rho T) % T.multiplicity - w23_rho T = x omega · intro u hu simp only [Finset.mem_coe] at hu obtain ⟨hum, t, s, hs, he⟩ := wm_B_spec (by omega) hu show (k * T.multiplicity + u - w23_rho T + w23_rho T) % T.multiplicity = u rw [show k * T.multiplicity + u - w23_rho T + w23_rho T = u + k * T.multiplicity by omega, Nat.add_mul_mod_self_right, Nat.mod_eq_of_lt hum] theorem wm_link_leftCount (T : NumericalSemigroup) (h1 : 3 * T.multiplicity < T.conductor) (h2 : T.conductor ≤ 4 * T.multiplicity) (hgc : cr_IsGenCore T) : T.leftCount = wm_ell T.multiplicity (w23_rho T) (wm_offsets T) := by classical obtain ⟨_, hc, hρm, hm2⟩ := cr_basic T h1 h2 have hmap : Set.MapsTo (fun x => (x + w23_rho T) / T.multiplicity) (T.leftElements : Set ℕ) (Finset.range 4 : Set ℕ) := by intro x hx obtain ⟨hxc, _⟩ := (T.mem_leftElements x).1 (Finset.mem_coe.1 hx) simp only [Finset.coe_range, Set.mem_Iio] exact (Nat.div_lt_iff_lt_mul (by omega)).2 (by omega) unfold NumericalSemigroup.leftCount wm_ell rw [Finset.card_eq_sum_card_fiberwise hmap] apply Finset.sum_congr rfl intro k hk exact wm_level_fibre_card T h1 h2 hgc (by have := Finset.mem_range.1 hk; omega) lemma wm_mem_D (T : NumericalSemigroup) (y : ℕ) : y ∈ w23_D T ↔ T.conductor ≤ y ∧ y < T.conductor + T.multiplicity ∧ ¬ T.IsPrimitive y := by classical unfold w23_D rw [Finset.mem_filter, Finset.mem_Ico] tauto theorem wm_link_d (T : NumericalSemigroup) (h1 : 3 * T.multiplicity < T.conductor) (h2 : T.conductor ≤ 4 * T.multiplicity) (hgc : cr_IsGenCore T) : (w23_D T).card = wm_d T.multiplicity (w23_rho T) (wm_offsets T) := by classical obtain ⟨_, hc, hρm, hm2⟩ := cr_basic T h1 h2 unfold wm_d apply Finset.card_nbij' (fun y => y + w23_rho T - 4 * T.multiplicity) (fun u => 4 * T.multiplicity + u - w23_rho T) · intro y hy obtain ⟨hyc, hyl, hyp⟩ := (wm_mem_D T y).1 (Finset.mem_coe.1 hy) simp only [Finset.mem_coe] apply (wm_link_mem4 T h1 h2 hgc (by omega)).2 rw [show 4 * T.multiplicity + (y + w23_rho T - 4 * T.multiplicity) - w23_rho T = y by omega] exact hyp · intro u hu simp only [Finset.mem_coe] at hu have hum := (wm_B_spec (by omega) hu).1 simp only [Finset.mem_coe] exact (wm_mem_D T _).2 ⟨by omega, by omega, (wm_link_mem4 T h1 h2 hgc hum).1 hu⟩ · intro y hy obtain ⟨hyc, hyl, _⟩ := (wm_mem_D T y).1 (Finset.mem_coe.1 hy) show 4 * T.multiplicity + (y + w23_rho T - 4 * T.multiplicity) - w23_rho T = y omega · intro u hu simp only [Finset.mem_coe] at hu have hum := (wm_B_spec (by omega) hu).1 show 4 * T.multiplicity + u - w23_rho T + w23_rho T - 4 * T.multiplicity = u omega theorem wm_link_n (T : NumericalSemigroup) (h1 : 3 * T.multiplicity < T.conductor) (hgc : cr_IsGenCore T) : w23_n T = (wm_offsets T).card + 1 := by classical have hA : cr_A T = (insert 0 (wm_offsets T)).image (fun b => T.multiplicity + b) := by ext x rw [wm_mem_crA T (by omega), Finset.mem_image] constructor · rintro ⟨b, hb, rfl⟩ exact ⟨b, hb, rfl⟩ · rintro ⟨b, hb, rfl⟩ exact ⟨b, hb, rfl⟩ have h0 : (0 : ℕ) ∉ wm_offsets T := fun h => by have := ((wm_mem_offsets T 0).1 h).1 omega rw [← w23_low_A_card, wm_low_A_eq T hgc, hA, Finset.card_image_of_injective _ (add_right_injective T.multiplicity), Finset.card_insert_of_notMem h0] theorem wm_link_p (T : NumericalSemigroup) (h1 : 3 * T.multiplicity < T.conductor) (h2 : T.conductor ≤ 4 * T.multiplicity) (hgc : cr_IsGenCore T) : (w23_pq T : ℤ) = wm_p T.multiplicity (w23_rho T) (wm_offsets T) := by have hm := w23_m_eq T have hd := wm_link_d T h1 h2 hgc unfold wm_p omega theorem wm_link_X1 (T : NumericalSemigroup) (h1 : 3 * T.multiplicity < T.conductor) (h2 : T.conductor ≤ 4 * T.multiplicity) : w23_X T 1 = (wm_win T.multiplicity (w23_rho T) (wm_offsets T)).image (fun b => T.multiplicity + b) := by classical obtain ⟨_, hc, hρm, hm2⟩ := cr_basic T h1 h2 ext x rw [w23_mem_X, Finset.mem_image] constructor · rintro ⟨hxA, hxl⟩ obtain ⟨hxlt, hxS, hnp⟩ := (w23_mem_apery T x).1 hxA obtain ⟨hmx, hx2⟩ := (w23_level_one_iff_of_mem T hxS).1 hxl have hne : x ≠ T.multiplicity := by rintro rfl exact hnp ⟨0, T.carrier.zero_mem, by omega⟩ refine ⟨x - T.multiplicity, (wm_mem_win _ _ _ _).2 ⟨(wm_mem_offsets T _).2 ⟨by omega, by omega, ?_⟩, by omega⟩, by omega⟩ rw [show T.multiplicity + (x - T.multiplicity) = x by omega] exact hxS · rintro ⟨b, hb, rfl⟩ obtain ⟨hbB, hbρ⟩ := (wm_mem_win _ _ _ _).1 hb obtain ⟨hb0, hbm, hmem⟩ := (wm_mem_offsets T b).1 hbB refine ⟨(w23_mem_apery T _).2 ⟨by omega, hmem, ?_⟩, (w23_level_one_iff_of_mem T hmem).2 ⟨by omega, by omega⟩⟩ rintro ⟨y, hy, he⟩ have hyb : y = b := by omega subst hyb have := T.multiplicity_le hb0 hy omega lemma wm_filter_image_card (O : Finset ℕ) (m : ℕ) (p : ℕ → Prop) [DecidablePred p] : ((O.image (fun b => m + b)).filter p).card = (O.filter (fun b => p (m + b))).card := by rw [Finset.filter_image, Finset.card_image_of_injective _ (add_right_injective m)] /-- What M6 consumes: the model of a residual generalized core. -/ theorem wm_of_core (T : NumericalSemigroup) (hT : cr_CoreHyp T) : w23_rho T < T.multiplicity ∧ (∀ b ∈ wm_offsets T, 0 < b ∧ b < T.multiplicity) ∧ T.multiplicity - 1 ∉ wm_B T.multiplicity (w23_rho T) (wm_offsets T) 3 ∧ wm_Residual T.multiplicity (w23_rho T) (wm_win T.multiplicity (w23_rho T) (wm_offsets T)) ∧ cr_W0 T = wm_W0 T.multiplicity (w23_rho T) (wm_offsets T) ∧ (w23_pq T : ℤ) = wm_p T.multiplicity (w23_rho T) (wm_offsets T) := by classical obtain ⟨h1, h2, hgc, hsmall, hK4, hpop, hh3⟩ := hT obtain ⟨_, hc, hρm, hm2⟩ := cr_basic T h1 h2 refine ⟨hρm, fun b hb => ⟨((wm_mem_offsets T b).1 hb).1, ((wm_mem_offsets T b).1 hb).2.1⟩, ?_, ?_, ?_, wm_link_p T h1 h2 hgc⟩ · intro hB have h3 := (wm_link_mem T h1 h2 hgc (k := 3) (u := T.multiplicity - 1) le_rfl (by omega) (by omega)).1 hB rw [show 3 * T.multiplicity + (T.multiplicity - 1) - w23_rho T = T.conductor - 1 by omega] at h3 exact w22_frobenius_not_mem T h3 · rw [wm_link_X1 T h1 h2] at hsmall hK4 hpop hh3 rw [Finset.card_image_of_injective _ (add_right_injective T.multiplicity)] at hK4 hpop rw [wm_filter_image_card] at hsmall hpop hh3 set O := wm_win T.multiplicity (w23_rho T) (wm_offsets T) with hO have e1 : O.filter (fun b => 3 * (T.multiplicity + b) < T.conductor + T.multiplicity) = O.filter (fun b => 3 * b + w23_rho T < 2 * T.multiplicity) := Finset.filter_congr (fun b _ => by omega) have e2 : O.filter (fun b => 2 * (T.multiplicity + b) + w23_rho T < 3 * T.multiplicity) = O.filter (fun b => 2 * b + w23_rho T < T.multiplicity) := Finset.filter_congr (fun b _ => by omega) have e3 : O.filter (fun b => 3 * T.multiplicity ≤ 2 * (T.multiplicity + b) + w23_rho T) = O.filter (fun b => T.multiplicity ≤ 2 * b + w23_rho T) := Finset.filter_congr (fun b _ => by omega) rw [e1] at hsmall rw [e2] at hpop rw [e3] at hh3 exact ⟨hsmall, hK4, hpop, hh3⟩ · unfold cr_W0 wm_W0 rw [wm_link_n T h1 hgc, wm_link_leftCount T h1 h2 hgc, wm_link_d T h1 h2 hgc] push_cast ring -- ===== M1R.lean ===== /-! M1.0–M1.3: value-sorted enumeration and representations (D2), the sumset positions `Y_t`, `Z_t` (shifted window coordinates, D1) and the strip-free level structure `B_k = Y_k ∪ Z_{k−1}` (A8 §0.1). Throughout, `O` is a set of window offsets: `0 < b` and `b + ρ < m` for `b ∈ O`. -/ /-- Value-sorted enumeration of the offsets (D2). -/ noncomputable def wm_enum (O : Finset ℕ) : Fin O.card → ℕ := fun i => O.orderEmbOfFin rfl i lemma wm_enum_mem (O : Finset ℕ) (i : Fin O.card) : wm_enum O i ∈ O := Finset.orderEmbOfFin_mem O rfl i lemma wm_enum_surj (O : Finset ℕ) {v : ℕ} (hv : v ∈ O) : ∃ i, wm_enum O i = v := by have h : v ∈ Set.range (O.orderEmbOfFin rfl) := by rw [Finset.range_orderEmbOfFin] exact hv obtain ⟨i, hi⟩ := h exact ⟨i, hi⟩ lemma wm_enum_strictMono (O : Finset ℕ) : StrictMono (wm_enum O) := (O.orderEmbOfFin rfl).strictMono lemma wm_enum_inj (O : Finset ℕ) : Function.Injective (wm_enum O) := (wm_enum_strictMono O).injective /-- Graded representation of `s` of degree `d`: minimal `ns_code 6` (largest offset dominates). -/ noncomputable def wm_rep (O : Finset ℕ) (d s : ℕ) : Fin O.card → ℕ := ns_rep 6 (wm_enum O) d s lemma wm_exists_of_mem (O : Finset ℕ) (d : ℕ) : ∀ s, s ∈ d • O → ∃ α, m3_degree α = d ∧ m3_value (wm_enum O) α = s := by induction d with | zero => intro s hs have : s = 0 := by simpa using hs subst this exact ⟨fun _ => 0, by simp [m3_degree], by simp [m3_value]⟩ | succ d ih => intro s hs rw [succ_nsmul] at hs obtain ⟨y, hy, a, ha, rfl⟩ := Finset.mem_add.1 hs obtain ⟨α, hαd, hαv⟩ := ih y hy obtain ⟨i, hi⟩ := wm_enum_surj O ha exact ⟨m3_unitAdd α i, by rw [m3_degree_unitAdd, hαd], by rw [m3_value_unitAdd, hαv, hi]⟩ lemma wm_value_mem (O : Finset ℕ) (d : ℕ) : ∀ α : Fin O.card → ℕ, m3_degree α = d → m3_value (wm_enum O) α ∈ d • O := by induction d with | zero => intro α hd have hz : ∀ i, α i = 0 := fun i => by have := m3_coord_le_degree α i omega simp [m3_value, hz] | succ d ih => intro α hd obtain ⟨i, hi⟩ := m3_degree_pos_coord α (by omega) have hp : m3_degree (m3_parent α i) = d := by have := m3_degree_parent α i hi omega have he := m3_value_parent (wm_enum O) α i hi rw [succ_nsmul] exact Finset.mem_add.2 ⟨_, ih _ hp, _, wm_enum_mem O i, he⟩ lemma wm_rep_spec (O : Finset ℕ) {d s : ℕ} (hs : s ∈ d • O) : m3_degree (wm_rep O d s) = d ∧ m3_value (wm_enum O) (wm_rep O d s) = s := by have h := ns_rep_spec 6 (wm_enum O) d s (wm_exists_of_mem O d s hs) exact ⟨h.1, h.2.1⟩ lemma wm_rep_parent (O : Finset ℕ) {d s : ℕ} (hd : d + 1 < 6) (hs : s ∈ (d + 1) • O) (i : Fin O.card) (hi : 0 < wm_rep O (d + 1) s i) : m3_parent (wm_rep O (d + 1) s) i = wm_rep O d (m3_value (wm_enum O) (m3_parent (wm_rep O (d + 1) s) i)) := ns_rep_parent 6 (wm_enum O) d s hd (wm_exists_of_mem O _ s hs) i hi /-- Sums of `≤ t` offsets. -/ lemma wm_mem_nsmul_insert (O : Finset ℕ) (t : ℕ) : ∀ x, x ∈ t • insert 0 O ↔ ∃ j ≤ t, x ∈ j • O := by induction t with | zero => intro x constructor · intro hx exact ⟨0, le_rfl, by simpa using hx⟩ · rintro ⟨j, hj, hx⟩ obtain rfl : j = 0 := by omega simpa using hx | succ t ih => intro x constructor · intro hx rw [succ_nsmul] at hx obtain ⟨y, hy, a, ha, rfl⟩ := Finset.mem_add.1 hx obtain ⟨j, hj, hyj⟩ := (ih y).1 hy rcases Finset.mem_insert.1 ha with rfl | ha' · exact ⟨j, by omega, by simpa using hyj⟩ · refine ⟨j + 1, by omega, ?_⟩ rw [succ_nsmul] exact Finset.mem_add.2 ⟨y, hyj, a, ha', rfl⟩ · rintro ⟨j, hj, hx⟩ rw [succ_nsmul] rcases Nat.lt_or_ge j (t + 1) with h | h · exact Finset.mem_add.2 ⟨x, (ih x).2 ⟨j, by omega, hx⟩, 0, Finset.mem_insert_self _ _, by simp⟩ · obtain rfl : j = t + 1 := by omega rw [succ_nsmul] at hx obtain ⟨y, hy, a, ha, rfl⟩ := Finset.mem_add.1 hx exact Finset.mem_add.2 ⟨y, (ih y).2 ⟨t, le_rfl, hy⟩, a, Finset.mem_insert_of_mem ha, rfl⟩ lemma wm_nsmul_mono {O : Finset ℕ} {t t' x : ℕ} (h : t ≤ t') (hx : x ∈ t • insert 0 O) : x ∈ t' • insert 0 O := by obtain ⟨e, rfl⟩ := Nat.exists_eq_add_of_le h exact wm_nsmul_zero_mono (Finset.mem_insert_self 0 O) hx e lemma wm_nsmul_of_pure {O : Finset ℕ} {t x : ℕ} (hx : x ∈ t • O) : x ∈ t • insert 0 O := (wm_mem_nsmul_insert O t x).2 ⟨t, le_rfl, hx⟩ /-- Window positions of unwrapped sums of `≤ t` offsets: `Y_t = tH ∩ [0, N)`, shifted by `ρ`. -/ noncomputable def wm_Y (m ρ : ℕ) (O : Finset ℕ) (t : ℕ) : Finset ℕ := by classical exact ((t • insert 0 O).filter (fun s => s + ρ < m)).image (· + ρ) /-- Positions of once-wrapped sums of `≤ t` offsets: `Z_t = (tH ∩ [N, N + m)) − m`, shifted by `ρ`. -/ noncomputable def wm_Z (m ρ : ℕ) (O : Finset ℕ) (t : ℕ) : Finset ℕ := by classical exact ((t • insert 0 O).filter (fun s => m ≤ s + ρ ∧ s + ρ < 2 * m)).image (fun s => s + ρ - m) lemma wm_mem_Y {m ρ : ℕ} {O : Finset ℕ} {t u : ℕ} : u ∈ wm_Y m ρ O t ↔ ρ ≤ u ∧ u < m ∧ u - ρ ∈ t • insert 0 O := by classical unfold wm_Y simp only [Finset.mem_image, Finset.mem_filter] constructor · rintro ⟨s, ⟨hs, hlt⟩, rfl⟩ exact ⟨by omega, hlt, by simpa using hs⟩ · rintro ⟨h1, h2, h3⟩ exact ⟨u - ρ, ⟨h3, by omega⟩, by omega⟩ lemma wm_mem_Z {m ρ : ℕ} {O : Finset ℕ} {t u : ℕ} (hρ : ρ < m) : u ∈ wm_Z m ρ O t ↔ u < m ∧ u + m - ρ ∈ t • insert 0 O := by classical unfold wm_Z simp only [Finset.mem_image, Finset.mem_filter] constructor · rintro ⟨s, ⟨hs, h1, h2⟩, rfl⟩ refine ⟨by omega, ?_⟩ rw [show s + ρ - m + m - ρ = s by omega] exact hs · rintro ⟨h1, h2⟩ exact ⟨u + m - ρ, ⟨h2, by omega, by omega⟩, by omega⟩ /-- `Ẑ = Z₂ ∖ Y₃`, `Q = Z₃ ∖ (Y₄ ∪ Z₂)`, `N40 = (Y₄ ∖ Y₃) ∖ Z₂`. -/ noncomputable def wm_Zhat (m ρ : ℕ) (O : Finset ℕ) : Finset ℕ := wm_Z m ρ O 2 \ wm_Y m ρ O 3 noncomputable def wm_Q (m ρ : ℕ) (O : Finset ℕ) : Finset ℕ := wm_Z m ρ O 3 \ (wm_Y m ρ O 4 ∪ wm_Z m ρ O 2) noncomputable def wm_N40 (m ρ : ℕ) (O : Finset ℕ) : Finset ℕ := (wm_Y m ρ O 4 \ wm_Y m ρ O 3) \ wm_Z m ρ O 2 lemma wm_Y_mono {m ρ : ℕ} {O : Finset ℕ} {t t' : ℕ} (h : t ≤ t') : wm_Y m ρ O t ⊆ wm_Y m ρ O t' := by intro u hu obtain ⟨h1, h2, h3⟩ := wm_mem_Y.1 hu exact wm_mem_Y.2 ⟨h1, h2, wm_nsmul_mono h h3⟩ lemma wm_Z_mono {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) {t t' : ℕ} (h : t ≤ t') : wm_Z m ρ O t ⊆ wm_Z m ρ O t' := by intro u hu obtain ⟨h1, h2⟩ := (wm_mem_Z hρ).1 hu exact (wm_mem_Z hρ).2 ⟨h1, wm_nsmul_mono h h2⟩ lemma wm_Y_sub {m ρ : ℕ} {O : Finset ℕ} (t : ℕ) : wm_Y m ρ O t ⊆ Finset.range m := fun _ hu => Finset.mem_range.2 (wm_mem_Y.1 hu).2.1 lemma wm_Z_sub {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (t : ℕ) : wm_Z m ρ O t ⊆ Finset.range m := fun _ hu => Finset.mem_range.2 ((wm_mem_Z hρ).1 hu).1 /-- A wrapped sum of `≤ 2` offsets has exactly two offsets. -/ lemma wm_two_of_Z2 {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) {z : ℕ} (hz : z ∈ wm_Z m ρ O 2) : z + m - ρ ∈ 2 • O := by obtain ⟨_, hs⟩ := (wm_mem_Z hρ).1 hz obtain ⟨j, hj, hsj⟩ := (wm_mem_nsmul_insert O 2 _).1 hs rcases (show j = 0 ∨ j = 1 ∨ j = 2 by omega) with rfl | rfl | rfl · have : z + m - ρ = 0 := by simpa using hsj omega · have := (hO _ (by simpa using hsj)).2 omega · exact hsj /-- An element of `Q` is a sum of exactly three offsets. -/ lemma wm_three_of_Q {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) {q : ℕ} (hq : q ∈ wm_Q m ρ O) : q + m - ρ ∈ 3 • O := by unfold wm_Q at hq rw [Finset.mem_sdiff, Finset.mem_union, not_or] at hq obtain ⟨hq3, _, hq2⟩ := hq obtain ⟨hqm, hs⟩ := (wm_mem_Z hρ).1 hq3 obtain ⟨j, hj, hsj⟩ := (wm_mem_nsmul_insert O 3 _).1 hs by_cases hj3 : j = 3 · subst hj3 exact hsj · exact absurd ((wm_mem_Z hρ).2 ⟨hqm, (wm_mem_nsmul_insert O 2 _).2 ⟨j, by omega, hsj⟩⟩) hq2 /-! ### The strip-free level structure -/ lemma wm_H_bound {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) : ∀ h ∈ insert 0 O, h < m - ρ := by intro h hh rcases Finset.mem_insert.1 hh with rfl | hh · omega · have := (hO h hh).2 omega lemma wm_small_sum {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) {t s : ℕ} (ht : t ≤ 2) (hs : s ∈ t • insert 0 O) : s + ρ < 2 * m := by have hle := wm_nsmul_le (wm_H_bound hρ hO) t s hs interval_cases t <;> omega theorem wm_mem_B_free {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) {k : ℕ} (hk : k ≤ 4) (u : ℕ) : u ∈ wm_B m ρ O k ↔ u ∈ wm_Y m ρ O k ∨ (1 ≤ k ∧ u ∈ wm_Z m ρ O (k - 1)) := by constructor · intro hu obtain ⟨t, s, hs, hk', rfl⟩ := (wm_mem_B m ρ O k u).1 hu have hdm := Nat.div_add_mod' (s + ρ) m have hlt := Nat.mod_lt (s + ρ) (show 0 < m by omega) generalize hj : (s + ρ) / m = j at hdm hk' rcases (show j = 0 ∨ j = 1 ∨ 2 ≤ j by omega) with rfl | rfl | hj2 · left refine wm_mem_Y.2 ⟨by omega, hlt, ?_⟩ rw [show (s + ρ) % m - ρ = s by omega] exact wm_nsmul_mono (by omega) hs · right refine ⟨by omega, (wm_mem_Z hρ).2 ⟨hlt, ?_⟩⟩ rw [show (s + ρ) % m + m - ρ = s by omega] exact wm_nsmul_mono (by omega) hs · exfalso have hjm := Nat.mul_le_mul_right m hj2 have := wm_small_sum hρ hO (show t ≤ 2 by omega) hs omega · rintro (hu | ⟨hk1, hu⟩) · obtain ⟨h1, h2, h3⟩ := wm_mem_Y.1 hu refine (wm_mem_B m ρ O k u).2 ⟨k, u - ρ, h3, ?_, ?_⟩ · rw [show u - ρ + ρ = u by omega, Nat.div_eq_of_lt h2] omega · rw [show u - ρ + ρ = u by omega, Nat.mod_eq_of_lt h2] · obtain ⟨h1, h2⟩ := (wm_mem_Z hρ).1 hu refine (wm_mem_B m ρ O k u).2 ⟨k - 1, u + m - ρ, h2, ?_, ?_⟩ · rw [show u + m - ρ + ρ = u + 1 * m by omega, Nat.add_mul_div_right _ _ (by omega), Nat.div_eq_of_lt h1] omega · rw [show u + m - ρ + ρ = u + 1 * m by omega, Nat.add_mul_mod_self_right, Nat.mod_eq_of_lt h1] lemma wm_B_eq_Y {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) {k : ℕ} (hk : k ≤ 2) : wm_B m ρ O k = wm_Y m ρ O k := by ext u rw [wm_mem_B_free hρ hO (by omega)] constructor · rintro (h | ⟨hk1, h⟩) · exact h · exfalso obtain ⟨h1, h2⟩ := (wm_mem_Z hρ).1 h obtain ⟨j, hj, hsj⟩ := (wm_mem_nsmul_insert O (k - 1) _).1 h2 rcases (show j = 0 ∨ j = 1 by omega) with rfl | rfl · have : u + m - ρ = 0 := by simpa using hsj omega · have := (hO _ (by simpa using hsj)).2 omega · exact fun h => Or.inl h lemma wm_B_eq_YZ {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) {k : ℕ} (hk1 : 1 ≤ k) (hk : k ≤ 4) : wm_B m ρ O k = wm_Y m ρ O k ∪ wm_Z m ρ O (k - 1) := by ext u rw [wm_mem_B_free hρ hO hk, Finset.mem_union] constructor · rintro (h | ⟨_, h⟩) · exact Or.inl h · exact Or.inr h · rintro (h | h) · exact Or.inl h · exact Or.inr ⟨hk1, h⟩ lemma wm_Y_zero {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) : wm_Y m ρ O 0 = {ρ} := by ext u rw [wm_mem_Y, Finset.mem_singleton] constructor · rintro ⟨h1, _, h3⟩ have : u - ρ = 0 := by simpa using h3 omega · rintro rfl exact ⟨le_rfl, hρ, by simp⟩ lemma wm_Y_one {m ρ : ℕ} {O : Finset ℕ} (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) (hρ : ρ < m) : wm_Y m ρ O 1 = (insert 0 O).image (· + ρ) := by ext u rw [wm_mem_Y, Finset.mem_image, one_nsmul] constructor · rintro ⟨h1, _, h3⟩ exact ⟨u - ρ, h3, by omega⟩ · rintro ⟨h, hh, rfl⟩ refine ⟨by omega, ?_, by simpa using hh⟩ rcases Finset.mem_insert.1 hh with rfl | hh · omega · exact (hO h hh).2 lemma wm_card_Y_zero {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) : (wm_Y m ρ O 0).card = 1 := by rw [wm_Y_zero hρ, Finset.card_singleton] lemma wm_card_Y_one {m ρ : ℕ} {O : Finset ℕ} (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) (hρ : ρ < m) : (wm_Y m ρ O 1).card = O.card + 1 := by rw [wm_Y_one hO hρ, Finset.card_image_of_injective _ (add_left_injective ρ), Finset.card_insert_of_notMem (fun h => by have := (hO 0 h).1; omega)] -- ===== M1I.lean ===== /-! M1.6–M1.7: wrapped triples and pairs, Lemma 6_ρ (exact form, D6), the partition of `Q` by `w`, the pair count, and the identity (ID2_ρ) (A8 §1): `W₀ = ρ + ζ₂ + Σ − |Q₃|`. Strip-free model `O` (window offsets). -/ /-- `β_q = rep(q + m − ρ)` (degree 3 for `q ∈ Q`). -/ noncomputable def wm_beta (m ρ : ℕ) (O : Finset ℕ) (q : ℕ) : Fin O.card → ℕ := wm_rep O 3 (q + m - ρ) /-- `w_z = rep(z + m − ρ)` (degree 2 for `z ∈ Ẑ`). -/ noncomputable def wm_wz (m ρ : ℕ) (O : Finset ℕ) (z : ℕ) : Fin O.card → ℕ := wm_rep O 2 (z + m - ρ) /-- `w(q)`: wrapped parents of `β_q` with multiplicity (factors `a_i ≤ q` in shifted coordinates). -/ noncomputable def wm_w (m ρ : ℕ) (O : Finset ℕ) (q : ℕ) : ℕ := ∑ i, if wm_enum O i ≤ q then wm_beta m ρ O q i else 0 /-- `Q_j = {q ∈ Q : w(q) = j}`. -/ noncomputable def wm_Qj (m ρ : ℕ) (O : Finset ℕ) (j : ℕ) : Finset ℕ := by classical exact (wm_Q m ρ O).filter (fun q => wm_w m ρ O q = j) /-- The incidence `(z, i)` is used: `z + a_i ∈ Q` and `β_{z + a_i} = w_z · x_i`. -/ def wm_used (m ρ : ℕ) (O : Finset ℕ) (z : ℕ) (i : Fin O.card) : Prop := z + wm_enum O i ∈ wm_Q m ρ O ∧ wm_beta m ρ O (z + wm_enum O i) = m3_unitAdd (wm_wz m ρ O z) i /-- Weight `(w_z)_i + 1` of a used / unused incidence. -/ noncomputable def wm_usedw (m ρ : ℕ) (O : Finset ℕ) (z : ℕ) (i : Fin O.card) : ℕ := by classical exact if wm_used m ρ O z i then wm_wz m ρ O z i + 1 else 0 noncomputable def wm_unusedw (m ρ : ℕ) (O : Finset ℕ) (z : ℕ) (i : Fin O.card) : ℕ := by classical exact if wm_used m ρ O z i then 0 else wm_wz m ρ O z i + 1 /-- `A`: total weight `(w_z)_i + 1` of the unused incidences `(z, i)`, `z ∈ Ẑ` (D6). -/ noncomputable def wm_A (m ρ : ℕ) (O : Finset ℕ) : ℕ := ∑ z ∈ wm_Zhat m ρ O, ∑ i, wm_unusedw m ρ O z i /-- Formal wrapped / unwrapped pairs of offsets. -/ noncomputable def wm_Pw (m ρ : ℕ) (O : Finset ℕ) : ℕ := by classical exact ((O ×ˢ O).filter (fun p => p.1 ≤ p.2 ∧ m ≤ p.1 + p.2 + ρ)).card noncomputable def wm_Pu (m ρ : ℕ) (O : Finset ℕ) : ℕ := by classical exact ((O ×ˢ O).filter (fun p => p.1 ≤ p.2 ∧ p.1 + p.2 + ρ < m)).card /-- `h_t = |Y_t| − |Y_{t−1}|`, `d2, d3, d4`, `Σ_q u(q)`, `d3''` and the pool `Σ` (A12 notation). -/ noncomputable def wm_h (m ρ : ℕ) (O : Finset ℕ) (t : ℕ) : ℤ := ((wm_Y m ρ O t).card : ℤ) - (wm_Y m ρ O (t - 1)).card noncomputable def wm_d2 (m ρ : ℕ) (O : Finset ℕ) : ℤ := (O.card : ℤ) * (O.card + 1) - 2 * wm_h m ρ O 2 noncomputable def wm_d3 (m ρ : ℕ) (O : Finset ℕ) : ℤ := ((O.card : ℤ) + 2) * wm_h m ρ O 2 - 3 * wm_h m ρ O 3 noncomputable def wm_d4 (m ρ : ℕ) (O : Finset ℕ) : ℤ := ((O.card : ℤ) + 3) * wm_h m ρ O 3 - 4 * wm_h m ρ O 4 noncomputable def wm_d3pp (m ρ : ℕ) (O : Finset ℕ) : ℤ := wm_d3 m ρ O - (3 * ((wm_Q m ρ O).card : ℤ) - ∑ q ∈ wm_Q m ρ O, (wm_w m ρ O q : ℤ)) noncomputable def wm_Sigma (m ρ : ℕ) (O : Finset ℕ) : ℤ := ((wm_Qj m ρ O 1).card : ℤ) + wm_A m ρ O + 2 * (wm_Qj m ρ O 0).card + 6 * ((wm_Pw m ρ O : ℤ) - (wm_Zhat m ρ O).card) + 6 * ((wm_Pu m ρ O : ℤ) - wm_h m ρ O 2) + 4 * ((wm_Zhat m ρ O ∩ wm_Y m ρ O 4).card : ℤ) + 2 * wm_d3pp m ρ O + wm_d4 m ρ O /-! ### Wrapped parents (Lemma 6_ρ) -/ lemma wm_Q_sub {m ρ : ℕ} {O : Finset ℕ} {q : ℕ} (hq : q ∈ wm_Q m ρ O) : q ∈ wm_Z m ρ O 3 ∧ q ∉ wm_Y m ρ O 4 ∧ q ∉ wm_Z m ρ O 2 := by unfold wm_Q at hq rw [Finset.mem_sdiff, Finset.mem_union, not_or] at hq exact ⟨hq.1, hq.2.1, hq.2.2⟩ lemma wm_Q_lt {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) {q : ℕ} (hq : q ∈ wm_Q m ρ O) : q < m := ((wm_mem_Z hρ).1 (wm_Q_sub hq).1).1 lemma wm_beta_spec {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) {q : ℕ} (hq : q ∈ wm_Q m ρ O) : m3_degree (wm_beta m ρ O q) = 3 ∧ m3_value (wm_enum O) (wm_beta m ρ O q) = q + m - ρ := wm_rep_spec O (wm_three_of_Q hρ hq) lemma wm_wz_spec {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) {z : ℕ} (hz : z ∈ wm_Zhat m ρ O) : m3_degree (wm_wz m ρ O z) = 2 ∧ m3_value (wm_enum O) (wm_wz m ρ O z) = z + m - ρ := wm_rep_spec O (wm_two_of_Z2 hρ hO (Finset.mem_sdiff.1 hz).1) /-- A wrapped parent of `β_q` (`a_i ≤ q`) is `w_z` for `z = q − a_i ∈ Ẑ` (A8 Lemma 6_ρ). -/ lemma wm_parent_wrapped {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) {q : ℕ} (hq : q ∈ wm_Q m ρ O) {i : Fin O.card} (hi : 0 < wm_beta m ρ O q i) (hle : wm_enum O i ≤ q) : q - wm_enum O i ∈ wm_Zhat m ρ O ∧ wm_beta m ρ O q = m3_unitAdd (wm_wz m ρ O (q - wm_enum O i)) i := by have hs3 := wm_three_of_Q hρ hq have hspec := wm_rep_spec O hs3 have hpar : m3_parent (wm_rep O 3 (q + m - ρ)) i = wm_rep O 2 (m3_value (wm_enum O) (m3_parent (wm_rep O 3 (q + m - ρ)) i)) := wm_rep_parent O (d := 2) (by norm_num) hs3 i hi have hval := m3_value_parent (wm_enum O) (wm_rep O 3 (q + m - ρ)) i hi rw [hspec.2] at hval have hqm := wm_Q_lt hρ hq have hv : m3_value (wm_enum O) (m3_parent (wm_rep O 3 (q + m - ρ)) i) = q - wm_enum O i + m - ρ := by omega rw [hv] at hpar have hpd : m3_degree (m3_parent (wm_rep O 3 (q + m - ρ)) i) = 2 := by have := m3_degree_parent (wm_rep O 3 (q + m - ρ)) i hi rw [hspec.1] at this omega have hmem2 := wm_value_mem O 2 _ hpd rw [hv] at hmem2 refine ⟨Finset.mem_sdiff.2 ⟨(wm_mem_Z hρ).2 ⟨by omega, wm_nsmul_of_pure hmem2⟩, ?_⟩, ?_⟩ · intro hY obtain ⟨h1, h2, h3⟩ := wm_mem_Y.1 hY apply (wm_Q_sub hq).2.1 refine wm_mem_Y.2 ⟨by omega, hqm, ?_⟩ rw [show q - ρ = (q - wm_enum O i - ρ) + wm_enum O i by omega, succ_nsmul] exact Finset.mem_add.2 ⟨_, h3, _, Finset.mem_insert_of_mem (wm_enum_mem O i), rfl⟩ · change wm_rep O 3 (q + m - ρ) = m3_unitAdd (wm_rep O 2 (q - wm_enum O i + m - ρ)) i rw [← hpar] exact (m3_unitAdd_parent _ i hi).symm lemma wm_lemma6_i {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (i : Fin O.card) : (∑ z ∈ wm_Zhat m ρ O, wm_usedw m ρ O z i) = ∑ q ∈ wm_Q m ρ O, if wm_enum O i ≤ q then wm_beta m ρ O q i else 0 := by classical unfold wm_usedw apply Finset.sum_bij_ne_zero (fun z _ _ => z + wm_enum O i) · intro z _ h2 have hu : wm_used m ρ O z i := by by_contra hn exact h2 (if_neg hn) exact hu.1 · intro z1 _ _ z2 _ _ he omega · intro q hq hne have hle : wm_enum O i ≤ q := by by_contra hn exact hne (if_neg hn) have hpos : 0 < wm_beta m ρ O q i := by rw [if_pos hle] at hne omega obtain ⟨hz, hb⟩ := wm_parent_wrapped hρ hq hpos hle have he : q - wm_enum O i + wm_enum O i = q := by omega have hu : wm_used m ρ O (q - wm_enum O i) i := ⟨by rw [he]; exact hq, by rw [he]; exact hb⟩ exact ⟨q - wm_enum O i, hz, by rw [if_pos hu]; omega, he⟩ · intro z _ h2 have hu : wm_used m ρ O z i := by by_contra hn exact h2 (if_neg hn) rw [if_pos hu, if_pos (Nat.le_add_left _ _), hu.2] simp [m3_unitAdd] /-- Lemma 6_ρ (exact): `Σ_{q ∈ Q} w(q) + A = (K + 2) ζ₂`. -/ theorem wm_lemma6 {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) : (∑ q ∈ wm_Q m ρ O, wm_w m ρ O q) + wm_A m ρ O = (O.card + 2) * (wm_Zhat m ρ O).card := by classical have h1 : (∑ q ∈ wm_Q m ρ O, wm_w m ρ O q) = ∑ z ∈ wm_Zhat m ρ O, ∑ i, wm_usedw m ρ O z i := by unfold wm_w rw [Finset.sum_comm, Finset.sum_comm (s := wm_Zhat m ρ O)] exact Finset.sum_congr rfl (fun i _ => (wm_lemma6_i hρ i).symm) rw [h1] unfold wm_A rw [← Finset.sum_add_distrib] have h2 : ∀ z ∈ wm_Zhat m ρ O, ((∑ i, wm_usedw m ρ O z i) + ∑ i, wm_unusedw m ρ O z i) = O.card + 2 := by intro z hz rw [← Finset.sum_add_distrib] have h3 : ∀ i ∈ (Finset.univ : Finset (Fin O.card)), wm_usedw m ρ O z i + wm_unusedw m ρ O z i = wm_wz m ρ O z i + 1 := by intro i _ unfold wm_usedw wm_unusedw split_ifs <;> simp rw [Finset.sum_congr rfl h3, Finset.sum_add_distrib] have hd := (wm_wz_spec hρ hO hz).1 unfold m3_degree at hd rw [hd] simp omega rw [Finset.sum_congr rfl h2, Finset.sum_const, smul_eq_mul, Nat.mul_comm] /-! ### Partition of `Q` by `w` -/ lemma wm_w_le {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) {q : ℕ} (hq : q ∈ wm_Q m ρ O) : wm_w m ρ O q ≤ 3 := by have hd := (wm_beta_spec hρ hq).1 unfold m3_degree at hd unfold wm_w rw [← hd] apply Finset.sum_le_sum intro i _ split_ifs <;> omega lemma wm_Q_partition {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) : (wm_Q m ρ O).card = (wm_Qj m ρ O 0).card + (wm_Qj m ρ O 1).card + (wm_Qj m ρ O 2).card + (wm_Qj m ρ O 3).card ∧ (∑ q ∈ wm_Q m ρ O, wm_w m ρ O q) = (wm_Qj m ρ O 1).card + 2 * (wm_Qj m ρ O 2).card + 3 * (wm_Qj m ρ O 3).card := by classical have hmap : Set.MapsTo (wm_w m ρ O) (wm_Q m ρ O : Set ℕ) (Finset.range 4 : Set ℕ) := by intro q hq simp only [Finset.coe_range, Set.mem_Iio] have := wm_w_le hρ (Finset.mem_coe.1 hq) omega have hQj : ∀ j, wm_Qj m ρ O j = (wm_Q m ρ O).filter (fun q => wm_w m ρ O q = j) := by intro j unfold wm_Qj rfl constructor · rw [Finset.card_eq_sum_card_fiberwise hmap] simp only [Finset.sum_range_succ, Finset.sum_range_zero, hQj] omega · rw [← Finset.sum_fiberwise_of_maps_to hmap] have hin : ∀ j ∈ Finset.range 4, (∑ q ∈ (wm_Q m ρ O).filter (fun q => wm_w m ρ O q = j), wm_w m ρ O q) = j * (wm_Qj m ρ O j).card := by intro j _ rw [hQj, Finset.sum_congr rfl (fun q hq => (Finset.mem_filter.1 hq).2), Finset.sum_const, smul_eq_mul, Nat.mul_comm] rw [Finset.sum_congr rfl hin] simp only [Finset.sum_range_succ, Finset.sum_range_zero] omega /-! ### Formal pairs -/ lemma wm_pairs_count (O : Finset ℕ) : 2 * ((O ×ˢ O).filter (fun p : ℕ × ℕ => p.1 ≤ p.2)).card = O.card * (O.card + 1) := by classical have hall := Finset.card_filter_add_card_filter_not (s := O ×ˢ O) (fun p : ℕ × ℕ => p.1 ≤ p.2) rw [Finset.card_product] at hall have hle := Finset.card_filter_add_card_filter_not (s := (O ×ˢ O).filter (fun p : ℕ × ℕ => p.1 ≤ p.2)) (fun p : ℕ × ℕ => p.1 < p.2) rw [Finset.filter_filter, Finset.filter_filter] at hle have hlt : ((O ×ˢ O).filter (fun p : ℕ × ℕ => p.1 ≤ p.2 ∧ p.1 < p.2)).card = ((O ×ˢ O).filter (fun p : ℕ × ℕ => ¬ p.1 ≤ p.2)).card := by apply Finset.card_nbij' Prod.swap Prod.swap · intro p hp simp only [Finset.coe_filter, Finset.mem_product, Set.mem_ofPred_eq, Prod.fst_swap, Prod.snd_swap] at hp ⊢ exact ⟨⟨hp.1.2, hp.1.1⟩, by omega⟩ · intro p hp simp only [Finset.coe_filter, Finset.mem_product, Set.mem_ofPred_eq, Prod.fst_swap, Prod.snd_swap] at hp ⊢ exact ⟨⟨hp.1.2, hp.1.1⟩, by omega, by omega⟩ · intro p _ simp · intro p _ simp have heq : (O ×ˢ O).filter (fun p : ℕ × ℕ => p.1 ≤ p.2 ∧ ¬ p.1 < p.2) = O.image (fun a => (a, a)) := by ext p simp only [Finset.mem_filter, Finset.mem_product, Finset.mem_image] constructor · rintro ⟨⟨h1, _⟩, h3, h4⟩ exact ⟨p.1, h1, by ext <;> simp; omega⟩ · rintro ⟨a, ha, rfl⟩ exact ⟨⟨ha, ha⟩, le_rfl, lt_irrefl a⟩ rw [heq, Finset.card_image_of_injective _ (fun a b h => by simpa using h)] at hle rw [Nat.mul_add, Nat.mul_one] have hsq : O.card * O.card = O.card * O.card := rfl omega lemma wm_Pw_add_Pu (m ρ : ℕ) (O : Finset ℕ) : 2 * (wm_Pw m ρ O + wm_Pu m ρ O) = O.card * (O.card + 1) := by classical have h := Finset.card_filter_add_card_filter_not (s := (O ×ˢ O).filter (fun p : ℕ × ℕ => p.1 ≤ p.2)) (fun p : ℕ × ℕ => m ≤ p.1 + p.2 + ρ) rw [Finset.filter_filter, Finset.filter_filter] at h have e2 : (O ×ˢ O).filter (fun p : ℕ × ℕ => p.1 ≤ p.2 ∧ ¬ m ≤ p.1 + p.2 + ρ) = (O ×ˢ O).filter (fun p : ℕ × ℕ => p.1 ≤ p.2 ∧ p.1 + p.2 + ρ < m) := Finset.filter_congr (fun p _ => by omega) rw [e2] at h have hc := wm_pairs_count O unfold wm_Pw wm_Pu omega /-! ### Cardinality equations and (ID2_ρ) -/ lemma wm_card_union_YZ {m ρ : ℕ} {O : Finset ℕ} : (wm_Y m ρ O 3 ∪ wm_Z m ρ O 2).card = (wm_Y m ρ O 3).card + (wm_Zhat m ρ O).card := by have h := Finset.card_sdiff_add_card (wm_Z m ρ O 2) (wm_Y m ρ O 3) rw [Finset.union_comm] at h unfold wm_Zhat omega lemma wm_card_d_split {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) : (wm_Y m ρ O 4 ∪ wm_Z m ρ O 3).card + (wm_Zhat m ρ O ∩ wm_Y m ρ O 4).card = (wm_Y m ρ O 4).card + (wm_Zhat m ρ O).card + (wm_Q m ρ O).card := by have h1 := Finset.card_sdiff_add_card (wm_Z m ρ O 3) (wm_Y m ρ O 4) rw [Finset.union_comm] at h1 have hsub : wm_Z m ρ O 2 \ wm_Y m ρ O 4 ⊆ wm_Z m ρ O 3 \ wm_Y m ρ O 4 := Finset.sdiff_subset_sdiff (wm_Z_mono hρ (by norm_num)) le_rfl have h2 := Finset.card_sdiff_add_card_eq_card hsub have e2 : (wm_Z m ρ O 3 \ wm_Y m ρ O 4) \ (wm_Z m ρ O 2 \ wm_Y m ρ O 4) = wm_Q m ρ O := by ext x unfold wm_Q simp only [Finset.mem_sdiff, Finset.mem_union] tauto rw [e2] at h2 have h3 := Finset.card_sdiff_add_card_inter (wm_Zhat m ρ O) (wm_Y m ρ O 4) have e3 : wm_Zhat m ρ O \ wm_Y m ρ O 4 = wm_Z m ρ O 2 \ wm_Y m ρ O 4 := by ext x unfold wm_Zhat simp only [Finset.mem_sdiff] have := @wm_Y_mono m ρ O 3 4 (by norm_num) constructor · rintro ⟨⟨h1, _⟩, h3⟩ exact ⟨h1, h3⟩ · rintro ⟨h1, h3⟩ exact ⟨⟨h1, fun h => h3 (this h)⟩, h3⟩ rw [e3] at h3 omega /-- (ID2_ρ), A8 §1 / A12 §1: `W₀ = ρ + ζ₂ + Σ − |Q₃|` for every strip-free model. -/ theorem wm_ID2 {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) : wm_W0 m ρ O = (ρ : ℤ) + (wm_Zhat m ρ O).card + wm_Sigma m ρ O - (wm_Qj m ρ O 3).card := by have hell : wm_ell m ρ O = (wm_Y m ρ O 0).card + (wm_Y m ρ O 1).card + (wm_Y m ρ O 2).card + (wm_Y m ρ O 3).card + (wm_Zhat m ρ O).card := by unfold wm_ell simp only [Finset.sum_range_succ, Finset.sum_range_zero] rw [wm_B_eq_Y hρ hO (by norm_num : 0 ≤ 2), wm_B_eq_Y hρ hO (by norm_num : 1 ≤ 2), wm_B_eq_Y hρ hO (le_refl 2), wm_B_eq_YZ hρ hO (by norm_num : 1 ≤ 3) (by norm_num), wm_card_union_YZ] omega have hd : wm_d m ρ O + (wm_Zhat m ρ O ∩ wm_Y m ρ O 4).card = (wm_Y m ρ O 4).card + (wm_Zhat m ρ O).card + (wm_Q m ρ O).card := by unfold wm_d rw [wm_B_eq_YZ hρ hO (by norm_num : 1 ≤ 4) (le_refl 4)] exact wm_card_d_split hρ have h0 := wm_card_Y_zero (O := O) hρ have h1 := wm_card_Y_one hO hρ obtain ⟨hQ, hsw⟩ := wm_Q_partition (O := O) hρ have h6 := wm_lemma6 hρ hO have hP := wm_Pw_add_Pu m ρ O have hswz : ((∑ q ∈ wm_Q m ρ O, wm_w m ρ O q : ℕ) : ℤ) = ∑ q ∈ wm_Q m ρ O, (wm_w m ρ O q : ℤ) := by push_cast rfl unfold wm_W0 wm_Sigma wm_d3pp wm_d3 wm_d4 wm_h rw [← hswz] simp only [show (2 : ℕ) - 1 = 1 from rfl, show (3 : ℕ) - 1 = 2 from rfl, show (4 : ℕ) - 1 = 3 from rfl] generalize (∑ q ∈ wm_Q m ρ O, wm_w m ρ O q) = sw at hsw h6 ⊢ generalize wm_ell m ρ O = ell at hell ⊢ generalize wm_d m ρ O = dd at hd ⊢ generalize O.card = K at h1 h6 hP ⊢ generalize (wm_Y m ρ O 0).card = y0 at h0 hell ⊢ generalize (wm_Y m ρ O 1).card = y1 at h1 hell ⊢ generalize (wm_Y m ρ O 2).card = y2 at hell ⊢ generalize (wm_Y m ρ O 3).card = y3 at hell ⊢ generalize (wm_Y m ρ O 4).card = y4 at hd ⊢ generalize (wm_Zhat m ρ O).card = zt at hell hd h6 ⊢ generalize (wm_Zhat m ρ O ∩ wm_Y m ρ O 4).card = zy at hd ⊢ generalize (wm_Q m ρ O).card = qq at hd hQ ⊢ generalize wm_A m ρ O = aa at h6 ⊢ generalize wm_Pw m ρ O = pw at hP ⊢ generalize wm_Pu m ρ O = pu at hP ⊢ generalize (wm_Qj m ρ O 0).card = q0 at hQ hsw ⊢ generalize (wm_Qj m ρ O 1).card = q1 at hQ hsw ⊢ generalize (wm_Qj m ρ O 2).card = q2 at hQ hsw ⊢ generalize (wm_Qj m ρ O 3).card = q3 at hQ hsw ⊢ subst h0 h1 have hell' : (ell : ℤ) = 1 + ((K : ℤ) + 1) + y2 + y3 + zt := by exact_mod_cast hell have hd' : (dd : ℤ) + zy = y4 + zt + qq := by exact_mod_cast hd have hQ' : (qq : ℤ) = q0 + q1 + q2 + q3 := by exact_mod_cast hQ have hsw' : (sw : ℤ) = q1 + 2 * q2 + 3 * q3 := by exact_mod_cast hsw have h6' : (sw : ℤ) + aa = (K + 2) * zt := by exact_mod_cast h6 have hP' : 2 * ((pw : ℤ) + pu) = K * (K + 1) := by exact_mod_cast hP push_cast rw [hell'] linear_combination (-4 : ℤ) * hd' + (2 : ℤ) * hQ' - hsw' - h6' + (-3 : ℤ) * hP' -- ===== M1H.lean ===== /-! Highs, the least high `x₁`, holes and the geometry of `Q₃` (A8 §2). -/ /-- Highs (`2b ≥ N`, i.e. `m ≤ 2b + ρ`) and the least high `x₁` (`m` if there is none). -/ noncomputable def wm_high (m ρ : ℕ) (O : Finset ℕ) : Finset ℕ := by classical exact O.filter (fun b => m ≤ 2 * b + ρ) noncomputable def wm_x1 (m ρ : ℕ) (O : Finset ℕ) : ℕ := if h : (wm_high m ρ O).Nonempty then (wm_high m ρ O).min' h else m noncomputable def wm_holes (m ρ : ℕ) (O : Finset ℕ) : Finset ℕ := Finset.range m \ wm_B m ρ O 4 lemma wm_mem_high {m ρ : ℕ} {O : Finset ℕ} {b : ℕ} : b ∈ wm_high m ρ O ↔ b ∈ O ∧ m ≤ 2 * b + ρ := by classical unfold wm_high exact Finset.mem_filter lemma wm_x1_le {m ρ : ℕ} {O : Finset ℕ} {b : ℕ} (hb : b ∈ wm_high m ρ O) : wm_x1 m ρ O ≤ b := by unfold wm_x1 rw [dif_pos ⟨b, hb⟩] exact Finset.min'_le _ _ hb lemma wm_x1_mem {m ρ : ℕ} {O : Finset ℕ} (hh : (wm_high m ρ O).Nonempty) : wm_x1 m ρ O ∈ wm_high m ρ O := by unfold wm_x1 rw [dif_pos hh] exact Finset.min'_mem _ _ lemma wm_mem_Qj {m ρ : ℕ} {O : Finset ℕ} {j q : ℕ} : q ∈ wm_Qj m ρ O j ↔ q ∈ wm_Q m ρ O ∧ wm_w m ρ O q = j := by classical unfold wm_Qj exact Finset.mem_filter /-- Q₃ geometry (A8 §2): every `q ∈ Q₃` has a high factor `c ≤ q`; hence `x₁ ≤ q`. -/ theorem wm_Q3_ge {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) {q : ℕ} (hq : q ∈ wm_Qj m ρ O 3) : (wm_high m ρ O).Nonempty ∧ wm_x1 m ρ O ≤ q := by classical obtain ⟨hqQ, hw⟩ := wm_mem_Qj.1 hq obtain ⟨hdeg, hval⟩ := wm_beta_spec hρ hqQ set β := wm_beta m ρ O q with hβ have hsupp : (Finset.univ.filter (fun j => 0 < β j)).Nonempty := by obtain ⟨j, hj⟩ := m3_degree_pos_coord β (by omega) exact ⟨j, Finset.mem_filter.2 ⟨Finset.mem_univ _, hj⟩⟩ obtain ⟨i, hi, hmax⟩ := Finset.exists_max_image _ (wm_enum O) hsupp have hi0 : 0 < β i := (Finset.mem_filter.1 hi).2 -- every factor is `≤ q` (all parents wrapped) have hcq : wm_enum O i ≤ q := by by_contra hn have hsplit := Finset.add_sum_erase Finset.univ (fun j => if wm_enum O j ≤ q then β j else 0) (Finset.mem_univ i) have hsplit2 := Finset.add_sum_erase Finset.univ β (Finset.mem_univ i) have hle : (∑ j ∈ Finset.univ.erase i, if wm_enum O j ≤ q then β j else 0) ≤ ∑ j ∈ Finset.univ.erase i, β j := Finset.sum_le_sum (fun j _ => by split_ifs <;> omega) rw [if_neg hn] at hsplit unfold wm_w at hw unfold m3_degree at hdeg rw [← hβ] at hw omega -- the parent removing the largest factor has value `≤ 2c` set c := wm_enum O i with hc have hpd : m3_degree (m3_parent β i) = 2 := by have := m3_degree_parent β i hi0 omega have hpv := m3_value_parent (wm_enum O) β i hi0 have hbound : m3_value (wm_enum O) (m3_parent β i) ≤ 2 * c := by unfold m3_value unfold m3_degree at hpd calc (∑ j, m3_parent β i j * wm_enum O j) ≤ ∑ j, m3_parent β i j * c := by apply Finset.sum_le_sum intro j _ by_cases hj : m3_parent β i j = 0 · rw [hj, Nat.zero_mul, Nat.zero_mul] · apply Nat.mul_le_mul_left apply hmax refine Finset.mem_filter.2 ⟨Finset.mem_univ _, ?_⟩ have hle : m3_parent β i j ≤ β j := by unfold m3_parent by_cases hji : j = i · subst hji simp · simp [Function.update, hji] omega _ = 2 * c := by rw [← Finset.sum_mul, hpd] have hcO : c ∈ O := wm_enum_mem O i have hqm := wm_Q_lt hρ hqQ have hhigh : c ∈ wm_high m ρ O := wm_mem_high.2 ⟨hcO, by omega⟩ exact ⟨⟨c, hhigh⟩, le_trans (wm_x1_le hhigh) hcq⟩ /-- `F = Q₃ − x₁` avoids `Y₃` (A8 Lemma 5′_ρ). -/ lemma wm_shift_not_Y3 {m ρ : ℕ} {O : Finset ℕ} {q : ℕ} (hq : q ∈ wm_Q m ρ O) (hρ : ρ < m) (hx : wm_x1 m ρ O ≤ q) (hxO : wm_x1 m ρ O ∈ O) : q - wm_x1 m ρ O ∉ wm_Y m ρ O 3 := by intro hY obtain ⟨h1, h2, h3⟩ := wm_mem_Y.1 hY apply (wm_Q_sub hq).2.1 refine wm_mem_Y.2 ⟨by omega, wm_Q_lt hρ hq, ?_⟩ rw [show q - ρ = (q - wm_x1 m ρ O - ρ) + wm_x1 m ρ O by omega, succ_nsmul] exact Finset.mem_add.2 ⟨_, h3, _, Finset.mem_insert_of_mem hxO, rfl⟩ lemma wm_holes_card {m ρ : ℕ} {O : Finset ℕ} (hm : 0 < m) : ((wm_holes m ρ O).card : ℤ) = wm_p m ρ O := by unfold wm_holes wm_p wm_d rw [Finset.card_sdiff_of_subset (wm_B_sub_range hm 4), Finset.card_range] have := Finset.card_le_card (wm_B_sub_range (ρ := ρ) (B := O) hm 4) rw [Finset.card_range] at this omega -- ===== M7P.lean ===== /-! Anchor proof, part P (EXT1-anchor/FULL_PROOF.tex Lemmas 2 and 4): the unwrapped multicomplex `M_t`, canonical divisor closure, `coll ≥ 0`, `δ = d3'' ≥ 0`, and the residual quartic estimate `d4 ≥ h4`. Strip-free model `O`. -/ /-- `M_t = {rep_t(s) : s + ρ ∈ Y_t ∖ Y_{t−1}}` (unwrapped canonical monomials of degree `t`). -/ noncomputable def wm_M (m ρ : ℕ) (O : Finset ℕ) (t : ℕ) : Finset (Fin O.card → ℕ) := by classical exact (wm_Y m ρ O t \ wm_Y m ρ O (t - 1)).image (fun u => wm_rep O t (u - ρ)) lemma wm_pure_of_new {m ρ : ℕ} {O : Finset ℕ} {t u : ℕ} (ht : 1 ≤ t) (hu : u ∈ wm_Y m ρ O t \ wm_Y m ρ O (t - 1)) : u - ρ ∈ t • O := by obtain ⟨hut, hun⟩ := Finset.mem_sdiff.1 hu obtain ⟨h1, h2, h3⟩ := wm_mem_Y.1 hut obtain ⟨j, hj, hjs⟩ := (wm_mem_nsmul_insert O t _).1 h3 by_cases hjt : j = t · subst hjt exact hjs · exact absurd (wm_mem_Y.2 ⟨h1, h2, (wm_mem_nsmul_insert O (t - 1) _).2 ⟨j, by omega, hjs⟩⟩) hun lemma wm_M_card {m ρ : ℕ} {O : Finset ℕ} {t : ℕ} (ht : 1 ≤ t) : (wm_M m ρ O t).card = (wm_Y m ρ O t \ wm_Y m ρ O (t - 1)).card := by classical unfold wm_M apply Finset.card_image_of_injOn intro u hu v hv he have hu' := Finset.mem_coe.1 hu have hv' := Finset.mem_coe.1 hv have h1 := (wm_rep_spec O (wm_pure_of_new ht hu')).2 have h2 := (wm_rep_spec O (wm_pure_of_new ht hv')).2 simp only at he rw [he] at h1 have hu1 := (wm_mem_Y.1 (Finset.mem_sdiff.1 hu').1).1 have hv1 := (wm_mem_Y.1 (Finset.mem_sdiff.1 hv').1).1 omega lemma wm_card_new {m ρ : ℕ} {O : Finset ℕ} {t : ℕ} (ht : 1 ≤ t) : ((wm_Y m ρ O t \ wm_Y m ρ O (t - 1)).card : ℤ) = wm_h m ρ O t := by unfold wm_h rw [Finset.card_sdiff_of_subset (wm_Y_mono (by omega))] have := Finset.card_le_card (wm_Y_mono (m := m) (ρ := ρ) (O := O) (show t - 1 ≤ t by omega)) omega lemma wm_mem_M {m ρ : ℕ} {O : Finset ℕ} {t : ℕ} (ht : 1 ≤ t) {α : Fin O.card → ℕ} (hα : α ∈ wm_M m ρ O t) : m3_degree α = t ∧ m3_value (wm_enum O) α + ρ < m ∧ α = wm_rep O t (m3_value (wm_enum O) α) := by classical unfold wm_M at hα obtain ⟨u, hu, rfl⟩ := Finset.mem_image.1 hα have hs := wm_rep_spec O (wm_pure_of_new ht hu) obtain ⟨h1, h2, _⟩ := wm_mem_Y.1 (Finset.mem_sdiff.1 hu).1 refine ⟨hs.1, by rw [hs.2]; omega, by rw [hs.2]⟩ /-- Canonical divisor closure of the unwrapped multicomplex. -/ lemma wm_M_parent {m ρ : ℕ} {O : Finset ℕ} {t : ℕ} (ht : 1 ≤ t) (ht4 : t + 1 < 6) {β : Fin O.card → ℕ} (hβ : β ∈ wm_M m ρ O (t + 1)) {i : Fin O.card} (hi : 0 < β i) : m3_parent β i ∈ wm_M m ρ O t := by classical unfold wm_M at hβ obtain ⟨u, hu, rfl⟩ := Finset.mem_image.1 hβ have hpure := wm_pure_of_new (by omega) hu have hs := wm_rep_spec O hpure have hpar := wm_rep_parent O (d := t) ht4 hpure i hi have hval := m3_value_parent (wm_enum O) (wm_rep O (t + 1) (u - ρ)) i hi rw [hs.2] at hval obtain ⟨hut, hun⟩ := Finset.mem_sdiff.1 hu obtain ⟨h1, h2, h3⟩ := wm_mem_Y.1 hut have hpd : m3_degree (m3_parent (wm_rep O (t + 1) (u - ρ)) i) = t := by have := m3_degree_parent (wm_rep O (t + 1) (u - ρ)) i hi omega have hvm := wm_value_mem O t _ hpd set v := m3_value (wm_enum O) (m3_parent (wm_rep O (t + 1) (u - ρ)) i) with hv unfold wm_M refine Finset.mem_image.2 ⟨v + ρ, Finset.mem_sdiff.2 ⟨wm_mem_Y.2 ⟨by omega, by omega, ?_⟩, ?_⟩, ?_⟩ · rw [show v + ρ - ρ = v by omega] exact wm_nsmul_of_pure hvm · intro hY obtain ⟨_, _, h3'⟩ := wm_mem_Y.1 hY apply hun refine wm_mem_Y.2 ⟨h1, h2, ?_⟩ rw [show v + ρ - ρ = v by omega] at h3' rw [show u - ρ = v + wm_enum O i by omega, show t + 1 - 1 = (t - 1) + 1 by omega, succ_nsmul] exact Finset.mem_add.2 ⟨v, h3', _, Finset.mem_insert_of_mem (wm_enum_mem O i), rfl⟩ · rw [show v + ρ - ρ = v by omega] exact hpar.symm /-! ### coll ≥ 0 -/ lemma wm_two_split {O : Finset ℕ} {s : ℕ} (hs : s ∈ 2 • O) : ∃ a b, a ∈ O ∧ b ∈ O ∧ a ≤ b ∧ a + b = s := by rw [two_nsmul] at hs obtain ⟨a, ha, b, hb, rfl⟩ := Finset.mem_add.1 hs rcases le_total a b with h | h · exact ⟨a, b, ha, hb, h, rfl⟩ · exact ⟨b, a, hb, ha, h, by omega⟩ lemma wm_Pw_ge {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) : (wm_Zhat m ρ O).card ≤ wm_Pw m ρ O := by classical have hsub : wm_Zhat m ρ O ⊆ ((O ×ˢ O).filter (fun p : ℕ × ℕ => p.1 ≤ p.2 ∧ m ≤ p.1 + p.2 + ρ)).image (fun p => p.1 + p.2 + ρ - m) := by intro z hz have h2 := wm_two_of_Z2 hρ hO (Finset.mem_sdiff.1 hz).1 obtain ⟨a, b, ha, hb, hab, he⟩ := wm_two_split h2 refine Finset.mem_image.2 ⟨(a, b), Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨ha, hb⟩, hab, by simp only; omega⟩, by simp only; omega⟩ unfold wm_Pw exact (Finset.card_le_card hsub).trans Finset.card_image_le lemma wm_Pu_ge {m ρ : ℕ} {O : Finset ℕ} : (wm_Y m ρ O 2 \ wm_Y m ρ O 1).card ≤ wm_Pu m ρ O := by classical have hsub : wm_Y m ρ O 2 \ wm_Y m ρ O 1 ⊆ ((O ×ˢ O).filter (fun p : ℕ × ℕ => p.1 ≤ p.2 ∧ p.1 + p.2 + ρ < m)).image (fun p => p.1 + p.2 + ρ) := by intro u hu have h2 := wm_pure_of_new (t := 2) (by norm_num) hu obtain ⟨_, h2', _⟩ := wm_mem_Y.1 (Finset.mem_sdiff.1 hu).1 obtain ⟨h1', _, _⟩ := wm_mem_Y.1 (Finset.mem_sdiff.1 hu).1 obtain ⟨a, b, ha, hb, hab, he⟩ := wm_two_split h2 refine Finset.mem_image.2 ⟨(a, b), Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨ha, hb⟩, hab, by simp only; omega⟩, by simp only; omega⟩ unfold wm_Pu exact (Finset.card_le_card hsub).trans Finset.card_image_le /-- `coll = 6(P_u − h₂) + 6(P_w − ζ₂) ≥ 0`. -/ noncomputable def wm_coll (m ρ : ℕ) (O : Finset ℕ) : ℤ := 6 * ((wm_Pw m ρ O : ℤ) - (wm_Zhat m ρ O).card) + 6 * ((wm_Pu m ρ O : ℤ) - wm_h m ρ O 2) lemma wm_coll_nonneg {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) : 0 ≤ wm_coll m ρ O := by have h1 := wm_Pw_ge hρ hO have h2 := wm_Pu_ge (m := m) (ρ := ρ) (O := O) have h3 : ((wm_Y m ρ O 2 \ wm_Y m ρ O 1).card : ℤ) = wm_h m ρ O 2 := wm_card_new (t := 2) (by norm_num) unfold wm_coll omega /-! ### δ = d3'' ≥ 0 (Lemma 3_ρ) -/ /-- An unwrapped parent of `β_q` lies in `M₂`. -/ lemma wm_beta_parent_unwrapped {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) {q : ℕ} (hq : q ∈ wm_Q m ρ O) {i : Fin O.card} (hi : 0 < wm_beta m ρ O q i) (hlt : q < wm_enum O i) : m3_parent (wm_beta m ρ O q) i ∈ wm_M m ρ O 2 := by classical have hs3 := wm_three_of_Q hρ hq have hspec := wm_rep_spec O hs3 have hpar : m3_parent (wm_rep O 3 (q + m - ρ)) i = wm_rep O 2 (m3_value (wm_enum O) (m3_parent (wm_rep O 3 (q + m - ρ)) i)) := wm_rep_parent O (d := 2) (by norm_num) hs3 i hi have hval := m3_value_parent (wm_enum O) (wm_rep O 3 (q + m - ρ)) i hi rw [hspec.2] at hval have hpd : m3_degree (m3_parent (wm_rep O 3 (q + m - ρ)) i) = 2 := by have := m3_degree_parent (wm_rep O 3 (q + m - ρ)) i hi rw [hspec.1] at this omega have hvm := wm_value_mem O 2 _ hpd have hqm := wm_Q_lt hρ hq set v := m3_value (wm_enum O) (m3_parent (wm_rep O 3 (q + m - ρ)) i) with hv change m3_parent (wm_rep O 3 (q + m - ρ)) i ∈ wm_M m ρ O 2 unfold wm_M refine Finset.mem_image.2 ⟨v + ρ, Finset.mem_sdiff.2 ⟨wm_mem_Y.2 ⟨by omega, by omega, ?_⟩, ?_⟩, ?_⟩ · rw [show v + ρ - ρ = v by omega] exact wm_nsmul_of_pure hvm · intro hY obtain ⟨_, _, h3'⟩ := wm_mem_Y.1 hY rw [show v + ρ - ρ = v by omega] at h3' apply (wm_Q_sub hq).2.2 refine (wm_mem_Z hρ).2 ⟨hqm, ?_⟩ rw [show q + m - ρ = v + wm_enum O i by omega, show (2 : ℕ) = 1 + 1 from rfl, succ_nsmul] exact Finset.mem_add.2 ⟨v, h3', _, Finset.mem_insert_of_mem (wm_enum_mem O i), rfl⟩ · rw [show v + ρ - ρ = v by omega] exact hpar.symm lemma wm_beta_inj {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) {q q' : ℕ} (hq : q ∈ wm_Q m ρ O) (hq' : q' ∈ wm_Q m ρ O) (he : wm_beta m ρ O q = wm_beta m ρ O q') : q = q' := by have h1 := (wm_beta_spec hρ hq).2 have h2 := (wm_beta_spec hρ hq').2 rw [he] at h1 have := wm_Q_lt hρ hq have := wm_Q_lt hρ hq' omega lemma wm_delta_coord {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (i : Fin O.card) : (∑ β ∈ wm_M m ρ O 3, β i) + (∑ q ∈ wm_Q m ρ O, if q < wm_enum O i then wm_beta m ρ O q i else 0) ≤ ∑ α ∈ wm_M m ρ O 2, (α i + 1) := by classical set T1 := (wm_M m ρ O 3).filter (fun β => 0 < β i) with hT1 set Qf := (wm_Q m ρ O).filter (fun q => q < wm_enum O i ∧ 0 < wm_beta m ρ O q i) with hQf set T2 := Qf.image (wm_beta m ρ O) with hT2 have e1 : (∑ β ∈ wm_M m ρ O 3, β i) = ∑ β ∈ T1, β i := by rw [hT1, Finset.sum_filter] exact Finset.sum_congr rfl (fun β _ => by split_ifs <;> omega) have e2 : (∑ q ∈ wm_Q m ρ O, if q < wm_enum O i then wm_beta m ρ O q i else 0) = ∑ β ∈ T2, β i := by rw [hT2, Finset.sum_image (fun a ha b hb he => wm_beta_inj hρ (Finset.mem_filter.1 ha).1 (Finset.mem_filter.1 hb).1 he), Finset.sum_filter] exact Finset.sum_congr rfl (fun q _ => by split_ifs <;> omega) have hdisj : Disjoint T1 T2 := by rw [Finset.disjoint_left] intro β h1 h2 obtain ⟨q, hq, rfl⟩ := Finset.mem_image.1 h2 have hqQ := (Finset.mem_filter.1 hq).1 have hv1 := (wm_mem_M (by norm_num) (Finset.mem_filter.1 h1).1).2.1 have hv2 := (wm_beta_spec hρ hqQ).2 omega rw [e1, e2, ← Finset.sum_union hdisj] apply Finset.sum_le_sum_of_injOn (fun β => m3_parent β i) · intro x hx y hy hxy have hx' : 0 < x i := by rcases Finset.mem_union.1 (Finset.mem_coe.1 hx) with h | h · exact (Finset.mem_filter.1 h).2 · obtain ⟨q, hq, rfl⟩ := Finset.mem_image.1 h exact (Finset.mem_filter.1 hq).2.2 have hy' : 0 < y i := by rcases Finset.mem_union.1 (Finset.mem_coe.1 hy) with h | h · exact (Finset.mem_filter.1 h).2 · obtain ⟨q, hq, rfl⟩ := Finset.mem_image.1 h exact (Finset.mem_filter.1 hq).2.2 exact n4_parent_injective i hx' hy' hxy · intro α hα obtain ⟨β, hβ, rfl⟩ := Finset.mem_image.1 hα rcases Finset.mem_union.1 hβ with h | h · exact wm_M_parent (t := 2) (by norm_num) (by norm_num) (Finset.mem_filter.1 h).1 (Finset.mem_filter.1 h).2 · obtain ⟨q, hq, rfl⟩ := Finset.mem_image.1 h obtain ⟨hqQ, hlt, hpos⟩ := Finset.mem_filter.1 hq exact wm_beta_parent_unwrapped hρ hqQ hpos hlt · intro β hβ have hpos : 0 < β i := by rcases Finset.mem_union.1 hβ with h | h · exact (Finset.mem_filter.1 h).2 · obtain ⟨q, hq, rfl⟩ := Finset.mem_image.1 h exact (Finset.mem_filter.1 hq).2.2 simp only [m3_parent, Function.update_self] omega · intro α _ _ exact Nat.zero_le _ lemma wm_w_add_u {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) {q : ℕ} (hq : q ∈ wm_Q m ρ O) : wm_w m ρ O q + ∑ i, (if q < wm_enum O i then wm_beta m ρ O q i else 0) = 3 := by have hd := (wm_beta_spec hρ hq).1 unfold m3_degree at hd unfold wm_w rw [← Finset.sum_add_distrib, ← hd] exact Finset.sum_congr rfl (fun i _ => by split_ifs <;> omega) /-- Lemma 3_ρ: `δ = d3'' ≥ 0`. -/ theorem wm_d3pp_nonneg {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) : 0 ≤ wm_d3pp m ρ O := by classical have hsum := Finset.sum_le_sum (fun i (_ : i ∈ (Finset.univ : Finset (Fin O.card))) => wm_delta_coord (m := m) (ρ := ρ) (O := O) hρ i) rw [Finset.sum_add_distrib, Finset.sum_comm, Finset.sum_comm (s := Finset.univ) (t := wm_Q m ρ O), Finset.sum_comm (s := Finset.univ) (t := wm_M m ρ O 2)] at hsum have h3 : (∑ β ∈ wm_M m ρ O 3, ∑ i, β i) = 3 * (wm_M m ρ O 3).card := by rw [Finset.sum_congr rfl (fun β hβ => by have := (wm_mem_M (t := 3) (by norm_num) hβ).1 unfold m3_degree at this exact this), Finset.sum_const, smul_eq_mul, Nat.mul_comm] have h2 : (∑ α ∈ wm_M m ρ O 2, ∑ i, (α i + 1)) = (O.card + 2) * (wm_M m ρ O 2).card := by have : ∀ α ∈ wm_M m ρ O 2, (∑ i, (α i + 1)) = O.card + 2 := by intro α hα have hd := (wm_mem_M (t := 2) (by norm_num) hα).1 unfold m3_degree at hd rw [Finset.sum_add_distrib, hd] simp [Nat.add_comm] rw [Finset.sum_congr rfl this, Finset.sum_const, smul_eq_mul, Nat.mul_comm] have hu : (∑ q ∈ wm_Q m ρ O, wm_w m ρ O q) + ∑ q ∈ wm_Q m ρ O, ∑ i, (if q < wm_enum O i then wm_beta m ρ O q i else 0) = 3 * (wm_Q m ρ O).card := by rw [← Finset.sum_add_distrib, Finset.sum_congr rfl (fun q hq => wm_w_add_u hρ hq), Finset.sum_const, smul_eq_mul, Nat.mul_comm] rw [h3, h2] at hsum have hc2 := wm_M_card (m := m) (ρ := ρ) (O := O) (t := 2) (by norm_num) have hc3 := wm_M_card (m := m) (ρ := ρ) (O := O) (t := 3) (by norm_num) have hn2 := wm_card_new (m := m) (ρ := ρ) (O := O) (t := 2) (by norm_num) have hn3 := wm_card_new (m := m) (ρ := ρ) (O := O) (t := 3) (by norm_num) have hcast : ((∑ q ∈ wm_Q m ρ O, wm_w m ρ O q : ℕ) : ℤ) = ∑ q ∈ wm_Q m ρ O, (wm_w m ρ O q : ℤ) := by push_cast; rfl unfold wm_d3pp wm_d3 rw [← hcast] generalize (∑ q ∈ wm_Q m ρ O, ∑ i, (if q < wm_enum O i then wm_beta m ρ O q i else 0)) = U at hsum hu generalize (∑ q ∈ wm_Q m ρ O, wm_w m ρ O q) = sw at hu ⊢ rw [← hn2, ← hn3, ← hc2, ← hc3] generalize (wm_M m ρ O 2).card = M2 at hsum ⊢ generalize (wm_M m ρ O 3).card = M3 at hsum ⊢ generalize O.card = K at hsum ⊢ have hsum' : (3 * M3 : ℤ) + U ≤ (K + 2) * M2 := by exact_mod_cast hsum have hu' : (sw : ℤ) + U = 3 * (wm_Q m ρ O).card := by exact_mod_cast hu push_cast linarith /-! ### The residual quartic estimate `d4 ≥ h4` -/ /-- Number of high factors of a monomial. -/ noncomputable def wm_hd (m ρ : ℕ) (O : Finset ℕ) (α : Fin O.card → ℕ) : ℕ := by classical exact ∑ i ∈ Finset.univ.filter (fun i => wm_enum O i ∈ wm_high m ρ O), α i noncomputable def wm_lowIdx (m ρ : ℕ) (O : Finset ℕ) : Finset (Fin O.card) := by classical exact Finset.univ.filter (fun i => wm_enum O i ∉ wm_high m ρ O) lemma wm_low_sum {m ρ : ℕ} {O : Finset ℕ} (α : Fin O.card → ℕ) : (∑ i ∈ wm_lowIdx m ρ O, α i) + wm_hd m ρ O α = m3_degree α := by classical unfold wm_lowIdx wm_hd m3_degree rw [Nat.add_comm] exact Finset.sum_filter_add_sum_filter_not _ _ _ lemma wm_hd_le_one {m ρ : ℕ} {O : Finset ℕ} {α : Fin O.card → ℕ} (hv : m3_value (wm_enum O) α + ρ < m) : wm_hd m ρ O α ≤ 1 := by classical by_contra hn have hle : (∑ i ∈ Finset.univ.filter (fun i => wm_enum O i ∈ wm_high m ρ O), α i * (m - ρ)) ≤ ∑ i ∈ Finset.univ.filter (fun i => wm_enum O i ∈ wm_high m ρ O), α i * (2 * wm_enum O i) := by apply Finset.sum_le_sum intro i hi have := (wm_mem_high.1 (Finset.mem_filter.1 hi).2).2 exact Nat.mul_le_mul_left _ (by omega) have hsub : (∑ i ∈ Finset.univ.filter (fun i => wm_enum O i ∈ wm_high m ρ O), α i * (2 * wm_enum O i)) ≤ 2 * m3_value (wm_enum O) α := by unfold m3_value rw [Finset.mul_sum] calc (∑ i ∈ Finset.univ.filter (fun i => wm_enum O i ∈ wm_high m ρ O), α i * (2 * wm_enum O i)) ≤ ∑ i, α i * (2 * wm_enum O i) := Finset.sum_le_sum_of_subset_of_nonneg (Finset.filter_subset _ _) (fun _ _ _ => Nat.zero_le _) _ = ∑ i, 2 * (α i * wm_enum O i) := Finset.sum_congr rfl (fun i _ => by ring) rw [← Finset.sum_mul] at hle have hhd : 2 ≤ ∑ i ∈ Finset.univ.filter (fun i => wm_enum O i ∈ wm_high m ρ O), α i := by unfold wm_hd at hn omega have := Nat.mul_le_mul_right (m - ρ) hhd omega lemma wm_hd_parent_low {m ρ : ℕ} {O : Finset ℕ} {β : Fin O.card → ℕ} {i : Fin O.card} (hi : i ∈ wm_lowIdx m ρ O) : wm_hd m ρ O (m3_parent β i) = wm_hd m ρ O β := by classical unfold wm_hd apply Finset.sum_congr rfl intro j hj have hji : j ≠ i := by rintro rfl unfold wm_lowIdx at hi exact (Finset.mem_filter.1 hi).2 (Finset.mem_filter.1 hj).2 simp [m3_parent, Function.update, hji] lemma wm_lowIdx_card {m ρ : ℕ} {O : Finset ℕ} : (wm_lowIdx m ρ O).card = (O.filter (fun b => 2 * b + ρ < m)).card := by classical unfold wm_lowIdx rw [← Finset.card_image_of_injective _ (wm_enum_inj O)] congr 1 ext b simp only [Finset.mem_image, Finset.mem_filter, Finset.mem_univ, true_and, wm_mem_high] constructor · rintro ⟨i, hi, rfl⟩ push Not at hi exact ⟨wm_enum_mem O i, hi (wm_enum_mem O i)⟩ · rintro ⟨hb, hlt⟩ obtain ⟨i, rfl⟩ := wm_enum_surj O hb exact ⟨i, fun h => by omega, rfl⟩ /-- Residual arithmetic (LEAN_GUIDE §10): `3h ≥ 2l + 1` and `4h ≥ l + 3`. -/ lemma wm_res_arith (l h : ℕ) (hh : 3 ≤ h) (hres : 3 * l * (l + 1) < (l + h) * (l + h - 1)) : 2 * l + 1 ≤ 3 * h ∧ l + 3 ≤ 4 * h := by have h1 : 2 * l + 1 ≤ 3 * h := by by_contra hn push Not at hn have hK : (l + h - 1 : ℕ) = l + h - 1 := rfl have hz : ((l + h) * (l + h - 1) : ℕ) = ((l + h : ℕ) : ℤ) * ((l + h : ℤ) - 1) := by push_cast [Nat.cast_sub (show 1 ≤ l + h by omega)] ring have hres' : (3 * l * (l + 1) : ℤ) < (l + h) * (l + h - 1) := by have := hres zify [show 1 ≤ l + h by omega] at this linarith have hA : (0 : ℤ) ≤ (2 * l + 1 - 3 * h) := by omega have hB : (0 : ℤ) ≤ (8 * l + 3 * h - 2) := by omega nlinarith [mul_nonneg hA hB] exact ⟨h1, by omega⟩ /-- Lemma 4 (residual quartic estimate): `d4 ≥ h4`. -/ theorem wm_quartic {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hres : wm_Residual m ρ O) : wm_h m ρ O 4 ≤ wm_d4 m ρ O := by classical set L := wm_lowIdx m ρ O with hL set M30 := (wm_M m ρ O 3).filter (fun α => wm_hd m ρ O α = 0) with hM30 set M31 := (wm_M m ρ O 3).filter (fun α => ¬ wm_hd m ρ O α = 0) with hM31 set M40 := (wm_M m ρ O 4).filter (fun α => wm_hd m ρ O α = 0) with hM40 set M41 := (wm_M m ρ O 4).filter (fun α => ¬ wm_hd m ρ O α = 0) with hM41 have hlowsum : ∀ (t : ℕ) α, 1 ≤ t → α ∈ wm_M m ρ O t → (∑ i ∈ L, α i) + wm_hd m ρ O α = t := by intro t α ht hα rw [wm_low_sum] exact (wm_mem_M ht hα).1 have hhd1 : ∀ (t : ℕ) α, 1 ≤ t → α ∈ wm_M m ρ O t → wm_hd m ρ O α ≤ 1 := fun t α ht hα => wm_hd_le_one (wm_mem_M ht hα).2.1 have s0 : (3 + 1) * M40.card ≤ (L.card + 3) * M30.card := by apply gm_weighted_shadow L M30 M40 · intro a ha have := hlowsum 3 a (by norm_num) (Finset.mem_filter.1 ha).1 rw [(Finset.mem_filter.1 ha).2] at this omega · intro b hb have := hlowsum 4 b (by norm_num) (Finset.mem_filter.1 hb).1 rw [(Finset.mem_filter.1 hb).2] at this omega · intro b hb i hi hpos refine Finset.mem_filter.2 ⟨wm_M_parent (t := 3) (by norm_num) (by norm_num) (Finset.mem_filter.1 hb).1 hpos, ?_⟩ change wm_hd m ρ O (m3_parent b i) = 0 rw [wm_hd_parent_low hi] exact (Finset.mem_filter.1 hb).2 have s1 : (2 + 1) * M41.card ≤ (L.card + 2) * M31.card := by apply gm_weighted_shadow L M31 M41 · intro a ha have h1 := hlowsum 3 a (by norm_num) (Finset.mem_filter.1 ha).1 have h2 := hhd1 3 a (by norm_num) (Finset.mem_filter.1 ha).1 have h3 := (Finset.mem_filter.1 ha).2 omega · intro b hb have h1 := hlowsum 4 b (by norm_num) (Finset.mem_filter.1 hb).1 have h2 := hhd1 4 b (by norm_num) (Finset.mem_filter.1 hb).1 have h3 := (Finset.mem_filter.1 hb).2 omega · intro b hb i hi hpos refine Finset.mem_filter.2 ⟨wm_M_parent (t := 3) (by norm_num) (by norm_num) (Finset.mem_filter.1 hb).1 hpos, ?_⟩ change ¬ wm_hd m ρ O (m3_parent b i) = 0 rw [wm_hd_parent_low hi] exact (Finset.mem_filter.1 hb).2 have c3 := Finset.card_filter_add_card_filter_not (s := wm_M m ρ O 3) (fun α => wm_hd m ρ O α = 0) have c4 := Finset.card_filter_add_card_filter_not (s := wm_M m ρ O 4) (fun α => wm_hd m ρ O α = 0) have hn3 := wm_card_new (m := m) (ρ := ρ) (O := O) (t := 3) (by norm_num) have hn4 := wm_card_new (m := m) (ρ := ρ) (O := O) (t := 4) (by norm_num) have hc3 := wm_M_card (m := m) (ρ := ρ) (O := O) (t := 3) (by norm_num) have hc4 := wm_M_card (m := m) (ρ := ρ) (O := O) (t := 4) (by norm_num) -- window counts obtain ⟨_, hK4, hpop, hh3⟩ := hres have hLc := wm_lowIdx_card (m := m) (ρ := ρ) (O := O) have hKs := Finset.card_filter_add_card_filter_not (s := O) (fun b => 2 * b + ρ < m) have ehigh : O.filter (fun b => ¬ 2 * b + ρ < m) = O.filter (fun b => m ≤ 2 * b + ρ) := Finset.filter_congr (fun b _ => by omega) rw [ehigh] at hKs rw [← hKs] at hpop obtain ⟨a1, a2⟩ := wm_res_arith _ _ hh3 hpop unfold wm_d4 rw [← hn3, ← hn4, ← hc3, ← hc4, ← c3, ← c4] have s0' : (4 : ℤ) * M40.card ≤ (L.card + 3) * M30.card := by exact_mod_cast s0 have s1' : (3 : ℤ) * M41.card ≤ (L.card + 2) * M31.card := by exact_mod_cast s1 have hLc' : (L.card : ℤ) = (O.filter (fun b => 2 * b + ρ < m)).card := by exact_mod_cast hLc have hKs' : (O.card : ℤ) = (O.filter (fun b => 2 * b + ρ < m)).card + (O.filter (fun b => m ≤ 2 * b + ρ)).card := by exact_mod_cast hKs.symm rw [hLc'] at s0' s1' have a1' : (2 : ℤ) * (O.filter (fun b => 2 * b + ρ < m)).card + 1 ≤ 3 * (O.filter (fun b => m ≤ 2 * b + ρ)).card := by exact_mod_cast a1 have a2' : ((O.filter (fun b => 2 * b + ρ < m)).card : ℤ) + 3 ≤ 4 * (O.filter (fun b => m ≤ 2 * b + ρ)).card := by exact_mod_cast a2 generalize ((O.filter (fun b => 2 * b + ρ < m)).card : ℤ) = l at s0' s1' hKs' a1' a2' ⊢ generalize ((O.filter (fun b => m ≤ 2 * b + ρ)).card : ℤ) = hc at hKs' a1' a2' ⊢ push_cast rw [hKs'] have p0 : (0 : ℤ) ≤ (4 * hc - (l + 3)) * M30.card := mul_nonneg (by linarith) (by positivity) have p1 : (0 : ℤ) ≤ (3 * hc - (2 * l + 1)) * M31.card := mul_nonneg (by linarith) (by positivity) nlinarith [p0, p1, s0', s1'] lemma wm_N40_le {m ρ : ℕ} {O : Finset ℕ} (X : Finset ℕ) : ((wm_N40 m ρ O ∩ X).card : ℤ) ≤ wm_h m ρ O 4 := by rw [← wm_card_new (t := 4) (by norm_num)] have : wm_N40 m ρ O ∩ X ⊆ wm_Y m ρ O 4 \ wm_Y m ρ O (4 - 1) := by intro x hx unfold wm_N40 at hx simp only [Finset.mem_inter, Finset.mem_sdiff] at hx exact Finset.mem_sdiff.2 ⟨hx.1.1.1, hx.1.1.2⟩ exact_mod_cast Finset.card_le_card this -- ===== M7A.lean ===== /-! Anchor proof, part A (EXT1-anchor/FULL_PROOF.tex Lemmas 5, 6): ranks of highs, the short sets `D(c)`, short counts `j(v)`, the balanced anchor (BAL-LEFT, COL-RANK), the shell partition and the anchored inequality. Shifted coordinates (D1): `I = [0, g)`, `g = m − ρ − y`; `J = [y, m)`. Highs are indexed by value; the rank of a high `c` is `m3_rank hi c` (0-based). -/ /-- The `r`-th element (0-based) of a finite set of naturals. -/ lemma wm_nth_exists (S : Finset ℕ) {r : ℕ} (h : r < S.card) : ∃ x ∈ S, m3_rank S x = r := by have : r ∈ S.image (m3_rank S) := by rw [m3_rank_image] exact Finset.mem_range.2 h obtain ⟨x, hx, he⟩ := Finset.mem_image.1 this exact ⟨x, hx, he⟩ noncomputable def wm_nth (S : Finset ℕ) (r : ℕ) : ℕ := if h : r < S.card then Classical.choose (wm_nth_exists S h) else 0 lemma wm_nth_spec (S : Finset ℕ) {r : ℕ} (h : r < S.card) : wm_nth S r ∈ S ∧ m3_rank S (wm_nth S r) = r := by unfold wm_nth rw [dif_pos h] exact Classical.choose_spec (wm_nth_exists S h) lemma wm_rank_mono (S : Finset ℕ) {a b : ℕ} (h : a ≤ b) : m3_rank S a ≤ m3_rank S b := by classical unfold m3_rank exact Finset.card_le_card (fun u hu => Finset.mem_filter.2 ⟨(Finset.mem_filter.1 hu).1, lt_of_lt_of_le (Finset.mem_filter.1 hu).2 h⟩) lemma wm_lt_of_rank_lt (S : Finset ℕ) {a b : ℕ} (h : m3_rank S a < m3_rank S b) : a < b := by by_contra hn have := wm_rank_mono S (show b ≤ a by omega) omega lemma wm_rank_inj (S : Finset ℕ) {a b : ℕ} (ha : a ∈ S) (hb : b ∈ S) (h : m3_rank S a = m3_rank S b) : a = b := m3_rank_injOn S ha hb h /-- Short set `D(c) = {v ∈ O : v + c < N}` and short count `j(v) = #{highs c : v + c < N}`. -/ noncomputable def wm_D (m ρ : ℕ) (O : Finset ℕ) (c : ℕ) : Finset ℕ := by classical exact O.filter (fun v => v + c + ρ < m) noncomputable def wm_j (m ρ : ℕ) (O : Finset ℕ) (v : ℕ) : ℕ := by classical exact ((wm_high m ρ O).filter (fun c => v + c + ρ < m)).card lemma wm_mem_Dl {m ρ : ℕ} {O : Finset ℕ} {c v : ℕ} : v ∈ wm_D m ρ O c ↔ v ∈ O ∧ v + c + ρ < m := by classical unfold wm_D exact Finset.mem_filter lemma wm_D_anti {m ρ : ℕ} {O : Finset ℕ} {c c' : ℕ} (h : c ≤ c') : wm_D m ρ O c' ⊆ wm_D m ρ O c := fun v hv => wm_mem_Dl.2 ⟨(wm_mem_Dl.1 hv).1, by have := (wm_mem_Dl.1 hv).2; omega⟩ /-- The short highs of `v` form an initial segment: `c` short for `v` iff `rank c < j(v)`. -/ lemma wm_short_iff {m ρ : ℕ} {O : Finset ℕ} {c v : ℕ} (hc : c ∈ wm_high m ρ O) : v + c + ρ < m ↔ m3_rank (wm_high m ρ O) c < wm_j m ρ O v := by classical unfold wm_j m3_rank constructor · intro hs apply Finset.card_lt_card refine Finset.ssubset_iff_subset_ne.2 ⟨fun u hu => ?_, fun he => ?_⟩ · obtain ⟨hu1, hu2⟩ := Finset.mem_filter.1 hu exact Finset.mem_filter.2 ⟨hu1, by omega⟩ · have : c ∈ (wm_high m ρ O).filter (fun u => u < c) := by rw [he] exact Finset.mem_filter.2 ⟨hc, hs⟩ exact lt_irrefl c (Finset.mem_filter.1 this).2 · intro hlt by_contra hn have : (wm_high m ρ O).filter (fun c' => v + c' + ρ < m) ⊆ (wm_high m ρ O).filter (· < c) := by intro u hu obtain ⟨hu1, hu2⟩ := Finset.mem_filter.1 hu exact Finset.mem_filter.2 ⟨hu1, by omega⟩ have := Finset.card_le_card this omega lemma wm_j_anti {m ρ : ℕ} {O : Finset ℕ} {v v' : ℕ} (h : v ≤ v') : wm_j m ρ O v' ≤ wm_j m ρ O v := by classical unfold wm_j exact Finset.card_le_card (fun u hu => Finset.mem_filter.2 ⟨(Finset.mem_filter.1 hu).1, by have := (Finset.mem_filter.1 hu).2; omega⟩) /-- Anchor condition: `y` is a high minimising `rank(c) + |D(c)|`. -/ def wm_IsAnchor (m ρ : ℕ) (O : Finset ℕ) (y : ℕ) : Prop := y ∈ wm_high m ρ O ∧ ∀ c ∈ wm_high m ρ O, m3_rank (wm_high m ρ O) y + (wm_D m ρ O y).card ≤ m3_rank (wm_high m ρ O) c + (wm_D m ρ O c).card lemma wm_anchor_exists {m ρ : ℕ} {O : Finset ℕ} (hh : (wm_high m ρ O).Nonempty) : ∃ y, wm_IsAnchor m ρ O y := by obtain ⟨y, hy, hmin⟩ := Finset.exists_min_image (wm_high m ρ O) (fun c => m3_rank (wm_high m ρ O) c + (wm_D m ρ O c).card) hh exact ⟨y, hy, hmin⟩ /-- BAL-LEFT. -/ lemma wm_bal_left {m ρ : ℕ} {O : Finset ℕ} {y : ℕ} (hy : wm_IsAnchor m ρ O y) {c : ℕ} (hc : c ∈ wm_high m ρ O) (hcy : c ≤ y) : m3_rank (wm_high m ρ O) y ≤ m3_rank (wm_high m ρ O) c + (wm_D m ρ O c \ wm_D m ρ O y).card := by have h := hy.2 c hc rw [Finset.card_sdiff_of_subset (wm_D_anti hcy)] have := Finset.card_le_card (wm_D_anti (m := m) (ρ := ρ) (O := O) hcy) omega /-- Selected column of a high `c`: lows short for `y` and long for `c`. -/ noncomputable def wm_S (m ρ : ℕ) (O : Finset ℕ) (y c : ℕ) : Finset ℕ := by classical exact (wm_D m ρ O y).filter (fun v => m ≤ v + c + ρ) lemma wm_mem_S {m ρ : ℕ} {O : Finset ℕ} {y c v : ℕ} : v ∈ wm_S m ρ O y c ↔ v ∈ wm_D m ρ O y ∧ m ≤ v + c + ρ := by classical unfold wm_S exact Finset.mem_filter /-- COL-RANK: the `i`-th largest low of a column has at least `rank(y) + i + 1` short highs. -/ lemma wm_col_rank {m ρ : ℕ} {O : Finset ℕ} {y : ℕ} (hy : wm_IsAnchor m ρ O y) {c v : ℕ} (hc : c ∈ wm_high m ρ O) (hv : v ∈ wm_S m ρ O y c) : m3_rank (wm_high m ρ O) y + ((wm_S m ρ O y c).filter (fun v' => v < v')).card + 1 ≤ wm_j m ρ O v ∧ wm_j m ρ O v ≤ m3_rank (wm_high m ρ O) c := by classical obtain ⟨hvD, hvc⟩ := wm_mem_S.1 hv have hry : m3_rank (wm_high m ρ O) y < wm_j m ρ O v := (wm_short_iff hy.1).1 (wm_mem_Dl.1 hvD).2 have hjc : wm_j m ρ O v ≤ m3_rank (wm_high m ρ O) c := by by_contra hn have := (wm_short_iff (v := v) hc).2 (by omega) omega refine ⟨?_, hjc⟩ have hrlt : wm_j m ρ O v < (wm_high m ρ O).card := lt_of_le_of_lt hjc (m3_rank_lt_card (wm_high m ρ O) c hc) obtain ⟨hcr, hrk⟩ := wm_nth_spec (wm_high m ρ O) hrlt generalize hcrdef : wm_nth (wm_high m ρ O) (wm_j m ρ O v) = cr at hcr hrk have hycr : y ≤ cr := le_of_lt (wm_lt_of_rank_lt (wm_high m ρ O) (by omega)) have hsub : (wm_S m ρ O y c).filter (fun v' => v ≤ v') ⊆ wm_D m ρ O y \ wm_D m ρ O cr := by intro v' hv' obtain ⟨hv'S, hvv'⟩ := Finset.mem_filter.1 hv' refine Finset.mem_sdiff.2 ⟨(wm_mem_S.1 hv'S).1, fun hD => ?_⟩ have h1 := (wm_short_iff hcr).1 (wm_mem_Dl.1 hD).2 have h2 := wm_j_anti (m := m) (ρ := ρ) (O := O) hvv' omega have hcard := Finset.card_le_card hsub rw [Finset.card_sdiff_of_subset (wm_D_anti hycr)] at hcard have hins : (wm_S m ρ O y c).filter (fun v' => v ≤ v') = insert v ((wm_S m ρ O y c).filter (fun v' => v < v')) := by ext x simp only [Finset.mem_filter, Finset.mem_insert] constructor · rintro ⟨hx, hle⟩ rcases Nat.eq_or_lt_of_le hle with h | h · exact Or.inl h.symm · exact Or.inr ⟨hx, h⟩ · rintro (rfl | ⟨hx, hlt⟩) · exact ⟨hv, le_rfl⟩ · exact ⟨hx, le_of_lt hlt⟩ have hc1 : ((wm_S m ρ O y c).filter (fun v' => v ≤ v')).card = ((wm_S m ρ O y c).filter (fun v' => v < v')).card + 1 := by rw [hins, Finset.card_insert_of_notMem (fun h => lt_irrefl v (Finset.mem_filter.1 h).2)] have hmin := hy.2 cr hcr have := Finset.card_le_card (wm_D_anti (m := m) (ρ := ρ) (O := O) hycr) omega /-! ### The shell partition (strip-free) -/ lemma wm_B4_eq {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) : wm_B m ρ O 4 = wm_Y m ρ O 3 ∪ wm_Zhat m ρ O ∪ wm_N40 m ρ O ∪ wm_Q m ρ O := by rw [wm_B_eq_YZ hρ hO (by norm_num) le_rfl] have h34 := @wm_Y_mono m ρ O 3 4 (by norm_num) have h23 := wm_Z_mono (O := O) hρ (show 2 ≤ 3 by norm_num) ext x unfold wm_Zhat wm_N40 wm_Q simp only [Finset.mem_union, Finset.mem_sdiff, show (4 : ℕ) - 1 = 3 from rfl] constructor · rintro (h | h) · by_cases h3 : x ∈ wm_Y m ρ O 3 · exact Or.inl (Or.inl (Or.inl h3)) · by_cases hz : x ∈ wm_Z m ρ O 2 · exact Or.inl (Or.inl (Or.inr ⟨hz, h3⟩)) · exact Or.inl (Or.inr ⟨⟨h, h3⟩, hz⟩) · by_cases h3 : x ∈ wm_Y m ρ O 3 · exact Or.inl (Or.inl (Or.inl h3)) · by_cases hz : x ∈ wm_Z m ρ O 2 · exact Or.inl (Or.inl (Or.inr ⟨hz, h3⟩)) · by_cases h4 : x ∈ wm_Y m ρ O 4 · exact Or.inl (Or.inr ⟨⟨h4, h3⟩, hz⟩) · exact Or.inr ⟨h, fun h' => h'.elim h4 hz⟩ · rintro (((h | ⟨h, _⟩) | ⟨⟨h, _⟩, _⟩) | ⟨h, _⟩) · exact Or.inl (h34 h) · exact Or.inr (h23 h) · exact Or.inl h · exact Or.inr h lemma wm_shell_card {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) (X : Finset ℕ) : (X ∩ wm_B m ρ O 4).card = (X ∩ wm_Y m ρ O 3).card + (X ∩ wm_Zhat m ρ O).card + (X ∩ wm_N40 m ρ O).card + (X ∩ wm_Q m ρ O).card := by have h34 := @wm_Y_mono m ρ O 3 4 (by norm_num) have d1 : Disjoint (wm_Y m ρ O 3) (wm_Zhat m ρ O) := by rw [Finset.disjoint_left] intro x h1 h2 unfold wm_Zhat at h2 exact (Finset.mem_sdiff.1 h2).2 h1 have d2 : Disjoint (wm_Y m ρ O 3 ∪ wm_Zhat m ρ O) (wm_N40 m ρ O) := by rw [Finset.disjoint_left] intro x h1 h2 unfold wm_N40 at h2 rcases Finset.mem_union.1 h1 with h | h · exact (Finset.mem_sdiff.1 (Finset.mem_sdiff.1 h2).1).2 h · unfold wm_Zhat at h exact (Finset.mem_sdiff.1 h2).2 (Finset.mem_sdiff.1 h).1 have d3 : Disjoint (wm_Y m ρ O 3 ∪ wm_Zhat m ρ O ∪ wm_N40 m ρ O) (wm_Q m ρ O) := by rw [Finset.disjoint_left] intro x h1 h2 obtain ⟨_, hY4, hZ2⟩ := wm_Q_sub h2 rcases Finset.mem_union.1 h1 with h | h · rcases Finset.mem_union.1 h with h | h · exact hY4 (h34 h) · unfold wm_Zhat at h exact hZ2 (Finset.mem_sdiff.1 h).1 · unfold wm_N40 at h exact hY4 (Finset.mem_sdiff.1 (Finset.mem_sdiff.1 h).1).1 rw [wm_B4_eq hρ hO] have e3 : (X ∩ (wm_Y m ρ O 3 ∪ wm_Zhat m ρ O ∪ wm_N40 m ρ O ∪ wm_Q m ρ O)).card = (X ∩ (wm_Y m ρ O 3 ∪ wm_Zhat m ρ O ∪ wm_N40 m ρ O)).card + (X ∩ wm_Q m ρ O).card := by rw [Finset.inter_union_distrib_left] exact Finset.card_union_of_disjoint (Finset.disjoint_of_subset_left Finset.inter_subset_right (Finset.disjoint_of_subset_right Finset.inter_subset_right d3)) have e2 : (X ∩ (wm_Y m ρ O 3 ∪ wm_Zhat m ρ O ∪ wm_N40 m ρ O)).card = (X ∩ (wm_Y m ρ O 3 ∪ wm_Zhat m ρ O)).card + (X ∩ wm_N40 m ρ O).card := by rw [Finset.inter_union_distrib_left] exact Finset.card_union_of_disjoint (Finset.disjoint_of_subset_left Finset.inter_subset_right (Finset.disjoint_of_subset_right Finset.inter_subset_right d2)) have e1 : (X ∩ (wm_Y m ρ O 3 ∪ wm_Zhat m ρ O)).card = (X ∩ wm_Y m ρ O 3).card + (X ∩ wm_Zhat m ρ O).card := by rw [Finset.inter_union_distrib_left] exact Finset.card_union_of_disjoint (Finset.disjoint_of_subset_left Finset.inter_subset_right (Finset.disjoint_of_subset_right Finset.inter_subset_right d1)) rw [e3, e2, e1] lemma wm_Q_part_card {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (X : Finset ℕ) : (X ∩ wm_Q m ρ O).card = (X ∩ wm_Qj m ρ O 0).card + (X ∩ wm_Qj m ρ O 1).card + (X ∩ wm_Qj m ρ O 2).card + (X ∩ wm_Qj m ρ O 3).card := by classical have hmap : Set.MapsTo (wm_w m ρ O) ((X ∩ wm_Q m ρ O : Finset ℕ) : Set ℕ) (Finset.range 4 : Set ℕ) := by intro q hq simp only [Finset.coe_range, Set.mem_Iio] have := wm_w_le hρ (Finset.mem_inter.1 (Finset.mem_coe.1 hq)).2 omega rw [Finset.card_eq_sum_card_fiberwise hmap] simp only [Finset.sum_range_succ, Finset.sum_range_zero, Nat.zero_add] have e : ∀ j, (X ∩ wm_Q m ρ O).filter (fun q => wm_w m ρ O q = j) = X ∩ wm_Qj m ρ O j := by intro j ext q simp only [Finset.mem_filter, Finset.mem_inter, wm_mem_Qj] tauto rw [e 0, e 1, e 2, e 3] /-! ### The anchored inequality (Lemma 6) -/ /-- Anchored sets (shifted): `I = [0, g)`, `P = Q₂ ∩ I`, `R = Q₃ ∩ [0, y)`, `T = y + (Y₃ ∩ I)`, `F = J ∖ (Q₃ ∪ T)`. -/ noncomputable def wm_g (m ρ y : ℕ) : ℕ := m - ρ - y noncomputable def wm_Pa (m ρ : ℕ) (O : Finset ℕ) (y : ℕ) : Finset ℕ := wm_Qj m ρ O 2 ∩ Finset.range (wm_g m ρ y) noncomputable def wm_Ra (m ρ : ℕ) (O : Finset ℕ) (y : ℕ) : Finset ℕ := wm_Qj m ρ O 3 ∩ Finset.range y noncomputable def wm_T (m ρ : ℕ) (O : Finset ℕ) (y : ℕ) : Finset ℕ := (wm_Y m ρ O 3 ∩ Finset.range (wm_g m ρ y)).image (· + y) noncomputable def wm_F (m ρ : ℕ) (O : Finset ℕ) (y : ℕ) : Finset ℕ := Finset.Ico y m \ (wm_Qj m ρ O 3 ∪ wm_T m ρ O y) lemma wm_T_sub {m ρ : ℕ} {O : Finset ℕ} {y : ℕ} (hyO : y ∈ O) {x : ℕ} (hx : x ∈ wm_T m ρ O y) : x ∈ wm_Y m ρ O 4 ∧ x ∈ Finset.Ico y m := by unfold wm_T at hx obtain ⟨u, hu, rfl⟩ := Finset.mem_image.1 hx obtain ⟨hu3, hug⟩ := Finset.mem_inter.1 hu obtain ⟨h1, h2, h3⟩ := wm_mem_Y.1 hu3 have hg := Finset.mem_range.1 hug unfold wm_g at hg refine ⟨wm_mem_Y.2 ⟨by omega, by omega, ?_⟩, Finset.mem_Ico.2 ⟨by omega, by omega⟩⟩ rw [show u + y - ρ = (u - ρ) + y by omega, succ_nsmul] exact Finset.mem_add.2 ⟨_, h3, _, Finset.mem_insert_of_mem hyO, rfl⟩ lemma wm_Q3_not_I {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) {y : ℕ} (hyh : y ∈ wm_high m ρ O) {q : ℕ} (hq : q ∈ wm_Qj m ρ O 3) : wm_g m ρ y ≤ q := by obtain ⟨hne, hx⟩ := wm_Q3_ge hρ hq have h1 := (wm_mem_high.1 (wm_x1_mem hne)).2 have h2 := (wm_mem_high.1 hyh).2 unfold wm_g omega /-- Anchored inequality: `W₀ + p ≥ coll + 2δ + d4 − |N40 ∩ I| + |F| + A + |Q₁ ∖ I| − |P| − |R|`. -/ theorem wm_anchored {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) {y : ℕ} (hyh : y ∈ wm_high m ρ O) : wm_coll m ρ O + 2 * wm_d3pp m ρ O + wm_d4 m ρ O - (wm_N40 m ρ O ∩ Finset.range (wm_g m ρ y)).card + (wm_F m ρ O y).card + wm_A m ρ O + (wm_Qj m ρ O 1 \ Finset.range (wm_g m ρ y)).card - (wm_Pa m ρ O y).card - (wm_Ra m ρ O y).card ≤ wm_W0 m ρ O + wm_p m ρ O := by classical have hyO := (wm_mem_high.1 hyh).1 have hym := (hO y hyO).2 set g := wm_g m ρ y with hg set I := Finset.range g with hI have hgm : g + ρ + y = m := by rw [hg]; unfold wm_g; omega have hID := wm_ID2 hρ hO -- (b) Q₃ = R ⊔ (Q₃ ∩ J) have hb : (wm_Ra m ρ O y).card + (wm_Qj m ρ O 3 \ Finset.range y).card = (wm_Qj m ρ O 3).card := by unfold wm_Ra rw [Nat.add_comm] exact Finset.card_sdiff_add_card_inter _ _ -- (c) J = (Q₃ ∩ J) ⊔ T ⊔ F have hTsub : wm_T m ρ O y ⊆ Finset.Ico y m := fun x hx => (wm_T_sub hyO hx).2 have hTdisj : Disjoint (wm_Qj m ρ O 3 \ Finset.range y) (wm_T m ρ O y) := by rw [Finset.disjoint_left] intro x h1 h2 exact (wm_Q_sub (wm_mem_Qj.1 (Finset.mem_sdiff.1 h1).1).1).2.1 (wm_T_sub hyO h2).1 have hJ : Finset.Ico y m ∩ (wm_Qj m ρ O 3 ∪ wm_T m ρ O y) = (wm_Qj m ρ O 3 \ Finset.range y) ∪ wm_T m ρ O y := by ext x simp only [Finset.mem_inter, Finset.mem_union, Finset.mem_sdiff, Finset.mem_Ico, Finset.mem_range] constructor · rintro ⟨⟨h1, h2⟩, h | h⟩ · exact Or.inl ⟨h, by omega⟩ · exact Or.inr h · rintro (⟨h, h'⟩ | h) · exact ⟨⟨by omega, wm_Q_lt hρ (wm_mem_Qj.1 h).1⟩, Or.inl h⟩ · exact ⟨Finset.mem_Ico.1 (hTsub h), Or.inr h⟩ have hc := Finset.card_sdiff_add_card_inter (Finset.Ico y m) (wm_Qj m ρ O 3 ∪ wm_T m ρ O y) rw [hJ, Finset.card_union_of_disjoint hTdisj, Nat.card_Ico] at hc have hTcard : (wm_T m ρ O y).card = (I ∩ wm_Y m ρ O 3).card := by unfold wm_T rw [Finset.card_image_of_injective _ (add_left_injective y), Finset.inter_comm] change (wm_F m ρ O y).card + ((wm_Qj m ρ O 3 \ Finset.range y).card + (wm_T m ρ O y).card) = m - y at hc -- (d) shell restricted to I have hIsub : I ⊆ Finset.range m := fun x hx => Finset.mem_range.2 (by have := Finset.mem_range.1 hx; omega) have hsh := wm_shell_card hρ hO I have hIB := Finset.card_inter_add_card_sdiff I (wm_B m ρ O 4) have hholesI : I ∩ wm_holes m ρ O = I \ wm_B m ρ O 4 := by ext x unfold wm_holes simp only [Finset.mem_inter, Finset.mem_sdiff] exact ⟨fun ⟨h1, _, h3⟩ => ⟨h1, h3⟩, fun ⟨h1, h3⟩ => ⟨h1, hIsub h1, h3⟩⟩ -- (e) p and ζ split by I have hp := wm_holes_card (m := m) (ρ := ρ) (O := O) (by omega) have hpI := Finset.card_sdiff_add_card_inter (wm_holes m ρ O) I have hzI := Finset.card_sdiff_add_card_inter (wm_Zhat m ρ O) I -- (f) Q ∩ I by type have hQI := wm_Q_part_card (O := O) hρ I have hQ3I : I ∩ wm_Qj m ρ O 3 = ∅ := by ext x simp only [Finset.mem_inter, Finset.notMem_empty, iff_false, not_and] intro hx hq have := wm_Q3_not_I hρ hyh hq rw [← hg] at this have := Finset.mem_range.1 hx omega rw [hQ3I, Finset.card_empty] at hQI have hQ1 := Finset.card_sdiff_add_card_inter (wm_Qj m ρ O 1) I have hQ0 : (I ∩ wm_Qj m ρ O 0).card ≤ (wm_Qj m ρ O 0).card := Finset.card_le_card Finset.inter_subset_right have hPa : (wm_Pa m ρ O y).card = (I ∩ wm_Qj m ρ O 2).card := by unfold wm_Pa rw [Finset.inter_comm] rw [Finset.inter_comm (wm_holes m ρ O) I, hholesI] at hpI rw [Finset.inter_comm (wm_Zhat m ρ O) I] at hzI rw [Finset.inter_comm (wm_Qj m ρ O 1) I] at hQ1 have hIc : I.card = g := Finset.card_range g have hcollS : wm_Sigma m ρ O = ((wm_Qj m ρ O 1).card : ℤ) + wm_A m ρ O + 2 * (wm_Qj m ρ O 0).card + wm_coll m ρ O + 4 * ((wm_Zhat m ρ O ∩ wm_Y m ρ O 4).card : ℤ) + 2 * wm_d3pp m ρ O + wm_d4 m ρ O := by unfold wm_Sigma wm_coll ring rw [hID, hcollS, ← hp] rw [Finset.inter_comm (wm_N40 m ρ O) I] have hymz : ((m - y : ℕ) : ℤ) = (m : ℤ) - y := by omega push_cast omega -- ===== M7B.lean ===== /-! Anchor proof, part B (EXT1-anchor/FULL_PROOF.tex Lemmas 7–9): sorted canonical cubics, the lower-`Q₃` injection, the prefix-edge injection, PAYMENT, and the universal bound `W₀ + p ≥ coll + 2δ + d4 − h4`. Incidences are pairs `(z, u)` of a wrapped-pair position `z ∈ Ẑ` and a direction value `u ∈ O`. -/ lemma wm_triple_eq_c {k : ℕ} (a b c : Fin k) : m3_tripleVector a b c = m3_unitAdd (m3_pairVector a b) c := by funext i simp only [m3_tripleVector, m3_pairVector, m3_unitAdd] split_ifs <;> omega lemma wm_triple_eq_b {k : ℕ} (a b c : Fin k) : m3_tripleVector a b c = m3_unitAdd (m3_pairVector a c) b := by funext i simp only [m3_tripleVector, m3_pairVector, m3_unitAdd] split_ifs <;> omega lemma wm_value_triple {k : ℕ} (e : Fin k → ℕ) (a b c : Fin k) : m3_value e (m3_tripleVector a b c) = e a + e b + e c := by simp only [m3_tripleVector, m3_pairVector, m3_value_unitAdd] simp [m3_value] omega lemma wm_w_triple {m ρ : ℕ} {O : Finset ℕ} {q : ℕ} {a b c : Fin O.card} (h : wm_beta m ρ O q = m3_tripleVector a b c) : wm_w m ρ O q = (if wm_enum O a ≤ q then 1 else 0) + (if wm_enum O b ≤ q then 1 else 0) + (if wm_enum O c ≤ q then 1 else 0) := by unfold wm_w rw [h] have e1 : ∀ i, (if wm_enum O i ≤ q then m3_tripleVector a b c i else 0) = m3_tripleVector a b c i * (if wm_enum O i ≤ q then 1 else 0) := by intro i split_ifs <;> simp rw [Finset.sum_congr rfl (fun i _ => e1 i)] unfold m3_tripleVector m3_pairVector rw [m3_linear_unitAdd, m3_linear_unitAdd, m3_linear_unitAdd] simp only [zero_mul, Finset.sum_const_zero, zero_add] omega /-- Strip-free residual models have a high (`3 ≤ #highs`). -/ lemma wm_high_of_res {m ρ : ℕ} {O : Finset ℕ} (hres : wm_Residual m ρ O) : (wm_high m ρ O).Nonempty := by apply Finset.card_pos.1 have h := hres.2.2.2 unfold wm_high omega lemma wm_Ra_Q {m ρ : ℕ} {O : Finset ℕ} {y q : ℕ} (hq : q ∈ wm_Ra m ρ O y) : q ∈ wm_Q m ρ O := by unfold wm_Ra at hq exact (wm_mem_Qj.1 (Finset.mem_inter.1 hq).1).1 lemma wm_Pa_Q {m ρ : ℕ} {O : Finset ℕ} {y q : ℕ} (hq : q ∈ wm_Pa m ρ O y) : q ∈ wm_Q m ρ O := by unfold wm_Pa at hq exact (wm_mem_Qj.1 (Finset.mem_inter.1 hq).1).1 /-- Sorted factor values `(a ≤ b ≤ c)` of `β_q`. -/ noncomputable def wm_fac (m ρ : ℕ) (O : Finset ℕ) (q : ℕ) : ℕ × ℕ × ℕ := Classical.epsilon (fun x : ℕ × ℕ × ℕ => ∃ a b c : Fin O.card, a ≤ b ∧ b ≤ c ∧ wm_beta m ρ O q = m3_tripleVector a b c ∧ x = (wm_enum O a, wm_enum O b, wm_enum O c)) lemma wm_fac_spec {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) {q : ℕ} (hq : q ∈ wm_Q m ρ O) : ∃ a b c : Fin O.card, a ≤ b ∧ b ≤ c ∧ wm_beta m ρ O q = m3_tripleVector a b c ∧ wm_fac m ρ O q = (wm_enum O a, wm_enum O b, wm_enum O c) := by have hex : ∃ x : ℕ × ℕ × ℕ, ∃ a b c : Fin O.card, a ≤ b ∧ b ≤ c ∧ wm_beta m ρ O q = m3_tripleVector a b c ∧ x = (wm_enum O a, wm_enum O b, wm_enum O c) := by obtain ⟨a, b, c, hab, hbc, he⟩ := m3_degree_three_repr _ (wm_beta_spec hρ hq).1 exact ⟨_, a, b, c, hab, hbc, he, rfl⟩ exact Classical.epsilon_spec hex /-- Used incidence (value form): `z + u ∈ Q` and `β_{z+u} = w_z · x_u`. -/ def wm_usedv (m ρ : ℕ) (O : Finset ℕ) (z u : ℕ) : Prop := z + u ∈ wm_Q m ρ O ∧ ∃ i, wm_enum O i = u ∧ wm_beta m ρ O (z + u) = m3_unitAdd (wm_wz m ρ O z) i /-- The unused incidences at selected wrapped pairs. -/ noncomputable def wm_U (m ρ : ℕ) (O : Finset ℕ) : Finset (ℕ × ℕ) := by classical exact (wm_Zhat m ρ O ×ˢ O).filter (fun p => ¬ wm_usedv m ρ O p.1 p.2) lemma wm_image_enum (O : Finset ℕ) : Finset.univ.image (wm_enum O) = O := by ext v simp only [Finset.mem_image, Finset.mem_univ, true_and] constructor · rintro ⟨i, rfl⟩ exact wm_enum_mem O i · intro hv exact wm_enum_surj O hv lemma wm_sum_enum (O : Finset ℕ) (f : ℕ → ℕ) : ∑ u ∈ O, f u = ∑ i, f (wm_enum O i) := by conv_lhs => rw [← wm_image_enum O] rw [Finset.sum_image (fun i _ j _ h => wm_enum_inj O h)] /-- Every unused incidence has weight `≥ 1`, so `|U| ≤ A`. -/ lemma wm_U_le_A {m ρ : ℕ} {O : Finset ℕ} : (wm_U m ρ O).card ≤ wm_A m ρ O := by classical unfold wm_U wm_A rw [Finset.card_filter, Finset.sum_product] apply Finset.sum_le_sum intro z _ rw [wm_sum_enum O] apply Finset.sum_le_sum intro i _ by_cases hu : wm_used m ρ O z i · have hv : wm_usedv m ρ O z (wm_enum O i) := ⟨hu.1, i, rfl, hu.2⟩ simp [hv] · have h1 : wm_unusedw m ρ O z i = wm_wz m ρ O z i + 1 := by unfold wm_unusedw simp [hu] rw [h1] split_ifs <;> omega lemma wm_count_inj (S : Finset ℕ) {x x' : ℕ} (hx : x ∈ S) (hx' : x' ∈ S) (h : (S.filter (fun v => x < v)).card = (S.filter (fun v => x' < v)).card) : x = x' := by classical by_contra hne rcases lt_or_gt_of_ne hne with hlt | hlt · have : (S.filter (fun v => x' < v)) ⊂ (S.filter (fun v => x < v)) := by refine Finset.ssubset_iff_subset_ne.2 ⟨fun v hv => ?_, fun he => ?_⟩ · obtain ⟨h1, h2⟩ := Finset.mem_filter.1 hv exact Finset.mem_filter.2 ⟨h1, by omega⟩ · have : x' ∈ S.filter (fun v => x' < v) := by rw [he] exact Finset.mem_filter.2 ⟨hx', hlt⟩ exact lt_irrefl x' (Finset.mem_filter.1 this).2 have := Finset.card_lt_card this omega · have : (S.filter (fun v => x < v)) ⊂ (S.filter (fun v => x' < v)) := by refine Finset.ssubset_iff_subset_ne.2 ⟨fun v hv => ?_, fun he => ?_⟩ · obtain ⟨h1, h2⟩ := Finset.mem_filter.1 hv exact Finset.mem_filter.2 ⟨h1, by omega⟩ · have : x ∈ S.filter (fun v => x < v) := by rw [he] exact Finset.mem_filter.2 ⟨hx, hlt⟩ exact lt_irrefl x (Finset.mem_filter.1 this).2 have := Finset.card_lt_card this omega lemma wm_nth_inj (S : Finset ℕ) {r r' : ℕ} (hr : r < S.card) (hr' : r' < S.card) (h : wm_nth S r = wm_nth S r') : r = r' := by have h1 := (wm_nth_spec S hr).2 have h2 := (wm_nth_spec S hr').2 rw [h] at h1 omega lemma wm_enum_lt_iff (O : Finset ℕ) {i j : Fin O.card} : wm_enum O i < wm_enum O j ↔ i < j := (wm_enum_strictMono O).lt_iff_lt lemma wm_enum_le_iff (O : Finset ℕ) {i j : Fin O.card} : wm_enum O i ≤ wm_enum O j ↔ i ≤ j := (wm_enum_strictMono O).le_iff_le /-! ### The lower-`Q₃` injection (Lemma 7) -/ /-- Direction of the lower map: the `(rank c − rank b)`-th low of `D(b) ∖ D(y)`. -/ noncomputable def wm_lowInc (m ρ : ℕ) (O : Finset ℕ) (y q : ℕ) : ℕ × ℕ := (q - (wm_fac m ρ O q).2.2, wm_nth (wm_D m ρ O (wm_fac m ρ O q).2.1 \ wm_D m ρ O y) (m3_rank (wm_high m ρ O) (wm_fac m ρ O q).2.2 - m3_rank (wm_high m ρ O) (wm_fac m ρ O q).2.1)) lemma wm_lower_facts {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (_hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) {y : ℕ} (hy : wm_IsAnchor m ρ O y) {q : ℕ} (hq : q ∈ wm_Ra m ρ O y) : ∃ ia ib ic : Fin O.card, ia ≤ ib ∧ ib ≤ ic ∧ wm_beta m ρ O q = m3_tripleVector ia ib ic ∧ wm_lowInc m ρ O y q = (q - wm_enum O ic, wm_nth (wm_D m ρ O (wm_enum O ib) \ wm_D m ρ O y) (m3_rank (wm_high m ρ O) (wm_enum O ic) - m3_rank (wm_high m ρ O) (wm_enum O ib))) ∧ wm_enum O ic ≤ q ∧ m ≤ wm_enum O ia + wm_enum O ib + ρ ∧ q - wm_enum O ic ∈ wm_Zhat m ρ O ∧ wm_wz m ρ O (q - wm_enum O ic) = m3_pairVector ia ib ∧ (wm_lowInc m ρ O y q).2 ∈ wm_D m ρ O (wm_enum O ib) \ wm_D m ρ O y ∧ m3_rank (wm_high m ρ O) (wm_enum O ib) ≤ m3_rank (wm_high m ρ O) (wm_enum O ic) ∧ m3_rank (wm_high m ρ O) (wm_enum O ic) - m3_rank (wm_high m ρ O) (wm_enum O ib) < (wm_D m ρ O (wm_enum O ib) \ wm_D m ρ O y).card ∧ wm_enum O ib ∈ wm_high m ρ O ∧ wm_enum O ic ∈ wm_high m ρ O := by classical unfold wm_Ra at hq obtain ⟨hq3, hqy⟩ := Finset.mem_inter.1 hq have hqy' := Finset.mem_range.1 hqy obtain ⟨hqQ, hw⟩ := wm_mem_Qj.1 hq3 obtain ⟨ia, ib, ic, hab, hbc, hβ, hf⟩ := wm_fac_spec hρ hqQ have hwt := wm_w_triple hβ have hvt := (wm_beta_spec hρ hqQ).2 rw [hβ, wm_value_triple] at hvt have hab' := (wm_enum_le_iff O).2 hab have hbc' := (wm_enum_le_iff O).2 hbc have hcq : wm_enum O ic ≤ q := by by_contra hn rw [hw] at hwt split_ifs at hwt <;> omega have hwrap : m ≤ wm_enum O ia + wm_enum O ib + ρ := by have := wm_Q_lt hρ hqQ omega have hbO := wm_enum_mem O ib have hcO := wm_enum_mem O ic have hbh : wm_enum O ib ∈ wm_high m ρ O := wm_mem_high.2 ⟨hbO, by omega⟩ have hch : wm_enum O ic ∈ wm_high m ρ O := wm_mem_high.2 ⟨hcO, by omega⟩ have hic_pos : 0 < wm_beta m ρ O q ic := by rw [hβ, wm_triple_eq_c] simp [m3_unitAdd] obtain ⟨hz, hβz⟩ := wm_parent_wrapped hρ hqQ hic_pos hcq have hwz : wm_wz m ρ O (q - wm_enum O ic) = m3_pairVector ia ib := by rw [hβ, wm_triple_eq_c] at hβz exact (m3_unitAdd_injective ic hβz).symm have hlinc : wm_lowInc m ρ O y q = (q - wm_enum O ic, wm_nth (wm_D m ρ O (wm_enum O ib) \ wm_D m ρ O y) (m3_rank (wm_high m ρ O) (wm_enum O ic) - m3_rank (wm_high m ρ O) (wm_enum O ib))) := by unfold wm_lowInc rw [hf] have hrk := wm_rank_mono (wm_high m ρ O) hbc' have hcy : wm_enum O ic < y := by omega have hrky := m3_rank_strict (wm_high m ρ O) _ _ hch hcy have hbal := wm_bal_left hy hbh (by omega) have hlt : m3_rank (wm_high m ρ O) (wm_enum O ic) - m3_rank (wm_high m ρ O) (wm_enum O ib) < (wm_D m ρ O (wm_enum O ib) \ wm_D m ρ O y).card := by omega refine ⟨ia, ib, ic, hab, hbc, hβ, hlinc, hcq, hwrap, hz, hwz, ?_, hrk, hlt, hbh, hch⟩ rw [hlinc] exact (wm_nth_spec _ hlt).1 /-- A used lower-map incidence has target in `Q₁ ∖ I`; its sorted cubic is `(u, a, b)`. -/ lemma wm_lower_target {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) {y : ℕ} (hy : wm_IsAnchor m ρ O y) {q : ℕ} (hq : q ∈ wm_Ra m ρ O y) (hu : wm_usedv m ρ O (wm_lowInc m ρ O y q).1 (wm_lowInc m ρ O y q).2) : (wm_lowInc m ρ O y q).1 + (wm_lowInc m ρ O y q).2 ∈ wm_Qj m ρ O 1 \ Finset.range (wm_g m ρ y) ∧ ∃ iu ia ib : Fin O.card, iu < ia ∧ ia ≤ ib ∧ wm_enum O iu = (wm_lowInc m ρ O y q).2 ∧ wm_beta m ρ O ((wm_lowInc m ρ O y q).1 + (wm_lowInc m ρ O y q).2) = m3_tripleVector iu ia ib := by obtain ⟨ia, ib, ic, hab, hbc, hβ, hlinc, hcq, hwrap, hz, hwz, hdir, -, -, -, -⟩ := wm_lower_facts hρ hO hy hq generalize hzu : wm_lowInc m ρ O y q = zu at hlinc hdir hu ⊢ obtain ⟨z, u⟩ := zu simp only [Prod.mk.injEq] at hlinc obtain ⟨rfl, -⟩ := hlinc simp only at hdir hu ⊢ obtain ⟨hQ', iu, hiu, hβ'⟩ := hu rw [hwz] at hβ' have hβt : wm_beta m ρ O (q - wm_enum O ic + u) = m3_tripleVector iu ia ib := hβ' obtain ⟨hdb, hdy⟩ := Finset.mem_sdiff.1 hdir obtain ⟨huO, hub⟩ := wm_mem_Dl.1 hdb have huy : m ≤ u + y + ρ := by by_contra hn exact hdy (wm_mem_Dl.2 ⟨huO, by omega⟩) have hab' := (wm_enum_le_iff O).2 hab have hua : wm_enum O iu < wm_enum O ia := by omega have hiua : iu < ia := (wm_enum_lt_iff O).1 hua refine ⟨?_, iu, ia, ib, hiua, hab, hiu, hβt⟩ have hwt := wm_w_triple hβt have hvt := (wm_beta_spec hρ hQ').2 rw [hβt, wm_value_triple] at hvt have hlt' := wm_Q_lt hρ hQ' refine Finset.mem_sdiff.2 ⟨wm_mem_Qj.2 ⟨hQ', ?_⟩, ?_⟩ · rw [hwt] split_ifs <;> omega · rw [Finset.mem_range, not_lt] unfold wm_g omega theorem wm_lower_bound {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) {y : ℕ} (hy : wm_IsAnchor m ρ O y) : (wm_Ra m ρ O y).card ≤ ((wm_U m ρ O).filter (fun p => p.2 ∉ wm_high m ρ O)).card + (wm_Qj m ρ O 1 \ Finset.range (wm_g m ρ y)).card := by classical have hinj : Set.InjOn (wm_lowInc m ρ O y) (wm_Ra m ρ O y : Set ℕ) := by intro q1 h1 q2 h2 he obtain ⟨ia1, ib1, ic1, hab1, hbc1, hβ1, hl1, -, -, -, hwz1, -, hrk1, hlt1, hbh1, hch1⟩ := wm_lower_facts hρ hO hy (Finset.mem_coe.1 h1) obtain ⟨ia2, ib2, ic2, hab2, hbc2, hβ2, hl2, -, -, -, hwz2, -, hrk2, hlt2, hbh2, hch2⟩ := wm_lower_facts hρ hO hy (Finset.mem_coe.1 h2) have he' : wm_lowInc m ρ O y q1 = wm_lowInc m ρ O y q2 := he rw [hl1, hl2, Prod.mk.injEq] at he' obtain ⟨hz, hu⟩ := he' have hpair : m3_pairVector ia1 ib1 = m3_pairVector ia2 ib2 := by rw [← hwz1, ← hwz2, hz] obtain ⟨rfl, rfl⟩ := m3_pairVector_sorted_inj _ _ _ _ hab1 hab2 hpair have hr := wm_nth_inj _ hlt1 hlt2 hu have hc : wm_enum O ic1 = wm_enum O ic2 := wm_rank_inj (wm_high m ρ O) hch1 hch2 (by omega) have hic := wm_enum_inj O hc subst hic exact wm_beta_inj hρ (wm_Ra_Q (Finset.mem_coe.1 h1)) (wm_Ra_Q (Finset.mem_coe.1 h2)) (by rw [hβ1, hβ2]) have hsplit : ((wm_Ra m ρ O y).filter (fun q => wm_usedv m ρ O (wm_lowInc m ρ O y q).1 (wm_lowInc m ρ O y q).2)).card + ((wm_Ra m ρ O y).filter (fun q => ¬ wm_usedv m ρ O (wm_lowInc m ρ O y q).1 (wm_lowInc m ρ O y q).2)).card = (wm_Ra m ρ O y).card := Finset.card_filter_add_card_filter_not _ have hun : ((wm_Ra m ρ O y).filter (fun q => ¬ wm_usedv m ρ O (wm_lowInc m ρ O y q).1 (wm_lowInc m ρ O y q).2)).card ≤ ((wm_U m ρ O).filter (fun p => p.2 ∉ wm_high m ρ O)).card := by apply Finset.card_le_card_of_injOn (wm_lowInc m ρ O y) · intro q hq obtain ⟨hqR, hnu⟩ := Finset.mem_filter.1 (Finset.mem_coe.1 hq) obtain ⟨ia, ib, ic, hab, -, -, hl, -, -, hz, -, hdir, -, -, hbh, -⟩ := wm_lower_facts hρ hO hy hqR obtain ⟨hdb, _⟩ := Finset.mem_sdiff.1 hdir obtain ⟨huO, hub⟩ := wm_mem_Dl.1 hdb have hbh' := (wm_mem_high.1 hbh).2 have hz' : (wm_lowInc m ρ O y q).1 ∈ wm_Zhat m ρ O := by rw [hl]; exact hz unfold wm_U refine Finset.mem_coe.2 (Finset.mem_filter.2 ⟨Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨hz', huO⟩, hnu⟩, fun hh => ?_⟩) have := (wm_mem_high.1 hh).2 omega · exact hinj.mono (fun q hq => (Finset.mem_filter.1 (Finset.mem_coe.1 hq)).1) have hus : ((wm_Ra m ρ O y).filter (fun q => wm_usedv m ρ O (wm_lowInc m ρ O y q).1 (wm_lowInc m ρ O y q).2)).card ≤ (wm_Qj m ρ O 1 \ Finset.range (wm_g m ρ y)).card := by apply Finset.card_le_card_of_injOn (fun q => (wm_lowInc m ρ O y q).1 + (wm_lowInc m ρ O y q).2) · intro q hq obtain ⟨hqR, hu⟩ := Finset.mem_filter.1 (Finset.mem_coe.1 hq) exact Finset.mem_coe.2 (wm_lower_target hρ hO hy hqR hu).1 · intro q1 h1 q2 h2 he obtain ⟨h1R, hu1⟩ := Finset.mem_filter.1 (Finset.mem_coe.1 h1) obtain ⟨h2R, hu2⟩ := Finset.mem_filter.1 (Finset.mem_coe.1 h2) obtain ⟨-, iu1, ia1, ib1, hlt1, hle1, hiu1, hβ1⟩ := wm_lower_target hρ hO hy h1R hu1 obtain ⟨-, iu2, ia2, ib2, hlt2, hle2, hiu2, hβ2⟩ := wm_lower_target hρ hO hy h2R hu2 have he' : (wm_lowInc m ρ O y q1).1 + (wm_lowInc m ρ O y q1).2 = (wm_lowInc m ρ O y q2).1 + (wm_lowInc m ρ O y q2).2 := he rw [he'] at hβ1 rw [hβ1] at hβ2 obtain ⟨rfl, -, -⟩ := m3_tripleVector_sorted_inj _ _ _ _ _ _ (le_of_lt hlt1) hle1 (le_of_lt hlt2) hle2 hβ2 have hu : (wm_lowInc m ρ O y q1).2 = (wm_lowInc m ρ O y q2).2 := by rw [← hiu1, ← hiu2] have hz : (wm_lowInc m ρ O y q1).1 = (wm_lowInc m ρ O y q2).1 := by omega exact hinj (Finset.mem_coe.2 h1R) (Finset.mem_coe.2 h2R) (Prod.ext hz hu) omega /-! ### The prefix-edge injection (Lemma 8) -/ /-- Prefix map: parent `(a, c)` (position `q − b`), direction the high of rank `rank(y) + #{v ∈ S_c : b < v}`. -/ noncomputable def wm_preInc (m ρ : ℕ) (O : Finset ℕ) (y q : ℕ) : ℕ × ℕ := (q - (wm_fac m ρ O q).2.1, wm_nth (wm_high m ρ O) (m3_rank (wm_high m ρ O) y + ((wm_S m ρ O y (wm_fac m ρ O q).2.2).filter (fun v => (wm_fac m ρ O q).2.1 < v)).card)) lemma wm_prefix_facts {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) {y : ℕ} (hy : wm_IsAnchor m ρ O y) {q : ℕ} (hq : q ∈ wm_Pa m ρ O y) : ∃ ia ib ic : Fin O.card, ia ≤ ib ∧ ib ≤ ic ∧ wm_beta m ρ O q = m3_tripleVector ia ib ic ∧ wm_preInc m ρ O y q = (q - wm_enum O ib, wm_nth (wm_high m ρ O) (m3_rank (wm_high m ρ O) y + ((wm_S m ρ O y (wm_enum O ic)).filter (fun v => wm_enum O ib < v)).card)) ∧ q - wm_enum O ib ∈ wm_Zhat m ρ O ∧ wm_wz m ρ O (q - wm_enum O ib) = m3_pairVector ia ic ∧ wm_enum O ib ∈ wm_S m ρ O y (wm_enum O ic) ∧ wm_enum O ic ∈ wm_high m ρ O ∧ (wm_preInc m ρ O y q).2 ∈ wm_high m ρ O ∧ wm_enum O ia + (wm_preInc m ρ O y q).2 + ρ < m ∧ (wm_preInc m ρ O y q).2 < wm_enum O ic ∧ y ≤ (wm_preInc m ρ O y q).2 ∧ m3_rank (wm_high m ρ O) y + ((wm_S m ρ O y (wm_enum O ic)).filter (fun v => wm_enum O ib < v)).card < (wm_high m ρ O).card ∧ wm_enum O ia + y + ρ < m := by classical unfold wm_Pa at hq obtain ⟨hq2, hqg⟩ := Finset.mem_inter.1 hq have hqg' := Finset.mem_range.1 hqg obtain ⟨hqQ, hw⟩ := wm_mem_Qj.1 hq2 obtain ⟨ia, ib, ic, hab, hbc, hβ, hf⟩ := wm_fac_spec hρ hqQ have hwt := wm_w_triple hβ have hvt := (wm_beta_spec hρ hqQ).2 rw [hβ, wm_value_triple] at hvt have hab' := (wm_enum_le_iff O).2 hab have hbc' := (wm_enum_le_iff O).2 hbc have hqm := wm_Q_lt hρ hqQ -- w = 2 forces a, b ≤ q < c have hbq : wm_enum O ib ≤ q := by by_contra hn rw [hw] at hwt split_ifs at hwt <;> omega have hcq : q < wm_enum O ic := by by_contra hn rw [hw] at hwt split_ifs at hwt <;> omega have hyO := (wm_mem_high.1 hy.1).1 have hyh := (wm_mem_high.1 hy.1).2 have hym := (hO y hyO).2 unfold wm_g at hqg' have haD : wm_enum O ia + y + ρ < m := by omega have hbD : wm_enum O ib + y + ρ < m := by omega have hcO := wm_enum_mem O ic have hcy : y < wm_enum O ic := by omega have hch : wm_enum O ic ∈ wm_high m ρ O := wm_mem_high.2 ⟨hcO, by omega⟩ have hbS : wm_enum O ib ∈ wm_S m ρ O y (wm_enum O ic) := wm_mem_S.2 ⟨wm_mem_Dl.2 ⟨wm_enum_mem O ib, hbD⟩, by omega⟩ have haS : wm_enum O ia ∈ wm_S m ρ O y (wm_enum O ic) := wm_mem_S.2 ⟨wm_mem_Dl.2 ⟨wm_enum_mem O ia, haD⟩, by omega⟩ -- the parent (a, c) have hib_pos : 0 < wm_beta m ρ O q ib := by rw [hβ, wm_triple_eq_b] simp [m3_unitAdd] obtain ⟨hz, hβz⟩ := wm_parent_wrapped hρ hqQ hib_pos hbq have hwz : wm_wz m ρ O (q - wm_enum O ib) = m3_pairVector ia ic := by rw [hβ, wm_triple_eq_b] at hβz exact (m3_unitAdd_injective ib hβz).symm -- the direction have hpinc : wm_preInc m ρ O y q = (q - wm_enum O ib, wm_nth (wm_high m ρ O) (m3_rank (wm_high m ρ O) y + ((wm_S m ρ O y (wm_enum O ic)).filter (fun v => wm_enum O ib < v)).card)) := by unfold wm_preInc rw [hf] obtain ⟨hcr, hjc⟩ := wm_col_rank hy hch haS have hsub : (wm_S m ρ O y (wm_enum O ic)).filter (fun v => wm_enum O ib < v) ⊆ (wm_S m ρ O y (wm_enum O ic)).filter (fun v => wm_enum O ia < v) := by intro v hv obtain ⟨h1, h2⟩ := Finset.mem_filter.1 hv exact Finset.mem_filter.2 ⟨h1, by omega⟩ have hi0 := Finset.card_le_card hsub have hrc := m3_rank_lt_card (wm_high m ρ O) _ hch have hrlt : m3_rank (wm_high m ρ O) y + ((wm_S m ρ O y (wm_enum O ic)).filter (fun v => wm_enum O ib < v)).card < (wm_high m ρ O).card := by omega have key : ∀ r, r = m3_rank (wm_high m ρ O) y + ((wm_S m ρ O y (wm_enum O ic)).filter (fun v => wm_enum O ib < v)).card → wm_nth (wm_high m ρ O) r ∈ wm_high m ρ O ∧ wm_enum O ia + wm_nth (wm_high m ρ O) r + ρ < m ∧ wm_nth (wm_high m ρ O) r < wm_enum O ic ∧ y ≤ wm_nth (wm_high m ρ O) r := by intro r hr have hrlt' : r < (wm_high m ρ O).card := by omega obtain ⟨hnh, hnrk⟩ := wm_nth_spec (wm_high m ρ O) hrlt' have hshort : wm_enum O ia + wm_nth (wm_high m ρ O) r + ρ < m := (wm_short_iff hnh).2 (by omega) have hltc : wm_nth (wm_high m ρ O) r < wm_enum O ic := wm_lt_of_rank_lt (wm_high m ρ O) (by omega) have hyle : y ≤ wm_nth (wm_high m ρ O) r := by by_contra hn have := m3_rank_strict (wm_high m ρ O) _ _ hnh (show wm_nth (wm_high m ρ O) r < y by omega) omega exact ⟨hnh, hshort, hltc, hyle⟩ have hdir : (wm_preInc m ρ O y q).2 = wm_nth (wm_high m ρ O) (m3_rank (wm_high m ρ O) y + ((wm_S m ρ O y (wm_enum O ic)).filter (fun v => wm_enum O ib < v)).card) := by rw [hpinc] obtain ⟨hnh, hshort, hltc, hyle⟩ := key _ rfl rw [hdir] exact ⟨ia, ib, ic, hab, hbc, hβ, hpinc, hz, hwz, hbS, hch, hnh, hshort, hltc, hyle, hrlt, haD⟩ lemma wm_prefix_target {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) {y : ℕ} (hy : wm_IsAnchor m ρ O y) {q : ℕ} (hq : q ∈ wm_Pa m ρ O y) (hu : wm_usedv m ρ O (wm_preInc m ρ O y q).1 (wm_preInc m ρ O y q).2) : (wm_preInc m ρ O y q).1 + (wm_preInc m ρ O y q).2 ∈ wm_F m ρ O y ∧ ∃ ia ic' ic : Fin O.card, ia < ic' ∧ ic' < ic ∧ wm_enum O ic' = (wm_preInc m ρ O y q).2 ∧ wm_beta m ρ O ((wm_preInc m ρ O y q).1 + (wm_preInc m ρ O y q).2) = m3_tripleVector ia ic' ic := by obtain ⟨ia, ib, ic, hab, hbc, hβ, hpinc, hz, hwz, hbS, hch, hnh, hshort, hltc, hyle, -, haD⟩ := wm_prefix_facts hρ hO hy hq generalize hzc : wm_preInc m ρ O y q = zc at hpinc hnh hshort hltc hyle hu ⊢ obtain ⟨z, c'⟩ := zc simp only [Prod.mk.injEq] at hpinc obtain ⟨rfl, -⟩ := hpinc simp only at hnh hshort hltc hyle hu ⊢ obtain ⟨hQ', i', hi', hβ'⟩ := hu rw [hwz, ← wm_triple_eq_b] at hβ' have hyh := (wm_mem_high.1 hy.1).2 have hyO := (wm_mem_high.1 hy.1).1 have hnh' := (wm_mem_high.1 hnh).2 have hai : wm_enum O ia < wm_enum O i' := by omega have hic : wm_enum O i' < wm_enum O ic := by omega refine ⟨?_, ia, i', ic, (wm_enum_lt_iff O).1 hai, (wm_enum_lt_iff O).1 hic, hi', hβ'⟩ have hwt := wm_w_triple hβ' have hvt := (wm_beta_spec hρ hQ').2 rw [hβ', wm_value_triple] at hvt have hlt' := wm_Q_lt hρ hQ' have hchh := (wm_mem_high.1 hch).2 have hw2 : wm_w m ρ O (q - wm_enum O ib + c') = 2 := by rw [hwt] split_ifs <;> omega unfold wm_F refine Finset.mem_sdiff.2 ⟨Finset.mem_Ico.2 ⟨by omega, hlt'⟩, fun h => ?_⟩ rcases Finset.mem_union.1 h with h3 | hT · have := (wm_mem_Qj.1 h3).2 omega · exact (wm_Q_sub hQ').2.1 (wm_T_sub hyO hT).1 theorem wm_prefix_bound {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) {y : ℕ} (hy : wm_IsAnchor m ρ O y) : (wm_Pa m ρ O y).card ≤ ((wm_U m ρ O).filter (fun p => p.2 ∈ wm_high m ρ O)).card + (wm_F m ρ O y).card := by classical have hinj : Set.InjOn (wm_preInc m ρ O y) (wm_Pa m ρ O y : Set ℕ) := by intro q1 h1 q2 h2 he obtain ⟨ia1, ib1, ic1, hab1, hbc1, hβ1, hp1, -, hwz1, hbS1, -, -, -, -, -, hrl1, -⟩ := wm_prefix_facts hρ hO hy (Finset.mem_coe.1 h1) obtain ⟨ia2, ib2, ic2, hab2, hbc2, hβ2, hp2, -, hwz2, hbS2, -, -, -, -, -, hrl2, -⟩ := wm_prefix_facts hρ hO hy (Finset.mem_coe.1 h2) have he' : wm_preInc m ρ O y q1 = wm_preInc m ρ O y q2 := he rw [hp1, hp2, Prod.mk.injEq] at he' obtain ⟨hz, hu⟩ := he' have hpair : m3_pairVector ia1 ic1 = m3_pairVector ia2 ic2 := by rw [← hwz1, ← hwz2, hz] obtain ⟨rfl, rfl⟩ := m3_pairVector_sorted_inj _ _ _ _ (hab1.trans hbc1) (hab2.trans hbc2) hpair have hr := wm_nth_inj _ hrl1 hrl2 hu have hb : wm_enum O ib1 = wm_enum O ib2 := wm_count_inj _ hbS1 hbS2 (by omega) have hib := wm_enum_inj O hb subst hib exact wm_beta_inj hρ (wm_Pa_Q (Finset.mem_coe.1 h1)) (wm_Pa_Q (Finset.mem_coe.1 h2)) (by rw [hβ1, hβ2]) have hsplit : ((wm_Pa m ρ O y).filter (fun q => wm_usedv m ρ O (wm_preInc m ρ O y q).1 (wm_preInc m ρ O y q).2)).card + ((wm_Pa m ρ O y).filter (fun q => ¬ wm_usedv m ρ O (wm_preInc m ρ O y q).1 (wm_preInc m ρ O y q).2)).card = (wm_Pa m ρ O y).card := Finset.card_filter_add_card_filter_not _ have hun : ((wm_Pa m ρ O y).filter (fun q => ¬ wm_usedv m ρ O (wm_preInc m ρ O y q).1 (wm_preInc m ρ O y q).2)).card ≤ ((wm_U m ρ O).filter (fun p => p.2 ∈ wm_high m ρ O)).card := by apply Finset.card_le_card_of_injOn (wm_preInc m ρ O y) · intro q hq obtain ⟨hqP, hnu⟩ := Finset.mem_filter.1 (Finset.mem_coe.1 hq) obtain ⟨ia, ib, ic, -, -, -, hp, hz, -, -, -, hnh, -⟩ := wm_prefix_facts hρ hO hy hqP have hz' : (wm_preInc m ρ O y q).1 ∈ wm_Zhat m ρ O := by rw [hp]; exact hz unfold wm_U exact Finset.mem_coe.2 (Finset.mem_filter.2 ⟨Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨hz', (wm_mem_high.1 hnh).1⟩, hnu⟩, hnh⟩) · exact hinj.mono (fun q hq => (Finset.mem_filter.1 (Finset.mem_coe.1 hq)).1) have hus : ((wm_Pa m ρ O y).filter (fun q => wm_usedv m ρ O (wm_preInc m ρ O y q).1 (wm_preInc m ρ O y q).2)).card ≤ (wm_F m ρ O y).card := by apply Finset.card_le_card_of_injOn (fun q => (wm_preInc m ρ O y q).1 + (wm_preInc m ρ O y q).2) · intro q hq obtain ⟨hqP, hu⟩ := Finset.mem_filter.1 (Finset.mem_coe.1 hq) exact Finset.mem_coe.2 (wm_prefix_target hρ hO hy hqP hu).1 · intro q1 h1 q2 h2 he obtain ⟨h1P, hu1⟩ := Finset.mem_filter.1 (Finset.mem_coe.1 h1) obtain ⟨h2P, hu2⟩ := Finset.mem_filter.1 (Finset.mem_coe.1 h2) obtain ⟨-, ia1, ic1', ic1, hl1, hl1', hiu1, hβ1⟩ := wm_prefix_target hρ hO hy h1P hu1 obtain ⟨-, ia2, ic2', ic2, hl2, hl2', hiu2, hβ2⟩ := wm_prefix_target hρ hO hy h2P hu2 have he' : (wm_preInc m ρ O y q1).1 + (wm_preInc m ρ O y q1).2 = (wm_preInc m ρ O y q2).1 + (wm_preInc m ρ O y q2).2 := he rw [he'] at hβ1 rw [hβ1] at hβ2 obtain ⟨-, rfl, -⟩ := m3_tripleVector_sorted_inj _ _ _ _ _ _ (le_of_lt hl1) (le_of_lt hl1') (le_of_lt hl2) (le_of_lt hl2') hβ2 have hu : (wm_preInc m ρ O y q1).2 = (wm_preInc m ρ O y q2).2 := by rw [← hiu1, ← hiu2] have hz : (wm_preInc m ρ O y q1).1 = (wm_preInc m ρ O y q2).1 := by omega exact hinj (Finset.mem_coe.2 h1P) (Finset.mem_coe.2 h2P) (Prod.ext hz hu) omega /-! ### Conclusion (Lemma 9) -/ /-- Universal bound (Theorem 1, first part): for a strip-free model with a high, `W₀ + p ≥ coll + 2δ + d4 − h4`. -/ theorem wm_anchor_universal {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) (hh : (wm_high m ρ O).Nonempty) : wm_coll m ρ O + 2 * wm_d3pp m ρ O + wm_d4 m ρ O - wm_h m ρ O 4 ≤ wm_W0 m ρ O + wm_p m ρ O := by classical obtain ⟨y, hy⟩ := wm_anchor_exists hh have h1 := wm_anchored hρ hO hy.1 have h2 := wm_lower_bound hρ hO hy have h3 := wm_prefix_bound hρ hO hy have h4 := wm_U_le_A (m := m) (ρ := ρ) (O := O) have h5 : ((wm_U m ρ O).filter (fun p => p.2 ∈ wm_high m ρ O)).card + ((wm_U m ρ O).filter (fun p => ¬ p.2 ∈ wm_high m ρ O)).card = (wm_U m ρ O).card := Finset.card_filter_add_card_filter_not _ have h6 := wm_N40_le (m := m) (ρ := ρ) (O := O) (Finset.range (wm_g m ρ y)) have h2' : ((wm_Ra m ρ O y).card : ℤ) ≤ ((wm_U m ρ O).filter (fun p => ¬ p.2 ∈ wm_high m ρ O)).card + (wm_Qj m ρ O 1 \ Finset.range (wm_g m ρ y)).card := by exact_mod_cast h2 have h3' : ((wm_Pa m ρ O y).card : ℤ) ≤ ((wm_U m ρ O).filter (fun p => p.2 ∈ wm_high m ρ O)).card + (wm_F m ρ O y).card := by exact_mod_cast h3 have h45 : (((wm_U m ρ O).filter (fun p => p.2 ∈ wm_high m ρ O)).card : ℤ) + ((wm_U m ρ O).filter (fun p => ¬ p.2 ∈ wm_high m ρ O)).card ≤ wm_A m ρ O := by exact_mod_cast (h5.trans_le h4) linarith /-- Theorem 1, residual part: every residual strip-free model satisfies CORE₁, `W₀ + p ≥ 0`. -/ theorem wm_anchor_core {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) (hres : wm_Residual m ρ O) : 0 ≤ wm_W0 m ρ O + wm_p m ρ O := by have h1 := wm_anchor_universal hρ hO (wm_high_of_res hres) have h2 := wm_coll_nonneg hρ hO have h3 := wm_d3pp_nonneg (O := O) hρ have h4 := wm_quartic hρ hres linarith -- ===== AnL4.lean ===== /-! ## EXT1 anchor theorem (agent L4): `W₀ + p ≥ coll + 2·d3'' + d4 − h₄` for every strip-free model with a high. Source: EXT1-anchor/FULL_PROOF.tex (Lemmas 5–9) on L3's M1 model (shifted window positions, BLUEPRINT2 D1). All new names carry the prefix `an_`. -/ /-! ### Finite-set helpers -/ /-- The `k`-th element (0-based, increasing order) of a finite set (junk value `0` out of range). -/ noncomputable def an_sel (G : Finset ℕ) (k : ℕ) : ℕ := if h : k < G.card then G.orderEmbOfFin rfl ⟨k, h⟩ else 0 lemma an_sel_mem {G : Finset ℕ} {k : ℕ} (hk : k < G.card) : an_sel G k ∈ G := by unfold an_sel simp only [hk, ↓reduceDIte] exact Finset.orderEmbOfFin_mem G rfl _ lemma an_sel_inj {G : Finset ℕ} {k k' : ℕ} (hk : k < G.card) (hk' : k' < G.card) (he : an_sel G k = an_sel G k') : k = k' := by unfold an_sel at he simp only [hk, hk', ↓reduceDIte] at he have h := (G.orderEmbOfFin rfl).injective he exact congrArg Fin.val h lemma an_sel_count {G : Finset ℕ} {k : ℕ} (hk : k < G.card) : (G.filter (· < an_sel G k)).card = k := by have hsel : an_sel G k = G.orderEmbOfFin rfl ⟨k, hk⟩ := by unfold an_sel simp only [hk, ↓reduceDIte] have heq : G.filter (· < an_sel G k) = (Finset.Iio (⟨k, hk⟩ : Fin G.card)).map (G.orderEmbOfFin rfl).toEmbedding := by ext x simp only [Finset.mem_filter, Finset.mem_map, Finset.mem_Iio, RelEmbedding.coe_toEmbedding] constructor · rintro ⟨hx, hlt⟩ have hr : x ∈ Set.range (G.orderEmbOfFin rfl) := by rw [Finset.range_orderEmbOfFin] exact hx obtain ⟨j, rfl⟩ := hr refine ⟨j, ?_, rfl⟩ rw [hsel] at hlt exact (G.orderEmbOfFin rfl).lt_iff_lt.1 hlt · rintro ⟨j, hj, rfl⟩ refine ⟨Finset.orderEmbOfFin_mem G rfl j, ?_⟩ rw [hsel] exact (G.orderEmbOfFin rfl).lt_iff_lt.2 hj rw [heq, Finset.card_map, Fin.card_Iio] /-- If fewer than `k` elements of `G` lie below `r`... contrapositive form: `k < #{x ∈ G : x < r}` gives `sel G k < r`. -/ lemma an_sel_lt {G : Finset ℕ} {k r : ℕ} (hk : k < (G.filter (· < r)).card) : an_sel G k < r := by have hkG : k < G.card := lt_of_lt_of_le hk (Finset.card_filter_le _ _) by_contra hn' have hn := not_lt.1 hn' have hsub : G.filter (· < r) ⊆ G.filter (· < an_sel G k) := by intro x hx rw [Finset.mem_filter] at hx ⊢ exact ⟨hx.1, lt_of_lt_of_le hx.2 hn⟩ have h := Finset.card_le_card hsub rw [an_sel_count hkG] at h omega lemma an_count_lt_strict {S : Finset ℕ} {a b : ℕ} (ha : a ∈ S) (hab : a < b) : (S.filter (· < a)).card < (S.filter (· < b)).card := by have hsub : S.filter (· < a) ⊆ S.filter (· < b) := by intro x hx rw [Finset.mem_filter] at hx ⊢ exact ⟨hx.1, lt_trans hx.2 hab⟩ apply Finset.card_lt_card rw [Finset.ssubset_iff_of_subset hsub] exact ⟨a, Finset.mem_filter.2 ⟨ha, hab⟩, fun h => lt_irrefl a (Finset.mem_filter.1 h).2⟩ lemma an_count_lt_inj {S : Finset ℕ} {a b : ℕ} (ha : a ∈ S) (hb : b ∈ S) (he : (S.filter (· < a)).card = (S.filter (· < b)).card) : a = b := by rcases lt_trichotomy a b with h | h | h · exact absurd he (an_count_lt_strict ha h).ne · exact h · exact absurd he (an_count_lt_strict hb h).ne' lemma an_count_gt_strict {S : Finset ℕ} {a b : ℕ} (hb : b ∈ S) (hab : a < b) : (S.filter (b < ·)).card < (S.filter (a < ·)).card := by have hsub : S.filter (b < ·) ⊆ S.filter (a < ·) := by intro x hx rw [Finset.mem_filter] at hx ⊢ exact ⟨hx.1, lt_trans hab hx.2⟩ apply Finset.card_lt_card rw [Finset.ssubset_iff_of_subset hsub] exact ⟨b, Finset.mem_filter.2 ⟨hb, hab⟩, fun h => lt_irrefl b (Finset.mem_filter.1 h).2⟩ lemma an_count_gt_inj {S : Finset ℕ} {a b : ℕ} (ha : a ∈ S) (hb : b ∈ S) (he : (S.filter (a < ·)).card = (S.filter (b < ·)).card) : a = b := by rcases lt_trichotomy a b with h | h | h · exact absurd he (an_count_gt_strict hb h).ne' · exact h · exact absurd he (an_count_gt_strict ha h).ne /-! ### Sorted pair/triple vectors -/ lemma an_lin2 {k : ℕ} (a b : Fin k) (g : Fin k → ℕ) : (∑ i, m3_pairVector a b i * g i) = g a + g b := by simp only [m3_pairVector, m3_linear_unitAdd] simp only [Nat.zero_mul, Finset.sum_const_zero] omega lemma an_lin3 {k : ℕ} (a b c : Fin k) (g : Fin k → ℕ) : (∑ i, m3_tripleVector a b c i * g i) = g a + g b + g c := by simp only [m3_tripleVector, m3_pairVector, m3_linear_unitAdd] simp only [Nat.zero_mul, Finset.sum_const_zero] omega lemma an_value_pv {k : ℕ} (e : Fin k → ℕ) (a b : Fin k) : m3_value e (m3_pairVector a b) = e a + e b := an_lin2 a b e lemma an_value_tv {k : ℕ} (e : Fin k → ℕ) (a b c : Fin k) : m3_value e (m3_tripleVector a b c) = e a + e b + e c := an_lin3 a b c e lemma an_tv_eq3 {k : ℕ} (a b c : Fin k) : m3_tripleVector a b c = m3_unitAdd (m3_pairVector a b) c := by funext i simp only [m3_tripleVector, m3_pairVector, m3_unitAdd] split_ifs <;> omega lemma an_tv_eq2 {k : ℕ} (a b c : Fin k) : m3_tripleVector a b c = m3_unitAdd (m3_pairVector a c) b := by funext i simp only [m3_tripleVector, m3_pairVector, m3_unitAdd] split_ifs <;> omega lemma an_tv_swap {k : ℕ} (a b c : Fin k) : m3_tripleVector a b c = m3_tripleVector b a c := by funext i simp only [m3_tripleVector, m3_pairVector, m3_unitAdd] split_ifs <;> omega lemma an_tv_pos2 {k : ℕ} (a b c : Fin k) : 0 < m3_tripleVector a b c b := by simp only [m3_tripleVector, m3_pairVector, m3_unitAdd] split_ifs <;> omega lemma an_tv_pos3 {k : ℕ} (a b c : Fin k) : 0 < m3_tripleVector a b c c := by simp only [m3_tripleVector, m3_pairVector, m3_unitAdd] split_ifs <;> omega /-! ### The anchor (EXT1 §"The choice of anchor", Lemma 5 = BAL-LEFT / BAL-RIGHT, COL-RANK) -/ /-- Offsets short for `c`: `D_c = {v ∈ O : v + c < N}` (shifted: `v + c + ρ < m`). -/ def an_D (m ρ : ℕ) (O : Finset ℕ) (c : ℕ) : Finset ℕ := O.filter (fun v => v + c + ρ < m) /-- Number of highs below `c`. -/ noncomputable def an_rank (m ρ : ℕ) (O : Finset ℕ) (c : ℕ) : ℕ := ((wm_high m ρ O).filter (· < c)).card /-- Highs `≥ y`. -/ noncomputable def an_G (m ρ : ℕ) (O : Finset ℕ) (y : ℕ) : Finset ℕ := (wm_high m ρ O).filter (y ≤ ·) /-- `y` is an anchor: a high minimizing `rank + |D|` (EXT1 (eq:minimize)). -/ def an_IsAnchor (m ρ : ℕ) (O : Finset ℕ) (y : ℕ) : Prop := y ∈ wm_high m ρ O ∧ ∀ c ∈ wm_high m ρ O, an_rank m ρ O y + (an_D m ρ O y).card ≤ an_rank m ρ O c + (an_D m ρ O c).card lemma an_exists_anchor {m ρ : ℕ} {O : Finset ℕ} (hh : (wm_high m ρ O).Nonempty) : ∃ y, an_IsAnchor m ρ O y := by obtain ⟨y, hy, hmin⟩ := Finset.exists_min_image (wm_high m ρ O) (fun c => an_rank m ρ O c + (an_D m ρ O c).card) hh exact ⟨y, hy, hmin⟩ lemma an_mem_D {m ρ : ℕ} {O : Finset ℕ} {c v : ℕ} : v ∈ an_D m ρ O c ↔ v ∈ O ∧ v + c + ρ < m := Finset.mem_filter lemma an_mem_G {m ρ : ℕ} {O : Finset ℕ} {y c : ℕ} : c ∈ an_G m ρ O y ↔ c ∈ wm_high m ρ O ∧ y ≤ c := Finset.mem_filter lemma an_D_anti {m ρ : ℕ} {O : Finset ℕ} {c c' : ℕ} (h : c ≤ c') : an_D m ρ O c' ⊆ an_D m ρ O c := by intro v hv rw [an_mem_D] at hv ⊢ exact ⟨hv.1, by omega⟩ lemma an_rank_mono {m ρ : ℕ} {O : Finset ℕ} {c c' : ℕ} (h : c ≤ c') : an_rank m ρ O c ≤ an_rank m ρ O c' := by unfold an_rank apply Finset.card_le_card intro x hx rw [Finset.mem_filter] at hx ⊢ exact ⟨hx.1, by omega⟩ lemma an_rank_strict {m ρ : ℕ} {O : Finset ℕ} {c c' : ℕ} (hc : c ∈ wm_high m ρ O) (h : c < c') : an_rank m ρ O c < an_rank m ρ O c' := an_count_lt_strict hc h lemma an_rank_inj {m ρ : ℕ} {O : Finset ℕ} {c c' : ℕ} (hc : c ∈ wm_high m ρ O) (hc' : c' ∈ wm_high m ρ O) (he : an_rank m ρ O c = an_rank m ρ O c') : c = c' := an_count_lt_inj hc hc' he /-- BAL-LEFT (EXT1 (eq:removed)). -/ lemma an_bal_left {m ρ : ℕ} {O : Finset ℕ} {y b : ℕ} (hy : an_IsAnchor m ρ O y) (hb : b ∈ wm_high m ρ O) (hby : b ≤ y) : an_rank m ρ O y - an_rank m ρ O b ≤ (an_D m ρ O b \ an_D m ρ O y).card := by have h1 := hy.2 b hb have hsub : an_D m ρ O y ⊆ an_D m ρ O b := an_D_anti hby rw [Finset.card_sdiff_of_subset hsub] have := Finset.card_le_card hsub omega /-- BAL-RIGHT. -/ lemma an_bal_right {m ρ : ℕ} {O : Finset ℕ} {y r : ℕ} (hy : an_IsAnchor m ρ O y) (hr : r ∈ wm_high m ρ O) (hyr : y ≤ r) : (an_D m ρ O y \ an_D m ρ O r).card ≤ an_rank m ρ O r - an_rank m ρ O y := by have h1 := hy.2 r hr have hsub : an_D m ρ O r ⊆ an_D m ρ O y := an_D_anti hyr rw [Finset.card_sdiff_of_subset hsub] have := Finset.card_le_card hsub have := an_rank_mono (m := m) (ρ := ρ) (O := O) hyr omega lemma an_G_count {m ρ : ℕ} {O : Finset ℕ} {y r : ℕ} (hyr : y ≤ r) : an_rank m ρ O r = an_rank m ρ O y + ((an_G m ρ O y).filter (· < r)).card := by unfold an_rank an_G rw [← Finset.card_filter_add_card_filter_not (s := (wm_high m ρ O).filter (· < r)) (fun x => x < y), Finset.filter_filter, Finset.filter_filter, Finset.filter_filter] congr 1 · congr 1 exact Finset.filter_congr (fun x _ => by omega) · congr 1 exact Finset.filter_congr (fun x _ => by omega) /-- COL-RANK (EXT1 (eq:slots), with the whole of `D_y` in place of the column `S_c`): for `b ∈ D_y` and a high `c ≥ y` long for `b`, the `i`-th high `≥ y`, `i = #{v ∈ D_y : v > b}`, exists, is short for `b` and is `< c`. -/ theorem an_colrank {m ρ : ℕ} {O : Finset ℕ} {y b c : ℕ} (hy : an_IsAnchor m ρ O y) (hb : b ∈ an_D m ρ O y) (hc : c ∈ wm_high m ρ O) (hyc : y ≤ c) (hbc : m ≤ b + c + ρ) : ((an_D m ρ O y).filter (b < ·)).card < (an_G m ρ O y).card ∧ an_sel (an_G m ρ O y) ((an_D m ρ O y).filter (b < ·)).card ∈ an_G m ρ O y ∧ an_sel (an_G m ρ O y) ((an_D m ρ O y).filter (b < ·)).card < c ∧ b + an_sel (an_G m ρ O y) ((an_D m ρ O y).filter (b < ·)).card + ρ < m := by have hcNS : c ∈ (an_G m ρ O y).filter (fun x => m ≤ b + x + ρ) := Finset.mem_filter.2 ⟨an_mem_G.2 ⟨hc, hyc⟩, hbc⟩ obtain ⟨r, hrNS, hrmin⟩ : ∃ r ∈ (an_G m ρ O y).filter (fun x => m ≤ b + x + ρ), ∀ x ∈ (an_G m ρ O y).filter (fun x => m ≤ b + x + ρ), r ≤ x := ⟨_, Finset.min'_mem _ ⟨c, hcNS⟩, fun x hx => Finset.min'_le _ _ hx⟩ have hrc : r ≤ c := hrmin c hcNS obtain ⟨hrG, hbr⟩ := Finset.mem_filter.1 hrNS obtain ⟨hrh, hyr⟩ := an_mem_G.1 hrG have hshort : ∀ x ∈ an_G m ρ O y, x < r → b + x + ρ < m := by intro x hx hxr by_contra hn have hrx : r ≤ x := hrmin x (Finset.mem_filter.2 ⟨hx, not_lt.1 hn⟩) omega have hsub : (an_D m ρ O y).filter (b ≤ ·) ⊆ an_D m ρ O y \ an_D m ρ O r := by intro v hv obtain ⟨hvD, hbv⟩ := Finset.mem_filter.1 hv refine Finset.mem_sdiff.2 ⟨hvD, fun hvr => ?_⟩ have := (an_mem_D.1 hvr).2 omega have hcount : ((an_D m ρ O y).filter (b ≤ ·)).card = ((an_D m ρ O y).filter (b < ·)).card + 1 := by have he : (an_D m ρ O y).filter (b ≤ ·) = insert b ((an_D m ρ O y).filter (b < ·)) := by ext v simp only [Finset.mem_filter, Finset.mem_insert] constructor · rintro ⟨h1, h2⟩ rcases eq_or_lt_of_le h2 with h | h · exact Or.inl h.symm · exact Or.inr ⟨h1, h⟩ · rintro (rfl | ⟨h1, h2⟩) · exact ⟨hb, le_rfl⟩ · exact ⟨h1, le_of_lt h2⟩ rw [he, Finset.card_insert_of_notMem (by simp)] have hbal := an_bal_right hy hrh hyr have hGc := an_G_count (m := m) (ρ := ρ) (O := O) hyr have hle := Finset.card_le_card hsub have hi' : ((an_D m ρ O y).filter (b < ·)).card < ((an_G m ρ O y).filter (· < r)).card := by omega have hlt := an_sel_lt hi' have hiG := lt_of_lt_of_le hi' (Finset.card_filter_le _ _) have hmem := an_sel_mem hiG exact ⟨hiG, hmem, lt_of_lt_of_le hlt hrc, hshort _ hmem hlt⟩ /-- Lower direction (EXT1 Lemma 7, via BAL-LEFT): for highs `b ≤ c < y`, the index `rank c − rank b` is a valid index of `D_b ∖ D_y`. -/ theorem an_lowdir {m ρ : ℕ} {O : Finset ℕ} {y b c : ℕ} (hy : an_IsAnchor m ρ O y) (hb : b ∈ wm_high m ρ O) (hc : c ∈ wm_high m ρ O) (hbc : b ≤ c) (hcy : c < y) : an_rank m ρ O c - an_rank m ρ O b < (an_D m ρ O b \ an_D m ρ O y).card := by have h1 := an_bal_left hy hb (by omega) have h2 := an_rank_strict hc hcy have h3 := an_rank_mono (m := m) (ρ := ρ) (O := O) hbc omega /-! ### The anchored sets (EXT1 §"The anchored sets"), shifted: `I = [0, g)`, `J = [y, m)`, `g = N − y` -/ def an_I (m ρ y : ℕ) : Finset ℕ := Finset.range (m - ρ - y) /-- `P = Q₂ ∩ I` (prefix edges). -/ noncomputable def an_P (m ρ : ℕ) (O : Finset ℕ) (y : ℕ) : Finset ℕ := wm_Qj m ρ O 2 ∩ an_I m ρ y /-- `R = Q₃ ∩ [−ρ, y − ρ)` (lower cubics). -/ noncomputable def an_R (m ρ : ℕ) (O : Finset ℕ) (y : ℕ) : Finset ℕ := wm_Qj m ρ O 3 ∩ Finset.range y /-- `y + (Y₃ ∩ I)`. -/ noncomputable def an_T (m ρ : ℕ) (O : Finset ℕ) (y : ℕ) : Finset ℕ := (wm_Y m ρ O 3 ∩ an_I m ρ y).image (· + y) /-- `F = J ∖ (Q₃ ∪ (y + (Y₃ ∩ I)))`. -/ noncomputable def an_F (m ρ : ℕ) (O : Finset ℕ) (y : ℕ) : Finset ℕ := Finset.Ico y m \ (wm_Qj m ρ O 3 ∪ an_T m ρ O y) lemma an_mem_I {m ρ y q : ℕ} : q ∈ an_I m ρ y ↔ q + ρ + y < m := by unfold an_I rw [Finset.mem_range] omega lemma an_T_sub_Y4 {m ρ : ℕ} {O : Finset ℕ} {y x : ℕ} (hyO : y ∈ O) (hx : x ∈ an_T m ρ O y) : x ∈ wm_Y m ρ O 4 := by obtain ⟨u, hu, rfl⟩ := Finset.mem_image.1 hx obtain ⟨hu3, huI⟩ := Finset.mem_inter.1 hu have hI := an_mem_I.1 huI obtain ⟨h1, h2, h3⟩ := wm_mem_Y.1 hu3 refine wm_mem_Y.2 ⟨by omega, by omega, ?_⟩ rw [show u + y - ρ = (u - ρ) + y by omega, succ_nsmul] exact Finset.mem_add.2 ⟨_, h3, _, Finset.mem_insert_of_mem hyO, rfl⟩ /-- `Q₃ ∩ I = ∅` (EXT1 Lemma 6, first paragraph). -/ lemma an_Q3_not_I {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) {y q : ℕ} (hy : y ∈ wm_high m ρ O) (hq : q ∈ wm_Qj m ρ O 3) : q ∉ an_I m ρ y := by obtain ⟨hne, hxq⟩ := wm_Q3_ge hρ hq have hx := wm_mem_high.1 (wm_x1_mem hne) have hy' := wm_mem_high.1 hy rw [an_mem_I] omega /-- Window cover: `range m = Y₃ ∪ Ẑ ∪ N40 ∪ Q ∪ holes`. -/ lemma an_cover {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) {x : ℕ} (hx : x < m) (hx3 : x ∉ wm_Y m ρ O 3) : x ∈ wm_Zhat m ρ O ∨ x ∈ wm_N40 m ρ O ∨ x ∈ wm_Q m ρ O ∨ x ∈ wm_holes m ρ O := by by_cases hz : x ∈ wm_Z m ρ O 2 · exact Or.inl (Finset.mem_sdiff.2 ⟨hz, hx3⟩) by_cases h4 : x ∈ wm_Y m ρ O 4 · exact Or.inr (Or.inl (Finset.mem_sdiff.2 ⟨Finset.mem_sdiff.2 ⟨h4, hx3⟩, hz⟩)) by_cases h3 : x ∈ wm_Z m ρ O 3 · refine Or.inr (Or.inr (Or.inl ?_)) unfold wm_Q rw [Finset.mem_sdiff, Finset.mem_union] exact ⟨h3, fun h => h.elim h4 hz⟩ · refine Or.inr (Or.inr (Or.inr ?_)) unfold wm_holes rw [wm_B_eq_YZ hρ hO (by norm_num : 1 ≤ 4) le_rfl, Finset.mem_sdiff, Finset.mem_union, Finset.mem_range] exact ⟨hx, fun h => h.elim h4 h3⟩ /-- The shell inequality (EXT1 Lemma 6 in inequality form). -/ theorem an_shell {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) {y : ℕ} (hy : y ∈ wm_high m ρ O) : (wm_Qj m ρ O 3).card + (an_F m ρ O y).card ≤ (an_R m ρ O y).card + (an_P m ρ O y).card + ρ + (wm_Zhat m ρ O).card + (wm_N40 m ρ O).card + (wm_Qj m ρ O 0).card + (wm_Qj m ρ O 1 ∩ an_I m ρ y).card + (wm_holes m ρ O).card := by have hyO := (wm_mem_high.1 hy).1 have hym := (hO y hyO).2 -- (1) Q₃ ⊆ R ∪ (Q₃ ∩ J) have h1 : (wm_Qj m ρ O 3).card ≤ (an_R m ρ O y).card + (wm_Qj m ρ O 3 ∩ Finset.Ico y m).card := by refine le_trans (Finset.card_le_card ?_) (Finset.card_union_le _ _) intro q hq have hqm := wm_Q_lt hρ (wm_mem_Qj.1 hq).1 rw [Finset.mem_union] by_cases hqy : q < y · exact Or.inl (Finset.mem_inter.2 ⟨hq, Finset.mem_range.2 hqy⟩) · exact Or.inr (Finset.mem_inter.2 ⟨hq, Finset.mem_Ico.2 ⟨by omega, hqm⟩⟩) -- (2) F, Q₃ ∩ J, T are disjoint subsets of J have hT3 : Disjoint (wm_Qj m ρ O 3) (an_T m ρ O y) := by rw [Finset.disjoint_left] intro q hq hqT exact (wm_Q_sub (wm_mem_Qj.1 hq).1).2.1 (an_T_sub_Y4 hyO hqT) have hd1 : Disjoint (an_F m ρ O y) (wm_Qj m ρ O 3 ∩ Finset.Ico y m) := by rw [Finset.disjoint_left] intro q hqF hq unfold an_F at hqF rw [Finset.mem_sdiff, Finset.mem_union] at hqF exact hqF.2 (Or.inl (Finset.mem_inter.1 hq).1) have hd2 : Disjoint (an_F m ρ O y ∪ (wm_Qj m ρ O 3 ∩ Finset.Ico y m)) (an_T m ρ O y) := by rw [Finset.disjoint_left] intro q hq hqT rcases Finset.mem_union.1 hq with hqF | hq3 · unfold an_F at hqF rw [Finset.mem_sdiff, Finset.mem_union] at hqF exact hqF.2 (Or.inr hqT) · exact Finset.disjoint_left.1 hT3 (Finset.mem_inter.1 hq3).1 hqT have hsubJ : an_F m ρ O y ∪ (wm_Qj m ρ O 3 ∩ Finset.Ico y m) ∪ an_T m ρ O y ⊆ Finset.Ico y m := by intro q hq rcases Finset.mem_union.1 hq with hq | hqT · rcases Finset.mem_union.1 hq with hqF | hq3 · unfold an_F at hqF exact (Finset.mem_sdiff.1 hqF).1 · exact (Finset.mem_inter.1 hq3).2 · obtain ⟨u, hu, rfl⟩ := Finset.mem_image.1 hqT have := an_mem_I.1 (Finset.mem_inter.1 hu).2 exact Finset.mem_Ico.2 ⟨by omega, by omega⟩ have h2 := Finset.card_le_card hsubJ rw [Finset.card_union_of_disjoint hd2, Finset.card_union_of_disjoint hd1, Nat.card_Ico] at h2 -- (3) |T| = |Y₃ ∩ I| have h3 : (an_T m ρ O y).card = (wm_Y m ρ O 3 ∩ an_I m ρ y).card := by unfold an_T exact Finset.card_image_of_injective _ (add_left_injective y) -- (4) |I| = |I ∩ Y₃| + |I ∖ Y₃| have h4 := Finset.card_inter_add_card_sdiff (an_I m ρ y) (wm_Y m ρ O 3) rw [Finset.inter_comm] at h4 have hIc : (an_I m ρ y).card = m - ρ - y := by unfold an_I exact Finset.card_range _ -- (5) I ∖ Y₃ ⊆ Ẑ ∪ N40 ∪ (Q ∩ I) ∪ holes have h5 : (an_I m ρ y \ wm_Y m ρ O 3).card ≤ (wm_Zhat m ρ O).card + (wm_N40 m ρ O).card + (wm_Q m ρ O ∩ an_I m ρ y).card + (wm_holes m ρ O).card := by have hsub : an_I m ρ y \ wm_Y m ρ O 3 ⊆ wm_Zhat m ρ O ∪ wm_N40 m ρ O ∪ (wm_Q m ρ O ∩ an_I m ρ y) ∪ wm_holes m ρ O := by intro x hx obtain ⟨hxI, hx3⟩ := Finset.mem_sdiff.1 hx have hxm : x < m := by have := an_mem_I.1 hxI; omega simp only [Finset.mem_union, Finset.mem_inter] rcases an_cover hρ hO hxm hx3 with h | h | h | h · exact Or.inl (Or.inl (Or.inl h)) · exact Or.inl (Or.inl (Or.inr h)) · exact Or.inl (Or.inr ⟨h, hxI⟩) · exact Or.inr h refine le_trans (Finset.card_le_card hsub) ?_ refine le_trans (Finset.card_union_le _ _) ?_ refine Nat.add_le_add_right (le_trans (Finset.card_union_le _ _) ?_) _ exact Nat.add_le_add_right (Finset.card_union_le _ _) _ -- (6) Q ∩ I ⊆ Q₀ ∪ (Q₁ ∩ I) ∪ P have h6 : (wm_Q m ρ O ∩ an_I m ρ y).card ≤ (wm_Qj m ρ O 0).card + (wm_Qj m ρ O 1 ∩ an_I m ρ y).card + (an_P m ρ O y).card := by have hsub : wm_Q m ρ O ∩ an_I m ρ y ⊆ wm_Qj m ρ O 0 ∪ (wm_Qj m ρ O 1 ∩ an_I m ρ y) ∪ an_P m ρ O y := by intro q hq obtain ⟨hqQ, hqI⟩ := Finset.mem_inter.1 hq have hw := wm_w_le hρ hqQ unfold an_P simp only [Finset.mem_union, Finset.mem_inter] rcases (show wm_w m ρ O q = 0 ∨ wm_w m ρ O q = 1 ∨ wm_w m ρ O q = 2 ∨ wm_w m ρ O q = 3 by omega) with h | h | h | h · exact Or.inl (Or.inl (wm_mem_Qj.2 ⟨hqQ, h⟩)) · exact Or.inl (Or.inr ⟨wm_mem_Qj.2 ⟨hqQ, h⟩, hqI⟩) · exact Or.inr ⟨wm_mem_Qj.2 ⟨hqQ, h⟩, hqI⟩ · exact absurd hqI (an_Q3_not_I hρ hy (wm_mem_Qj.2 ⟨hqQ, h⟩)) refine le_trans (Finset.card_le_card hsub) ?_ refine le_trans (Finset.card_union_le _ _) ?_ exact Nat.add_le_add_right (Finset.card_union_le _ _) _ omega /-! ### Abstract selected-pair interface (EXT1 Lemmas 1–2 as hypotheses) The two injections only use: canonical cubics `β q` (degree 3, value `q + m − ρ`) at positions `q ∈ Q`, canonical wrapped pairs `wz z` (value `z + m − ρ`) at positions `z ∈ Z`, and the parent lemma (a wrapped pair divisor of `β q` is `wz (q − a_i)` with `q − a_i ∈ Z`). Strip-free models instantiate `(Z, Q, wz, β) = (Ẑ, Q, w_z, β_q)` (`an_SelHyp_free`); strip cores (A29 §A3) instantiate `(Ẑ_W, Q_W, κ, κ)` restricted to window coordinates. -/ /-- `w(q)`: number of factors `≤ q` (shifted) of `β q`, with multiplicity. -/ noncomputable def an_w (O : Finset ℕ) (β : ℕ → Fin O.card → ℕ) (q : ℕ) : ℕ := ∑ i, if wm_enum O i ≤ q then β q i else 0 /-- `Q_j = {q ∈ Q : w(q) = j}`. -/ noncomputable def an_Qj (O Q : Finset ℕ) (β : ℕ → Fin O.card → ℕ) (j : ℕ) : Finset ℕ := Q.filter (fun q => an_w O β q = j) /-- The incidence `(z, i)` is used: its product is the cubic of the position `z + a_i ∈ Q`. -/ def an_used (O Q : Finset ℕ) (wz β : ℕ → Fin O.card → ℕ) (z : ℕ) (i : Fin O.card) : Prop := z + wm_enum O i ∈ Q ∧ β (z + wm_enum O i) = m3_unitAdd (wz z) i /-- The interface hypotheses. -/ def an_SelHyp (m ρ : ℕ) (O Z Q : Finset ℕ) (wz β : ℕ → Fin O.card → ℕ) : Prop := (∀ q ∈ Q, m3_degree (β q) = 3 ∧ m3_value (wm_enum O) (β q) = q + m - ρ ∧ q < m) ∧ (∀ z ∈ Z, m3_value (wm_enum O) (wz z) = z + m - ρ) ∧ (∀ q ∈ Q, ∀ i, 0 < β q i → wm_enum O i ≤ q → q - wm_enum O i ∈ Z ∧ β q = m3_unitAdd (wz (q - wm_enum O i)) i) lemma an_mem_Qj {O Q : Finset ℕ} {β : ℕ → Fin O.card → ℕ} {j q : ℕ} : q ∈ an_Qj O Q β j ↔ q ∈ Q ∧ an_w O β q = j := Finset.mem_filter /-- `w(q)` for a sorted cubic. -/ lemma an_w_tv {O : Finset ℕ} {β : ℕ → Fin O.card → ℕ} {q : ℕ} {a b c : Fin O.card} (hβ : β q = m3_tripleVector a b c) : an_w O β q = (if wm_enum O a ≤ q then 1 else 0) + (if wm_enum O b ≤ q then 1 else 0) + (if wm_enum O c ≤ q then 1 else 0) := by have h := an_lin3 a b c (fun i => if wm_enum O i ≤ q then 1 else 0) rw [← h] unfold an_w rw [hβ] apply Finset.sum_congr rfl intro i _ split_ifs <;> simp /-! ### Sources of the two injections (EXT1 Lemmas 7 and 8) -/ /-- Data of the lower-cubic injection at `q ∈ R = Q₃ ∩ [0, y)`: sorted cubic `β_q = (a ≤ b ≤ c)`, selected parent `wz z = (a, b)`, `z = q − c`, direction `u = sel (D_b ∖ D_y) (rank c − rank b)`; the incidence is `x = (z, u)`. -/ def an_RProp (m ρ : ℕ) (O Z : Finset ℕ) (wz β : ℕ → Fin O.card → ℕ) (y q : ℕ) (x : ℕ × ℕ) : Prop := ∃ ia ib ic iu : Fin O.card, ia ≤ ib ∧ ib ≤ ic ∧ β q = m3_tripleVector ia ib ic ∧ wm_enum O ic ≤ q ∧ q - wm_enum O ic ∈ Z ∧ wz (q - wm_enum O ic) = m3_pairVector ia ib ∧ m ≤ wm_enum O ia + wm_enum O ib + ρ ∧ wm_enum O ib ∈ wm_high m ρ O ∧ wm_enum O ic ∈ wm_high m ρ O ∧ an_rank m ρ O (wm_enum O ib) ≤ an_rank m ρ O (wm_enum O ic) ∧ an_rank m ρ O (wm_enum O ic) - an_rank m ρ O (wm_enum O ib) < (an_D m ρ O (wm_enum O ib) \ an_D m ρ O y).card ∧ wm_enum O iu = an_sel (an_D m ρ O (wm_enum O ib) \ an_D m ρ O y) (an_rank m ρ O (wm_enum O ic) - an_rank m ρ O (wm_enum O ib)) ∧ wm_enum O iu ∈ an_D m ρ O (wm_enum O ib) \ an_D m ρ O y ∧ x = (q - wm_enum O ic, wm_enum O iu) /-- Data of the prefix injection at `q ∈ P = Q₂ ∩ I`: sorted cubic `β_q = (a ≤ b ≤ c)` with `a, b ≤ q < c`, selected parent `wz z = (a, c)`, `z = q − b`, direction `c' = sel G i`, `i = #{v ∈ D_y : v > b}`; the incidence is `x = (z, c')`. -/ def an_PProp (m ρ : ℕ) (O Z : Finset ℕ) (wz β : ℕ → Fin O.card → ℕ) (y q : ℕ) (x : ℕ × ℕ) : Prop := ∃ ia ib ic iu : Fin O.card, ia ≤ ib ∧ ib ≤ ic ∧ β q = m3_tripleVector ia ib ic ∧ wm_enum O ib ≤ q ∧ q - wm_enum O ib ∈ Z ∧ wz (q - wm_enum O ib) = m3_pairVector ia ic ∧ m ≤ wm_enum O ia + wm_enum O ic + ρ ∧ wm_enum O ib ∈ an_D m ρ O y ∧ wm_enum O ic ∈ wm_high m ρ O ∧ wm_enum O ia ≤ wm_enum O ib ∧ ((an_D m ρ O y).filter (wm_enum O ib < ·)).card < (an_G m ρ O y).card ∧ wm_enum O iu = an_sel (an_G m ρ O y) ((an_D m ρ O y).filter (wm_enum O ib < ·)).card ∧ wm_enum O iu ∈ an_G m ρ O y ∧ wm_enum O iu < wm_enum O ic ∧ wm_enum O ib + wm_enum O iu + ρ < m ∧ x = (q - wm_enum O ib, wm_enum O iu) theorem an_R_exists {m ρ : ℕ} {O Z Q : Finset ℕ} {wz β : ℕ → Fin O.card → ℕ} (hS : an_SelHyp m ρ O Z Q wz β) {y q : ℕ} (hy : an_IsAnchor m ρ O y) (hq : q ∈ an_Qj O Q β 3 ∩ Finset.range y) : ∃ x, an_RProp m ρ O Z wz β y q x := by obtain ⟨hq3, hqy⟩ := Finset.mem_inter.1 hq have hqy' := Finset.mem_range.1 hqy obtain ⟨hqQ, hw⟩ := an_mem_Qj.1 hq3 obtain ⟨hdeg, hval, hqm⟩ := hS.1 q hqQ obtain ⟨ia, ib, ic, hab, hbc, hβ⟩ := m3_degree_three_repr _ hdeg have hmono := (wm_enum_strictMono O).monotone have hea : wm_enum O ia ≤ wm_enum O ib := hmono hab have heb : wm_enum O ib ≤ wm_enum O ic := hmono hbc have hw3 := an_w_tv hβ rw [hw] at hw3 have hc : wm_enum O ic ≤ q := by by_contra hn rw [if_neg hn] at hw3 split_ifs at hw3 <;> omega rw [hβ, an_value_tv] at hval have hpos : 0 < β q ic := by rw [hβ] exact an_tv_pos3 _ _ _ obtain ⟨hz, hβz⟩ := hS.2.2 q hqQ ic hpos hc have hwz : wz (q - wm_enum O ic) = m3_pairVector ia ib := by apply m3_unitAdd_injective ic show m3_unitAdd _ ic = m3_unitAdd _ ic rw [← hβz, hβ, an_tv_eq3] have hab' : m ≤ wm_enum O ia + wm_enum O ib + ρ := by omega have hbh : wm_enum O ib ∈ wm_high m ρ O := wm_mem_high.2 ⟨wm_enum_mem O ib, by omega⟩ have hch : wm_enum O ic ∈ wm_high m ρ O := wm_mem_high.2 ⟨wm_enum_mem O ic, by omega⟩ have hk := an_lowdir hy hbh hch heb (by omega) have hu := an_sel_mem hk obtain ⟨iu, hiu⟩ := wm_enum_surj O (an_mem_D.1 (Finset.mem_sdiff.1 hu).1).1 refine ⟨_, ia, ib, ic, iu, hab, hbc, hβ, hc, hz, hwz, hab', hbh, hch, an_rank_mono heb, hk, hiu, by rw [hiu]; exact hu, rfl⟩ theorem an_P_exists {m ρ : ℕ} {O Z Q : Finset ℕ} {wz β : ℕ → Fin O.card → ℕ} (hS : an_SelHyp m ρ O Z Q wz β) {y q : ℕ} (hy : an_IsAnchor m ρ O y) (hq : q ∈ an_Qj O Q β 2 ∩ an_I m ρ y) : ∃ x, an_PProp m ρ O Z wz β y q x := by obtain ⟨hq2, hqI⟩ := Finset.mem_inter.1 hq have hI := an_mem_I.1 hqI obtain ⟨hqQ, hw⟩ := an_mem_Qj.1 hq2 obtain ⟨hdeg, hval, hqm⟩ := hS.1 q hqQ obtain ⟨ia, ib, ic, hab, hbc, hβ⟩ := m3_degree_three_repr _ hdeg have hmono := (wm_enum_strictMono O).monotone have hea : wm_enum O ia ≤ wm_enum O ib := hmono hab have heb : wm_enum O ib ≤ wm_enum O ic := hmono hbc have hw2 := an_w_tv hβ rw [hw] at hw2 have hc : q < wm_enum O ic := by by_contra hn have h3 : wm_enum O ic ≤ q := not_lt.1 hn rw [if_pos h3, if_pos (le_trans heb h3), if_pos (le_trans hea (le_trans heb h3))] at hw2 omega have hb : wm_enum O ib ≤ q := by by_contra hn rw [if_neg hn, if_neg (not_le.2 hc)] at hw2 split_ifs at hw2 <;> omega have ha : wm_enum O ia ≤ q := le_trans hea hb rw [hβ, an_value_tv] at hval have hpos : 0 < β q ib := by rw [hβ] exact an_tv_pos2 _ _ _ obtain ⟨hz, hβz⟩ := hS.2.2 q hqQ ib hpos hb have hwz : wz (q - wm_enum O ib) = m3_pairVector ia ic := by apply m3_unitAdd_injective ib show m3_unitAdd _ ib = m3_unitAdd _ ib rw [← hβz, hβ, an_tv_eq2] have hac : m ≤ wm_enum O ia + wm_enum O ic + ρ := by omega have hbc' : m ≤ wm_enum O ib + wm_enum O ic + ρ := by omega have hbD : wm_enum O ib ∈ an_D m ρ O y := an_mem_D.2 ⟨wm_enum_mem O ib, by omega⟩ have hyh := wm_mem_high.1 hy.1 have hyc : y ≤ wm_enum O ic := by omega have hch : wm_enum O ic ∈ wm_high m ρ O := wm_mem_high.2 ⟨wm_enum_mem O ic, by omega⟩ obtain ⟨hk, hmemG, hlt, hshort⟩ := an_colrank hy hbD hch hyc hbc' obtain ⟨iu, hiu⟩ := wm_enum_surj O (wm_mem_high.1 (an_mem_G.1 hmemG).1).1 refine ⟨_, ia, ib, ic, iu, hab, hbc, hβ, hb, hz, hwz, hac, hbD, hch, hea, hk, hiu, by rw [hiu]; exact hmemG, by rw [hiu]; exact hlt, by rw [hiu]; exact hshort, rfl⟩ /-! ### Injectivity of the incidence maps -/ theorem an_R_inj {m ρ : ℕ} {O Z : Finset ℕ} {wz β : ℕ → Fin O.card → ℕ} {y q1 q2 : ℕ} {x : ℕ × ℕ} (h1 : an_RProp m ρ O Z wz β y q1 x) (h2 : an_RProp m ρ O Z wz β y q2 x) : q1 = q2 := by obtain ⟨ia1, ib1, ic1, iu1, hab1, -, -, hc1, -, hwz1, -, -, hch1, hr1, hk1, hiu1, -, hx1⟩ := h1 obtain ⟨ia2, ib2, ic2, iu2, hab2, -, -, hc2, -, hwz2, -, -, hch2, hr2, hk2, hiu2, -, hx2⟩ := h2 rw [hx1] at hx2 obtain ⟨hz, hu⟩ := Prod.mk.inj hx2 rw [hz, hwz2] at hwz1 obtain ⟨-, hb⟩ := m3_pairVector_sorted_inj ia2 ib2 ia1 ib1 hab2 hab1 hwz1 subst hb rw [hiu1, hiu2] at hu have hk := an_sel_inj hk1 hk2 hu have hc := an_rank_inj hch1 hch2 (by omega) omega theorem an_P_inj {m ρ : ℕ} {O Z : Finset ℕ} {wz β : ℕ → Fin O.card → ℕ} {y q1 q2 : ℕ} {x : ℕ × ℕ} (h1 : an_PProp m ρ O Z wz β y q1 x) (h2 : an_PProp m ρ O Z wz β y q2 x) : q1 = q2 := by obtain ⟨ia1, ib1, ic1, iu1, -, -, -, hb1, -, -, -, hbD1, -, -, hk1, hiu1, -, -, -, hx1⟩ := h1 obtain ⟨ia2, ib2, ic2, iu2, -, -, -, hb2, -, -, -, hbD2, -, -, hk2, hiu2, -, -, -, hx2⟩ := h2 rw [hx1] at hx2 obtain ⟨hz, hu⟩ := Prod.mk.inj hx2 rw [hiu1, hiu2] at hu have hk := an_sel_inj hk1 hk2 hu have hb := an_count_gt_inj hbD1 hbD2 hk omega theorem an_PR_ne {m ρ : ℕ} {O Z : Finset ℕ} {wz β : ℕ → Fin O.card → ℕ} {y q1 q2 : ℕ} {x : ℕ × ℕ} (hP : an_PProp m ρ O Z wz β y q1 x) (hR : an_RProp m ρ O Z wz β y q2 x) : False := by obtain ⟨_, _, _, iu1, -, -, -, -, -, -, -, -, -, -, -, -, hG, -, -, hx1⟩ := hP obtain ⟨_, ib2, _, iu2, -, -, -, -, -, -, -, hbh, -, -, -, -, hD, hx2⟩ := hR rw [hx1] at hx2 obtain ⟨-, hu⟩ := Prod.mk.inj hx2 have h1 := wm_mem_high.1 (an_mem_G.1 hG).1 have h2 := (an_mem_D.1 (Finset.mem_sdiff.1 hD).1).2 have h3 := wm_mem_high.1 hbh omega /-! ### Used incidences and their targets -/ /-- The incidence `x = (z, u)` (parent `wz z`, direction of value `u`) is used. -/ def an_usedV (O Q : Finset ℕ) (wz β : ℕ → Fin O.card → ℕ) (x : ℕ × ℕ) : Prop := ∃ i, wm_enum O i = x.2 ∧ an_used O Q wz β x.1 i /-- A used lower-cubic incidence lands in `Q₁ ∖ I`; its target cubic is `(u < a ≤ b)`. -/ theorem an_R_target {m ρ : ℕ} {O Z Q : Finset ℕ} {wz β : ℕ → Fin O.card → ℕ} (hS : an_SelHyp m ρ O Z Q wz β) {y q : ℕ} {x : ℕ × ℕ} (hR : an_RProp m ρ O Z wz β y q x) (hu : an_usedV O Q wz β x) : x.1 + x.2 ∈ an_Qj O Q β 1 ∧ x.1 + x.2 ∉ an_I m ρ y ∧ ∃ ia ib iu : Fin O.card, iu ≤ ia ∧ ia ≤ ib ∧ β (x.1 + x.2) = m3_tripleVector iu ia ib ∧ wm_enum O iu = x.2 := by obtain ⟨ia, ib, ic, iu, hab, -, -, hc, hz, hwz, hab', hbh, -, -, -, -, hD, hx⟩ := hR obtain ⟨i, hi, hused⟩ := hu subst hx have hii : i = iu := wm_enum_inj O hi subst hii obtain ⟨hQ, hβ⟩ := hused simp only at hQ hβ ⊢ rw [hwz] at hβ change β _ = m3_tripleVector i ia ib at hβ have hval := hS.2.1 _ hz rw [hwz, an_value_pv] at hval obtain ⟨hD1, hD2⟩ := Finset.mem_sdiff.1 hD have hub := (an_mem_D.1 hD1).2 have huy : ¬ (wm_enum O i + y + ρ < m) := fun h => hD2 (an_mem_D.2 ⟨wm_enum_mem O i, h⟩) have hmono := (wm_enum_strictMono O).monotone have hea : wm_enum O ia ≤ wm_enum O ib := hmono hab have hlt : wm_enum O i < wm_enum O ia := by omega have hiu : i ≤ ia := le_of_lt ((wm_enum_strictMono O).lt_iff_lt.1 hlt) have hw := an_w_tv hβ rw [if_pos (by omega), if_neg (by omega), if_neg (by omega)] at hw refine ⟨an_mem_Qj.2 ⟨hQ, hw⟩, ?_, ia, ib, i, hiu, hab, hβ, rfl⟩ rw [an_mem_I] omega /-- A used prefix incidence lands in `Q₂ ∩ J`; its target cubic is `(a < c' < c)`. -/ theorem an_P_target {m ρ : ℕ} {O Z Q : Finset ℕ} {wz β : ℕ → Fin O.card → ℕ} (hS : an_SelHyp m ρ O Z Q wz β) {y q : ℕ} {x : ℕ × ℕ} (hy : y ∈ wm_high m ρ O) (hP : an_PProp m ρ O Z wz β y q x) (hu : an_usedV O Q wz β x) : x.1 + x.2 ∈ an_Qj O Q β 2 ∩ Finset.Ico y m ∧ ∃ ia iu ic : Fin O.card, ia ≤ iu ∧ iu ≤ ic ∧ β (x.1 + x.2) = m3_tripleVector ia iu ic ∧ wm_enum O iu = x.2 := by obtain ⟨ia, ib, ic, iu, -, -, -, hb, hz, hwz, hac, hbD, hch, hea, -, -, hG, hlt, hshort, hx⟩ := hP obtain ⟨i, hi, hused⟩ := hu subst hx have hii : i = iu := wm_enum_inj O hi subst hii obtain ⟨hQ, hβ⟩ := hused simp only at hQ hβ ⊢ rw [hwz] at hβ change β _ = m3_tripleVector i ia ic at hβ rw [an_tv_swap] at hβ have hval := hS.2.1 _ hz rw [hwz, an_value_pv] at hval obtain ⟨hGh, hyi⟩ := an_mem_G.1 hG have hih := wm_mem_high.1 hGh have hch' := wm_mem_high.1 hch have hyh := wm_mem_high.1 hy have hbD' := (an_mem_D.1 hbD).2 have hqm := (hS.1 _ hQ).2.2 have hai : wm_enum O ia < wm_enum O i := by omega have h1 : ia ≤ i := le_of_lt ((wm_enum_strictMono O).lt_iff_lt.1 hai) have h2 : i ≤ ic := le_of_lt ((wm_enum_strictMono O).lt_iff_lt.1 hlt) have hw := an_w_tv hβ rw [if_pos (by omega), if_pos (by omega), if_neg (by omega)] at hw exact ⟨Finset.mem_inter.2 ⟨an_mem_Qj.2 ⟨hQ, hw⟩, Finset.mem_Ico.2 ⟨by omega, hqm⟩⟩, ia, i, ic, h1, h2, hβ, rfl⟩ theorem an_R_target_inj {m ρ : ℕ} {O Z Q : Finset ℕ} {wz β : ℕ → Fin O.card → ℕ} (hS : an_SelHyp m ρ O Z Q wz β) {y q1 q2 : ℕ} {x1 x2 : ℕ × ℕ} (h1 : an_RProp m ρ O Z wz β y q1 x1) (h2 : an_RProp m ρ O Z wz β y q2 x2) (hu1 : an_usedV O Q wz β x1) (hu2 : an_usedV O Q wz β x2) (he : x1.1 + x1.2 = x2.1 + x2.2) : x1 = x2 := by obtain ⟨-, -, ia1, ib1, iu1, hu1a, hab1, hβ1, he1⟩ := an_R_target hS h1 hu1 obtain ⟨-, -, ia2, ib2, iu2, hu2a, hab2, hβ2, he2⟩ := an_R_target hS h2 hu2 rw [he, hβ2] at hβ1 obtain ⟨hi, -, -⟩ := m3_tripleVector_sorted_inj iu2 ia2 ib2 iu1 ia1 ib1 hu2a hab2 hu1a hab1 hβ1 subst hi rw [he1] at he2 exact Prod.ext (by omega) he2 theorem an_P_target_inj {m ρ : ℕ} {O Z Q : Finset ℕ} {wz β : ℕ → Fin O.card → ℕ} (hS : an_SelHyp m ρ O Z Q wz β) {y q1 q2 : ℕ} {x1 x2 : ℕ × ℕ} (hy : y ∈ wm_high m ρ O) (h1 : an_PProp m ρ O Z wz β y q1 x1) (h2 : an_PProp m ρ O Z wz β y q2 x2) (hu1 : an_usedV O Q wz β x1) (hu2 : an_usedV O Q wz β x2) (he : x1.1 + x1.2 = x2.1 + x2.2) : x1 = x2 := by obtain ⟨-, ia1, iu1, ic1, hai1, hic1, hβ1, he1⟩ := an_P_target hS hy h1 hu1 obtain ⟨-, ia2, iu2, ic2, hai2, hic2, hβ2, he2⟩ := an_P_target hS hy h2 hu2 rw [he, hβ2] at hβ1 obtain ⟨-, hi, -⟩ := m3_tripleVector_sorted_inj ia2 iu2 ic2 ia1 iu1 ic1 hai2 hic2 hai1 hic1 hβ1 subst hi rw [he1] at he2 exact Prod.ext (by omega) he2 /-! ### Abstract PAYMENT (EXT1 Lemmas 7–9): `|P| + |R| ≤ #unused + |Q₂ ∩ J| + |Q₁ ∖ I|` -/ theorem an_payment_abs {m ρ : ℕ} {O Z Q : Finset ℕ} {wz β : ℕ → Fin O.card → ℕ} (hS : an_SelHyp m ρ O Z Q wz β) {y : ℕ} (hy : an_IsAnchor m ρ O y) [DecidablePred (fun p : ℕ × Fin O.card => ¬ an_used O Q wz β p.1 p.2)] : (an_Qj O Q β 2 ∩ an_I m ρ y).card + (an_Qj O Q β 3 ∩ Finset.range y).card ≤ ((Z ×ˢ (Finset.univ : Finset (Fin O.card))).filter (fun p : ℕ × Fin O.card => ¬ an_used O Q wz β p.1 p.2)).card + (an_Qj O Q β 2 ∩ Finset.Ico y m).card + (an_Qj O Q β 1 \ an_I m ρ y).card := by classical have hyh := hy.1 set P := an_Qj O Q β 2 ∩ an_I m ρ y with hPdef set R := an_Qj O Q β 3 ∩ Finset.range y with hRdef have hPR : Disjoint P R := by rw [Finset.disjoint_left] intro q hP hR have h2 := (an_mem_Qj.1 (Finset.mem_inter.1 hP).1).2 have h3 := (an_mem_Qj.1 (Finset.mem_inter.1 hR).1).2 omega have hex : ∀ q, ∃ x : ℕ × ℕ, (q ∈ P → an_PProp m ρ O Z wz β y q x) ∧ (q ∈ R → an_RProp m ρ O Z wz β y q x) := by intro q by_cases hP : q ∈ P · obtain ⟨x, hx⟩ := an_P_exists hS hy hP exact ⟨x, fun _ => hx, fun hR => absurd hR (Finset.disjoint_left.1 hPR hP)⟩ · by_cases hR : q ∈ R · obtain ⟨x, hx⟩ := an_R_exists hS hy hR exact ⟨x, fun h => absurd h hP, fun _ => hx⟩ · exact ⟨(0, 0), fun h => absurd h hP, fun h => absurd h hR⟩ choose f hf using hex have hS' : (P ∪ R).card = P.card + R.card := Finset.card_union_of_disjoint hPR have hinj : Set.InjOn f (P ∪ R : Finset ℕ) := by intro q1 hq1 q2 hq2 he rcases Finset.mem_union.1 (Finset.mem_coe.1 hq1) with h1 | h1 <;> rcases Finset.mem_union.1 (Finset.mem_coe.1 hq2) with h2 | h2 · have a := (hf q1).1 h1 have b := (hf q2).1 h2 rw [← he] at b exact an_P_inj a b · have a := (hf q1).1 h1 have b := (hf q2).2 h2 rw [← he] at b exact (an_PR_ne a b).elim · have a := (hf q1).2 h1 have b := (hf q2).1 h2 rw [← he] at b exact (an_PR_ne b a).elim · have a := (hf q1).2 h1 have b := (hf q2).2 h2 rw [← he] at b exact an_R_inj a b have hshape : ∀ q ∈ P ∪ R, ∃ i : Fin O.card, (f q).1 ∈ Z ∧ wm_enum O i = (f q).2 := by intro q hq rcases Finset.mem_union.1 hq with h | h · obtain ⟨_, _, _, iu, -, -, -, -, hz, -, -, -, -, -, -, -, -, -, -, hx⟩ := (hf q).1 h rw [hx] exact ⟨iu, hz, rfl⟩ · obtain ⟨_, _, _, iu, -, -, -, -, hz, -, -, -, -, -, -, -, -, hx⟩ := (hf q).2 h rw [hx] exact ⟨iu, hz, rfl⟩ have hsplit := Finset.card_filter_add_card_filter_not (s := P ∪ R) (fun q => an_usedV O Q wz β (f q)) -- unused incidences have hU : ((P ∪ R).filter (fun q => ¬ an_usedV O Q wz β (f q))).card ≤ ((Z ×ˢ (Finset.univ : Finset (Fin O.card))).filter (fun p : ℕ × Fin O.card => ¬ an_used O Q wz β p.1 p.2)).card := by have hmaps : Set.MapsTo f ((P ∪ R).filter (fun q => ¬ an_usedV O Q wz β (f q)) : Finset ℕ) (((Z ×ˢ (Finset.univ : Finset (Fin O.card))).filter (fun p : ℕ × Fin O.card => ¬ an_used O Q wz β p.1 p.2)).image (fun p => (p.1, wm_enum O p.2)) : Finset (ℕ × ℕ)) := by intro q hq obtain ⟨hqS, hnu⟩ := Finset.mem_filter.1 (Finset.mem_coe.1 hq) obtain ⟨i, hz, hi⟩ := hshape q hqS refine Finset.mem_coe.2 (Finset.mem_image.2 ⟨((f q).1, i), ?_, ?_⟩) · refine Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨hz, Finset.mem_univ _⟩, ?_⟩ exact fun hu => hnu ⟨i, hi, hu⟩ · exact Prod.ext rfl hi have h1 := Finset.card_le_card_of_injOn f hmaps (hinj.mono (Finset.coe_subset.2 (Finset.filter_subset _ _))) exact le_trans h1 Finset.card_image_le -- used incidences have hUsed : ((P ∪ R).filter (fun q => an_usedV O Q wz β (f q))).card ≤ (an_Qj O Q β 2 ∩ Finset.Ico y m).card + (an_Qj O Q β 1 \ an_I m ρ y).card := by rw [Finset.filter_union] refine le_trans (Finset.card_union_le _ _) (Nat.add_le_add ?_ ?_) · apply Finset.card_le_card_of_injOn (fun q => (f q).1 + (f q).2) · intro q hq obtain ⟨hP, hu⟩ := Finset.mem_filter.1 (Finset.mem_coe.1 hq) exact Finset.mem_coe.2 (an_P_target hS hyh ((hf q).1 hP) hu).1 · intro q1 hq1 q2 hq2 he obtain ⟨hP1, hu1⟩ := Finset.mem_filter.1 (Finset.mem_coe.1 hq1) obtain ⟨hP2, hu2⟩ := Finset.mem_filter.1 (Finset.mem_coe.1 hq2) have hx := an_P_target_inj hS hyh ((hf q1).1 hP1) ((hf q2).1 hP2) hu1 hu2 he exact hinj (Finset.mem_coe.2 (Finset.mem_union_left _ hP1)) (Finset.mem_coe.2 (Finset.mem_union_left _ hP2)) hx · apply Finset.card_le_card_of_injOn (fun q => (f q).1 + (f q).2) · intro q hq obtain ⟨hR, hu⟩ := Finset.mem_filter.1 (Finset.mem_coe.1 hq) obtain ⟨h1, h2, -⟩ := an_R_target hS ((hf q).2 hR) hu exact Finset.mem_coe.2 (Finset.mem_sdiff.2 ⟨h1, h2⟩) · intro q1 hq1 q2 hq2 he obtain ⟨hR1, hu1⟩ := Finset.mem_filter.1 (Finset.mem_coe.1 hq1) obtain ⟨hR2, hu2⟩ := Finset.mem_filter.1 (Finset.mem_coe.1 hq2) have hx := an_R_target_inj hS ((hf q1).2 hR1) ((hf q2).2 hR2) hu1 hu2 he exact hinj (Finset.mem_coe.2 (Finset.mem_union_right _ hR1)) (Finset.mem_coe.2 (Finset.mem_union_right _ hR2)) hx omega /-! ### Strip-free instance and PAYMENT for the model `O` -/ lemma an_SelHyp_free {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) : an_SelHyp m ρ O (wm_Zhat m ρ O) (wm_Q m ρ O) (wm_wz m ρ O) (wm_beta m ρ O) := ⟨fun q hq => ⟨(wm_beta_spec hρ hq).1, (wm_beta_spec hρ hq).2, wm_Q_lt hρ hq⟩, fun z hz => (wm_wz_spec hρ hO hz).2, fun q hq i hi hle => wm_parent_wrapped hρ hq hi hle⟩ lemma an_Qj_free {m ρ : ℕ} {O : Finset ℕ} (j : ℕ) : an_Qj O (wm_Q m ρ O) (wm_beta m ρ O) j = wm_Qj m ρ O j := by ext q rw [an_mem_Qj, wm_mem_Qj] exact Iff.rfl lemma an_A_ge (m ρ : ℕ) (O : Finset ℕ) [DecidablePred (fun p : ℕ × Fin O.card => ¬ wm_used m ρ O p.1 p.2)] : ((wm_Zhat m ρ O ×ˢ (Finset.univ : Finset (Fin O.card))).filter (fun p : ℕ × Fin O.card => ¬ wm_used m ρ O p.1 p.2)).card ≤ wm_A m ρ O := by classical rw [Finset.card_filter, Finset.sum_product] unfold wm_A apply Finset.sum_le_sum intro z _ apply Finset.sum_le_sum intro i _ unfold wm_unusedw by_cases hu : wm_used m ρ O z i · simp [hu] · simp [hu] /-- PAYMENT for strip-free models: `|P| + |R| ≤ A + |F| + |Q₁ ∖ I|` (EXT1 (eq:globalinjection)). -/ theorem an_payment {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) {y : ℕ} (hy : an_IsAnchor m ρ O y) : (an_P m ρ O y).card + (an_R m ρ O y).card ≤ wm_A m ρ O + (an_F m ρ O y).card + (wm_Qj m ρ O 1 \ an_I m ρ y).card := by classical have h := an_payment_abs (an_SelHyp_free hρ hO) hy simp only [an_Qj_free] at h have hA := an_A_ge m ρ O have hF : wm_Qj m ρ O 2 ∩ Finset.Ico y m ⊆ an_F m ρ O y := by intro q hq obtain ⟨hq2, hqJ⟩ := Finset.mem_inter.1 hq obtain ⟨hqQ, hw⟩ := wm_mem_Qj.1 hq2 unfold an_F rw [Finset.mem_sdiff, Finset.mem_union] refine ⟨hqJ, fun h' => h'.elim (fun h3 => ?_) (fun hT => ?_)⟩ · have := (wm_mem_Qj.1 h3).2 omega · exact (wm_Q_sub hqQ).2.1 (an_T_sub_Y4 (wm_mem_high.1 hy.1).1 hT) have hFc := Finset.card_le_card hF unfold an_P an_R have hU : ((wm_Zhat m ρ O ×ˢ (Finset.univ : Finset (Fin O.card))).filter (fun p : ℕ × Fin O.card => ¬ an_used O (wm_Q m ρ O) (wm_wz m ρ O) (wm_beta m ρ O) p.1 p.2)).card ≤ wm_A m ρ O := hA omega /-! ### The universal anchor bound (EXT1 Theorem 1, eq. (universal)) -/ lemma an_N40_card {m ρ : ℕ} {O : Finset ℕ} : (wm_N40 m ρ O).card + (wm_Y m ρ O 3).card ≤ (wm_Y m ρ O 4).card := by have hd : Disjoint (wm_N40 m ρ O) (wm_Y m ρ O 3) := by rw [Finset.disjoint_left] intro x hx h3 unfold wm_N40 at hx exact (Finset.mem_sdiff.1 (Finset.mem_sdiff.1 hx).1).2 h3 have hsub : wm_N40 m ρ O ∪ wm_Y m ρ O 3 ⊆ wm_Y m ρ O 4 := by intro x hx rcases Finset.mem_union.1 hx with h | h · unfold wm_N40 at h exact (Finset.mem_sdiff.1 (Finset.mem_sdiff.1 h).1).1 · exact wm_Y_mono (by norm_num) h have := Finset.card_le_card hsub rwa [Finset.card_union_of_disjoint hd] at this /-- **EXT1 anchor theorem.** For every strip-free model (window offsets `O`, shifted positions) with at least one high: `W₀ + p ≥ coll + 2·d3'' + d4 − h₄`, where `coll = 6(P_w − ζ₂) + 6(P_u − h₂)`. No residual hypothesis, no conductor condition. -/ theorem an_anchor_bound {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) (hh : (wm_high m ρ O).Nonempty) : 6 * ((wm_Pw m ρ O : ℤ) - (wm_Zhat m ρ O).card) + 6 * ((wm_Pu m ρ O : ℤ) - wm_h m ρ O 2) + 2 * wm_d3pp m ρ O + wm_d4 m ρ O - wm_h m ρ O 4 ≤ wm_W0 m ρ O + wm_p m ρ O := by obtain ⟨y, hy⟩ := an_exists_anchor hh have hID := wm_ID2 hρ hO unfold wm_Sigma at hID have hpay : ((an_P m ρ O y).card : ℤ) + (an_R m ρ O y).card ≤ (wm_A m ρ O : ℤ) + (an_F m ρ O y).card + (wm_Qj m ρ O 1 \ an_I m ρ y).card := by exact_mod_cast an_payment hρ hO hy have hsh : ((wm_Qj m ρ O 3).card : ℤ) + (an_F m ρ O y).card ≤ (an_R m ρ O y).card + (an_P m ρ O y).card + ρ + (wm_Zhat m ρ O).card + (wm_N40 m ρ O).card + (wm_Qj m ρ O 0).card + (wm_Qj m ρ O 1 ∩ an_I m ρ y).card + (wm_holes m ρ O).card := by exact_mod_cast an_shell hρ hO hy.1 have hholes := wm_holes_card (m := m) (ρ := ρ) (O := O) (by omega) have hQ1 : ((wm_Qj m ρ O 1 ∩ an_I m ρ y).card : ℤ) + (wm_Qj m ρ O 1 \ an_I m ρ y).card = (wm_Qj m ρ O 1).card := by exact_mod_cast Finset.card_inter_add_card_sdiff (wm_Qj m ρ O 1) (an_I m ρ y) have hN : ((wm_N40 m ρ O).card : ℤ) + (wm_Y m ρ O 3).card ≤ (wm_Y m ρ O 4).card := by exact_mod_cast an_N40_card have h4 : wm_h m ρ O 4 = ((wm_Y m ρ O 4).card : ℤ) - (wm_Y m ρ O 3).card := rfl have hη : (0 : ℤ) ≤ ((wm_Zhat m ρ O ∩ wm_Y m ρ O 4).card : ℤ) := Nat.cast_nonneg _ have hq0 : (0 : ℤ) ≤ ((wm_Qj m ρ O 0).card : ℤ) := Nat.cast_nonneg _ rw [h4] linarith /-! ### Residual corollary (EXT1 Theorem 1, eq. (target)), using L3's pool lemmas (M7P) -/ lemma an_high_of_res {m ρ : ℕ} {O : Finset ℕ} (hres : wm_Residual m ρ O) : (wm_high m ρ O).Nonempty := by apply Finset.card_pos.1 have h := hres.2.2.2 unfold wm_high omega /-- **CORE₁ for strip-free residual models** (EXT1): `W₀ + p ≥ 0`. -/ theorem an_anchor_core {m ρ : ℕ} {O : Finset ℕ} (hρ : ρ < m) (hO : ∀ b ∈ O, 0 < b ∧ b + ρ < m) (hres : wm_Residual m ρ O) : 0 ≤ wm_W0 m ρ O + wm_p m ρ O := by have h1 := an_anchor_bound hρ hO (an_high_of_res hres) have h2 := wm_coll_nonneg hρ hO have h3 := wm_d3pp_nonneg (O := O) hρ have h4 := wm_quartic hρ hres unfold wm_coll at h2 linarith -- ===== S1.lean ===== /-! ## Strip cores (A10 §4.1, A29 §A1) in L3's model, part 1: the level structure. Offsets `B ⊆ [1, m)`, window offsets `O = wm_win m ρ B` (`b + ρ < m`), strip offsets `G = wm_strip m ρ B` (`m ≤ b + ρ`). Shifted positions `u ∈ [0, m)`: `Y_t` (unwrapped sums), `Z_t` (once-wrapped sums, `wm_Z m ρ B t`), `V_t` (twice-wrapped sums). `B_k = Y_k ∪ Z_{k−1} ∪ V_{k−2}` for `k ≤ 4`. All new names carry the prefix `st_`. -/ /-- Twice-wrapped positions: `u < m` with `u + 2m − ρ` a sum of `≤ t` offsets. -/ noncomputable def st_V (m ρ : ℕ) (B : Finset ℕ) (t : ℕ) : Finset ℕ := by classical exact (Finset.range m).filter (fun u => u + 2 * m - ρ ∈ t • insert 0 B) lemma st_mem_V {m ρ : ℕ} {B : Finset ℕ} {t u : ℕ} : u ∈ st_V m ρ B t ↔ u < m ∧ u + 2 * m - ρ ∈ t • insert 0 B := by classical unfold st_V rw [Finset.mem_filter, Finset.mem_range] lemma st_H_lt {m : ℕ} {B : Finset ℕ} (hm : 0 < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) : ∀ h ∈ insert 0 B, h < m := by intro h hh rcases Finset.mem_insert.1 hh with rfl | hh · exact hm · exact (hB h hh).2 theorem st_mem_B {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {k : ℕ} (hk : k ≤ 4) (u : ℕ) : u ∈ wm_B m ρ B k ↔ u ∈ wm_Y m ρ B k ∨ (1 ≤ k ∧ u ∈ wm_Z m ρ B (k - 1)) ∨ (2 ≤ k ∧ u ∈ st_V m ρ B (k - 2)) := by have hH := st_H_lt (show 0 < m by omega) hB constructor · intro hu obtain ⟨t, s, hs, hk', rfl⟩ := (wm_mem_B m ρ B k u).1 hu have hdm := Nat.div_add_mod' (s + ρ) m have hlt := Nat.mod_lt (s + ρ) (show 0 < m by omega) have hle := wm_nsmul_le hH t s hs generalize hj : (s + ρ) / m = j at hdm hk' rcases (show j = 0 ∨ j = 1 ∨ j = 2 ∨ 3 ≤ j by omega) with rfl | rfl | rfl | hj3 · left refine wm_mem_Y.2 ⟨by omega, hlt, ?_⟩ rw [show (s + ρ) % m - ρ = s by omega] exact wm_nsmul_mono (by omega) hs · right left refine ⟨by omega, (wm_mem_Z hρ).2 ⟨hlt, ?_⟩⟩ rw [show (s + ρ) % m + m - ρ = s by omega] exact wm_nsmul_mono (by omega) hs · right right refine ⟨by omega, st_mem_V.2 ⟨hlt, ?_⟩⟩ rw [show (s + ρ) % m + 2 * m - ρ = s by omega] exact wm_nsmul_mono (by omega) hs · exfalso have hjm := Nat.mul_le_mul_right m hj3 have ht : t ≤ 1 := by omega interval_cases t <;> omega · rintro (hu | ⟨hk1, hu⟩ | ⟨hk2, hu⟩) · obtain ⟨h1, h2, h3⟩ := wm_mem_Y.1 hu refine (wm_mem_B m ρ B k u).2 ⟨k, u - ρ, h3, ?_, ?_⟩ · rw [show u - ρ + ρ = u by omega, Nat.div_eq_of_lt h2] omega · rw [show u - ρ + ρ = u by omega, Nat.mod_eq_of_lt h2] · obtain ⟨h1, h2⟩ := (wm_mem_Z hρ).1 hu refine (wm_mem_B m ρ B k u).2 ⟨k - 1, u + m - ρ, h2, ?_, ?_⟩ · rw [show u + m - ρ + ρ = u + 1 * m by omega, Nat.add_mul_div_right _ _ (by omega), Nat.div_eq_of_lt h1] omega · rw [show u + m - ρ + ρ = u + 1 * m by omega, Nat.add_mul_mod_self_right, Nat.mod_eq_of_lt h1] · obtain ⟨h1, h2⟩ := st_mem_V.1 hu refine (wm_mem_B m ρ B k u).2 ⟨k - 2, u + 2 * m - ρ, h2, ?_, ?_⟩ · rw [show u + 2 * m - ρ + ρ = u + 2 * m by omega, Nat.add_mul_div_right _ _ (by omega), Nat.div_eq_of_lt h1] omega · rw [show u + 2 * m - ρ + ρ = u + 2 * m by omega, Nat.add_mul_mod_self_right, Nat.mod_eq_of_lt h1] lemma st_nsmul_sub {X Y : Finset ℕ} (h : X ⊆ Y) : ∀ t : ℕ, t • X ⊆ t • Y := by intro t induction t with | zero => simp | succ t ih => rw [succ_nsmul, succ_nsmul] exact Finset.add_subset_add ih h lemma st_win_sub (m ρ : ℕ) (B : Finset ℕ) : wm_win m ρ B ⊆ B := fun b hb => ((wm_mem_win m ρ B b).1 hb).1 /-- Unwrapped sums contain no strip offset. -/ lemma st_sum_win {m ρ : ℕ} {B : Finset ℕ} : ∀ t s : ℕ, s ∈ t • insert 0 B → s + ρ < m → s ∈ t • insert 0 (wm_win m ρ B) := by intro t induction t with | zero => intro s hs _ simpa using hs | succ t ih => intro s hs hsm rw [succ_nsmul] at hs ⊢ obtain ⟨y, hy, a, ha, rfl⟩ := Finset.mem_add.1 hs refine Finset.mem_add.2 ⟨y, ih y hy (by omega), a, ?_, rfl⟩ rcases Finset.mem_insert.1 ha with rfl | ha · exact Finset.mem_insert_self _ _ · exact Finset.mem_insert_of_mem ((wm_mem_win m ρ B a).2 ⟨ha, by omega⟩) lemma st_Y_eq {m ρ : ℕ} {B : Finset ℕ} (t : ℕ) : wm_Y m ρ B t = wm_Y m ρ (wm_win m ρ B) t := by ext u rw [wm_mem_Y, wm_mem_Y] constructor · rintro ⟨h1, h2, h3⟩ exact ⟨h1, h2, st_sum_win t _ h3 (by omega)⟩ · rintro ⟨h1, h2, h3⟩ exact ⟨h1, h2, st_nsmul_sub (Finset.insert_subset_insert 0 (st_win_sub m ρ B)) t h3⟩ lemma st_Z_win_sub {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (t : ℕ) : wm_Z m ρ (wm_win m ρ B) t ⊆ wm_Z m ρ B t := by intro u hu obtain ⟨h1, h2⟩ := (wm_mem_Z hρ).1 hu exact (wm_mem_Z hρ).2 ⟨h1, st_nsmul_sub (Finset.insert_subset_insert 0 (st_win_sub m ρ B)) t h2⟩ lemma st_Y_ge {m ρ : ℕ} {O : Finset ℕ} {t u : ℕ} (hu : u ∈ wm_Y m ρ O t) : ρ ≤ u := (wm_mem_Y.1 hu).1 /-- `Z₁ = G'`: the strip positions `g + ρ − m < ρ`. -/ lemma st_mem_Z1 {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {u : ℕ} : u ∈ wm_Z m ρ B 1 ↔ u < ρ ∧ u + m - ρ ∈ wm_strip m ρ B := by rw [wm_mem_Z hρ, one_nsmul] constructor · rintro ⟨h1, h2⟩ rcases Finset.mem_insert.1 h2 with h0 | hb · omega · have := (hB _ hb).2 refine ⟨by omega, ?_⟩ unfold wm_strip exact Finset.mem_filter.2 ⟨hb, by omega⟩ · rintro ⟨h1, h2⟩ unfold wm_strip at h2 exact ⟨by omega, Finset.mem_insert_of_mem (Finset.mem_filter.1 h2).1⟩ lemma st_Z1_lt {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {u : ℕ} (hu : u ∈ wm_Z m ρ B 1) : u < ρ := ((st_mem_Z1 hρ hB).1 hu).1 lemma st_Z1_not_Y {m ρ : ℕ} {B O : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {t u : ℕ} (hu : u ∈ wm_Z m ρ B 1) : u ∉ wm_Y m ρ O t := fun hY => by have := st_Z1_lt hρ hB hu have := st_Y_ge hY omega lemma st_card_Z1 {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) : (wm_Z m ρ B 1).card = (wm_strip m ρ B).card := by have he : wm_Z m ρ B 1 = (wm_strip m ρ B).image (fun g => g + ρ - m) := by ext u rw [st_mem_Z1 hρ hB, Finset.mem_image] constructor · rintro ⟨h1, h2⟩ exact ⟨u + m - ρ, h2, by omega⟩ · rintro ⟨g, hg, rfl⟩ have hg' := hg unfold wm_strip at hg' obtain ⟨hgB, hgs⟩ := Finset.mem_filter.1 hg' have := (hB g hgB).2 exact ⟨by omega, by rw [show g + ρ - m + m - ρ = g by omega]; exact hg⟩ rw [he] apply Finset.card_image_of_injOn intro a ha b hb hab have ha' := Finset.mem_coe.1 ha have hb' := Finset.mem_coe.1 hb unfold wm_strip at ha' hb' have h1 := (Finset.mem_filter.1 ha').2 have h2 := (Finset.mem_filter.1 hb').2 simp only at hab omega lemma st_card_B {m ρ : ℕ} (B : Finset ℕ) : B.card = (wm_win m ρ B).card + (wm_strip m ρ B).card := by classical have h := Finset.card_filter_add_card_filter_not (s := B) (fun b => b + ρ < m) have e2 : B.filter (fun b => ¬ b + ρ < m) = wm_strip m ρ B := by unfold wm_strip exact Finset.filter_congr (fun b _ => by omega) unfold wm_win rw [e2] at h omega /-! ### The level sets of a strip core (A10 Lemma T1) -/ lemma st_B_le1 {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {k : ℕ} (hk : k ≤ 1) : wm_B m ρ B k = wm_Y m ρ (wm_win m ρ B) k := by ext u rw [st_mem_B hρ hB (by omega), ← st_Y_eq] constructor · rintro (h | ⟨hk1, h⟩ | ⟨hk2, h⟩) · exact h · obtain ⟨h1, h2⟩ := (wm_mem_Z hρ).1 h rw [show k - 1 = 0 by omega] at h2 have : u + m - ρ = 0 := by simpa using h2 omega · omega · exact fun h => Or.inl h lemma st_B2 {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) : wm_B m ρ B 2 = wm_Y m ρ (wm_win m ρ B) 2 ∪ wm_Z m ρ B 1 := by ext u rw [st_mem_B hρ hB (by norm_num), ← st_Y_eq, Finset.mem_union] constructor · rintro (h | ⟨_, h⟩ | ⟨_, h⟩) · exact Or.inl h · exact Or.inr h · obtain ⟨h1, h2⟩ := st_mem_V.1 h have : u + 2 * m - ρ = 0 := by simpa using h2 omega · rintro (h | h) · exact Or.inl h · exact Or.inr (Or.inl ⟨by norm_num, h⟩) lemma st_B3 {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) : wm_B m ρ B 3 = wm_Y m ρ (wm_win m ρ B) 3 ∪ wm_Z m ρ B 2 := by ext u rw [st_mem_B hρ hB (by norm_num), ← st_Y_eq, Finset.mem_union] constructor · rintro (h | ⟨_, h⟩ | ⟨_, h⟩) · exact Or.inl h · exact Or.inr h · obtain ⟨h1, h2⟩ := st_mem_V.1 h rw [show (3 : ℕ) - 2 = 1 from rfl, one_nsmul] at h2 have := st_H_lt (show 0 < m by omega) hB _ h2 omega · rintro (h | h) · exact Or.inl h · exact Or.inr (Or.inl ⟨by norm_num, h⟩) lemma st_B4 {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) : wm_B m ρ B 4 = wm_Y m ρ (wm_win m ρ B) 4 ∪ wm_Z m ρ B 3 ∪ st_V m ρ B 2 := by ext u rw [st_mem_B hρ hB (by norm_num), ← st_Y_eq, Finset.mem_union, Finset.mem_union] constructor · rintro (h | ⟨_, h⟩ | ⟨_, h⟩) · exact Or.inl (Or.inl h) · exact Or.inl (Or.inr h) · exact Or.inr h · rintro ((h | h) | h) · exact Or.inl h · exact Or.inr (Or.inl ⟨by norm_num, h⟩) · exact Or.inr (Or.inr ⟨by norm_num, h⟩) /-! ### The objects of a strip core (A10 T1, A29 §A1) -/ /-- `Ẑ = B₃ ∖ (Y₃ ∪ G')`. -/ noncomputable def st_Zh (m ρ : ℕ) (B : Finset ℕ) : Finset ℕ := wm_Z m ρ B 2 \ (wm_Y m ρ (wm_win m ρ B) 3 ∪ wm_Z m ρ B 1) /-- `Q = B₄ ∖ (Y₄ ∪ B₃)`. -/ noncomputable def st_Q (m ρ : ℕ) (B : Finset ℕ) : Finset ℕ := (wm_Z m ρ B 3 ∪ st_V m ρ B 2) \ (wm_Y m ρ (wm_win m ρ B) 4 ∪ wm_Z m ρ B 2) /-- `N40_T = (Y₄ ∖ Y₃) ∖ Ẑ`. -/ noncomputable def st_N40 (m ρ : ℕ) (B : Finset ℕ) : Finset ℕ := (wm_Y m ρ (wm_win m ρ B) 4 \ wm_Y m ρ (wm_win m ρ B) 3) \ wm_Z m ρ B 2 /-- W-vertices `Ẑ_W = Ẑ₀ ∖ G'` (pure-window wrapped pairs). -/ noncomputable def st_ZW (m ρ : ℕ) (B : Finset ℕ) : Finset ℕ := wm_Zhat m ρ (wm_win m ρ B) \ wm_Z m ρ B 1 noncomputable def st_ZS (m ρ : ℕ) (B : Finset ℕ) : Finset ℕ := st_Zh m ρ B \ st_ZW m ρ B /-- Degree-3 elements of `Q` (no twice-wrapped strip pair). -/ noncomputable def st_Q3 (m ρ : ℕ) (B : Finset ℕ) : Finset ℕ := wm_Q m ρ B \ st_V m ρ B 2 /-- `Q_W`: pure-window cubics; `Q_S`: degree-3 elements with a strip; `Q_D`: strip pairs of level 4. -/ noncomputable def st_QW (m ρ : ℕ) (B : Finset ℕ) : Finset ℕ := st_Q3 m ρ B ∩ wm_Z m ρ (wm_win m ρ B) 3 noncomputable def st_QS (m ρ : ℕ) (B : Finset ℕ) : Finset ℕ := st_Q3 m ρ B \ wm_Z m ρ (wm_win m ρ B) 3 noncomputable def st_QD (m ρ : ℕ) (B : Finset ℕ) : Finset ℕ := st_Q m ρ B ∩ st_V m ρ B 2 lemma st_mem_Zh {m ρ : ℕ} {B : Finset ℕ} {u : ℕ} : u ∈ st_Zh m ρ B ↔ u ∈ wm_Z m ρ B 2 ∧ u ∉ wm_Y m ρ (wm_win m ρ B) 3 ∧ u ∉ wm_Z m ρ B 1 := by unfold st_Zh rw [Finset.mem_sdiff, Finset.mem_union, not_or] lemma st_mem_Q {m ρ : ℕ} {B : Finset ℕ} {u : ℕ} : u ∈ st_Q m ρ B ↔ (u ∈ wm_Z m ρ B 3 ∨ u ∈ st_V m ρ B 2) ∧ u ∉ wm_Y m ρ (wm_win m ρ B) 4 ∧ u ∉ wm_Z m ρ B 2 := by unfold st_Q rw [Finset.mem_sdiff, Finset.mem_union, Finset.mem_union, not_or] lemma st_Q3_sub_Q {m ρ : ℕ} {B : Finset ℕ} : st_Q3 m ρ B ⊆ st_Q m ρ B := by intro q hq unfold st_Q3 at hq obtain ⟨hqQ, _⟩ := Finset.mem_sdiff.1 hq obtain ⟨h3, h4, h2⟩ := wm_Q_sub hqQ rw [st_Y_eq] at h4 exact st_mem_Q.2 ⟨Or.inl h3, h4, h2⟩ lemma st_mem_Q3 {m ρ : ℕ} {B : Finset ℕ} {q : ℕ} : q ∈ st_Q3 m ρ B ↔ q ∈ st_Q m ρ B ∧ q ∉ st_V m ρ B 2 := by constructor · intro hq exact ⟨st_Q3_sub_Q hq, (Finset.mem_sdiff.1 hq).2⟩ · rintro ⟨hq, hv⟩ obtain ⟨h1, h2, h3⟩ := st_mem_Q.1 hq unfold st_Q3 wm_Q rw [Finset.mem_sdiff, Finset.mem_sdiff, Finset.mem_union, not_or, st_Y_eq] exact ⟨⟨h1.resolve_right hv, h2, h3⟩, hv⟩ lemma st_ZW_sub {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) : st_ZW m ρ B ⊆ st_Zh m ρ B := by intro z hz unfold st_ZW wm_Zhat at hz obtain ⟨hz', h1⟩ := Finset.mem_sdiff.1 hz obtain ⟨h2, h3⟩ := Finset.mem_sdiff.1 hz' exact st_mem_Zh.2 ⟨st_Z_win_sub hρ 2 h2, h3, h1⟩ lemma st_QW_sub {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) : st_QW m ρ B ⊆ wm_Q m ρ (wm_win m ρ B) := by intro q hq unfold st_QW at hq obtain ⟨hq3, hqZ⟩ := Finset.mem_inter.1 hq obtain ⟨_, h4, h2⟩ := st_mem_Q.1 (st_Q3_sub_Q hq3) unfold wm_Q rw [Finset.mem_sdiff, Finset.mem_union, not_or] exact ⟨hqZ, h4, fun h => h2 (st_Z_win_sub hρ 2 h)⟩ /-! ### Cardinalities: `ℓ`, `d`, partitions -/ lemma st_card_B3 {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) : (wm_B m ρ B 3).card = (wm_Y m ρ (wm_win m ρ B) 3).card + (wm_strip m ρ B).card + (st_Zh m ρ B).card := by rw [st_B3 hρ hB] have h1 := Finset.card_union_add_card_inter (wm_Y m ρ (wm_win m ρ B) 3) (wm_Z m ρ B 2) have h2 : wm_Z m ρ B 2 = (wm_Z m ρ B 2 ∩ wm_Y m ρ (wm_win m ρ B) 3) ∪ (wm_Z m ρ B 1 ∪ st_Zh m ρ B) := by ext u simp only [Finset.mem_union, Finset.mem_inter, st_mem_Zh] constructor · intro h by_cases h3 : u ∈ wm_Y m ρ (wm_win m ρ B) 3 · exact Or.inl ⟨h, h3⟩ · by_cases h1 : u ∈ wm_Z m ρ B 1 · exact Or.inr (Or.inl h1) · exact Or.inr (Or.inr ⟨h, h3, h1⟩) · rintro (⟨h, _⟩ | h | ⟨h, _⟩) · exact h · exact wm_Z_mono hρ (by norm_num) h · exact h have hd1 : Disjoint (wm_Z m ρ B 2 ∩ wm_Y m ρ (wm_win m ρ B) 3) (wm_Z m ρ B 1 ∪ st_Zh m ρ B) := by rw [Finset.disjoint_left] intro u hu hu' obtain ⟨_, h3⟩ := Finset.mem_inter.1 hu rcases Finset.mem_union.1 hu' with h | h · exact st_Z1_not_Y hρ hB h h3 · exact (st_mem_Zh.1 h).2.1 h3 have hd2 : Disjoint (wm_Z m ρ B 1) (st_Zh m ρ B) := by rw [Finset.disjoint_left] intro u h1 h2 exact (st_mem_Zh.1 h2).2.2 h1 have h3 : (wm_Z m ρ B 2).card = (wm_Z m ρ B 2 ∩ wm_Y m ρ (wm_win m ρ B) 3).card + (wm_strip m ρ B).card + (st_Zh m ρ B).card := by conv_lhs => rw [h2] rw [Finset.card_union_of_disjoint hd1, Finset.card_union_of_disjoint hd2, st_card_Z1 hρ hB] omega rw [Finset.inter_comm] at h3 omega lemma st_ell {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) : wm_ell m ρ B = (wm_Y m ρ (wm_win m ρ B) 0).card + (wm_Y m ρ (wm_win m ρ B) 1).card + (wm_Y m ρ (wm_win m ρ B) 2).card + (wm_Y m ρ (wm_win m ρ B) 3).card + 2 * (wm_strip m ρ B).card + (st_Zh m ρ B).card := by unfold wm_ell simp only [Finset.sum_range_succ, Finset.sum_range_zero] rw [st_B_le1 hρ hB (by norm_num : 0 ≤ 1), st_B_le1 hρ hB (le_refl 1), st_B2 hρ hB, st_card_B3 hρ hB] have hd : Disjoint (wm_Y m ρ (wm_win m ρ B) 2) (wm_Z m ρ B 1) := by rw [Finset.disjoint_left] intro u h2 h1 exact st_Z1_not_Y hρ hB h1 h2 rw [Finset.card_union_of_disjoint hd, st_card_Z1 hρ hB] omega lemma st_card_B4 {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) : wm_d m ρ B = (wm_B m ρ B 3).card + (st_N40 m ρ B).card + (st_Q m ρ B).card := by unfold wm_d have hsub : wm_B m ρ B 3 ⊆ wm_B m ρ B 4 := by rw [st_B3 hρ hB, st_B4 hρ hB] intro u hu rcases Finset.mem_union.1 hu with h | h · exact Finset.mem_union_left _ (Finset.mem_union_left _ (wm_Y_mono (by norm_num) h)) · exact Finset.mem_union_left _ (Finset.mem_union_right _ (wm_Z_mono hρ (by norm_num) h)) have he : wm_B m ρ B 4 \ wm_B m ρ B 3 = st_N40 m ρ B ∪ st_Q m ρ B := by rw [st_B3 hρ hB, st_B4 hρ hB] ext u unfold st_N40 simp only [Finset.mem_sdiff, Finset.mem_union, st_mem_Q] constructor · rintro ⟨(h4 | h3) | hv, hn⟩ · exact Or.inl ⟨⟨h4, fun h => hn (Or.inl h)⟩, fun h => hn (Or.inr h)⟩ · by_cases h4 : u ∈ wm_Y m ρ (wm_win m ρ B) 4 · exact Or.inl ⟨⟨h4, fun h => hn (Or.inl h)⟩, fun h => hn (Or.inr h)⟩ · exact Or.inr ⟨Or.inl h3, h4, fun h => hn (Or.inr h)⟩ · by_cases h4 : u ∈ wm_Y m ρ (wm_win m ρ B) 4 · exact Or.inl ⟨⟨h4, fun h => hn (Or.inl h)⟩, fun h => hn (Or.inr h)⟩ · exact Or.inr ⟨Or.inr hv, h4, fun h => hn (Or.inr h)⟩ · rintro (⟨⟨h4, h3⟩, h2⟩ | ⟨h3v, h4, h2⟩) · exact ⟨Or.inl (Or.inl h4), fun h => h.elim h3 h2⟩ · refine ⟨h3v.elim (fun h => Or.inl (Or.inr h)) Or.inr, fun h => h.elim (fun h' => h4 (wm_Y_mono (by norm_num) h')) h2⟩ have hd : Disjoint (st_N40 m ρ B) (st_Q m ρ B) := by rw [Finset.disjoint_left] intro u h1 h2 unfold st_N40 at h1 exact (st_mem_Q.1 h2).2.1 (Finset.mem_sdiff.1 (Finset.mem_sdiff.1 h1).1).1 have h1 := Finset.card_sdiff_add_card_eq_card hsub rw [he, Finset.card_union_of_disjoint hd] at h1 omega lemma st_eta {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) : (st_N40 m ρ B).card + (st_Zh m ρ B ∩ wm_Y m ρ (wm_win m ρ B) 4).card + (wm_Y m ρ (wm_win m ρ B) 3).card ≤ (wm_Y m ρ (wm_win m ρ B) 4).card := by have hsub : st_N40 m ρ B ∪ (st_Zh m ρ B ∩ wm_Y m ρ (wm_win m ρ B) 4) ∪ wm_Y m ρ (wm_win m ρ B) 3 ⊆ wm_Y m ρ (wm_win m ρ B) 4 := by intro u hu simp only [Finset.mem_union, Finset.mem_inter] at hu rcases hu with (h | ⟨_, h⟩) | h · unfold st_N40 at h exact (Finset.mem_sdiff.1 (Finset.mem_sdiff.1 h).1).1 · exact h · exact wm_Y_mono (by norm_num) h have hd1 : Disjoint (st_N40 m ρ B) (st_Zh m ρ B ∩ wm_Y m ρ (wm_win m ρ B) 4) := by rw [Finset.disjoint_left] intro u h1 h2 unfold st_N40 at h1 exact (Finset.mem_sdiff.1 h1).2 (st_mem_Zh.1 (Finset.mem_inter.1 h2).1).1 have hd2 : Disjoint (st_N40 m ρ B ∪ (st_Zh m ρ B ∩ wm_Y m ρ (wm_win m ρ B) 4)) (wm_Y m ρ (wm_win m ρ B) 3) := by rw [Finset.disjoint_left] intro u h h3 rcases Finset.mem_union.1 h with h1 | h2 · unfold st_N40 at h1 exact (Finset.mem_sdiff.1 (Finset.mem_sdiff.1 h1).1).2 h3 · exact (st_mem_Zh.1 (Finset.mem_inter.1 h2).1).2.1 h3 have := Finset.card_le_card hsub rwa [Finset.card_union_of_disjoint hd2, Finset.card_union_of_disjoint hd1] at this lemma st_card_Zh {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) : (st_Zh m ρ B).card = (st_ZW m ρ B).card + (st_ZS m ρ B).card := by unfold st_ZS have := Finset.card_sdiff_add_card_eq_card (st_ZW_sub (B := B) hρ) omega lemma st_card_Q {m ρ : ℕ} {B : Finset ℕ} : (st_Q m ρ B).card = (st_QW m ρ B).card + (st_QS m ρ B).card + (st_QD m ρ B).card := by have h1 := Finset.card_sdiff_add_card_inter (st_Q m ρ B) (st_V m ρ B 2) have h2 := Finset.card_inter_add_card_sdiff (st_Q3 m ρ B) (wm_Z m ρ (wm_win m ρ B) 3) have e : st_Q m ρ B \ st_V m ρ B 2 = st_Q3 m ρ B := by ext q rw [Finset.mem_sdiff, st_mem_Q3] rw [e] at h1 unfold st_QW st_QS st_QD omega /-- Shell cover of a strip core: `range m = Y₃ ∪ G' ∪ Ẑ ∪ N40_T ∪ Q ∪ holes`. -/ lemma st_cover {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {x : ℕ} (hx : x < m) (hx3 : x ∉ wm_Y m ρ (wm_win m ρ B) 3) : x ∈ wm_Z m ρ B 1 ∨ x ∈ st_Zh m ρ B ∨ x ∈ st_N40 m ρ B ∨ x ∈ st_Q m ρ B ∨ x ∈ wm_holes m ρ B := by by_cases h1 : x ∈ wm_Z m ρ B 1 · exact Or.inl h1 by_cases hz : x ∈ wm_Z m ρ B 2 · exact Or.inr (Or.inl (st_mem_Zh.2 ⟨hz, hx3, h1⟩)) by_cases h4 : x ∈ wm_Y m ρ (wm_win m ρ B) 4 · refine Or.inr (Or.inr (Or.inl ?_)) unfold st_N40 exact Finset.mem_sdiff.2 ⟨Finset.mem_sdiff.2 ⟨h4, hx3⟩, hz⟩ by_cases h3 : x ∈ wm_Z m ρ B 3 ∨ x ∈ st_V m ρ B 2 · exact Or.inr (Or.inr (Or.inr (Or.inl (st_mem_Q.2 ⟨h3, h4, hz⟩)))) · refine Or.inr (Or.inr (Or.inr (Or.inr ?_))) unfold wm_holes rw [st_B4 hρ hB, Finset.mem_sdiff, Finset.mem_union, Finset.mem_union, Finset.mem_range] exact ⟨hx, fun h => h.elim (fun h' => h'.elim h4 (fun h'' => h3 (Or.inl h''))) (fun h' => h3 (Or.inr h'))⟩ -- ===== S2.lean ===== /-! ## Strip cores, part 2: the pure-window objects `(Ẑ_W, Q_W)` (A29 Lemma S1, A3 fact 1) in window coordinates, i.e. with the window model's representations `w_z = wm_wz`, `β_q = wm_beta` over `O = wm_win m ρ B`. -/ lemma st_two_mem {B : Finset ℕ} {a b : ℕ} (ha : a ∈ insert 0 B) (hb : b ∈ insert 0 B) : a + b ∈ 2 • insert 0 B := by rw [two_nsmul] exact Finset.add_mem_add ha hb lemma st_strip_sub (m ρ : ℕ) (B : Finset ℕ) : wm_strip m ρ B ⊆ B := by intro g hg unfold wm_strip at hg exact (Finset.mem_filter.1 hg).1 /-- An element `q` of `Q` is never a strip position plus one offset. -/ lemma st_not_Z1_add {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {q z a : ℕ} (hq : q ∈ st_Q m ρ B) (hqm : q < m) (ha : a ∈ B) (hza : z + a = q) : z ∉ wm_Z m ρ B 1 := by intro hz obtain ⟨_, hg⟩ := (st_mem_Z1 hρ hB).1 hz apply (st_mem_Q.1 hq).2.2 refine (wm_mem_Z hρ).2 ⟨hqm, ?_⟩ rw [show q + m - ρ = (z + m - ρ) + a by omega] exact st_two_mem (Finset.mem_insert_of_mem (st_strip_sub m ρ B hg)) (Finset.mem_insert_of_mem ha) /-- A3 fact 1: the selected-pair interface for `(Ẑ_W, Q_W)` in window coordinates. -/ theorem st_selW {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) : an_SelHyp m ρ (wm_win m ρ B) (st_ZW m ρ B) (st_QW m ρ B) (wm_wz m ρ (wm_win m ρ B)) (wm_beta m ρ (wm_win m ρ B)) := by have hO : ∀ b ∈ wm_win m ρ B, 0 < b ∧ b + ρ < m := by intro b hb obtain ⟨hbB, hbρ⟩ := (wm_mem_win m ρ B b).1 hb exact ⟨(hB b hbB).1, hbρ⟩ refine ⟨fun q hq => ?_, fun z hz => ?_, fun q hq i hi hle => ?_⟩ · have hq0 := st_QW_sub hρ hq exact ⟨(wm_beta_spec hρ hq0).1, (wm_beta_spec hρ hq0).2, wm_Q_lt hρ hq0⟩ · unfold st_ZW at hz exact (wm_wz_spec hρ hO (Finset.mem_sdiff.1 hz).1).2 · have hq0 := st_QW_sub hρ hq obtain ⟨hz, hb⟩ := wm_parent_wrapped hρ hq0 hi hle refine ⟨?_, hb⟩ unfold st_ZW refine Finset.mem_sdiff.2 ⟨hz, st_not_Z1_add hρ hB (st_Q3_sub_Q (Finset.mem_inter.1 hq).1) (wm_Q_lt hρ hq0) (st_win_sub m ρ B (wm_enum_mem _ i)) (by omega)⟩ lemma st_ZW_deg {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) : ∀ z ∈ st_ZW m ρ B, m3_degree (wm_wz m ρ (wm_win m ρ B) z) = 2 := by have hO : ∀ b ∈ wm_win m ρ B, 0 < b ∧ b + ρ < m := by intro b hb obtain ⟨hbB, hbρ⟩ := (wm_mem_win m ρ B b).1 hb exact ⟨(hB b hbB).1, hbρ⟩ intro z hz unfold st_ZW at hz exact (wm_wz_spec hρ hO (Finset.mem_sdiff.1 hz).1).1 /-! ### Generic incidence count for selected-pair data (Lemma 6 in inequality form) -/ noncomputable def st_usedw (O Q : Finset ℕ) (wz β : ℕ → Fin O.card → ℕ) (z : ℕ) (i : Fin O.card) : ℕ := by classical exact if an_used O Q wz β z i then wz z i + 1 else 0 lemma st_lemma6_i {m ρ : ℕ} {O Z Q : Finset ℕ} {wz β : ℕ → Fin O.card → ℕ} (hS : an_SelHyp m ρ O Z Q wz β) (i : Fin O.card) : (∑ z ∈ Z, st_usedw O Q wz β z i) = ∑ q ∈ Q, if wm_enum O i ≤ q then β q i else 0 := by classical unfold st_usedw apply Finset.sum_bij_ne_zero (fun z _ _ => z + wm_enum O i) · intro z _ h2 have hu : an_used O Q wz β z i := by by_contra hn exact h2 (if_neg hn) exact hu.1 · intro z1 _ _ z2 _ _ he omega · intro q hq hne have hle : wm_enum O i ≤ q := by by_contra hn exact hne (if_neg hn) have hpos : 0 < β q i := by rw [if_pos hle] at hne omega obtain ⟨hz, hb⟩ := hS.2.2 q hq i hpos hle have he : q - wm_enum O i + wm_enum O i = q := by omega have hu : an_used O Q wz β (q - wm_enum O i) i := ⟨by rw [he]; exact hq, by rw [he]; exact hb⟩ exact ⟨q - wm_enum O i, hz, by rw [if_pos hu]; omega, he⟩ · intro z _ h2 have hu : an_used O Q wz β z i := by by_contra hn exact h2 (if_neg hn) rw [if_pos hu, if_pos (Nat.le_add_left _ _), hu.2] simp [m3_unitAdd] theorem st_W_count {m ρ : ℕ} {O Z Q : Finset ℕ} {wz β : ℕ → Fin O.card → ℕ} (hS : an_SelHyp m ρ O Z Q wz β) (hd : ∀ z ∈ Z, m3_degree (wz z) = 2) [DecidablePred (fun p : ℕ × Fin O.card => ¬ an_used O Q wz β p.1 p.2)] : (∑ q ∈ Q, an_w O β q) + ((Z ×ˢ (Finset.univ : Finset (Fin O.card))).filter (fun p : ℕ × Fin O.card => ¬ an_used O Q wz β p.1 p.2)).card ≤ (O.card + 2) * Z.card := by classical have h1 : (∑ q ∈ Q, an_w O β q) = ∑ z ∈ Z, ∑ i, st_usedw O Q wz β z i := by unfold an_w rw [Finset.sum_comm, Finset.sum_comm (s := Z)] exact Finset.sum_congr rfl (fun i _ => (st_lemma6_i hS i).symm) rw [h1, Finset.card_filter, Finset.sum_product, ← Finset.sum_add_distrib] have h2 : ∀ z ∈ Z, ((∑ i, st_usedw O Q wz β z i) + ∑ i, if ¬ an_used O Q wz β (z, i).1 (z, i).2 then 1 else 0) ≤ O.card + 2 := by intro z hz rw [← Finset.sum_add_distrib] have h3 : ∀ i ∈ (Finset.univ : Finset (Fin O.card)), st_usedw O Q wz β z i + (if ¬ an_used O Q wz β (z, i).1 (z, i).2 then 1 else 0) ≤ wz z i + 1 := by intro i _ unfold st_usedw by_cases hu : an_used O Q wz β z i · simp [hu] · simp [hu] refine le_trans (Finset.sum_le_sum h3) ?_ rw [Finset.sum_add_distrib] have hdz := hd z hz unfold m3_degree at hdz rw [hdz] simp omega refine le_trans (Finset.sum_le_sum h2) ?_ rw [Finset.sum_const, smul_eq_mul, Nat.mul_comm] /-- Partition of selected-pair cubics by `w`. -/ theorem st_Qj_partition {m ρ : ℕ} {O Z Q : Finset ℕ} {wz β : ℕ → Fin O.card → ℕ} (hS : an_SelHyp m ρ O Z Q wz β) : Q.card = (an_Qj O Q β 0).card + (an_Qj O Q β 1).card + (an_Qj O Q β 2).card + (an_Qj O Q β 3).card ∧ (∑ q ∈ Q, an_w O β q) = (an_Qj O Q β 1).card + 2 * (an_Qj O Q β 2).card + 3 * (an_Qj O Q β 3).card := by classical have hle : ∀ q ∈ Q, an_w O β q ≤ 3 := by intro q hq have hd := (hS.1 q hq).1 unfold m3_degree at hd unfold an_w rw [← hd] apply Finset.sum_le_sum intro i _ split_ifs <;> omega have hmap : Set.MapsTo (an_w O β) (Q : Set ℕ) (Finset.range 4 : Set ℕ) := by intro q hq simp only [Finset.coe_range, Set.mem_Iio] have := hle q (Finset.mem_coe.1 hq) omega have hQj : ∀ j, an_Qj O Q β j = Q.filter (fun q => an_w O β q = j) := fun j => rfl constructor · rw [Finset.card_eq_sum_card_fiberwise hmap] simp only [Finset.sum_range_succ, Finset.sum_range_zero, hQj] omega · rw [← Finset.sum_fiberwise_of_maps_to hmap] have hin : ∀ j ∈ Finset.range 4, (∑ q ∈ Q.filter (fun q => an_w O β q = j), an_w O β q) = j * (an_Qj O Q β j).card := by intro j _ rw [hQj, Finset.sum_congr rfl (fun q hq => (Finset.mem_filter.1 hq).2), Finset.sum_const, smul_eq_mul, Nat.mul_comm] rw [Finset.sum_congr rfl hin] simp only [Finset.sum_range_succ, Finset.sum_range_zero] omega /-- `d3''(T) ≥ d3''(T₀)` (A29 Cor. B, A10 V(c)): `Q_W ⊆ Q(T₀)` and `3 − w ≥ 0`. -/ theorem st_d3pp_ge {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) : wm_d3pp m ρ (wm_win m ρ B) ≤ wm_d3 m ρ (wm_win m ρ B) - (3 * ((st_QW m ρ B).card : ℤ) - ∑ q ∈ st_QW m ρ B, (an_w (wm_win m ρ B) (wm_beta m ρ (wm_win m ρ B)) q : ℤ)) := by have hsub := st_QW_sub (B := B) hρ have h1 : ∀ X : Finset ℕ, 3 * (X.card : ℤ) - ∑ q ∈ X, (wm_w m ρ (wm_win m ρ B) q : ℤ) = ∑ q ∈ X, (3 - (wm_w m ρ (wm_win m ρ B) q : ℤ)) := by intro X rw [Finset.sum_sub_distrib, Finset.sum_const, nsmul_eq_mul] ring have h2 : ∑ q ∈ st_QW m ρ B, (3 - (wm_w m ρ (wm_win m ρ B) q : ℤ)) ≤ ∑ q ∈ wm_Q m ρ (wm_win m ρ B), (3 - (wm_w m ρ (wm_win m ρ B) q : ℤ)) := by apply Finset.sum_le_sum_of_subset_of_nonneg hsub intro q hq _ have := wm_w_le hρ hq omega have e : ∀ q, an_w (wm_win m ρ B) (wm_beta m ρ (wm_win m ρ B)) q = wm_w m ρ (wm_win m ρ B) q := fun q => rfl simp only [e] unfold wm_d3pp rw [h1, h1] linarith -- ===== S3.lean ===== /-! ## Strip cores, part 3: the T-shell (A29 Lemma A2 in inequality form) and PAYMENT for `(Ẑ_W, Q_W)` (A3). -/ /-- `Q_j^W`: pure-window cubics with `w = j`. -/ noncomputable def st_Qj (m ρ : ℕ) (B : Finset ℕ) (j : ℕ) : Finset ℕ := an_Qj (wm_win m ρ B) (st_QW m ρ B) (wm_beta m ρ (wm_win m ρ B)) j /-- `F_T' = J ∖ (Q₃^W ∪ (y + (Y₃ ∩ I)))`. -/ noncomputable def st_F (m ρ : ℕ) (B : Finset ℕ) (y : ℕ) : Finset ℕ := Finset.Ico y m \ (st_Qj m ρ B 3 ∪ an_T m ρ (wm_win m ρ B) y) lemma st_mem_Qj {m ρ : ℕ} {B : Finset ℕ} {j q : ℕ} : q ∈ st_Qj m ρ B j ↔ q ∈ st_QW m ρ B ∧ wm_w m ρ (wm_win m ρ B) q = j := an_mem_Qj lemma st_QW_lt {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) {q : ℕ} (hq : q ∈ st_QW m ρ B) : q < m := wm_Q_lt hρ (st_QW_sub hρ hq) lemma st_QW_Q {m ρ : ℕ} {B : Finset ℕ} {q : ℕ} (hq : q ∈ st_QW m ρ B) : q ∈ st_Q m ρ B := st_Q3_sub_Q (Finset.mem_inter.1 hq).1 lemma st_Q_notY4 {m ρ : ℕ} {B : Finset ℕ} {q : ℕ} (hq : q ∈ st_Q m ρ B) : q ∉ wm_Y m ρ (wm_win m ρ B) 4 := (st_mem_Q.1 hq).2.1 lemma st_Qj3_not_I {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) {y q : ℕ} (hy : y ∈ wm_high m ρ (wm_win m ρ B)) (hq : q ∈ st_Qj m ρ B 3) : q ∉ an_I m ρ y := by obtain ⟨hqW, hw⟩ := st_mem_Qj.1 hq exact an_Q3_not_I hρ hy (wm_mem_Qj.2 ⟨st_QW_sub hρ hqW, hw⟩) /-- The T-shell inequality. -/ theorem st_shell {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {y : ℕ} (hy : y ∈ wm_high m ρ (wm_win m ρ B)) : (st_Qj m ρ B 3).card + (st_F m ρ B y).card ≤ (st_Qj m ρ B 3 ∩ Finset.range y).card + (st_Qj m ρ B 2 ∩ an_I m ρ y).card + ρ + (st_ZW m ρ B).card + (st_N40 m ρ B).card + (st_Qj m ρ B 0).card + (st_Qj m ρ B 1 ∩ an_I m ρ y).card + (wm_holes m ρ B).card + ((wm_Z m ρ B 1 ∩ an_I m ρ y).card + (st_ZS m ρ B ∩ an_I m ρ y).card + (st_QD m ρ B ∩ an_I m ρ y).card + (st_QS m ρ B ∩ an_I m ρ y).card) := by have hyO := (wm_mem_high.1 hy).1 have hym := ((wm_mem_win m ρ B y).1 hyO).2 -- (1) Q₃ ⊆ R ∪ (Q₃ ∩ J) have h1 : (st_Qj m ρ B 3).card ≤ (st_Qj m ρ B 3 ∩ Finset.range y).card + (st_Qj m ρ B 3 ∩ Finset.Ico y m).card := by refine le_trans (Finset.card_le_card ?_) (Finset.card_union_le _ _) intro q hq have hqm := st_QW_lt hρ (st_mem_Qj.1 hq).1 rw [Finset.mem_union] by_cases hqy : q < y · exact Or.inl (Finset.mem_inter.2 ⟨hq, Finset.mem_range.2 hqy⟩) · exact Or.inr (Finset.mem_inter.2 ⟨hq, Finset.mem_Ico.2 ⟨by omega, hqm⟩⟩) -- (2) F, Q₃ ∩ J, T are disjoint subsets of J have hT3 : Disjoint (st_Qj m ρ B 3) (an_T m ρ (wm_win m ρ B) y) := by rw [Finset.disjoint_left] intro q hq hqT exact st_Q_notY4 (st_QW_Q (st_mem_Qj.1 hq).1) (an_T_sub_Y4 hyO hqT) have hd1 : Disjoint (st_F m ρ B y) (st_Qj m ρ B 3 ∩ Finset.Ico y m) := by rw [Finset.disjoint_left] intro q hqF hq unfold st_F at hqF rw [Finset.mem_sdiff, Finset.mem_union] at hqF exact hqF.2 (Or.inl (Finset.mem_inter.1 hq).1) have hd2 : Disjoint (st_F m ρ B y ∪ (st_Qj m ρ B 3 ∩ Finset.Ico y m)) (an_T m ρ (wm_win m ρ B) y) := by rw [Finset.disjoint_left] intro q hq hqT rcases Finset.mem_union.1 hq with hqF | hq3 · unfold st_F at hqF rw [Finset.mem_sdiff, Finset.mem_union] at hqF exact hqF.2 (Or.inr hqT) · exact Finset.disjoint_left.1 hT3 (Finset.mem_inter.1 hq3).1 hqT have hsubJ : st_F m ρ B y ∪ (st_Qj m ρ B 3 ∩ Finset.Ico y m) ∪ an_T m ρ (wm_win m ρ B) y ⊆ Finset.Ico y m := by intro q hq rcases Finset.mem_union.1 hq with hq | hqT · rcases Finset.mem_union.1 hq with hqF | hq3 · unfold st_F at hqF exact (Finset.mem_sdiff.1 hqF).1 · exact (Finset.mem_inter.1 hq3).2 · obtain ⟨u, hu, rfl⟩ := Finset.mem_image.1 hqT have := an_mem_I.1 (Finset.mem_inter.1 hu).2 exact Finset.mem_Ico.2 ⟨by omega, by omega⟩ have h2 := Finset.card_le_card hsubJ rw [Finset.card_union_of_disjoint hd2, Finset.card_union_of_disjoint hd1, Nat.card_Ico] at h2 -- (3) |T| = |Y₃ ∩ I| have h3 : (an_T m ρ (wm_win m ρ B) y).card = (wm_Y m ρ (wm_win m ρ B) 3 ∩ an_I m ρ y).card := by unfold an_T exact Finset.card_image_of_injective _ (add_left_injective y) -- (4) |I| = |I ∩ Y₃| + |I ∖ Y₃| have h4 := Finset.card_inter_add_card_sdiff (an_I m ρ y) (wm_Y m ρ (wm_win m ρ B) 3) rw [Finset.inter_comm] at h4 have hIc : (an_I m ρ y).card = m - ρ - y := by unfold an_I exact Finset.card_range _ -- (5) I ∖ Y₃ ⊆ (G' ∩ I) ∪ Ẑ_W ∪ (Ẑ_S ∩ I) ∪ N40 ∪ Q₀ ∪ (Q₁ ∩ I) ∪ P ∪ (Q_D ∩ I) ∪ (Q_S ∩ I) ∪ holes have h5 : (an_I m ρ y \ wm_Y m ρ (wm_win m ρ B) 3).card ≤ (wm_Z m ρ B 1 ∩ an_I m ρ y).card + (st_ZW m ρ B).card + (st_ZS m ρ B ∩ an_I m ρ y).card + (st_N40 m ρ B).card + (st_Qj m ρ B 0).card + (st_Qj m ρ B 1 ∩ an_I m ρ y).card + (st_Qj m ρ B 2 ∩ an_I m ρ y).card + (st_QD m ρ B ∩ an_I m ρ y).card + (st_QS m ρ B ∩ an_I m ρ y).card + (wm_holes m ρ B).card := by have hsub : an_I m ρ y \ wm_Y m ρ (wm_win m ρ B) 3 ⊆ (wm_Z m ρ B 1 ∩ an_I m ρ y) ∪ st_ZW m ρ B ∪ (st_ZS m ρ B ∩ an_I m ρ y) ∪ st_N40 m ρ B ∪ st_Qj m ρ B 0 ∪ (st_Qj m ρ B 1 ∩ an_I m ρ y) ∪ (st_Qj m ρ B 2 ∩ an_I m ρ y) ∪ (st_QD m ρ B ∩ an_I m ρ y) ∪ (st_QS m ρ B ∩ an_I m ρ y) ∪ wm_holes m ρ B := by intro x hx obtain ⟨hxI, hx3⟩ := Finset.mem_sdiff.1 hx have hxm : x < m := by have := an_mem_I.1 hxI; omega simp only [Finset.mem_union, Finset.mem_inter] rcases st_cover hρ hB hxm hx3 with h | h | h | h | h · exact Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl ⟨h, hxI⟩)))))))) · by_cases hw : x ∈ st_ZW m ρ B · exact Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inr hw)))))))) · refine Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inr ⟨?_, hxI⟩))))))) unfold st_ZS exact Finset.mem_sdiff.2 ⟨h, hw⟩ · exact Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inr h)))))) · by_cases hv : x ∈ st_V m ρ B 2 · refine Or.inl (Or.inl (Or.inr ⟨?_, hxI⟩)) unfold st_QD exact Finset.mem_inter.2 ⟨h, hv⟩ · have h3 : x ∈ st_Q3 m ρ B := st_mem_Q3.2 ⟨h, hv⟩ by_cases hz : x ∈ wm_Z m ρ (wm_win m ρ B) 3 · have hW : x ∈ st_QW m ρ B := Finset.mem_inter.2 ⟨h3, hz⟩ have hw := wm_w_le hρ (st_QW_sub hρ hW) rcases (show wm_w m ρ (wm_win m ρ B) x = 0 ∨ wm_w m ρ (wm_win m ρ B) x = 1 ∨ wm_w m ρ (wm_win m ρ B) x = 2 ∨ wm_w m ρ (wm_win m ρ B) x = 3 by omega) with hw | hw | hw | hw · exact Or.inl (Or.inl (Or.inl (Or.inl (Or.inl (Or.inr (st_mem_Qj.2 ⟨hW, hw⟩)))))) · exact Or.inl (Or.inl (Or.inl (Or.inl (Or.inr ⟨st_mem_Qj.2 ⟨hW, hw⟩, hxI⟩)))) · exact Or.inl (Or.inl (Or.inl (Or.inr ⟨st_mem_Qj.2 ⟨hW, hw⟩, hxI⟩))) · exact absurd hxI (st_Qj3_not_I hρ hy (st_mem_Qj.2 ⟨hW, hw⟩)) · refine Or.inl (Or.inr ⟨?_, hxI⟩) unfold st_QS exact Finset.mem_sdiff.2 ⟨h3, hz⟩ · exact Or.inr h refine le_trans (Finset.card_le_card hsub) ?_ refine le_trans (Finset.card_union_le _ _) (Nat.add_le_add_right ?_ _) refine le_trans (Finset.card_union_le _ _) (Nat.add_le_add_right ?_ _) refine le_trans (Finset.card_union_le _ _) (Nat.add_le_add_right ?_ _) refine le_trans (Finset.card_union_le _ _) (Nat.add_le_add_right ?_ _) refine le_trans (Finset.card_union_le _ _) (Nat.add_le_add_right ?_ _) refine le_trans (Finset.card_union_le _ _) (Nat.add_le_add_right ?_ _) refine le_trans (Finset.card_union_le _ _) (Nat.add_le_add_right ?_ _) refine le_trans (Finset.card_union_le _ _) (Nat.add_le_add_right ?_ _) exact Finset.card_union_le _ _ omega /-- PAYMENT for strip cores (A29 Lemma A3): `|P| + |R| ≤ #unused_W + |F_T' ∩ Q₂^W| + |Q₁^W ∖ I|`, and the remaining positions of `F_T'`. -/ theorem st_payment {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {y : ℕ} (hy : an_IsAnchor m ρ (wm_win m ρ B) y) [DecidablePred (fun p : ℕ × Fin (wm_win m ρ B).card => ¬ an_used (wm_win m ρ B) (st_QW m ρ B) (wm_wz m ρ (wm_win m ρ B)) (wm_beta m ρ (wm_win m ρ B)) p.1 p.2)] : (st_Qj m ρ B 2 ∩ an_I m ρ y).card + (st_Qj m ρ B 3 ∩ Finset.range y).card + (st_F m ρ B y \ st_Qj m ρ B 2).card ≤ ((st_ZW m ρ B ×ˢ (Finset.univ : Finset (Fin (wm_win m ρ B).card))).filter (fun p : ℕ × Fin (wm_win m ρ B).card => ¬ an_used (wm_win m ρ B) (st_QW m ρ B) (wm_wz m ρ (wm_win m ρ B)) (wm_beta m ρ (wm_win m ρ B)) p.1 p.2)).card + (st_F m ρ B y).card + (st_Qj m ρ B 1 \ an_I m ρ y).card := by have h := an_payment_abs (st_selW hρ hB) hy have hyO := (wm_mem_high.1 hy.1).1 have hF : st_Qj m ρ B 2 ∩ Finset.Ico y m ⊆ st_F m ρ B y ∩ st_Qj m ρ B 2 := by intro q hq obtain ⟨hq2, hqJ⟩ := Finset.mem_inter.1 hq obtain ⟨hqW, hw⟩ := st_mem_Qj.1 hq2 refine Finset.mem_inter.2 ⟨?_, hq2⟩ unfold st_F rw [Finset.mem_sdiff, Finset.mem_union] refine ⟨hqJ, fun h' => h'.elim (fun h3 => ?_) (fun hT => ?_)⟩ · have := (st_mem_Qj.1 h3).2 omega · exact st_Q_notY4 (st_QW_Q hqW) (an_T_sub_Y4 hyO hT) have hFc := Finset.card_le_card hF have hsplit := Finset.card_inter_add_card_sdiff (st_F m ρ B y) (st_Qj m ρ B 2) unfold st_Qj at hFc hsplit ⊢ omega -- ===== S4.lean ===== /-! ## Strip cores, part 4: representations over all offsets `B` (`wm_rep B`, base-6 code order), the degree-3 strip elements `Q_S` (A10 T3, A29 S0) and the incidence slots of `Ẑ` (A29 S1 / A10 T4(d)). -/ lemma st_enum_strip {m ρ : ℕ} {B : Finset ℕ} (i : Fin B.card) : m ≤ wm_enum B i + ρ ↔ wm_enum B i ∈ wm_strip m ρ B := by unfold wm_strip rw [Finset.mem_filter] exact ⟨fun h => ⟨wm_enum_mem B i, h⟩, fun h => h.2⟩ lemma st_value_ge {k : ℕ} (e α : Fin k → ℕ) (j : Fin k) (hj : 0 < α j) : e j ≤ m3_value e α := by unfold m3_value have h := Finset.single_le_sum (f := fun i => α i * e i) (fun i _ => Nat.zero_le _) (Finset.mem_univ j) have : e j ≤ α j * e j := Nat.le_mul_of_pos_left _ hj omega /-- A pure-window vector over `B` has its value in `d • O`. -/ lemma st_value_pure {m ρ : ℕ} {B : Finset ℕ} : ∀ d (α : Fin B.card → ℕ), m3_degree α = d → (∀ j, 0 < α j → wm_enum B j + ρ < m) → m3_value (wm_enum B) α ∈ d • wm_win m ρ B := by intro d induction d with | zero => intro α hd _ have hz : ∀ i, α i = 0 := fun i => by have := m3_coord_le_degree α i omega simp [m3_value, hz] | succ d ih => intro α hd hp obtain ⟨i, hi⟩ := m3_degree_pos_coord α (by omega) have hpd : m3_degree (m3_parent α i) = d := by have := m3_degree_parent α i hi omega have hpp : ∀ j, 0 < m3_parent α i j → wm_enum B j + ρ < m := by intro j hj apply hp j have h := congrFun (m3_unitAdd_parent α i hi) j simp only [m3_unitAdd] at h omega have he := m3_value_parent (wm_enum B) α i hi rw [succ_nsmul] exact Finset.mem_add.2 ⟨_, ih _ hpd hpp, _, (wm_mem_win m ρ B _).2 ⟨wm_enum_mem B i, hp i hi⟩, he⟩ /-- Base-6 code order: a value with a pure-window pair representation has a pure-window canonical pair. -/ lemma st_wz_pure {m ρ : ℕ} {B : Finset ℕ} {z : ℕ} (hz : z + m - ρ ∈ 2 • wm_win m ρ B) (j : Fin B.card) (hj : m ≤ wm_enum B j + ρ) : wm_wz m ρ B z j = 0 := by rw [two_nsmul] at hz obtain ⟨a, ha, b, hb, hab⟩ := Finset.mem_add.1 hz obtain ⟨haB, haρ⟩ := (wm_mem_win m ρ B a).1 ha obtain ⟨hbB, hbρ⟩ := (wm_mem_win m ρ B b).1 hb obtain ⟨ia, hia⟩ := wm_enum_surj B haB obtain ⟨ib, hib⟩ := wm_enum_surj B hbB have hγd : m3_degree (m3_pairVector ia ib) = 2 := by have := an_lin2 ia ib (fun _ => 1) simp only [Nat.mul_one] at this unfold m3_degree rw [this] have hγv : m3_value (wm_enum B) (m3_pairVector ia ib) = z + m - ρ := by rw [an_value_pv, hia, hib, hab] have hspec := ns_rep_spec 6 (wm_enum B) 2 (z + m - ρ) ⟨_, hγd, hγv⟩ have hmin := hspec.2.2 _ hγd hγv have hcγ : ns_code 6 (m3_pairVector ia ib) = 6 ^ ia.val + 6 ^ ib.val := by have := an_lin2 ia ib (fun i => 6 ^ i.val) unfold ns_code rw [this] have hlt : ∀ i : Fin B.card, wm_enum B i + ρ < m → i < j := by intro i hi exact (wm_enum_strictMono B).lt_iff_lt.1 (by omega) have hia' := hlt ia (by rw [hia]; exact haρ) have hib' := hlt ib (by rw [hib]; exact hbρ) have p1 : 6 ^ (ia.val + 1) ≤ 6 ^ j.val := Nat.pow_le_pow_right (by norm_num) (by omega) have p2 : 6 ^ (ib.val + 1) ≤ 6 ^ j.val := Nat.pow_le_pow_right (by norm_num) (by omega) rw [pow_succ] at p1 p2 by_contra hne have hpos : 0 < wm_wz m ρ B z j := Nat.pos_of_ne_zero hne have hc : 6 ^ j.val ≤ ns_code 6 (wm_wz m ρ B z) := by unfold ns_code have h := Finset.single_le_sum (f := fun i => wm_wz m ρ B z i * 6 ^ i.val) (fun i _ => Nat.zero_le _) (Finset.mem_univ j) have : 6 ^ j.val ≤ wm_wz m ρ B z j * 6 ^ j.val := Nat.le_mul_of_pos_left _ hpos omega have h6 : 0 < 6 ^ j.val := by positivity unfold wm_wz wm_rep at hc omega /-- `Ẑ` positions are sums of exactly two offsets. -/ lemma st_two_of_Zh {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {z : ℕ} (hz : z ∈ st_Zh m ρ B) : z + m - ρ ∈ 2 • B := by obtain ⟨hz2, _, hz1⟩ := st_mem_Zh.1 hz obtain ⟨hzm, hs⟩ := (wm_mem_Z hρ).1 hz2 obtain ⟨j, hj, hsj⟩ := (wm_mem_nsmul_insert B 2 _).1 hs rcases (show j = 0 ∨ j = 1 ∨ j = 2 by omega) with rfl | rfl | rfl · have : z + m - ρ = 0 := by simpa using hsj omega · exact absurd ((wm_mem_Z hρ).2 ⟨hzm, (wm_mem_nsmul_insert B 1 _).2 ⟨1, le_rfl, hsj⟩⟩) hz1 · exact hsj lemma st_wz_spec {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {z : ℕ} (hz : z ∈ st_Zh m ρ B) : m3_degree (wm_wz m ρ B z) = 2 ∧ m3_value (wm_enum B) (wm_wz m ρ B z) = z + m - ρ := wm_rep_spec B (st_two_of_Zh hρ hB hz) lemma st_QS_Q3 {m ρ : ℕ} {B : Finset ℕ} {q : ℕ} (hq : q ∈ st_QS m ρ B) : q ∈ st_Q3 m ρ B := (Finset.mem_sdiff.1 hq).1 lemma st_QS_wmQ {m ρ : ℕ} {B : Finset ℕ} {q : ℕ} (hq : q ∈ st_QS m ρ B) : q ∈ wm_Q m ρ B := (Finset.mem_sdiff.1 (st_QS_Q3 hq)).1 lemma st_QS_notZ3 {m ρ : ℕ} {B : Finset ℕ} {q : ℕ} (hq : q ∈ st_QS m ρ B) : q ∉ wm_Z m ρ (wm_win m ρ B) 3 := (Finset.mem_sdiff.1 hq).2 /-- `β_q` (over `B`) of `q ∈ Q_S` has a strip coordinate. -/ lemma st_QS_strip {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) {q : ℕ} (hq : q ∈ st_QS m ρ B) : ∃ k, 0 < wm_beta m ρ B q k ∧ m ≤ wm_enum B k + ρ := by by_contra hn push_neg at hn have hQ := st_QS_wmQ hq have hspec := wm_beta_spec hρ hQ have hv := st_value_pure 3 _ hspec.1 (fun j hj => hn j hj) rw [hspec.2] at hv exact st_QS_notZ3 hq ((wm_mem_Z hρ).2 ⟨wm_Q_lt hρ hQ, wm_nsmul_of_pure hv⟩) /-- A10 T3 for `q ∈ Q_S`: a factor `a_i > q` is a strip whose cofactor is an unwrapped window pair (the h0-BBC case). -/ lemma st_QS_nonW {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {q : ℕ} (hq : q ∈ st_QS m ρ B) {i : Fin B.card} (hi : 0 < wm_beta m ρ B q i) (hqi : q < wm_enum B i) : m ≤ wm_enum B i + ρ ∧ (∀ j, 0 < m3_parent (wm_beta m ρ B q) i j → wm_enum B j + ρ < m) ∧ q + m - wm_enum B i ∈ wm_Y m ρ (wm_win m ρ B) 2 \ wm_Y m ρ (wm_win m ρ B) 1 := by have hQ := st_QS_wmQ hq have hspec := wm_beta_spec hρ hQ have hqm := wm_Q_lt hρ hQ have hval := m3_value_parent (wm_enum B) (wm_beta m ρ B q) i hi rw [hspec.2] at hval have hpd : m3_degree (m3_parent (wm_beta m ρ B q) i) = 2 := by have := m3_degree_parent (wm_beta m ρ B q) i hi omega have hpure : ∀ j, 0 < m3_parent (wm_beta m ρ B q) i j → wm_enum B j + ρ < m := by intro j hj have := st_value_ge (wm_enum B) _ j hj omega have hstrip : m ≤ wm_enum B i + ρ := by by_contra hn apply st_QS_notZ3 hq have hall : ∀ j, 0 < wm_beta m ρ B q j → wm_enum B j + ρ < m := by intro j hj by_cases hji : j = i · subst hji omega · apply hpure j have h := congrFun (m3_unitAdd_parent (wm_beta m ρ B q) i hi) j simp only [m3_unitAdd, if_neg hji] at h omega have hv := st_value_pure 3 _ hspec.1 hall rw [hspec.2] at hv exact (wm_mem_Z hρ).2 ⟨hqm, wm_nsmul_of_pure hv⟩ have hv2 := st_value_pure 2 _ hpd hpure refine ⟨hstrip, hpure, Finset.mem_sdiff.2 ⟨wm_mem_Y.2 ⟨by omega, by omega, ?_⟩, fun h1 => ?_⟩⟩ · rw [show q + m - wm_enum B i - ρ = m3_value (wm_enum B) (m3_parent (wm_beta m ρ B q) i) by omega] exact wm_nsmul_of_pure hv2 · obtain ⟨_, _, h3⟩ := wm_mem_Y.1 h1 apply (st_mem_Q.1 (st_Q3_sub_Q (st_QS_Q3 hq))).2.2 refine (wm_mem_Z hρ).2 ⟨hqm, ?_⟩ rw [show q + m - ρ = (q + m - wm_enum B i - ρ) + wm_enum B i by omega, two_nsmul] refine Finset.add_mem_add ?_ (Finset.mem_insert_of_mem (wm_enum_mem B i)) rw [one_nsmul] at h3 rcases Finset.mem_insert.1 h3 with h | h · rw [h] exact Finset.mem_insert_self _ _ · exact Finset.mem_insert_of_mem (st_win_sub m ρ B h) /-- Non-wrapped weight `Σ_{a_j > q} β_j ≤ 1`. -/ lemma st_QS_nw {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {q : ℕ} (hq : q ∈ st_QS m ρ B) : (∑ j, wm_beta m ρ B q j * (if q < wm_enum B j then 1 else 0)) ≤ 1 := by by_contra hn push_neg at hn obtain ⟨i, hi⟩ : ∃ i, 0 < wm_beta m ρ B q i * (if q < wm_enum B i then 1 else 0) := by by_contra hz push_neg at hz have : (∑ j, wm_beta m ρ B q j * (if q < wm_enum B j then 1 else 0)) = 0 := Finset.sum_eq_zero (fun j _ => by have := hz j; omega) omega have hbi : 0 < wm_beta m ρ B q i := by rcases Nat.eq_zero_or_pos (wm_beta m ρ B q i) with h | h · rw [h] at hi simp at hi · exact h have hqi : q < wm_enum B i := by by_contra h rw [if_neg h] at hi simp at hi obtain ⟨_, hpure, _⟩ := st_QS_nonW hρ hB hq hbi hqi have hsplit := m3_linear_unitAdd (fun j => if q < wm_enum B j then 1 else 0) (m3_parent (wm_beta m ρ B q) i) i rw [m3_unitAdd_parent _ i hbi, if_pos hqi] at hsplit obtain ⟨j, hj⟩ : ∃ j, 0 < m3_parent (wm_beta m ρ B q) i j * (if q < wm_enum B j then 1 else 0) := by by_contra hz push_neg at hz have : (∑ j, m3_parent (wm_beta m ρ B q) i j * (if q < wm_enum B j then 1 else 0)) = 0 := Finset.sum_eq_zero (fun j _ => by have := hz j; omega) omega have hpj : 0 < m3_parent (wm_beta m ρ B q) i j := by rcases Nat.eq_zero_or_pos (m3_parent (wm_beta m ρ B q) i j) with h | h · rw [h] at hj simp at hj · exact h have hqj : q < wm_enum B j := by by_contra h rw [if_neg h] at hj simp at hj have hbj : 0 < wm_beta m ρ B q j := by have h := congrFun (m3_unitAdd_parent (wm_beta m ρ B q) i hbi) j simp only [m3_unitAdd] at h omega have h1 := (st_QS_nonW hρ hB hq hbj hqj).1 have h2 := hpure j hpj omega /-- h0 elements of `Q_S` (a strip factor `> q`) and the top elements (all factors `≤ q`). -/ noncomputable def st_Qh0 (m ρ : ℕ) (B : Finset ℕ) : Finset ℕ := by classical exact (st_QS m ρ B).filter (fun q => ∃ i, q < wm_enum B i ∧ 0 < wm_beta m ρ B q i) noncomputable def st_Qtop (m ρ : ℕ) (B : Finset ℕ) : Finset ℕ := st_QS m ρ B \ st_Qh0 m ρ B lemma st_w_QS {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {q : ℕ} (hq : q ∈ st_QS m ρ B) : 3 ≤ wm_w m ρ B q + (if q ∈ st_Qh0 m ρ B then 1 else 0) := by classical have hQ := st_QS_wmQ hq have hd := (wm_beta_spec hρ hQ).1 have hnw := st_QS_nw hρ hB hq have hsum : wm_w m ρ B q + (∑ j, wm_beta m ρ B q j * (if q < wm_enum B j then 1 else 0)) = 3 := by unfold wm_w rw [← Finset.sum_add_distrib, ← hd] unfold m3_degree apply Finset.sum_congr rfl intro j _ by_cases h : wm_enum B j ≤ q · rw [if_pos h, if_neg (by omega)] simp · rw [if_neg h, if_pos (by omega)] simp by_cases hh : q ∈ st_Qh0 m ρ B · rw [if_pos hh] omega · rw [if_neg hh] have hz : (∑ j, wm_beta m ρ B q j * (if q < wm_enum B j then 1 else 0)) = 0 := by apply Finset.sum_eq_zero intro j _ by_cases h : q < wm_enum B j · rw [if_pos h] have : wm_beta m ρ B q j = 0 := by by_contra hne apply hh unfold st_Qh0 exact Finset.mem_filter.2 ⟨hq, j, h, Nat.pos_of_ne_zero hne⟩ simp [this] · rw [if_neg h] simp omega lemma st_Qtop_top {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) {q : ℕ} (hq : q ∈ st_Qtop m ρ B) : m ≤ q + ρ := by classical unfold st_Qtop at hq obtain ⟨hqS, hnh⟩ := Finset.mem_sdiff.1 hq obtain ⟨k, hk, hks⟩ := st_QS_strip hρ hqS by_contra hn apply hnh unfold st_Qh0 exact Finset.mem_filter.2 ⟨hqS, k, by omega, hk⟩ /-- Every h0 element is `ψ(u, g) = u + g − m` for an unwrapped window pair `u` and a strip `g`. -/ lemma st_Qh0_sub {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) : st_Qh0 m ρ B ⊆ ((wm_Y m ρ (wm_win m ρ B) 2 \ wm_Y m ρ (wm_win m ρ B) 1) ×ˢ wm_strip m ρ B).image (fun p => p.1 + p.2 - m) := by classical intro q hq unfold st_Qh0 at hq obtain ⟨hqS, i, hqi, hbi⟩ := Finset.mem_filter.1 hq obtain ⟨hs, _, hY⟩ := st_QS_nonW hρ hB hqS hbi hqi refine Finset.mem_image.2 ⟨(q + m - wm_enum B i, wm_enum B i), Finset.mem_product.2 ⟨hY, (st_enum_strip i).1 hs⟩, ?_⟩ have := (hB _ (wm_enum_mem B i)).2 simp only omega /-- `4|Q_S| ≤ Σ_{q ∈ Q_S} w(q) + |Q_top| + 2|Q_h0|`. -/ lemma st_QS_four {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) : 4 * (st_QS m ρ B).card ≤ (∑ q ∈ st_QS m ρ B, wm_w m ρ B q) + (st_Qtop m ρ B).card + 2 * (st_Qh0 m ρ B).card := by classical have hsub : st_Qh0 m ρ B ⊆ st_QS m ρ B := Finset.filter_subset _ _ have hc := Finset.card_sdiff_add_card_eq_card hsub have hh0 : (st_Qh0 m ρ B).card = ∑ q ∈ st_QS m ρ B, (if q ∈ st_Qh0 m ρ B then 1 else 0) := by rw [Finset.sum_boole, Finset.filter_mem_eq_inter, Finset.inter_eq_right.2 hsub, Nat.cast_id] have h3 : ∑ q ∈ st_QS m ρ B, 3 ≤ ∑ q ∈ st_QS m ρ B, (wm_w m ρ B q + (if q ∈ st_Qh0 m ρ B then 1 else 0)) := Finset.sum_le_sum (fun q hq => st_w_QS hρ hB hq) rw [Finset.sum_add_distrib, ← hh0, Finset.sum_const, smul_eq_mul] at h3 unfold st_Qtop omega /-! ### Incidence slots at `Ẑ` vertices (A10 T4(d)): demand of `Q_S` and the A4 strip-direction units -/ /-- Strip indices. -/ noncomputable def st_Sidx (m ρ : ℕ) (B : Finset ℕ) : Finset (Fin B.card) := by classical exact (Finset.univ : Finset (Fin B.card)).filter (fun i => m ≤ wm_enum B i + ρ) lemma st_card_Sidx {m ρ : ℕ} {B : Finset ℕ} : (st_Sidx m ρ B).card = (wm_strip m ρ B).card := by classical have he : (st_Sidx m ρ B).image (wm_enum B) = wm_strip m ρ B := by ext g unfold st_Sidx simp only [Finset.mem_image, Finset.mem_filter, Finset.mem_univ, true_and] constructor · rintro ⟨i, hi, rfl⟩ exact (st_enum_strip i).1 hi · intro hg obtain ⟨i, rfl⟩ := wm_enum_surj B (st_strip_sub m ρ B hg) exact ⟨i, (st_enum_strip i).2 hg, rfl⟩ rw [← he, Finset.card_image_of_injective _ (wm_enum_inj B)] /-- Demand: weighted wrapped incidences `(q, i, c)`, `c < β_{q,i}`, of `q ∈ Q_S`. -/ noncomputable def st_Dem (m ρ : ℕ) (B : Finset ℕ) : Finset (ℕ × Fin B.card × ℕ) := by classical exact (st_QS m ρ B ×ˢ ((Finset.univ : Finset (Fin B.card)) ×ˢ Finset.range 3)).filter (fun p => wm_enum B p.2.1 ≤ p.1 ∧ p.2.2 < wm_beta m ρ B p.1 p.2.1) /-- Slots: `(z, i, c)`, `c ≤ κ(z)_i`, at strip vertices; `(z, k, 0)`, `k` a strip, at W-vertices. -/ noncomputable def st_Slot (m ρ : ℕ) (B : Finset ℕ) : Finset (ℕ × Fin B.card × ℕ) := by classical exact (st_ZS m ρ B ×ˢ ((Finset.univ : Finset (Fin B.card)) ×ˢ Finset.range 3)).filter (fun p => p.2.2 ≤ wm_wz m ρ B p.1 p.2.1) ∪ st_ZW m ρ B ×ˢ (st_Sidx m ρ B ×ˢ {0}) lemma st_card_range_lt {b : ℕ} (hb : b ≤ 3) : ((Finset.range 3).filter (fun c => c < b)).card = b := by have : (Finset.range 3).filter (fun c => c < b) = Finset.range b := by ext c simp only [Finset.mem_filter, Finset.mem_range] omega rw [this, Finset.card_range] lemma st_card_range_le {b : ℕ} (hb : b ≤ 2) : ((Finset.range 3).filter (fun c => c ≤ b)).card = b + 1 := by have : (Finset.range 3).filter (fun c => c ≤ b) = Finset.range (b + 1) := by ext c simp only [Finset.mem_filter, Finset.mem_range] omega rw [this, Finset.card_range] lemma st_card_Dem {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) : (st_Dem m ρ B).card = ∑ q ∈ st_QS m ρ B, wm_w m ρ B q := by classical unfold st_Dem rw [Finset.card_filter, Finset.sum_product] apply Finset.sum_congr rfl intro q hq rw [Finset.sum_product] unfold wm_w apply Finset.sum_congr rfl intro i _ have hle : wm_beta m ρ B q i ≤ 3 := by have := m3_coord_le_degree (wm_beta m ρ B q) i rw [(wm_beta_spec hρ (st_QS_wmQ hq)).1] at this exact this by_cases h : wm_enum B i ≤ q · rw [if_pos h, ← st_card_range_lt hle, Finset.card_filter] apply Finset.sum_congr rfl intro c _ simp only [h, true_and] · rw [if_neg h] apply Finset.sum_eq_zero intro c _ simp [h] lemma st_card_Slot {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) : (st_Slot m ρ B).card = (B.card + 2) * (st_ZS m ρ B).card + (wm_strip m ρ B).card * (st_ZW m ρ B).card := by classical unfold st_Slot have hd : Disjoint ((st_ZS m ρ B ×ˢ (Finset.univ ×ˢ Finset.range 3)).filter (fun p => p.2.2 ≤ wm_wz m ρ B p.1 p.2.1)) (st_ZW m ρ B ×ˢ (st_Sidx m ρ B ×ˢ {0})) := by rw [Finset.disjoint_left] intro p h1 h2 have hz1 := (Finset.mem_product.1 (Finset.mem_filter.1 h1).1).1 have hz2 := (Finset.mem_product.1 h2).1 unfold st_ZS at hz1 exact (Finset.mem_sdiff.1 hz1).2 hz2 rw [Finset.card_union_of_disjoint hd, Finset.card_product, Finset.card_product, st_card_Sidx, Finset.card_singleton, Nat.mul_one, Nat.mul_comm (st_ZW m ρ B).card] congr 1 rw [Finset.card_filter, Finset.sum_product] have h : ∀ z ∈ st_ZS m ρ B, (∑ y ∈ Finset.univ ×ˢ Finset.range 3, if (z, y).2.2 ≤ wm_wz m ρ B (z, y).1 (z, y).2.1 then 1 else 0) = B.card + 2 := by intro z hz have hzh : z ∈ st_Zh m ρ B := (Finset.mem_sdiff.1 hz).1 have hdeg := (st_wz_spec hρ hB hzh).1 rw [Finset.sum_product] have h2 : ∀ i ∈ (Finset.univ : Finset (Fin B.card)), (∑ c ∈ Finset.range 3, if ((z, (i, c)) : ℕ × Fin B.card × ℕ).2.2 ≤ wm_wz m ρ B (z, (i, c)).1 (z, (i, c)).2.1 then 1 else 0) = wm_wz m ρ B z i + 1 := by intro i _ have hle : wm_wz m ρ B z i ≤ 2 := by have := m3_coord_le_degree (wm_wz m ρ B z) i omega rw [← st_card_range_le hle, Finset.card_filter] rw [Finset.sum_congr rfl h2, Finset.sum_add_distrib] unfold m3_degree at hdeg rw [hdeg] simp omega rw [Finset.sum_congr rfl h, Finset.sum_const, smul_eq_mul, Nat.mul_comm] /-- `Ẑ ∖ Ẑ_W` and `Ẑ_W` partition `Ẑ`. -/ lemma st_Zh_cases {m ρ : ℕ} {B : Finset ℕ} {z : ℕ} (hz : z ∈ st_Zh m ρ B) : z ∈ st_ZS m ρ B ∨ z ∈ st_ZW m ρ B := by by_cases h : z ∈ st_ZW m ρ B · exact Or.inr h · left unfold st_ZS exact Finset.mem_sdiff.2 ⟨hz, h⟩ /-- The demand of `Q_S` and the A4 units at `Ẑ` vertices fit into the slots. -/ theorem st_slot_bound {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) (X : Finset ℕ) : (st_Dem m ρ B).card + ((st_Zh m ρ B ×ˢ (st_Sidx m ρ B ×ˢ ({0} : Finset ℕ))).filter (fun p => m ≤ p.1 + wm_enum B p.2.1 ∧ p.1 + wm_enum B p.2.1 - m ∈ X)).card ≤ (st_Slot m ρ B).card := by classical have hO : ∀ b ∈ wm_win m ρ B, 0 < b ∧ b + ρ < m := by intro b hb obtain ⟨hbB, hbρ⟩ := (wm_mem_win m ρ B b).1 hb exact ⟨(hB b hbB).1, hbρ⟩ set φ : ℕ × Fin B.card × ℕ → ℕ × Fin B.card × ℕ := fun p => (p.1 - wm_enum B p.2.1, p.2.1, p.2.2) with hφ set A := (st_Zh m ρ B ×ˢ (st_Sidx m ρ B ×ˢ ({0} : Finset ℕ))).filter (fun p => m ≤ p.1 + wm_enum B p.2.1 ∧ p.1 + wm_enum B p.2.1 - m ∈ X) with hA -- the demand map lands in the slots have hmap : ∀ p ∈ st_Dem m ρ B, φ p ∈ st_Slot m ρ B ∧ φ p ∉ A := by intro p hp obtain ⟨q, i, c⟩ := p unfold st_Dem at hp obtain ⟨hmem, hle, hc⟩ := Finset.mem_filter.1 hp obtain ⟨hqS, hrest⟩ := Finset.mem_product.1 hmem obtain ⟨_, hcr⟩ := Finset.mem_product.1 hrest simp only at hle hc have hQ := st_QS_wmQ hqS have hqm := wm_Q_lt hρ hQ obtain ⟨hz, hb⟩ := wm_parent_wrapped hρ hQ (show 0 < wm_beta m ρ B q i by omega) hle have hz1 : q - wm_enum B i ∉ wm_Z m ρ B 1 := st_not_Z1_add hρ hB (st_Q3_sub_Q (st_QS_Q3 hqS)) hqm (wm_enum_mem B i) (by omega) have hzh : q - wm_enum B i ∈ st_Zh m ρ B := by unfold wm_Zhat at hz obtain ⟨h2, h3⟩ := Finset.mem_sdiff.1 hz rw [st_Y_eq] at h3 exact st_mem_Zh.2 ⟨h2, h3, hz1⟩ have hβi : wm_beta m ρ B q i = wm_wz m ρ B (q - wm_enum B i) i + 1 := by rw [hb] simp [m3_unitAdd] refine ⟨?_, ?_⟩ · unfold st_Slot rcases st_Zh_cases hzh with hS | hW · refine Finset.mem_union_left _ (Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨hS, Finset.mem_product.2 ⟨Finset.mem_univ _, hcr⟩⟩, ?_⟩) simp only [hφ] omega · -- a W-vertex: the direction is a strip and the weight is 1 have hz2 : q - wm_enum B i + m - ρ ∈ 2 • wm_win m ρ B := by unfold st_ZW wm_Zhat at hW exact wm_two_of_Z2 hρ hO (Finset.mem_sdiff.1 (Finset.mem_sdiff.1 hW).1).1 have hs : m ≤ wm_enum B i + ρ := by by_contra hn apply st_QS_notZ3 hqS have hall : ∀ j, 0 < wm_beta m ρ B q j → wm_enum B j + ρ < m := by intro j hj by_cases hji : j = i · subst hji omega · by_contra hjs have h0 := st_wz_pure hz2 j (by omega) rw [hb] at hj simp only [m3_unitAdd, if_neg hji] at hj omega have hv := st_value_pure 3 _ (wm_beta_spec hρ hQ).1 hall rw [(wm_beta_spec hρ hQ).2] at hv exact (wm_mem_Z hρ).2 ⟨hqm, wm_nsmul_of_pure hv⟩ have h0 := st_wz_pure hz2 i hs refine Finset.mem_union_right _ (Finset.mem_product.2 ⟨hW, Finset.mem_product.2 ⟨?_, ?_⟩⟩) · unfold st_Sidx exact Finset.mem_filter.2 ⟨Finset.mem_univ _, hs⟩ · simp only [hφ, Finset.mem_singleton] omega · intro hpA rw [hA] at hpA have h := (Finset.mem_filter.1 hpA).2.1 simp only [hφ] at h omega have hinj : Set.InjOn φ (st_Dem m ρ B : Set (ℕ × Fin B.card × ℕ)) := by intro p1 h1 p2 h2 he obtain ⟨q1, i1, c1⟩ := p1 obtain ⟨q2, i2, c2⟩ := p2 have h1' : (q1, i1, c1) ∈ st_Dem m ρ B := Finset.mem_coe.1 h1 have h2' : (q2, i2, c2) ∈ st_Dem m ρ B := Finset.mem_coe.1 h2 unfold st_Dem at h1' h2' have hl1 := (Finset.mem_filter.1 h1').2.1 have hl2 := (Finset.mem_filter.1 h2').2.1 simp only [hφ, Prod.mk.injEq] at he hl1 hl2 obtain ⟨hq, rfl, rfl⟩ := he have : q1 = q2 := by omega rw [this] have hAsub : A ⊆ st_Slot m ρ B := by intro p hp rw [hA] at hp obtain ⟨hmem, _⟩ := Finset.mem_filter.1 hp obtain ⟨hz, hk⟩ := Finset.mem_product.1 hmem obtain ⟨hks, hc0⟩ := Finset.mem_product.1 hk unfold st_Slot rcases st_Zh_cases hz with hS | hW · refine Finset.mem_union_left _ (Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨hS, Finset.mem_product.2 ⟨Finset.mem_univ _, Finset.mem_range.2 ?_⟩⟩, ?_⟩) · rw [Finset.mem_singleton.1 hc0] norm_num · rw [Finset.mem_singleton.1 hc0] exact Nat.zero_le _ · exact Finset.mem_union_right _ (Finset.mem_product.2 ⟨hW, hk⟩) have hdisj : Disjoint ((st_Dem m ρ B).image φ) A := by rw [Finset.disjoint_left] intro p hp hpA obtain ⟨p0, hp0, rfl⟩ := Finset.mem_image.1 hp exact (hmap p0 hp0).2 hpA have hsub : (st_Dem m ρ B).image φ ∪ A ⊆ st_Slot m ρ B := by intro p hp rcases Finset.mem_union.1 hp with h | h · obtain ⟨p0, hp0, rfl⟩ := Finset.mem_image.1 h exact (hmap p0 hp0).1 · exact hAsub h have := Finset.card_le_card hsub rw [Finset.card_union_of_disjoint hdisj, Finset.card_image_of_injOn hinj] at this exact this -- ===== S5.lean ===== /-! ## Strip cores, part 5: the strip lemma (A29 Lemmas A4, A5; A10 T4/T5). `S_I = (G' ∪ Ẑ_S ∪ Q_D ∪ Q_S) ∩ I` (R20 fix (1)); each `s ∈ S_I` has a strip `g` with `s + y + m − g ∈ Y₃ ∪ Z₂`. Good elements (`s + y ∉ Q_W`) are paid by `F_T' ∖ Q₂ʷ`, bad ones by `σ·h₃`, `σ·h₂` (shared with `Q_h0`) or by the A4 strip-direction slots at `Ẑ`. -/ lemma st_mem_strip {m ρ : ℕ} {B : Finset ℕ} {g : ℕ} : g ∈ wm_strip m ρ B ↔ g ∈ B ∧ m ≤ g + ρ := by classical unfold wm_strip exact Finset.mem_filter lemma st_two_cases {B : Finset ℕ} {x : ℕ} (hx : x ∈ 2 • B) : ∃ a ∈ B, ∃ b ∈ B, a + b = x := by rw [two_nsmul] at hx obtain ⟨a, ha, b, hb, h⟩ := Finset.mem_add.1 hx exact ⟨a, ha, b, hb, h⟩ lemma st_Y3_of_win {m ρ : ℕ} {B : Finset ℕ} {y : ℕ} (hy : y ∈ wm_win m ρ B) : y + ρ ∈ wm_Y m ρ (wm_win m ρ B) 3 := by have hym := ((wm_mem_win m ρ B y).1 hy).2 refine wm_mem_Y.2 ⟨by omega, by omega, ?_⟩ rw [show y + ρ - ρ = y by omega] exact (wm_mem_nsmul_insert _ 3 y).2 ⟨1, by norm_num, by rw [one_nsmul]; exact hy⟩ lemma st_ZW_of_win {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) {z a b : ℕ} (hzh : z ∈ st_Zh m ρ B) (ha : a ∈ wm_win m ρ B) (hb : b ∈ wm_win m ρ B) (hab : a + b = z + m - ρ) : z ∈ st_ZW m ρ B := by obtain ⟨hz2, hz3, hz1⟩ := st_mem_Zh.1 hzh have hzm := ((wm_mem_Z hρ).1 hz2).1 unfold st_ZW wm_Zhat refine Finset.mem_sdiff.2 ⟨Finset.mem_sdiff.2 ⟨(wm_mem_Z hρ).2 ⟨hzm, ?_⟩, hz3⟩, hz1⟩ rw [← hab] exact st_two_mem (Finset.mem_insert_of_mem ha) (Finset.mem_insert_of_mem hb) lemma st_Q_notZ2 {m ρ : ℕ} {B : Finset ℕ} {q : ℕ} (hq : q ∈ st_Q m ρ B) : q ∉ wm_Z m ρ B 2 := (st_mem_Q.1 hq).2.2 lemma st_ZS_Z2 {m ρ : ℕ} {B : Finset ℕ} {z : ℕ} (hz : z ∈ st_ZS m ρ B) : z ∈ wm_Z m ρ B 2 := (st_mem_Zh.1 (Finset.mem_sdiff.1 hz).1).1 lemma st_QS_Q {m ρ : ℕ} {B : Finset ℕ} {q : ℕ} (hq : q ∈ st_QS m ρ B) : q ∈ st_Q m ρ B := st_Q3_sub_Q (st_QS_Q3 hq) /-! ### `S_I` -/ noncomputable def st_SI (m ρ : ℕ) (B : Finset ℕ) (y : ℕ) : Finset ℕ := (wm_Z m ρ B 1 ∩ an_I m ρ y) ∪ (st_ZS m ρ B ∩ an_I m ρ y) ∪ (st_QD m ρ B ∩ an_I m ρ y) ∪ (st_QS m ρ B ∩ an_I m ρ y) lemma st_mem_SI {m ρ : ℕ} {B : Finset ℕ} {y s : ℕ} : s ∈ st_SI m ρ B y ↔ (s ∈ wm_Z m ρ B 1 ∨ s ∈ st_ZS m ρ B ∨ s ∈ st_QD m ρ B ∨ s ∈ st_QS m ρ B) ∧ s ∈ an_I m ρ y := by unfold st_SI simp only [Finset.mem_union, Finset.mem_inter] tauto lemma st_card_SI {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (y : ℕ) : (st_SI m ρ B y).card = (wm_Z m ρ B 1 ∩ an_I m ρ y).card + (st_ZS m ρ B ∩ an_I m ρ y).card + (st_QD m ρ B ∩ an_I m ρ y).card + (st_QS m ρ B ∩ an_I m ρ y).card := by have hZ1 : ∀ x ∈ wm_Z m ρ B 1, x ∈ wm_Z m ρ B 2 := fun x hx => wm_Z_mono hρ (by norm_num) hx have d1 : Disjoint (wm_Z m ρ B 1 ∩ an_I m ρ y) (st_ZS m ρ B ∩ an_I m ρ y) := by rw [Finset.disjoint_left] intro x h1 h2 exact (st_mem_Zh.1 (Finset.mem_sdiff.1 (Finset.mem_inter.1 h2).1).1).2.2 (Finset.mem_inter.1 h1).1 have d2 : Disjoint ((wm_Z m ρ B 1 ∩ an_I m ρ y) ∪ (st_ZS m ρ B ∩ an_I m ρ y)) (st_QD m ρ B ∩ an_I m ρ y) := by rw [Finset.disjoint_left] intro x h1 h2 have hQ := (Finset.mem_inter.1 (Finset.mem_inter.1 h2).1).1 rcases Finset.mem_union.1 h1 with h | h · exact st_Q_notZ2 hQ (hZ1 x (Finset.mem_inter.1 h).1) · exact st_Q_notZ2 hQ (st_ZS_Z2 (Finset.mem_inter.1 h).1) have d3 : Disjoint ((wm_Z m ρ B 1 ∩ an_I m ρ y) ∪ (st_ZS m ρ B ∩ an_I m ρ y) ∪ (st_QD m ρ B ∩ an_I m ρ y)) (st_QS m ρ B ∩ an_I m ρ y) := by rw [Finset.disjoint_left] intro x h1 h2 have hS := (Finset.mem_inter.1 h2).1 rcases Finset.mem_union.1 h1 with h | h · rcases Finset.mem_union.1 h with h | h · exact st_Q_notZ2 (st_QS_Q hS) (hZ1 x (Finset.mem_inter.1 h).1) · exact st_Q_notZ2 (st_QS_Q hS) (st_ZS_Z2 (Finset.mem_inter.1 h).1) · exact (st_mem_Q3.1 (st_QS_Q3 hS)).2 (Finset.mem_inter.1 (Finset.mem_inter.1 h).1).2 unfold st_SI rw [Finset.card_union_of_disjoint d3, Finset.card_union_of_disjoint d2, Finset.card_union_of_disjoint d1] lemma st_SI_notY3 {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {y s : ℕ} (hs : s ∈ st_SI m ρ B y) : s ∉ wm_Y m ρ (wm_win m ρ B) 3 := by intro hY rcases (st_mem_SI.1 hs).1 with h | h | h | h · exact st_Z1_not_Y hρ hB h hY · exact (st_mem_Zh.1 (Finset.mem_sdiff.1 h).1).2.1 hY · exact (st_mem_Q.1 (Finset.mem_inter.1 h).1).2.1 (wm_Y_mono (by norm_num) hY) · exact (st_mem_Q.1 (st_QS_Q h)).2.1 (wm_Y_mono (by norm_num) hY) /-- A4 existence: every `s ∈ S_I` has a strip `g` with `s + y + m − g ∈ Y₃ ∪ Z₂`. -/ lemma st_SI_exists {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {y : ℕ} (hyO : y ∈ wm_win m ρ B) {s : ℕ} (hs : s ∈ st_SI m ρ B y) : ∃ g ∈ wm_strip m ρ B, s + y + m - g ∈ wm_Y m ρ (wm_win m ρ B) 3 ∨ s + y + m - g ∈ wm_Z m ρ B 2 := by obtain ⟨hcase, hI⟩ := st_mem_SI.1 hs have hI' := an_mem_I.1 hI have hym := ((wm_mem_win m ρ B y).1 hyO).2 have hyB := st_win_sub m ρ B hyO rcases hcase with h1 | hZ | hD | hS · obtain ⟨hsρ, hg⟩ := (st_mem_Z1 hρ hB).1 h1 refine ⟨s + m - ρ, hg, Or.inl ?_⟩ rw [show s + y + m - (s + m - ρ) = y + ρ by omega] exact st_Y3_of_win hyO · have hzh := (Finset.mem_sdiff.1 hZ).1 obtain ⟨a, ha, b, hb, hab⟩ := st_two_cases (st_two_of_Zh hρ hB hzh) have ha' := hB a ha have hb' := hB b hb have key : ∀ g ∈ B, ∀ c ∈ B, g + c = s + m - ρ → m ≤ g + ρ → s + y + m - g ∈ wm_Y m ρ (wm_win m ρ B) 3 := by intro g hg c hc hgc hgs have hcw : c ∈ wm_win m ρ B := (wm_mem_win m ρ B c).2 ⟨hc, by omega⟩ refine wm_mem_Y.2 ⟨by omega, by omega, ?_⟩ rw [show s + y + m - g - ρ = c + y by omega] exact wm_nsmul_mono (by norm_num : 2 ≤ 3) (st_two_mem (Finset.mem_insert_of_mem hcw) (Finset.mem_insert_of_mem hyO)) by_cases has : m ≤ a + ρ · exact ⟨a, st_mem_strip.2 ⟨ha, has⟩, Or.inl (key a ha b hb hab has)⟩ by_cases hbs : m ≤ b + ρ · exact ⟨b, st_mem_strip.2 ⟨hb, hbs⟩, Or.inl (key b hb a ha (by omega) hbs)⟩ exact absurd (st_ZW_of_win hρ hzh ((wm_mem_win m ρ B a).2 ⟨ha, by omega⟩) ((wm_mem_win m ρ B b).2 ⟨hb, by omega⟩) hab) (Finset.mem_sdiff.1 hZ).2 · obtain ⟨hsm, hv⟩ := st_mem_V.1 (Finset.mem_inter.1 hD).2 obtain ⟨a, ha, b, hb, hab⟩ := st_two_cases hv have hlt := st_H_lt (by omega) hB have ha' := hlt a ha have hb' := hlt b hb have ha0 : a ≠ 0 := by rintro rfl omega have haB : a ∈ B := (Finset.mem_insert.1 ha).resolve_left ha0 refine ⟨a, st_mem_strip.2 ⟨haB, by omega⟩, Or.inr ((wm_mem_Z hρ).2 ⟨by omega, ?_⟩)⟩ rw [show s + y + m - a + m - ρ = b + y by omega] exact st_two_mem hb (Finset.mem_insert_of_mem hyB) · obtain ⟨k, hk, hks⟩ := st_QS_strip hρ hS have hek := (hB _ (wm_enum_mem B k)).2 obtain ⟨_, _, hY⟩ := st_QS_nonW hρ hB hS hk (by omega) obtain ⟨hv1, hv2, hv3⟩ := wm_mem_Y.1 (Finset.mem_sdiff.1 hY).1 refine ⟨wm_enum B k, (st_enum_strip k).1 hks, Or.inl (wm_mem_Y.2 ⟨by omega, by omega, ?_⟩)⟩ rw [show s + y + m - wm_enum B k - ρ = (s + m - wm_enum B k - ρ) + y by omega, show (3 : ℕ) = 2 + 1 from rfl, succ_nsmul] exact Finset.add_mem_add hv3 (Finset.mem_insert_of_mem hyO) /-- A bad debit `x = u + g − m ∈ Q_W` forces `u ∉ Y₁` (else `x ∈ Z₂`) and `u ∉ G'` (else `x ∈ V₂`). -/ lemma st_bad_u {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {x g u : ℕ} (hx : x ∈ st_QW m ρ B) (hg : g ∈ wm_strip m ρ B) (hu : u + g = x + m) : u ∉ wm_Y m ρ (wm_win m ρ B) 1 ∧ u ∉ wm_Z m ρ B 1 := by have hxQ := st_QW_Q hx have hx3 := (Finset.mem_inter.1 hx).1 have hxm := st_QW_lt hρ hx obtain ⟨hgB, hgs⟩ := st_mem_strip.1 hg constructor · intro hY obtain ⟨h1, h2, h3⟩ := wm_mem_Y.1 hY apply (st_mem_Q.1 hxQ).2.2 refine (wm_mem_Z hρ).2 ⟨hxm, ?_⟩ rw [show x + m - ρ = (u - ρ) + g by omega] exact st_two_mem (wm_nsmul_mono (le_refl 1) h3 |> fun h => by rw [one_nsmul] at h exact Finset.insert_subset_insert 0 (st_win_sub m ρ B) h) (Finset.mem_insert_of_mem hgB) · intro hZ obtain ⟨h1, h2⟩ := (st_mem_Z1 hρ hB).1 hZ apply (st_mem_Q3.1 hx3).2 refine st_mem_V.2 ⟨hxm, ?_⟩ rw [show x + 2 * m - ρ = (u + m - ρ) + g by omega] exact st_two_mem (Finset.mem_insert_of_mem (st_strip_sub m ρ B h2)) (Finset.mem_insert_of_mem hgB) /-! ### Good / bad split and the A4 bounds -/ noncomputable def st_bad (m ρ : ℕ) (B : Finset ℕ) (y : ℕ) : Finset ℕ := (st_SI m ρ B y).filter (fun s => s + y ∈ st_QW m ρ B) noncomputable def st_good (m ρ : ℕ) (B : Finset ℕ) (y : ℕ) : Finset ℕ := st_SI m ρ B y \ st_bad m ρ B y noncomputable def st_bad2 (m ρ : ℕ) (B : Finset ℕ) (y : ℕ) : Finset ℕ := by classical exact (st_bad m ρ B y).filter (fun s => ∃ g ∈ wm_strip m ρ B, s + y + m - g ∈ wm_Y m ρ (wm_win m ρ B) 2 \ wm_Y m ρ (wm_win m ρ B) 1) noncomputable def st_A4 (m ρ : ℕ) (B : Finset ℕ) : Finset (ℕ × Fin B.card × ℕ) := (st_Zh m ρ B ×ˢ (st_Sidx m ρ B ×ˢ ({0} : Finset ℕ))).filter (fun p => m ≤ p.1 + wm_enum B p.2.1 ∧ p.1 + wm_enum B p.2.1 - m ∈ st_QW m ρ B) noncomputable def st_ZCC (m ρ : ℕ) (B : Finset ℕ) : Finset ℕ := by classical exact (st_ZS m ρ B).filter (fun z => ∃ a ∈ wm_strip m ρ B, ∃ b ∈ wm_strip m ρ B, a + b = z + m - ρ) noncomputable def st_ZBC (m ρ : ℕ) (B : Finset ℕ) : Finset ℕ := st_ZS m ρ B \ st_ZCC m ρ B noncomputable def st_PG (m ρ : ℕ) (B : Finset ℕ) : Finset (ℕ × ℕ) := (wm_strip m ρ B ×ˢ wm_strip m ρ B).filter (fun p => p.1 ≤ p.2) lemma st_card_good {m ρ : ℕ} {B : Finset ℕ} (y : ℕ) : (st_SI m ρ B y).card = (st_good m ρ B y).card + (st_bad m ρ B y).card := by unfold st_good have := Finset.card_sdiff_add_card_eq_card (Finset.filter_subset (fun s => s + y ∈ st_QW m ρ B) (st_SI m ρ B y)) unfold st_bad omega lemma st_card_ZCC {m ρ : ℕ} {B : Finset ℕ} : (st_ZS m ρ B).card = (st_ZCC m ρ B).card + (st_ZBC m ρ B).card := by classical have hsub : st_ZCC m ρ B ⊆ st_ZS m ρ B := by unfold st_ZCC exact Finset.filter_subset _ _ have := Finset.card_sdiff_add_card_eq_card hsub unfold st_ZBC omega /-- Good debits and the top positions (`Ẑ_CC`, `Q_top`) inject into `F_T' ∖ Q₂ʷ`. -/ lemma st_good_bound {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {y : ℕ} (hyO : y ∈ wm_win m ρ B) : (st_good m ρ B y).card + (st_ZCC m ρ B).card + (st_Qtop m ρ B).card ≤ (st_F m ρ B y \ st_Qj m ρ B 2).card := by classical have hym := ((wm_mem_win m ρ B y).1 hyO).2 have hF : ∀ x, y ≤ x → x < m → x ∉ st_QW m ρ B → x ∉ an_T m ρ (wm_win m ρ B) y → x ∈ st_F m ρ B y \ st_Qj m ρ B 2 := by intro x h1 h2 h3 h4 refine Finset.mem_sdiff.2 ⟨?_, fun h => h3 (st_mem_Qj.1 h).1⟩ unfold st_F refine Finset.mem_sdiff.2 ⟨Finset.mem_Ico.2 ⟨h1, h2⟩, ?_⟩ rw [Finset.mem_union] rintro (h | h) · exact h3 (st_mem_Qj.1 h).1 · exact h4 h have hTlt : ∀ x ∈ an_T m ρ (wm_win m ρ B) y, x + ρ < m := by intro x hx unfold an_T at hx obtain ⟨v, hv, rfl⟩ := Finset.mem_image.1 hx have := an_mem_I.1 (Finset.mem_inter.1 hv).2 omega have hgood : ∀ x ∈ (st_good m ρ B y).image (· + y), x + ρ < m ∧ x ∈ st_F m ρ B y \ st_Qj m ρ B 2 := by intro x hx obtain ⟨s, hs, rfl⟩ := Finset.mem_image.1 hx unfold st_good st_bad at hs obtain ⟨hsI, hnb⟩ := Finset.mem_sdiff.1 hs have hW : s + y ∉ st_QW m ρ B := fun h => hnb (Finset.mem_filter.2 ⟨hsI, h⟩) have hI := an_mem_I.1 (st_mem_SI.1 hsI).2 refine ⟨by omega, hF _ (by omega) (by omega) hW ?_⟩ intro hT unfold an_T at hT obtain ⟨v, hv, hve⟩ := Finset.mem_image.1 hT have : v = s := by omega rw [this] at hv exact st_SI_notY3 hρ hB hsI (Finset.mem_inter.1 hv).1 have hcc : ∀ z ∈ st_ZCC m ρ B, m ≤ z + ρ ∧ z ∈ wm_Z m ρ B 2 ∧ z ∈ st_F m ρ B y \ st_Qj m ρ B 2 := by intro z hz unfold st_ZCC at hz obtain ⟨hzS, a, ha, b, hb, hab⟩ := Finset.mem_filter.1 hz have ha' := (st_mem_strip.1 ha).2 have hb' := (st_mem_strip.1 hb).2 have hz2 := st_ZS_Z2 hzS have hzm := ((wm_mem_Z hρ).1 hz2).1 have hzr : m ≤ z + ρ := by omega refine ⟨hzr, hz2, hF z (by omega) hzm (fun h => st_Q_notZ2 (st_QW_Q h) hz2) ?_⟩ intro hT have := hTlt z hT omega have htop : ∀ q ∈ st_Qtop m ρ B, m ≤ q + ρ ∧ q ∉ wm_Z m ρ B 2 ∧ q ∈ st_F m ρ B y \ st_Qj m ρ B 2 := by intro q hq have hqr := st_Qtop_top hρ hq have hqS : q ∈ st_QS m ρ B := (Finset.mem_sdiff.1 hq).1 have hqm := wm_Q_lt hρ (st_QS_wmQ hqS) refine ⟨hqr, st_Q_notZ2 (st_QS_Q hqS), hF q (by omega) hqm ?_ ?_⟩ · intro h exact (Finset.mem_sdiff.1 hqS).2 (Finset.mem_inter.1 h).2 · intro hT have := hTlt q hT omega have hd1 : Disjoint ((st_good m ρ B y).image (· + y)) (st_ZCC m ρ B) := by rw [Finset.disjoint_left] intro x h1 h2 have := (hgood x h1).1 have := (hcc x h2).1 omega have hd2 : Disjoint ((st_good m ρ B y).image (· + y) ∪ st_ZCC m ρ B) (st_Qtop m ρ B) := by rw [Finset.disjoint_left] intro x h1 h2 rcases Finset.mem_union.1 h1 with h | h · have := (hgood x h).1 have := (htop x h2).1 omega · exact (htop x h2).2.1 (hcc x h).2.1 have hsub : (st_good m ρ B y).image (· + y) ∪ st_ZCC m ρ B ∪ st_Qtop m ρ B ⊆ st_F m ρ B y \ st_Qj m ρ B 2 := by intro x hx rcases Finset.mem_union.1 hx with h | h · rcases Finset.mem_union.1 h with h | h · exact (hgood x h).2 · exact (hcc x h).2.2 · exact (htop x h).2.2 have := Finset.card_le_card hsub rw [Finset.card_union_of_disjoint hd2, Finset.card_union_of_disjoint hd1, Finset.card_image_of_injective _ (add_left_injective y)] at this exact this /-- Bad debits: `|bad| ≤ |bad₂| + σ·|Y₃ ∖ Y₂| + |A4|`. -/ lemma st_bad_bound {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {y : ℕ} (hyO : y ∈ wm_win m ρ B) : (st_bad m ρ B y).card ≤ (st_bad2 m ρ B y).card + ((wm_Y m ρ (wm_win m ρ B) 3 \ wm_Y m ρ (wm_win m ρ B) 2) ×ˢ wm_strip m ρ B).card + (st_A4 m ρ B).card := by classical have hsub : st_bad m ρ B y ⊆ st_bad2 m ρ B y ∪ ((((wm_Y m ρ (wm_win m ρ B) 3 \ wm_Y m ρ (wm_win m ρ B) 2) ×ˢ wm_strip m ρ B).image (fun p => p.1 + p.2 - m - y)) ∪ (st_A4 m ρ B).image (fun p => p.1 + wm_enum B p.2.1 - m - y)) := by intro s hs have hs' := hs unfold st_bad at hs' obtain ⟨hsI, hx⟩ := Finset.mem_filter.1 hs' obtain ⟨g, hg, hu⟩ := st_SI_exists hρ hB hyO hsI obtain ⟨hgB, hgs⟩ := st_mem_strip.1 hg have hgm := (hB g hgB).2 obtain ⟨hn1, hnZ⟩ := st_bad_u hρ hB hx hg (show s + y + m - g + g = s + y + m by omega) rw [Finset.mem_union, Finset.mem_union] by_cases h3 : s + y + m - g ∈ wm_Y m ρ (wm_win m ρ B) 3 · by_cases h2 : s + y + m - g ∈ wm_Y m ρ (wm_win m ρ B) 2 · left unfold st_bad2 exact Finset.mem_filter.2 ⟨hs, g, hg, Finset.mem_sdiff.2 ⟨h2, hn1⟩⟩ · right left refine Finset.mem_image.2 ⟨(s + y + m - g, g), Finset.mem_product.2 ⟨Finset.mem_sdiff.2 ⟨h3, h2⟩, hg⟩, ?_⟩ show s + y + m - g + g - m - y = s omega · have hZ := hu.resolve_left h3 obtain ⟨k, hk⟩ := wm_enum_surj B hgB right right refine Finset.mem_image.2 ⟨(s + y + m - g, k, 0), ?_, ?_⟩ · unfold st_A4 refine Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨st_mem_Zh.2 ⟨hZ, h3, hnZ⟩, Finset.mem_product.2 ⟨?_, Finset.mem_singleton_self 0⟩⟩, ?_⟩ · unfold st_Sidx exact Finset.mem_filter.2 ⟨Finset.mem_univ _, by rw [hk]; exact hgs⟩ · show m ≤ s + y + m - g + wm_enum B k ∧ s + y + m - g + wm_enum B k - m ∈ st_QW m ρ B rw [hk, show s + y + m - g + g - m = s + y by omega] exact ⟨by omega, hx⟩ · show s + y + m - g + wm_enum B k - m - y = s rw [hk] omega refine le_trans (Finset.card_le_card hsub) ?_ refine le_trans (Finset.card_union_le _ _) ?_ have h0 := Finset.card_union_le (((wm_Y m ρ (wm_win m ρ B) 3 \ wm_Y m ρ (wm_win m ρ B) 2) ×ˢ wm_strip m ρ B).image (fun p => p.1 + p.2 - m - y)) ((st_A4 m ρ B).image (fun p => p.1 + wm_enum B p.2.1 - m - y)) have h1 := Finset.card_image_le (s := ((wm_Y m ρ (wm_win m ρ B) 3 \ wm_Y m ρ (wm_win m ρ B) 2) ×ˢ wm_strip m ρ B)) (f := fun p => p.1 + p.2 - m - y) have h2 := Finset.card_image_le (s := st_A4 m ρ B) (f := fun p => p.1 + wm_enum B p.2.1 - m - y) omega /-- `|bad₂| + |Q_h0| ≤ σ·|Y₂ ∖ Y₁|` (images under `ψ(u, g) = u + g − m` land in `Q_W`, resp. `Q_S`). -/ lemma st_bad2_bound {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {y : ℕ} : (st_bad2 m ρ B y).card + (st_Qh0 m ρ B).card ≤ ((wm_Y m ρ (wm_win m ρ B) 2 \ wm_Y m ρ (wm_win m ρ B) 1) ×ˢ wm_strip m ρ B).card := by classical have hsub : (st_bad2 m ρ B y).image (· + y) ∪ st_Qh0 m ρ B ⊆ ((wm_Y m ρ (wm_win m ρ B) 2 \ wm_Y m ρ (wm_win m ρ B) 1) ×ˢ wm_strip m ρ B).image (fun p => p.1 + p.2 - m) := by intro x hx rcases Finset.mem_union.1 hx with h | h · obtain ⟨s, hs, rfl⟩ := Finset.mem_image.1 h unfold st_bad2 at hs obtain ⟨_, g, hg, hu⟩ := Finset.mem_filter.1 hs have hgm := (hB g (st_mem_strip.1 hg).1).2 refine Finset.mem_image.2 ⟨(s + y + m - g, g), Finset.mem_product.2 ⟨hu, hg⟩, ?_⟩ show s + y + m - g + g - m = s + y omega · exact st_Qh0_sub hρ hB h have hd : Disjoint ((st_bad2 m ρ B y).image (· + y)) (st_Qh0 m ρ B) := by rw [Finset.disjoint_left] intro x hx hq obtain ⟨s, hs, rfl⟩ := Finset.mem_image.1 hx unfold st_bad2 st_bad at hs have hW := (Finset.mem_filter.1 (Finset.mem_filter.1 hs).1).2 unfold st_Qh0 at hq have hS := (Finset.mem_filter.1 hq).1 unfold st_QS at hS unfold st_QW at hW exact (Finset.mem_sdiff.1 hS).2 (Finset.mem_inter.1 hW).2 have h1 := Finset.card_le_card hsub rw [Finset.card_union_of_disjoint hd, Finset.card_image_of_injective _ (add_left_injective y)] at h1 exact le_trans h1 Finset.card_image_le lemma st_Qh0_card {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) : (st_Qh0 m ρ B).card ≤ ((wm_Y m ρ (wm_win m ρ B) 2 \ wm_Y m ρ (wm_win m ρ B) 1) ×ˢ wm_strip m ρ B).card := le_trans (Finset.card_le_card (st_Qh0_sub hρ hB)) Finset.card_image_le /-! ### A5: the strip vertices `Ẑ_S = Ẑ_BC ⊔ Ẑ_CC` and `Q_D` -/ lemma st_ZBC_bound {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) : (st_ZBC m ρ B).card ≤ (wm_win m ρ B ×ˢ wm_strip m ρ B).card := by classical have hsub : st_ZBC m ρ B ⊆ (wm_win m ρ B ×ˢ wm_strip m ρ B).image (fun p => p.1 + p.2 + ρ - m) := by intro z hz unfold st_ZBC at hz obtain ⟨hzS, hncc⟩ := Finset.mem_sdiff.1 hz have hzh := (Finset.mem_sdiff.1 hzS).1 obtain ⟨a, ha, b, hb, hab⟩ := st_two_cases (st_two_of_Zh hρ hB hzh) have ha' := hB a ha have hb' := hB b hb by_cases has : m ≤ a + ρ · by_cases hbs : m ≤ b + ρ · exfalso apply hncc unfold st_ZCC exact Finset.mem_filter.2 ⟨hzS, a, st_mem_strip.2 ⟨ha, has⟩, b, st_mem_strip.2 ⟨hb, hbs⟩, hab⟩ · refine Finset.mem_image.2 ⟨(b, a), Finset.mem_product.2 ⟨(wm_mem_win m ρ B b).2 ⟨hb, by omega⟩, st_mem_strip.2 ⟨ha, has⟩⟩, ?_⟩ show b + a + ρ - m = z omega · by_cases hbs : m ≤ b + ρ · refine Finset.mem_image.2 ⟨(a, b), Finset.mem_product.2 ⟨(wm_mem_win m ρ B a).2 ⟨ha, by omega⟩, st_mem_strip.2 ⟨hb, hbs⟩⟩, ?_⟩ show a + b + ρ - m = z omega · exact absurd (st_ZW_of_win hρ hzh ((wm_mem_win m ρ B a).2 ⟨ha, by omega⟩) ((wm_mem_win m ρ B b).2 ⟨hb, by omega⟩) hab) (Finset.mem_sdiff.1 hzS).2 exact le_trans (Finset.card_le_card hsub) Finset.card_image_le lemma st_ZCC_QD {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) : (st_ZCC m ρ B).card + (st_QD m ρ B).card ≤ (st_PG m ρ B).card := by classical have hpair : ∀ a ∈ wm_strip m ρ B, ∀ b ∈ wm_strip m ρ B, ∀ x, x < m → (a + b + ρ = x + m ∨ a + b + ρ = x + 2 * m) → x ∈ (st_PG m ρ B).image (fun p => (p.1 + p.2 + ρ) % m) := by intro a ha b hb x hx hs have hxm : (a + b + ρ) % m = x := by rcases hs with h | h · rw [h, Nat.add_mod_right, Nat.mod_eq_of_lt hx] · rw [h, Nat.add_mul_mod_self_right, Nat.mod_eq_of_lt hx] rcases le_total a b with hle | hle · refine Finset.mem_image.2 ⟨(a, b), ?_, hxm⟩ unfold st_PG exact Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨ha, hb⟩, hle⟩ · refine Finset.mem_image.2 ⟨(b, a), ?_, ?_⟩ · unfold st_PG exact Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨hb, ha⟩, hle⟩ · show (b + a + ρ) % m = x rw [Nat.add_comm b a] exact hxm have hsub : st_ZCC m ρ B ∪ st_QD m ρ B ⊆ (st_PG m ρ B).image (fun p => (p.1 + p.2 + ρ) % m) := by intro x hx rcases Finset.mem_union.1 hx with h | h · unfold st_ZCC at h obtain ⟨hzS, a, ha, b, hb, hab⟩ := Finset.mem_filter.1 h have hzm := ((wm_mem_Z hρ).1 (st_ZS_Z2 hzS)).1 exact hpair a ha b hb x hzm (Or.inl (by omega)) · obtain ⟨hsm, hv⟩ := st_mem_V.1 (Finset.mem_inter.1 h).2 obtain ⟨a, ha, b, hb, hab⟩ := st_two_cases hv have hlt := st_H_lt (by omega) hB have ha' := hlt a ha have hb' := hlt b hb have ha0 : a ≠ 0 := by rintro rfl omega have hb0 : b ≠ 0 := by rintro rfl omega have haB := (Finset.mem_insert.1 ha).resolve_left ha0 have hbB := (Finset.mem_insert.1 hb).resolve_left hb0 exact hpair a (st_mem_strip.2 ⟨haB, by omega⟩) b (st_mem_strip.2 ⟨hbB, by omega⟩) x hsm (Or.inr (by omega)) have hd : Disjoint (st_ZCC m ρ B) (st_QD m ρ B) := by rw [Finset.disjoint_left] intro x h1 h2 unfold st_ZCC at h1 exact st_Q_notZ2 (Finset.mem_inter.1 h2).1 (st_ZS_Z2 (Finset.mem_filter.1 h1).1) have := Finset.card_le_card hsub rw [Finset.card_union_of_disjoint hd] at this exact le_trans this Finset.card_image_le /-- **Strip lemma** (A29 A4 + A5 + S0/S1 in counting form). -/ theorem st_strip_lemma {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) {y : ℕ} (hyO : y ∈ wm_win m ρ B) : (wm_Z m ρ B 1 ∩ an_I m ρ y).card + (st_ZS m ρ B ∩ an_I m ρ y).card + (st_QD m ρ B ∩ an_I m ρ y).card + (st_QS m ρ B ∩ an_I m ρ y).card + 5 * (st_ZS m ρ B).card + 4 * (st_QD m ρ B).card + 4 * (st_QS m ρ B).card ≤ ((wm_Y m ρ (wm_win m ρ B) 3 \ wm_Y m ρ (wm_win m ρ B) 2) ×ˢ wm_strip m ρ B).card + 2 * ((wm_Y m ρ (wm_win m ρ B) 2 \ wm_Y m ρ (wm_win m ρ B) 1) ×ˢ wm_strip m ρ B).card + 5 * (wm_win m ρ B ×ˢ wm_strip m ρ B).card + 4 * (st_PG m ρ B).card + ((B.card + 2) * (st_ZS m ρ B).card + (wm_strip m ρ B).card * (st_ZW m ρ B).card) + (st_F m ρ B y \ st_Qj m ρ B 2).card := by have h1 := st_card_SI (B := B) hρ y have h2 := st_card_good (m := m) (ρ := ρ) (B := B) y have h3 := st_bad_bound hρ hB hyO have h4 := st_bad2_bound hρ hB (y := y) have h5 := st_Qh0_card hρ hB have h6 := st_good_bound hρ hB hyO have h7 := st_QS_four hρ hB have h8 := st_card_Dem (B := B) hρ have h9 : (st_Dem m ρ B).card + (st_A4 m ρ B).card ≤ (st_Slot m ρ B).card := st_slot_bound hρ hB (st_QW m ρ B) have h10 := st_card_Slot hρ hB have h11 := st_card_ZCC (m := m) (ρ := ρ) (B := B) have h12 := st_ZBC_bound hρ hB have h13 := st_ZCC_QD hρ hB omega -- ===== S6.lean ===== /-! ## Strip cores, part 6: Theorem A29-A and CORE₁ for all first-level ρ-cores (any `σ ≥ 0`). -/ /-- **Theorem A29-A** (strip cores, L3 model): for window offsets `O = wm_win m ρ B` with a high, `W₀(T) + p(T) ≥ coll(O) + 2·d3''(O) + d4(O) − h₄(O)`. -/ theorem st_A29A {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) (hh : (wm_high m ρ (wm_win m ρ B)).Nonempty) : wm_coll m ρ (wm_win m ρ B) + 2 * wm_d3pp m ρ (wm_win m ρ B) + wm_d4 m ρ (wm_win m ρ B) - wm_h m ρ (wm_win m ρ B) 4 ≤ wm_W0 m ρ B + wm_p m ρ B := by classical obtain ⟨y, hy⟩ := an_exists_anchor hh have hyO : y ∈ wm_win m ρ B := (wm_mem_high.1 hy.1).1 have hO : ∀ b ∈ wm_win m ρ B, 0 < b ∧ b + ρ < m := by intro b hb obtain ⟨hbB, hbρ⟩ := (wm_mem_win m ρ B b).1 hb exact ⟨(hB b hbB).1, hbρ⟩ -- level structure of `T` have hd := st_card_B4 hρ hB have hB3 := st_card_B3 hρ hB have hBc := st_card_B (m := m) (ρ := ρ) B have hZh := st_card_Zh (B := B) hρ have hQ := st_card_Q (m := m) (ρ := ρ) (B := B) have hY0 := wm_card_Y_zero (m := m) (O := wm_win m ρ B) hρ have hY1 := wm_card_Y_one hO hρ have hY21 := Finset.card_sdiff_add_card_eq_card (wm_Y_mono (m := m) (ρ := ρ) (O := wm_win m ρ B) (by norm_num : 1 ≤ 2)) have hY32 := Finset.card_sdiff_add_card_eq_card (wm_Y_mono (m := m) (ρ := ρ) (O := wm_win m ρ B) (by norm_num : 2 ≤ 3)) have heta := st_eta hρ hB have hholes := wm_holes_card (m := m) (ρ := ρ) (O := B) (by omega) -- A2 (T-shell), A3 (payment), A4 + A5 (strip lemma), S1 (W slots) have hsh := st_shell hρ hB hy.1 have hpay := st_payment hρ hB hy have hstrip := st_strip_lemma hρ hB hyO rw [Finset.card_product, Finset.card_product, Finset.card_product, hBc] at hstrip have hWc := st_W_count (st_selW hρ hB) (st_ZW_deg hρ hB) have hpart : (st_QW m ρ B).card = (st_Qj m ρ B 0).card + (st_Qj m ρ B 1).card + (st_Qj m ρ B 2).card + (st_Qj m ρ B 3).card ∧ (∑ q ∈ st_QW m ρ B, an_w (wm_win m ρ B) (wm_beta m ρ (wm_win m ρ B)) q) = (st_Qj m ρ B 1).card + 2 * (st_Qj m ρ B 2).card + 3 * (st_Qj m ρ B 3).card := st_Qj_partition (st_selW hρ hB) obtain ⟨hp1, hp2⟩ := hpart have hQ1 := Finset.card_inter_add_card_sdiff (st_Qj m ρ B 1) (an_I m ρ y) have hPG : 2 * (st_PG m ρ B).card = (wm_strip m ρ B).card * ((wm_strip m ρ B).card + 1) := wm_pairs_count _ have hPP := wm_Pw_add_Pu m ρ (wm_win m ρ B) have hZW : (st_ZW m ρ B).card ≤ (wm_Zhat m ρ (wm_win m ρ B)).card := by unfold st_ZW exact Finset.card_le_card Finset.sdiff_subset have hd3pp := st_d3pp_ge (B := B) hρ have hsumZ : (∑ q ∈ st_QW m ρ B, (an_w (wm_win m ρ B) (wm_beta m ρ (wm_win m ρ B)) q : ℤ)) = (st_Qj m ρ B 1).card + 2 * (st_Qj m ρ B 2).card + 3 * (st_Qj m ρ B 3).card := by exact_mod_cast hp2 -- window quantities have e32 : ((wm_Y m ρ (wm_win m ρ B) 3 \ wm_Y m ρ (wm_win m ρ B) 2).card : ℤ) = (wm_Y m ρ (wm_win m ρ B) 3).card - (wm_Y m ρ (wm_win m ρ B) 2).card := by have : ((wm_Y m ρ (wm_win m ρ B) 3 \ wm_Y m ρ (wm_win m ρ B) 2).card : ℤ) + (wm_Y m ρ (wm_win m ρ B) 2).card = (wm_Y m ρ (wm_win m ρ B) 3).card := by exact_mod_cast hY32 linarith have e21 : ((wm_Y m ρ (wm_win m ρ B) 2 \ wm_Y m ρ (wm_win m ρ B) 1).card : ℤ) = (wm_Y m ρ (wm_win m ρ B) 2).card - ((wm_win m ρ B).card + 1) := by have : ((wm_Y m ρ (wm_win m ρ B) 2 \ wm_Y m ρ (wm_win m ρ B) 1).card : ℤ) + (wm_Y m ρ (wm_win m ρ B) 1).card = (wm_Y m ρ (wm_win m ρ B) 2).card := by exact_mod_cast hY21 rw [hY1] at this push_cast at this linarith have p32 : ((wm_Y m ρ (wm_win m ρ B) 3 \ wm_Y m ρ (wm_win m ρ B) 2).card : ℤ) * (wm_strip m ρ B).card = (((wm_Y m ρ (wm_win m ρ B) 3).card : ℤ) - (wm_Y m ρ (wm_win m ρ B) 2).card) * (wm_strip m ρ B).card := by rw [e32] have p21 : ((wm_Y m ρ (wm_win m ρ B) 2 \ wm_Y m ρ (wm_win m ρ B) 1).card : ℤ) * (wm_strip m ρ B).card = (((wm_Y m ρ (wm_win m ρ B) 2).card : ℤ) - ((wm_win m ρ B).card + 1)) * (wm_strip m ρ B).card := by rw [e21] have hd3 : wm_d3 m ρ (wm_win m ρ B) = (((wm_win m ρ B).card : ℤ) + 2) * (((wm_Y m ρ (wm_win m ρ B) 2).card : ℤ) - ((wm_win m ρ B).card + 1)) - 3 * (((wm_Y m ρ (wm_win m ρ B) 3).card : ℤ) - (wm_Y m ρ (wm_win m ρ B) 2).card) := by have e : wm_d3 m ρ (wm_win m ρ B) = (((wm_win m ρ B).card : ℤ) + 2) * (((wm_Y m ρ (wm_win m ρ B) 2).card : ℤ) - (wm_Y m ρ (wm_win m ρ B) 1).card) - 3 * (((wm_Y m ρ (wm_win m ρ B) 3).card : ℤ) - (wm_Y m ρ (wm_win m ρ B) 2).card) := rfl rw [e, hY1] push_cast ring have hd4 : wm_d4 m ρ (wm_win m ρ B) = (((wm_win m ρ B).card : ℤ) + 3) * (((wm_Y m ρ (wm_win m ρ B) 3).card : ℤ) - (wm_Y m ρ (wm_win m ρ B) 2).card) - 4 * (((wm_Y m ρ (wm_win m ρ B) 4).card : ℤ) - (wm_Y m ρ (wm_win m ρ B) 3).card) := rfl have hh4 : wm_h m ρ (wm_win m ρ B) 4 = ((wm_Y m ρ (wm_win m ρ B) 4).card : ℤ) - (wm_Y m ρ (wm_win m ρ B) 3).card := rfl have hcoll : wm_coll m ρ (wm_win m ρ B) = 6 * ((wm_Pw m ρ (wm_win m ρ B) : ℤ) - (wm_Zhat m ρ (wm_win m ρ B)).card) + 6 * ((wm_Pu m ρ (wm_win m ρ B) : ℤ) - (((wm_Y m ρ (wm_win m ρ B) 2).card : ℤ) - ((wm_win m ρ B).card + 1))) := by have e : wm_coll m ρ (wm_win m ρ B) = 6 * ((wm_Pw m ρ (wm_win m ρ B) : ℤ) - (wm_Zhat m ρ (wm_win m ρ B)).card) + 6 * ((wm_Pu m ρ (wm_win m ρ B) : ℤ) - (((wm_Y m ρ (wm_win m ρ B) 2).card : ℤ) - (wm_Y m ρ (wm_win m ρ B) 1).card)) := rfl rw [e, hY1] push_cast ring -- `W₀ + p` unfold wm_W0 rw [st_ell hρ hB, hBc, hZh, hY0, hY1] push_cast rw [hd3] at hd3pp rw [hcoll, hd4, hh4] linarith /-- **CORE₁ for all first-level ρ-cores** (strip-free or not): `W₀ + p ≥ 0`. -/ theorem st_core {m ρ : ℕ} {B : Finset ℕ} (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) (hres : wm_Residual m ρ (wm_win m ρ B)) : 0 ≤ wm_W0 m ρ B + wm_p m ρ B := by have hO : ∀ b ∈ wm_win m ρ B, 0 < b ∧ b + ρ < m := by intro b hb obtain ⟨hbB, hbρ⟩ := (wm_mem_win m ρ B b).1 hb exact ⟨(hB b hbB).1, hbρ⟩ have h1 := st_A29A hρ hB (an_high_of_res hres) have h2 := wm_coll_nonneg hρ hO have h3 := wm_d3pp_nonneg (O := wm_win m ρ B) hρ have h4 := wm_quartic hρ hres linarith -- ===== leaf interface ===== /-- Leaf interface I-C (CLOSED by Theorem A29-A, `st_core`; a pure Finset/Nat statement about the model `(m, ρ, B)`): CORE₁ `W₀ + p ≥ 0` for first-level ρ-cores WITH strips (`σ ≥ 1`). Strip-free cores (`σ = 0`) are already closed by `wm_anchor_core` (anchor theorem + quartic lemma, EXT1-anchor). The model stands for the generalized core `T = ⟨m, m + b : b ∈ B⟩ ∪ [4m − ρ, ∞)` of A6 Corollary B; `wm_B m ρ B k` = shifted window positions `u ∈ [0, m)` carrying an element of level `≤ k`; `ℓ = Σ_{k<4} |B_k|`, `d = |B_4|`, `p = m − d`, `W₀ = (|B| + 1)ℓ − 4d + ρ`. Window offsets `B₀ = wm_win m ρ B` (`b + ρ < m`, i.e. `b < N = m − ρ`), strip offsets `G = wm_strip m ρ B` (`m ≤ b + ρ`, i.e. `N ≤ b < m`; nonempty here). Hypotheses: offsets in `[1, m)`, `ρ < m`, conductor exactly `4m − ρ` (`hc`), residual window counts (`hres`), `W₀ < 0`, at least one strip offset (`hσ`). Every model satisfying `hρ hB hc hres` is a generalized core with these data (converse of `wm_of_core`). A proof of the general statement (all `σ ≥ 0`, without `hneg`) discharges this leaf by ignoring `hneg` and `hσ`. Extend only by hypotheses that `wm_model_core` can produce. -/ theorem wm_leaf (m ρ : ℕ) (B : Finset ℕ) (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) (hc : m - 1 ∉ wm_B m ρ B 3) (hres : wm_Residual m ρ (wm_win m ρ B)) (hneg : wm_W0 m ρ B < 0) (hσ : (wm_strip m ρ B).Nonempty) : 0 ≤ wm_W0 m ρ B + wm_p m ρ B := st_core hρ hB hres lemma wm_win_eq_of_strip_empty {m ρ : ℕ} {B : Finset ℕ} (hσ : wm_strip m ρ B = ∅) : wm_win m ρ B = B := by classical unfold wm_strip at hσ unfold wm_win rw [Finset.filter_eq_empty_iff] at hσ exact Finset.filter_true_of_mem (fun b hb => by have := hσ hb; omega) lemma wm_win_offsets {m ρ : ℕ} {B : Finset ℕ} (hB : ∀ b ∈ B, 0 < b ∧ b < m) : ∀ b ∈ wm_win m ρ B, 0 < b ∧ b + ρ < m := by intro b hb obtain ⟨hbB, hbρ⟩ := (wm_mem_win m ρ B b).1 hb exact ⟨(hB b hbB).1, hbρ⟩ /-- M6 (dispatch): strip-free models (`σ = 0`, so `B = O`) satisfy CORE₁ by the anchor theorem (`wm_anchor_core`); models with strips go to the leaf (CORE₁ in both cases; `13W₀ + 23p ≥ 0` follows from `p ≥ 0`). -/ theorem wm_model_core (m ρ : ℕ) (B : Finset ℕ) (hρ : ρ < m) (hB : ∀ b ∈ B, 0 < b ∧ b < m) (hc : m - 1 ∉ wm_B m ρ B 3) (hres : wm_Residual m ρ (wm_win m ρ B)) (hneg : wm_W0 m ρ B < 0) : 0 ≤ 13 * wm_W0 m ρ B + 23 * wm_p m ρ B := by have hp0 := wm_p_nonneg (m := m) (ρ := ρ) (B := B) (by omega) by_cases hσ : wm_strip m ρ B = ∅ · have hBO := wm_win_eq_of_strip_empty hσ have h := wm_anchor_core hρ (wm_win_offsets (ρ := ρ) hB) hres rw [hBO] at h linarith · have h := wm_leaf m ρ B hρ hB hc hres hneg (Finset.nonempty_iff_ne_empty.2 hσ) linarith /-- M6 (wiring): `cr_CORE` from the model via the LINK. -/ theorem cr_CORE_proof : cr_CORE := by intro T hT hneg obtain ⟨hρ, hB, hc, hres, hW, hp⟩ := wm_of_core T hT rw [hW] at hneg rw [hW, hp] exact wm_model_core _ _ _ hρ hB hc hres hneg /-- Node N3' (OPEN research core). The other `q = 4` cases reduce to this one via `t11_reduce_to_pruned`, `w23_q4_of_X1_empty`, `w23_q4_lowhalf`, `w23_q4_high`, `w23_q4_gen_many_right`, `w23_q4_gen_lowpop`, `w23_q4_gen_two_high`, `w23_q4_gen_small`, `w23_q4_core_many_right`, `w23_q4_core_small`, `w23_q4_core_comp` and `w23_q4_core_one_high`: `S` is late-pruned, has at least four level-1 primitives other than `m`, a non-`m` left primitive `a` with `2a + ρ ≥ 3m`, one outside the high band `[⌈(3m+1)/2⌉, 2m−ρ−1]`, fewer than `(|X_1| − 1)/3` primitives of level ≥ 3, few low level-1 generators (`3l(l+1) < K(K−1)`), at least three high ones, more than `2(p_2 + p_3 + p_4) + 1` high ones unless (`ρ ≠ 0` and some wrapped pair sum lies below `3m`) (T31), and either a non-`m` left primitive of level ≥ 2, or (first-level core) `|X_1| ≥ 4` and `K(K² − 1 − 3p_4(K+7)) > 6ρ`, not (`2ρ + 2 ≤ m` and `24r ≤ K + 1`) (T33/T35 band slice) and lemma (L1) FAILS: `(K+3)w + 2(K+2)b < 4t + 6v` (T30/T35: (L1) would give `W₀ ≥ ρ`). -/ theorem wilf_q_four_core (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) (hsmall : 1 < ((w23_X S 1).filter (fun a => 3*a < S.conductor+S.multiplicity)).card) (hover : (gm_type S 3 2 0 0).card+4*t37_overflow S < (w23_X S 1).card*(gm_type S 3 2 0 0).card) (hpr : t11_IsLatePruned S) (hX1 : w23_X S 1 ≠ ∅) (hmid : ∃ a, S.IsPrimitive a ∧ a < S.conductor ∧ a ≠ S.multiplicity ∧ 3 * S.multiplicity ≤ 2 * a + w23_rho S) (hnotband : ∃ a, S.IsPrimitive a ∧ a < S.conductor ∧ a ≠ S.multiplicity ∧ (2 * a ≤ 3 * S.multiplicity ∨ 2 * S.multiplicity < a + 1 + w23_rho S)) (hgm : 3 * ((@Finset.filter ℕ S.IsPrimitive (Classical.decPred _) (w23_X S 4)).card + (@Finset.filter ℕ S.IsPrimitive (Classical.decPred _) (w23_X S 3)).card) + 1 < (w23_X S 1).card) (hK4 : 4 ≤ (w23_X S 1).card) (hpop : 3 * ((w23_X S 1).filter (fun a => 2 * a + w23_rho S < 3 * S.multiplicity)).card * (((w23_X S 1).filter (fun a => 2 * a + w23_rho S < 3 * S.multiplicity)).card + 1) < (w23_X S 1).card * ((w23_X S 1).card - 1)) (hh3 : 3 ≤ ((w23_X S 1).filter (fun a => 3 * S.multiplicity ≤ 2 * a + w23_rho S)).card) (hfh : ¬ (((w23_X S 1).filter (fun a => 3 * S.multiplicity ≤ 2 * a + w23_rho S)).card ≤ 2 * ((w23_P S 2).card + (w23_P S 3).card + w23_pq S) + 1) ∨ (gm_wlow S ≠ ∅ ∧ w23_rho S ≠ 0)) (hres : (∃ a, S.IsPrimitive a ∧ a < S.conductor ∧ a ≠ S.multiplicity ∧ 2 * S.multiplicity ≤ a + w23_rho S) ∨ ((w23_X S 1).card * (1 + 3 * (S.embeddingDimension - 1 - (w23_X S 1).card) * ((w23_X S 1).card + 7)) + 6 * w23_rho S < (w23_X S 1).card * ((w23_X S 1).card * (w23_X S 1).card) ∧ (S.multiplicity < 2 * w23_rho S + 2 ∨ (w23_X S 1).card + 1 < 24 * ((w23_X S 1).filter (fun a => ¬ (3 * S.multiplicity + 1 ≤ 2 * a ∧ 3 * a + w23_rho S + 1 ≤ 5 * S.multiplicity))).card) ∧ (((w23_X S 1).card + 3) * (cm_b S).card + 2 * ((w23_X S 1).card + 2) * (w23_X S 2).card < 4 * (cm_v S).card + 6 * (cm_d S).card))) : S.SatisfiesWilf := by exact cr_core_reduction cr_CORE_proof S h1 h2 hsmall hK4 hpop hh3 /-- Node N3: `3m < c ≤ 4m` implies Wilf, by pruning (T11) and the Lean-done slices (T14, T19, T16, T25, T32, T21, T22, T24, T28), modulo the open core `wilf_q_four_core`. -/ theorem wilf_q_four (S : NumericalSemigroup) (h1 : 3 * S.multiplicity < S.conductor) (h2 : S.conductor ≤ 4 * S.multiplicity) : S.SatisfiesWilf := t11_reduce_to_pruned (fun T hT1 hT2 hpr => by by_cases hsmall : ((w23_X T 1).filter (fun a => 3*a < T.conductor+T.multiplicity)).card ≤ 1 · exact w23_q4_gen_one_small T hT1 hT2 hsmall by_cases hover : (w23_X T 1).card*(gm_type T 3 2 0 0).card ≤ (gm_type T 3 2 0 0).card+4*t37_overflow T · exact w23_q4_gen_overflow T hT1 hT2 hover have hsmall' : 1 < ((w23_X T 1).filter (fun a => 3*a < T.conductor+T.multiplicity)).card := by omega have hover' : (gm_type T 3 2 0 0).card+4*t37_overflow T < (w23_X T 1).card*(gm_type T 3 2 0 0).card := by omega by_cases hX1 : w23_X T 1 = ∅ · exact w23_q4_of_X1_empty T hT1 hT2 hX1 · by_cases hK0 : (w23_X T 1).card ≤ 3 · exact w23_q4_gen_small T hT1 hT2 hK0 have hK4 : 4 ≤ (w23_X T 1).card := by omega by_cases hlh : ∀ a, T.IsPrimitive a → a < T.conductor → a ≠ T.multiplicity → 2 * a + w23_rho T < 3 * T.multiplicity · exact w23_q4_lowhalf T hT1 hT2 hlh · by_cases hband : ∀ a, T.IsPrimitive a → a < T.conductor → a ≠ T.multiplicity → 3 * T.multiplicity + 1 ≤ 2 * a ∧ a + 1 + w23_rho T ≤ 2 * T.multiplicity · exact w23_q4_high T hT1 hT2 hband · by_cases hgm0 : (w23_X T 1).card ≤ 3 * ((@Finset.filter ℕ T.IsPrimitive (Classical.decPred _) (w23_X T 4)).card + (@Finset.filter ℕ T.IsPrimitive (Classical.decPred _) (w23_X T 3)).card) + 1 · exact w23_q4_gen_many_right T hT1 hT2 hgm0 · have hgm : 3 * ((@Finset.filter ℕ T.IsPrimitive (Classical.decPred _) (w23_X T 4)).card + (@Finset.filter ℕ T.IsPrimitive (Classical.decPred _) (w23_X T 3)).card) + 1 < (w23_X T 1).card := by omega by_cases hpop0 : (w23_X T 1).card * ((w23_X T 1).card - 1) ≤ 3 * ((w23_X T 1).filter (fun a => 2 * a + w23_rho T < 3 * T.multiplicity)).card * (((w23_X T 1).filter (fun a => 2 * a + w23_rho T < 3 * T.multiplicity)).card + 1) · exact w23_q4_gen_lowpop T hT1 hT2 hpop0 · have hpop : 3 * ((w23_X T 1).filter (fun a => 2 * a + w23_rho T < 3 * T.multiplicity)).card * (((w23_X T 1).filter (fun a => 2 * a + w23_rho T < 3 * T.multiplicity)).card + 1) < (w23_X T 1).card * ((w23_X T 1).card - 1) := by omega have key : 3 ≤ ((w23_X T 1).filter (fun a => 3 * T.multiplicity ≤ 2 * a + w23_rho T)).card → (¬ (((w23_X T 1).filter (fun a => 3 * T.multiplicity ≤ 2 * a + w23_rho T)).card ≤ 2 * ((w23_P T 2).card + (w23_P T 3).card + w23_pq T) + 1) ∨ (gm_wlow T ≠ ∅ ∧ w23_rho T ≠ 0)) → T.SatisfiesWilf := fun hh3 hfh => by push_neg at hlh hband obtain ⟨a, ha, hac, hne, h3⟩ := hlh obtain ⟨a', ha', hac', hne', hb'⟩ := hband have hnb : 2 * a' ≤ 3 * T.multiplicity ∨ 2 * T.multiplicity < a' + 1 + w23_rho T := by by_cases h2a : 3 * T.multiplicity + 1 ≤ 2 * a' · exact Or.inr (by have := hb' h2a; omega) · exact Or.inl (by omega) by_cases hcore : ∀ a, T.IsPrimitive a → a < T.conductor → a ≠ T.multiplicity → a + w23_rho T < 2 * T.multiplicity · by_cases he : 4 * (w23_X T 1).card + 2 ≤ 3 * T.embeddingDimension · exact w23_q4_core_many_right T hT1 hT2 hcore he · by_cases hK : (w23_X T 1).card ≤ 3 · exact w23_q4_core_small T hT1 hT2 hcore hK · by_cases hcomp : (w23_X T 1).card * ((w23_X T 1).card * (w23_X T 1).card) ≤ (w23_X T 1).card * (1 + 3 * (T.embeddingDimension - 1 - (w23_X T 1).card) * ((w23_X T 1).card + 7)) + 6 * w23_rho T · exact w23_q4_core_comp T hT1 hT2 hcore hcomp · by_cases hone : ((w23_X T 1).filter (fun a => 3 * T.multiplicity ≤ 2 * a + w23_rho T)).card ≤ 1 · exact w23_q4_core_one_high T hT1 hT2 hcore hone · by_cases hb24 : 2 * w23_rho T + 2 ≤ T.multiplicity ∧ 24 * ((w23_X T 1).filter (fun a => ¬ (3 * T.multiplicity + 1 ≤ 2 * a ∧ 3 * a + w23_rho T + 1 ≤ 5 * T.multiplicity))).card ≤ (w23_X T 1).card + 1 · exact w23_q4_core_band24 T hT1 hT2 hcore hb24.1 hb24.2 · by_cases hL1 : 4 * (cm_v T).card + 6 * (cm_d T).card ≤ ((w23_X T 1).card + 3) * (cm_b T).card + 2 * ((w23_X T 1).card + 2) * (w23_X T 2).card · exact w23_q4_core_of_L1 T hT1 hT2 hcore hL1 · exact wilf_q_four_core T hT1 hT2 hsmall' hover' hpr hX1 ⟨a, ha, hac, hne, h3⟩ ⟨a', ha', hac', hne', hnb⟩ hgm hK4 hpop hh3 hfh (Or.inr ⟨by omega, by omega, by omega⟩) · push_neg at hcore obtain ⟨a'', ha'', hac'', hne'', hl''⟩ := hcore exact wilf_q_four_core T hT1 hT2 hsmall' hover' hpr hX1 ⟨a, ha, hac, hne, h3⟩ ⟨a', ha', hac', hne', hnb⟩ hgm hK4 hpop hh3 hfh (Or.inl ⟨a'', ha'', hac'', hne'', hl''⟩) have key2 : (¬ (((w23_X T 1).filter (fun a => 3 * T.multiplicity ≤ 2 * a + w23_rho T)).card ≤ 2 * ((w23_P T 2).card + (w23_P T 3).card + w23_pq T) + 1) ∨ (gm_wlow T ≠ ∅ ∧ w23_rho T ≠ 0)) → T.SatisfiesWilf := fun hfh => by by_cases htwo : ((w23_X T 1).filter (fun a => 3 * T.multiplicity ≤ 2 * a + w23_rho T)).card ≤ 2 · exact w23_q4_gen_two_high T hT1 hT2 htwo (by omega) · exact key (by omega) hfh by_cases hfhc : ((w23_X T 1).filter (fun a => 3 * T.multiplicity ≤ 2 * a + w23_rho T)).card ≤ 2 * ((w23_P T 2).card + (w23_P T 3).card + w23_pq T) + 1 · by_cases hwl : gm_wlow T = ∅ · exact w23_q4_gen_few_high T hT1 hT2 hwl hfhc · by_cases hrho : w23_rho T = 0 · exact w23_q4_gen_few_high_rho_zero T hT1 hT2 hrho hfhc · exact key2 (Or.inr ⟨hwl, hrho⟩) · exact key2 (Or.inl hfhc)) S h1 h2 theorem target : fcTypeOfName% "Math30Catalog.source23" := by intro S h by_cases hquarter : S.conductor=4*S.multiplicity ∧ (∀ a, S.IsPrimitive a → a