对于众多密码学协议来说, —— 一种代数结构,都是一个最基本的组件。域,就是指拥有 两个二元运算的集合(通常是数集),并且满足一系列 域公理。举例来说,实数集 就是一个拥有不可数无穷多元素的域。

Halo运用有限域,所谓有限域是指域的元素个数是有限的。有限域完全分类如下:

  • 如果 是有限域,那么它包含 个元素,其中 是整数且 是一个素数。

  • 任意两个有相同元素个数的有限域是同构的。特别的,素域 上的算术运算与整数模 上的加法和乘法是同构的,也就是说,。这就是我们将 作为 模数 的原因。

我们定义一个域 其中 . 素数 称为它的 特征。 如果 , 那么域 就是域 阶扩张。 (相类似,复数 就是实数域的扩张)。但是, 在Halo中,我们并不使用扩域。当我们写 我们指的是拥有素数 个元素的 素域,也就是说此时

重要注释:

  • 任何域中,都有两个特殊的元素: ,加法的单位元; ,乘法的单位元。

  • 一个域中的元素,其在二进制表示中的最低位,可以用来代表它在域上的“符号”以区分它的加法逆元(即负数)。这是因为,对任意一个最低位为 的非零元素 其加法逆元 的最低位一定是 ,反之亦然。我们也可以用一个元素是不是大于 来作为其“符号”。

有限域对于后文中构建 多项式椭圆曲线 是很有用处的。 椭圆曲线是一个群,我们将马上对群展开讨论。

与域相比,群更加简单,并且更多限制;群只有一个二元运算 ,和更少的公理。群也有一个单位元,我们用 表示。

群中任意一个非零元素 必有一个 唯一逆元,记为 ,满足

举个例子,域 中所有非零元素形成一个群,同时定义该群的运算就是域上的乘法。

(备注) 加法 vs 乘法符号

如果将 写做 或是干脆不写 (比如: 将 写做 ), 那么正如上文所述,单位元 就写做 , 它的逆元就是 ,我们说这样的群“被写作乘”。而如果将 视为 , 那么它的单位元就是 或者 , 它的逆元就是 , 我们说这样的群“被写做加”。 通常,椭圆曲线群用加法符号来表示, 而对于有限域中的元素构成的群用乘法符号表示

当我们使用加法符号时,将写如下式子:

对于任意非负 我们称上式为“标量乘法”;通常,我们使用大写字母变量来表示群的元素。当我们使用乘法符号时,如下等式

就被称为“指数”。无论上述那种情况,我们都将满足 称为 在基 下的“离散对数”。 我们可以通过求逆运算 将标量扩展到其逆,也就是说: 或者 .

有限域元素 定义为满足如下条件的最小的正整数 (乘法符号)或者 (加法表示)。 群的阶 就是指群包含的元素的个数。

群总有一个 生成集,所谓生成集是这样一个集合,可以使用该集合中的元素通过这些元素的乘方运算(乘法术语)来生成群中的任意一个元素。 如果,生成集是 , 我们就可以通过 生成群的所有元素。对于一个给定的群,它有很多不同的生成集。

如果一个群的存在一个生成集(不一定是唯一的)只有一个元素,记为 ,那么这个群就是一个循环群。进而,我们称 生成了这个群,并且 的阶就是该群的阶。

任意一个阶为 的有限循环群 与整数modulo (记为 )是同构的,满足:

  • 上的运算 与modulo 的加法对应;
  • 的单位元与 对应;
  • 有一个生成元 对应.

对于一个给定的生成元 ,容易证明 是成立的,因为(或是用加法符号, )。通常,证明 会难一些。我们将在椭圆曲线中进一步讨论这个问题。

如果一个有限群的阶 是一个素数,那么该群是个循环群,并且每个非单位元元素都是其生成元。

有限域的乘法子群

我们用符号 来代表集合 上的乘法群(也就是说,群的运算就是 的乘法)。

子群,一个快速求逆的方法是 。这是因为,由费马小定理可知,如果 是一个素数, 对任意整数 不是 的倍数,都有 。如果 是非零整数,那么我们可以除两次 就获得

的生成元,所以 的阶是 (等于 的元素的个数). 因此,对任意一个 都存在唯一一个 满足 .

值得注意的是 其中 确实可以表示成 其中 并且 。实际上,对任意 它也保持了如下运算 。因此,域上非零元素的乘法就可以表示成关于某个特定生成元 的在 模 上的加法。这个加法,就出现在“指数”上。

这是另一种理解 就是域元素的逆元的方法:

所以

蒙哥马利技巧

蒙哥马利技巧,以彼得 · 蒙哥马利 (RIP) 得名,是同时计算很多群元素的逆元的一种方法。 它通常用于在 中求逆,在其上求逆运算 要比乘法运算代价大得多。

