Skip to content

Commit 50988b8

Browse files
feat(Analysis/Convex): Radon's convexity theorem (#6598)
Add Radon's theorem on convex sets Co-authored-by: Vasily Nesterov <118051017+vasnesterov@users.noreply.github.com> Co-authored-by: Yaël Dillies <yael.dillies@gmail.com>
1 parent 96d7853 commit 50988b8

File tree

3 files changed

+80
-2
lines changed

3 files changed

+80
-2
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,7 @@ import Mathlib.Analysis.Convex.Measure
659659
import Mathlib.Analysis.Convex.Normed
660660
import Mathlib.Analysis.Convex.PartitionOfUnity
661661
import Mathlib.Analysis.Convex.Quasiconvex
662+
import Mathlib.Analysis.Convex.Radon
662663
import Mathlib.Analysis.Convex.Segment
663664
import Mathlib.Analysis.Convex.Side
664665
import Mathlib.Analysis.Convex.SimplicialComplex.Basic

Mathlib/Analysis/Convex/Combination.lean

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,9 @@ open BigOperators Classical Pointwise
3232

3333
universe u u'
3434

35-
variable {R E F ι ι' α : Type*} [LinearOrderedField R] [AddCommGroup E] [AddCommGroup F]
36-
[LinearOrderedAddCommGroup α] [Module R E] [Module R F] [Module R α] [OrderedSMul R α] {s : Set E}
35+
variable {R R' E F ι ι' α : Type*} [LinearOrderedField R] [LinearOrderedField R'] [AddCommGroup E]
36+
[AddCommGroup F] [LinearOrderedAddCommGroup α] [Module R E] [Module R F] [Module R α]
37+
[OrderedSMul R α] {s : Set E}
3738

3839
/-- Center of mass of a finite collection of points with prescribed weights.
3940
Note that we require neither `0 ≤ w i` nor `∑ w = 1`. -/
@@ -69,6 +70,14 @@ theorem Finset.centerMass_singleton (hw : w i ≠ 0) : ({i} : Finset ι).centerM
6970
rw [centerMass, sum_singleton, sum_singleton, ← mul_smul, inv_mul_cancel hw, one_smul]
7071
#align finset.center_mass_singleton Finset.centerMass_singleton
7172

73+
@[simp] lemma Finset.centerMass_neg_left : t.centerMass (-w) z = t.centerMass w z := by
74+
simp [centerMass, inv_neg]
75+
76+
lemma Finset.centerMass_smul_left {c : R'} [Module R' R] [Module R' E] [SMulCommClass R' R R]
77+
[IsScalarTower R' R R] [SMulCommClass R R' E] [IsScalarTower R' R E] (hc : c ≠ 0) :
78+
t.centerMass (c • w) z = t.centerMass w z := by
79+
simp [centerMass, -smul_assoc, smul_assoc c, ←smul_sum, smul_inv₀, smul_smul_smul_comm, hc]
80+
7281
theorem Finset.centerMass_eq_of_sum_1 (hw : ∑ i in t, w i = 1) :
7382
t.centerMass w z = ∑ i in t, w i • z i := by
7483
simp only [Finset.centerMass, hw, inv_one, one_smul]
@@ -148,6 +157,11 @@ end Finset
148157

149158
variable {z}
150159

160+
lemma Finset.centerMass_of_sum_add_sum_eq_zero {s t : Finset ι}
161+
(hw : ∑ i in s, w i + ∑ i in t, w i = 0) (hz : ∑ i in s, w i • z i + ∑ i in t, w i • z i = 0) :
162+
s.centerMass w z = t.centerMass w z := by
163+
simp [centerMass, eq_neg_of_add_eq_zero_right hw, eq_neg_of_add_eq_zero_left hz, ←neg_inv]
164+
151165
/-- The center of mass of a finite subset of a convex set belongs to the set
152166
provided that all weights are non-negative, and the total weight is positive. -/
153167
theorem Convex.centerMass_mem (hs : Convex R s) :
@@ -223,13 +237,25 @@ theorem Finset.centerMass_mem_convexHull (t : Finset ι) {w : ι → R} (hw₀ :
223237
(convex_convexHull R s).centerMass_mem hw₀ hws fun i hi => subset_convexHull R s <| hz i hi
224238
#align finset.center_mass_mem_convex_hull Finset.centerMass_mem_convexHull
225239

240+
/-- A version of `Finset.centerMass_mem_convexHull` for when the weights are nonpositive. -/
241+
lemma Finset.centerMass_mem_convexHull_of_nonpos (t : Finset ι) (hw₀ : ∀ i ∈ t, w i ≤ 0)
242+
(hws : ∑ i in t, w i < 0) (hz : ∀ i ∈ t, z i ∈ s) : t.centerMass w z ∈ convexHull R s := by
243+
rw [←centerMass_neg_left]
244+
exact Finset.centerMass_mem_convexHull _ (λ _i hi ↦ neg_nonneg.2 $ hw₀ _ hi) (by simpa) hz
245+
226246
/-- A refinement of `Finset.centerMass_mem_convexHull` when the indexed family is a `Finset` of
227247
the space. -/
228248
theorem Finset.centerMass_id_mem_convexHull (t : Finset E) {w : E → R} (hw₀ : ∀ i ∈ t, 0 ≤ w i)
229249
(hws : 0 < ∑ i in t, w i) : t.centerMass w id ∈ convexHull R (t : Set E) :=
230250
t.centerMass_mem_convexHull hw₀ hws fun _ => mem_coe.2
231251
#align finset.center_mass_id_mem_convex_hull Finset.centerMass_id_mem_convexHull
232252

253+
/-- A version of `Finset.centerMass_mem_convexHull` for when the weights are nonpositive. -/
254+
lemma Finset.centerMass_id_mem_convexHull_of_nonpos (t : Finset E) {w : E → R}
255+
(hw₀ : ∀ i ∈ t, w i ≤ 0) (hws : ∑ i in t, w i < 0) :
256+
t.centerMass w id ∈ convexHull R (t : Set E) :=
257+
t.centerMass_mem_convexHull_of_nonpos hw₀ hws fun _ ↦ mem_coe.2
258+
233259
theorem affineCombination_eq_centerMass {ι : Type*} {t : Finset ι} {p : ι → E} {w : ι → R}
234260
(hw₂ : ∑ i in t, w i = 1) : t.affineCombination R p w = centerMass t w p := by
235261
rw [affineCombination_eq_weightedVSubOfPoint_vadd_of_sum_eq_one _ w _ hw₂ (0 : E),

Mathlib/Analysis/Convex/Radon.lean

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/-
2+
Copyright (c) 2023 Vasily Nesterov. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Vasily Nesterov
5+
-/
6+
import Mathlib.Analysis.Convex.Combination
7+
import Mathlib.Tactic.Linarith
8+
9+
/-!
10+
# Radon's theorem on convex sets
11+
12+
Radon's theorem states that any affine dependent set can be partitioned into two sets whose convex
13+
hulls intersect.
14+
15+
## Tags
16+
17+
convex hull, radon, affine independence
18+
-/
19+
20+
open Finset Set
21+
open BigOperators
22+
23+
variable {ι 𝕜 E : Type*} [LinearOrderedField 𝕜] [AddCommGroup E] [Module 𝕜 E] {f : ι → E}
24+
25+
/-- **Radon theorem on convex sets**: Any family `f` of affine dependent vectors contains a set `I`
26+
with the property that convex hulls of `I` and `Iᶜ` intersect. -/
27+
theorem radon_partition (h : ¬ AffineIndependent 𝕜 f) :
28+
∃ I, (convexHull 𝕜 (f '' I) ∩ convexHull 𝕜 (f '' Iᶜ)).Nonempty := by
29+
rw [affineIndependent_iff] at h
30+
push_neg at h
31+
obtain ⟨s, w, h_wsum, h_vsum, nonzero_w_index, h1, h2⟩ := h
32+
let I : Finset ι := s.filter fun i ↦ 0 ≤ w i
33+
let J : Finset ι := s.filter fun i ↦ w i < 0
34+
let p : E := centerMass I w f -- point of intersection
35+
have hJI : ∑ j in J, w j + ∑ i in I, w i = 0 := by
36+
simpa only [h_wsum, not_lt] using sum_filter_add_sum_filter_not s (fun i ↦ w i < 0) w
37+
have hI : 0 < ∑ i in I, w i := by
38+
rcases exists_pos_of_sum_zero_of_exists_nonzero _ h_wsum ⟨nonzero_w_index, h1, h2⟩
39+
with ⟨pos_w_index, h1', h2'⟩
40+
exact sum_pos' (λ _i hi ↦ (mem_filter.1 hi).2)
41+
⟨pos_w_index, by simp only [mem_filter, h1', h2'.le, and_self, h2']⟩
42+
have hp : centerMass J w f = p := Finset.centerMass_of_sum_add_sum_eq_zero hJI $ by
43+
simpa only [←h_vsum, not_lt] using sum_filter_add_sum_filter_not s (fun i ↦ w i < 0) _
44+
refine ⟨I, p, ?_, ?_⟩
45+
· exact centerMass_mem_convexHull _ (fun _i hi ↦ (mem_filter.mp hi).2) hI
46+
(fun _i hi ↦ Set.mem_image_of_mem _ hi)
47+
rw [←hp]
48+
refine centerMass_mem_convexHull_of_nonpos _ (fun _ hi ↦ (mem_filter.mp hi).2.le) ?_
49+
(fun _i hi ↦ Set.mem_image_of_mem _ fun hi' ↦ ?_)
50+
· linarith only [hI, hJI]
51+
· exact (mem_filter.mp hi').2.not_lt (mem_filter.mp hi).2

0 commit comments

Comments
 (0)