引入

二次剩余可以认为是在讨论求模意义下 开平方 运算的可行性。对于更高次方的开方可参见 k 次剩余

定义

二次剩余

令整数 满足 ,若存在整数 使得

则称 为模 的二次剩余,否则称 为模 的二次非剩余。后文可能在模 显然的情况下简写成二次(非)剩余。

Euler 判别法

当模数为奇素数时,我们有如下定理:

Euler 判别法

对奇素数 和满足 的整数 ,有

即对上述的

  1. 的二次剩余当且仅当 .
  2. 的二次非剩余当且仅当 .

基于 Euler 判别法,我们可以得到如下推论:

二次剩余的数量

对于奇素数 ,模 意义下二次剩余和二次非剩余均有 个。

Legendre 符号

为了方便接下来的讨论,我们引入如下记号:

Legendre 符号

奇素数 和整数 ,定义 Legendre 符号如下:

即对于

  • 是模 的二次剩余当且仅当
  • 是模 的二次非剩余当且仅当

下表为部分 Legendre 符号的值(From Wikipedia

性质

  1. 对任意整数

    进一步,我们有推论:

  2. 完全积性)对任意整数

    我们有推论:对整数

基于如上性质,若对任意奇素数 的值均可计算,则我们就可以对任意合法情况计算 Legendre 符号的值。接下来我们有一个优美的定理,这个定理巧妙地在 之间建立起了联系,使得我们能用类似 辗转相除法 的思路完成计算。

二次互反律

二次互反律

是两个不同的奇素数,则

证明方式很多 1。一种证明方式是基于如下引理 2

Gauss 引理

是奇素数,,对整数 ,令 ,设 ,则

容易得到如下推论:

推论

对奇素数 ,有

对奇素数 ,奇数 满足 ,有

根据如上推论,证明二次互反律只需验证

考虑由点 构成的集合 ,将其根据 的大小关系分成两部分(显然 ),分别验证三个集合的大小即可。

二次互反律不仅能用于判断数 是否是模 的二次剩余,还能用于确定使数 为二次剩余的模数的结构。

Example

  • 使得 为二次剩余的奇素数 满足
  • 使得 为二次剩余的奇素数 满足
  • 使得 同时为二次剩余的奇素数 满足

另外,我们还可以证明诸如「形如 的素数有无限多个」之类的结论,这一类结论实际上是 Dirichlet 定理 的简单推论。

Jacobi 符号

根据二次互反律,我们可以很自然地想到一种推广 Legendre 符号的方法:

Jacobi 符号

正奇数 和整数 ,其中 是素数, 是正整数,定义 Jacobi 符号如下:

其中等式右端的 Legendre 符号。另外对整数

Warning

我们一般不区分 Legendre 符号和 Jacobi 符号,因为由完全积性可知 Jacobi 符号具有和 Legendre 符号一样的性质,所以这两种符号的计算方法是一致的。但是有一点需要注意:当 不是奇素数 时, 的值与 是否是模 的二次剩余 无关,但是若 ,则说明 至少存在一个(实际上是奇数个)素因子 使得 是模 的二次非剩余,从而此时 是模 的二次非剩余。

我们还可以把模数进一步推广为 整数(只需补充 的定义),这样就得到了 Kronecker 符号

模意义下开平方

本节讨论模意义下开平方的算法。特别地,本节主要介绍素数模的情形。对于一般模数的情形,可以参考 模意义下开高次方 的讨论。

特殊情况时的算法

对于同余方程 ,其中 为奇素数且 为二次剩余在 时有更简单的解法,考虑

那么 为一个解。

Atkin 算法

仍然考虑上述同余方程,此时 ,那么令 那么此时 为一个解。

证明

那么

Cipolla 算法

Cipolla 算法用于求解同余方程 ,其中 为奇素数且 为二次剩余。

本节考虑 中的运算,其中

该算法的第一步为找到一个 使得 为二次非剩余。当然对于 不可能找到这样的 ,需要进行特判。下文只讨论 的情况。此时可随机一个 然后判断,期望可以 步找到。于是, 为一个解,可以通过快速幂求值。

证明

为了方便,首先令

需要证明的是, 是原式的解,并且它属于 。首先考虑证明前者,即证明 。为此,我们需要先证明两个引理:

引理 1:

证明:

引理 2:

使用二项式定理容易发现,除了第一项和最后一项,分子上的 无法消掉,于是只剩下

有了这两个引理,我们再来考虑证明原式:

下面通过反证法证明我们求出的解属于 ,即其 的系数为

假设存在一个 满足 ,即 ,移项并化简可得:

式子左边的 的系数为 ,所以右边 的系数也为 ,即 ,由于我们令 ,所以一定有 ,于是

由于 都是二次剩余,由 Legendre 符号的积性可知 也是二次剩余,这与 是二次非剩余矛盾。于是原式不存在一个解使得 的系数非 ,我们求出的解的 的系数也必定为

Bostan–Mori 算法

该算法基于 Cipolla 算法,我们将问题转换为 常系数齐次线性递推 再应用 Bostan–Mori 算法。考虑另一种常见的 Cipolla 算法的描述: 为满足 的一个解 4,其中 为不可约多项式。系数 的选取同样使用随机方法。证明过程略。参考 Bostan 和 Mori 论文 5 中的算法我们可以发现问题可转化为求解形式幂级数的乘法逆元的某一项系数:

时显然有 ,该算法乘法次数相较于 Cipolla 算法更少。其他相关乘法次数较少的算法可见 Müller 的文章 6

Legendre 算法

对于同余方程 ,其中 为奇素数且 为二次剩余。Legendre 算法可描述为找到 满足 为二次非剩余,令 ,那么 .

证明

考虑选择一个 满足 ,那么 为二次非剩余,所以

存在环态射

那么

所以 .

Tonelli–Shanks 算法

Tonelli–Shanks 算法是基于离散对数求解同余方程 的算法 7,其中 为奇素数且 为模 的二次剩余。

,其中 为奇数。仍然使用随机方法寻找 满足 为二次非剩余。令 ,那么存在整数 满足 。若 为二次剩余,那么 为偶数且 .

证明

根据费马小定理可知

又由于 是二次非剩余,有

所以, 的阶是 。又因为 的解,所以 的幂次。记

因为 是二次剩余,所以

由阶的性质可知,,所以, 是偶数。因此, 是良定义的,且

剩下的问题是如何计算 。Tonelli 和 Shanks 提出一次确定 的一个二进制位。令 在二进制下表示为 ,其中 。因为 是二次剩余,所以开始时 ,然后利用如下性质逐位确定 的取值:

其中, 已知,而 的取值可以由之前的数位 计算得到。当然,实现算法时,只需要直接维护乘积 即可。

习题

参考资料与注释

  1. Quadratic residue - Wikipedia
  2. Euler’s criterion - Wikipedia

Footnotes

  1. Proofs of quadratic reciprocity - Wikipedia

  2. Carl Friedrich Gauss. Untersuchungen über höhere Arithmetik, 1965. Page 458-462.

  3. Kobi Kremnizer.Lectures in number theory 2022. Proposition 4.3.

  4. A. Menezes, P. van Oorschot and S. Vanstone. Handbook of Applied Cryptography, 1996.

  5. Alin Bostan, Ryuhei Mori. A Simple and Fast Algorithm for Computing the N-th Term of a Linearly Recurrent Sequence. Available at https://arxiv.org/abs/2008.08822.

  6. S. Müller, On the computation of square roots in finite fields, Design, Codes and Cryptography, Vol.31, pp. 301-312, 2004.

  7. Daniel. J. Bernstein. Faster Square Roots in Annoying Finite Fields.