16-bit range checks
Miden VM proves that selected field elements are 16-bit integers through a typed LogUp relation. There is no separate range-checker execution-trace component. The table side is part of the fixed byte-pair lookup AIR that also supports byte AND and the byte rotations used by Eidos compression.
Fixed byte-pair table
And8LookupAir has exactly rows. Its preprocessed columns enumerate every pair
in row order
The same row stores and the two wrapping Eidos contributions and . Ordinary AND requests are encoded on the canonical XOR relation with ; the remaining rotation values are derived affinely from the fixed columns. For range checking, the row represents the 16-bit value .
The wrapping columns are
For physical byte positions zero through three, lookup messages divide the stored rotation contribution by the static scales . Because the scale depends only on the position, every normalized message remains affine in the trace.
The main trace contains one dynamic range multiplicity for every fixed row. A request to
range-check a field element removes a RangeCheck(x) message from the relation. The fixed
table inserts RangeCheck(v) with multiplicity . With challenge reduction , the
relation closes only when
Because the fixed table contains no value outside , a request for any other field element cannot be matched. Multiplicities allow any table value to be requested repeatedly without adding bridge rows or extending a VM trace.
Request sources
Range-check requests come from:
- selected operand-stack
u32operations, which request four checks for decoder helper values;U32DIVrequests two additional checks for its remainder bound; MPVERIFYandMRUPDATE, which request checks for the depth and , accepting exactly ;- each
MPVERIFYorMRUPDATE, which requests checks for the four limbs of its canonical-index helper and for ; - the memory chiplet, which requests five checks for sorted-access deltas and address limbs on each active row; and
- the Eidos compression AIR, which range-checks fused message/output limbs.
On an MPVERIFY or MRUPDATE row, the six Core helpers are [addr, b, y0, y1, y2, y3].
CoreAir enforces booleanity of and
where is the stack's node index, is the base-field modulus, and . The Merkle-init bus binds to the first direction bit derived by the hash controller. Range-checking the four limbs and proves and rules out a wrapped 64-bit path index. These requests are replayed through existing Core lookup columns: the low three limbs use the stack-overflow column, while the top-limb, doubled-top-limb, depth, and scaled-depth requests are split between the chiplet-request and block-stack/range/log-deferred columns. No hasher-controller chaining-value cells are used. See Merkle range checks for the exact packing.
The trace builder collects these counts deterministically and writes them into the range
multiplicity column of And8LookupAir. The relation uses its own bus identifier, so range-check
messages cannot cancel byte-AND or Eidos compression rotation messages even though they share the
same fixed rows.
Communication bus
The domain-separated RangeCheck
communication bus encodes a value as
. A request made
under flag contributes
while an And8 table row contributes
These interactions do not use a dedicated accumulator. They are packed with other lookup interactions in the Core and Chiplets AIRs. For AIR , let be the sum of all its lookup contributions and its trace length. The AIR commits the normalized sum
The verifier enforces the cross-AIR identity
where contains the explicit boundary messages required by other buses. The
RangeCheck bus has no boundary messages, so its table responses must cancel its requests.
Internally, the first lookup accumulator is anchored at zero and follows a normalized cyclic
recurrence, including the last-to-first edge; there is no separate requirement that a terminal
value be zero.
Cost and topology
The table height is always and is independent of VM program length. Its five
preprocessed columns are commitment-cached, while its seven main
columns contain only dynamic multiplicities: canonical XOR, five dedicated normalized rotation
relations, and range check. The seven table-side fractions use four auxiliary LogUp columns with
shape [1, 2, 2, 2]: canonical XOR is a singleton, two columns pair rotation relations, and the
last pairs one rotation relation with range check. Every interaction retains its typed
denominator, so the closing constraints have degree three without merging bus domains.
The table supplies both 16-bit range checks and the byte operations required by the native Eidos compression AIR.