为什么以下代码给我不同的输出? (平方根大数)

时间:2019-02-01 06:28:48

标签: python calculation

我当前正在尝试模拟椭圆曲线上的消息映射,并且试图通过将x变量设置为十六进制转换的字符串来在曲线y**2 = (x**3 + a*x + b) % p上找到一个点。
但是,我不知道这是我的实现问题还是程序中的故障,但结果与我期望的完全不同。

// variables
b = 2455155546008943817740293915197451784769108058161191238065
a = -3
x = 1894290318373708250692331360974342813437992324945519136769
p = 6277101735386680763835789423176059013767194773182842284081
//square root of y to its 4th power
y = (x**3 + a*x + b) % p
y = y ** .5
(y ** 4 - 1 ** 3 - a * x - b) % p
//y itself to its 2nd power
y = (x**3 + a*x + b) % p
y = y
(y ** 2 - 1 ** 3 - a * x - b) % p

对于y的四次方的平方根,结果为0.0,而y自身的二次方的结果为结果4575606179561504294120638508707052089783083374310823885174。有人可以向我解释发生了什么或我做错了什么?

谢谢。

2 个答案:

答案 0 :(得分:1)

在代码中,表达式(y = y ** .5)以指数格式分配y的值,这导致0.0评估表达式(y ** 4-1 ** 3-a * x-b) %p。

如果要将y的平方根继续到其四次幂,在这种情况下,可以将指数格式的y值转换为int(y = int(y ** .5)),然后对表达式求值

但是,它提供了近似结果。

答案 1 :(得分:1)

此行y = y ** .5将y从int转换为float

如果将结果强制转换回int,它将按预期工作:y = int(y ** .5)

您可以自己查看:

print(type(y))
y = y ** .5
print(type(y))