+"""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):
+ """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)]