Skip to content

Commit 6a82b21

Browse files
committed
Bump mathlib
1 parent 2881248 commit 6a82b21

File tree

8 files changed

+167
-155
lines changed

8 files changed

+167
-155
lines changed

LeanCamCombi.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import LeanCamCombi.Kneser.KneserRuzsa
2424
import LeanCamCombi.Kneser.MulStab
2525
import LeanCamCombi.LittlewoodOfford
2626
import LeanCamCombi.Mathlib.Algebra.Group.Pointwise.Finset.Basic
27+
import LeanCamCombi.Mathlib.Algebra.Group.Subgroup.Pointwise
2728
import LeanCamCombi.Mathlib.Analysis.Convex.Exposed
2829
import LeanCamCombi.Mathlib.Analysis.Convex.Extreme
2930
import LeanCamCombi.Mathlib.Analysis.Convex.Independence
@@ -37,11 +38,13 @@ import LeanCamCombi.Mathlib.Combinatorics.SimpleGraph.Density
3738
import LeanCamCombi.Mathlib.Combinatorics.SimpleGraph.Maps
3839
import LeanCamCombi.Mathlib.Combinatorics.SimpleGraph.Multipartite
3940
import LeanCamCombi.Mathlib.Combinatorics.SimpleGraph.Subgraph
41+
import LeanCamCombi.Mathlib.Data.Finset.Basic
4042
import LeanCamCombi.Mathlib.Data.Finset.PosDiffs
4143
import LeanCamCombi.Mathlib.Data.List.DropRight
4244
import LeanCamCombi.Mathlib.Data.Multiset.Basic
4345
import LeanCamCombi.Mathlib.Data.Prod.Lex
4446
import LeanCamCombi.Mathlib.Data.Set.Image
47+
import LeanCamCombi.Mathlib.Data.Set.Lattice
4548
import LeanCamCombi.Mathlib.Data.Set.Pointwise.Finite
4649
import LeanCamCombi.Mathlib.Data.Set.Pointwise.SMul
4750
import LeanCamCombi.Mathlib.GroupTheory.OrderOfElement

LeanCamCombi/GrowthInGroups/Chevalley.lean

Lines changed: 102 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,8 @@ open Polynomial TensorProduct PrimeSpectrum
1010
abbrev Ideal.ResidueField (I : Ideal R) [I.IsPrime] : Type _ :=
1111
LocalRing.ResidueField (Localization.AtPrime I)
1212

13-
lemma LocalRing.residue_surjective {R} [CommRing R] [LocalRing R] :
14-
Function.Surjective (LocalRing.residue R) :=
15-
Ideal.Quotient.mk_surjective
16-
1713
instance {R S} [CommRing R] [CommRing S] [LocalRing S] [Algebra R S] :
18-
Algebra R (LocalRing.ResidueField S) := by delta LocalRing.ResidueField; infer_instance
14+
Algebra R (LocalRing.ResidueField S) := by infer_instance
1915

2016
@[simp]
2117
lemma LocalRing.algebraMap_residueField {R} [CommRing R] [LocalRing R] :
@@ -54,8 +50,6 @@ lemma Ideal.ker_algebraMap_residueField (I : Ideal R) [I.IsPrime] :
5450
ext x
5551
exact Ideal.algebraMap_residueField_eq_zero
5652

57-
58-
-- set_option
5953
-- set_option synthInstance.maxHeartbeats 400000 in
6054
-- noncomputable
6155
-- instance (g : R[X]) (x : Ideal R) [x.IsPrime] :
@@ -73,7 +67,7 @@ def fooBarMap (s : Set A) (I : Ideal A) (hg : s ⊆ I) [I.IsPrime] :
7367
· exact fun _ _ ↦ .all _ _
7468

7569
-- set_option synthInstance.maxHeartbeats 400000 in
76-
-- -- set_option maxHeartbeats 0 in
70+
-- set_option maxHeartbeats 0 in
7771
lemma mem_image_comap_zeroLocus_sdiff (f : A) (s : Set A) (x) :
7872
x ∈ comap (algebraMap R A) '' (zeroLocus s \ zeroLocus {f}) ↔
7973
¬ IsNilpotent (algebraMap A ((A ⧸ Ideal.span s) ⊗[R] x.asIdeal.ResidueField) f) := by
@@ -122,7 +116,6 @@ lemma mem_image_comap_basicOpen_iff_map_ne_zero (f : R[X]) (x : PrimeSpectrum R)
122116
· ext; simp [e]
123117
· simp [e, monomial_one_one_eq_X]
124118

