Сократить схему нахождения порядка Шора
Постройте сокращённую квантовую схему нахождения порядка для a=7,N=15, затем её итеративную версию. U задаётся как $U|x\rangle=|7x\bmod15\rangle$ на допустимых входах; его конкретная схема X и SWAP полностью дана ниже.
1. Удалите избыточные операции.
A. Создайте данный U. Подготовьте четырёхкубитные входы, представляющие несколько целых строго между 0 и 15, например 1=0001,5=0101,13=1101, примените U и проверьте выходы. Для 1 должен получиться 7=0111, для 13 — 1.
B. Создайте схему с четырьмя последовательными U, выполните unitary_simulator и проверьте $U^{2^2}=I$ по матрице.
C. Выполните предоставленную сокращённую shor_QPE на qasm_simulator и проверьте воспроизведение фаз главы Шора. Исходная общая схема имеет m=4 физических и t=8 счётных кубитов; после удаления степеней U, равных I, данная схема использует t=3 и только controlled-U и controlled-U².
2. Дополнительно примените IPE: создайте shor_IPE с одним счётным кубитом, сбросом и классической обратной связью; проверьте результат на qasm_simulator.
Сохранены исходная общая схема, определение U, управляемые степени, QFT и все заготовки. По умолчанию shots=20000.
Исходные определения и заготовки (код сохранён без исполнения):
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')
shots = 20000
## Create 7mod15 gate
N = 15
m = int(np.ceil(np.log2(N)))
U_qc = QuantumCircuit(m)
U_qc.x(range(m))
U_qc.swap(1, 2)
U_qc.swap(2, 3)
U_qc.swap(0, 3)
U = U_qc.to_gate()
U.name ='{}Mod{}'.format(7, N)
### your code goes here
### your code goes here
def cU_multi(k):
circ = QuantumCircuit(m)
for _ in range(2**k):
circ.append(U, range(m))
U_multi = circ.to_gate()
U_multi.name = '7Mod15_[2^{}]'.format(k)
cU_multi = U_multi.control()
return cU_multi
def qft(n):
"""Creates an n-qubit QFT circuit"""
circuit = QuantumCircuit(n)
def swap_registers(circuit, n):
for qubit in range(n//2):
circuit.swap(qubit, n-qubit-1)
return circuit
def qft_rotations(circuit, n):
"""Performs qft on the first n qubits in circuit (without swaps)"""
if n == 0:
return circuit
n -= 1
circuit.h(n)
for qubit in range(n):
circuit.cp(np.pi/2**(n-qubit), qubit, n)
qft_rotations(circuit, n)
qft_rotations(circuit, n)
swap_registers(circuit, n)
return circuit
# QPE circuit for Shor
t = 3
shor_QPE = QuantumCircuit(t+m, t)
shor_QPE.h(range(t))
shor_QPE.x(t)
for idx in range(t-1):
shor_QPE.append(cU_multi(idx), [idx]+ list(range(t,t+m)))
qft_dag = qft(t).inverse()
qft_dag.name = 'QFT+'
shor_QPE.append(qft_dag, range(t))
shor_QPE.measure(range(t), range(t))
shor_QPE.draw()
count_QPE = execute(shor_QPE, sim, shots=shots).result().get_counts()
key_new = [str(int(key,2)/2**3) for key in count_QPE.keys()]
count_new_QPE = dict(zip(key_new, count_QPE.values()))
plot_histogram(count_new_QPE)
### your code goes here
Сообщить об ошибке
Войти, чтобы отправить материал.