/-
Copyright 2026 The Formal Conjectures Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-/
module
public import FormalConjecturesForMathlib.Order.Filter.atTopBot.Finset
public import Mathlib.Data.Fin.VecNotation
public import Mathlib.Data.Real.Basic
public import Mathlib.Data.Set.Card
public import Mathlib.GroupTheory.Finiteness
public import Mathlib.Tactic.SetNotationForOrder
import Mathlib.Tactic@[expose] public sectionopen Filternamespace GromovPolynomialGrowthvariable {G : Type*} [Group G]
The CayleyBall is the ball of radius n in the Cayley graph of a group G with generating
set S.
def CayleyBall (S : Set G) (n : ℕ) : Set G :=
{g : G | ∃ (l : List G), l.length ≤ n ∧ (∀ s ∈ l, s ∈ S ∨ s⁻¹ ∈ S) ∧ l.prod = g}theorem cayleyBall_zero (S : Set G) :
CayleyBall S 0 = {1} := G:Type u_1inst✝:Group GS:Set G⊢ CayleyBall S 0 = {1}
All goals completed! 🐙G:Type u_1inst✝:Group GS:Set GhS:S.Finiten:ℕhu:(S ∪ (fun x ↦ x)⁻¹ '' S).Finitehf:∀ (m : ℕ), {f | ∀ (i : Fin m), f i ∈ S ∨ (f i)⁻¹ ∈ S}.Finitethis:{l | l.length ≤ n ∧ ∀ s ∈ l, s ∈ S ∨ s⁻¹ ∈ S}.Finite⊢ (CayleyBall S n).Finite
exact (this.image List.prod).subset fun _ _ ↦ by G:Type u_1inst✝:Group GS:Set GhS:S.Finiten:ℕhu:(S ∪ (fun x ↦ x)⁻¹ '' S).Finitehf:∀ (m : ℕ), {f | ∀ (i : Fin m), f i ∈ S ∨ (f i)⁻¹ ∈ S}.Finitethis:{l | l.length ≤ n ∧ ∀ s ∈ l, s ∈ S ∨ s⁻¹ ∈ S}.Finitex✝¹:Gx✝:x✝¹ ∈ CayleyBall S n⊢ x✝¹ ∈ List.prod '' {l | l.length ≤ n ∧ ∀ s ∈ l, s ∈ S ∨ s⁻¹ ∈ S} aesop (add simp [CayleyBall]) All goals completed! 🐙
The GrowthFunction of a group G with respect to a set S counts the number of group
elements that can be reached by words of length at most n in S.
noncomputable def GrowthFunction (S : Set G) (n : ℕ) : ℕ :=
(CayleyBall S n).ncardtheorem growthFunction_zero (S : Set G) :
GrowthFunction S 0 = 1 := by G:Type u_1inst✝:Group GS:Set G⊢ GrowthFunction S 0 = 1
simp [GrowthFunction, CayleyBall] All goals completed! 🐙The identity is always in the Cayley ball.
lemma one_mem_cayleyBall (S : Set G) (n : ℕ) :
1 ∈ CayleyBall S n := by G:Type u_1inst✝:Group GS:Set Gn:ℕ⊢ 1 ∈ CayleyBall S n
simp only [CayleyBall, Set.mem_ofPred_eq] G:Type u_1inst✝:Group GS:Set Gn:ℕ⊢ ∃ l, l.length ≤ n ∧ (∀ s ∈ l, s ∈ S ∨ s⁻¹ ∈ S) ∧ l.prod = 1
use ∅ h G:Type u_1inst✝:Group GS:Set Gn:ℕ⊢ ∅.length ≤ n ∧ (∀ s ∈ ∅, s ∈ S ∨ s⁻¹ ∈ S) ∧ ∅.prod = 1
simp All goals completed! 🐙The Cayley ball is monotonic in its radius.
lemma cayleyBall_monotone (S : Set G) {m n : ℕ} (h : m ≤ n) :
CayleyBall S m ⊆ CayleyBall S n := by G:Type u_1inst✝:Group GS:Set Gm:ℕn:ℕh:m ≤ n⊢ CayleyBall S m ⊆ CayleyBall S n
simp only [CayleyBall, Set.ofPred_subset_ofPred, forall_exists_index, and_imp] G:Type u_1inst✝:Group GS:Set Gm:ℕn:ℕh:m ≤ n⊢ ∀ (a : G) (x : List G),
x.length ≤ m → (∀ s ∈ x, s ∈ S ∨ s⁻¹ ∈ S) → x.prod = a → ∃ l, l.length ≤ n ∧ (∀ s ∈ l, s ∈ S ∨ s⁻¹ ∈ S) ∧ l.prod = a
exact fun g l lLength LSubS lProdG ↦ ⟨l, by G:Type u_1inst✝:Group GS:Set Gm:ℕn:ℕh:m ≤ ng:Gl:List GlLength:l.length ≤ mLSubS:∀ s ∈ l, s ∈ S ∨ s⁻¹ ∈ SlProdG:l.prod = g⊢ l.length ≤ n linarith All goals completed! 🐙, LSubS, lProdG⟩
Closure property: if g ∈ CayleyBall S m and h ∈ CayleyBall S n, then
g * h ∈ CayleyBall S (m + n).
lemma cayleyBall_mul (S : Set G) {g h : G} {m n : ℕ}
(hg : g ∈ CayleyBall S m) (hh : h ∈ CayleyBall S n) :
g * h ∈ CayleyBall S (m + n) := by G:Type u_1inst✝:Group GS:Set Gg:Gh:Gm:ℕn:ℕhg:g ∈ CayleyBall S mhh:h ∈ CayleyBall S n⊢ g * h ∈ CayleyBall S (m + n)
simp only [CayleyBall, Set.mem_ofPred_eq] at hg hh ⊢ G:Type u_1inst✝:Group GS:Set Gg:Gh:Gm:ℕn:ℕhg:∃ l, l.length ≤ m ∧ (∀ s ∈ l, s ∈ S ∨ s⁻¹ ∈ S) ∧ l.prod = ghh:∃ l, l.length ≤ n ∧ (∀ s ∈ l, s ∈ S ∨ s⁻¹ ∈ S) ∧ l.prod = h⊢ ∃ l, l.length ≤ m + n ∧ (∀ s ∈ l, s ∈ S ∨ s⁻¹ ∈ S) ∧ l.prod = g * h
obtain ⟨lg, lgLength, lgSubS, lgProd⟩ := hg G:Type u_1inst✝:Group GS:Set Gg:Gh:Gm:ℕn:ℕhh:∃ l, l.length ≤ n ∧ (∀ s ∈ l, s ∈ S ∨ s⁻¹ ∈ S) ∧ l.prod = hlg:List GlgLength:lg.length ≤ mlgSubS:∀ s ∈ lg, s ∈ S ∨ s⁻¹ ∈ SlgProd:lg.prod = g⊢ ∃ l, l.length ≤ m + n ∧ (∀ s ∈ l, s ∈ S ∨ s⁻¹ ∈ S) ∧ l.prod = g * h
obtain ⟨lh, lhLength, lhSubS, lhProd⟩ := hh G:Type u_1inst✝:Group GS:Set Gg:Gh:Gm:ℕn:ℕlg:List GlgLength:lg.length ≤ mlgSubS:∀ s ∈ lg, s ∈ S ∨ s⁻¹ ∈ SlgProd:lg.prod = glh:List GlhLength:lh.length ≤ nlhSubS:∀ s ∈ lh, s ∈ S ∨ s⁻¹ ∈ SlhProd:lh.prod = h⊢ ∃ l, l.length ≤ m + n ∧ (∀ s ∈ l, s ∈ S ∨ s⁻¹ ∈ S) ∧ l.prod = g * h
refine ⟨lg ++ lh, ?_, ?_, by G:Type u_1inst✝:Group GS:Set Gg:Gh:Gm:ℕn:ℕlg:List GlgLength:lg.length ≤ mlgSubS:∀ s ∈ lg, s ∈ S ∨ s⁻¹ ∈ SlgProd:lg.prod = glh:List GlhLength:lh.length ≤ nlhSubS:∀ s ∈ lh, s ∈ S ∨ s⁻¹ ∈ SlhProd:lh.prod = h⊢ (lg ++ lh).prod = g * h simp [lhProd, lgProd] All goals completed! 🐙⟩
· refine_1 G:Type u_1inst✝:Group GS:Set Gg:Gh:Gm:ℕn:ℕlg:List GlgLength:lg.length ≤ mlgSubS:∀ s ∈ lg, s ∈ S ∨ s⁻¹ ∈ SlgProd:lg.prod = glh:List GlhLength:lh.length ≤ nlhSubS:∀ s ∈ lh, s ∈ S ∨ s⁻¹ ∈ SlhProd:lh.prod = h⊢ (lg ++ lh).length ≤ m + n simp only [List.length_append] refine_1 G:Type u_1inst✝:Group GS:Set Gg:Gh:Gm:ℕn:ℕlg:List GlgLength:lg.length ≤ mlgSubS:∀ s ∈ lg, s ∈ S ∨ s⁻¹ ∈ SlgProd:lg.prod = glh:List GlhLength:lh.length ≤ nlhSubS:∀ s ∈ lh, s ∈ S ∨ s⁻¹ ∈ SlhProd:lh.prod = h⊢ lg.length + lh.length ≤ m + n
linarith All goals completed! 🐙
· refine_2 G:Type u_1inst✝:Group GS:Set Gg:Gh:Gm:ℕn:ℕlg:List GlgLength:lg.length ≤ mlgSubS:∀ s ∈ lg, s ∈ S ∨ s⁻¹ ∈ SlgProd:lg.prod = glh:List GlhLength:lh.length ≤ nlhSubS:∀ s ∈ lh, s ∈ S ∨ s⁻¹ ∈ SlhProd:lh.prod = h⊢ ∀ s ∈ lg ++ lh, s ∈ S ∨ s⁻¹ ∈ S intro s sIn refine_2 G:Type u_1inst✝:Group GS:Set Gg:Gh:Gm:ℕn:ℕlg:List GlgLength:lg.length ≤ mlgSubS:∀ s ∈ lg, s ∈ S ∨ s⁻¹ ∈ SlgProd:lg.prod = glh:List GlhLength:lh.length ≤ nlhSubS:∀ s ∈ lh, s ∈ S ∨ s⁻¹ ∈ SlhProd:lh.prod = hs:GsIn:s ∈ lg ++ lh⊢ s ∈ S ∨ s⁻¹ ∈ S
simp only [List.mem_append] at sIn refine_2 G:Type u_1inst✝:Group GS:Set Gg:Gh:Gm:ℕn:ℕlg:List GlgLength:lg.length ≤ mlgSubS:∀ s ∈ lg, s ∈ S ∨ s⁻¹ ∈ SlgProd:lg.prod = glh:List GlhLength:lh.length ≤ nlhSubS:∀ s ∈ lh, s ∈ S ∨ s⁻¹ ∈ SlhProd:lh.prod = hs:GsIn:s ∈ lg ∨ s ∈ lh⊢ s ∈ S ∨ s⁻¹ ∈ S
cases sIn with
| inl h => refine_2.inl G:Type u_1inst✝:Group GS:Set Gg:Gh✝:Gm:ℕn:ℕlg:List GlgLength:lg.length ≤ mlgSubS:∀ s ∈ lg, s ∈ S ∨ s⁻¹ ∈ SlgProd:lg.prod = glh:List GlhLength:lh.length ≤ nlhSubS:∀ s ∈ lh, s ∈ S ∨ s⁻¹ ∈ SlhProd:lh.prod = hs:Gh:s ∈ lg⊢ s ∈ S ∨ s⁻¹ ∈ S simp [lgSubS s h] All goals completed! 🐙
| inr h => refine_2.inr G:Type u_1inst✝:Group GS:Set Gg:Gh✝:Gm:ℕn:ℕlg:List GlgLength:lg.length ≤ mlgSubS:∀ s ∈ lg, s ∈ S ∨ s⁻¹ ∈ SlgProd:lg.prod = glh:List GlhLength:lh.length ≤ nlhSubS:∀ s ∈ lh, s ∈ S ∨ s⁻¹ ∈ SlhProd:lh.prod = hs:Gh:s ∈ lh⊢ s ∈ S ∨ s⁻¹ ∈ S simp [lhSubS s h] All goals completed! 🐙
If g ∈ CayleyBall S n, then g⁻¹ ∈ CayleyBall S n.
lemma cayleyBall_inv (S : Set G) {g : G} {n : ℕ}
(hg : g ∈ CayleyBall S n) :
g⁻¹ ∈ CayleyBall S n := by G:Type u_1inst✝:Group GS:Set Gg:Gn:ℕhg:g ∈ CayleyBall S n⊢ g⁻¹ ∈ CayleyBall S n
simp only [CayleyBall, Set.mem_ofPred_eq] at hg ⊢ G:Type u_1inst✝:Group GS:Set Gg:Gn:ℕhg:∃ l, l.length ≤ n ∧ (∀ s ∈ l, s ∈ S ∨ s⁻¹ ∈ S) ∧ l.prod = g⊢ ∃ l, l.length ≤ n ∧ (∀ s ∈ l, s ∈ S ∨ s⁻¹ ∈ S) ∧ l.prod = g⁻¹
obtain ⟨lg, lgLength, lgSubS, lgProd⟩ := hg G:Type u_1inst✝:Group GS:Set Gg:Gn:ℕlg:List GlgLength:lg.length ≤ nlgSubS:∀ s ∈ lg, s ∈ S ∨ s⁻¹ ∈ SlgProd:lg.prod = g⊢ ∃ l, l.length ≤ n ∧ (∀ s ∈ l, s ∈ S ∨ s⁻¹ ∈ S) ∧ l.prod = g⁻¹
refine ⟨lg.reverse.map (·⁻¹), by G:Type u_1inst✝:Group GS:Set Gg:Gn:ℕlg:List GlgLength:lg.length ≤ nlgSubS:∀ s ∈ lg, s ∈ S ∨ s⁻¹ ∈ SlgProd:lg.prod = g⊢ (List.map (fun x ↦ x⁻¹) lg.reverse).length ≤ n simp [lgLength] All goals completed! 🐙, ?_,
by G:Type u_1inst✝:Group GS:Set Gg:Gn:ℕlg:List GlgLength:lg.length ≤ nlgSubS:∀ s ∈ lg, s ∈ S ∨ s⁻¹ ∈ SlgProd:lg.prod = g⊢ (List.map (fun x ↦ x⁻¹) lg.reverse).prod = g⁻¹ simp [List.prod_inv_reverse, lgProd.symm] All goals completed! 🐙⟩
intro s sIn G:Type u_1inst✝:Group GS:Set Gg:Gn:ℕlg:List GlgLength:lg.length ≤ nlgSubS:∀ s ∈ lg, s ∈ S ∨ s⁻¹ ∈ SlgProd:lg.prod = gs:GsIn:s ∈ List.map (fun x ↦ x⁻¹) lg.reverse⊢ s ∈ S ∨ s⁻¹ ∈ S
simp only [List.map_reverse, List.mem_reverse, List.mem_map, inv_involutive,
Function.Involutive.exists_mem_and_apply_eq_iff] at sIn G:Type u_1inst✝:Group GS:Set Gg:Gn:ℕlg:List GlgLength:lg.length ≤ nlgSubS:∀ s ∈ lg, s ∈ S ∨ s⁻¹ ∈ SlgProd:lg.prod = gs:GsIn:s⁻¹ ∈ lg⊢ s ∈ S ∨ s⁻¹ ∈ S
have := lgSubS s⁻¹ sIn G:Type u_1inst✝:Group GS:Set Gg:Gn:ℕlg:List GlgLength:lg.length ≤ nlgSubS:∀ s ∈ lg, s ∈ S ∨ s⁻¹ ∈ SlgProd:lg.prod = gs:GsIn:s⁻¹ ∈ lgthis:s⁻¹ ∈ S ∨ s⁻¹⁻¹ ∈ S⊢ s ∈ S ∨ s⁻¹ ∈ S
simp only [inv_inv] at this G:Type u_1inst✝:Group GS:Set Gg:Gn:ℕlg:List GlgLength:lg.length ≤ nlgSubS:∀ s ∈ lg, s ∈ S ∨ s⁻¹ ∈ SlgProd:lg.prod = gs:GsIn:s⁻¹ ∈ lgthis:s⁻¹ ∈ S ∨ s ∈ S⊢ s ∈ S ∨ s⁻¹ ∈ S
exact this.symm All goals completed! 🐙lemma mem_cayleyBall_one_of_mem {S : Set G} {g : G} (hg : g ∈ S) : g ∈ CayleyBall S 1 :=
⟨[g], by G:Type u_1inst✝:Group GS:Set Gg:Ghg:g ∈ S⊢ [g].length ≤ 1 ∧ (∀ s ∈ [g], s ∈ S ∨ s⁻¹ ∈ S) ∧ [g].prod = g simp_all All goals completed! 🐙⟩lemma exists_cayleyBall_mem_of_closure_eq_top {S : Set G} (h : Subgroup.closure S = ⊤) (g : G) :
∃ n, g ∈ CayleyBall S n := by G:Type u_1inst✝:Group GS:Set Gh:Subgroup.closure S = ⊤g:G⊢ ∃ n, g ∈ CayleyBall S n
induction h ▸ Subgroup.mem_top g using Subgroup.closure_induction with
| mem => mem G:Type u_1inst✝:Group GS:Set Gh:Subgroup.closure S = ⊤g:Gx✝:Ghx✝:x✝ ∈ S⊢ ∃ n, x✝ ∈ CayleyBall S n exact ⟨1, mem_cayleyBall_one_of_mem ‹_›⟩ All goals completed! 🐙
| one => one G:Type u_1inst✝:Group GS:Set Gh:Subgroup.closure S = ⊤g:G⊢ ∃ n, 1 ∈ CayleyBall S n exact ⟨0, one_mem_cayleyBall ..⟩ All goals completed! 🐙
| mul _ _ _ _ hg₁ hg₂ => mul G:Type u_1inst✝:Group GS:Set Gh:Subgroup.closure S = ⊤g:Gx✝:Gy✝:Ghx✝:x✝ ∈ Subgroup.closure Shy✝:y✝ ∈ Subgroup.closure Shg₁:∃ n, x✝ ∈ CayleyBall S nhg₂:∃ n, y✝ ∈ CayleyBall S n⊢ ∃ n, x✝ * y✝ ∈ CayleyBall S n
obtain ⟨n₁, hn₁⟩ := hg₁ mul G:Type u_1inst✝:Group GS:Set Gh:Subgroup.closure S = ⊤g:Gx✝:Gy✝:Ghx✝:x✝ ∈ Subgroup.closure Shy✝:y✝ ∈ Subgroup.closure Shg₂:∃ n, y✝ ∈ CayleyBall S nn₁:ℕhn₁:x✝ ∈ CayleyBall S n₁⊢ ∃ n, x✝ * y✝ ∈ CayleyBall S n
obtain ⟨n₂, hn₂⟩ := hg₂ mul G:Type u_1inst✝:Group GS:Set Gh:Subgroup.closure S = ⊤g:Gx✝:Gy✝:Ghx✝:x✝ ∈ Subgroup.closure Shy✝:y✝ ∈ Subgroup.closure Sn₁:ℕhn₁:x✝ ∈ CayleyBall S n₁n₂:ℕhn₂:y✝ ∈ CayleyBall S n₂⊢ ∃ n, x✝ * y✝ ∈ CayleyBall S n
exact ⟨n₁ + n₂, cayleyBall_mul S hn₁ hn₂⟩ All goals completed! 🐙
| inv _ _ hg => inv G:Type u_1inst✝:Group GS:Set Gh:Subgroup.closure S = ⊤g:Gx✝:Ghx✝:x✝ ∈ Subgroup.closure Shg:∃ n, x✝ ∈ CayleyBall S n⊢ ∃ n, x✝⁻¹ ∈ CayleyBall S n
obtain ⟨n, hn⟩ := hg inv G:Type u_1inst✝:Group GS:Set Gh:Subgroup.closure S = ⊤g:Gx✝:Ghx✝:x✝ ∈ Subgroup.closure Sn:ℕhn:x✝ ∈ CayleyBall S n⊢ ∃ n, x✝⁻¹ ∈ CayleyBall S n
exact ⟨n, cayleyBall_inv S hn⟩ All goals completed! 🐙In an infinite group, the growth function with respect to a finite generating set is unbounded.
theorem tendsto_atTop_growthFunction_of_infinite [Infinite G] {S : Set G} (hS : S.Finite)
(h : Subgroup.closure S = ⊤) : atTop.Tendsto (GrowthFunction S) atTop := by G:Type u_1inst✝¹:Group Ginst✝:Infinite GS:Set GhS:S.Finiteh:Subgroup.closure S = ⊤⊢ Tendsto (GrowthFunction S) atTop atTop
delta GrowthFunction G:Type u_1inst✝¹:Group Ginst✝:Infinite GS:Set GhS:S.Finiteh:Subgroup.closure S = ⊤⊢ Tendsto (fun n ↦ (CayleyBall S n).ncard) atTop atTop
have (n : ℕ) : Fintype (CayleyBall S n) := (cayleyBall_finite hS n).fintype G:Type u_1inst✝¹:Group Ginst✝:Infinite GS:Set GhS:S.Finiteh:Subgroup.closure S = ⊤this:(n : ℕ) → Fintype ↑(CayleyBall S n)⊢ Tendsto (fun n ↦ (CayleyBall S n).ncard) atTop atTop
apply ((Finset.tendsto_card_atTop).comp (f := fun n ↦ (CayleyBall S n).toFinset) ?_).congr
(by G:Type u_1inst✝¹:Group Ginst✝:Infinite GS:Set GhS:S.Finiteh:Subgroup.closure S = ⊤this:(n : ℕ) → Fintype ↑(CayleyBall S n)⊢ ∀ (x : ℕ), (Finset.card ∘ fun n ↦ (CayleyBall S n).toFinset) x = (CayleyBall S x).ncard simp All goals completed! 🐙)
apply tendsto_atTop_atTop_of_monotone fun _ _ ↦ by G:Type u_1inst✝¹:Group Ginst✝:Infinite GS:Set GhS:S.Finiteh:Subgroup.closure S = ⊤this:(n : ℕ) → Fintype ↑(CayleyBall S n)x✝¹:ℕx✝:ℕ⊢ x✝¹ ≤ x✝ → (CayleyBall S x✝¹).toFinset ⊆ (CayleyBall S x✝).toFinset simpa using cayleyBall_monotone S All goals completed! 🐙
intro A G:Type u_1inst✝¹:Group Ginst✝:Infinite GS:Set GhS:S.Finiteh:Subgroup.closure S = ⊤this:(n : ℕ) → Fintype ↑(CayleyBall S n)A:Finset G⊢ ∃ a, A ⊆ (CayleyBall S a).toFinset
obtain rfl | hA := A.eq_empty_or_nonempty inl G:Type u_1inst✝¹:Group Ginst✝:Infinite GS:Set GhS:S.Finiteh:Subgroup.closure S = ⊤this:(n : ℕ) → Fintype ↑(CayleyBall S n)⊢ ∃ a, ∅ ⊆ (CayleyBall S a).toFinsetinr G:Type u_1inst✝¹:Group Ginst✝:Infinite GS:Set GhS:S.Finiteh:Subgroup.closure S = ⊤this:(n : ℕ) → Fintype ↑(CayleyBall S n)A:Finset GhA:A.Nonempty⊢ ∃ a, A ⊆ (CayleyBall S a).toFinset
· inl G:Type u_1inst✝¹:Group Ginst✝:Infinite GS:Set GhS:S.Finiteh:Subgroup.closure S = ⊤this:(n : ℕ) → Fintype ↑(CayleyBall S n)⊢ ∃ a, ∅ ⊆ (CayleyBall S a).toFinset aesop All goals completed! 🐙
· inr G:Type u_1inst✝¹:Group Ginst✝:Infinite GS:Set GhS:S.Finiteh:Subgroup.closure S = ⊤this:(n : ℕ) → Fintype ↑(CayleyBall S n)A:Finset GhA:A.Nonempty⊢ ∃ a, A ⊆ (CayleyBall S a).toFinset choose n hn using fun (a : A) ↦ exists_cayleyBall_mem_of_closure_eq_top h a inr G:Type u_1inst✝¹:Group Ginst✝:Infinite GS:Set GhS:S.Finiteh:Subgroup.closure S = ⊤this:(n : ℕ) → Fintype ↑(CayleyBall S n)A:Finset GhA:A.Nonemptyn:↥A → ℕhn:∀ (a : ↥A), ↑a ∈ CayleyBall S (n a)⊢ ∃ a, A ⊆ (CayleyBall S a).toFinset
let N : ℕ := (Set.range n).toFinset.max' (by G:Type u_1inst✝¹:Group Ginst✝:Infinite GS:Set GhS:S.Finiteh:Subgroup.closure S = ⊤this:(n : ℕ) → Fintype ↑(CayleyBall S n)A:Finset GhA:A.Nonemptyn:↥A → ℕhn:∀ (a : ↥A), ↑a ∈ CayleyBall S (n a)⊢ (Set.range n).toFinset.Nonempty inr G:Type u_1inst✝¹:Group Ginst✝:Infinite GS:Set GhS:S.Finiteh:Subgroup.closure S = ⊤this:(n : ℕ) → Fintype ↑(CayleyBall S n)A:Finset GhA:A.Nonemptyn:↥A → ℕhn:∀ (a : ↥A), ↑a ∈ CayleyBall S (n a)N:ℕ := (Set.range n).toFinset.max' ⋯⊢ ∃ a, A ⊆ (CayleyBall S a).toFinset simp [hA] All goals completed! 🐙 inr G:Type u_1inst✝¹:Group Ginst✝:Infinite GS:Set GhS:S.Finiteh:Subgroup.closure S = ⊤this:(n : ℕ) → Fintype ↑(CayleyBall S n)A:Finset GhA:A.Nonemptyn:↥A → ℕhn:∀ (a : ↥A), ↑a ∈ CayleyBall S (n a)N:ℕ := (Set.range n).toFinset.max' ⋯⊢ ∃ a, A ⊆ (CayleyBall S a).toFinset)inr G:Type u_1inst✝¹:Group Ginst✝:Infinite GS:Set GhS:S.Finiteh:Subgroup.closure S = ⊤this:(n : ℕ) → Fintype ↑(CayleyBall S n)A:Finset GhA:A.Nonemptyn:↥A → ℕhn:∀ (a : ↥A), ↑a ∈ CayleyBall S (n a)N:ℕ := (Set.range n).toFinset.max' ⋯⊢ ∃ a, A ⊆ (CayleyBall S a).toFinset
refine ⟨N, fun a ha ↦ ?_⟩ inr G:Type u_1inst✝¹:Group Ginst✝:Infinite GS:Set GhS:S.Finiteh:Subgroup.closure S = ⊤this:(n : ℕ) → Fintype ↑(CayleyBall S n)A:Finset GhA:A.Nonemptyn:↥A → ℕhn:∀ (a : ↥A), ↑a ∈ CayleyBall S (n a)N:ℕ := (Set.range n).toFinset.max' ⋯a:Gha:a ∈ A⊢ a ∈ (CayleyBall S N).toFinset
simpa using cayleyBall_monotone S (Finset.le_max' _ _ (by G:Type u_1inst✝¹:Group Ginst✝:Infinite GS:Set GhS:S.Finiteh:Subgroup.closure S = ⊤this:(n : ℕ) → Fintype ↑(CayleyBall S n)A:Finset GhA:A.Nonemptyn:↥A → ℕhn:∀ (a : ↥A), ↑a ∈ CayleyBall S (n a)N:ℕ := (Set.range n).toFinset.max' ⋯a:Gha:a ∈ A⊢ n ⟨a, ha⟩ ∈ (Set.range n).toFinset aesop All goals completed! 🐙)) (hn ⟨a, ha⟩)A group has polynomial growth if there exists a finite generating set whose growth function is bounded above by a polynomial.
def HasPolynomialGrowth (G : Type*) [Group G] : Prop :=
∃ (S : Set G), Set.Finite S ∧ Subgroup.closure S = ⊤ ∧
∃ (C : ℝ) (d : ℕ), C > 0 ∧
∀ n > 0, (GrowthFunction S n : ℝ) ≤ C * (n : ℝ) ^ dA group has superpolynomial growth if there exists a finite generating set whose growth function eventually dominates every polynomial in the growth-function preorder, up to linearly rescaling the radius.
def HasSuperPolynomialGrowth (G : Type*) [Group G] : Prop :=
∃ (S : Set G), Set.Finite S ∧ Subgroup.closure S = ⊤ ∧
∀ d : ℕ, ∃ C : ℕ, 0 < C ∧
∀ᶠ n : ℕ in atTop, (n : ℝ) ^ d ≤ (GrowthFunction S (C * n) : ℝ)end GromovPolynomialGrowth