Skip to content

Commit 4258f34

Browse files
committed
Finish stating Lecture 2
1 parent 6a82b21 commit 4258f34

File tree

7 files changed

+208
-7
lines changed

7 files changed

+208
-7
lines changed

LeanCamCombi.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ import LeanCamCombi.ErdosRenyi.Connectivity
1010
import LeanCamCombi.ErdosRenyi.GiantComponent
1111
import LeanCamCombi.GraphTheory.ExampleSheet1
1212
import LeanCamCombi.GraphTheory.ExampleSheet2
13+
import LeanCamCombi.GrowthInGroups.ApproximateSubgroup
1314
import LeanCamCombi.GrowthInGroups.BooleanSubalgebra
1415
import LeanCamCombi.GrowthInGroups.Chevalley
1516
import LeanCamCombi.GrowthInGroups.Constructible
1617
import LeanCamCombi.GrowthInGroups.Lecture1
1718
import LeanCamCombi.GrowthInGroups.Lecture2
19+
import LeanCamCombi.GrowthInGroups.Lecture3
1820
import LeanCamCombi.GrowthInGroups.SmallTripling
1921
import LeanCamCombi.GrowthInGroups.VerySmallDoubling
2022
import LeanCamCombi.Impact
@@ -24,6 +26,7 @@ import LeanCamCombi.Kneser.KneserRuzsa
2426
import LeanCamCombi.Kneser.MulStab
2527
import LeanCamCombi.LittlewoodOfford
2628
import LeanCamCombi.Mathlib.Algebra.Group.Pointwise.Finset.Basic
29+
import LeanCamCombi.Mathlib.Algebra.Group.Pointwise.Set.Basic
2730
import LeanCamCombi.Mathlib.Algebra.Group.Subgroup.Pointwise
2831
import LeanCamCombi.Mathlib.Analysis.Convex.Exposed
2932
import LeanCamCombi.Mathlib.Analysis.Convex.Extreme
@@ -46,6 +49,7 @@ import LeanCamCombi.Mathlib.Data.Prod.Lex
4649
import LeanCamCombi.Mathlib.Data.Set.Image
4750
import LeanCamCombi.Mathlib.Data.Set.Lattice
4851
import LeanCamCombi.Mathlib.Data.Set.Pointwise.Finite
52+
import LeanCamCombi.Mathlib.Data.Set.Pointwise.Interval
4953
import LeanCamCombi.Mathlib.Data.Set.Pointwise.SMul
5054
import LeanCamCombi.Mathlib.GroupTheory.OrderOfElement
5155
import LeanCamCombi.Mathlib.LinearAlgebra.AffineSpace.FiniteDimensional
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import Mathlib.Algebra.BigOperators.Ring
2+
import Mathlib.Algebra.Group.Pointwise.Finset.Basic
3+
import Mathlib.Algebra.Order.BigOperators.Ring.Finset
4+
import Mathlib.Combinatorics.Additive.RuzsaCovering
5+
import Mathlib.Data.Fintype.BigOperators
6+
import Mathlib.Data.Real.Basic
7+
import LeanCamCombi.Mathlib.Algebra.Group.Pointwise.Set.Basic
8+
9+
open scoped Finset Pointwise
10+
11+
12+
variable {G : Type*} [Group G] {S : Set G} {K L : ℝ} {n : ℕ}
13+
14+
structure IsApproximateAddSubgroup {G : Type*} [AddGroup G] (S : Set G) (K : ℝ) : Prop where
15+
nonempty : S.Nonempty
16+
neg_eq_self : -S = S
17+
exists_two_nsmul_subset_add : ∃ F : Finset G, #F ≤ K ∧ 2 • S ⊆ F + S
18+
19+
@[to_additive]
20+
structure IsApproximateSubgroup (S : Set G) (K : ℝ) : Prop where
21+
nonempty : S.Nonempty
22+
inv_eq_self : S⁻¹ = S
23+
exists_sq_subset_mul : ∃ F : Finset G, #F ≤ K ∧ S ^ 2 ⊆ F * S
24+
25+
namespace IsApproximateSubgroup
26+
27+
@[to_additive one_le]
28+
lemma one_le (hS : IsApproximateSubgroup S K) : 1 ≤ K := by
29+
obtain ⟨F, hF, hSF⟩ := hS.exists_sq_subset_mul
30+
have hF₀ : F ≠ ∅ := by rintro rfl; simp [hS.nonempty.pow.ne_empty] at hSF
31+
exact hF.trans' <| by simpa [Finset.nonempty_iff_ne_empty]
32+
33+
@[to_additive]
34+
lemma mono (hKL : K ≤ L) (hS : IsApproximateSubgroup S K) : IsApproximateSubgroup S L where
35+
nonempty := hS.nonempty
36+
inv_eq_self := hS.inv_eq_self
37+
exists_sq_subset_mul := let ⟨F, hF, hSF⟩ := hS.exists_sq_subset_mul; ⟨F, hF.trans hKL, hSF⟩
38+
39+
@[to_additive]
40+
lemma card_pow_le [DecidableEq G] {S : Finset G} (hS : IsApproximateSubgroup (S : Set G) K) :
41+
∀ {n}, #(S ^ n) ≤ K ^ (n - 1) * #S
42+
| 0 => by simpa using hS.nonempty
43+
| 1 => by simp
44+
| n + 2 => by
45+
obtain ⟨F, hF, hSF⟩ := hS.exists_sq_subset_mul
46+
calc
47+
(#(S ^ (n + 2)) : ℝ) ≤ #(F ^ (n + 1) * S) := by
48+
gcongr; exact mod_cast Set.pow_subset_pow_mul_of_sq_subset_mul hSF (by omega)
49+
_ ≤ #(F ^ (n + 1)) * #S := mod_cast Finset.card_mul_le
50+
_ ≤ #F ^ (n + 1) * #S := by gcongr; exact mod_cast Finset.card_pow_le
51+
_ ≤ K ^ (n + 1) * #S := by gcongr
52+
53+
@[to_additive]
54+
lemma pi {ι : Type*} {G : ι → Type*} [Fintype ι] [∀ i, Group (G i)] {S : ∀ i, Set (G i)} {K : ι → ℝ}
55+
(hS : ∀ i, IsApproximateSubgroup (S i) (K i)) :
56+
IsApproximateSubgroup (Set.univ.pi S) (∏ i, K i) where
57+
nonempty := Set.univ_pi_nonempty_iff.2 fun i ↦ (hS i).nonempty
58+
inv_eq_self := by simp [(hS _).inv_eq_self]
59+
exists_sq_subset_mul := by
60+
choose F hF hFS using fun i ↦ (hS i).exists_sq_subset_mul
61+
classical
62+
refine ⟨Fintype.piFinset F, ?_, ?_⟩
63+
· calc
64+
#(Fintype.piFinset F) = ∏ i, (#(F i) : ℝ) := by simp
65+
_ ≤ ∏ i, K i := by gcongr; exact hF _
66+
· sorry
67+
68+
@[to_additive]
69+
lemma of_small_tripling [DecidableEq G] {s : Finset G} (hs₀ : s.Nonempty) (hsymm : s⁻¹ = s)
70+
(hs : #(s ^ 3) ≤ K * #s) : IsApproximateSubgroup (s ^ 2 : Set G) (K ^ 2) where
71+
nonempty := hs₀.to_set.pow
72+
inv_eq_self := by simp [← inv_pow, hsymm, ← Finset.coe_inv]
73+
exists_sq_subset_mul := by
74+
sorry
75+
76+
77+
78+
end IsApproximateSubgroup

LeanCamCombi/GrowthInGroups/Lecture2.lean

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import Mathlib.Data.Real.Basic
2-
import Mathlib.Data.Fin.VecNotation
3-
import Mathlib.Tactic.FinCases
4-
import Mathlib.Tactic.NormNum
1+
import LeanCamCombi.Mathlib.Data.Set.Pointwise.Interval
2+
import LeanCamCombi.GrowthInGroups.ApproximateSubgroup
53
import LeanCamCombi.GrowthInGroups.SmallTripling
64

75
open Fin Finset List
@@ -10,7 +8,6 @@ open scoped Pointwise
108
namespace GrowthInGroups.Lecture2
119
variable {G : Type*} [DecidableEq G] [Group G] {A : Finset G} {k K : ℝ} {m : ℕ}
1210

13-
-- TODO: Genealise to non-commutative groups
1411
lemma lemma_4_2 (U V W : Finset G) : #U * #(V⁻¹ * W) ≤ #(U * V) * #(U * W) := by
1512
exact ruzsa_triangle_inequality_invMul_mul_mul ..
1613

@@ -35,12 +32,42 @@ lemma lemma_4_3_1 (hA : #(A ^ 2) ≤ K * #A) : #(A * A⁻¹) ≤ K ^ 2 * #A := b
3532
_ ≤ (K * #A) * (K * #A) := by rw [← sq A]; gcongr
3633
_ = #A * (K ^ 2 * #A) := by ring
3734

38-
lemma lemma_4_4_1 (hm : 3 ≤ m) (hA : #(A ^ 3) ≤ K * #A) (ε : Fin m → ℤ)
39-
(hε : ∀ i, |ε i| = 1) :
35+
lemma lemma_4_4_1 (hm : 3 ≤ m) (hA : #(A ^ 3) ≤ K * #A) (ε : Fin m → ℤ) (hε : ∀ i, |ε i| = 1) :
4036
#((finRange m).map fun i ↦ A ^ ε i).prod ≤ K ^ (3 * (m - 2)) * #A :=
4137
small_alternating_pow_of_small_tripling hm hA ε hε
4238

4339
lemma lemma_4_4_2 (hm : 3 ≤ m) (hA : #(A ^ 3) ≤ K * #A) (hAsymm : A⁻¹ = A) :
4440
#(A ^ m) ≤ K ^ (m - 2) * #A := small_pow_of_small_tripling hm hA hAsymm
4541

42+
def def_4_5 (S : Set G) (K : ℝ) : Prop := IsApproximateSubgroup S K
43+
44+
lemma two_nsmul_Icc_nat (k : ℕ) : (2 • .Icc (-k) k : Set ℤ) = {(-k : ℤ), (k : ℤ)} + .Icc (-k) k :=
45+
sorry
46+
47+
lemma two_nsmul_Icc_real : (2 • .Icc (-1) 1 : Set ℝ) = {-1, 1} + .Icc (-1) 1 := sorry
48+
49+
lemma remark_4_6_1 (k : ℕ) : IsApproximateAddSubgroup (.Icc (-k) k : Set ℤ) 2 where
50+
nonempty := ⟨0, by simp⟩
51+
neg_eq_self := by simp
52+
exists_two_nsmul_subset_add :=
53+
⟨{(-k : ℤ), (k : ℤ)}, mod_cast card_le_two, by simp [two_nsmul_Icc_nat]⟩
54+
55+
lemma remark_4_6_2 {ι : Type*} [Fintype ι] (k : ι → ℕ) :
56+
IsApproximateAddSubgroup (Set.univ.pi fun i ↦ .Icc (-k i) (k i) : Set (ι → ℤ))
57+
(2 ^ Fintype.card ι) := by
58+
simpa using IsApproximateAddSubgroup.pi fun i ↦ remark_4_6_1 (k i)
59+
60+
lemma remark_4_6_3 : IsApproximateAddSubgroup (.Icc (-1) 1 : Set ℝ) 2 where
61+
nonempty := ⟨0, by simp⟩
62+
neg_eq_self := by simp
63+
exists_two_nsmul_subset_add := ⟨{-1, 1}, mod_cast card_le_two, by simp [two_nsmul_Icc_real]⟩
64+
65+
lemma lemma_4_7 {A : Finset G} (hA₀ : A.Nonempty) (hsymm : A⁻¹ = A) (hA : #(A ^ 3) ≤ K * #A) :
66+
IsApproximateSubgroup (A ^ 2 : Set G) (K ^ 2) := .of_small_tripling hA₀ hsymm hA
67+
68+
-- TODO: Generalise Ruzsa covering to non-abelian groups
69+
lemma lemma_4_8 {A B : Finset G} (hK : #(A * B) ≤ K * #B) : ∃ F ⊆ A, #F ≤ K ∧ A ⊆ F * (B / B) := by
70+
sorry
71+
-- obtain ⟨F, hF⟩ := Finset.exists_subset_mul_div A _
72+
4673
end GrowthInGroups.Lecture2
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import LeanCamCombi.Mathlib.Data.Set.Pointwise.Interval
2+
import LeanCamCombi.GrowthInGroups.ApproximateSubgroup
3+
import LeanCamCombi.GrowthInGroups.SmallTripling
4+
5+
open Fin Finset List
6+
open scoped Pointwise
7+
8+
namespace GrowthInGroups.Lecture3
9+
variable {G : Type*} [DecidableEq G] [Group G] {A : Finset G} {k K : ℝ} {m : ℕ}
10+
11+
lemma lemma_5_1 {A : Finset G} (hA₀ : A.Nonempty) (hsymm : A⁻¹ = A) (hA : #(A ^ 3) ≤ K * #A) :
12+
IsApproximateSubgroup (A ^ 2 : Set G) (K ^ 2) := .of_small_tripling hA₀ hsymm hA
13+
14+
-- TODO: Generalise Ruzsa covering to non-abelian groups
15+
lemma lemma_5_2 {A B : Finset G} (hK : #(A * B) ≤ K * #B) : ∃ F ⊆ A, #F ≤ K ∧ A ⊆ F * (B / B) := by
16+
sorry
17+
-- obtain ⟨F, hF⟩ := Finset.exists_subset_mul_div A _
18+
19+
end GrowthInGroups.Lecture3

LeanCamCombi/Mathlib/Algebra/Group/Pointwise/Finset/Basic.lean

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,30 @@ variable {α : Type*} [DecidableEq α] [Mul α] {s t : Finset α} {a : α}
77

88
lemma smul_finset_subset_mul : a ∈ s → a • t ⊆ s * t := image_subset_image₂_right
99

10+
attribute [gcongr] mul_subset_mul_left mul_subset_mul_right div_subset_div_left div_subset_div_right
11+
12+
end Finset
13+
14+
namespace Finset
15+
variable {α : Type*} [DecidableEq α] [Monoid α] {s t : Finset α}
16+
17+
attribute [simp] one_nonempty
18+
19+
@[to_additive]
20+
lemma Nonempty.pow (hs : s.Nonempty) : ∀ {n}, (s ^ n).Nonempty
21+
| 0 => by simp
22+
| n + 1 => by rw [pow_succ]; exact hs.pow.mul hs
23+
24+
@[to_additive]
25+
lemma pow_subset_pow_mul_of_sq_subset_mul (hst : s ^ 2 ⊆ t * s) :
26+
∀ {n}, 1 < n → s ^ n ⊆ t ^ (n - 1) * s
27+
| 2, _ => by simpa
28+
| n + 3, _ => by
29+
calc
30+
s ^ (n + 3) = s ^ (n + 2) * s := by rw [pow_succ]
31+
_ ⊆ t ^ (n + 1) * s * s := by gcongr; exact pow_subset_pow_mul_of_sq_subset_mul hst (by omega)
32+
_ = t ^ (n + 1) * s ^ 2 := by rw [mul_assoc, sq]
33+
_ ⊆ t ^ (n + 1) * (t * s) := by gcongr
34+
_ = t ^ (n + 2) * s := by rw [← mul_assoc, ← pow_succ]
35+
1036
end Finset
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import Mathlib.Algebra.Group.Pointwise.Set.Basic
2+
3+
open scoped Pointwise
4+
5+
namespace Set
6+
variable {α : Type*} [Monoid α] {s t : Set α}
7+
8+
attribute [simp] one_nonempty
9+
10+
@[to_additive]
11+
lemma Nonempty.pow (hs : s.Nonempty) : ∀ {n}, (s ^ n).Nonempty
12+
| 0 => by simp
13+
| n + 1 => by rw [pow_succ]; exact hs.pow.mul hs
14+
15+
@[to_additive]
16+
lemma pow_subset_pow_mul_of_sq_subset_mul (hst : s ^ 2 ⊆ t * s) :
17+
∀ {n}, 1 < n → s ^ n ⊆ t ^ (n - 1) * s
18+
| 2, _ => by simpa
19+
| n + 3, _ => by
20+
calc
21+
s ^ (n + 3) = s ^ (n + 2) * s := by rw [pow_succ]
22+
_ ⊆ t ^ (n + 1) * s * s := by gcongr; exact pow_subset_pow_mul_of_sq_subset_mul hst (by omega)
23+
_ = t ^ (n + 1) * s ^ 2 := by rw [mul_assoc, sq]
24+
_ ⊆ t ^ (n + 1) * (t * s) := by gcongr
25+
_ = t ^ (n + 2) * s := by rw [← mul_assoc, ← pow_succ]
26+
27+
end Set
28+
29+
namespace Set
30+
variable {ι : Type*} {α : ι → Type*} [∀ i, InvolutiveInv (α i)]
31+
32+
@[to_additive (attr := simp)]
33+
lemma inv_pi (s : Set ι) (t : ∀ i, Set (α i)) : (s.pi t)⁻¹ = s.pi fun i ↦ (t i)⁻¹ := by
34+
simp_rw [← image_inv]; exact piMap_image_pi (fun _ _ ↦ inv_surjective) _
35+
36+
end Set
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import Mathlib.Data.Set.Pointwise.Interval
2+
3+
open scoped Pointwise
4+
5+
namespace Set
6+
variable {α : Type*} [OrderedCommGroup α]
7+
8+
@[to_additive (attr := simp)]
9+
lemma inv_Icc (a b : α) : (Icc a b)⁻¹ = Icc b⁻¹ a⁻¹ := by ext; simp [le_inv', inv_le', and_comm]
10+
11+
end Set

0 commit comments

Comments
 (0)