如何在SAGE中的有限域F(p)上找到椭圆曲线的最小y坐标y ^ 2 = x ^ 3 + ax + b,其中a和b大约为10 ^ 15的数量级且整数p非常大约10 ^ 45的量级? 我需要在SAGE中找到它并且我一直在尝试很多方法。我发布了一些代码:
maxtime=120960000
p = 976324781263478623476912346213469128736427364
a = 783468734639429
b = 98347874287423
E = EllipticCurve(GF(p),[a,b])
length =50
for i in range(1,maxtime):
e = ZZ.random_element(999999999999)
if E.is_x_coord(I) == true:
temp = E.lift_x(I)
break
i=0
print 'P1:'
print temp
length=0
t=50
count=2
p2=temp+temp
while count < 10000000000:
count=count+1
p2=p2+temp
if (p2[1]>0):
if (ZZ(p2[1]) < ZZ(p-1)):
if (p2[0] > 0):
if( ZZ(p2[0]) < ZZ(p-1)):
if E.is_x_coord(p2[0]) == true:
y2 = E.lift_x(p2[0])
length=len(str(y2[1]))
if length <=11:
print 'p2:'
print y2
print 'count:'
print count
break
if t > length:
t= length
print 'length:'
print t
print 'count:'
print count
print 'p2:'
print y2
print 'failed:'
以上只是带有随机数的示例代码。任何建议或完全不同的想法也会非常有帮助。
非常感谢 J S
答案 0 :(得分:2)
GF(p)的元素没有自然排序。至少y,我猜你的意思是整数的通常顺序。这是一个例子,p = 17,a = 11,b = 3。解是y = 3,x = 4。
sage: K = GF(17)
sage: a, b = 11, 3
sage: _.<X> = K[]
sage: P = X^3 + a*X + b
sage: next(((P - y^2).roots(), y) for y in K if (P - y^2).roots())
([(4, 1)], 3)
sage: 3^2 == P(4)
True
请注意您的p
不是素数。
答案 1 :(得分:1)
椭圆曲线E至少有p + 1-2p ^ {1/2}点,对于大p和1,(p + 1-2p ^ {1/2})/ p几乎等于1这意味着平均每个y值都有一个x值,使得(x,y)位于椭圆曲线上。这意味着除非发生奇怪的事情,否则我会期望最小的y会非常小(我希望它大多数时候都是0,1或2)。这表明在实践中尝试从小到大的不同y值将是非常快的。但我没有证据证明它总是会非常快,因为如果确实发生了一些奇怪的事情并且最小的y实际上非常大,那将需要很长时间。
p = next_prime(976324781263478623476912346213469128736427364)
a = 7834684394239111322316457
b = 98347872833141
E = EllipticCurve(GF(p),[a,b])
Fx.<x> = GF(p)[]
f = x^3 + a*x + b
for y in GF(p):
xs=(f-y^2).roots(multiplicities=False)
if len(xs)>0:
x = xs[0]
P = E(x,y)
print P
break
在1/10秒内给予观点(544771569075032357553369359272826923818637077:1:1)。
我尝试了5000个a和b的随机值,使用上面的素数p和以下,你可以看到我多长时间得到y的哪个值为最小值。只是为了让你了解这在实践中有多好。
0 3361
1 1089
2 364
3 119
4 41
5 20
6 3
7 2
8 1