@haqz

Как расширить вычисление до 2^120?

мой код с данными на входе (input)несколько тысячь работает ок. У меня есть параметры delta и gamma и они работают с инпутом в несколько тысяч, какие нужны параметры delta и gamma что бы работать с инпутом 2^120 ?

input величина не известная!!!
В результате вычислений значение result должно быть 0x1.

from random import randint

N =    115792089237316195423570985008687907852837564279074904382605163141518161494337

def inv(v): return pow(v, N-2, N)
def divnum(a, b): return ( (a * inv(b) ) % N )

i=0
#input2^^120 = 0x9fd24b3abe244d6c443df56fa494dc

input = 0x5f87 +1

delta = 12

gamma = 2

d1= 80

while i < 2**61:
    d= (divnum(input,delta)) 
    s = divnum(i,gamma) %N
    result = divnum(d,s)
    
    if result <input and result >=0:
        print("result",hex(result),"i",hex(i),"input",hex(input))
        
    i = i +1
  • Вопрос задан
  • 317 просмотров
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега Математика
Разработчик на С++, экс-олимпиадник.
Код в вопросе найдет такое i, что result станет равен 1, если цикл сделать до N. Для любых дельта и гамма. (но там цикл не нужен вообще).

И наоборот. Какие бы вы дельта и гамма не взяли, может прийти такой Input, что result станет 1, только для очень большого i.

Во-первых, вам цикл не нужен. Вычисления ваши можно упростить.
result = (input / delta) / (i / gamma) = input * (gamma / delta) / i

Если result = 1, то получается i = input * (gamma / delta) (естественно, умножение и деление по модулю N).
Цикла не надо. Можно сразу вычислить искомое i.
Решение единственно (если N простое. А если оно не простое, то делить по модулю нельзя).

И это самое i может оказаться очень большим. Не всегда N-1, потому что у вас ограничение на Input есть дополнительное, Но даже в самом лучшем случае подбора гамма и дельта (обе по 1), вам может прийти input такой, что i будет равно 2^120.

Ну и, во-вторых, вам не нужны две константы дельта и гамма. Тут есть ровно одна степень свободы - значение gamma / delta. Это должна быть единственная константа в вашем коде. В итоге оно все упрощается до:
beta = 0x42
i = beta * input % N
result = 1


И вообще тут, очевидно, проблема XY. У вас есть какая-то задача X, вы придумали какую-то фигню, как-то сформулировали вот эту вот задачу в вопросе (У), но вы ошиблись. Решение вот этой фигни в вопросе вам никак не поможет решить вашу изначальную задачу, пототму что вам не хватает знаний (теории групп, например, да и математики в целом). Вы задаете практически бессмысленные вопросы (уже не первый раз). Если хотите, чтобы вам тут действительно помогли - давайте вашу изначальную задачу. Я подозреваю, что это взлом криптографии и вам тут популярно объяснят, что вы зря тратите время.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы