Cost bound for attaching target indices to the rows of an array
ProvedNLogN.attachP_costLet be a list of rows of integers () stored flattened on stack 0, with stacks 1, 2 holding , , and let bound the bit lengths of all entries and of , , . Then the program attachP d (which prefixes each row with its index in the transposed order) costs at most .
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 RS
theorem NLogN.attachP_cost (d n m : ℕ) (D : List (List ℤ)) (Rest : List Item) (s : IState HS)
(hD : D.length = n * m) (hDw : ∀ r ∈ D, r.length = d) (hm : 1 ≤ m)
(L1 L2 : List Item) (h0 : s.G 0 = ints D.flatten ++ Rest) (h1 : s.G 1 = .int n :: L1)
(h2 : s.G 2 = .int m :: L2) (X : ℕ) (hDB : ∀ r ∈ D, Bnd X r)
(hX1 : zsz ((n * m + n : ℕ) : ℤ) ≤ X) (hX2 : zsz ((n * m * (d + 1) : ℕ) : ℤ) ≤ X)
(hXd : zsz ((d + 1 : ℕ) : ℤ) ≤ X) :
(attachP d).cost s ≤ 100000 * (n * m + 1) * (d + 1) * (X + 2) := by sorry