Преобразование кода 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