Radix-4 inverse butterfly #
Level 3g – butterfly4 inverse: structural and ZMod-level correctness.
The inverse butterfly uses negated twiddles: instead of roots[s+j2] for t1 it uses
mod32 - roots[2*s - j2] (when j2 > 0) which equals -roots[2*s - j2] in ZMod
(and similarly for t2, t3). Since mod64 = 3*2^30 + 1, we have
primRoot^{(mod64-1)/2} = -1 in ZMod mod64, so the negated twiddle equals
ω^{(mod64-1)/len * (len - j2)} * R where ω = primRoot.
Key Nat arithmetic identity: when len = 2 * s and 2 * len ∣ m,
m / len * (s - j2) + m / 2 = m / len * (len - j2) (for j2 < s).
This is what makes the inverse twiddle computation work for t1, t2.
Helper: a root value at a valid NTT index is < mod32, and its negation mod32 - r
is also < mod32 (because ω^e * R is nonzero in ZMod mod32.toNat).
Helper: bound on inverse t1 value: t1.toNat < mod32.toNat.
Helper: bound on inverse t2 value: t2.toNat < mod32.toNat.
Helper: bound on inverse t3 value: t3.toNat < mod32.toNat.
Bundle the four inverse-butterfly position results into a single conjunction,
mirroring butterfly4_forward_ZMod_combined.