@@ -225,6 +225,31 @@ theorem foldWord_k_1 [NeZero n] {i : Fin (2 ^ (n - 1))} {α : F} :
225225 ((f i + f i') / 2 ) + α * ((f i - f i') / (2 * x)) := by
226226 simp [foldWord, foldValue_k_1]
227227
228+ /-- The "even" part of the folding function. -/
229+ def foldWordEven [NeZero n] (domain : SmoothCosetFftDomain n F)
230+ (f : Word F (Fin (2 ^ n))) (i : Fin (2 ^ (n - 1 ))) : F :=
231+ let x : domain := CosetFftDomain.twoNthRoot (i := 1 )
232+ ⟨domain.subdomain 1 i, by simp⟩
233+ let i := domain.log x
234+ let i' := domain.log ⟨-x.1 , by obtain ⟨x, hx⟩ := x; simpa using hx⟩
235+ (f i + f i') / 2
236+
237+ /-- The "odd" part of the folding function. -/
238+ def foldWordOdd [NeZero n] (domain : SmoothCosetFftDomain n F)
239+ (f : Word F (Fin (2 ^ n))) (i : Fin (2 ^ (n - 1 ))) : F :=
240+ let x : domain := CosetFftDomain.twoNthRoot (i := 1 )
241+ ⟨domain.subdomain 1 i, by simp⟩
242+ let i := domain.log x
243+ let i' := domain.log ⟨-x.1 , by obtain ⟨x, hx⟩ := x; simpa using hx⟩
244+ (f i - f i') / (2 * x)
245+
246+ /-- `foldWord` equals the natural linear combination
247+ of its even and odd parts. -/
248+ lemma foldWord_k_1_eq_foldWordEven_add_foldWordOdd [NeZero n] {α : F} :
249+ foldWord domain f 1 α =
250+ foldWordEven domain f + α • foldWordOdd domain f := by
251+ aesop (add simp [foldWord_k_1, foldWordEven, foldWordOdd])
252+
228253/-- An explicit formula for `foldWord` when `k = 1` that
229254 does not use Lagrange interpolation and avoids using `log`. -/
230255theorem foldWord_k_1_of_sq_roots {i : Fin (2 ^ (n - 1 ))} {α : F}
0 commit comments