vigenere
[krypto.git] / referencni.py
1 #!/usr/bin/env python
2
3 from itertools import combinations
4 import pickle
5 from ocesavac import ocesat
6 import codecs
7 from koincidence import index_koincidence
8 from spolecne import ABECEDA, MABECEDA
9
10 def nova_tabulka(tabulka, abc=MABECEDA):
11     celkem = sum(sum(tab2.values()) for tab2 in tabulka.values())
12     if celkem != 0:
13         for i in abc:
14             for j in abc:
15                 tabulka[i][j] /= float(celkem)
16     return tabulka
17
18 def poradi_dle_frekvence(freq):
19     return sorted(freq.keys(), key=freq.get, reverse=True)
20
21 class reference:
22     def __init__(self, tref, komentar=''):
23         self.abeceda = tref.abeceda
24         self.poradi = poradi_dle_frekvence(tref.frekvence)
25         self.tabulka = nova_tabulka(tref.tabulka, tref.abeceda)
26         self.komentar = komentar
27
28 class treference:
29     def __init__(self, mezery=True):
30         if mezery:
31             self.abeceda = MABECEDA
32         else:
33             self.abeceda = ABECEDA
34         self.mezery = mezery
35         self.frekvence = dict()
36         for c in self.abeceda:
37             self.frekvence[c] = 0
38         self.tabulka = dict()
39         for i in self.abeceda:
40             self.tabulka[i] = dict()
41             for j in self.abeceda:
42                 self.tabulka[i][j] = 0
43         self.soubory = []
44         
45     def pridej(self, soubor):
46         f = codecs.open(soubor, encoding='UTF-8')
47         text = ocesat(f.read(), self.mezery)
48         f.close()
49         for i in range(len(text) - 1):
50             self.tabulka[text[i]][text[i+1]] += 1
51             self.frekvence[text[i]] += 1
52         else:
53             self.frekvence[text[i+1]] += 1
54         self.soubory.append(soubor)
55
56 def uloz(co, kam):
57     f = open(kam, 'w')
58     pickle.dump(co, f)
59     f.close()
60
61 def nacti(odkud):
62     return pickle.load(open(odkud))
63
64 def prumerny_index(tref):
65     suma = 0
66     for soubor in ref.soubory:
67         f = codecs.open(soubor, encoding='UTF-8')
68         text = ocesat(f.read(), tref.mezery)
69         f.close()
70         suma += index_koincidence2(text[:len(text)/2], text[len(text)/2:])
71     return float(suma)/len(tref.soubory)