Front-Loaded Sumcheck
Here, as preparation for our evaluation scheme, we explain how we batch sumchecks on differently-sized polynomials. The setup is that we have a list of sum claims
where each is an -variate composition polynomial. As the claim index varies, we allow to vary too! (They don't have to be the same across all polynomials.)
Standard Batched Sumcheck
When the sizes are all the same, batching sumchecks is not conceptually hard. Indeed, it's enough for the verifier to generate a random combination scalar , and to compute the combined sum claim:
The parties can then run an -round sumcheck on the batched polynomial
At the very end, the verifier needs to learn , for some point that the verifier will sample throughout the course of the sumcheck. To do this, it can just ask the prover nondeterministically for the individual values , and output these as reduced evaluation claims.
The Procedure
When the sizes are unequal, many aspects of the above recipe stop making sense. We can still define the polynomial above, provided we write , say. But this polynomial's sum over is not what we're interested in. (It would "double up" the sums of the smaller polynomials, causing them to become annihilated.) So we can't run a simple sumcheck on it.
Roughly, our approach is to "kick off" all sumchecks at the same time. On the other hand, since the polynomials are of different sizes, some will end earlier than others. We thus need to "prune" the finished sumchecks away from the protocol on the fly, as we run it. More precisely, each time a polynomial "finishes", that its sumcheck has been fully evaluated, we need to "knock out" that polynomial's contribution from the running sum claim.
Without further ado, we now present our procedure. For notational convenience, we assume that the polynomials are sorted in descending order by size, so that .
- The verifier samples a batching challenge and sends it to the prover. The verifier locally computes the batched sum claim:
- For each round index , where again we write :
- The prover computes the round polynomial and sends it to the verifier. Here, the upper index of the sum is chosen to be the minimum among those for which holds. The point is that all of the polynomials indexed have more than variables, so each expression makes sense! (It might happen that , in which case the boolean suffix will be empty, but this is fine.)
- The verifier checks whether holds.
- The verifier samples and sends it to the prover. The verifier moreover computes the updated sum claim:
- For each for which holds on the nose—or equivalently, for each —the prover nondeterministically sends the evaluation claim
- Again for each for which holds, the verifier mutates as follows, using the information it just received:
- At the very end, i.e. after rounds, the verifier requires .
- The verifier outputs the reduced evaluation claims it received throughout the course of the protocol; namely, whereby, for each ,
Some Remarks
The above protocol is pretty cool and tricky; here, we record a few remarks.
- We note that the evaluation claims output by the verifier are front-loaded, in the sense that the prefixes are all common. That is, the various evaluation points share common initial substrings, though some are longer than others.
- It is an instructive exercise to check that this becomes equivalent to the standard batched sumcheck when holds.
- It is an algorithmic invariant of the above loop that the only sumchecks "still in the running", as of the beginning of each round , are those for which . In other words, each polynomial "still left" has more than variables. There is a slight subtlety, namely that we have to forbid 0-variable (constant) polynomials! We could accommodate those, but only by complicating the protocol above.
The security proof of our front-loaded sumcheck proceeds pretty similarly to how the standard batched sumcheck's does.