Преобразование кода MATLAB в Python: типы Python и порядок операций - PullRequest
0 голосов
/ 30 сентября 2018

Это функция MATLAB от автора RainbowCrack:

function ret = calc_success_probability(N, t, m)
arr = zeros(1, t - 1);
arr(1) = m;
for i = 2 : t - 1
    arr(i) = N * (1 - (1 - 1 / N) ^ arr(i - 1));
end

exp = 0;
for i = 1 : t - 1
    exp = exp + arr(i);
end

ret = 1 - (1 - 1 / N) ^ exp;

Она рассчитывает вероятность успеха при поиске незашифрованного пароля по радужной таблице с пространством клавиш N, большим целым числом без знака, цепочкойдлиной t и числом цепочек m.

Пример прогона:

calc_success_probability(80603140212, 2400, 40000000)

Возвращает 0,6055.

У меня возникли проблемы с преобразованием этого в Python,В Python 3 больше нет максимального целого числа, поэтому N не проблема.Я думаю, что в вычислениях мне нужно заставить все к большому числу с плавающей запятой, но я не уверен.

Я также не знаю порядок операций в MATLAB.Я думаю, что код говорит это:

Создайте массив размером [1 .. 10], чтобы десять элементов Инициализировали каждый элемент этого массива с нуля

При индексации с нуля, я думаю этобудет array[0 .. t-1], похоже, что MATLAB использует 1 в качестве первого (0-го) индекса.

Затем второй элемент массива (индексация на основе 0) инициализируется как m.

Для каждого элемента в массиве от pos=1 (индексирование на основе 0) до t-1:

array[pos] = N * (1 - (1 - 1/N) ** array[pos-1]

Где ** - оператор питания.Я думаю, что в MATLAB мощность равна ^, поэтому N * (1 - (1-1/N) для array[pos-1] мощности такая же, как указано выше.

Затем установите показатель степени.Для каждого элемента в массиве от 0 до t-1: экспонента равна экспоненте + 1

вероятность возврата = 1 - (1 - 1/N) сила опыта;

Мой код Python выглядит так и не работает,Я не могу понять, почему, но может случиться так, что я недостаточно понимаю MATLAB, или Python, оба, или я как-то неправильно читаю математику, и то, что происходит в MATLAB, не то, что я ожидаю, т.е.У меня неправильный порядок операций и / или типов, чтобы заставить его работать, и я что-то упускаю в этих терминах ...

def calc_success_probability(N, t, m):

    comp_arr = []

    # array with indices 1 to t-1 in MATLAB, which is otherwise 0 to t-2???
    # range with 0, t is 0 to t excluding t, so t here is t-1, t-1 is up
    # to including t-2... sounds wrong...
    for i in range(0, t-1):
        # initialize array
        comp_arr.append(0)

    print("t = {0:d}, array size is {1:d}".format(t, len(comp_arr)))

    # zero'th element chain count
    comp_arr[0] = m

    for i in range(1, t-1):
        comp_arr[i] = N * (1 - (1 - 1 / N)) ** comp_arr[i-1]

    final_exp = 0
    for i in range(0, t-1):
        final_exp = final_exp + comp_arr[i]

    probability = (1 - (1 - 1 / N)) ** final_exp

    return probability

1 Ответ

0 голосов
/ 30 сентября 2018

Следите за своими скобками!Вы перевели это:

arr(i)      = N * (   1 - ( 1 - 1 / N )     ^  arr(i - 1)     );

на это:

comp_arr[i] = N * (   1 - ( 1 - 1 / N )   ) ** comp_arr[i-1]

Я выстроил все в ряд, чтобы вы могли лучше понять, в чем дело.Вы переместили скобку в неправильное место.

Это должно быть:

comp_arr[i] = N * (   1 - ( 1 - 1 / N )     ** comp_arr[i-1]  )

Аналогично,

ret = 1 - (1 - 1 / N) ^ exp;

- это не то же самое, что

probability = (1 - (1 - 1 / N)) ** final_exp

Это должно быть

probability = 1 - (1 - 1 / N) ** final_exp
...