1 """Modul pro praci s indexy koincidence"""
3 from ocesavac import ocesat
4 from collections import deque
6 def index_koincidence(text, mezery=False):
7 """Vrati prumerny index koincidence textu."""
8 text = ocesat(text, mezery)
13 for _ in range(1, len(text)):
15 shod += sum (x == y for x, y in zip(deq, text))
16 return float(shod)/(len(text)*(len(text) - 1))
18 def index_koincidence2(text1, text2):
19 """Pro dva texty vraci index koincidence. Texty nijak neupravuje,
20 ocekava ze se skladaji pouze ze znaku pracovni abecedy."""
21 shod = sum (x == y for x, y in zip(text1, text2))
22 return float(shod)/min(len(text1), len(text2))
24 def index_rozkladu(text, deleni):
25 """Vrati prumerny index koincidence pro text rozdeleny na vice casti
26 (ve stylu 123123123... pro deleni=3). Slouzi napriklad k odhadu
27 delky periodickeho hesla u polyalfabetickych sifer."""
29 return index_koincidence(text)
30 texty = rozklad(ocesat(text, False), deleni)
31 return sum([index_koincidence(text) for text in texty])/len(texty)
33 def tabulka_indexu(text):
34 """Vypise tabulku prumernych indexu pro ruzna deleni textu."""
35 return '\n'.join(['{1:>2} {0:.3%}'.format(
36 index_rozkladu(text, d), d) for d in range(1, 11)])
38 def rozklad(text, deleni):
39 """Vrati pole retezcu, v kazdem jsou znaky z puvodniho textu jejichz pozice
40 ma stejny zbytek po deleni cislem 'deleni'."""
41 return [text[i::deleni] for i in range(deleni)]