Inverse NTT outer-loop infrastructure #
These lemmas mirror the forward outer-loop lemmas (radix4Inner_single_block_correct,
radix4Middle_advances_inv, outerLoop_from_inv, preprocessing_establishes_inv) but for the
inverse pass (inverse = true). The key differences:
- The butterfly uses
butterfly4_inverse_ZMod_combined(negated twiddlesω^{(mod64-1)/len * (len - j2)}instead ofω^{(mod64-1)/len * j2}). - The loop invariant uses the inverse root
(ωq)⁻¹at each level and the sub-input without the Montgomery preprocessing (v[...]instead oftoMont (v[...])). Theref_ntt_radix4_q*decomposition lemmas are abstract over the root, so they apply unchanged with the inverse top-level rootω_top⁻¹.
Structural fact: butterfly4 (any inverse flag) leaves position i unchanged when i is
none of the four modified butterfly positions. Generalises butterfly4_getElem_ne.
Generalisation of radix4Inner_getElem_ne to any inverse flag.
Generalisation of radix4Middle_getElem_ne to any inverse flag.
Leading b blocks of radix4Middle do not modify positions at or after b * 2 * len.
For idx in block b (i.e. b * 2 * len ≤ idx < (b+1) * 2 * len),
the full radix4Middle ... nBlocks 0 a at idx equals radix4Inner applied to block b
of the leading-processed array radix4Middle ... b 0 a.
Inverse loop invariant: like outerLoop_inv but with the inverse root (ωq)⁻¹ and the
inverse sub-input (no toMont).
Equations
- One or more equations did not get rendered due to their size.