Pull to refresh

Comments 18

А вуз, вуз какой?! У меня дочка поступать будет в следующем году!

В Пайтоне вложенные циклы изящней получаются с использованием itertools.product()
Будьте добры, перепишите код на Python c использованием itertools (https://docs.python.org/2/library/itertools.html).

Взамен смогу предоставить 2683v4x2 + 6380x2 для тестов (32 Gb RAM DDR3 и DDR4, OS увы Windows)

Буду Вам признателен.
Не понял выражения из начала секции «Параллельный брутер»:

...=26^5*120 ~1.
Где ~ приблизительно равно.
… = 26^5 *120 ~ 1.43 * 10^9 — формула не отрисовалась до конца
Код лексикографического перебора таким ужасным делать пришлось из-за #omp parallel for?
Тело цикла действительно нелицеприятное. Как было сказано, для #omp parallel for collapse(8) необходимо условие «идеально вложенных» циклов, поэтому пришлось выкручиваться.
Да нет, претензии не к телу цикла, а к 8 вложенным. Для пароля длины 32 у вас бы такой же алгоритм перебора был?
Не понимаю недовольства — полный перебор на то и полный, чтобы проходить по каждому элементу множества От и До, и вложенные for в такой ситуации отлично с этим справляются. Что касается 32-символьных паролей, вообще не понял к чему этот вопрос. Мало того, что пароли длины 11 и выше уже не поддаются перебору при ряде условий, так еще и описанный алгоритм рассматривается в рамках конкретной задачи, где длина строго 8.
Для того, чтобы перебрать все последовательности длины N, не требуется N вложенных циклов. Поскольку все остальное написано хорошо, то я попытался найти логичное объяснение такому коду. Вроде бы подходил вариант с ограничениями openmp, поэтому и спросил.
Мне подход с вложенными for видится естественным. Дело не в openmp, при желании можно обойтись и одним циклом (что собственно и делает collapse()). Но зачем, если так проще, легче читается и на производительности не сказывается?
Дело в алгоритмизации. Перебор всех строк фиксированной длины над фиксированным алфавитом — это отдельная первокурсная задачка, без ключевого слова «пароль» и громких слов о 100500 тысячах лет на проверку, ежели не 8. И 8 тут — всего лишь параметр, а перебор должен работать, если вместо 8 поставить N. Без изменения кода. И нет, 8 вложенных циклов не выглядят естественными (впрочем, один — тоже).
Алгоритмизация — это, бесспорно, хорошо и правильно. Только тут дело не в ней. Обратите внимание, я не выпускаю конечный продукт а-ля «Переборщик паролей любой длины на все случаи жизни» — я всего лишь прохожу путь решения конкретной задачи с фиксированными входными данными (речь в которой, к тому же, идет о переборе не всех строк указанной длины над алфавитом, а лишь тех, которые удовлетворяют маске). В условиях ограниченного времени, отведенного на решение, мне все же видится естественным использование цикла for (при учете того, что существует #omp parallel for!), нежели чем попытки эффективно распараллелить первокурсные задачи по типу «Выпиши все префиксы длины N над данным множеством». Если вы об этом спрашивали в своем первом комментарии, то да — код именно такой в том числе и из-за #omp parallel for.
Sign up to leave a comment.

Articles

Change theme settings