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]:
No description has been provided for this image
In [7]:
print(secret)
1
In [8]:
circuit.draw('mpl')  # Ausgabe des Schaltkreis
Out[8]:
No description has been provided for this image
In [ ]:
circ.draw('mpl')  # Ausgabe des Hardware-nahen Schaltkreis (Toffoli-Gatter wird aufgelöst entspr. Übblatt 6, Aufg. 4)
In [ ]: