Преобразование кода MATLAB в Python: типы Python и порядок операций

Это функция 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 ответ

Решение

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

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
Другие вопросы по тегам