SAGE - 列出椭圆曲线上的点

时间:2015-04-28 00:38:47

标签: math point sage elliptic-curve

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

E.points()

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

OverflowError: range() result has too many items

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

E.points()[:4]

然而,这产生了相同的错误

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

1 个答案:

答案 0 :(得分:2)

由于您没有包含重现情况的代码,因此我从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中是同质的。在该曲线上找到一些点的一种方法是将其与直线相交。例如,您可以将其与行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的内部方法。查看它的来源(使用E._points_via_group_structure??link to the repo),您可以看到它是如何实现的,并且可能使其适应仅产生较小的结果。特别是,您可以看到range在此处扮演的角色,并使用较小的范围。