假设我们要计算三个非零元素 的逆元。不似常规,我们将计算如下两个积 ,并且计算如下的逆

现在我们可以 乘以 以获得 ,并且 乘以 得到 , 进一步该值分别乘以 就分别获得了想要的逆元。

该技术可以推广,仅仅一次求逆运算就可以计算出任意个数的群元素的逆。

乘法子群

所谓群 下的 子群 就是, 中元素的一个子集在 下仍然是一个群。

在前面的章节中,我们说 -阶群 的生成元。 该群拥有 合数 阶,所以依据中国剩余定理1 它有真子群。举个例子,假设 ,那么 可以分解为 。因此,存在一个 以 为生成元的 -阶子群和一个以 为生成元的 -阶子群。进一步, 中所有元素都可以表示为 其中 (modulo ) 和 (modulo ).

如果我们有 请注意如下计算过程

我们“消灭”了 -阶子群部分,仅仅只用 -阶子群就生成了这个值。

拉格朗日定理 (群论) 告诉我们,有限群 的任意一个子群 的阶能整除 的阶。因此 的任何子群的阶必定能整除

PLONK-based 证明系统, 如 Halo 2,可以更方便的利用拥有大量乘法子群的域,并且这些子群是“平滑”分布(好处是使得性能差距更小,并且可以以更细的力度增长电路规模)。Pallas 和 Vesta 曲线有如下形式的素数

其中 并且 奇数 (这就是说, 的低32位都是 )。这意味着,它们有阶为 的乘法子群,其中 。这些 2进制乘法子群对efficient FFTs 十分友好,而且也可以支持多种电路规模。

平方根

在域 有一半的非零元素都是完全平方元素;剩下的就是非平方或者“二次非剩余”。为了说明此一事实,考虑 生成的 的 2-阶乘法子群(该子群必然存在,因为当 是一个大于等于 的素数的时候, 能被 整除)和一个由 生成的 -阶乘法子群,其中 。进而每个元素 均可以唯一地表示为 其中 并且 。那么有一半的元素满足 而另一半元素满足

考虑一个简单的例子, 那么 必是一个奇数 (如果 是偶数,则 必能被 整除,而这与 矛盾)。 如果 是一个完全平方数,则必存在一个 使得 。这就意味着,

换句话说,某个特定域中的完全平方数不可能生成其 -阶乘法子群,而且由于有一半的元素可以产生其 -阶子群,所以该域中至多有一半的元素是完全平方数。事实上,有且仅有一半的元素是完全平方数(这是因为,每一个非平方元素的平方都是唯一的)。这就意味着,我们可以假设所有的完全平方数都可以表示为 对某个 ,因此求平方根就变成了一个指数运算,指数就是

而如果 那问题就变得复杂得多,因为 并不存在。 记 = 其中 是奇数。不可能,上面已经讨论,现在考虑 生成一个 -阶乘法子群而 生成一个奇数 -阶得乘法子群。 进而每个元素 都可以表示为 其中 并且 。如果某元素是完全平方数,就是说存在 本身可以表示为 对于 。这意味着 , 因此我们推出 ,并且 。那么在这种情况下 就必须是一个偶数,否则对任意 , 就不能成立。反之,如果 不是一个完全平方数,那么 就是一个奇数。综上,一半的元素是完全平方数。

为了计算平方根,我们首先将 升次到 以“消灭” -阶部分,计算

然后在此基础上计算 次方,以消除其 -阶部分原始指数的影响:

(因为 是互素的)。这就暴露出 的值可以让我们进一步处理。 相似的,我们可以消除 -阶部分以获得 (译者注:此处应该是笔误,),将这两个值合起来就得出了平方根。

已经证明当 时,有更简便的方法来合并这些指数以提高效率。 而对于其他的 值,唯一获取 的方法就是,不断平方以最终确定 的每一位。 这就是 Tonelli-Shanks square root algorithm 算法的本质,并且该算法还描述了一半的策略。 (当然还有另外一种用二次扩域的求取平方根的算法,但是直到素数变得相当大时,该算法才有效率优势)。

单位根

在前一章节,我们令 其中 是奇数,并且阐明 元素 生成其 -阶子群。 为方便起见,不妨设 。那么元素 都被称为 单位根

所谓 本原单位根,是满足如下条件的 次单位根 除非 .

重要补充:

  • 如果 是一个 次单位根,那么 满足 。如果 ,那么

  • 相应地,单位根集合就是如下方程的解

  • ("负数引理")。证明: 因为 的阶是 , 。因此,

  • ("折半引理")。证明:
    换句话说,如果我们平方每一个 次单位根集合中的元素,我们只会得到一半的元素 (这就是 次单位根)。 在元素和它们的平方之间存在一个 的映射。

    参考