In [2]:
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.quantum_info import Operator

from qiskit.visualization import plot_histogram
import random
import numpy as np
In [3]:
def oracle(qubits,secret):
    # kein "Phase-Kickback" durch das Hilfsqubit: Orakel multipliziert direkt das gesuchte Element mit -1
    # daher braucht man kein Hilfs-Qubit
    d_matrix = np.identity(2**n)
    d_matrix[secret,secret] = -1
    qubits.unitary(Operator(d_matrix),range(n)) # erzeugt unitäre Transformation zur übergebenen Transformationsmatrix
    return qubits
In [4]:
def grover_iteration(circuit,secret):
    # Aufruf des Quanten-Orakels (ohne Hilfsqubit, da das Orakel durch eine Matrix erzeugt wird)
    oracle(circuit,secret)
    circuit.barrier()  # nur für die Schaltkreis-Darstellung
    # H-Gatter für alle x-Qubits
    for i in range(n):
        circuit.h(i)
    circuit.barrier()  # nur für die Schaltkreis-Darstellung
    # -D-Matrix erzeugen als minus-Einheitsmatrix und an der Stelle (0,0) eine 1
    minusD = -np.identity(2**n)
    minusD[0,0] = 1
    circuit.unitary(Operator(minusD),range(n)) # erzeugt unitäre Transformation zur übergebenen Transformationsmatrix
    circuit.barrier()  # nur für die Schaltkreis-Darstellung
    # H-Gatter für alle x-Qubits
    for i in range(n):
        circuit.h(i)
    circuit.barrier()  # nur für die Schaltkreis-Darstellung
    return circuit
In [5]:
n=5   # wieviel Qubits? N=2**n.
secret=random.randint(0,2**n-1) # Auswahl des gesuchten Elements
In [6]:
# n x-Qubits (kein Hilfs-Qubit, da das Orakel durch eine Matrix erzeugt wird)
circuit = QuantumCircuit(n,n)
# H-Gatter für alle x-Qubits (kein Hilfs-Qubit)
for i in range(n):
    circuit.h(i)
circuit.barrier()  # nur für die Schaltkreis-Darstellung
# Beginn der Grover-Iteration
grover_iteration(circuit,secret)
#grover_iteration(circuit,secret)
#grover_iteration(circuit,secret)
#grover_iteration(circuit,secret)
# Ende der Grover-Iteration
for i in range(n):
    circuit.measure(i, i)
In [7]:
circ = transpile(circuit, backend)
erg = backend.run(circ, shots=1024).result()
plot_histogram(erg.get_counts(circuit))
Out[7]:
No description has been provided for this image
In [8]:
print(secret)
16
In [ ]: