我正在编写一个程序,在一定的时间间隔内随机选择两个整数。我还写了一个类(我没有在下面添加),它使用两个数字'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
现在我想在这条椭圆曲线上生成一个随机点。我该怎么做?
答案 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上看到它。