Skip to content

Commit 2bc328d

Browse files
committed
PoC
1 parent c2f4a7d commit 2bc328d

2 files changed

Lines changed: 91 additions & 89 deletions

File tree

ArkLib/Data/CodingTheory/ProximityGap/Folding.lean

Lines changed: 30 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -688,7 +688,7 @@ private lemma correlated_agreement_implies_contradictory_hamm_dist
688688
constructor
689689
· exact lt_of_lt_of_le
690690
(indicated_polynomial_comp_x_k_natDegree h_s'_non_empty)
691-
(by aesop)
691+
(FoldingContext.pow_2_k_mul_le_pow_2_d_of (by simp_all))
692692
· simp only [hammingDist, ne_eq, hammingDistBound, Fintype.card_fin]
693693
rw [←Finset.compl_filter, Finset.card_compl, Fintype.card_fin]
694694
apply Nat.sub_le_sub_left
@@ -746,57 +746,28 @@ private lemma dist_from_code_bound_of_correlated_agreement
746746
simp only [Set.mem_setOf_eq, Nat.cast_le]
747747
aesop (add safe [evalOnPoints_mem_code_of_natDegree_lt])
748748

749-
private lemma folded_rate_div_eq_helper {d : ℕ}
750-
(hkn : k ≤ n) (hkd : 2 ^ k ∣ d) :
751-
(↑(d / 2 ^ k) : ℚ≥0) / 2 ^ (n - k) = (↑d : ℚ≥0) / 2 ^ n := by
752-
obtain ⟨m, rfl⟩ := hkd
753-
simp +zetaDelta only [ne_eq, Nat.pow_eq_zero, OfNat.ofNat_ne_zero, false_and, not_false_eq_true,
754-
mul_div_cancel_left₀, Nat.cast_mul, Nat.cast_pow, Nat.cast_ofNat] at *
755-
rw [←Nat.add_sub_cancel' hkn,
756-
pow_add,
757-
mul_div_mul_left _ _ (by positivity)]
758-
norm_num
759-
760749
omit [DecidableEq F] in
761750
/-- The rate of the folded RS-code is the same. -/
762-
lemma folded_rate_eq {d : ℕ} (hkn : k ≤ n) (hkd : 2 ^ k ∣ d) :
751+
lemma folded_rate_eq {d : ℕ} [FoldingContext k d n] :
763752
LinearCode.rate
764-
(ReedSolomon.code (domain.subdomain k : Fin (2 ^ (n - k)) ↪ F) (d / (2 ^ k))) =
765-
LinearCode.rate (ReedSolomon.code (domain : Fin (2 ^ n) ↪ F) d) := by
753+
(ReedSolomon.code (domain.subdomain k : Fin (2 ^ (n - k)) ↪ F) (2 ^ (d - k))) =
754+
LinearCode.rate (ReedSolomon.code (domain : Fin (2 ^ n) ↪ F) (2 ^ d)) := by
766755
simp only [rateOfLinearCode_eq_min_div, Fintype.card_fin, min_def, Nat.cast_ite, Nat.cast_pow,
767756
Nat.cast_ofNat]
768-
by_cases hif : d ≤ 2 ^ n
769-
· simp only [hif, ↓reduceIte]
770-
have hif : d / 2 ^ k ≤ 2 ^ (n - k) := by
771-
rw [Nat.div_le_iff_le_mul (by simp)]
772-
exact le_trans hif <| by
773-
rw [←pow_add, Nat.sub_add_cancel hkn]
774-
grind
775-
aesop (add safe forward [folded_rate_div_eq_helper])
776-
· simp only [hif, ↓reduceIte, ne_eq, pow_eq_zero_iff', OfNat.ofNat_ne_zero, false_and,
777-
not_false_eq_true, div_self]
778-
have hif := Nat.div_le_div_right (c := 2 ^ k) (Nat.le_of_lt (not_le.mp hif))
779-
rw [show 2 ^ n / 2 ^ k = 2 ^ (n - k) by
780-
aesop (add safe
781-
[(by rw [Nat.div_eq_iff]),
782-
(by rw [←pow_add]),
783-
(by grind)])
784-
] at hif
785-
rcases (Nat.lt_or_eq_of_le hif) with hif | hif
786-
· aesop (add safe (by omega))
787-
· aesop
788-
(add safe forward [div_eq_one_iff_eq])
789-
(add safe [(by norm_cast)])
757+
have hif : 2 ^ (d - k) ≤ 2 ^ (n - k) := by simp
758+
simp [hif]
759+
field_simp
760+
rw [←pow_add, ←pow_add]
761+
grind
790762

791763
omit [DecidableEq F] in
792764
/-- The square root of the rate of the folded RS-code is the same. -/
793-
lemma folded_sqrtRate_eq {d : ℕ} (hkn : k ≤ n) (hkd : 2 ^ k ∣ d) :
765+
lemma folded_sqrtRate_eq {d : ℕ} [FoldingContext k d n] :
794766
ReedSolomon.sqrtRate
795-
(d / (2 ^ k))
767+
(2 ^ (d - k))
796768
(domain.subdomain k : Fin (2 ^ (n - k)) ↪ F) =
797-
ReedSolomon.sqrtRate d (domain : Fin (2 ^ n) ↪ F) := by
798-
aesop (add simp [ReedSolomon.sqrtRate, folded_rate_eq])
799-
769+
ReedSolomon.sqrtRate (2 ^ d) (domain : Fin (2 ^ n) ↪ F) := by
770+
simp [ReedSolomon.sqrtRate, folded_rate_eq]
800771

801772
set_option linter.unusedVariables false in -- linter complains about `δ_gt_0`
802773
-- which is a result of it missing
@@ -819,33 +790,26 @@ the corresponding Reed–Solomon code except with probability controlled by
819790
theorem folding_preserves_distance
820791
[Fintype F]
821792
{domain : SmoothCosetFftDomain n F} {f : Word F (Fin (2 ^ n))} {d k : ℕ}
793+
[FoldingContext k d n]
822794
{δ : ℝ≥0}
823-
(k_div_d : 2 ^ k ∣ d)
824-
(hd0 : 0 < d)
825-
(h_d_n : d ≤ 2 ^ n)
826795
(δ_gt_0 : 0 < δ) -- this one is not used but should be.
827-
(δ_lt : δ < min (δᵣ(f, ReedSolomon.code (domain : Fin (2 ^ n) ↪ F) d))
828-
(1 - (ReedSolomon.sqrtRate d (domain : Fin (2 ^ n) ↪ F)))) :
796+
(δ_lt : δ < min (δᵣ(f, ReedSolomon.code (domain : Fin (2 ^ n) ↪ F) (2 ^ d)))
797+
(1 - (ReedSolomon.sqrtRate (2 ^ d) (domain : Fin (2 ^ n) ↪ F)))) :
829798
Pr_{ let r ←$ᵖ F}[δᵣ(foldWord domain f k r,
830799
ReedSolomon.code (domain.subdomain k : Fin (2 ^ (n - k)) ↪ F)
831-
(d / (2 ^ k))) ≤ δ] ≤
832-
((2 ^ k) - 1) * ProximityGap.errorBound δ (d / (2 ^ k))
800+
(2 ^ (d - k))) ≤ δ] ≤
801+
((2 ^ k) - 1) * ProximityGap.errorBound δ (2 ^ (d - k))
833802
(domain.subdomain k : Fin (2 ^ (n - k)) ↪ F) := by
834-
have h_k_d : 2 ^ k ≤ d := by exact Nat.le_of_dvd (by omega) k_div_d
835-
have h_k_le_n : k ≤ n := by
836-
rw [←Nat.pow_le_pow_iff_right (a := 2) (by simp)]
837-
omega
838803
have bound_tighter :
839-
(↑δ) ≤ 1 - ReedSolomon.sqrtRate (d / (2 ^ k))
804+
(↑δ) ≤ 1 - ReedSolomon.sqrtRate (2 ^ (d - k))
840805
(domain.subdomain k : Fin (2 ^ (n - k)) ↪ F) :=
841806
le_of_lt <| by
842807
aesop
843808
(add safe [(by rw [folded_sqrtRate_eq])])
844-
(add safe [(by grind)])
845809
(add safe (by norm_cast at *))
846810
have correlated_agreement :=
847811
@correlatedAgreement_affine_curves (Fin (2 ^ (n - k))) _ _ F _ _ _
848-
(2 ^ k - 1) (d / (2 ^ k))
812+
(2 ^ k - 1) ((2 ^ (d - k)))
849813
(domain := domain.subdomain k) (δ := δ)
850814
(hδ := bound_tighter)
851815
unfold foldWord δ_ε_correlatedAgreementCurves at *
@@ -856,9 +820,9 @@ theorem folding_preserves_distance
856820
comp_apply, PMF.pure_apply, eq_iff_iff, true_iff,
857821
mul_ite, mul_one, mul_zero, tsum_fintype] at contra correlated_agreement
858822
let cast (x : Fin (2 ^ k - 1 + 1)) : Fin (2 ^ k) :=
859-
Fin.cast (by rw [Nat.sub_add_cancel (by omega)]) x
823+
Fin.cast (by rw [Nat.sub_add_cancel (by grind)]) x
860824
let cast' (x : Fin (2 ^ k)) : Fin (2 ^ k - 1 + 1) :=
861-
Fin.cast (by rw [Nat.sub_add_cancel (by omega)]) x
825+
Fin.cast (by rw [Nat.sub_add_cancel (by grind)]) x
862826
have bijective_cast : Bijective cast := by
863827
rw [bijective_iff_has_inverse]
864828
exists cast'
@@ -895,7 +859,7 @@ theorem folding_preserves_distance
895859
rw [forall_and] at h'
896860
rcases h' with ⟨h_rs, h'⟩
897861
have h_rs := fun x ↦ (mem_code_iff_exists_polynomial_of_ne_zero
898-
(ne := ⟨by rw [Nat.div_ne_zero_iff]; omega⟩)).mp (h_rs x)
862+
(ne := ⟨by simp⟩)).mp (h_rs x)
899863
let u : Fin (2 ^ k - 1 + 1) → Polynomial F :=
900864
fun i => Classical.choose (h_rs i)
901865
have contradiction := dist_from_code_bound_of_correlated_agreement (domain := domain) (f := f)
@@ -917,12 +881,10 @@ theorem folding_preserves_distance
917881
aesop (add norm evalOnPoints)
918882
)
919883
(d := d)
920-
h_k_d
921-
h_d_n
922884
(fun i ↦
923885
And.left <| Classical.choose_spec (h_rs (cast' i)))
924886
rw [Finset.card_image_of_injective _ (by simp)] at contradiction
925-
have contradiction : (Δ₀(f, code (domain : Fin (2 ^ n) ↪ F) d) : ENNReal)
887+
have contradiction : (Δ₀(f, code (domain : Fin (2 ^ n) ↪ F) (2 ^ d)) : ENNReal)
926888
≤ (↑(2 ^ n) : ℚ≥0) * δ :=
927889
le_trans (ENat.toENNReal_le.mpr contradiction) <| by
928890
apply le_trans
@@ -933,9 +895,9 @@ theorem folding_preserves_distance
933895
(h := swap (le_trans (b := 2 ^ n * 1)) (by simp) <| by
934896
rw [mul_comm,
935897
←mul_assoc,
936-
←pow_add,
937-
Nat.sub_add_cancel h_k_le_n,
938-
ENNReal.mul_le_mul_iff_right (by simp) (by simp)]
898+
←pow_add]
899+
simp only [FoldingContext.k_le_n, Nat.sub_add_cancel]
900+
rw [ENNReal.mul_le_mul_iff_right (by simp) (by simp)]
939901
simp
940902
)]
941903
apply le_trans (b := 2 ^ k * ↑↑(#S))
@@ -946,8 +908,8 @@ theorem folding_preserves_distance
946908
· norm_cast
947909
· rw [mul_comm,
948910
←mul_assoc,
949-
←pow_add,
950-
Nat.sub_add_cancel h_k_le_n]
911+
←pow_add]
912+
simp only [FoldingContext.k_le_n, Nat.sub_add_cancel]
951913
conv_lhs =>
952914
lhs
953915
rw [←mul_one (2 ^ n)]
@@ -958,7 +920,7 @@ theorem folding_preserves_distance
958920
exact le_trans (le_of_lt δ_lt.2) (by simp)
959921
})]
960922
norm_cast
961-
have contradiction : δᵣ(f, code (domain : Fin (2 ^ n) ↪ F) d) ≤ (δ : NNReal) := by
923+
have contradiction : δᵣ(f, code (domain : Fin (2 ^ n) ↪ F) (2 ^ d)) ≤ (δ : NNReal) := by
962924
rw [relDistFromCode_le_iff_distFromCode_toENNReal_le]
963925
exact le_trans contradiction <| by
964926
simp only [Fintype.card_fin, Nat.cast_pow, Nat.cast_ofNat]

