Introduction
When opening at a single point for n polynomials, the common technique is to use a random linear combination, which requires n−1 scalar multiplications. Eliminating these operations could lead to more efficient verification. Meanwhile, in SHPlonk, when opening KZG in batch, the verifier randomly samples a point z←F and constructs a vanishing polynomial L(X) for this point. This method allows an opening at t points to be converted into an opening at a single point. However, the verifier still needs to perform O(n) computations, and reducing this cost could improve verification efficiency.
A natural question arises: can "the problem of opening at a single point for multiple polynomials" be transformed into "the problem of opening at multiple points for a single polynomial"? If possible, then leveraging SHPlonk’s method could enable more efficient batch opening for the verifier.
Background
Please read beforehand!
Protocol Explanation
When performing Radix-2 FFT, P(X) is decomposed into even and odd parts:
P(X)=PE(X2)+X⋅PO(X2) Now, consider a simple problem of opening at a single point x for multiple polynomials P0(X),P1(X). We define P(X) as follows:
P(X)=P0(X2)+X⋅P1(X2) Let x=z2, and open P(X) at S={z,−z}:
P(z)=P0(x)+z⋅P1(x)P(−z)=P0(x)−z⋅P1(x) By performing the following computations, we can retrieve P0(x) and P1(x):
P0(x)=2P(z)+P(−z)P1(x)=2zP(z)−P(−z) Thus, the original problem is transformed into opening at multiple points S={z,−z} for a single polynomial P(X), allowing us to apply SHPlonk’s batch opening method.
To generalize this approach to n polynomials, we need a way to combine P0(X),…,Pn−1(X) into a single polynomial and derive S from x.
Polynomial Combination and Decomposition
To merge multiple polynomials into one, we define the following functions:
combinen(P):F[X]n→F[X]: This constructs P(X) from P0(X),…,Pn−1(X):
P(X):=i<n∑Xi⋅Pi(Xn) decomposen(P):F[X]→F[X]n: This extracts P0(X),…,Pn−1(X) from P(X).
By definition, we have:
decomposen(combinen(P))=P By the way, decomposen(P) is just introduced, but not actually used in this protocol!
Finding
S from
x
Next, we define a function to derive the set of opening points S from x:
rootsn(x):F→Fn: This determines the point set S:
S:=(zωi)i<n where z∈F satisfies:
zi=x for i<n
n must be a divisor of p−1, and ω is the n-th root of unity.
For example, if n=4, meaning P={P0(X),P1(X),P2(X),P3(X)}, and we want to open at x, we construct:
P(X)=P0(X4)+X⋅P1(X4)+X2⋅P2(X4)+X3⋅P3(X4) The corresponding root set is:
S={z,zω,−z,−zω} This is because ω2=−1 since ω4=1.
Opening at S gives:
P(z)=P0(x)+z⋅P1(x)+z2⋅P2(x)+z3⋅P3(x)P(zω)=P0(x)+zω⋅P1(x)−z2⋅P2(x)−z3ω⋅P3(x)P(−z)=P0(x)−z⋅P1(x)+z2⋅P2(x)−z3⋅P3(x)P(−zω)=P0(x)−zω⋅P1(x)−z2⋅P2(x)+z3ω⋅P3(x) Remember that x=z4 by definition!
By computing:
P0(x)=4P(z)+P(zω)+P(−z)+P(−zω)P1(x)=4zP(z)+P(zω)−P(−z)−P(−zω)P2(x)=4z2P(z)−P(zω)+P(−z)−P(−zω)P3(x)=4z3P(z)−P(zω)−P(−z)+P(−zω) we can recover P0(x),P1(x),P2(x),P3(x).
Opening Multiple Polynomials at Multiple Points
Consider the same example from SHPlonk:
P0(X) is opened at x0 with value y0.
P1(X) is opened at x0,x1 with values y1,y2.
P2(X) is opened at x0,x1 with values y3,y4.
Let P={P0,P1,P2}, then we compute P(X)=combine4(P), determine S0=roots4(x0) and S1=roots4(x1), and perform a batch opening with S0∪S1.
Let's set the maximum allowable number of polynomials as A. Then, if there are n<A polynomials of degree d, and each polynomial is opened at t points, the computational costs are as follows:
The number of opening sets s: 1≤s≤n
srs size: A⋅(d+1)G1,2G2
Prover work: O(d)G1,O(s⋅dlogd)F
Proof length: 2G1
Verifier work: O(1)G1,O(n)F,2P
Here, Gi represents scalar multiplication in Gi, F represents addition or multiplication in F, and P denotes a pairing operation.
Conclusion
TODO(chokobole): compare the prover performance between groth16 and fflonk.
References