In [1]:
from qiskit import QuantumCircuit, QuantumRegister, transpile
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService.save_account(channel="ibm_quantum", token="HIER IHR TOKEN EINSETZEN", set_as_default=True, overwrite=True)
from qiskit.providers.basic_provider import BasicSimulator
backend = BasicSimulator()
from qiskit.visualization import plot_histogram
import random
In [2]:
def oracle(qubits,secret):
# Bits so setzen, dass beim gesuchten Element 'secret' als Binärzahl qubits[2]qubits[1]qubits[0] nachher 111 rauskommt
if (secret==0 or secret==2 or secret==4 or secret==6):
qubits.x(0) # NOT auf qubits[0]
if (secret==0 or secret==1 or secret==4 or secret==5):
qubits.x(1) # NOT auf qubits[1]
if (secret==0 or secret==1 or secret==2 or secret==3):
qubits.x(2) # NOT auf qubits[2]
# nun ein von qubit[0], qubit[1] und qubit[2] kontrolliertes CNOT auf's Hilfqubit qubit[3]
controls = list(range(3))
qubits.mcx(controls,3)
# x-Qubits entsprechend oben zurücksetzen.
if (secret==0 or secret==2 or secret==4 or secret==6):
qubits.x(0)
if (secret==0 or secret==1 or secret==4 or secret==5):
qubits.x(1)
if (secret==0 or secret==1 or secret==2 or secret==3):
qubits.x(2)
return qubits
In [3]:
def grover_iteration(circuit,secret):
# Aufruf des Quanten-Orakels
oracle(circuit,secret)
circuit.barrier() # nur für die Schaltkreis-Darstellung
# H-Gatter für alle x-Qubits
for i in range(3):
circuit.h(i)
circuit.barrier() # nur für die Schaltkreis-Darstellung
# Beginn der Realisierung von D mit Schaltkreis von Übungsblatt 7, Aufgabe 3b);
# auf die Multiplikation mit (-1) wird verzichtet, da das alle Amplituden betrifft und
# daher insgesamt für den weiteren Verlauf und die abschließenden Messungen irrelevant ist.
for i in range(3):
circuit.x(i) # P_x-Gatter für die drei Qubits
circuit.barrier() # nur für die Schaltkreis-Darstellung
circuit.h(2) # H-Gatter unten
circuit.ccx(0,1,2) # Toffoli-Gatter
circuit.h(2) # H-Gatter unten
circuit.barrier() # nur für die Schaltkreis-Darstellung
for i in range(3):
circuit.x(i) # P_x-Gatter für die drei Qubits
# Ende der Realisierung von -D
circuit.barrier() # nur für die Schaltkreis-Darstellung
# H-Gatter für alle x-Qubits
for i in range(3):
circuit.h(i)
circuit.barrier() # nur für die Schaltkreis-Darstellung
return circuit
In [4]:
secret=random.randint(0,7) # Auswahl des gesuchten Elements
In [5]:
# 3 x-Qubits, ein y-Qubit und ein Hilfqubit für's Orakel; Standard-Initialisierung mit 0
circuit = QuantumCircuit(4,3)
circuit.x(3) # unterstes Qubit auf 1 setzen
circuit.barrier() # nur für die Schaltkreis-Darstellung
# H-Gatter für alle Qubits
for i in range(4):
circuit.h(i)
circuit.barrier() # nur für die Schaltkreis-Darstellung
# Grover-Iteration(en)
grover_iteration(circuit,secret)
#grover_iteration(circuit,secret)
#grover_iteration(circuit,secret)
#grover_iteration(circuit,secret)
#grover_iteration(circuit,secret)
# Messungen
for i in range(3):
circuit.measure(i, i)
In [6]:
circ = transpile(circuit, backend) # Transformation auf Hardware-nahen Schaltkreis
erg = backend.run(circ, shots=1024).result()
plot_histogram(erg.get_counts(circuit))
Out[6]:
In [7]:
print(secret)
1
In [8]:
circuit.draw('mpl') # Ausgabe des Schaltkreis
Out[8]:
In [ ]:
circ.draw('mpl') # Ausgabe des Hardware-nahen Schaltkreis (Toffoli-Gatter wird aufgelöst entspr. Übblatt 6, Aufg. 4)
In [ ]: