Try   HackMD

In Jim Posen's note, the protocol ends with the verifier querying

vi,j=Mi(j||r0,,rνk1)
for all
jBk
.

Using these, the verifier computes the evaluations

v^i=M^i(rY,r0,,rνk1)=jDvi,jLj,D(rY),
and is able to check that
C(v^0,,v^n1)
equals the final Sumcheck sum.

If we assume that the values

vi,j are provided as-is, we can check that they are correct using a single query to
Mi
. Moreover, this avoids an extra invocation of the Sumcheck protocol, though it comes at the expense of more verifier work.

The verifier sends a new random element

reF and evaluates the
2k
Lagrange polynomials over
Bk
at
re=(re,re2,,re2k1)
. The evaluations
Lj,Bk(re)
, for each
 jBk
can be computed using
O(k2k)
. This allows the verifier to compute an evaluation
vi
of
Mi
at
(re||r0,,rνk1)
. The following shows how the same evaluation can be derived by the verifier:

vi=Mi(re||r0,,rνk1)=jBkMi(j||r0,,rνk1)Lj,Bk(re)=jBkvi,jLj,Bk(re)

Alternatively, we can minimize the amount of verifier work by invoking a slightly more optimized Sumcheck instance.

Reusing the same random value

re, we define the
k
-variate polynomial
powre(X0,,Xk1)
such that
powre(j)=rej
for all
jBk
. The verifier computes
σi=j=02k1rejvi,j

which is the claimed sum for the Sumcheck instance

powre(X0,,Xk1)eq(r0,,rνk1;Xk,,Xν1)Mi(X0,,Xν1)

The following shows that the sum is correct:

σi=j1Bkj2Bνkpowre(j1)eq(r0,,rνk1;j2)Mi(j1||j2)=j1Bkpowre(j1)j2Bνkeq(r0,,rνk1;j2)Mi(j1||j2)=j1Bkpowre(j1)Mi(j1||r0,,rνk1)=j1Bkrej1Mi(j1||r0,,rνk1)=j1Bkrej1vi,j

While this introduces

ν additional rounds of interaction, the verifier only performs
O(2k+ν)
field operations.