halo2 中使用的 Pasta曲线 是两条在有限域上均有阶为 的大乘法子群的曲线。这意味着我们可以将有限域的阶写为 ,其中 为奇数。对于 Pallas 和 Vesta 曲线,我们都有

Sarkar 平方根算法(基于查表的变式)

halo2 中,我们使用 Sarkar2020 论文中的技术计算平方根。该算法的思想是,我们可以将计算平方根的任务在每个乘法子群中进行拆分。

假设我们想要求 模某个 Pasta 素数阶 的平方根,( 上的一个非零完全平方数),我们可以定义一个 阶的 单位根 ,( 中的非平方数),并计算如下辅助表格:

。我们可以定义 作为 阶乘法子群上的一个元素。

当 i = 0, 1 时

使用 表,我们查找 使得

定义

当 i = 2 时

查找 使得

定义

当 i = 3 时

查找 使得

定义

最终结果

查找 使得

.

我们写成

将等式右边进行平方,我们得到 。因此, 的平方即为 ;第一个部分在之前已有计算,第二部分可以通过在 中查表并计算得到。