在椭圆曲线上生成随机点

时间:2017-03-30 17:27:20

标签: 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:
        result = [a,b]
        return result
    n = n+1

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

1 个答案:

答案 0 :(得分:1)

曲线具有无限长度,对于每个yεℝ,至少有一个xεℝ,因此(x,y)在曲线上。因此,如果我们谈到曲线上的随机点,我们就不希望在整个曲线上具有随机点的均匀分布。

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

f(x)= x 3 + ax + b - y 2

这将产生三个根,其中可能有两个是复杂的(不是实数)。你可以从中随机取一个真正的根。这将是随机点的 x 坐标。

numpy的帮助下,获取根很容易,所以这是在曲线上获取随机点的函数,给定 a b <的值/ EM>:

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]

repl.it上看到它。