ArkLib/Data/CodingTheory/ProximityGap/Folding/FoldingContext.lean

Lines changed: 61 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -60,60 +60,67 @@ def ofMiddle {k n : ℕ} [FoldingContextMiddle k n] : FoldingContext k n n where
6060
k_le_d := FoldingContextMiddle.k_le_n
6161
d_le_n := le_refl _
6262

63-
@[simp]
63+
@[simp, grind →]
6464
lemma k_ge_1' {k d : ℕ} [FoldingContextLeft k d] :
6565
1 ≤ k := FoldingContextLeft.k_ge_1
6666

67-
@[simp]
67+
@[simp, grind! →]
6868
lemma k_le_d' {k d : ℕ} [FoldingContextLeft k d] :
6969
k ≤ d := FoldingContextLeft.k_le_d
7070

71-
@[simp]
71+
@[simp, grind! →]
7272
lemma d_le_n' {d n : ℕ} [FoldingContextRight d n] :
7373
d ≤ n := FoldingContextRight.d_le_n
7474

75-
@[simp]
75+
@[simp, grind! →]
7676
lemma k_le_n {k n : ℕ} [FoldingContextMiddle k n] :
7777
k ≤ n := FoldingContextMiddle.k_le_n
7878

79-
@[simp high]
79+
@[simp high, grind! →]
8080
lemma k_sub_one_le_n_sub_one {k d n : ℕ} [FoldingContext k d n] :
8181
k - 1 ≤ n - 1 := by
8282
have := k_ge_1'
8383
have := k_le_n
8484
omega
8585

