Math 椭圆曲线上的SAGE列点

Math 椭圆曲线上的SAGE列点,math,point,sage,elliptic-curve,Math,Point,Sage,Elliptic Curve,我有一条生成的模的椭圆曲线。我只想列出其中的几点(不管它们是什么,我只需要一两点),我希望做到: E.points() 但是,由于曲线的大小,这会产生错误: OverflowError: range() result has too many items 我试图通过这样称呼它来列出前四个: E.points()[:4] 然而,这产生了同样的错误 有没有办法让我只列出几点?可能是一些Sage函数?由于您没有包含再现您的情况的代码,我从Sage文档中选取了一个曲线示例: sage: E = E

我有一条生成的模的椭圆曲线。我只想列出其中的几点(不管它们是什么,我只需要一两点),我希望做到:

E.points()
但是,由于曲线的大小,这会产生错误:

OverflowError: range() result has too many items
我试图通过这样称呼它来列出前四个:

E.points()[:4]
然而,这产生了同样的错误


有没有办法让我只列出几点?可能是一些Sage函数?

由于您没有包含再现您的情况的代码,我从Sage文档中选取了一个曲线示例:

sage: E = EllipticCurve(GF(101),[23,34])
生成随机点 您可以重复使用
random\u element
random\u point
随机选择点:

sage: E.random_point()
(99 : 92 : 1)
sage: E.random_point()
(27 : 80 : 1)
这可能是获得曲线上几个任意点的最简单方法<代码>随机元素在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
处的代表)

因此,在这一点上,您知道
(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)]
sage:res=[]
sage:y=0
圣人:而莱恩(res)<4:
..:对于p中的x(y=y,z=1)。一元多项式()根(重数=False):
..:res.append(E((x,y,1)))
..:y+=1
....:
圣人:res[:4]
[(77 : 0 : 1), (68 : 1 : 1), (23 : 2 : 1), (91 : 4 : 1)]
调整
点()
您可以看看
points()
方法是如何实现的。键入
E.points???
,您将看到它使用一个名为的内部方法。查看其来源(使用
E.\u points\u通过\u group\u structure???
或),您可以看到这是如何实现的,并且可能会对其进行调整以仅产生较小的结果。特别是,您可以看到
range
在这里扮演的角色,并使用较小的范围

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)]