SAGE - 列出椭圆曲线上的点

SAGE - Listing points on an elliptic curve

我有一个生成的模数椭圆曲线。我只想列出几点(不管它们是什么,我只需要一两个)并且我希望这样做:

E.points()

然而,由于曲线的大小,这会产生错误:

OverflowError: range() result has too many items

我试图通过这样调用来列出前四个:

E.points()[:4]

但是产生了同样的错误

有什么办法可以让它只列出几点吗?也许有一些 Sage 功能?

由于您没有包含重现您的情况的代码,我从 Sage 文档中获取示例曲线:

sage: E = EllipticCurve(GF(101),[23,34])

生成随机点

您可以重复使用random_elementrandom_point来随机选择点数:

sage: E.random_point()
(99 : 92 : 1)
sage: E.random_point()
(27 : 80 : 1)

这可能是获取曲线上任意几个点的最简单方法。 random_element 在 Sage 的许多地方都有效。

与线相交

它有定义多项式

sage: p = E.defining_polynomial(); p
-x^3 + y^2*z - 23*x*z^2 - 34*z^3

这在 x,y,z 中是同质的。在该曲线上找到 some 点的一种方法是将其与直线相交。例如,您可以将它与线 y=0 相交并使用 z=1 选择代表(因此省略 z==0 处的代表)使用

sage: p(y=0,z=1).univariate_polynomial().roots(multiplicities=False)
[77]

所以在那个时候你知道 (77 : 0 : 1) 是你曲线上的一个点。您可以使事情自动化,与不同的线相交,直到达到所需的点数:

sage: res = []
sage: y = 0
sage: while len(res) < 4:
....:     for x in p(y=y,z=1).univariate_polynomial().roots(multiplicities=False):
....:         res.append(E((x, y, 1)))
....:     y += 1
....:
sage: res[:4]
[(77 : 0 : 1), (68 : 1 : 1), (23 : 2 : 1), (91 : 4 : 1)]

正在适应points()

你可以看看points()方法是如何实现的。输入 E.points??,您会看到它使用了一个名为 _points_via_group_structure. Looking at the source of that (using E._points_via_group_structure?? or the link to the repo) 的内部方法,您会看到它是如何实现的,并且可能会对其进行调整以仅产生较小的结果。特别是您可以看到 range 在这里扮演什么角色,并使用较小的范围。