The proof
Green's open problem 29
Suppose that is a -approximate group (not necessarily abelian). Is there , , with ?Source
Main.lean · 255 lines · 9.4 kB
open scoped Pointwise
private def slabCoord {H : Type*} (g : Multiplicative ℤ × H) : ℤ :=
Multiplicative.toAdd g.1
private def slabOuter (H : Type*) [Group H] [Fintype H] [DecidableEq H] :
Finset (Multiplicative ℤ × H) :=
({Multiplicative.ofAdd (-1 : ℤ), Multiplicative.ofAdd (1 : ℤ)} :
Finset (Multiplicative ℤ)) ×ˢ (Finset.univ : Finset H)
private def slabA (H : Type*) [Group H] [Fintype H] [DecidableEq H] :
Finset (Multiplicative ℤ × H) :=
slabOuter H ∪ {(Multiplicative.ofAdd (0 : ℤ), 1)}
private def slabX (H : Type*) [Group H] [DecidableEq H] :
Finset (Multiplicative ℤ × H) :=
{(Multiplicative.ofAdd (-1 : ℤ), 1),
(Multiplicative.ofAdd (0 : ℤ), 1),
(Multiplicative.ofAdd (1 : ℤ), 1)}
private lemma slab_mem_iff (H : Type*) [Group H] [Fintype H] [DecidableEq H]
(g : Multiplicative ℤ × H) :
g ∈ slabA H ↔
g.1 = Multiplicative.ofAdd (-1 : ℤ) ∨
g.1 = Multiplicative.ofAdd (1 : ℤ) ∨
g = (Multiplicative.ofAdd (0 : ℤ), 1) := by
simp [slabA, slabOuter] <;> tauto
private lemma slabCoord_mul {H : Type*} [Group H]
(x y : Multiplicative ℤ × H) :
slabCoord (x * y) = slabCoord x + slabCoord y := by
simp [slabCoord]
private lemma slabCoord_pow {H : Type*} [Group H]
(g : Multiplicative ℤ × H) (n : ℕ) :
slabCoord (g ^ n) = n • slabCoord g := by
simp [slabCoord]
private lemma slab_mem_coord_bound (H : Type*) [Group H] [Fintype H] [DecidableEq H]
{g : Multiplicative ℤ × H} (hg : g ∈ slabA H) :
-1 ≤ slabCoord g ∧ slabCoord g ≤ 1 := by
rw [slab_mem_iff] at hg
rcases hg with h | h | h
· have hc : slabCoord g = -1 := by simp [slabCoord, h]
omega
· have hc : slabCoord g = 1 := by simp [slabCoord, h]
omega
· subst g
norm_num [slabCoord]
private lemma slab_pow_coord_bound (H : Type*) [Group H] [Fintype H] [DecidableEq H]
(m : ℕ) {g : Multiplicative ℤ × H} (hg : g ∈ slabA H ^ m) :
-(m : ℤ) ≤ slabCoord g ∧ slabCoord g ≤ (m : ℤ) := by
induction m generalizing g with
| zero =>
have h : g = 1 := by simpa using hg
subst g
simp [slabCoord]
| succ m ih =>
rw [pow_succ] at hg
rcases Finset.mem_mul.mp hg with ⟨x, hx, y, hy, hxy⟩
subst g
have hx' := ih hx
have hy' := slab_mem_coord_bound H hy
rw [slabCoord_mul]
omega
private lemma slabX_mem_of_bounds (H : Type*) [Group H] [DecidableEq H]
(z : ℤ) (hl : -1 ≤ z) (hu : z ≤ 1) :
(Multiplicative.ofAdd z, 1) ∈ slabX H := by
have hz : z = -1 ∨ z = 0 ∨ z = 1 := by omega
rcases hz with rfl | rfl | rfl <;> simp [slabX]
private lemma slab_neg_one_mem (H : Type*) [Group H] [Fintype H] [DecidableEq H]
(h : H) :
(Multiplicative.ofAdd (-1 : ℤ), h) ∈ slabA H := by
simp [slabA, slabOuter]
private lemma slab_one_mem (H : Type*) [Group H] [Fintype H] [DecidableEq H]
(h : H) :
(Multiplicative.ofAdd (1 : ℤ), h) ∈ slabA H := by
simp [slabA, slabOuter]
private lemma slab_sq_subset_mul (H : Type*) [Group H] [Fintype H] [DecidableEq H] :
slabA H ^ 2 ⊆ slabX H * slabA H := by
intro g hg
rw [pow_two] at hg
rcases Finset.mem_mul.mp hg with ⟨a, ha, b, hb, hab⟩
subst g
have ha' := slab_mem_coord_bound H ha
have hb' := slab_mem_coord_bound H hb
let q : ℤ := slabCoord a + slabCoord b
have hqlo : -2 ≤ q := by dsimp [q]; omega
have hqhi : q ≤ 2 := by dsimp [q]; omega
by_cases hq : q ≤ 0
· refine Finset.mem_mul.mpr
⟨(Multiplicative.ofAdd (q + 1), 1),
slabX_mem_of_bounds H (q + 1) (by omega) (by omega),
(Multiplicative.ofAdd (-1 : ℤ), a.2 * b.2),
slab_neg_one_mem H (a.2 * b.2), ?_⟩
apply Prod.ext
· apply Multiplicative.ext
simp [q, slabCoord]
· simp
· refine Finset.mem_mul.mpr
⟨(Multiplicative.ofAdd (q - 1), 1),
slabX_mem_of_bounds H (q - 1) (by omega) (by omega),
(Multiplicative.ofAdd (1 : ℤ), a.2 * b.2),
slab_one_mem H (a.2 * b.2), ?_⟩
apply Prod.ext
· apply Multiplicative.ext
simp [q, slabCoord]
· simp
private lemma slab_inv_mem_iff (H : Type*) [Group H] [Fintype H] [DecidableEq H]
(g : Multiplicative ℤ × H) :
g⁻¹ ∈ slabA H ↔ g ∈ slabA H := by
have forward : ∀ x : Multiplicative ℤ × H, x⁻¹ ∈ slabA H → x ∈ slabA H := by
intro x hx
rw [slab_mem_iff] at hx ⊢
rcases hx with h | h | h
· right
left
have h' := congrArg Inv.inv h
simpa using h'
· left
have h' := congrArg Inv.inv h
simpa using h'
· right
right
have h' := congrArg Inv.inv h
simpa using h'
constructor
· exact forward g
· intro hg
exact forward (g⁻¹) (by simpa using hg)
private lemma slab_inv_eq (H : Type*) [Group H] [Fintype H] [DecidableEq H] :
(↑(slabA H) : Set (Multiplicative ℤ × H))⁻¹ = ↑(slabA H) := by
ext g
simpa using slab_inv_mem_iff H g
private lemma slab_isApproximateSubgroup
(H : Type*) [Group H] [Fintype H] [DecidableEq H] :
IsApproximateSubgroup 3
(↑(slabA H) : Set (Multiplicative ℤ × H)) := by
refine ⟨?_, slab_inv_eq H, ?_⟩
· change (1 : Multiplicative ℤ × H) ∈ slabA H
rw [slabA]
exact Finset.mem_union_right _ (by simp; rfl)
· refine ⟨slabX H, ?_, ?_⟩
· have hcard : (slabX H).card ≤ 3 := by
unfold slabX
exact Finset.card_le_three
exact_mod_cast hcard
· intro g hg
have hg' : g ∈ slabA H ^ 2 := by
simpa only [← Finset.coe_pow, Finset.mem_coe] using hg
have hm := slab_sq_subset_mul H hg'
simpa only [← Finset.mem_coe, Finset.coe_mul, smul_eq_mul] using hm
private lemma slab_good_subset_singleton
(H : Type*) [Group H] [Fintype H] [DecidableEq H]
{S : Finset (Multiplicative ℤ × H)}
(hSA : S ⊆ slabA H) (hpow : S ^ 8 ⊆ slabA H ^ 4) :
S ⊆ {(Multiplicative.ofAdd (0 : ℤ), 1)} := by
intro s hs
have hs8 : s ^ 8 ∈ S ^ 8 := Finset.pow_mem_pow (n := 8) hs
have hA4 := hpow hs8
have hb := slab_pow_coord_bound H 4 hA4
rw [slabCoord_pow] at hb
norm_num [Int.nsmul_eq_mul] at hb
have hzero : slabCoord s = 0 := by omega
have hsA := hSA hs
rw [slab_mem_iff] at hsA
rcases hsA with h | h | h
· have hc : slabCoord s = -1 := by simp [slabCoord, h]
omega
· have hc : slabCoord s = 1 := by simp [slabCoord, h]
omega
· simpa [h]
private lemma slab_good_card_le_one
(H : Type*) [Group H] [Fintype H] [DecidableEq H]
{S : Finset (Multiplicative ℤ × H)}
(hSA : S ⊆ slabA H) (hpow : S ^ 8 ⊆ slabA H ^ 4) :
S.card ≤ 1 := by
calc
S.card ≤ ({(Multiplicative.ofAdd (0 : ℤ), 1)} :
Finset (Multiplicative ℤ × H)).card :=
Finset.card_le_card (slab_good_subset_singleton H hSA hpow)
_ = 1 := by simp
private def slabFiber (H : Type*) [Group H] [Fintype H] [DecidableEq H] :
Finset (Multiplicative ℤ × H) :=
({Multiplicative.ofAdd (1 : ℤ)} : Finset (Multiplicative ℤ)) ×ˢ
(Finset.univ : Finset H)
private lemma slabFiber_subset (H : Type*) [Group H] [Fintype H] [DecidableEq H] :
slabFiber H ⊆ slabA H := by
intro g hg
rcases Finset.mem_product.mp hg with ⟨h1, h2⟩
apply Finset.mem_union_left
exact Finset.mem_product.mpr ⟨Finset.mem_insert_of_mem h1, h2⟩
private lemma fintype_card_le_slabA_card
(H : Type*) [Group H] [Fintype H] [DecidableEq H] :
Fintype.card H ≤ (slabA H).card := by
have h := Finset.card_le_card (slabFiber_subset H)
simpa [slabFiber] using h
theorem target : ¬ (fcTypeOfName% "Green29.green_29") := by
intro h
rcases h.mp True.intro with ⟨C, c, hC, hc, hall⟩
let α : ℝ := C * (3 : ℝ) ^ (-c)
have hα : 0 < α := by
dsimp [α]
positivity
obtain ⟨n : ℕ, hn⟩ := exists_nat_gt (1 / α)
let H := ULift (Multiplicative (Fin (n + 1)))
let A : Finset (Multiplicative ℤ × H) := slabA H
have hApprox : IsApproximateSubgroup (3 : ℝ)
(↑A : Set (Multiplicative ℤ × H)) := by
dsimp [A]
exact slab_isApproximateSubgroup H
rcases hall (G := Multiplicative ℤ × H) 3 A (by norm_num) hApprox with
⟨S, hSA, hsize, hpow⟩
have hAcardNat : n + 1 ≤ A.card := by
calc
n + 1 = Fintype.card H := by simp [H]
_ ≤ A.card := by
dsimp [A]
exact fintype_card_le_slabA_card H
have hAcardReal : ((n + 1 : ℕ) : ℝ) ≤ (A.card : ℝ) := by
exact_mod_cast hAcardNat
have h1n : (1 : ℝ) < (n : ℝ) * α := (div_lt_iff₀ hα).mp hn
have hnle : (n : ℝ) ≤ ((n + 1 : ℕ) : ℝ) := by norm_num
have h1succ : (1 : ℝ) < α * ((n + 1 : ℕ) : ℝ) := by
calc
1 < (n : ℝ) * α := h1n
_ ≤ ((n + 1 : ℕ) : ℝ) * α :=
mul_le_mul_of_nonneg_right hnle (le_of_lt hα)
_ = α * ((n + 1 : ℕ) : ℝ) := by ring
have hSgt : (1 : ℝ) < (S.card : ℝ) := by
calc
1 < α * ((n + 1 : ℕ) : ℝ) := h1succ
_ ≤ α * (A.card : ℝ) :=
mul_le_mul_of_nonneg_left hAcardReal (le_of_lt hα)
_ ≤ (S.card : ℝ) := by simpa [α] using hsize
have hSleNat : S.card ≤ 1 := by
apply slab_good_card_le_one H
· simpa [A] using hSA
· simpa [A] using hpow
have hSle : (S.card : ℝ) ≤ 1 := by exact_mod_cast hSleNat
linarith
Provenance
- Proof SHA-256
- sha256:cd39995efd69cfa3f64e6dbf93ba236c672a2de0b3d6ea815b718e2c0bfeaa5c
- Solver
- 5GeGrY…uLUScV
- Attribution
- conjectures.io