本文深入探讨了Bagad, Dao, Domb和Thaler关于加速SUMCHECK协议的工作,重点关注应用于多线性多项式乘积的多项式优化的SUMCHECK协议。文章详细介绍了等式多项式在密码学环境中的应用,并深入研究了由BDDT提出的SUMCHECK协议优化方案,包括变量分割、嵌套求和等关键技术,旨在提高协议的计算效率和降低内存需求。
在本文中,我们将继续研究和分析 Bagad、Dao、Domb 和 Thaler 的著作“加速 SUMCHECK”,该著作涉及应用于多线性多项式乘积的多项式的 SUMCHECK 协议的优化。现在是深入研究细节的时候了:由于等式多项式在密码学环境中被广泛使用,因此人们对它们的兴趣非常浓厚。
本文的读者肯定遇到过等式多项式(也称为“eq 多项式”)——这些多项式在其定义域内的所有点上都计算为零,但在一个点上计算为 1。在通常的实分析术语中,它们也称为笛卡尔空间中点的指示函数。回顾在单个和多个变量中多线性多项式的作用,可以通过将“较小的多项式”相乘来获得等式多项式。具体来说,假设 $F$ 是一个域,并且令 $\omega \in F^\ell$:它是
$\omega = (\omega_1, \omega2, \dots, \omega\ell)$
对于 $\omega_i \in F$。现在假设我们将 $\omega$ 分成块;例如,假设我们想将它分成三个块,比如
$\omega = (\omega_L, \omega_C, \omega_R)$
其中 $L, C, R$ 是 $[\ell] = {1, 2, \dots \ell}$ 的一个划分,使得 $l < c < r \forall l \in L, c \in C, r \in R$。这些子集表示每个“块”中涉及的索引。如果读者需要一些帮助来想象这一点,只需考虑
$\omega = (2, 3, 4, 2, 5, 5) = ((2, 3), (4, 2), (5, 5))$
对于 $L = {1, 2}, C = {3, 4}, R = {5, 6}$。
分块分割点的好处在于它与等式多项式的因式分解兼容:$\omega = (\omega_L, \omegaR) \implies eq\omega(x) = eq_{\omega_L}(xL)eq{\omega_R}(x_R)$,对于 $x = (x_L, x_R)$,变量 $x$ 的一个分块。
这当然与多线性多项式的插值基的张量性质完全兼容,并且不足为奇。一个额外的观察结果很方便,并且将发挥关键作用,尤其是在求和有限域上定义的多项式的评估时。每当多项式 $f$ 可以如上所示进行分块分解时,它的积分(即其评估的总和)可以按顺序完成,或者换句话说:有一种巧妙的方法可以重新排序我们可以利用的评估域。具体来说,假设 $x \in F^\ell$ 并且
$f(x) = f_L(x_L)f_R(x_R)$
那么所有 $x$ 上的总和可以根据它的任何块来索引:
$\sum{x \in F^\ell} f(x) = \sum{x \in F^\ell} f_L(x_L)f_R(xR) = \sum{xR \in F^R} \sum{x_L \in F^L} f_L(x_L)f_R(x_R)$
通过固定外层求和中的索引,涉及该索引的因子可以从内层求和中取出(即反向分配律),因此
$\sum{x \in F^\ell} f(x) = \sum{x_R \in F^R} f_R(xR) \sum{x_L \in F^L} f_L(x_L)$
这种想法将是我们讨论和利用的:固定 $X_R$ 将允许预先计算 $X_L$ 上的和,其中 $X_R$ 被视为参数:从这个意义上说,后一个和是预先计算的,然后在调用参数 $X_R$ 时重新使用。
如果读者想知道游戏的名字是什么:游戏的名字是积累,积累,积累(但要巧妙地积累)。
我们现在准备深入研究 BDDT 提出的优化。起点是一个在形如 $g(X) = \tilde{eq}(w, X) \cdot p(X)$ 的多项式上的 sum-check 协议,其中 $p(X)$ 本身就是 $d$ 个多线性多项式的乘积。这使得 $g(X)$ 成为一个 $d+1$ 次的多项式。在 sum-check 协议的每一轮 $i$ 中,证明者必须发送一个单变量多项式 $s_i(X)$,它是 $g(X)$ 在剩余变量上的和。为了定义这个多项式,证明者需要计算它的 $d+2$ 个评估值。
作者采用了 Angus Gruen 的工作,并将其进一步发展。**简而言之,Gruen 的关键思想是利用等式多项式 $\tilde{eq}$ 的特殊结构。这个多项式可以分解成一个乘积:
$\tilde{eq}(w, (r1, \dots, r{i-1}, Xi, x{i+1}, \dots, x_l)) = \tilde{eq}(w[<i], r[<i]) \cdot \tilde{eq}(w_i, X_i) \cdot \tilde{eq}(w[>i], x')$
这种分解的效果是,最初定义为在 $x'$ 上的和的轮多项式 $s_i(X_i)$ 现在看起来像一个乘积:
$s_i(Xi) = \sum{x'} g(r, Xi, x') = \sum{x'} eq(r, X_i, x')p(r, Xi, x') = \sum{x'} eq{w<i}(r) eq{w_i}(Xi) eq{w>i}(x') p(r, Xi, x') = eq{w<i}(r) eq_{w_i}(Xi) (\sum{x'} eq_{w>i}(x') p(r, X_i, x'))$
现在,轮多项式是一个线性因子 $l_i(X_i)$ 的乘积,即
$l_i(Xi) = eq{w<i}(r) eq_{w_i}(X_i)$
它取决于前几轮的挑战 ($r[<i]$) 和当前的变量 ($X_i$),以及一个 $d$ 次因子,$t_i(X_i)$:
$t_i(Xi) = \sum{x'} eq_{w>i}(x') p(r, X_i, x')$
它包含实际的求和,包括 $p_k$ 多项式的乘积和 $\tilde{eq}$ 多项式的剩余部分。因此,证明者在第 $i-th$ 轮计算的多项式是
$s_i(X_i) = l_i(X_i) \cdot t_i(X_i)$
读者可能会问,以这种方式思考 $s_i$ 有什么好处。
证明者现在只需要计算更简单的多项式 $t_i(X)$ ($d$ 次) 的 $d+1$ 个评估值,而不是计算复杂多项式 $s_i(X)$ ($d+1$ 次) 的 $d+2$ 个评估值。其中一个评估值,$t_i(1)$,可以从协议的一致性检查中推导出来 ($s_i(0) + si(1) = C{i-1}$),因此在实践中,只需要显式计算 $d$ 个和。
总而言之,Gruen 降低了证明者必须执行最多工作的多项式的次数,从而节省了协议每一轮中一次完整评估的成本。BDDT 的关键思想是重新应用 $\tilde{eq}$ 多项式的可分离性,但这次是在被求和的剩余变量 ($x'$) 上,并结合他们之前提出的将 $p$ 在随机挑战处的评估转移到拉格朗日插值多项式的评估上。概括地说,这项新颖的工作如下:
这种重写是优化的核心。证明者现在可以首先计算内和(在 $x_L$ 上),然后将这些结果用于外和(在 $x_R$ 上)。
这种“和拆分”技术在时间和内存方面都产生了非常显著的好处。
这种优化是在协议的前 $l/2$ 轮中应用的。对于剩余的轮次,好处会减少,并且算法会切换回标准方法。
作者提出将 Gruen 的策略与他们自己来自 SmallValues 优化的想法相结合,这意味着在评估多项式 $l_i$ 和 $t_i$ 时需要特别注意。在第 $i$ 轮中,发送给验证者的数据
$s_i(u) = l_i(u)t_i(u)$
有一个计算量更大的部分:计算一个足够大的集合中的 $u$ 的 $t_i(u)$。到目前为止,这个多项式的唯一可用定义由下式给出
$ti(u) = \sum{x'} \tilde{eq}(w>i, x') \cdot \prod_{k=1}^d p_k(r, u, x')$
SmallValues 优化允许将其重写为
$ti(u) = \sum{v \in Gi} (\sum{x'} \tilde{eq}(w>i, x') \cdot \prod_{k=1}^d p_k(v, u, x')) \cdot L_v(r)$
其中
现在是让分块划分的力量闪耀并发挥其魔力的时候了:现在可以分两步进行 $x'$ 上的总和:
$Ai(v, u) = \sum{x{out}} \tilde{eq}(w{out}, x{out}) \sum{x{in}} \tilde{eq}(w{in}, x{in}) \prod{k=1}^d pk(v, u, x{in}, x_{out})$
别慌,我们已经到了。现在考虑前缀 $\beta = (v, u)$ 和调用 $E{in}[x{in}] = eq(w{in}, x{in})$。最后一个内和由 $\beta$ 和 $x_{out}$ 参数化,应称为临时累加器 $tA[\beta]$。
$tA[\beta] = \sum{x{in} \in {0, 1}^{l/2}} E{in}[x{in}] \cdot \prod_{k=1}^d pk(\beta, x{in}, x_{out})$
现在我们已经命名了适当的对象,我们可以描述该算法的工作方式。
核心思想是一种记忆化形式。该算法并非为每个累加器计算整个和,而是计算一次最内层的和并重复使用结果:确实,是分块划分的效果。
a. 对于每个前缀 $\beta$,计算 $\sum{x{in}} E{in}[x{in}] \cdot \prod pk(\beta, x{in}, x_{out})$。
b. 每个 $\beta$ 的内和的结果存储在称为 $tA[\beta]$ 的临时累加器中。
a. 它对每个前缀 $\beta$ 及其在 $tA[\beta]$ 中的对应值进行迭代。
b. 使用映射函数 idx4(在 A.5 中定义),它确定此前缀 $\beta$ 对哪个最终累加器 $(i, v, u)$ 有贡献。
c. 它将 $tA[\beta]$ 的值添加到适当的最终累加器中,并由外部 eq-poly 因子 $E_{out, i}$ 加权。
当我们在研究 BDDT 的 SmallValue 优化时,我们讨论了这种方法,但是很高兴让读者了解这是如何执行的。idx4 分类算法的作用是在预计算阶段充当智能“调度器”或“路由器”。它的功能是确定应该用刚刚计算出的中间结果来更新哪些最终累加器 $A_i(v, u)$,可能来自不同的轮次。
_过程 9_(算法 6 的预计算引擎)旨在实现高效率。该算法不是单独计算每个累加器 $A_i(v, u)$,而是对长度为 $l_0$ 的所有可能前缀 $\beta$ 进行迭代,并为每个前缀计算一个值:临时累加器 $tA[\beta]$。
问题在于,单个值 $tA[\beta]$(例如,针对前缀 $\beta = (0, 1, 0)$ 计算得出的)可能是以下计算的一部分:
_idx4_ 要回答的问题是:给定一个 $\beta$,必须将此 $tA[\beta]$ 发送到哪个最终累加器的所有“地址”($i, v, u$)?
它的逻辑包括为每一轮 $i$(从 1 到 $l_0$)“分解”前缀 $\beta$,并检查它是否满足所需的结构。对于与第 $i$ 轮的累加器有效的前缀 $\beta$,对应于未来变量(向量 $y$)的部分 必须是二进制的(仅包含 0 和 1)。多项式 $g$ 具有 eqeq 因子这一事实最终极大地简化了此分发步骤,因为预先计算的乘积/和的数量很少参与累加器的构造。
假设 $l0 = 3$ 并且计算的前缀为 $\beta = (0, 1, 0)$。_idx4 将执行以下操作:
a. $u = \beta_1 = 0$。
b. 剩余的是 $y = (\beta_2, \beta_3) = (1, 0)$。
c. 由于 $y$ 是二进制的,因此 是的。_idx4 生成元组 _(i=1, v=(), u=0, y=(1, 0))\。
a. $v = (\beta_1) = (0)$。
b. $u = \beta_2 = 1$。
c. 剩余的是 $y = (\beta_3) = (0)$。
d. 由于 $y$ 是二进制的,因此 是的。_idx4_ 生成元组 (i=2, v=(0), u=1, y=(0))。
a. $v = (\beta_1, \beta_2) = (0, 1)$。
b. $u = \beta_3 = 0$。
c. 剩余的 $y$ 为空。
d. 是的。_idx4_ 生成元组 (i=3, v=(0, 1), u=0, y=())。
相比之下,如果 $\beta = (2, 1, 0)$,它将只对第 1 轮有贡献。对于第 2 轮和第 3 轮,前缀的 $v$ 部分将包含一个 2,这不是二进制值,因此不属于定义这些轮次的累加器的布尔超立方体上的总和。
为了固定想法,我们现在将通过一个包含小的具体数字的示例进行讲解。如果你愿意,拿一张纸和一些咖啡,并在我们进行初始几轮计算时仔细检查计算。
我们将使用一个 6 变量 的多项式,同时将优化轮次保持在 $l_0 = 2$。此更改使我们可以在第 2 轮中有一个非空的 $x_{out}$,从而显示临时累加器和最终累加器之间的完整交互。
考虑多项式
$g(X) = \tilde{eq}(w, X) \cdot (X_1 + X_3 + X_5 + 1) \cdot (X_2 + X_4 + X_6 + 2)$而 eqeq 是向量 $w=(1,0,1,1,0,1)$ 的等式多项式。考虑到 $l_0=2$,则只有第 1 轮和第 2 轮被优化。作为作者对插值集合的选择,我们将坚持使用 $U_2={\infty,0,1}$。证明者需要计算 $u\in U_2={\infty,0}$ 的 $t_2(u)$。
由于 $\ell_0=2$,因此 6 个变量的划分如下:
a. xinxin (大小 $l/2=3$): $(X_3,X_4,X5)$。其 eq 向量为 $w{in}=(w_3,w_4,w_5)=(1,1,0)$。
b. xoutxout (大小 $l/2-l_0=1$): $(X6)$。其 eq 向量为 $w{out}=(w_6)=(1)$。
证明者需要计算以下各项的值 $s_1(X_1)=l_1(X_1)t_1(X_1)$
在 $\infty$ 和 $0$ 处。请记住,线性因子 $l_i(X_i)$ 定义为:
$l_i(Xi)=\underbrace{\tilde{eq}(w[<i],r[<i])}{\text{过去挑战}} \cdot \underbrace{\tilde{eq}(w_i,Xi)}{\text{当前变量}}$
因此,在第 1 轮 $i=1$ 中,过去挑战 $r[<1]$ 的集合为空。按照惯例,空集上的乘积为 1。因此,公式的第一个因子就是 1。这意味着
$l_1(X_1)=1\cdot \tilde{eq}(w_1,X_1)=\tilde{eq}(1,X_1)=X_1$
这意味着 $l_1(\infty)=1$ 并且 $l_1(0)=0$,所以好消息是我们不需要计算 $t_1(0)$。让我们开始工作,看看 $t_1$ 的前导系数是如何计算的。
根据算法 6,
$t_1(u)=\langle R_1,A_1(u)\rangle=A_1(u)$(因为 $R_1=[1]$)
因此,任务简化为计算最终累加器 $A_1(\infty)$,这就是临时累加器发挥作用的地方。由于优化参数是 $\ell_0=2$,那么
eq 向量 是 $w{in}=(1,1,0)$ 和 $w{out}=(1)$,我们有 $E{out,1}(1,0)=0$ 和 $E_{out,1}(1,1)=1$,所以我们不会计算 $x_6=0$ 的临时累加器(它乘以零)。为了完整起见,我们在此处包含一个包含此案例中的预计算的小表格:
$x_6=1$ 的临时累加器
| u | $y_2$ | $p_1=u+2$ | $p_2=y_2+4$ | tA[u,y2] |
|---|---|---|---|---|
| $\infty$ | 0 | 1 | 4 | $1\cdot 4=4$ |
| $\infty$ | 1 | 1 | 5 | $1\cdot 5=5$ |
| 0 | 0 | 2 | 4 | $2\cdot 4=8$ |
| 0 | 1 | 2 | 5 | $2\cdot 5=10$ |
因此,让我们计算 $x6=1$ 的外部循环。现在,乘积的内部权重由 $E{in}(w{in},x{in})$ 给出,因此内部总和中唯一的项是对应于 $x_{in}=(1,1,0)$ 的项,因此
$tA[\infty,0]=p_1(\infty,0,1,1,0,1)\cdot p_2(\infty,0,1,1,0,1)=1\cdot 4=4$
和
$tA[\infty,1]=p_1(\infty,1,1,1,0,1)\cdot p_2(\infty,1,1,1,0,1)=1\cdot 5=5$
这意味着
$A_1(\infty)=1\cdot tA[\infty,0]+1\cdot tA[\infty,1]=4+5=9$
因此,证明者发送
$s_1(\infty)=1\cdot 9=9$ and $s_1(0)=0$
首先,我们处理线性因子 $l_2(X_2)$。该因子来自 $(r_1,X_2)$ 处计算的 eq (X1,X2) 上关于前缀变量的 :
$l_2(X_2)=\tilde{eq}((w_1,w_2),(r_1,X_2))=\tilde{eq}(1,r_1)\cdot \tilde{eq}(0,X_2)=r_1\cdot (1-X_2)$
很明显
$l_2(\infty)=-r_1$ and $l_2(0)=r_1$
现在到了计算 $t_2(X_2)$ 的艰难部分。由于这是通过 SmallValue 优化计算的,因此它涉及使用预先计算的累加器组合拉格朗日插值多项式在随机挑战 $r_1$ 处的求值:最终结果是乘积之和,作者通常将其显示为内积 $t_2(u)=\langle R_2,A_2(u)\rangle$,其中挑战向量 $R_2$ 取决于 $r_1$ 和 $U_2={\infty,0,1}$,并计算为:
那么挑战向量是 $R_2=(r_1(r_1-1),1-r_1,r_1)$。
现在,我们将按照过程 9 的逻辑计算 $v,u\in U_2$ 的值 $A2(v,u)$,该过程迭代 $x{out}=(X_6)$;同样,由于
$E_{out,2}(1,X_6)=X_6$
我们只需要考虑 $x6=1$ 的情况。此外,在这种情况下,临时累加器 $tA$ 的计算得益于我们在第一轮中已经学到的知识:对于 $x{in}=(1,1,0)$,总和仍然会折叠。为了完整起见,我们包括
$x_6=1$ 的临时累加器
| v | u | $p_1=v+2$ | $p_2=u+4$ | tA[v,u] |
|---|---|---|---|---|
| $\infty$ | $\infty$ | 1 | 1 | $1\cdot 1=1$ |
| $\infty$ | 0 | 1 | 4 | $1\cdot 4=4$ |
| 0 | $\infty$ | 2 | 1 | $2\cdot 1=2$ |
| 0 | 0 | 2 | 4 | $2\cdot 4=8$ |
| 1 | $\infty$ | 3 | 1 | $3\cdot 1=3$ |
| 1 | 0 | 3 | 4 | $3\cdot 4=12$ |
我们现在可以构建一个包含此轮中涉及的最终累加器的表格。由于证明者需要发送在 $\infty$ 和 $0$ 处的求值,因此我们仅计算累加器
$A_2(\infty,\infty), A_2(0,\infty), A_2(1,\infty), A_2(\infty,0), A_2(0,0), \text{and } A_2(1,0)$
请记住:$E{out,2}$ 和 $E{in}$ 的权重消除了定义中的大多数总和
$A2(v,u)=\sum{x{out}}E{out,2}\sum{x{in}}E{in}[x{in}]p1(v,u,x{in},x_{out})p2(v,u,x{in},x_{out})$
简化为
$A_2(v,u)=p_1(v,u,1,1,0,1)p_2(v,u,1,1,0,1)$
这种情况的急剧减少清楚地表明了这种计算循环多项式的方法的工作原理:通过 $t_i$ 收集的 eq 因子进行块分区会导致大部分总和消失,并产生很少的对累加器有贡献的非平凡的加数。
为了完整起见,这是一个显示最终累加器的表格
| A2(v,u) | u=$\infty$ | u=0 | u=1 |
|---|---|---|---|
| v=$\infty$ | 1 | 4 | (不需要) |
| v=0 | 2 | 8 | (不需要) |
| v=1 | 3 | 12 | (不需要) |
在本轮中,我们结合挑战向量,使用累加器作为权重来生成 $t_2(u)$ 的求值:
\begin{itemize}
$t2(0)=\sum{v\in U_2}R_2[v]\cdot A_2(v,0)=r_1(r_1-1)\cdot A_2(\infty,0))+(1-r_1)\cdot A_2(0,0)+r_1\cdot A_2(1,0)=r_1(r_1-1)\cdot 4+(1-r_1)\cdot 8+r_1\cdot 12$
$t2(\infty)=\sum{v\in U_2}R_2[v]\cdot A_2(v,\infty)=(r_1(r_1-1)\cdot A_2(\infty,\infty))+((1-r_1)\cdot A_2(0,\infty))+(r_1\cdot A_2(1,\infty))=(r_1(r_1-1)\cdot 1)+((1-r_1)\cdot 2)+(r_1\cdot 3)$
最后,prover 将以下值发送给验证者
$s_2(\infty)=l_2(\infty)\cdot t_2(\infty)$ and $s_2(\infty)=l_2(\infty)\cdot t_2(\infty)$
(实际的证明者替换挑战 $r_1$ 并生成一个数值输出交给验证者,这就是前两轮的内容)
一旦使用预计算进行优化后的轮次完成,算法将切换其策略以用于协议的其余部分。
这一单轮的目标是从预计算的“快速模式”切换到“标准”线性模式。prover 计算多项式 $p_k$ 的求值,其中前 $l_0$ 个变量已固定为挑战 $(r1,\dots,r{l_0})$。此阶段的结果是创建将在最后几轮中使用的数据数组(称为 $P_k$)。
从这一点开始,协议遵循标准的线性 sum-check 算法(类似于算法 1 或 5)。在这些轮次的每一轮中:
i. 证明者使用当前的数组 $P_k$ 来计算并发送其消息。
ii. 它收到一个新的挑战 $r_i$。
iii. 它使用该挑战来组合数组中的成对条目,将其大小减半 并为下一轮做好一切准备。
这种减半过程一直持续到最后一轮,在最后一轮中,数组非常小,以至于问题简化为单个最终检查。
- 原文链接: blog.lambdaclass.com/how...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!