椭圆曲线算法

克雷莫纳的数据库

克雷莫纳的椭圆曲线数据库是Sage的一部分。高达10000的曲线是Sage的标准配置,还有一个可选的下载,可以访问他的完整表格。从一个外壳,你应该运行::

sage -i database_cremona_ellcurve

自动下载并安装扩展表。

要使用数据库,只需通过

sage: EllipticCurve('5077a1')
Elliptic Curve defined by y^2 + y = x^3 - 7*x + 6 over Rational Field
sage: C = CremonaDatabase()
sage: C[37]['allcurves']
{'a1': [[0, 0, 1, -1, 0], 1, 1],
'b1': [[0, 1, 1, -23, -50], 0, 3],
'b2': [[0, 1, 1, -1873, -31833], 0, 1],
'b3': [[0, 1, 1, -3, 1], 0, 3]}
sage: C.isogeny_class('37b')
[Elliptic Curve defined by y^2 + y = x^3 + x^2 - 23*x - 50
over Rational Field, ...]

还有一个Stein Watkins数据库,包含了数亿条椭圆曲线。不过,它的下载量超过了2GB!

布莱恩·伯奇的生日贺卡

布莱恩·伯奇最近开了一个生日会,我用Sage画出了他生日卡的封面,列出了所有导体的最佳椭圆曲线,直到37,然后用粗的随机彩色线绘制出来。正如您在下面看到的,绘制椭圆曲线就像在它上面调用plot方法一样简单。此外,graphics array命令允许我们轻松地将多个绘图合并到一个图形对象中。

sage: v = cremona_optimal_curves([11..37])
sage: w = [E.plot(thickness=10,rgbcolor=(random(),random(),random())) for E in v]
sage: graphics_array(w, 4, 5).show(axes=False)
thematic_tutorials/explicit_methods_in_number_theory/birch.*

绘制模 \(p\)

我们可以利用Sage的交互特性绘制椭圆曲线模的图 \(p\) ,用一个滑动条来改变质数 \(p\) . Sage的交互特性有助于交互式地更改参数和查看结果。类型交互?如需更多帮助和示例,请访问网页http://wiki.sagemath.org/interact。

在下面的代码中,我们首先定义椭圆曲线 \(E\) 使用Cremona标签37a。然后我们定义一个交互函数 \(f\) ,它是使用@interact Python decorator进行交互的。因为 \(p\) 是素数(2500),Sage笔记本构造了一个滑块,在素数上变化最多 \(500\) . 当您拖动滑块并松开时,将绘制仿射图形 \(\GF{{p}}\) 曲线上的点 \(E_{{\GF{{p}}}}\) . 当然,我们不应该在有限域上绘制曲线,这使得这更有趣。

E = EllipticCurve('37a')
@interact
def f(p=primes(2,500)):
    show(plot(E.change_ring(GF(p)),pointsize=30),
    axes=False, frame=True, gridlines="automatic",
    aspect_ratio=1, gridlinesstyle={'rgbcolor':(0.7,0.7,0.7)})
thematic_tutorials/explicit_methods_in_number_theory/modpcurve.*

埃尔基斯肖夫-阿特金点数法

Sage包括sea.gp公司,它是SEA(Schoff-Elkies-Atkin)算法的快速实现,用于计算椭圆曲线上的点个数 \(\GF{{p}}\) .

我们创建有限域 \(k=\GF{{p}}\) 在哪里 \(p\) 是下一个 \(10^{{20}}\) . next prime命令使用Pari的nextprime函数,但证明了结果的素性(不像Pari只给出数字后面的下一个可能素数)。Sage还有一个下一个可能的素数函数。

sage: k = GF(next_prime(10^20))

计算它的基数,在幕后使用SEA。

sage: E = EllipticCurve_from_j(k.random_element())
sage: E.cardinality()                   # less than a second
99999999999371984255

要查看Sage如何选择何时使用SEA和其他方法,请键入E.cardinality??并阅读源代码。在这篇文章中,它只是在任何时候使用SEA \(p>10^{{18}}\) .

\(p\) -adic调节器

Sage拥有世界上最好的计算代码 \(p\) -adic椭圆曲线调节器,感谢大卫哈维和罗伯特布拉德肖的工作。这个 \(p\) -椭圆曲线的adic调节器 \(E\) 在一个普通的好年华 \(p\) 是全球 \(p\) -Mordell-Weil群上的adic-height配对矩阵 \(E(\QQ)\) . (这与当地或阿基米德高度无关)这是马祖塔特泰特尔鲍姆调节器的类似物 \(p\) -Birch和swinerton-Dyer猜想的adic模拟。

特别是,Sage实现了Harvey对Mazur-Stein-Tate算法的改进,该算法基于Kiran Kedlaya的Monsky-Washnitzer计算方法 \(p\) -adic上同调群。

我们用Cremona标签389a创建椭圆曲线,它是最小导体和秩的曲线 \(2\) . 然后我们计算 \(5\) -adic和 \(997\) -adic调节器的曲线。

sage: E = EllipticCurve('389a')
sage: E.padic_regulator(5, 10)
5^2 + 2*5^3 + 2*5^4 + 4*5^5 + 3*5^6 + 4*5^7 + 3*5^8 + 5^9 + O(5^11)
sage: E.padic_regulator(997, 10)
740*997^2 + 916*997^3 + 472*997^4 + 325*997^5 + 697*997^6
          + 642*997^7 + 68*997^8 + 860*997^9 + 884*997^10 + O(997^11)

在上述新算法之前,甚至计算 \(7\) -adic调节器至 \(3\) 计算精度是一个非常重要的挑战。现在在Sage计算 \(100003\) -adic调节器是常规:

sage: E.padic_regulator(100003,5)  # a couple of seconds
42582*100003^2 + 35250*100003^3 + 12790*100003^4 + 64078*100003^5 + O(100003^6)

\(p\) -阿迪奇 \(L\) -功能

\(p\) -阿迪奇 \(L\) -函数在椭圆曲线的算法研究中起着核心作用。他们是 \(p\) -复解析的adic类似物 \(L\) -函数和它们的主导系数(at \(0\) )是 \(L^{{(r)}}(E,1)/\Omega_E\)\(p\) -Birch和swinerton-Dyer猜想的adic模拟。它们也出现在加藤、施耐德和其他证明部分结果的定理中 \(p\) -使用岩川理论的adic BSD。

在Sage中的实现主要归功于我自己、克里斯蒂安·伍思里奇和罗伯特·波拉克的工作。我们用Sage来计算 \(5\) -阿迪奇 \(L\) -秩389a的椭圆曲线级数 \(2\) .

sage: E = EllipticCurve('389a')
sage: L = E.padic_lseries(5)
sage: L
5-adic L-series of Elliptic Curve defined
by y^2 + y = x^3 + x^2 - 2*x over Rational Field
sage: L.series(3)
O(5^5) + O(5^2)*T + (4 + 4*5 + O(5^2))*T^2 +
(2 + 4*5 + O(5^2))*T^3 + (3 + O(5^2))*T^4 + O(T^5)

Shafarevich-Tate群的边界

Sage实现了计算椭圆曲线Shafarevich-Tate群上大量显式边界的代码。此功能仅在Sage中可用,并使用Kolyvagin、Kato、Perrin Riou等结果,以及Wuthrich和me未发表的论文。

sage: E = EllipticCurve('11a1')
sage: E.sha().bound()            # so only 2 could divide sha
[2]
sage: E = EllipticCurve('37a1')  # so only 2 could divide sha
sage: E.sha().bound()
([2], 1)
sage: E = EllipticCurve('389a1')
sage: E.sha().bound()
(0, 0)

