Schoof 算法: 有限域上椭圆曲线数点 (半成品)

在某个域 \(K\) 上, 由关于 \(X, Y\) 的多项式方程

\[E: Y^2 = X^3 + AX + B \]

定义出的曲线我们称为椭圆曲线 (elliptic curve). 准确的说, 我们这个时候一般考虑域的特征不为 \(2\), 并且曲线不具有奇性 (\(4A^3+27B^2\neq 0\)), 上面这个形式被称作 Weierstrass 形式, 并且不加别的修饰词的时候, 我们讨论的是射影空间, 且在 \(\overline K\) 上的解 \(E(\overline K)\). 此时, 我们称 \(E(K)\), 也即在 \(K\) 上的解集为 \(E\) 的有理点.

\(K = \mathbb F_q\) 为有限域的情况, 我们就可以很自然地问 \(E(K)\) 上点的数量了.

首先, 我们要考虑到无穷远点 \(\infty\) (准确的说, 它具有射影坐标 \((0:1:0)\)), 接下来, 一个初等的尝试是对于 \(\mathbb F_p\). 对每个 \(x\), 考虑 \(y\) 的方案数, 容易发现,

  • 如果 \(x^3+Ax+b\) 不是二次剩余, 对应的 \(y\) 无解.
  • 如果 \(x^3+Ax+b\)\(0\), 对应的 \(y=0\).
  • 如果 \(x^3+Ax+b\) 是二次剩余且不是 \(0\), 对应的 \(y\) 有两解.

因此, 我们可以用 Legendre 符号进行计算:

