Advertisement
Guest User

Untitled

a guest
Apr 1st, 2012
708
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.43 KB | None | 0 0
  1. #!/usr/bin/python
  2. # https://github.com/johnmyleswhite/JuliaVsR in Python
  3.  
  4. import random
  5. import csv
  6. import sys
  7. import math
  8. import time
  9.  
  10. letters = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
  11.            'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z')
  12.  
  13. caeser_cipher = dict()
  14. inv_caeser_cipher = dict()
  15.  
  16. n = len(letters)
  17. for i in xrange(n):
  18.     caeser_cipher[letters[i]] = letters[(i+1) % n]
  19.     inv_caeser_cipher[letters[(i+1) % n]] = letters[i]
  20.    
  21.  
  22. def apply_cipher(text, cipher):
  23.     return "".join([cipher[t] for t in text])
  24.  
  25.  
  26. def generate_random_cipher():
  27.     cipher = dict()
  28.     idx = range(len(letters))
  29.     random.shuffle(idx)
  30.     for i in xrange(len(letters)):
  31.         cipher[letters[i]] = letters[idx[i]]
  32.     return cipher
  33.  
  34.  
  35. # swap two elements of the cipher
  36. def propose_modified_cipher(cipher):
  37.     a = random.sample(letters, 2)
  38.     new = cipher.copy()
  39.     new[a[0]] = cipher[a[1]]
  40.     new[a[1]] = cipher[a[0]]
  41.     return new
  42.  
  43.  
  44. lexical_db = dict()
  45. with open('lexical_database.csv', 'r') as f:
  46.     reader = csv.reader(f, delimiter=',')
  47.     for word, frequency in reader:
  48.         lexical_db[word] = double(frequency)
  49.  
  50.  
  51. def log_probability_of_text(text, cipher, lexical_db):
  52.     s = [apply_cipher(word, cipher) for word in text]
  53.     return sum([math.log(lexical_db.get(word, sys.float_info.epsilon)) for word in s])
  54.  
  55.  
  56. def metropolis_step(text, cipher, lexical_db):
  57.     proposed_cipher = propose_modified_cipher(cipher)
  58.     lp1 = log_probability_of_text(text, cipher, lexical_db)
  59.     lp2 = log_probability_of_text(text, proposed_cipher, lexical_db)
  60.     if lp2 > lp1:
  61.         return proposed_cipher
  62.     else:
  63.         a = math.exp(lp2 - lp1)
  64.         x = random.random()
  65.         if x < a:
  66.             return proposed_cipher
  67.         else:
  68.             return cipher
  69.  
  70.  
  71. plaintext = "here is some sample text"
  72. encrypted_text = [apply_cipher(word, caeser_cipher) for word in plaintext.split()]
  73. #random.seed(1)
  74. cipher = generate_random_cipher()
  75. n_iterations = 50000
  76.  
  77. starttime = time.time()
  78. results = []
  79. for i in xrange(n_iterations):
  80.     lp = log_probability_of_text(encrypted_text, cipher, lexical_db)
  81.     current_decrypt = " ".join([apply_cipher(word, cipher) for word in encrypted_text])
  82.     is_correct = plaintext == current_decrypt
  83.     results.append((i, lp, current_decrypt, is_correct))
  84.     cipher = metropolis_step(encrypted_text, cipher, lexical_db)
  85. endtime = time.time()
  86. print (endtime - starttime)
  87.  
  88. with open('py_results.tsv', 'w') as f:
  89.     writer = csv.writer(f)
  90.     writer.writerows(results)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement