Exact output memory of complete native Chan–He node construction #
Main definitions #
NodePacking.paddingMemory,roundMemory,memory: exact instruction-level write specs.NodePacking.node: the existing mathematical node for the three supplied enumerations.
References #
These memory composition proofs are original.
def Cslib.Algorithms.WordRAM.ThreeSum.ChanHe.NodePacking.node (L : Layout) (values : Fin 3 → ℕ → ℤ) :
The existing mathematical Chan–He node, with no alternative 3SUM semantics.
Instances For
The native unsigned pattern encodes exactly the signed padding and tags of oneArray.
theorem Cslib.Algorithms.WordRAM.ThreeSum.ChanHe.NodePacking.roundMemory_arrXY (L : Layout) (values : Fin 3 → ℕ → ℤ) (j : Fin 3) (mem : ℕ → ℕ) (hj : j ≠ 2) (hM : 0 < L.M) (hinj : Set.InjOn (values j) ↑(Finset.range (L.n j))) {i : ℕ} (hi : i < L.N) (hpad : mem (L.packed + 4 * i + (↑j + 1)) = WordRAM.Signed.encode (ThreeSum.ChanHe.pad L.U + ↑(L.tag j))) :
roundMemory L values j mem (L.packed + 4 * i + (↑j + 1)) = WordRAM.Signed.encode (ThreeSum.ChanHe.arrXY (Finset.image (values j) (Finset.range (L.n j))) L.M L.U i + ↑(L.tag j))
The first two complete rounds produce the existing mathematical light array.
theorem Cslib.Algorithms.WordRAM.ThreeSum.ChanHe.NodePacking.roundMemory_arrZ (L : Layout) (values : Fin 3 → ℕ → ℤ) (mem : ℕ → ℕ) (hM : 0 < L.M) (hinj : Set.InjOn (values 2) ↑(Finset.range (L.n 2))) {i : ℕ} (hi : i < L.N) (hpad : mem (L.packed + 4 * i + 3) = WordRAM.Signed.encode (-ThreeSum.ChanHe.pad L.U + 4 * ↑L.gap)) :
roundMemory L values 2 mem (L.packed + 4 * i + 3) = WordRAM.Signed.encode (ThreeSum.ChanHe.arrZ (Finset.image (values 2) (Finset.range (L.n 2))) L.M L.U i + 4 * ↑L.gap)
The third complete round produces the existing duplicated, negated mathematical array.
theorem Cslib.Algorithms.WordRAM.ThreeSum.ChanHe.NodePacking.memory_cells (L : Layout) (values : Fin 3 → ℕ → ℤ) (mem : ℕ → ℕ) (hM : 0 < L.M) (hinj : ∀ (j : Fin 3), Set.InjOn (values j) ↑(Finset.range (L.n j))) {i : ℕ} (hi : i < L.N) :
memory L values mem (L.packed + 4 * i) = WordRAM.Signed.encode (10 * ↑L.gap) ∧ memory L values mem (L.packed + 4 * i + 1) = WordRAM.Signed.encode (ThreeSum.ChanHe.arrXY (node L values).S₁ L.M L.U i + ↑L.gap) ∧ memory L values mem (L.packed + 4 * i + 2) = WordRAM.Signed.encode (ThreeSum.ChanHe.arrXY (node L values).S₂ L.M L.U i + 3 * ↑L.gap) ∧ memory L values mem (L.packed + 4 * i + 3) = WordRAM.Signed.encode (ThreeSum.ChanHe.arrZ (node L values).S₃ L.M L.U i + 4 * ↑L.gap)
All four packed columns have exactly the existing node's required values.
theorem Cslib.Algorithms.WordRAM.ThreeSum.ChanHe.NodePacking.memory_oneArray (L : Layout) (values : Fin 3 → ℕ → ℤ) (mem : ℕ → ℕ) (hM : 0 < L.M) (hinj : ∀ (j : Fin 3), Set.InjOn (values j) ↑(Finset.range (L.n j))) {u : ℕ} (hu : u < 4 * L.N) :
Every one of the 4N native output cells equals the existing mathematical Node.oneArray.
This includes column-zero sentinels, empty and heavy buckets, and the entire padded tail.