№ 2075Квантовые вычисленияУровень 4

Две схемы и итеративная оценка фазы T

Реализуйте итеративную оценку фазы IPE на двух кубитах: один вспомогательный кубит q0 и собственное состояние q1, повторные измерения, сброс и классически управляемые поправки.

1. Разберитесь в схеме с неунитарными операциями.
A. Запустите первую данную схему и предскажите её исходы. Она готовит H на кубите, измеряет c0, сбрасывает кубит, применяет H, условный P(π/3) при значении всего классического регистра 1, ещё H и измеряет c1. Классический регистр имеет два бита.
B. Дополните вторую данную схему так, чтобы вспомогательный верхний кубит после сброса и вставленных операций находился в $(|0\rangle+e^{-i\pi/2}|1\rangle)/\sqrt2$, если первый классический бит равен 1, и оставался в 0 иначе. Затем выполняются уже данные заключительный H и измерение.
2. Контекст алгоритма: если $U|\Psi\rangle=e^{2\pi i\varphi}|\Psi\rangle$ и $\varphi=0.\varphi_1\ldots\varphi_m$, то на шаге k вспомогательный кубит готовят в +, выполняют controlled-U $2^{m-k}$ раз, вводят фазовую поправку $-2\pi\,0.0\varphi_{m-k+2}\ldots\varphi_m$ и измеряют в X-базисе. Получается бит $\varphi_{m-k+1}$; физический кубит остаётся в собственном состоянии.
3. Оцените фазу вентиля T на $|1\rangle$, используя три бита.
A. Постройте T_x3 для младшего бита и сохраните его в x_3.
B. Постройте T_x2 с поправкой по x_3 и сохраните средний бит в x_2.
C. Найдите старший бит и сохраните в x_1. Предусмотрена исходная проверка 0.x_1x_2x_3.
D. Объедините шаги в одну qc_T, используя reset и условные операции. Нужно три классических бита: младший результат в c[0], старший в c[2].
E. Выполните данную симуляцию и отобразите результат.

T означает $\operatorname{diag}(1,e^{i\pi/4})$. Сохранены все пункты первой части, включая обе предварительные схемы и все заготовки IPE.

Исходные определения и заготовки (код сохранён без исполнения):

from qiskit import *
import numpy as np
from qiskit.visualization import plot_histogram
import qiskit.tools.jupyter
import matplotlib.pyplot as plt

sim = Aer.get_backend('qasm_simulator')

q = QuantumRegister(1)
c = ClassicalRegister(2)

qc0 = QuantumCircuit(q, c)
qc0.h(q[0])
qc0.measure(q[0], c[0])
qc0.reset(q[0])
qc0.h(q[0])
qc0.p(np.pi/3, q[0]).c_if(c,1)
qc0.h(q[0])
qc0.measure(q[0],c[1])

qc0.draw()

count0 = execute(qc0, sim).result().get_counts()
plot_histogram(count0)

q = QuantumRegister(2)
c = ClassicalRegister(2)

qc1 = QuantumCircuit(q,c)
qc1.h(q[0])
qc1.x(q[1])
qc1.cp(np.pi/5, q[0], q[1])
qc1.measure(q[0], c[0])
qc1.reset(q[0])

###### your code goes here #####





##########################
qc1.h(q[0])
qc1.measure(q[0],c[1])

qc1.draw()

count1 = execute(qc1, sim).result().get_counts()
plot_histogram(count1)

q = QuantumRegister(2)
c = ClassicalRegister(1)

T_x3 = QuantumCircuit(q,c)

########## your code goes here #######

##1 Initialization





##2 Apply control-U operator as many times as needed to get the least significant phase bit





##3 measure the anscillar qubit in x-basis





########## Simulate the circuit and assign the output value to the variable 'x_3' 
job = execute(T_x3, sim, shots=1, memory=True)
x_3 = int(job.result().get_memory()[0])

q = QuantumRegister(2)
c = ClassicalRegister(1)

T_x2 = QuantumCircuit(q,c)

########### your code goes here ##########

##1 Initialization





##2 phase correction





##3 Apply control-U operator as many times as needed 





##4 measure the anscillar qubit in x-basis





######## Simulate the circuit and assign the output value to the variable 'x_2' 
job = execute(T_x2, sim, shots=1, memory=True)
x_2 = int(job.result().get_memory()[0])

q = QuantumRegister(2)
c = ClassicalRegister(1)

T_x1 = QuantumCircuit(q,c)

########### your code goes here #########

##1 Initialization





##2 phase correction





##3 Apply control-U operator as many times as needed to get the least significant phase bit





##4 measure the anscillar qubit in x-basis





########## Simulate the circuit and assign the output value to the variable 'x_1' 
job = execute(T_x1, sim, shots=1, memory=True)
x_1 = int(job.result().get_memory()[0])

##### your code goes here ######

















################
qc_T.draw()


count0 = execute(qc_T, sim).result().get_counts()
n=3
key_new = [str(int(key,2)/2**n) for key in list(count0.keys())]
count1 = dict(zip(key_new, count0.values()))

fig, ax = plt.subplots(1,2)
plot_histogram(count0, ax=ax[0])
plot_histogram(count1, ax=ax[1])
plt.tight_layout()

Предложить решение

Войти, чтобы отправить материал.