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_element
或random_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
在这里扮演什么角色,并使用较小的范围。
我有一个生成的模数椭圆曲线。我只想列出几点(不管它们是什么,我只需要一两个)并且我希望这样做:
E.points()
然而,由于曲线的大小,这会产生错误:
OverflowError: range() result has too many items
我试图通过这样调用来列出前四个:
E.points()[:4]
但是产生了同样的错误
有什么办法可以让它只列出几点吗?也许有一些 Sage 功能?
由于您没有包含重现您的情况的代码,我从 Sage 文档中获取示例曲线:
sage: E = EllipticCurve(GF(101),[23,34])
生成随机点
您可以重复使用random_element
或random_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
在这里扮演什么角色,并使用较小的范围。