python编程求解椭圆曲线y^2=x^3+x+6(mod11)上的点,x的值由输入,输出z=x^3+x+6和z^((p-1)/2)的值,
时间: 2023-09-10 11:15:33 浏览: 81
好的,这是一个关于椭圆曲线的问题。首先,我们需要了解一些相关概念和公式。
椭圆曲线方程通常表示为:
y^2 = x^3 + ax + b
其中a和b是常数。在模p的意义下,对于一个素数p,我们可以定义一个有限域Fp,它包含0到p-1的所有元素。我们可以在Fp上定义椭圆曲线,这时我们需要保证4a^3 + 27b^2 ≠ 0 (mod p)。这个条件保证了椭圆曲线不会退化成直线或双曲线。
接下来,我们需要了解一些关于点的概念。在椭圆曲线上,每个点都有一个横坐标x和一个纵坐标y。但是,我们还需要定义一个无穷远点O,它不在椭圆曲线上,但是它是椭圆曲线上点的加法单位元。即对于任何点P,P+O = O+P = P。
椭圆曲线上的点加法可以用以下规则表示:
1. 如果P和Q是不同的点,则它们的和是另一个点R。
2. 如果P和Q是相同的点,则它们的和是另一个点R,这时需要使用斜率公式来计算R的坐标。
3. 如果P是一个点,Q是无穷远点O,则P+Q = Q+P = P。
现在,我们来解决你的问题。首先,我们需要定义椭圆曲线的参数a和b,以及模数p=11:
```
a = 1
b = 6
p = 11
```
接下来,我们需要定义一个函数来计算模p的意义下的平方根。由于我们的模数p=11是一个素数,我们可以使用Fermat小定理和二次探测定理来计算平方根。具体实现如下:
```
def sqrt_mod_p(x):
return pow(x, (p+1)//4, p)
```
然后,我们需要定义一个函数来计算给定横坐标x的点的纵坐标y。我们可以使用上面的公式计算:
```
def get_y(x):
z = (x**3 + a*x + b) % p
y = sqrt_mod_p(z)
return y
```
现在,我们可以输入任意横坐标x,输出对应的z和z^((p-1)/2)的值:
```
x = int(input("请输入横坐标x: "))
y = get_y(x)
z = (x**3 + a*x + b) % p
zp = pow(z, (p-1)//2, p)
print("z = ", z)
print("z^((p-1)/2) = ", zp)
```
这样,我们就可以在模11的意义下求解椭圆曲线y^2=x^3+x+6(mod11)上的点,并输出z和z^((p-1)/2)的值了。