86-
@[simp]
86+
@[simp, grind! →]
8787
lemma two_pow_k_le_two_pow_n
8888
{A : Type*} [Monoid A] [LinearOrder A] [MulLeftMono A] [OfNat A 2]
8989
{k d n : ℕ} [FoldingContext k d n] (h_two : (1 : A) ≤ 2) :
9090
(2 : A) ^ k ≤ (2 : A) ^ n := pow_le_pow_right' h_two (by simp)
9191

92-
@[simp]
92+
@[simp, grind! →]
9393
lemma two_pow_k_le_two_pow_d
9494
{A : Type*} [Monoid A] [LinearOrder A] [MulLeftMono A] [OfNat A 2]
9595
{k d n : ℕ} [FoldingContext k d n] (h_two : (1 : A) ≤ 2) :
9696
(2 : A) ^ k ≤ (2 : A) ^ d := pow_le_pow_right' h_two (by simp)
9797

98-
@[simp]
98+
@[simp, grind! →]
9999
lemma two_pow_d_le_two_pow_n
100100
{A : Type*} [Monoid A] [LinearOrder A] [MulLeftMono A] [OfNat A 2]
101101
{d n : ℕ} [FoldingContextRight d n] (h_two : (1 : A) ≤ 2) :
102102
(2 : A) ^ d ≤ (2 : A) ^ n := pow_le_pow_right' h_two (by simp)
103103

