Число решений и точность квантового подсчёта
Исходный пример содержит n=4 поисковых и t=4 счётных кубита, N=16 и оракул с M=5 решениями. Он использует оценку фазы управляемых степеней итерации Гровера и обратное квантовое преобразование Фурье на счётном регистре. Если измеренное целое равно y, то оцениваются $\theta=2\pi y/2^t$ и $M=N\sin^2(\theta/2)$. Полная исходная схема и программа сохранены ниже.
1. Можете ли вы построить оракул с другим числом решений? Как меняется точность алгоритма квантового подсчёта?
2. Можете ли вы изменить схему, увеличив или уменьшив число счётных кубитов, чтобы получить другую точность результата?
При изменении t размер обратного преобразования Фурье должен соответствовать новому счётному регистру; n определяет размер поискового пространства. Авторская функция calculate_M и её оценка ошибки сохранены как часть исходного примера.
Original complete baseline:
import matplotlib.pyplot as plt
import numpy as np
import math
# importing Qiskit
import qiskit
from qiskit import QuantumCircuit, transpile, Aer
# import basic plot tools
from qiskit.visualization import plot_histogram
def grover_operator(n_iterations):
"""Grover iteration circuit for oracle with 5/16 solutions
Args:
n_iterations (int): number of times to repeat the circuit
Returns:
Gate that implements n_iterations of the Grover operator
"""
from qiskit.circuit.library import Diagonal, GroverOperator
oracle = Diagonal([1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1])
grover_it = GroverOperator(oracle).repeat(n_iterations).to_gate()
grover_it.label = f"Grover$^{n_iterations}$"
return grover_it
from qiskit.circuit.library import QFT
qft_dagger = QFT(4, inverse=True).to_gate()
qft_dagger.label = "QFT†"
# Create QuantumCircuit
t = 4 # no. of counting qubits
n = 4 # no. of searching qubits
qc = QuantumCircuit(n+t, t) # Circuit with n+t qubits and t classical bits
# Initialize all qubits to |+>
for qubit in range(t+n):
qc.h(qubit)
# Begin controlled Grover iterations
n_iterations = 1
for qubit in range(t):
cgrit = grover_operator(n_iterations).control()
qc.append(cgrit, [qubit] + list(range(t, n+t)))
n_iterations *= 2
# Do inverse QFT on counting qubits
qc.append(qft_dagger, range(t))
# Measure counting qubits
qc.measure(range(t), range(t))
# Display the circuit
qc.draw(fold=-1)
# Execute and see results
sim = Aer.get_backend('aer_simulator')
transpiled_qc = transpile(qc, sim)
job = sim.run(transpiled_qc)
hist = job.result().get_counts()
plot_histogram(hist)
measured_str = max(hist, key=hist.get)
measured_int = int(measured_str, 2)
print("Register Output = %i" % measured_int)
theta = (measured_int/(2**t))*math.pi*2
print("Theta = %.5f" % theta)
N = 2**n
M = N * (math.sin(theta/2)**2)
print(f"No. of Solutions = {M:.1f}")
m = t - 1 # Upper bound: Will be less than this
err = (math.sqrt(2*M*N) + N/(2**(m+1)))*(2**(-m))
print("Error < %.2f" % err)
def calculate_M(measured_int, t, n):
"""For Processing Output of Quantum Counting"""
# Calculate Theta
theta = (measured_int/(2**t))*math.pi*2
print("Theta = %.5f" % theta)
# Calculate No. of Solutions
N = 2**n
M = N * (math.sin(theta/2)**2)
print(f"No. of Solutions = {M:.1f}")
# Calculate Upper Error Bound
m = t - 1 #Will be less than this (out of scope)
err = (math.sqrt(2*M*N) + N/(2**(m+1)))*(2**(-m))
print("Error < %.2f" % err)
Сообщить об ошибке
Войти, чтобы отправить материал.