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]:
No description has been provided for this image
In [11]:
circuit.draw('mpl')
Out[11]:
No description has been provided for this image
In [ ]: