在本文中,我们将介绍一些实用的内积代数技巧,这些技巧在后续推导范围证明(以及将电路编码为内积)时会非常有用。每条规则都会附带一个简单的证明。
符号说明
加粗的变量(如 a)表示向量。未加粗的变量(如 v)表示标量。运算符 ∘ 是两个向量的 Hadamard 乘积(逐元素相乘),即 [a1,…,an]∘[b1,…,bn]=[a1b1,…,anbn]。我们使用简写 “lhs” 和 “rhs” 分别指代等式的“左侧”(left-hand side)和“右侧”(right-hand side)。“加数”(summand)是加法中的一个元素,例如,如果 a+b=c,那么 a 和 b 就被称为加数。1 向量是一个全 1 向量,即 [1,1,…,1]。除非另有说明,否则所有向量默认具有相同的长度 n。
规则 1:当内积中的一个向量是多个向量的求和时,可以将其展开
假设我们正在计算一个内积,其中一个向量是两个向量的和——例如 ⟨a+b,c⟩。我们可以将其拆分为两个内积的和:
⟨a+b,c⟩=⟨a,c⟩+⟨b,c⟩
证明:
lhs 可以写为
i=1∑n(ai+bi)ci
rhs 可以写为
i=1∑naici+i=1∑ncibi=i=1∑n(aici+cibi)=i=1∑n(ai+bi)ci
规则 2:具有公共项的内积可以合并
下面 lhs 上的两个内积具有公共向量 c。因此,它们可以合并:
⟨a,c⟩+⟨b,c⟩=⟨a+b,c⟩
这实际上是规则 1 的 lhs 和 rhs 互换。
证明与规则 1 相同。
规则 3:将向量移至内积的另一侧
一个内积可以被重写为 1 向量与原始向量的 Hadamard 乘积:
⟨a,b⟩=⟨1,a∘b⟩
证明:
⟨a,b⟩⟨1,a∘b⟩i=1∑naibi=i=1∑naibi=i=1∑n1∗(aibi)=i=1∑n1∗(aibi)
规则 4:我们可以将向量加到内积的其中一项中,以强制两个内积具有公共项
假设我们要将内积 ⟨x,b+c⟩ 和内积 ⟨y,b⟩ 相加,并且内积之和为 v。请注意,它们具有不同的分量,因此我们无法使用规则 2 将它们相加。尽管如此,以下等式
⟨x,b+c⟩+⟨y,b⟩=v
可以写为
⟨x+y,b+c⟩=v+⟨y,c⟩
在上述场景中,我们可以在两边加上 ⟨y,c⟩。
⟨x,b+c⟩+⟨y,b⟩+⟨y,c⟩⟨x,b+c⟩+⟨y,b⟩+⟨y,c⟩=v+⟨y,c⟩=v+⟨y,c⟩
现在我们有了公共的 y 项,我们可以使用规则 2 组合它们:
⟨x,b+c⟩+⟨y,b⟩+⟨y,c⟩⟨x,b+c⟩+⟨y,b+c⟩⟨x,b+c⟩+⟨y,b+c⟩=v+⟨y,c⟩=v+⟨y,c⟩=v+⟨y,c⟩
既然我们已经强制 lhs 上的两个内积具有公共项 ⟨b+c⟩,我们可以再次使用规则 2 将它们合并成一个向量:
⟨x,b+c⟩+⟨y,b+c⟩⟨x+y,b+c⟩⟨x+y,b+c⟩=v+⟨y,c⟩=v+⟨y,c⟩=v+⟨y,c⟩
因此,
⟨x,b+c⟩+⟨y,b⟩=v
可以重写为
⟨x+y,b+c⟩=v+⟨y,c⟩
规则 5:将两个不相关向量的内积相加
我们可以将 ⟨a1,b1⟩+⟨a2,b2⟩(它们没有公共向量)相加并得到:
⟨a1,b1⟩+⟨a2,b2⟩=⟨a1+a2,b1+b2⟩−⟨a1,b2⟩−⟨a2,b1⟩
证明:
⟨a1,b1⟩+⟨a2,b2⟩⟨a1,b1⟩+⟨a2,b2⟩+⟨a1,b2⟩⟨a1,b1⟩+⟨a2,b2⟩+⟨a1,b2⟩⟨a1,b1⟩+⟨a2,b2⟩+⟨a1,b2⟩+⟨a2,b1⟩⟨a1,b1⟩+⟨a2,b2⟩+⟨a1,b2⟩+⟨a2,b1⟩⟨a1,b1⟩+⟨a2,b2⟩+⟨a1,b2⟩+⟨a2,b1⟩⟨a1,b1⟩+⟨a2,b2⟩=⟨a1,b1⟩+⟨a2,b2⟩=⟨a1,b1⟩+⟨a2,b2⟩+⟨a1,b2⟩=⟨a1,b1⟩+⟨a1+a2,b2⟩=⟨a1,b1⟩+⟨a1+a2,b2⟩+⟨a2,b1⟩=⟨a1+a2,b1⟩+⟨a1+a2,b2⟩=⟨a1+a2,b1+b2⟩=⟨a1+a2,b1+b2⟩−⟨a1,b2⟩−⟨a2,b1⟩在两边加上 ⟨a1,b2⟩合并 b2 项在两边加上 ⟨a2,b1⟩合并 b1 项合并等式右侧减去 ⟨a1,b2⟩+⟨a2,b1⟩
该证明表明,有时创造性地寻找可以加到等式两边的内积会非常方便。
规则 6:标量可以移入和移出内积
z⋅⟨a,b⟩=⟨z⋅a,b⟩=⟨a,z⋅b⟩
该命题的证明留给读者作为练习。作为提示,常数项可以移入和移出求和公式。
本教程是我们 ZK Bulletproofs 系列的一部分。