我有一个生成模数的椭圆曲线。我想在它上面列出几点(无论它们是什么,我只需要一两个),我希望这样做:
E.points()
然而,由于曲线的大小,这会产生错误:
OverflowError: range() result has too many items
我试图通过调用它来列出前四个:
E.points()[:4]
然而,这产生了相同的错误
有什么方法可以让它列出几点吗?也许一些Sage功能?
答案 0 :(得分:2)
由于您没有包含重现情况的代码,因此我从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
中是同质的。在该曲线上找到一些点的一种方法是将其与直线相交。例如,您可以将其与行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
在此处扮演的角色,并使用较小的范围。