Documentation

CompPoly.Bivariate.GuruswamiSudan.Root.Common.Lemmas

Common Guruswami-Sudan Root Helper Lemmas #

Reusable proof facts for bounded bivariate root backends.

theorem CompPoly.array_mem_eraseDups_fold {α : Type u_1} [BEq α] [LawfulBEq α] (a : α) (xs : List α) (out : Array α) :
a List.foldl (fun (out : Array α) (x : α) => if x out then out else out.push x) out xsa out a xs
theorem CompPoly.array_mem_of_mem_eraseDups {α : Type u_1} [BEq α] [LawfulBEq α] {xs : Array α} {a : α} (h : a xs.eraseDups) :
a xs
theorem CompPoly.array_mem_eraseDups_fold_of_mem {α : Type u_1} [BEq α] [LawfulBEq α] (a : α) (xs : List α) (out : Array α) :
a out a xsa List.foldl (fun (out : Array α) (x : α) => if x out then out else out.push x) out xs
theorem CompPoly.array_mem_eraseDups_of_mem {α : Type u_1} [BEq α] [LawfulBEq α] {xs : Array α} {a : α} (h : a xs) :
theorem CompPoly.GuruswamiSudan.cpoly_truncate_coeff {R : Type u_1} [Zero R] [BEq R] [LawfulBEq R] (p : CPolynomial R) (n i : ) :
(p.truncate n).coeff i = if i < n then p.coeff i else 0
theorem CompPoly.GuruswamiSudan.cbivar_coeff_truncateX {R : Type u_1} [Zero R] [BEq R] [LawfulBEq R] (Q : CBivariate R) (n i j : ) :
(Q.truncateX n).coeff i j = if i < n then Q.coeff i j else 0
theorem CompPoly.GuruswamiSudan.polynomialPrefix_succ {F : Type u_1} [Field F] [BEq F] [LawfulBEq F] [DecidableEq F] (p : CPolynomial F) (depth : ) :
polynomialPrefix p (depth + 1) = extendPrefix (polynomialPrefix p depth) depth (p.coeff depth)
theorem CompPoly.GuruswamiSudan.list_foldl_add_eq_sum {R : Type u_1} [AddMonoid R] (f : R) (xs : List ) (acc : R) :
List.foldl (fun (acc : R) (i : ) => acc + f i) acc xs = acc + (List.map f xs).sum
theorem CompPoly.GuruswamiSudan.cpoly_coeff_zero_mul {F : Type u_1} [Field F] [BEq F] [LawfulBEq F] (p q : CPolynomial F) :
(p * q).coeff 0 = p.coeff 0 * q.coeff 0
theorem CompPoly.GuruswamiSudan.cpoly_coeff_zero_pow {F : Type u_1} [Field F] [BEq F] [LawfulBEq F] (p : CPolynomial F) (n : ) :
(p ^ n).coeff 0 = p.coeff 0 ^ n
theorem CompPoly.GuruswamiSudan.composeY_coeff_zero_zipIdx_eq_range_aux {F : Type u_1} [Field F] [BEq F] [LawfulBEq F] (xs : List (CPolynomial F)) (p accPoly : CPolynomial F) (accCoeff : F) (offset : ) (hacc : accPoly.coeff 0 = accCoeff) :
List.foldl (fun (acc : F) (y : ) => acc + (xs.getD (y - offset) 0).coeff 0 * p.coeff 0 ^ y) accCoeff (List.range' offset xs.length) = (List.foldl (fun (acc : CPolynomial F) (x : CPolynomial F × ) => acc + x.1 * p ^ x.2) accPoly (xs.zipIdx offset)).coeff 0
theorem CompPoly.GuruswamiSudan.composeY_coeff_zero_fold_eq {F : Type u_1} [Field F] [BEq F] [LawfulBEq F] (coeffs : Array (CPolynomial F)) (p : CPolynomial F) :
List.foldl (fun (acc : F) (y : ) => acc + (coeffs.getD y 0).coeff 0 * p.coeff 0 ^ y) 0 (List.range' 0 coeffs.size) = (Array.foldl (fun (acc : CPolynomial F) (x : CPolynomial F × ) => acc + x.1 * p ^ x.2) 0 coeffs.zipIdx).coeff 0
theorem CompPoly.GuruswamiSudan.composeY_coeff_zipIdx_eq_range_aux {R : Type u_1} [Semiring R] [BEq R] [LawfulBEq R] [Nontrivial R] (xs : List (CPolynomial R)) (p accPoly : CPolynomial R) (accCoeff : R) (offset n : ) (hacc : accPoly.coeff n = accCoeff) :
List.foldl (fun (acc : R) (y : ) => acc + (xs.getD (y - offset) 0 * p ^ y).coeff n) accCoeff (List.range' offset xs.length) = (List.foldl (fun (acc : CPolynomial R) (x : CPolynomial R × ) => acc + x.1 * p ^ x.2) accPoly (xs.zipIdx offset)).coeff n
theorem CompPoly.GuruswamiSudan.composeY_coeff_fold_eq {R : Type u_1} [Semiring R] [BEq R] [LawfulBEq R] [Nontrivial R] (coeffs : Array (CPolynomial R)) (p : CPolynomial R) (n : ) :
List.foldl (fun (acc : R) (y : ) => acc + (coeffs.getD y 0 * p ^ y).coeff n) 0 (List.range' 0 coeffs.size) = (Array.foldl (fun (acc : CPolynomial R) (x : CPolynomial R × ) => acc + x.1 * p ^ x.2) 0 coeffs.zipIdx).coeff n
theorem CompPoly.GuruswamiSudan.fold_range_coeff_add_mul_pow {R : Type u_1} [Semiring R] [BEq R] [LawfulBEq R] [Nontrivial R] (coeffs : Array (CPolynomial R)) (p : CPolynomial R) (ys : List ) (acc : CPolynomial R) (accCoeff : R) (n : ) :
acc.coeff n = accCoeff(List.foldl (fun (acc : CPolynomial R) (y : ) => acc + coeffs.getD y 0 * p ^ y) acc ys).coeff n = List.foldl (fun (acc : R) (y : ) => acc + (coeffs.getD y 0 * p ^ y).coeff n) accCoeff ys
theorem CompPoly.GuruswamiSudan.composeY_eq_range_fold {R : Type u_1} [Semiring R] [BEq R] [LawfulBEq R] [Nontrivial R] (Q : CBivariate R) (p : CPolynomial R) :
Q.composeY p = List.foldl (fun (acc : CPolynomial R) (y : ) => acc + (↑Q).coeff y * p ^ y) 0 (List.range' 0 (Array.size Q))
theorem CompPoly.GuruswamiSudan.isRootYDegreeLtBool_of_root {F : Type u_1} [Field F] [BEq F] [LawfulBEq F] {Q : CBivariate F} {p : CPolynomial F} {k : } (hdegree : degreeLt p k) (hroot : Q.composeY p = 0) :
theorem CompPoly.GuruswamiSudan.rootsYDegreeLtFromCandidates_sound {F : Type u_1} [Field F] [BEq F] [LawfulBEq F] {candidates : Array (CPolynomial F)} {Q : CBivariate F} {k : } {p : CPolynomial F} (h : p (rootsYDegreeLtFromCandidates candidates Q k).toList) :
theorem CompPoly.GuruswamiSudan.rootsYDegreeLtFromCandidates_complete_of_mem {F : Type u_1} [Field F] [BEq F] [LawfulBEq F] {candidates : Array (CPolynomial F)} {Q : CBivariate F} {k : } {p : CPolynomial F} (hmem : p candidates.toList) (hdegree : degreeLt p k) (hroot : Q.composeY p = 0) :
theorem CompPoly.GuruswamiSudan.rootsYDegreeLtFromCandidates_eraseDups_complete_of_mem {F : Type u_1} [Field F] [BEq F] [LawfulBEq F] {candidates : Array (CPolynomial F)} {Q : CBivariate F} {k : } {p : CPolynomial F} (hmem : p candidates.toList) (hdegree : degreeLt p k) (hroot : Q.composeY p = 0) :