Updated for challenge 9
[cipher-tools.git] / cipher / affine.py
index 6ba90e6d1e4976f4d40f7024fc5f1bc10647b17f..a5647be20e3b30abd5573ac087eac7da1f1f5d2f 100644 (file)
@@ -1,15 +1,13 @@
-from utilities import *
-from language_models import *
+from support.utilities import *
+from support.language_models import *
 from logger import logger
 
 
-modular_division_table = [[0]*26 for _ in range(26)]
-for a in range(26):
-    for b in range(26):
-        c = (a * b) % 26
-        modular_division_table[b][c] = a
-
-
+modular_division_table = {
+    (multiplier, (multiplier * plaintext) % 26): plaintext
+    for plaintext in range(26) 
+    for multiplier in range(26)
+    }
 
 
 def affine_encipher_letter(accented_letter, multiplier=1, adder=0, one_based=True):
@@ -22,19 +20,6 @@ def affine_encipher_letter(accented_letter, multiplier=1, adder=0, one_based=Tru
             for l in string.ascii_letters)
     'filoruxadgjmpsvybehknqtwzcFILORUXADGJMPSVYBEHKNQTWZC'
     """
-    # letter = unaccent(accented_letter)
-    # if letter in string.ascii_letters:
-    #     if letter in string.ascii_uppercase:
-    #         alphabet_start = ord('A')
-    #     else:
-    #         alphabet_start = ord('a')
-    #     letter_number = ord(letter) - alphabet_start
-    #     if one_based: letter_number += 1
-    #     cipher_number = (letter_number * multiplier + adder) % 26
-    #     if one_based: cipher_number -= 1
-    #     return chr(cipher_number % 26 + alphabet_start)
-    # else:
-    #     return letter
     letter = unaccent(accented_letter)
     if letter in string.ascii_letters:
         letter_number = pos(letter)
@@ -58,26 +43,15 @@ def affine_decipher_letter(letter, multiplier=1, adder=0, one_based=True):
             for l in 'filoruxadgjmpsvybehknqtwzcFILORUXADGJMPSVYBEHKNQTWZC')
     'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
     """
-    # if letter in string.ascii_letters:
-    #     if letter in string.ascii_uppercase:
-    #         alphabet_start = ord('A')
-    #     else:
-    #         alphabet_start = ord('a')
-    #     cipher_number = ord(letter) - alphabet_start
-    #     if one_based: cipher_number += 1
-    #     plaintext_number = ( 
-    #         modular_division_table[multiplier]
-    #                               [(cipher_number - adder) % 26])
-    #     if one_based: plaintext_number -= 1
-    #     return chr(plaintext_number % 26 + alphabet_start) 
-    # else:
-    #     return letter
     if letter in string.ascii_letters:
         cipher_number = pos(letter)
         if one_based: cipher_number += 1
+        # plaintext_number = ( 
+        #     modular_division_table[multiplier]
+        #                           [(cipher_number - adder) % 26])
         plaintext_number = ( 
-            modular_division_table[multiplier]
-                                  [(cipher_number - adder) % 26])
+            modular_division_table[multiplier, (cipher_number - adder) % 26]
+            )
         if one_based: plaintext_number -= 1
         if letter in string.ascii_uppercase:
             return unpos(plaintext_number).upper()