The in-place axis map on a box function (round six, `axisL_listOf`)
ProvedJ6Seg.axisL_listOfThe in-place axis map on a box function.
The following holds (Lean statement, in the scope of module Solutions.J6SegSw1):
theorem J6Seg.axisL_listOf (dims : List ℕ) (hpos : ∀ u ∈ dims, 0 < u) (i : ℕ) (hi : i < dims.length)
{n post pre : ℕ} (hn : dims.getD i 1 = n) (hp : (dims.drop (i + 1)).prod = post)
(hpr : (dims.take i).prod = pre) (A : (ℕ → α) → ℕ → α)
(hloc : ∀ U U' : ℕ → α, (∀ k < n, U k = U' k) → A U = A U') (g : (ℕ → ℕ) → α) :
axisL n post (fun X => (List.range n).map (A fun k => X.getD k default)) (listOf dims g) =
listOf dims (fun j => A (fun k => g (Function.update j i k)) (j i))
Context. B-line machine, sweep 1: in-place axis maps
The machine keeps the array in its row-major layout and applies the line map of axis i in
place (no axis rotation). For a box dims and an axis i, the array is (pre, n, post)
(pre = ∏_{j<i}, n = dims_i, post = ∏_{j>i}), and
axisL n post f L: every(n, post)block is transposed,fis applied to each of itspostlines, and the block is transposed back;axisL_getD: entryb (n·post) + a·post + cofaxisL n post f Lis entryaoffapplied to the linek ↦ L[b (n·post) + k·post + c];digL_split: the row-major digits ofb (n·post) + a·post + c;axisL_listOf: onlistOf dims g,axisLis the slice mapj ↦ A (k ↦ g (j[i ↦ k])) (j i).
Formalization Note. Part of the Lean formalization of the round-six κ-improvement (integer-multiplication-kappa campaign, target IntMul.Kappa.jain_round6_framework). The statement is copied verbatim from the Lean development; the platform node carries the same declaration name. Definitions it mentions live in the IntMul_Kappa_R6_Defs* bundles (on top of the published κ bundles IntMul_Kappa_K_Defs*).
-- Round-six κ development (integer-multiplication-kappa), generated by skeleton subtraction.
import Definitions.Def_IntMul_Kappa_R6_Defs62
set_option autoImplicit false
set_option relaxedAutoImplicit false
set_option maxHeartbeats 1000000
open J6Seg
open IntMul.HvdH IntMul.HvdH.Ref NLogN.KFM NLogN.KFY
variable {α : Type*} [Inhabited α]
theorem J6Seg.axisL_listOf (dims : List ℕ) (hpos : ∀ u ∈ dims, 0 < u) (i : ℕ) (hi : i < dims.length)
{n post pre : ℕ} (hn : dims.getD i 1 = n) (hp : (dims.drop (i + 1)).prod = post)
(hpr : (dims.take i).prod = pre) (A : (ℕ → α) → ℕ → α)
(hloc : ∀ U U' : ℕ → α, (∀ k < n, U k = U' k) → A U = A U') (g : (ℕ → ℕ) → α) :
axisL n post (fun X => (List.range n).map (A fun k => X.getD k default)) (listOf dims g) =
listOf dims (fun j => A (fun k => g (Function.update j i k)) (j i)) := by sorry