这个 \((0,0)\) 在上面的最后一个输出表明,Kolyvagin和Kato的Euler系统结果没有给出关于曲线Shafarevich-Tate群有限性的信息 \(E\) . 事实上,证明这种有限性是一个开放的问题,因为 \(E\) 有等级 \(2\) ,而有限性只对椭圆曲线已知 \(L(E,1)\neq 0\)\(L'(E,1)\neq 0\) .

加藤、施耐德和其他人在 \(p\) -BSD猜想的adic模拟生成了一个 \(p\) -沙法雷维奇塔特集团的一部分。这些算法要求作为输入显式计算 \(p\) -阿迪奇 \(L\) -功能, \(p\) -adic调节器等,如Stein Wuthrich所述。例如,下面我们用Sage来证明这一点 \(5\)\(7\) 别把我们级别的沙法雷维奇·泰特集团分开 \(2\) 曲线389a。

sage: E = EllipticCurve('389a1')
sage: sha = E.sha()
sage: sha.p_primary_bound(5)  # iwasawa theory ==> 5 doesn't divide sha
0
sage: sha.p_primary_bound(7)  # iwasawa theory ==> 7 doesn't divide sha
0

这与Birch和swinerton-Dyer猜想一致,后者预测Shafarevich-Tate群是平凡的。下面我们计算这个预测的顺序,即浮点数 \(1.000000\) 准确地说。结果是一个浮点数有助于强调,证明Shafarevich-Tate群的猜想阶一般是有理数是一个开放问题!

sage: E.sha().an()
1.00000000000000

Mordell-Weil群与积分点

Sage包括Cremona的mwrank库和Simon用于计算Mordell-Weil椭圆曲线群的2-descent GP脚本。

sage: E = EllipticCurve([1,2,5,17,159])
sage: E.conductor()       # not in the Tables
10272987
sage: E.gens()            # a few seconds
[(-3 : 9 : 1), (-3347/3249 : 1873597/185193 : 1)]

Sage还可以计算扭子群、同系类、确定伽罗瓦表示的图像、确定约化类型,并在数字域上包含Tate算法的完整实现。

Sage拥有世界上计算椭圆曲线上所有积分点的最快实现 \(\QQ\) ,这要归功于克雷莫纳、迈克尔·马道斯和托比亚斯·纳格尔的工作。这也是唯一可用的免费开源实现。

sage: E = EllipticCurve([1,2,5,7,17])
sage: E.integral_points(both_signs=True)
[(1 : -9 : 1), (1 : 3 : 1)]

一个非常令人印象深刻的例子是秩的最低导体椭圆曲线 \(3\) ,有36个积分点。

sage: E = elliptic_curves.rank(3)[0]
sage: E.integral_points(both_signs=True)   # less than 3 seconds
[(-3 : -1 : 1), (-3 : 0 : 1), (-2 : -4 : 1), (-2 : 3 : 1), ...(816 : -23310 : 1), (816 : 23309 : 1)]

计算所有积分点的算法首先计算Mordell-Weil群,然后包围积分点,列出满足这些边界的所有积分点。有关完整的详细信息,请参见科恩的新GTM 239。

复杂度在曲线的等级上呈指数级增长。我们可以做上面的计算,但是用已知的第一条秩曲线 \(4\) ,大约在一分钟内完成(输出64个点)。

sage: E = elliptic_curves.rank(4)[0]
sage: E.integral_points(both_signs=True)   # about a minute
[(-10 : 3 : 1), (-10 : 7 : 1), ...
 (19405 : -2712802 : 1), (19405 : 2693397 : 1)]

\(L\) -功能

评价

下一步我们用复数进行计算 \(L\) -功能

\[L(E,s)=prod{pmidDelta=389}frac{1}{1-a}p^{-s}+p^{-2s}cdotprod{pmidDelta=389}frac{1}{1-a}p^{-s}\]

属于 \(E\) . 虽然上面的欧拉积只在右半平面上定义了一个解析函数,其中 \(\text{{Re}}(s) > 3/2\) ,Wiles等的一个深层定理。(模性定理)意味着它具有对整个复平面和函数方程的解析延拓。我们可以评估函数 \(L\) 在复杂的飞机上的任何地方使用Sage(通过Tim Dokchitser的代码)。

sage: E = EllipticCurve('389a1')
sage: L = E.lseries()
sage: L
Complex L-series of the Elliptic Curve defined by
       y^2 + y = x^3 + x^2 - 2*x over Rational Field
sage: L(1) #random due to numerical noise
-1.04124792770327e-19
sage: L(1+I)
-0.638409938588039 + 0.715495239204667*I
sage: L(100)
1.00000000000000

泰勒级数

我们也可以计算 \(L\) 多亏了蒂姆·多克希瑟的密码。

sage: E = EllipticCurve('389a1')
sage: L = E.lseries()
sage: Ld = L.dokchitser()
sage: Ld.taylor_series(1,4) #random due to numerical noise
-1.28158145691931e-23 + (7.26268290635587e-24)*z + 0.759316500288427*z^2 - 0.430302337583362*z^3 + O(z^4)

GRH

广义黎曼假设认为 \(L(E,s)\) 是形式上的 \(1+iy\) . Mike Rubinstein编写了一个C++程序,它是SGE的一部分,可以用于任何程序。 \(n\) 计算第一个 \(n\) 价值观 \(y\) 这样的话 \(1+iy\) 是零 \(L(E,s)\) . 它也验证了这些零的Riemann假设(我认为)。Rubinstein的程序也可以对 \(L\) -函数,尽管并非所有这些功能都像椭圆曲线一样容易从Sage中使用。下面我们计算第一个 \(10\)\(L(E,s)\) 在哪里 \(E\) 仍然是军衔 \(2\) 曲线389a。

sage: L.zeros(10)
[0.000000000, 0.000000000, 2.87609907, 4.41689608, 5.79340263,
 6.98596665, 7.47490750, 8.63320525, 9.63307880, 10.3514333]