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 [7]:
def oracle(qubits):
# Bei welcher Qubit-Kombination von qubits[0], qubits[1] und qubits[2] schaltet das zentrale ccx(4,0,3) auf's qubits[3]?
# qubits[4] dient nur als Arbeitsqubit
qubits.cx(0,1)
qubits.cx(1,4)
qubits.x(0)
qubits.cx(1,2)
qubits.ccx(1,2,4)
# zentrales-Element: Auswirkung auf das Hilfsqubit qubits[3]
qubits.ccx(4,0,3) # auf's Hilfsqubit drauf
# "Abbau": die obigen Operationen wieder rückgängig machen
qubits.ccx(1,2,4)
qubits.cx(1,2)
qubits.cx(1,4)
qubits.x(0)
qubits.cx(0,1)
return qubits
In [8]:
def grover_iteration(circuit):
# Aufruf des Quanten-Orakels
oracle(circuit)
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 [9]:
# 3 x-Qubits, ein y-Qubit und ein Hilfqubit für's Orakel; Standard-Initialisierung mit 0
circuit = QuantumCircuit(5,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)
#grover_iteration(circuit)
#grover_iteration(circuit)
# Messungen
for i in range(3):
circuit.measure(i, i)
In [10]:
circ = transpile(circuit, backend)
erg = backend.run(circ, shots=1024).result()
plot_histogram(erg.get_counts(circuit))
Out[10]:
In [11]:
circuit.draw('mpl')
Out[11]:
In [ ]: