Guest User

Untitled

a guest
Jul 21st, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.26 KB | None | 0 0
  1. from numpy import matrix
  2. from math import pow, sqrt
  3. from random import randint
  4. import sys, argparse
  5.  
  6. class qubit():
  7. def __init__(self,initial_state):
  8. if initial_state:
  9. self.__state = matrix([[0],[1]])
  10. else:
  11. self.__state = matrix([[1],[0]])
  12. self.__measured = False
  13. self.__H = (1/sqrt(2))*matrix([[1,1],[1,-1]])
  14. self.__X = matrix([[0,1],[1,0]])
  15. def show(self):
  16. aux = ""
  17. if round(matrix([1,0])*self.__state,2):
  18. aux += "{0}|0>".format(str(round(matrix([1,0])*self.__state,2)) if round(matrix([1,0])*self.__state,2) != 1.0 else '')
  19. if round(matrix([0,1])*self.__state,2):
  20. if aux:
  21. aux += " + "
  22. aux += "{0}|1>".format(str(round(matrix([0,1])*self.__state,2)) if round(matrix([0,1])*self.__state,2) != 1.0 else '')
  23. return aux
  24. def measure(self):
  25. if self.__measured:
  26. raise Exception("Qubit already measured!")
  27. M = 1000000
  28. m = randint(0,M)
  29. self.__measured = True
  30. if m < round(pow(matrix([1,0])*self.__state,2),2)*M:
  31. return 0
  32. else:
  33. return 1
  34. def hadamard(self):
  35. if self.__measured:
  36. raise Exception("Qubit already measured!")
  37. self.__state = self.__H*self.__state
  38. def X(self):
  39. if self.__measured:
  40. raise Exception("Qubit already measured!")
  41. self.__state = self.__X*self.__state
  42.  
  43. class quantum_user():
  44. def __init__(self,name):
  45. self.name = name
  46. def send(self,data,basis):
  47.  
  48. assert len(data) == len(basis), "Basis and data must be the same length!"
  49. qubits = list()
  50. for i in range(len(data)):
  51. if not basis[i]:
  52. #Base computacional
  53. if not data[i]:
  54. qubits.append(qubit(0))
  55. else:
  56. qubits.append(qubit(1))
  57. else:
  58. #Base Hadamard
  59. if not data[i]:
  60. aux = qubit(0)
  61. else:
  62. aux = qubit(1)
  63. aux.hadamard()
  64. qubits.append(aux)
  65. return qubits
  66. def receive(self,data,basis):
  67. assert len(data) == len(basis), "Basis and data must be the same length!"
  68. bits = list()
  69. for i in range(len(data)):
  70. if not basis[i]:
  71. bits.append(data[i].measure())
  72. else:
  73. data[i].hadamard()
  74. bits.append(data[i].measure())
  75. return bits
  76. def generate_random_bits(N):
  77. aux = list()
  78. for i in range(N):
  79. aux.append(randint(0,1))
  80. return aux
  81.  
  82. def QKD(N,verbose=False,eve_present=False):
  83. alice_basis = generate_random_bits(N)
  84. alice_bits = generate_random_bits(N)
  85. alice = quantum_user("Alice")
  86. alice_qubits = alice.send(data=alice_bits,basis=alice_basis)
  87. if eve_present:
  88. eve_basis = generate_random_bits(N)
  89. eve = quantum_user("Eve")
  90. eve_bits = eve.receive(data=alice_qubits,basis=eve_basis)
  91. alice_qubits = eve.send(data=eve_bits,basis=eve_basis)
  92. bob_basis = generate_random_bits(N)
  93. bob = quantum_user("Bob")
  94. bob_bits = bob.receive(data=alice_qubits,basis=bob_basis)
  95. alice_key = list()
  96. bob_key = list()
  97. for i in range(N):
  98. if alice_basis[i] == bob_basis[i]:
  99. alice_key.append(alice_bits[i])
  100. bob_key.append(bob_bits[i])
  101. if alice_key != bob_key:
  102. key = False
  103. length = None
  104. print("Encription key mismatch, eve is present.")
  105. else:
  106. key = True
  107. length = len(bob_key)
  108. print("Successfully exchanged key!")
  109. print("Key Length: " + str(length))
  110. if verbose:
  111. print("Alice generates {0} random basis.".format(str(N)))
  112. input()
  113. print(''.join(str(e) for e in alice_basis))
  114. input()
  115. print("Alice generates {0} random bits.".format(str(N)))
  116. input()
  117. print(''.join(str(e) for e in alice_bits))
  118. input()
  119. print("Alice sends to Bob {0} encoded Qubits.".format(str(N)))
  120. input()
  121. aux = ""
  122. for q in alice_qubits:
  123. aux += q.show() + " "
  124. print(aux)
  125. input()
  126. if eve_present:
  127. print("Eve intercepts Qubits!")
  128. input()
  129. print(''.join(str(e) for e in eve_basis))
  130. input()
  131. print("Eve's bits.")
  132. input()
  133. print(''.join(str(e) for e in eve_bits))
  134. input()
  135. print("Bob generates {0} random basis.".format(str(N)))
  136. input()
  137. print(''.join(str(e) for e in bob_basis))
  138. input()
  139. print("Bob receives and decodes Alice's Qubits.")
  140. input()
  141. print(''.join(str(e) for e in bob_bits))
  142. input()
  143. print("Alice and Bob interchange basis through Internet and compare their basis.")
  144. input()
  145. return key
  146.  
  147. if __name__ == "__main__":
  148. parser = argparse.ArgumentParser(description='BB84 QKD demonstration with Python.')
  149. requiredNamed = parser.add_argument_group('Required arguments')
  150. optionalNamed = parser.add_argument_group('Optional arguments')
  151. requiredNamed.add_argument('-q','--qubits', required=True, help='Number of Qubits.')
  152. optionalNamed.add_argument('-i','--iterate',required=False, help='Number of iterations.')
  153. optionalNamed.add_argument('-e','--eve', action='store_true',default=False,required=False, help='Is EVE present?')
  154. optionalNamed.add_argument('-v','--verbose', action='store_true',default=False,required=False, help='Verbose logs.')
  155. args = parser.parse_args()
  156. assert int(args.qubits)
  157. ret = list()
  158. if args.iterate:
  159. assert int(args.iterate)
  160. N = int(args.iterate)
  161. else:
  162. N = 1
  163. for i in range(N):
  164. print("############# {0} #############".format(str(i)))
  165. ret.append(QKD(int(args.qubits),verbose=args.verbose,eve_present=args.eve))
  166. print("###############################".format(str(i)))
  167. print("############################")
  168. print("############################")
  169. t = "{0:.2f}".format(float(ret.count(True))*100.0/float(N))
  170. u = "{0:.2f}".format(float(ret.count(False))*100.0/float(N))
  171. print("True: {0} <{1}%>".format(ret.count(True),str(t)))
  172. print("False: {0} <{1}%>".format(ret.count(False),str(u)))
Add Comment
Please, Sign In to add comment