halo2
中使用的 Pasta曲线 是两条在有限域上均有阶为 2S 的大乘法子群的曲线。这意味着我们可以将有限域的阶写为 p−1≡2S⋅T ,其中 T 为奇数。对于 Pallas 和 Vesta 曲线,我们都有 S=32 。
在 halo2
中,我们使用 Sarkar2020 论文中的技术计算平方根。该算法的思想是,我们可以将计算平方根的任务在每个乘法子群中进行拆分。
假设我们想要求 u 模某个 Pasta 素数阶 p 的平方根,( u 是 Zp× 上的一个非零完全平方数),我们可以定义一个 2S 阶的 单位根 g=zT ,( z 是 Zp× 中的非平方数),并计算如下辅助表格:
gtab=⎣⎡g0(g28)0(g216)0(g224)0g1(g28)1(g216)1(g224)1............g28−1(g28)28−1(g216)28−1(g224)28−1⎦⎤
invtab=[(g−224)0(g−224)1...(g−224)28−1]
令 v=u(T−1)/2 。我们可以定义 x=uv⋅v=uT 作为 2S 阶乘法子群上的一个元素。
令 x3=x,x2=x328,x1=x228,x0=x128.
使用 invtab 表,我们查找 t0 使得
x0=(g−224)t0⟹x0⋅gt0⋅224=1.
定义 α1=x1⋅(g216)t0.
查找 t1 使得
α1=(g−224)t1⟹x1⋅(g216)t0=(g−224)t1⟹x1⋅g(t0+28⋅t1)⋅216=1.
定义 α2=x2⋅(g28)t0+28⋅t1.
查找 t2 使得
α2=(g−224)t2⟹x2⋅(g28)t0+28⋅t1=(g−224)t2⟹x2⋅g(t0+28⋅t1+216⋅t2)⋅28=1.
定义 α3=x3⋅gt0+28⋅t1+216⋅t2.
查找 t3 使得
α3=(g−224)t3⟹x3⋅gt0+28⋅t1+216⋅t2=(g−224)t3⟹x3⋅gt0+28⋅t1+216⋅t2+224⋅t3=1.
令 t=t0+28⋅t1+216⋅t2+224⋅t3.
我们写成
x3⋅gt=1⟹⟹⟹⟹x3uv2uvuv⋅gt/2====g−tg−tv−1⋅g−tv−1⋅g−t/2.
将等式右边进行平方,我们得到 (v−1g−t/2)2=v−2g−t=u 。因此, u 的平方即为 uv⋅gt/2 ;第一个部分在之前已有计算,第二部分可以通过在 gtab 中查表并计算得到。