Квантовый поиск через моделирование
Решите поисковую задачу с одним решением среди 32 состояний, рассматривая её как квантовое моделирование. Начальное $|\psi\rangle$ — равномерная суперпозиция пяти кубитов; $|x\rangle$ — единственное решение. Оракул полностью определён данной схемой: Toffoli с пятью управляющими кубитами 0,…,4 и целью на вспомогательном q5. При фазовом вспомогательном состоянии − он отмечает решение отрицательной фазой.
1. Постройте приближение к эволюции $H=|x\rangle\langle x|+|\psi\rangle\langle\psi|$.
A. Дополните H1(delt,n=5), реализующий $e^{-i\Delta t|\psi\rangle\langle\psi|}$.
B. Дополните H2(delt,n=5), реализующий $e^{-i\Delta t|x\rangle\langle x|}$.
C. Создайте sim_h, используя H1 и H2. Автор задаёт произведение $e^{-i\pi|x\rangle\langle x|}e^{-i\pi|\psi\rangle\langle\psi|}$, как приближённую эволюцию за Δt=π.
2. Проверьте заявленную автором эквивалентность такого шага и алгоритма Гровера.
A. Создайте данную grover с Oracle и диффузором Amp.
B. Выполните предоставленное сравнение состояний grover и sim_h; автор утверждает совпадение до глобальной фазы.
C. Найдите нужное число итераций R для данного оракула.
D. Дополните qc_sim для поиска R повторениями шага; выполните qc_grover и qc_sim и сравните решения.
3. В конце автор даёт готовый иллюстративный пример с Δt=π/2.1 и R=6, названный примером вероятности точно 1; его исходный код также сохранён ниже. Это не добавленный новый опыт или новое требование задачи.
Порядок двух множителей, глобальную фазу и утверждение о точной вероятности нужно проверять: исходные выражения сохранены, готовые сравнения помещены в разбор.
Исходные определения и заготовки (код сохранён без исполнения):
from qiskit import *
from qiskit.quantum_info import Statevector, partial_trace
from qiskit.visualization import plot_state_qsphere, plot_histogram
import numpy as np
import matplotlib.pyplot as plt
import scipy.linalg as la
sim = Aer.get_backend('qasm_simulator')
n = 5
qc = QuantumCircuit(n+1, name='Oracle')
qc.mct(list(range(n)), n)
Oracle = qc.to_gate()
test = QuantumCircuit(n+1)
test.x(n)
test.h(range(n+1))
test.append(Oracle, range(n+1))
test.h(n)
test.draw()
def H1(delt, n=5):
h1 = QuantumCircuit(n+1, name='H1')
#### Your code goes here ######
###############################
return h1.to_gate()
def H2(delt, n=5):
h2 = QuantumCircuit(n+1, name='H2')
#### Your code goes here ######
###############################
return h2.to_gate()
#### Your code goes here ####
############
sim_h.draw()
qc = QuantumCircuit(n+1, name='Amp')
qc.h(range(n))
qc.x(range(n))
qc.mct(list(range(n)), n)
qc.x(range(n))
qc.h(range(n))
Amp = qc.to_gate()
grover = QuantumCircuit(n+1)
grover.x(n)
grover.h(range(n+1))
grover.append(Oracle, range(n+1))
grover.append(Amp, range(n+1))
grover.h(n)
grover.x(n)
grover.draw()
st_simh = Statevector.from_instruction(sim_h)
st_grover = Statevector.from_instruction(grover)
print('grover circuit and sim_h circuit genrate the same output state: ' ,st_simh == st_grover)
#### your code goes here ####
######
print(R)
## The circuit to solve the search problem through Grover's algorithm.
n = 5
qc_grover = QuantumCircuit(n+1, n)
qc_grover.x(n)
qc_grover.h(range(n+1))
for _ in range(int(R)):
qc_grover.append(Oracle, range(n+1))
qc_grover.append(Amp, range(n+1))
qc_grover.h(n)
qc_grover.x(n)
qc_grover.barrier()
qc_grover.measure(range(n), range(n))
qc_grover.draw()
qc_sim = QuantumCircuit(n+1, n)
qc_sim.h(range(n))
#### Your code goes here ####
counts = execute([qc_grover, qc_sim], sim).result().get_counts()
plot_histogram(counts, legend=['Grover', 'Hamiltonian'])
n = 5
qc = QuantumCircuit(n+1, n)
qc.h(range(n))
delt, R = np.pi/2.1, 6
for _ in range(int(R)):
qc.append(H1(delt), range(n+1))
qc.append(H2(delt), range(n+1))
qc.measure(range(n) ,range(n))
qc.draw()
count = execute(qc, sim).result().get_counts()
plot_histogram(count)Сообщить об ошибке
Войти, чтобы отправить материал.