104-
@[simp]
104+
@[simp, grind! →]
105+
lemma two_pow_d_sub_k_le_two_pow_n_sub_k
106+
{A : Type*} [Monoid A] [LinearOrder A] [MulLeftMono A] [OfNat A 2]
107+
{k d n : ℕ} [FoldingContext k d n] (h_two : (1 : A) ≤ 2) :
108+
(2 : A) ^ (d - k) ≤ (2 : A) ^ (n - k) :=
109+
pow_le_pow_right' h_two (by simp)
110+
111+
@[simp, grind =]
105112
lemma one_add_sub_one {k d : ℕ} [FoldingContextLeft k d] :
106113
1 + (k - 1) = k := by
107114
rw [Nat.add_sub_cancel' (by simp)]
108115

109-
@[simp]
116+
@[simp, grind =]
110117
lemma n_sub_1_sub_k_sub_1_eq_n_sub_k {k d n : ℕ} [FoldingContext k d n] :
111118
n - 1 - (k - 1) = n - k := by
112119
have := k_ge_1'
113120
have := k_le_n
114121
omega
115122

116-
@[simp]
123+
@[simp, grind =]
117124
lemma pow_2_n_sub_k_eq_n_sub_k
118125
{A : Type*} [Group A] [LinearOrder A] [MulLeftMono A] [OfNat A 2]
119126
{k d n : ℕ} [FoldingContext k d n] :
@@ -125,7 +132,7 @@ lemma pow_2_n_sub_k_eq_n_sub_k
125132
exact (pow_sub 2 (by simp)).symm
126133
_ = (2 : A) ^ (n - k) := by simp
127134

128-
@[simp]
135+
@[simp, grind =]
129136
lemma pow_2_n_sub_1_sub_k_sub_1_eq_n_sub_k
130137
{A : Type*} [Group A] [LinearOrder A] [MulLeftMono A] [OfNat A 2]
131138
{k d n : ℕ} [FoldingContext k d n] :
@@ -137,43 +144,76 @@ lemma pow_2_n_sub_1_sub_k_sub_1_eq_n_sub_k
137144
exact (pow_sub 2 (by simp)).symm
138145
_ = (2 : A) ^ (n - k) := by simp
139146

140-
@[simp]
147+
@[simp, grind =]
141148
lemma n_sub_k_add_k {k n : ℕ} [FoldingContextMiddle k n] :
142149
n - k + k = n := by
143150
have := k_le_n
144151
omega
145152

146-
@[simp]
153+
@[simp, grind =]
147154
lemma d_sub_k_add_k {k d : ℕ} [FoldingContextLeft k d] :
148155
d - k + k = d := by
149156
have := k_le_d'
150157
omega
151158

152-
@[simp]
159+
@[grind =]
160+
lemma d_sub_k_add_n {k d n : ℕ} [FoldingContext k d n] :
161+
d - k + n = n + d - k := by
162+
have := k_le_d'
163+
have := d_le_n'
164+
omega
165+
166+
@[grind =]
167+
lemma n_sub_k_add_d {k d n : ℕ} [FoldingContext k d n] :
168+
n - k + d = n + d - k := by
169+
have := k_le_d'
170+
have := d_le_n'
171+
omega
172+
173+
@[simp, grind =]
153174
lemma pow_2_d_sub_k_mul_pow_2_k
154175
{A : Type*} [Monoid A] [OfNat A 2]
155176
{k d : ℕ} [FoldingContextLeft k d] :
156177
(2 : A) ^ (d - k) * (2 : A) ^ k = (2 : A) ^ d := by
157178
simp [←pow_add]
158179

159-
@[simp]
180+
@[simp, grind =]
160181
lemma pow_2_k_mul_pow_2_d_sub_k
161182
{A : Type*} [Monoid A] [OfNat A 2]
162183
{k d : ℕ} [FoldingContextLeft k d] :
163184
(2 : A) ^ k * (2 : A) ^ (d - k) = (2 : A) ^ d := by simp [←pow_add]
164185

165-
@[simp]
186+
@[simp, grind =]
166187
lemma min_pow_2_d_pow_2_n
167188
{d n : ℕ} [FoldingContextRight d n] :
168189
min ((2 : ℕ) ^ d) ((2 : ℕ) ^ n) = 2 ^ d := by simp
169190

191+
@[grind! →]
192+
lemma pow_2_k_mul_le_pow_2_d_of
193+
{A : Type*} [Monoid A] [LinearOrder A] [MulLeftMono A]
194+
[OfNat A 2] {k d : ℕ} [FoldingContextLeft k d] {x : A}
195+
(h : x ≤ (2 : A) ^ (d - k)) :
196+
(2 : A) ^ k * x ≤ (2 : A) ^ d := by
197+
calc
198+
(2 : A) ^ k * x ≤ (2 : A) ^ k * (2 : A) ^ (d - k) :=
199+
mul_le_mul_right h _
200+
_ = (2 : A) ^ d := by grind
201+
170202
@[simp]
171203
lemma pow_2_k_mul_le_pow_2_d_iff
172-
{A : Type*} [Monoid A] [LinearOrder A] [MulLeftMono A] [OfNat A 2]
173-
{k d : ℕ} [FoldingContextLeft k d] (h_two : (1 : A) ≤ 2) {x : A} :
204+
{A : Type*} [Monoid A] [LinearOrder A] [MulLeftMono A]
205+
[MulLeftStrictMono A]
206+
[OfNat A 2] {k d : ℕ} [FoldingContextLeft k d] {x : A} :
174207
(2 : A) ^ k * x ≤ (2 : A) ^ d ↔
175-
x ≤ (2 : A) ^ (d - k) := by sorry
176-
208+
x ≤ (2 : A) ^ (d - k) where
209+
mp h := by
210+
by_contra! contra
211+
have : 2 ^ d < 2 ^ k * x := by
212+
rw [←pow_2_k_mul_pow_2_d_sub_k]
213+
exact mul_lt_mul_right contra _
214+
have : 2 ^ d < 2 ^ d := by grind
215+
simp_all
216+
mpr h := by grind
177217

178218
end FoldingContext
179219

0 commit comments

Comments
 (0)