Skip to content

Evaluating Piecewise Multilinears

Combining differently-sized subcubes

Here, we drop another bit of interesting mathematical content, to prepare the way for our batched commitment scheme. The idea again has to do with piecewise multilinears. We already saw that our batched commitment scheme starts with individual polynomials t0,,tn1t_0, \ldots , t_{n - 1} over the huge field Tτ\mathcal{T}_\tau, generally allowed to be different sizes. To commit to those polynomials, that procedure concatenates all of the given polynomials into a huge list, and reinterprets that list as a large multilinear polynomial (possibly after zero-padding the master list to a power-of-two length).

As we also mentioned, that procedure can also be viewed in a geometric way, using the idea of a piecewise function. That is, it takes its input multilinears t0,,tn1t_0, \ldots , t_{n - 1}, with numbers of variables 0,,n1\ell_0, \ldots , \ell_{n - 1}, say. Each of these individual multilinears ti(X0,,Xi1)t_i(X_0, \ldots , X_{\ell_i - 1}) defines "a Bi\mathcal{B}_{\ell_i}'s worth" of data. The master multilinear t(X0,,X1)t^*(X_0, \ldots , X_{\ell^* - 1}) that comes out of our commitment procedure is essentially a piecewise multilinear on the huge cube B\mathcal{B}_{\ell^*}, which takes the values that the individual polynomials ti(X0,,Xi1)t_i(X_0, \ldots , X_{\ell_i - 1}) respectively do on various disjoint subcubes BiB\mathcal{B}_{\ell_i} \subset \mathcal{B}_{\ell^*}.

Here, we set out with a basic question: let's say that we fix some evaluation point (r0,,r1)Tτ(r_0, \ldots , r_{\ell^* - 1}) \in \mathcal{T}_\tau^{\ell^*}. How do the individual evaluations

ti(r0,,ri1)\begin{equation*}t_i(r_0, \ldots , r_{\ell_i - 1})\end{equation*}

of the "facets", on appropriate prefixes of the (r0,,r1)(r_0, \ldots , r_{\ell^* - 1}), relate to the evaluation of the whole multilinear

t(r0,,r1)\begin{equation*}t^*(r_0, \ldots , r_{\ell^* - 1})\end{equation*}

at (r0,,r1)(r_0, \ldots , r_{\ell^* - 1})?

The Idea

The idea here isn't especially mysterious mathematically, but it involves some interesting algorithmic aspects. We imagine the components (r0,,r1)(r_0, \ldots , r_{\ell^* - 1}) coming to us one by one. The idea is to work "starting at the small end". As of the end of the iith round, some among the individual polynomials tj(X0,Xj1)t_j(X_0, \ldots X_{\ell_j - 1}) might become "freshly ready"—namely, those for which j1=i\ell_j - 1 = i. We recall that these things will be "placed" on j\ell_j-dimensional subcubes of B\mathcal{B}_{\ell^*}.

Upon receiving rir_i, our goal will be to "bootstrap" all outstanding subcubes of ii-dimensions into i+1i + 1-dimensional subcubes. We do this by doing linear combinations with 1ri1 - r_i and rir_i.

In general, as of the end of round ii, we will have some mix of freshly available, i+1=ji + 1 = \ell_j-dimensional subcubes, as well as possibly ii-dimensional subcubes left over from previous rounds. Our goal will be to "coalesce" or "smooth" everything ii-dimensional into i+1i + 1-dimensional things, by doing a pass over the trailing end of the data.

We will keep doing passes like this, as ii grows from {0,,1}\{0, \ldots , \ell^* - 1\}.

The Algorithm

We sketch the algorithm here. We assume as usual that 0n1\ell_0 \geq \cdots \geq \ell_{n - 1}. We imagine that we start with a list T0,,Tn1T_0, \ldots , T_{n - 1} of "claim" objects. From the verifier's viewpoint, each TjT_j will eventually contain the evaluation of tj(r0,,rj1)t_j(r_0, \ldots , r_{\ell_j - 1})—that is, as of the end of the j1\ell_j - 1st round, these things will become ready. In each round ii, our job will be to receive any such objects—i.e., for which j1=i\ell_j - 1 = i, or in other words j=i+1\ell_j = i + 1. Moreover, we will "lift" everything which is not yet i+1i + 1-dimensional to the i+1i + 1-dimensional level, by smoothing trailing subcubes.

To keep track of all the relevant information, we bake a linked-list structure into the claims T0,,Tn1T_0, \ldots , T_{n - 1}. To begin with, we initialize Tj.nextj+1T_j.\text{next} \coloneqq j + 1, for each j{0,,n1}j \in \{0, \ldots , n - 1\}.

Here are the steps.

  • For each round i{0,,1}i \in \{0, \ldots , \ell^* - 1\}:
    • The verifier samples riTτr_i \gets \mathcal{T}_\tau and sends it to the prover.
    • For each claim index j{0,,n1}j \in \{0, \ldots , n - 1\} for which j1=i\ell_j - 1 = i on the nose, the prover sends a claimed evaluation bj,j=?tj(r0,,rj1)b_{j, \ell_j} \stackrel{?}= t_j(r_0, \ldots , r_{\ell_j - 1}) to the verifier.
    • For the same set of j{0,,n1}j \in \{0, \ldots , n - 1\} (i.e., for which j1=i\ell_j - 1 = i), the verifier marks: Tj.claimbj,j.\begin{equation*}T_j.\text{claim} \coloneqq b_{j, \ell_j}.\end{equation*}
    • The verifier again writes jij_i for the minimum among those j{0,,n}j \in \{0, \ldots , n\} for which ji\ell_j \leq i holds. The verifier initializes kjik \coloneqq j_i, and then runs the following loop. While k<nk < n:
      • The verifier sets c0Tk.claimc_0 \coloneqq T_k.\text{claim}.
      • If the next element Tk.next<nT_k.\text{next} < n, then the verifier sets c1Tk.next.claimc_1 \coloneqq T_k.\text{next}.\text{claim}, and moreover cuts Tk.nextT_k.\text{next} out of the list, by overwriting Tk.next=Tk.next.nextT_k.\text{next} = T_k.\text{next}.\text{next}. Otherwise, the verifier sets c10c_1 \coloneqq 0.
      • In any case, the verifier now overwrites Tk.claim=(1ri)c0+ric1T_k.\text{claim} = (1 - r_i) \cdot c_0 + r_i \cdot c_1, and also updates k=Tk.nextk = T_k.\text{next}.
  • At this point, the verifier outputs the final value T0.claimT_0.\text{claim}.

Security Claim

Now, during the course of the above algorithm, the prover either did or didn't supply the correct evaluation claims bj,j=?tj(r0,,rj1)b_{j, \ell_j} \stackrel{?}= t_j(r_0, \ldots , r_{\ell_j - 1}) to the verifier. Our completeness claim is that if these claims were all valid, then the verifier's final output will be equal to nothing other than t(r0,,r1)t^*(r_0, \ldots , r_{\ell^* - 1}), where, again, t(X0,,X1)t^*(X_0, \ldots , X_{\ell^* - 1}) is defined in the piecewise way we already discussed. Conversely, if even a single of these was wrong, then the verifier's final output T0.claimT_0.\text{claim} will not be equal to t(X0,,X1)t^*(X_0, \ldots , X_{\ell^* - 1}), with high probability over the verifier's choice of the point (r0,,r1)(r_0, \ldots , r_{\ell^* - 1}). In fact, it can be shown that this soundness error is at most Tτ\frac{\ell^*}{|\mathcal{T}_\tau|}.