dif_runs (The forward FFT (decimation in frequency) over `ℤ/(2^n+1)`, as a recursive proce)
ProvedNLogN.dif_runsThe following holds (Lean statement, in the scope of module NLogN.SSDif):
theorem NLogN.dif_runs (pD : Fin P) (hP : iprog pD = difBody pD) (n : ℕ) (hn : 1 ≤ n) :
∀ j (s : IState NS) (A : List ℤ) (R LL LE LN LF : List Item) (E : ℕ),
A.length = 2 ^ j → (j = 0 ∨ 2 ^ j * E = 2 * n) → Canon (2 ^ n + 1) A →
s.G DX = ints A ++ R → s.G DL = .int (2 ^ j) :: LL → s.G NLogN.DE = .int (2 ^ E) :: LE →
s.G RN = .int (2 ^ n) :: LN → s.G RF = .int (2 ^ n + 1) :: LF →
IRuns I iprog (.call pD) s (s.upd DX (ints (difZ (2 ^ n + 1) E j A) ++ R)) (difCost n j)
Context. The lemma belongs to the part The forward FFT (decimation in frequency) over ℤ/(2^n+1), as a recursive procedure.
Formalization Note. This lemma belongs to the item-language (IL) layer of the integer-multiplication-kappa campaign: tape-level programs (register programs over 64 item stacks of the NLogN multitape framework, definition bundles IntMul_HvdH_M_Defs1–IntMul_HvdH_M_Defs8) that implement the data-movement primitives of the OpenAI preprint Integer multiplication below (field moves, row split/merge, shifts, the uniform Proposition 11 interchange, Lemma 12 with fine -per-element costs, Gaussian record primitives, Proposition 14 pieces) with exact list denotations from the array-model bundles IntMul_Kappa_K_Defs* and explicit cost bounds. All names refer to the definition bundles up to IntMul_Kappa_K_Defs18.
-- OpenAI-preprint / κ-improvement development (integer-multiplication-kappa), generated by skeleton subtraction.
import Definitions.Def_IntMul_Kappa_K_Defs18
set_option autoImplicit false
set_option relaxedAutoImplicit false
set_option maxHeartbeats 1000000
open NLogN
open IntMul
variable {P : ℕ} {I : List Sym} {iprog : Fin P → IStmt NS P}
theorem NLogN.dif_runs (pD : Fin P) (hP : iprog pD = difBody pD) (n : ℕ) (hn : 1 ≤ n) :
∀ j (s : IState NS) (A : List ℤ) (R LL LE LN LF : List Item) (E : ℕ),
A.length = 2 ^ j → (j = 0 ∨ 2 ^ j * E = 2 * n) → Canon (2 ^ n + 1) A →
s.G DX = ints A ++ R → s.G DL = .int (2 ^ j) :: LL → s.G NLogN.DE = .int (2 ^ E) :: LE →
s.G RN = .int (2 ^ n) :: LN → s.G RF = .int (2 ^ n + 1) :: LF →
IRuns I iprog (.call pD) s (s.upd DX (ints (difZ (2 ^ n + 1) E j A) ++ R)) (difCost n j) := by sorry