Advertisement
tsounakis

Algorithms #2 (Extreme pain)

Apr 18th, 2022
1,114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.44 KB | None | 0 0
  1. import random
  2. import string
  3. from math import comb, log  
  4. from timeit import default_timer as timer
  5.  
  6. TEST = False
  7.  
  8. def main():
  9.     for case in range(1,6):
  10.         run(10**case)
  11.  
  12. def run(cases):
  13.     coupons = CouponGenerator(cases)
  14.     coupons.generate()
  15.     coupons.array.sort()
  16.  
  17.     start = timer()
  18.     codes = coupons.array
  19.     tablesize = round(10**5+7)
  20.  
  21.     variants = tableVariants(codes)
  22.     #printTable(variants)
  23.  
  24.     hashesTable = hashes(variants, tablesize)
  25.     #printTable(hashesTable)
  26.  
  27.     hashTAble = hashTable(hashesTable, codes, tablesize)
  28.     #printTable(hashTAble)
  29.  
  30.     searchForPairs(hashTAble, tablesize)
  31.     end = timer()
  32.     print("Took {} seconds for the {} cases.".format(end-start, cases))
  33.  
  34. def searchForPairs(table, tablesize):
  35.     checkedHashes = []
  36.     hammingPairs = 0
  37.     for i in range(len(table)):
  38.         for j in range(len(table[0])):
  39.             if len(table[i][j]) > 1:
  40.                 tempRefHash = [calcHash(code, tablesize) for code in table[i][j]]
  41.                 if all(item in checkedHashes for item in tempRefHash) == False:
  42.                     hammingPairs += comb(len(table[i][j]), 2)
  43.                     checkedHashes.append(tempRefHash)
  44.     print("There are {} hamming pairs.".format(hammingPairs))
  45.  
  46. def hashTable(hashes, codes, tablesize):
  47.     table = [[[] for _ in range(len(codes[0]))] for _ in range(tablesize)]
  48.     for i in range(len(codes)):
  49.         for j in range(len(codes[0])):
  50.             if codes[i] in table[hashes[i][j]][j]:
  51.                 continue
  52.             table[hashes[i][j]][j].append(codes[i])
  53.     return table
  54.  
  55. def calcHash(code, tablesize):
  56.     constant = 137
  57.     codeNum = str2char(code)
  58.     lastHashValue = 0
  59.  
  60.     for character in codeNum:
  61.         if character == "*":
  62.             continue
  63.         lastHashValue = (ord(character) + constant * lastHashValue) % tablesize
  64.     return lastHashValue    
  65.  
  66. def hashes(variants, tablesize):
  67.     table = [[[] for _ in range(len(variants[0]))] for _ in range(len(variants))]
  68.     for i in range(len(variants)):
  69.         for j in range(len(variants[0])):
  70.             table[i][j] = calcHash(variants[i][j], tablesize)
  71.     return table
  72.  
  73. def tableVariants(codes):
  74.     table = [[[] for _ in range(len(codes[0]))] for _ in range(len(codes))]
  75.     for h in range(len(codes)):
  76.         string = codes[h]
  77.         for i in range(0, len(string)):
  78.             table[h][i] = string[0:i] + "*" + string[i+1:len(string)]  
  79.     return table  
  80.  
  81. def printTable(table):
  82.     for row in table:
  83.         for col in row:
  84.             print(col, end="\t")
  85.         print("\n")
  86.  
  87. class CouponGenerator:
  88.     def __init__(self, n):
  89.         self.array = []
  90.         self.n = n
  91.     def printArray(self):
  92.         for i in self.array:
  93.             print(i)
  94.     def generate(self):
  95.         if TEST:
  96.             self.array = ['WELC1234OTHE', 'IEEE1234MEXZ', 'AAAA0000ACAD', 'AAAA0000ACAF', 'AAAA0000ACAB', 'AAAA0000ABAB']
  97.         else:
  98.             for _ in range(self.n):
  99.                 self.array.append(''.join((''.join(random.SystemRandom().choice(string.ascii_uppercase) for _ in range(4)),''.join(random.SystemRandom().choice(string.digits) for _ in range(4)),''.join(random.SystemRandom().choice(string.ascii_uppercase) for _ in range(4)))))
  100.         print(self.n, "coupons generated.")
  101.  
  102. def str2num(code):
  103.     '''Δέχεται ως όρισμα μία ακολουθία δεδομένων και την μετατρέπει
  104.    σε λίστα τύπου ακέραιου'''
  105.     numCode = []
  106.     for character in code:
  107.         if ord(character) >=65 and ord(character) <= 90:
  108.             numCode.append(ord(character)-54)
  109.         else:
  110.             if character == "*":
  111.                 continue
  112.             numCode.append(int(character))
  113.     return numCode
  114.    
  115. def str2char(code):
  116.     '''Δέχεται ως όρισμα μία ακολουθία δεδομένων και την μετατρέπει
  117.    σε λίστα τύπου χαρακτήρα'''
  118.     numCode = []
  119.     for character in code:
  120.         numCode.append(character)
  121.     return numCode
  122.  
  123. def nextPrime(n):
  124.     notPrime = []
  125.     isPrime = []
  126.     for i in range (n+1, n+200):
  127.         notPrime.append(i)
  128.     for j in notPrime:
  129.         prime = True
  130.         for x in range(2, j-1):
  131.             if j % x == 0:
  132.                 prime = False
  133.                 break
  134.         if prime:
  135.             isPrime.append(j)
  136.     return min(isPrime)
  137.  
  138. if __name__ == "__main__":
  139.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement