22Released under Apache 2.0 license as described in the file LICENSE.
33Authors: Ilia Vlasov
44-/
5- import Mathlib.Algebra.Field.Rat
6- import Mathlib.Analysis.Convex.Function
7- import Mathlib.Data.Real.Sqrt
8- import Mathlib.Data.Set.Pairwise.Basic
9- import Mathlib.Algebra.BigOperators.Field
10- import Mathlib.Analysis.Convex.Jensen
11- import Mathlib.Algebra.Module.LinearMap.Defs
12-
13- import ArkLib.Data.CodingTheory.Basic
14- import ArkLib.Data.CodingTheory.JohnsonBound.Choose2
15- import ArkLib.Data.CodingTheory.JohnsonBound.Expectations
165import ArkLib.Data.CodingTheory.JohnsonBound.Lemmas
176
187namespace JohnsonBound
198
209variable {n : ℕ}
21- variable {F : Type } [Fintype F] [DecidableEq F]
10+ {F : Type } [Fintype F] [DecidableEq F]
11+ {B : Finset (Fin n → F)} {v : Fin n → F}
2212
2313def JohnsonDenominator (B : Finset (Fin n → F)) (v : Fin n → F) : ℚ :=
2414 let e := e B v
@@ -27,9 +17,9 @@ def JohnsonDenominator (B : Finset (Fin n → F)) (v : Fin n → F) : ℚ :=
2717 let frac := q / (q - 1 )
2818 (1 - frac * e/n) ^ 2 - (1 - frac * d/n)
2919
30- lemma johnson_denominator_def {B : Finset (Fin n → F)} {v : Fin n → F} :
31- JohnsonDenominator B v = ((1 - ((Fintype.card F : ℚ ) / (Fintype.card F - 1 )) * (e B v / n)) ^ 2
32- - (1 - ((Fintype.card F : ℚ ) / (Fintype.card F - 1 )) * (d B/n))) := by
20+ lemma johnson_denominator_def :
21+ JohnsonDenominator B v = ((1 - ((Fintype.card F) / (Fintype.card F - 1 )) * (e B v / n)) ^ 2
22+ - (1 - ((Fintype.card F) / (Fintype.card F - 1 )) * (d B/n))) := by
3323 simp [JohnsonDenominator]
3424 field_simp
3525
@@ -40,81 +30,42 @@ def JohnsonConditionStrong (B : Finset (Fin n → F)) (v : Fin n → F) : Prop :
4030 let frac := q / (q - 1 )
4131 (1 - frac * d/n) < (1 - frac * e/n) ^ 2
4232
43- private lemma johnson_condition_strong_implies_n_pos {B : Finset (Fin n → F)} {v : Fin n → F}
33+ private lemma johnson_condition_strong_implies_n_pos
4434 (h_johnson : JohnsonConditionStrong B v)
4535 :
4636 0 < n := by
4737 cases n <;> try simp [JohnsonConditionStrong] at *
4838
49- private lemma johnson_condition_strong_implies_2_le_F_card {B : Finset (Fin n → F)} {v : Fin n → F}
39+ private lemma johnson_condition_strong_implies_2_le_F_card
5040 (h_johnson : JohnsonConditionStrong B v)
5141 :
5242 2 ≤ Fintype.card F := by
53- generalize h : Fintype.card F = card
54- rcases card with _ | card
55- · simp [JohnsonConditionStrong] at h_johnson
56- rw [h] at h_johnson
57- simp at h_johnson
58- · rcases card with _ | card
59- · simp [JohnsonConditionStrong] at h_johnson
60- rw [h] at h_johnson
61- simp at h_johnson
62- · omega
63-
43+ revert h_johnson
44+ dsimp [JohnsonConditionStrong]
45+ rcases Fintype.card F with _ | _ | _ <;> aesop
6446
65- private lemma johnson_condition_strong_implies_2_le_B_card {B : Finset (Fin n → F)} {v : Fin n → F}
47+ private lemma johnson_condition_strong_implies_2_le_B_card
6648 (h_johnson : JohnsonConditionStrong B v)
6749 :
6850 2 ≤ B.card := by
69- generalize h : B.card = card
70- rcases card with _ | card
71- · simp [JohnsonConditionStrong] at *
72- simp [e, d] at *
73- subst h
74- simp at h_johnson
75- · rcases card with _ | card
76- · simp [JohnsonConditionStrong] at *
77- simp [e, d] at *
78- rw [h] at h_johnson
79- simp [choose_2] at h_johnson
80- have h_set := Finset.card_eq_one.1 h
81- rcases h_set with ⟨a, h_set⟩
82- rw [h_set] at h_johnson
83- simp at h_johnson
84- generalize hq : Fintype.card F = q
85- rcases q with _ | q
86- · simp [hq] at h_johnson
87- · rcases q with _ | q
88- · simp [hq] at h_johnson
89- · have h : (Fintype.card F : ℚ) /((Fintype.card F : ℚ) - 1 ) =
90- (1 : ℚ) + (1 :ℚ)/((Fintype.card F : ℚ) - 1 ) := by
91- have h : (Fintype.card F : ℚ) = ((Fintype.card F : ℚ) - 1 ) + 1 := by ring
92- conv =>
93- lhs
94- congr
95- rw [h]
96- rfl
97- rfl
98- rw [Field.div_eq_mul_inv, Field.div_eq_mul_inv]
99- rw [add_mul]
100- rw [Field.mul_inv_cancel _ (by {
101- rw [hq]
102- simp
103- aesop
104- })]
105- rw [h] at h_johnson
106- have h' := JohnsonBound.a_lemma_im_not_proud_of (v := v) (a := a) (by omega)
107- have h : (1 :ℚ) < (1 : ℚ) := by
108- apply lt_of_lt_of_le h_johnson
109- assumption
110- simp at h
111- · omega
51+ dsimp [JohnsonConditionStrong] at h_johnson
52+ rcases eq : B.card with _ | card | _ <;> [simp_all [e, d]; skip; omega]
53+ obtain ⟨a, ha⟩ := Finset.card_eq_one.1 eq
54+ replace h_johnson : 1 < |1 - (Fintype.card F) / ((Fintype.card F) - 1 ) * Δ₀(v, a) / (n : ℚ)| := by
55+ simp_all [e, d, choose_2]
56+ generalize eq₁ : Fintype.card F = q
57+ rcases q with _ | _ | q <;> [simp_all; simp_all; skip]
58+ have h : (Fintype.card F : ℚ) / (Fintype.card F - 1 ) = 1 + 1 / (Fintype.card F - 1 ) := by
59+ have : (Fintype.card F : ℚ) - 1 ≠ 0 := by simp [sub_eq_zero]; omega
60+ field_simp
61+ have h' := JohnsonBound.abs_one_sub_div_le_one (v := v) (a := a) (by omega)
62+ exact absurd (lt_of_lt_of_le (h ▸ h_johnson) h') (lt_irrefl _)
11263
113- lemma johnson_condition_strong_iff_johnson_denom_pos {B : Finset (Fin n → F)} {v : Fin n → F} :
64+ lemma johnson_condition_strong_iff_johnson_denom_pos :
11465 JohnsonConditionStrong B v ↔ 0 < JohnsonDenominator B v := by
11566 simp [JohnsonDenominator, JohnsonConditionStrong]
11667
117- theorem johnson_bound [Field F] {B : Finset (Fin n → F)} {v : Fin n → F}
68+ theorem johnson_bound_OLD [Field F]
11869 (h_condition : JohnsonConditionStrong B v)
11970 :
12071 let d := d B
@@ -130,10 +81,29 @@ theorem johnson_bound [Field F] {B : Finset (Fin n → F)} {v : Fin n → F}
13081 rw [mul_assoc, mul_comm ((_)⁻¹) _, Field.mul_inv_cancel _ (by linarith)]
13182 simp
13283 rw [johnson_denominator_def]
133- apply JohnsonBound.johnson_bound_lemma
84+ exact JohnsonBound.johnson_bound_lemma
13485 (johnson_condition_strong_implies_n_pos h_condition')
13586 (johnson_condition_strong_implies_2_le_B_card h_condition')
13687 (johnson_condition_strong_implies_2_le_F_card h_condition')
137-
88+
89+ theorem johnson_bound [Field F]
90+ (h_condition : JohnsonConditionStrong B v)
91+ :
92+ let d := d B
93+ let q : ℚ := Fintype.card F
94+ let frac := q / (q - 1 )
95+ B.card ≤ (frac * d/n) / JohnsonDenominator B v
96+ := by
97+ suffices B.card * JohnsonDenominator B v ≤
98+ Fintype.card F / (Fintype.card F - 1 ) * d B / n by
99+ rw [johnson_condition_strong_iff_johnson_denom_pos] at h_condition
100+ rw [←mul_le_mul_right h_condition]
101+ convert this using 1
102+ field_simp; rw [mul_div_mul_right]; linarith
103+ rw [johnson_denominator_def]
104+ exact JohnsonBound.johnson_bound_lemma
105+ (johnson_condition_strong_implies_n_pos h_condition)
106+ (johnson_condition_strong_implies_2_le_B_card h_condition)
107+ (johnson_condition_strong_implies_2_le_F_card h_condition)
138108
139109end JohnsonBound
0 commit comments