Batched Commitment
We now know how to commit to an -variate multilinear polynomial over the huge field . In practical applications, on the other hand, we will have many different multilinear polynomials at play. For the sake of concrete efficiency, it is crucial that we commit to these in a batched way, which allows, in particular, these polynomials' respective evaluation protocols to also be batched.
Of course, we haven't even yet seen how to evaluate a single polynomial, let alone many. For now, then, we will just record our batched commitment procedure, acknowledging all the while that it will appear unmotivated. We will refer back to this page when we discuss evaluation (see in particular this page).
Things are a bit easier when the number of polynomials at hand is a power of 2, and all the polynomials are of the same number of variables . In real life, this assumption is too simplifying. Here, we fix an arbitrary number of polynomials , of arbitrary different sizes . We still require for now that these all be defined over the big field (we will show shortly how this restriction gets relaxed).
The Steps
The simplest description of our batched scheme proceeds as follows:
- Up to a reindexing, we freely assume that the input polynomials are sorted in such a way that .
- Collect the input polynomials' respective individual, flattened lists of Lagrange coefficient vectors. Concatenate these lists into a huge master list, say .
- By possibly padding this list with trailing zeros, extend it until it becomes of power-of-2 size—say, .
- Commit to this list exactly as if it were a single polynomial on its own right. That is, additive-NTT the list , and send the result—a list of length —to the string oracle.
A Piecewise Description
While the description above is valid and correct, it's a tiny bit unsatisfying, since it only works in the language of lists, as opposed to in the language of cubes (we have always worked across a duality between these two paradigms). As there usually tends to be, there is a geometric way of seeing what's going on. The -variate multilinear we just committed to above can be viewed as a piecewise multilinear, which takes the values that the individual polynomials respectively do on various subcubes of . That is, on its "lexicographically smallest" -dimensional subcube (or "facet"), agrees identically with . On the next, -dimensional subcube, agrees with . And so on. If there are "missing" facets or vertices of the -cube still not yet covered when this process ends, we fill them with 0s.