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]:
In [8]:
print(secret)
16
In [ ]: