Я нашел некоторые алгоритмы онлайн, чтобы генерировать нарушения в 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)
Если кому-то интересно, это для решателя шифрования подстановки. Я пытаюсь понять, сколько времени требуется для шифрования шифрования!
Поскольку алгоритмы перестановок - это Ω (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
Не обязательно, это зависит от того, какой шифр вы используете. Если вы используете Caesar cypher, который, я уверен, вы этого не сделали, вам нужно всего лишь попробовать все 26! Перестановки, а затем найдите один * (s) с реальными словами, но я уверен, что вы имеете в виду для vigenere cypher, и в этом случае вы берете весь первый набор перестановок, и вы кладете их в ряды аналогичной фракции и находите эти перестановки, а затем перекрестная проверка словарных слов, и тогда вы, вероятно, получите очень длинный список возможных сообщений, и вам придется сортировать те, которые имеют смысл.
itertools
?