kosmeticke upravy
[krypto.git] / jakobsen.py
index 25f01dc..40a1d1c 100644 (file)
@@ -13,13 +13,11 @@ def nova_tabulka(zprava, abc=MABECEDA):
         for j in abc:
             tabulka[i][j] = 0
     for i in range(len(zprava) - 1):
-        if zprava[i] in tabulka and zprava[i+1] in tabulka[zprava[i]]:
-            tabulka[zprava[i]][zprava[i+1]] += 1
+        tabulka[zprava[i]][zprava[i+1]] += 1
     celkem = sum(sum(tab2.values()) for tab2 in tabulka.values())
-    if celkem != 0:
-        for i in abc:
-            for j in abc:
-                tabulka[i][j] /= float(celkem)
+    for i in abc:
+        for j in abc:
+            tabulka[i][j] /= float(celkem)
     return tabulka
 
 def vzdalenost(tab1, tab2, abc=MABECEDA):
@@ -51,28 +49,32 @@ class reference:
     pass
 
 def jakobsen(zprava, ref):
-    slovnik = dict(zip(poradi_dle_frekvence(zprava), ref.poradi))
-    tabulka = nova_tabulka(substituce(zprava, slovnik))
-    vzdal = vzdalenost(tabulka, ref.tabulka)
+    slovnik = dict(zip(poradi_dle_frekvence(zprava, ref.abeceda), ref.poradi))
+    tabulka = nova_tabulka(substituce(zprava, slovnik, ref.abeceda), ref.abeceda)
+    vzdal = vzdalenost(tabulka, ref.tabulka, ref.abeceda)
 
     vzdal_old = vzdal + 1
     while vzdal_old > vzdal:
         vzdal_old = vzdal
         for (x, y) in combinations(ref.abeceda, 2):
             slovnik[x], slovnik[y] = slovnik[y], slovnik[x]
-            v1 = vzdalenost(nova_tabulka(substituce(zprava, slovnik)),
-                            ref.tabulka)
+            v1 = vzdalenost(nova_tabulka(substituce(zprava, slovnik, ref.abeceda), ref.abeceda),
+                            ref.tabulka, ref.abeceda)
             if  v1 < vzdal:
                 vzdal = v1
             else:
                 slovnik[x], slovnik[y] = slovnik[y], slovnik[x]
+    return slovnik
+    
 
-    return '\n'.join([''.join(substituce(zprava, slovnik)),
-                      ' '.join(ref.abeceda),
-                      ' '.join([slovnik[c] for c in ref.abeceda])])
-
-def desifruj(zprava, refs):
-    f = open(refs, 'rb')
+def desifruj(zprava, mezery=True):
+    if mezery:
+        f = open('ref')
+    else:
+        f = open('bref')
     ref = pickle.load(f)
     f.close()
-    return jakobsen(zprava, ref)
+    slovnik = jakobsen(ocesat(zprava, mezery), ref)
+    return '\n'.join([''.join(substituce(zprava, slovnik, ref.abeceda)),
+                      ' '.join(ref.abeceda),
+                      ' '.join([slovnik[c] for c in ref.abeceda])])