Python 3.x 在椭圆曲线上生成随机点

Python 3.x 在椭圆曲线上生成随机点,python-3.x,differential-equations,elliptic-curve,Python 3.x,Differential Equations,Elliptic Curve,我正在写一个程序,在一定的时间间隔内随机选择两个整数。我还编写了一个类,我没有在下面添加它,它使用两个数字“a”和“b”,并创建了一条椭圆曲线: y^2=x^3+ax+b 我写了以下内容来创建这两个随机数 def numbers(): n = 1 while n>0: a = random.randint(-100,100) b = random.randint(-100,100) if -16 * (4 * a ** 3 + 27 * b ** 2) != 0:

我正在写一个程序,在一定的时间间隔内随机选择两个整数。我还编写了一个类,我没有在下面添加它,它使用两个数字“a”和“b”,并创建了一条椭圆曲线: y^2=x^3+ax+b

我写了以下内容来创建这两个随机数

def numbers():
n = 1
while n>0:
    a = random.randint(-100,100)
    b = random.randint(-100,100)
    if -16 * (4 * a ** 3 + 27 * b ** 2) != 0:
        result = [a,b]
        return result
    n = n+1

现在我想在椭圆曲线上生成一个随机点。我该怎么做呢?

曲线的长度是无限的,就像每个yϵ一样ℝ 至少有一个xϵℝ 所以x,y在曲线上。因此,如果我们说曲线上的一个随机点,我们就不能期望在整个曲线上有一个均匀分布的随机点

但如果这不重要,您可以在某个范围内为y取一个随机值,然后计算以下函数的根:

fx=x3+ax+b-y2

这将导致三个根,其中两个可能是复数而不是实数。你可以从中随机取一个实根。这将是随机点的x坐标

在numpy的帮助下,获得根很容易,因此这是获得曲线上随机点的函数,给定a和b的值:


看到它继续运行。

如果我需要精确的根怎么办?我该怎么做呢?根值通常是无理数,所以它们永远不能在十进制表示法中有精确的表示,也不能在浮点表示法中有精确的表示。但是,您可以将数字四舍五入为X个有效数字。
def randomPoint(a, b):
    y = random.randint(-100,100)
    # Get roots of:  f(x) = x^3 + ax + b - y^2
    roots = numpy.roots([1, 0, a, b - y**2])
    # 3 roots are returned, but ignore potential complex roots
    # At least one will be real
    roots = [val.real for val in roots if val.imag == 0]
    # Choose a random root among those real root(s)
    x = random.choice(roots)
    return [x, y]