Python - генерирует отклонения от string.ascii_lowercase

1

Я нашел некоторые алгоритмы онлайн, чтобы генерировать нарушения в Python, но они все экспоненциальны по сложности, и в результате я не могу заставить их сходиться с набором из 26 элементов (алфавита)!

Итак, я пытаюсь найти способ улучшить следующий код (источник здесь):

def derangement(vs):
    l = [None for x in vs]
    sol = set()
    sol.add(tuple(l))
    for v in vs:
        sol1 = set()
        for s in sol:
            for (i, v1) in enumerate(s):
                if not v1 and v != vs[i]:
                    s1 = list(s)
                    s1[i] = v
                    sol1.add(tuple(s1))
        sol = sol1
    return list(sol)

Если кому-то интересно, это для решателя шифрования подстановки. Я пытаюсь понять, сколько времени требуется для шифрования шифрования!

  • 0
    Число перестановок растет экспоненциально (или, точнее, факториально). Каждый алгоритм, генерирующий все перестановки из n объектов, является Ω (n!).
  • 0
    Вы проверили модуль itertools ?
Показать ещё 7 комментариев
Теги:
encryption
cryptography
brute-force

2 ответа

5
Лучший ответ

Поскольку алгоритмы перестановок - это Ω (n!), ничто не приведет к сближению вашего кода. Это может быть быстрее, но это ничего не значит для вещей такой сложности:

import itertools
def derangement(x):
    p = itertools.permutations(x)
    return (i for i in p if not any(i[k] == x[k] for k in range(len(x))))

Это ленивый итератор. Если вам нужны все значения (я сомневаюсь, что вам нужно) просто list() it

  • 0
    Я не знал, что это ленивый итератор, так что спасибо за поддержку и оптимизацию. Я полагаю, что с помощью универсального компьютера брутфорс заменительного шифра - это выстрел в темноте!
1

Не обязательно, это зависит от того, какой шифр вы используете. Если вы используете Caesar cypher, который, я уверен, вы этого не сделали, вам нужно всего лишь попробовать все 26! Перестановки, а затем найдите один * (s) с реальными словами, но я уверен, что вы имеете в виду для vigenere cypher, и в этом случае вы берете весь первый набор перестановок, и вы кладете их в ряды аналогичной фракции и находите эти перестановки, а затем перекрестная проверка словарных слов, и тогда вы, вероятно, получите очень длинный список возможных сообщений, и вам придется сортировать те, которые имеют смысл.

  • 0
    это сдвиговые шифры, подстановочный шифр - это шифр, в котором ключ представляет собой отображение алфавита на перестановку алфавита, то есть A = C, B = Q, C = T ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню