Почему следующие коды дают мне другой вывод?(Квадратный корень больших чисел) - PullRequest
0 голосов
/ 01 февраля 2019

В настоящее время я пытаюсь смоделировать отображение сообщения на эллиптической кривой и пытаюсь найти точку на кривой y**2 = (x**3 + a*x + b) % p, задав переменную x в виде шестнадцатеричной преобразованной строки.
Однако я неЯ не знаю, является ли это проблемой с моей реализацией или сбоем в программе, но результат полностью отличается от того, что я ожидаю.

// 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, тогда как результат для самой своей 2-й степени дает результат 4575606179561504294120638508707052089783083374310823885174.Может ли кто-нибудь объяснить мне, что происходит или что я делаю не так?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Эта строка y = y ** .5 преобразует y из int в float.

Если вы приведете результат обратно к int, он будет работать, как и ожидалось: y = int(y ** .5)

Вы можете убедиться в этом сами:

print(type(y))
y = y ** .5
print(type(y))
0 голосов
/ 01 февраля 2019

В коде выражение (y = y ** .5) присваивает значение y в экспоненциальном формате, что приводит к 0,0 при оценке выражения (y ** 4 - 1 ** 3 - a * x - b)% p.

Если вы хотите продолжить с квадратного корня из y до его 4-й степени, значение y в экспоненциальном формате можно преобразовать в int (y = int (y ** .5)) в этомрегистр, а затем вычислите выражение.

Тем не менее, он дает приблизительный результат.

...