125-
126119
lemma image_comap_C_basicOpen (f : R[X]) :
127120
comap C '' basicOpen f = (zeroLocus (Set.range f.coeff))ᶜ := by
128121
ext p
@@ -139,13 +132,6 @@ lemma isOpenMap_comap_C : IsOpenMap (comap (R := R) C) := by
139132
simp only [image_comap_C_basicOpen]
140133
exact (isClosed_zeroLocus _).isOpen_compl
141134

142-
143-
open Module in
144-
lemma LinearMap.nilpotent_iff_charpoly {R M} [CommRing R] [IsDomain R] [AddCommGroup M]
145-
[Module R M] [Free R M] [IsNoetherian R M] (φ : End R M) :
146-
IsNilpotent φ ↔ charpoly φ = X ^ finrank R M :=
147-
(LinearMap.charpoly_nilpotent_tfae φ).out 0 1
148-
149135
lemma LinearMap.charpoly_baseChange {R M} [CommRing R] [AddCommGroup M] [Module R M]
150136
[Module.Free R M] [Module.Finite R M]
151137
{A} [CommRing A] [Algebra R A] (f : M →ₗ[R] M) :
@@ -179,7 +165,7 @@ lemma isNilpotent_tensor_residueField_iff
179165
simp only [Algebra.TensorProduct.algebraMap_apply, Algebra.id.map_eq_id, RingHom.id_apply,
180166
Algebra.coe_lmul_eq_mul, Algebra.TensorProduct.comm_tmul]
181167
rw [← IsNilpotent.map_iff (Algebra.lmul_injective (R := I.ResidueField)),
182-
LinearMap.nilpotent_iff_charpoly, ← Algebra.baseChange_lmul, LinearMap.charpoly_baseChange]
168+
LinearMap.isNilpotent_iff_charpoly, ← Algebra.baseChange_lmul, LinearMap.charpoly_baseChange]
183169
simp_rw [this, ← ((LinearMap.mul R A) f).charpoly_natDegree]
184170
constructor
185171
· intro e i hi
@@ -290,107 +276,107 @@ lemma foo_induction
290276
(degree ∘ e, ¬ ∃ i, IsUnit (e i).leadingCoeff ∧ ∀ j, e j ≠ 0
291277
(e i).degree ≤ (e j).degree) with hv
292278
clear_value v
293-
induction v using wellFounded_lt (α := (Fin (n + 1) → WithBot ℕ) ×ₗ Prop).induction generalizing R with
294-
| h v H_IH =>
295-
by_cases he0 : e = 0
296-
· rw [he0, Set.range_zero, Ideal.span_singleton_zero]; exact hP₁ R
297-
cases subsingleton_or_nontrivial R
298-
· rw [Subsingleton.elim (Ideal.span (Set.range e)) ⊥]; exact hP₁ R
299-
simp only [funext_iff, Pi.zero_apply, not_forall] at he0
300-
-- Case I : The `e i ≠ 0` with minimal degree has invertible leading coefficient
301-
by_cases H : ∃ i, IsUnit (e i).leadingCoeff ∧ ∀ j, e j ≠ 0 → (e i).degree ≤ (e j).degree
302-
· obtain ⟨i, hi, i_min⟩ := H
303-
-- Case I.ii : `e j = 0` for all `j ≠ i`.
304-
by_cases H' : ∀ j ≠ i, e j = 0
305-
-- then `I = Ideal.span {e i}`
306-
· convert hP₀ R (C ((hi.unit⁻¹ : Rˣ) : R) * e i) ?_ using 1
307-
· refine le_antisymm ?_ ?_ <;>
308-
simp only [Ideal.span_le, Set.range_subset_iff, Set.singleton_subset_iff]
309-
· intro j
310-
by_cases hij : i = j
311-
· simp only [SetLike.mem_coe, Ideal.mem_span_singleton]
312-
use C (e i).leadingCoeff
313-
rw [mul_comm, ← mul_assoc, ← map_mul, IsUnit.mul_val_inv, map_one, one_mul, hij]
314-
· rw [H' j (.symm hij)]
315-
exact Ideal.zero_mem _
316-
· exact Ideal.mul_mem_left _ _ (Ideal.subset_span (Set.mem_range_self i))
317-
exact Polynomial.monic_unit_leadingCoeff_inv_smul _ _
318-
-- Case I.i : There is another `e j ≠ 0`
319-
· simp only [ne_eq, not_forall, Classical.not_imp] at H'
320-
obtain ⟨j, hj, hj'⟩ := H'
321-
replace i_min := i_min j hj'
322-
-- then we can replace `e j` with `e j %ₘ (C h.unit⁻¹ * e i) `
323-
-- with `h : IsUnit (e i).leadingCoeff`.
324-
rw [← Ideal.span_range_update_divByMonic e i j (.symm hj) hi]
325-
refine H_IH _ ?_ _ rfl
326-
refine .left _ _ (lt_of_le_of_ne (b := (ofLex v).1) ?_ ?_)
327-
· intro k
328-
simp only [Function.comp_apply, Function.update_apply, hv, ne_eq, not_exists, not_and,
329-
not_forall, Classical.not_imp, not_le, ofLex_toLex]
330-
split_ifs with hjk
331-
· rw [hjk]
332-
refine (degree_modByMonic_le _
333-
(monic_unit_leadingCoeff_inv_smul _ _)).trans
334-
((degree_C_mul_eq_of_mul_ne_zero _ _ ?_).trans_le i_min)
335-
rw [IsUnit.val_inv_mul]
336-
exact one_ne_zero
337-
· exact le_rfl
338-
· simp only [hv, ne_eq, not_exists, not_and, not_forall, not_le, funext_iff,
339-
Function.comp_apply, exists_prop, ofLex_toLex]
340-
use j
341-
simp only [Function.update_same]
342-
refine ((degree_modByMonic_lt _ (monic_unit_leadingCoeff_inv_smul _ _)).trans_le
343-
((degree_C_mul_eq_of_mul_ne_zero _ _ ?_).trans_le i_min)).ne
279+
induction' v using WellFoundedLT.induction with v H_IH generalizing R
280+
by_cases he0 : e = 0
281+
· rw [he0, Set.range_zero, Ideal.span_singleton_zero]; exact hP₁ R
282+
cases subsingleton_or_nontrivial R
283+
· rw [Subsingleton.elim (Ideal.span (Set.range e)) ⊥]; exact hP₁ R
284+
simp only [funext_iff, Pi.zero_apply, not_forall] at he0
285+
-- Case I : The `e i ≠ 0` with minimal degree has invertible leading coefficient
286+
by_cases H : ∃ i, IsUnit (e i).leadingCoeff ∧ ∀ j, e j ≠ 0 → (e i).degree ≤ (e j).degree
287+
· obtain ⟨i, hi, i_min⟩ := H
288+
-- Case I.ii : `e j = 0` for all `j ≠ i`.
289+
by_cases H' : ∀ j ≠ i, e j = 0
290+
-- then `I = Ideal.span {e i}`
291+
· convert hP₀ R (C ((hi.unit⁻¹ : Rˣ) : R) * e i) ?_ using 1
292+
· refine le_antisymm ?_ ?_ <;>
293+
simp only [Ideal.span_le, Set.range_subset_iff, Set.singleton_subset_iff]
294+
· intro j
295+
by_cases hij : i = j
296+
· simp only [SetLike.mem_coe, Ideal.mem_span_singleton]
297+
use C (e i).leadingCoeff
298+
rw [mul_comm, ← mul_assoc, ← map_mul, IsUnit.mul_val_inv, map_one, one_mul, hij]
299+
· rw [H' j (.symm hij)]
300+
exact Ideal.zero_mem _
301+
· exact Ideal.mul_mem_left _ _ (Ideal.subset_span (Set.mem_range_self i))
302+
exact Polynomial.monic_unit_leadingCoeff_inv_smul _ _
303+
-- Case I.i : There is another `e j ≠ 0`
304+
· simp only [ne_eq, not_forall, Classical.not_imp] at H'
305+
obtain ⟨j, hj, hj'⟩ := H'
306+
replace i_min := i_min j hj'
307+
-- then we can replace `e j` with `e j %ₘ (C h.unit⁻¹ * e i) `
308+
-- with `h : IsUnit (e i).leadingCoeff`.
309+
rw [← Ideal.span_range_update_divByMonic e i j (.symm hj) hi]
310+
refine H_IH _ ?_ _ rfl
311+
refine .left _ _ (lt_of_le_of_ne (b := (ofLex v).1) ?_ ?_)
312+
· intro k
313+
simp only [Function.comp_apply, Function.update_apply, hv, ne_eq, not_exists, not_and,
314+
not_forall, Classical.not_imp, not_le, ofLex_toLex]
315+
split_ifs with hjk
316+
· rw [hjk]
317+
refine (degree_modByMonic_le _
318+
(monic_unit_leadingCoeff_inv_smul _ _)).trans
319+
((degree_C_mul_eq_of_mul_ne_zero _ _ ?_).trans_le i_min)
344320
rw [IsUnit.val_inv_mul]
345321
exact one_ne_zero
346-
-- Case II : The `e i ≠ 0` with minimal degree has non-invertible leading coefficient
347-
obtain ⟨i, hi, i_min⟩ : ∃ i, e i ≠ 0 ∧ ∀ j, e j ≠ 0 → (e i).degree ≤ (e j).degree := by
348-
have : ∃ n : ℕ, ∃ i, (e i).degree = n ∧ (e i) ≠ 0 := by
349-
obtain ⟨i, hi⟩ := he0; exact ⟨(e i).natDegree, i, degree_eq_natDegree hi, hi⟩
350-
let m := Nat.find this
351-
obtain ⟨i, hi, hi'⟩ : ∃ i, (e i).degree = m ∧ (e i) ≠ 0 := Nat.find_spec this
352-
refine ⟨i, hi', fun j hj ↦ ?_⟩
353-
refine hi.le.trans ?_
354-
rw [degree_eq_natDegree hj, Nat.cast_le]
355-
exact Nat.find_min' _ ⟨j, degree_eq_natDegree hj, hj⟩
356-
have : ¬ IsUnit (e i).leadingCoeff := fun HH ↦ H ⟨i, HH, i_min⟩
357-
-- We replace `R` by `R ⧸ Ideal.span {(e i).leadingCoeff}` where `(e i).degree` is lowered
358-
-- and `Localization.Away (e i).leadingCoeff` where `(e i).leadingCoeff` becomes invertible.
359-
apply hP _ (e i).leadingCoeff
360-
· rw [Ideal.map_span, ← Set.range_comp]
361-
refine H_IH _ ?_ _ rfl
362-
rw [hv, Prod.Lex.lt_iff']
363-
constructor
364-
· intro j; simpa using degree_map_le _ _
365-
simp only [coe_mapRingHom, Function.comp_apply, ne_eq, hv, ofLex_toLex,
366-
not_exists, not_and, not_forall, Classical.not_imp, not_le, H, not_false_eq_true]
367-
intro h_eq
368-
rw [lt_iff_le_not_le]
369-
simp only [exists_prop, le_Prop_eq, implies_true, true_implies, not_forall, Classical.not_imp,
370-
not_exists, not_and, not_lt, true_and]
371-
refine ⟨i, ?_, ?_⟩
372-
· replace h_eq := congr_fun h_eq i
373-
simp only [Function.comp_apply] at h_eq
374-
have := IsLocalization.Away.algebraMap_isUnit (S := Localization.Away (e i).leadingCoeff)
375-
(e i).leadingCoeff
376-
convert this
377-
nth_rw 2 [← coeff_natDegree]
378-
rw [natDegree_eq_of_degree_eq h_eq, coeff_map, coeff_natDegree]
379-
· intro j hj
380-
refine le_trans ?_ ((i_min j (fun e ↦ hj (by simp [e]))).trans_eq (congr_fun h_eq j).symm)
381-
simpa using degree_map_le _ _
382-
· rw [Ideal.map_span, ← Set.range_comp]
383-
refine H_IH _ ?_ _ rfl
384-
rw [hv]
385-
refine .left _ _ (lt_of_le_of_ne ?_ ?_)
386-
· intro j; simpa using degree_map_le _ _
387-
simp only [coe_mapRingHom, Function.comp_apply, ne_eq, hv, ofLex_toLex,
388-
not_exists, not_and, not_forall, Classical.not_imp, not_le, H, not_false_eq_true]
389-
intro h_eq
390-
replace h_eq := congr_fun h_eq i
391-
simp only [Ideal.Quotient.algebraMap_eq, Function.comp_apply, degree_map_eq_iff,
392-
Ideal.Quotient.mk_singleton_self, ne_eq, not_true_eq_false, false_or] at h_eq
393-
exact hi h_eq
322+
· exact le_rfl
323+
· simp only [hv, ne_eq, not_exists, not_and, not_forall, not_le, funext_iff,
324+
Function.comp_apply, exists_prop, ofLex_toLex]
325+
use j
326+
simp only [Function.update_same]
327+
refine ((degree_modByMonic_lt _ (monic_unit_leadingCoeff_inv_smul _ _)).trans_le
328+
((degree_C_mul_eq_of_mul_ne_zero _ _ ?_).trans_le i_min)).ne
329+
rw [IsUnit.val_inv_mul]
330+
exact one_ne_zero
331+
-- Case II : The `e i ≠ 0` with minimal degree has non-invertible leading coefficient
332+
obtain ⟨i, hi, i_min⟩ : ∃ i, e i ≠ 0 ∧ ∀ j, e j ≠ 0 → (e i).degree ≤ (e j).degree := by
333+
have : ∃ n : ℕ, ∃ i, (e i).degree = n ∧ (e i) ≠ 0 := by
334+
obtain ⟨i, hi⟩ := he0; exact ⟨(e i).natDegree, i, degree_eq_natDegree hi, hi⟩
335+
let m := Nat.find this
336+
obtain ⟨i, hi, hi'⟩ : ∃ i, (e i).degree = m ∧ (e i) ≠ 0 := Nat.find_spec this
337+
refine ⟨i, hi', fun j hj ↦ ?_⟩
338+
refine hi.le.trans ?_
339+
rw [degree_eq_natDegree hj, Nat.cast_le]
340+
exact Nat.find_min' _ ⟨j, degree_eq_natDegree hj, hj⟩
341+
have : ¬ IsUnit (e i).leadingCoeff := fun HH ↦ H ⟨i, HH, i_min⟩
342+
-- We replace `R` by `R ⧸ Ideal.span {(e i).leadingCoeff}` where `(e i).degree` is lowered
343+
-- and `Localization.Away (e i).leadingCoeff` where `(e i).leadingCoeff` becomes invertible.
344+
apply hP _ (e i).leadingCoeff
345+
· rw [Ideal.map_span, ← Set.range_comp]
346+
refine H_IH _ ?_ _ rfl
347+
rw [hv, Prod.Lex.lt_iff']
348+
constructor
349+
· intro j; simpa using degree_map_le _ _
350+
simp only [coe_mapRingHom, Function.comp_apply, ne_eq, hv, ofLex_toLex,
351+
not_exists, not_and, not_forall, Classical.not_imp, not_le, H, not_false_eq_true]
352+
intro h_eq
353+
rw [lt_iff_le_not_le]
354+
simp only [exists_prop, le_Prop_eq, implies_true, true_implies, not_forall, Classical.not_imp,
355+
not_exists, not_and, not_lt, true_and]
356+
refine ⟨i, ?_, ?_⟩
357+
· replace h_eq := congr_fun h_eq i
358+
simp only [Function.comp_apply] at h_eq
359+
have := IsLocalization.Away.algebraMap_isUnit (S := Localization.Away (e i).leadingCoeff)
360+
(e i).leadingCoeff
361+
convert this
362+
nth_rw 2 [← coeff_natDegree]
363+
rw [natDegree_eq_of_degree_eq h_eq, coeff_map, coeff_natDegree]
364+
· intro j hj
365+
refine le_trans ?_ ((i_min j (fun e ↦ hj (by simp [e]))).trans_eq (congr_fun h_eq j).symm)
366+
simpa using degree_map_le _ _
367+
· rw [Ideal.map_span, ← Set.range_comp]
368+
refine H_IH _ ?_ _ rfl
369+
rw [hv]
370+
refine .left _ _ (lt_of_le_of_ne ?_ ?_)
371+
· intro j; simpa using degree_map_le _ _
372+
simp only [coe_mapRingHom, Function.comp_apply, ne_eq, hv, ofLex_toLex,
373+
not_exists, not_and, not_forall, Classical.not_imp, not_le, H, not_false_eq_true]
374+
intro h_eq
375+
replace h_eq := congr_fun h_eq i
376+
simp only [Ideal.Quotient.algebraMap_eq, Function.comp_apply, degree_map_eq_iff,
377+
Ideal.Quotient.mk_singleton_self, ne_eq, not_true_eq_false, false_or] at h_eq
378+
exact hi h_eq
379+
· sorry
394380

395381
universe v
396382

LeanCamCombi/GrowthInGroups/Lecture1.lean

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import Mathlib.GroupTheory.Nilpotent
44
import Mathlib.LinearAlgebra.Matrix.SpecialLinearGroup
55
import Mathlib.Tactic.Positivity.Finset
66
import LeanCamCombi.GrowthInGroups.VerySmallDoubling
7+
import LeanCamCombi.Mathlib.Algebra.Group.Subgroup.Pointwise
78
import LeanCamCombi.Mathlib.Data.Finset.Basic
9+
import LeanCamCombi.Mathlib.Data.Set.Lattice
810

911
open Finset Fintype Group Matrix MulOpposite Real
1012
open scoped Combinatorics.Additive MatrixGroups Pointwise
@@ -18,21 +20,6 @@ lemma card_pow_lt_card_pow_succ_of_pow_ne_closure (hX : X.Nontrivial)
1820
dsimp at h
1921
sorry
2022

21-
@[simp]
22-
lemma Set.biUnion_const {G} (s h : Set G) (hs : s.Nonempty) : ⋃ t ∈ s, h = h := by
23-
have := hs.to_subtype
24-
rw [Set.biUnion_eq_iUnion, Set.iUnion_const]
25-
26-
lemma Set.mul_subgroup_closure {Y : Set G} (hY : Y.Nonempty) : Y * Subgroup.closure Y = Subgroup.closure Y := by
27-
rw [←smul_eq_mul, ← Set.iUnion_smul_set]
28-
suffices ∀ a ∈ Y, a • (Subgroup.closure Y : Set G) = Subgroup.closure Y by simp (config := {contextual := true}) [this, hY]
29-
refine fun a ha ↦ smul_coe_set <| Subgroup.subset_closure ha
30-
31-
lemma Set.mul_subgroup_closure_pow {Y : Set G} (hY : Y.Nonempty) : Y ^ n * Subgroup.closure Y = Subgroup.closure Y := by
32-
induction n
33-
· simp
34-
next k hk => rw [pow_add, pow_one, mul_assoc, Set.mul_subgroup_closure hY, hk]
35-
3623
lemma card_pow_strictMonoOn (hX : X.Nontrivial) :
3724
StrictMonoOn (fun n ↦ #(X ^ n))
3825
{n | (X ^ (n - 1) : Set G) ≠ Subgroup.closure (X : Set G)} := by
@@ -46,19 +33,20 @@ lemma card_pow_strictMonoOn (hX : X.Nontrivial) :
4633
rw [eq_comm, coe_set_eq_one, Subgroup.closure_eq_bot_iff] at hm
4734
cases hX.not_subset_singleton hm
4835
calc (X : Set G) ^ (n - 1) = X ^ (n - m) * X ^ (m - 1) := by rw [← pow_add]; congr 1; omega
49-
_ = Subgroup.closure (X : Set G) := by rw [hm, Set.mul_subgroup_closure_pow hX.nonempty.to_set]
36+
_ = Subgroup.closure (X : Set G) := by rw [hm, Set.mul_subgroupClosure_pow hX.nonempty.to_set]
5037

51-
lemma card_pow_strictMono (hXclosure : (Subgroup.closure (X : Set G) : Set G).Infinite) (hX : X.Nontrivial) :
52-
StrictMono fun n ↦ #(X ^ n) := by
38+
lemma card_pow_strictMono (hXclosure : (Subgroup.closure (X : Set G) : Set G).Infinite)
39+
(hX : X.Nontrivial) : StrictMono fun n ↦ #(X ^ n) := by
5340
have h n : (X ^ (n - 1) : Set G) ≠ Subgroup.closure (X : Set G) :=
5441
fun h ↦ by simp [← h, ← coe_pow] at hXclosure
5542
simpa [h] using card_pow_strictMonoOn hX
5643

5744
/-- The growth of a generating set in an infinite group is at least linear. -/
58-
lemma fact_3_1_1 [Infinite G] (hXgen : Subgroup.closure (X : Set G) = ⊤) (hX : X.Nontrivial) : n + 1 ≤ #(X ^ n) := by
59-
induction n
60-
· simp
61-
next k ih => exact ih.trans_lt ((card_pow_strictMono (by simp [hXgen, Set.infinite_univ]) hX) k.lt_succ_self)
45+
lemma fact_3_1_1 [Infinite G] (hXgen : Subgroup.closure (X : Set G) = ⊤) (hX : X.Nontrivial) :
46+
∀ n, n + 1 ≤ #(X ^ n)
47+
| 0 => by simp
48+
| n + 1 => (fact_3_1_1 hXgen hX _).trans_lt <|
49+
card_pow_strictMono (by simp [hXgen, Set.infinite_univ]) hX n.lt_succ_self
6250

6351
/-- The growth of a set is at most exponential. -/
6452
lemma fact_3_1_2 : #(X ^ n) ≤ #X ^ n := card_pow_le

LeanCamCombi/Kneser/Kneser.lean

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,7 @@ lemma mul_aux1
137137
(hconv : #(s ∩ t) + #((s ∪ t) * C.mulStab) ≤ #C + #C.mulStab)
138138
(hnotconv :
139139
#(C ∪ s' * t') + #(C ∪ s' * t').mulStab < #(s ∩ t) + #((s ∪ t) * (C ∪ s' * t').mulStab))
140-
(hCun : (C ∪ s' * t').mulStab = (s' * t').mulStab) (hsub : (s' * t').mulStab ⊆ C.mulStab)
141-
(hdisj : Disjoint C (s' * t')) :
140+
(hCun : (C ∪ s' * t').mulStab = (s' * t').mulStab) (hdisj : Disjoint C (s' * t')) :
142141
(#((s ∪ t) * C.mulStab) - #((s ∪ t) * (s' * t').mulStab) : ℤ) <
143142
#C.mulStab - #(s' * (s' * t').mulStab) - #(t' * (s' * t').mulStab) := by
144143
set H := C.mulStab
@@ -410,7 +409,7 @@ theorem mul_kneser :
410409
have hH₁H : H₁ ⊂ H := mulStab_mul_ssubset_mulStab hs₁ne ht₁ne hab
411410
have aux1₁ :=
412411
mul_aux1 (ih _ _ hst₁) hCcard
413-
(not_le.1 fun h => hCmin _ (hC₁stab.trans_ssubset hH₁H) ⟨hC₁st, h⟩) hC₁stab hH₁H.subset hCst₁
412+
(not_le.1 fun h => hCmin _ (hC₁stab.trans_ssubset hH₁H) ⟨hC₁st, h⟩) hC₁stab hCst₁
414413
obtain ht₂ | ht₂ne := t₂.eq_empty_or_nonempty
415414
· have aux₁_contr :=
416415
disjoint_mul_sub_card_le b (hs₁s has₁) (disjoint_iff_inter_eq_empty.2 ht₂) hH₁H.subset
@@ -425,7 +424,7 @@ theorem mul_kneser :
425424
have hH₂H : H₂ ⊂ H := mulStab_mul_ssubset_mulStab hs₂ne ht₂ne (by rwa [mul_comm])
426425
have aux1₂ :=
427426
mul_aux1 (ih _ _ hst₂) hCcard
428-
(not_le.1 fun h => hCmin _ (hC₂stab.trans_ssubset hH₂H) ⟨hC₂st, h⟩) hC₂stab hH₂H.subset hCst₂
427+
(not_le.1 fun h => hCmin _ (hC₂stab.trans_ssubset hH₂H) ⟨hC₂st, h⟩) hC₂stab hCst₂
429428
obtain habH | habH := eq_or_ne (a • H) (b • H)
430429
· simp only [← habH] at aux1₁
431430
rw [hH₁, hs₁, ht₁, ← habH, hH] at hH₁H

0 commit comments

Comments
 (0)