Acc := [2] T
for i from n-1 down to 0 {
P := k_{i+1} ? T : −T
Acc := (Acc + P) + Acc
}
return (k_0 = 0) ? (Acc - T) : Acc
剩下要检查的是,每对要相加的点的 x 坐标都互不相同。
当在素数阶群(prime-order group)中相加点时,我们可以依赖 Halo 论文 附录 C 中的定理 3,它表明:如果我们有两个这样的点,它们相对于给定的奇素数阶基有非零索引(index),且这些索引取在 −(q−1)/2..(q−1)/2 范围内时,忽略符号是互不相同的,那么它们就有不同的 x 坐标。这很有帮助,因为对标量乘算法中出现的点的索引进行推理,比直接对它们的 x 坐标进行推理要容易。
因此,所需的检查等价于说,上述算法的下列"带索引版本"永远不会触发 assert:
acc := 2
for i from n-1 down to 0 {
p = k_{i+1} ? 1 : −1
assert acc ≠ ± p
assert (acc + p) ≠ acc // X
acc := (acc + p) + acc
assert 0 < acc ≤ (q-1)/2
}
if k_0 = 0 {
assert acc ≠ 1
acc := acc - 1
}
acc 的最大值是:
<--- n 1s --->
1011111...111111
= 1100000...000000 - 1
= 2n+1+2n−1
标记为 X 的 assert 显然不可能失败,因为 p=0。可以看出,除了最后那个条件分支外,acc 是单调递增的。它在 k 取最大值时达到其最大值,即 2n+1+2n−1。
所以,为了完全避免例外情形(exceptional cases),我们将需要 2n+1+2n−1<(q−1)/2。但如果最后 c 次迭代使用完全加法(complete addition),我们就可以把 n 增大 c。
仅使用不完全加法(incomplete addition)时算法第一个失败的 i 将是 252,因为 2252+1+2252−1>(q−1)/2。我们需要 n=254 才能使上述环绕(wraparound)技巧奏效。
Acc := [2] T
for i from 253 down to 3 {
P := k_{i+1} ? T : −T
Acc := (Acc ⸭ P) ⸭ Acc
}
for i from 2 down to 0 {
P := k_{i+1} ? T : −T
Acc := (Acc + P) + Acc // complete addition
}
return (k_0 = 0) ? (Acc + (-T)) : Acc // complete addition
Initialize A254=[2]T.for i from 254 down to 4:bool_check(ki)=0zi=2zi+1+kixP,i=xTyP,i=(2ki−1)⋅yT(conditionally negate)λ1,i⋅(xA,i−xP,i)=yA,i−yP,ixR,i=λ1,i2−xA,i−xP,i(λ1,i+λ2,i)⋅(xA,i−xR,i)=2yA,iλ2,i2=xA,i−1+xR,i+xA,iλ2,i⋅(xA,i−xA,i−1)=yA,i+yA,i−1.
Initialize A254=[2]T.for i from 254 down to 4:// let ki=zi−2zi+1// let yA,i=2(λ1,i+λ2,i)⋅(xA,i−(λ1,i2−xA,i−xT))bool_check(ki)=0λ1,i⋅(xA,i−xT)=yA,i−(2ki−1)⋅yTλ2,i2=xA,i−1+λ1,i2−xT{λ2,i⋅(xA,i−xA,i−1)=yA,i+yA,i−1,λ2,4⋅(xA,4−xA,3)=yA,4+yA,3witnessed,if i>4if i=4.
我们需要六个 advice 列来见证 (xT,yT,λ1,λ2,xA,i,zi)。然而,由于 (xT,yT) 是相同的,我们可以在一行中执行两次不完全加法,复用相同的 (xT,yT)。我们把不完全加法中使用的标量位分成 hi 和 lo 两半并行处理。这意味着我们实际上有两个 for 循环:
Degree223433Constraintq2⋅(xT,cur−xT,next)=0q2⋅(yT,cur−yT,next)=0q2⋅bool_check(ki)=0, where ki=zi−2zi+1q2⋅(λ1,i⋅(xA,i−xT,i)−yA,i+(2ki−1)⋅yT,i)=0q2⋅(λ2,i2−xA,i−1−xR,i−xA,i)=0q2⋅(λ2,i⋅(xA,i−xA,i−1)−yA,i−yA,i−1)=0
其中
xR,iyA,iyA,i−1=λ1,i2−xA,i−xT,=2(λ1,i+λ2,i)⋅(xA,i−(λ1,i2−xA,i−xT)),=2(λ1,i−1+λ2,i−1)⋅(xA,i−1−(λ1,i−12−xA,i−1−xT)),
这个门用于 for 循环的最后一次迭代,处理特殊情形,其中我们检查输出 yA 被正确见证。
Degree3433Constraintq3⋅bool_check(ki)=0, where ki=zi−2zi+1q3⋅(λ1,i⋅(xA,i−xT,i)−yA,i+(2ki−1)⋅yT,i)=0q3⋅(λ2,i2−xA,i−1−xR,i−xA,i)=0q3⋅(λ2,i⋅(xA,i−xA,i−1)−yA,i−yA,i−1witnessed)=0
其中
xR,iyA,iyA,i−1witnessed=λ1,i2−xA,i−xT,=2(λ1,i+λ2,i)⋅(xA,i−(λ1,i2−xA,i−xT)), is witnessed.
k∈[tq,p+tq)⇔⇔(k254=0⟹(α∈[0,2130)∨k∈[2130,2254))∧(k254=1⟹(k∈[2254,2254+2130)∧(α+2130)modp∈[0,2130)))(k254=0⟹(α∈[0,2130)∨k253..130 are not all 0))∧(k254=1⟹(k253..130 are all 0∧(α+2130)modp∈[0,2130)))