X-Git-Url: http://git.tomasm.cz/krypto.git/blobdiff_plain/ec94fc01a90b006e61d37d0f152bd60e38d05cd4..239c6137da450c54759d5d7d910b5e8f16cf37ef:/koincidence.py diff --git a/koincidence.py b/koincidence.py index 07231b7..5c943ec 100644 --- a/koincidence.py +++ b/koincidence.py @@ -1,34 +1,41 @@ +"""Modul pro praci s indexy koincidence""" + from ocesavac import ocesat from collections import deque -def index_koincidence(text): - t = ocesat(text, False) #zatim bez mezer - deq = deque(t) +def index_koincidence(text, mezery=False): + """Vrati prumerny index koincidence textu.""" + text = ocesat(text, mezery) + if mezery: + text = text[1:-1] + deq = deque(text) shod = 0 - for i in range(1, len(t)): + for _ in range(1, len(text)): deq.rotate(1) - shod += sum (x == y for x, y in zip(deq, t)) - return float(shod)/(len(t)*(len(t) - 1)) + shod += sum (x == y for x, y in zip(deq, text)) + return float(shod)/(len(text)*(len(text) - 1)) def index_koincidence2(text1, text2): - #predpokladam, ze v textech jsou jenom znaky se kterymi pocitam + """Pro dva texty vraci index koincidence. Texty nijak neupravuje, + ocekava ze se skladaji pouze ze znaku pracovni abecedy.""" shod = sum (x == y for x, y in zip(text1, text2)) return float(shod)/min(len(text1), len(text2)) def index_rozkladu(text, deleni): + """Vrati prumerny index koincidence pro text rozdeleny na vice casti + (ve stylu 123123123... pro deleni=3). Slouzi napriklad k odhadu + delky periodickeho hesla u polyalfabetickych sifer.""" if (deleni == 1): return index_koincidence(text) - t = ocesat(text, False) #zatim bez mezer - texty = rozklad(t, deleni) + texty = rozklad(ocesat(text, False), deleni) return sum([index_koincidence(text) for text in texty])/len(texty) def tabulka_indexu(text): - return '\n'.join(['{1:>2} {0:.3%}'.format( + """Vypise tabulku prumernych indexu pro ruzna deleni textu.""" + return '\n'.join(['{1:>2} {0:>7.3%}'.format( index_rozkladu(text, d), d) for d in range(1, 11)]) def rozklad(text, deleni): - texty = [] - for i in range(deleni): - texty.append(''.join( - [text[j] for j in range(len(text)) if j % deleni == i])) - return texty + """Vrati pole retezcu, v kazdem jsou znaky z puvodniho textu jejichz pozice + ma stejny zbytek po deleni cislem 'deleni'.""" + return [text[i::deleni] for i in range(deleni)]