Conjectures.io

The proof

Green's open problem 29

Suppose that AA is a KK-approximate group (not necessarily abelian). Is there SAS \subset A, SKO(1)A|S| \gg K^{-O(1)} |A|, with S8A4S^8 \subset A^4?

Back to the resultThe problem

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