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

Сократить схему нахождения порядка Шора

Постройте сокращённую квантовую схему нахождения порядка для 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
Рисунок к задаче 2077

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

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