Encoding one block into the Fermat ring: result
ProvedNLogN.encP_runUnder the same register hypotheses (stack GU starts with blk, registers hold , , , ), the program encP consumes the block and pushes on EO the integer if and otherwise, where with kpack (2^P) applied to the positive and negative parts of the real and imaginary coordinates.
Formalization Note. The machine layer: IState HS is a state with stacks of items (Item = integer or mark), an input position and an output; RM programs (straight-line register code RS, loops rep, conditionals, calls of the multiplication procedure through a MulSpec giving its domain and cost) have a functional semantics p.run s, a definedness predicate p.ok M s and a cost p.cost M s; Spec M p s s' c abbreviates p.ok M s ∧ p.run s = s' ∧ p.cost M s ≤ c. ints L / gints U push an integer list / a list of pairs as items (head = top); zsz z is the bit length of . MulBnd M m Φ says the multiplication procedure accepts all pairs of integers of bit length at cost . Register names (GU, CR, KB, XN, …) are fixed stack indices.
-- Harvey–van der Hoeven multitape-TM development (NLogN), generated by skeleton subtraction. import Definitions.Def_IntMul_HvdH_M_Defs4 set_option autoImplicit false set_option relaxedAutoImplicit false set_option maxHeartbeats 1000000 set_option linter.unusedSimpArgs false open NLogN open IntMul IntMul.HvdH IntMul.HvdH.Ref set_option maxHeartbeats 2000000
theorem NLogN.encP_run (s : IState HS) (P : ℕ) (blk : List (ℤ × ℤ)) (R LR LM LW LF : List Item)
(F : ℤ) (hU : s.G GU = gints blk ++ R) (hR : s.G CR = .int (2 ^ P) :: LR)
(hM : s.G CM = .int blk.length :: LM)
(hW : s.G RW = .int (2 ^ (2 * blk.length * P)) :: LW) (hF : s.G FR = .int F :: LF) :
encP.run s = (s.upd GU R).upd EO
(.int (if encRaw P blk < 0 then encRaw P blk + F else encRaw P blk) :: s.G EO) := by sorry