-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathQuantumRandomNumber
86 lines (60 loc) · 2.07 KB
/
QuantumRandomNumber
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
from qiskit import *
def convert_to_binary(number: int) -> str:
'''Converts a denary number to binary'''
strNum = ''
i = 0
while True:
if number < 2**i:
i -= 1
break
elif number == 2**i:
break
i += 1
while True:
if number >= 2**i:
number -= 2**i
strNum += '1'
i -= 1
else:
strNum += '0'
i -= 1
if i == -1:
break
return strNum
def create_quantum_circuit(bin_upper: str) -> None:
'''
Creates a quantum circuit with length of upper in binary as the amount of qubits.
Each qubit is then put in super position
'''
global qc
qc = QuantumCircuit(len(bin_upper))
for i in range (len(bin_upper)):
qc.h(i)
def run_quantum_circuit() -> str:
'''Runs the circuit with one shot and gets the result'''
simulator = Aer.get_backend('qasm_simulator')
qc.measure_all()
result = execute(qc, backend = simulator, shots = 1).result()
binary_num = str(list(result.get_counts(qc).keys())[0])
return binary_num
def convert_to_decimal(number: str) -> int:
'''Converts binary to decimial'''
decimal = 0
for i in range(len(number)):
if number[-1] == '1':
decimal += 2**i
number = number[:-1]
return decimal
def generate_number(lower: int, upper: int) -> int:
'''generates the random number within the specified range'''
lower, upper = [int(x) for x in input('Enter your lower bound (inclusive) then your upper bound (inclusive). In format n m: ').split()]
bin_lower = convert_to_binary(lower)
bin_upper = convert_to_binary(upper)
create_quantum_circuit(bin_upper)
number = convert_to_decimal(run_quantum_circuit())
while int(number) > int(upper) or int(number) < int(lower):
create_quantum_circuit(bin_upper)
number = convert_to_decimal(run_quantum_circuit())
print(number)
return(number)
generate_number(lower,upper)