\[\begin{align*} \# E(\mathbb F_p) &= 1 + \sum_x 1+ \left(\frac{x^3+Ax+B}{p}\right)\\ &= q + 1 + \sum_x \left(\frac{x^3+Ax+B}{p}\right), \end{align*} \]

注意到 \(\left(\frac{x^3+Ax+B}{p}\right)\equiv (x^3+Ax+B)^{(p-1)/2}\pmod p\), 我们有

\[\sum_x\left(\frac{x^3+Ax+B}{p}\right) \equiv [X^{p-1}](X^3+AX+B)^{(p-1)/2} \pmod p, \]

好耶, 是整式递推, 我们可以 \(O(p^{1/2}\log p)\) 时间内计算了!

然而, 上面这个算法是关于输入指数复杂度的. 计算椭圆曲线的整点数量对于密码学来说有一定意义, 因此上面这个算法是完全不够用的.

Rene Schoof 在 1985 年提出了一个在 \(O(\operatorname{poly}\log q)\) 时间内计算点数的方法. 今天让我们来看看他是怎么做到的.

在这之前, 我们需要一些对于椭圆曲线的基本事实.

Basic Facts

椭圆曲线上的加法结构

\(\varphi\colon E\times E\to E\), 输入 \((A,B)\) 作为椭圆曲线 \(E\) 上的两个点, 作出过 \(A,B\) 的直线 \(L\). 如果 \(A=B\), 作它过 \(E\) 的切线, (切线的唯一性是通过非奇性保证的). 平面代数曲线的 Bézout 定理 告诉我们, \(L\)\(E\) 在射影空间中一定交于三个点 (计入重数). 令 \(\varphi(A, B)\) 为除了 \(A,B\) 之外的第三个点.

选取 \(E\) 上一个点 \(O\) 作为 "单位元", 定义 \(P + Q = \varphi(O, \varphi(P, Q))\), 我们可以验证 \(+\) 确实满足交换群的公理, 并且以 \(O\) 为单位元.

其中, 结合律是最难验证的, 大可通过复杂的分类讨论完成, 但如果也有一些其他方法, 例如 Max Noether 基本定理 导出了这么一个事实: (不严格表述形式) 两个 \(n, m\) 次曲线 \(C,C'\) 交于 \(nm\) 个点, 如果另有一个 \(k\) 次曲线 \(Q\)\(C\)\(nk\) 个点, 且这 \(nk\) 个点包含在那 \(nm\) 个点中, 则存在一条 \(m-k\) 次曲线穿过剩下 \(n(m-k)\) 个点.

说上面这个不严格是因为对相交的形式其实有一定限制, 具体请参看 William Fulton 的 Algebraic Curves.

由此, 我们为了证明 \((P+Q)+R=P+(Q+R)\), 就需要证明 \(\varphi(\varphi(O,\varphi(P, Q)), R) = \varphi(P, \varphi(O,\varphi(Q, R)))\), 先设这两个点为 \(S, T\).

\(L_1\) 为计算 \(\varphi(P, Q)\) 所作直线, \(M_2\) 为计算 \(\varphi(O,\varphi(P, Q))\) 所作直线, \(L_3\) 为计算 \(\varphi(\varphi(O,\varphi(P, Q)), R)\) 所作直线. 类似地, 定义 \(M_1, L_2, M_3\).

看看我们现在都用过哪些点, 分别有 \(O, P, Q, R, \varphi(P, Q), \varphi(Q, R), \varphi(O,\varphi(P, Q)), \varphi(O,\varphi(Q, R))\), 这 \(8\) 个点, 以及我们不知道 \(S=T\) 是否成立.

注意到, 前 \(8\) 个点恰是 \(L_i\cap M_j\) (\((i,j)\neq (3,3)\)) 时得到的 \(8\) 个. 并且这 \(10\) 个点中, \(L_1L_2L_3\cap E\) 得到的是 \(T\) 之外的其它点. 如果 \(S\neq T\), 我们考虑一条直线 \(L\) 经过 \(S\) 而不经过 \(T\), 交 \(E\) 于另外两点 \(U, V\), 那么 \(M_1M_2M_3L\)\(E\) 于我们已知的 \(10\) 个点, 加上 \(U, V\). 可是应用前述事实, 我们发现有一条直线 \(L'\) 穿过 \(S,U,V\), 这样一来 \(L'\)\(E\) 的交点就有 \(S,T,U,V\), 矛盾了.

一般来说, 我们取单位元为无穷远点 \(\infty\), 这样一来, 加法 \(P+Q\) 就可以翻译为如下过程:

  • 作过 \(P, Q\) 的直线 (或切线) \(L\), 交 \(E\) 到第三点 \(R\).
  • \(R\) 沿 \(x\) 轴翻折, 得到 \(P+Q\). 特别地, 如果 \(P, Q\) 是关于 \(x\) 轴对称的, 我们所作的直线 \(L\) 是竖线, 得到的 \(P+Q\) 为无穷远点. 也就是说加法逆元就是沿 \(x\) 轴对称得到的点 \((x, -y)\).

容易发现, 限制到有理点 \(E(K)\) 上, 得到的是 \(E(\overline K)\) 的一个子群.

自同态

对于 \(E\) 到自身的加法群同态, 我们称为 \(E\) 的自同态.

注意到 \(P + Q\) 关于 \(P\) 的坐标是一个有理分式, 反复迭代可以得到, \(P\mapsto nP\) 这个自同态本身可以把两个分量表示成 \((x, y)\) 的有理分式. 但对于一般的自同态来说并不一定是有理分式, 比如对于域上的自同构 \(\sigma \in \operatorname{Aut}(\overline K / K)\), 映射 \((x, y)\mapsto (x^\sigma, y^\sigma)\) 也容易验证是个自同态.

但在这里我们主要关心的自同态一个是 \(n\) (注意, 如果考虑所有 \(E\) 上的自同态 \(\operatorname{End}(E)\) 构成的非交换环结构, 那么 \(P\mapsto nP\) 确实就是 \(n\)), 一个是 \(\operatorname{Gal}(\overline{\mathbb F_q}/\mathbb F_q)\) 中的 Frobenius 自同构给出的, 它也可以写成有理分式 \(\phi_q \colon (x, y) \mapsto (x^q,y^q)\).

对于作为有理分式的自同态 \((x, y) \mapsto (r_1(x,y), r_2(x,y))\), 我们首先将它约化到一定的形式, 回忆椭圆曲线的方程 \(Y^2 = X^3 + AX + B\), 我们可以将所有 \(Y^2\) 次项都替换成只含 \(X\) 的, 这样每一项就只剩下形式

\[r(X, Y) = \frac{f_1(X) + f_2(X)Y}{g_1(X) + g_2(X)Y}, \]

上下再同时乘以 \(g_1(X) - g_2(X) Y\), 就可以去掉分母上的 \(Y\), 得到

\[r(X, Y) = q_1(X) + q_2(X)Y, \]

其中 \(q_1, q_2\) 是有理分式. 回忆加法同态需要满足 \(-(x,y) = (x, -y)\), 对于 \((x, y)\mapsto (p_1(x)+p_2(x)y, q_1(x)+q_2(x)y)\), 取负得到

\[(p_1(x)+p_2(x)(-y), q_1(x)+q_2(x)(-y)) = (p_1(x)+p_2(x)y, -q_1(x)+q_2(x)(-y)), \]

这说明 \(p_2(x), q_1(x)\) 必须永远是 \(0\), 那么 \(p_2(X)=q_1(X)=0\). 我们就有形式一定是

\[(x, y) \mapsto (p(x), q(x) y). \]

可除多项式

定义 可除多项式 (division polynomial) 是如下递归定义的多项式:

\[\begin{align*} \psi_0 &= 0\\ \psi_1 &= 1\\ \psi_2 &= 2Y\\ \psi_3 &= 3X^4 + 6X^2 + 12BX - A^2\\ \psi_4 &= 4Y(X^6+5AX^4+20BX^3-5A^2X^24ABX-8B^2-A^3)\\ \psi_{2n+1} &= \psi_{n+2}\psi_n^3 -\psi_{n-1}\psi^3_{n+1}, \qquad n\geq 2\\ \psi_{2n} &= (2Y)^{-1}(\psi_m)(\psi_{m+2}\psi_{m-1}^2 - \psi_{m-2}\psi_{m+1}^2) \qquad m\geq 3. \end{align*} \]

再令 \(\phi_n = X\psi_n^2 - \psi_{n+1}\psi_{n-1}\), \(\omega_n = (4Y)^{-1}(\psi_{n+2}\psi_{n-1}^2-\psi_{n-2}\psi_{n+1}^2)\), 可以归纳证明, \(P\mapsto nP\) 这个同态可以写作

\[n = \left( \frac{\phi_n(X)}{\psi_n^2(X)}, \frac{\omega_n(X,Y)}{\psi_n(X,Y)^3}\right). \]

其中诸如 \(\psi_n(X)\) 的意思是 \(Y\) 的部分只含 \(Y^2\) 项, 按照带入椭圆曲线的方程消去 \(Y\) 理解. 通过计算可以发现, \(\phi_n(X)\) 的最高次项是 \(X^{n^2}\), 而 \(\psi_n^2(X)\) 的最高此项是 \(n^2 X^{n^2-1}\). 并且通过一定的归纳讨论, 可以证明, \(\phi_n(X)\)\(\psi_n^2(X)\) 没有公共根.

注意到 \(E[n] = \ker n\), 我们就是要计算 \(\ker n=n^2\), 这其实是因为 \(K(X) / K\left(\frac{\phi_n(X)}{\psi_n^2(X)}\right)\) 是一个 \(n^2\) 维代数扩张, 背后的进一步论述由篇幅所限就此打住.

挠群

对于正整数 \(n\), 如果点 \(P\) 满足 \(nP=\infty\), 这里 \(nP\) 表示作 \(n\) 次加法, 那么称全体这样的点构成的子群为 \(n\)挠群 (torsion group) \(E[n]\). 我们关心的一个重要问题是挠群的结构. 事实上在 \(\overline K\) 上, 我们有如下性质: 当 \(n\) 不整除 \(K\) 的特征, 有

\[E[n] \cong (\mathbb Z/n\mathbb Z)^2. \]

某种意义上, 这暗示了 \(E\) 本身的加法群像是一个 torus.

证明这个性质只需证明, 当 \(\operatorname{char} K \nmid n\) 时有 \(\# E[n] = n^2\), 剩下的结构可以通过有限 Abel 群结构定理得出.

Weil 配对

别急

Schoof 算法

思路

\(a = q + 1 - \# E(\mathbb F_q)\).

根据 Hasse 定理, 我们已经知道了一个估计 \(|a|\leq 2\sqrt p\). 接下来的想法是选定一系列小素数 \(\ell\), 我们希望用 \(O(\operatorname{poly} \ell)\) 的时间计算出 \(a\bmod \ell\) 的结果, 然后用中国余数定理进行合并. 让这些 \(\ell\) 的乘积超过 \(4\sqrt p\), 就足够我们唯一地确定 \(a\) 了. 由于我们用 \(O(\log p)\)\(O(\log p)\) 以内的素数就能够让乘积超过 \(4\sqrt p\), 这样就做完了. 我们接下来假设 \(\ell\) 是奇素数, 同时也不能有 \(q=\ell^k\).

回忆 \(\phi_q^2 - a\phi_q + q = 0\), 移项, 得到

\[\left(x^{q^2},y^{q^2}\right) + q(x, y) = a(x^q, y^q). \]

\((x, y)\in E[\ell]\), 我们可以对 \(q\) 取模, 设 \(\bar q = q \bmod \ell\), 那么对任意 \((x,y)\in E[\ell]\), 我们有

\[\left(x^{q^2},y^{q^2}\right) + \bar q(x, y) = a(x^q, y^q). \]

注意到 \((x^q,y^q)\) 也是在 \(E[\ell]\) 内的, 也就是说对于 \((x, y)\in E[\ell] \smallsetminus \infty\), 如果我们算出来 \(\bar a\) 使得

\[\left(x^{q^2},y^{q^2}\right) + \bar q(x, y) = \bar a(x^q, y^q), \]

那就有 \(a \equiv \bar a \pmod \ell\) 了! 与此同时, 它也对所有 \((x, y)\in E[\ell]\) 都成立.

但问题来了, \(E[\ell]\) 里的点我们只知道它们落在 \(\overline {\mathbb F_q}\) 里, 其实我们可以强行扩域把它们表示出来, 但一个稍微好一点的方法可能是这样的: 我们要求的是让这个等式在 \(E[\ell]\) 上成立, 这就是 \((Y^2-X^3-AX-B, \psi_\ell(X,Y))\) 的零点集. 也就是说, 我们要找一个 \(\bar a\) 使得

\[\left(X^{q^2},Y^{q^2}\right) + \bar q(X, Y) \equiv \bar a(X^q, Y^q) \bmod (Y^2-X^3-AX-B, \psi_\ell(X,Y)) . \]

我们只要检验这个同余等式即可.

等等, 问题来了, 我们现在要比较两个有理分式取余后是否相等, 这看起来是有点微妙的.

大概解释就是, 在这个同态的运算的时候, 我们计算过程中涉及的同态要么把所有的 \(E[\ell]\) 都打到 \(\infty\), 要么只把 \(\infty\) 打到 \(\infty\). 所以过程中得到的分母有问题的情况可以当做只有平凡同态 \(0 \colon P \mapsto \infty\). 所以维护的时候, 我们直接将分子分母同余 \(\psi_\ell(X)\).

这部分如果等我解决了这个疑惑, 再回来尝试澄清其中的问题.

复杂度分析

首先我们知道, 有 \(O(\log q)\)\(\ell\) 要选, 每个 \(\ell\)\(O(\log q)\) 大小的.

我们取模的多项式次数是 \(O(\ell^2)\) 量级的. 我们要对枚举的每个 \(\bar a\) 都算一下这个东西 \(\bar a(X^q,Y^q)\bmod \psi_\ell\), 这个可以把 \((X^q,Y^q)\) 一次次做加法得到, 这个枚举过程和计算 \(O(X^q,Y^q)\) 都是 \(O(\log q)\) 次多项式运算. 因此如果考虑朴素实现 (多项式乘法 \(O(\ell^4)\)), 我们得到的复杂度是

\[O(\log^6 q) \]

\(\mathbb F_q\) 上的运算. 原论文的分析中把 \(\mathbb F_q\) 上的运算当做 \(O(\log^2 q)\) 复杂度, 那实际上的复杂度就是 \(O(\log^8 q)\).

如果用 FFT, 可以做到 \(\tilde O(\log^4 q)\)\(\mathbb F_q\) 上的运算. 如果 \(q\) 很大的话复杂度就是 \(\tilde O(\log^5 q)\).

值得一提的是, Noam Elkies 和 A. O. L. Atkin 又分别进行了一些改进, 得到了 Schoof–Elkies–Atkin 算法, 得到了一个随机化的 \(\tilde O(\log^4 q)\) 算法.

posted @ 2023-02-25 17:45  EntropyIncreaser  阅读(1351)  评论(0编辑  收藏  举报