- number of gates on a layer is S - number of bits for that layer is $s = log S$ - number of variables in poly we sum is $f(b, c)$ where $|b| = s$ and $|c| = s$ - so total number of variables = $2s$ - prover time for sumcheck is $O(2^v)$ - #todo show how thalers prover time got to this - $O(2^v \cdot T - T) = O(2^v)$ - then $\sum_{i} 2^{v-1} = 2^v - 1$ - linear time sumcheck for multilinear functions - evaluation form representation of the polynomial - get the halves and sum to get the round message - get the r - fold using r - repeat - basic stuff - linear time sumcheck for product of multilinear functions - similar to regular sumcheck over multilinear functions - but now returns round poly in {0, 1, 2} - and two bookkeeping tables - linear time sumcheck for gkr functions - gkr functions are of the following form - $\sum_{x, y \in \{0, 1\}^l} f_1(g, x, y) \cdot f_2(x) \cdot f_3(y)$ - where $f_1$ represents a sparse polynomial i.e $O(2^l)$ non-zero elements out of the possible $O(2^{3l})$ - libra achieves linear time by rewriting the equation above - $\sum_{x, y \in \{0, 1\}^l} f_1(g, x, y) \cdot f_2(x) \cdot f_3(y)$ = $\sum_{x \in \{0,1\}^l} f_2(x) \sum_{y \in \{0,1\}^l} f_1(g, x, y) \cdot f_3(y)$ = $\sum_{x \in \{0,1\}^l} f_2(x) h_g(x)$ - where $h_g(x) = \sum_{y \in \{0,1\}^l} f_1(g, x, y) \cdot f_3(y)$ - so the equation $\sum_{x \in \{0,1\}^l} f_2(x)h_g(x)$ is only in terms of x - this is exactly the same as performing sumcheck over the product of two multilinear polynomials - the only thing missing is generating the book-keeping table for $h_g(x)$ - the book-keeping table for $f_2(x)$ is already known as the polynomial was gotten from the multilinear extension of some array. - detour - if I have some multilinear function $f(a, b, c)$ - I can interpret this in the lagrange basis - a dot product between the evaluation form values and the bit checkers for each evaluation form value. - i.e $f(a, b, c) = \sum_{x, y, z \in \{0,1\}^l} eq_{xyz}(a, b, c) \cdot F[x, y, z]$ - where F is the array that defines the multilinear form array representation of $f$ - only the non-zero elements in F will contribute to the sum - if we knew all the locations of F that were non-zero can we optimize this computation? - imagine we had a mapping (a, b, c) -> non_zero_ouptut - let us call this mapping $N$ - we can use this to compute the final output - $\sum_{(x, y, z) \in N} eq_{xyz}(a, b, c) \cdot F[x, y, z]$ - this will give the same answer, but reduces the amount of computations we are required to do (drastically if F is sparse). - can eq be decomposed? - seems we indeed can, we can express a big eq equation as a product of smaller eq equations - $eq(x_1, x_2, x_3, y_1, y_2, y_3) = \prod_{i = 1} (1 - x_i)(1 - y_i) + x_i \cdot y_i$ - each product term is an eq for $x_i$ and $y_i$ - hence we can rewrite as follows - $eq(x_1, x_2, x_3, y_1, y_2, y_3) = eq(x_1, y_1) \cdot eq(x_2, y_2) \cdot eq(x_3, y_3)$ - idea summary - it is assumed one has a sparse function, where the non-zero entries are know i.e both index and non-zero output. - we have some equation that uses the sparse function as a multiplication term. - knowing the zero / non-zero entries of this function makes computing that equation a lot more efficient, because you only look at the non-zero terms. - hence this means that you need to keep the sparse function in the lagrange basis. - that way, you know what is 0 and you can avoid doing wasted computations. - generating the book-keeping table $A_{h_g}$ - we need a table that evaluates $h_g(x)$ over the boolean hypercube. - recall $h_g(x) = \sum_{y \in \{0, 1\}^l} f_1(g, x, y)f_3(y)$ - here $f_1$ is partially evaluated at g, our sparse entries are no longer valid - to keep it sparse, we can extract $g$ into it's own eq - $h_g(x) = \sum_{z, y \in \{0, 1\}^l} eq(g, z) \cdot f_1(z, x, y) \cdot f_3(y)$ - now given any x we should be able to compute the corresponding value of $h_g(x)$ - we have the map (a, b, c) -> non_zero - the value of x we want to evaluate $h_g(x)$ is known and it is also boolean - so we can filter the map based on $b == x$ - let us call this filtered map $N_x$ - the final equation becomes - $h_g(x) = \sum_{(z, y) \in N_x} eq(g, z) \cdot F_i[z, x, y] \cdot f_3(y)$ - the above is computable without ever needing to compute the full $f_1$ table - after running sumcheck on $\sum_{x \in \{0,1\}^l} f_2(x)h_g(x)$ - we'd have randomness associated with x, let us call this u. - going to back to the original equal we can replace all x with u to give - $\sum_{y \in \{0, 1\}^l} f_1(g, u, y)f_2(u)f_3(y)$ - $f_2(u)$ will be a scalar, we can do scalar mul with all entries in $f_3(y)$ and that gives us the book-keeping table - we also need a book-keeping table for $f_1(g, u, y)$ we want to get that table without constructing the entire $f_1$ table and then partially evaluating at g and u - we can use the same idea, keep $f_1$ in the lagrange basis, we get - $\sum_{x, y, z \in \{0, 1\}^l} eq(g, z) \cdot eq(u, x) \cdot F[z, x, y] \cdot f_2(u) \cdot f_3(y)$ - now that F is entirely in the lagrange basis and we also know all the non-zero entries we can make the computation compute the $A_{f_1}$ table efficiently. - $A_{f_1}[y]$ = $\sum_{x, z \in \{0, 1\}^l} eq(g, z) \cdot eq(u,x) \cdot F[z, x, y]$ - let $N$ be the mapping of all entries in $f_1$ that are non-zero - given that we know y we can filter that mapping to get $N_y$ - $A_{f_1}[y] = \sum_{(x, z) \in N_y} eq(g, z) \cdot eq(u, x) \cdot F[z, x, y]$ - but this is much faster to compute - see [[generalize-libra-sumcheck-to-c-phases]] - 2 to 1 trick - initially we have $\sum f(g, x, y) \cdot f_2(x) \cdot f_3(y)$ - at the folding step we have two different evaluations of g i.e $g_1$ and $g_2$ - $c_1 = \sum f(g_1, x, y) \cdot f_2(x) \cdot f_3(y)$ and - $c_2 = \sum f(g_2, x, y) \cdot f_2(x) \cdot f_3(y)$ - rather than performing two libra sumchecks we want to perform just one - we can perform this reduction via the [[random-linear-combination]] - LHS - $C = \alpha \cdot c_1 + \beta \cdot c_2$ - RHS - $\alpha \cdot f(g_1, x, y) \cdot f_2(x) \cdot f_3(y) + \beta \cdot f(g_1, x, y) \cdot f_2(x) \cdot f_3(y)$ - we can factorize $f_2(x)$ and $f_3(y)$ - $(\alpha \cdot f(g_1, x, y) + \beta \cdot f(g_2, x, y)) \cdot f_2(x) \cdot f_3(y)$ - we can further simplify the sum via $I(g,z)$ - $((\alpha \cdot I(g_1, z) \cdot f(z, x, y)) + (\beta \cdot I(g_2, z) \cdot f(z, x, y)) \cdot f_2(x) \cdot f_3(y)$ - which allows us to factor out $f(z, x, y)$ - $(\alpha \cdot I(g_1, z) + \beta \cdot I(g_2, z)) \cdot f(z, x, y) \cdot f_2(x) \cdot f_3(y)$ - hence the only change to account for folding is the building of the $I(g, z)$ table