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