X-Git-Url: http://git.tomasm.cz/krypto.git/blobdiff_plain/41da1e18539e87ec3113737a1e117fecf41f8be2..d57f411cc12d3006a9a90c03e01fe7b3cfa54446:/koincidence.py?ds=sidebyside diff --git a/koincidence.py b/koincidence.py index 24c250c..fd6277a 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_koincidence(text1, text2): - #predpokladam, ze v textech jsou jenom znaky se kterymi pocitam +def index_koincidence2(text1, text2): + """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): + """Vypise tabulku prumernych indexu pro ruzna deleni textu.""" return '\n'.join(['{1:>2} {0:.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)]