为什么以下代码会给我不同的输出? (平方根大数)
Why are the following codes giving me different output? (Square root big numbers)
我目前正在尝试模拟椭圆曲线上的消息映射,我试图通过将 x 变量设置为十六进制转换字符串来在曲线上找到一个点 y**2 = (x**3 + a*x + b) % p
。
但是不知道是我实现的问题还是程序的bug,结果和我期待的完全不一样
// 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 的平方根的 4 次方结果为 0.0
,而 y 本身的 2 次方结果为 4575606179561504294120638508707052089783083374310823885174
。任何人都可以向我解释发生了什么或我做错了什么吗?
谢谢。
在代码中,表达式 (y=y** .5) 以指数格式分配 y 的值,这导致 0.0 在计算表达式 (y ** 4 - 1 ** 3 - a * x - b) % p.
如果想继续求y的平方根的4次方,可以将y的指数形式的值转换成int(y=int(y** .5))在这种情况下,然后求值表达式。
但是,它提供了近似结果。
这一行 y = y ** .5
将 y 从 int
转换为 float
。
如果将结果类型转换回 int
,它会按预期工作:y = int(y ** .5)
你可以自己看看这个:
print(type(y))
y = y ** .5
print(type(y))
我目前正在尝试模拟椭圆曲线上的消息映射,我试图通过将 x 变量设置为十六进制转换字符串来在曲线上找到一个点 y**2 = (x**3 + a*x + b) % p
。
但是不知道是我实现的问题还是程序的bug,结果和我期待的完全不一样
// 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 的平方根的 4 次方结果为 0.0
,而 y 本身的 2 次方结果为 4575606179561504294120638508707052089783083374310823885174
。任何人都可以向我解释发生了什么或我做错了什么吗?
谢谢。
在代码中,表达式 (y=y** .5) 以指数格式分配 y 的值,这导致 0.0 在计算表达式 (y ** 4 - 1 ** 3 - a * x - b) % p.
如果想继续求y的平方根的4次方,可以将y的指数形式的值转换成int(y=int(y** .5))在这种情况下,然后求值表达式。
但是,它提供了近似结果。
这一行 y = y ** .5
将 y 从 int
转换为 float
。
如果将结果类型转换回 int
,它会按预期工作:y = int(y ** .5)
你可以自己看看这个:
print(type(y))
y = y ** .5
print(type(y))