bugfix
[krypto.git] / koincidence.py
1 """Modul pro praci s indexy koincidence"""
2
3 from ocesavac import ocesat
4 from collections import deque
5
6 def index_koincidence(text, mezery=False):
7     """Vrati prumerny index koincidence textu."""
8     text = ocesat(text, mezery)
9     if mezery:
10         text = text[1:-1]
11     deq = deque(text)
12     shod = 0
13     for _ in range(1, len(text)):
14         deq.rotate(1)
15         shod += sum (x == y for x, y in zip(deq, text))
16     return float(shod)/(len(text)*(len(text) - 1))
17
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))
23     
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.""" 
28     if (deleni == 1):
29         return index_koincidence(text)
30     texty = rozklad(ocesat(text, False), deleni)
31     return sum([index_koincidence(text) for text in texty])/len(texty)
32
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)])
37
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)]