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

Состояния Фурье и преобразование без рекурсии

Для трёх кубитов используется определение $\mathrm{QFT}|x\rangle=\tfrac1{\sqrt8}\sum_{k=0}^7e^{2\pi ixk/8}|k\rangle$. Исходная реализация проверяется подготовкой состояния $|\widetilde5\rangle$, для которого $\mathrm{QFT}^\dagger|\widetilde5\rangle=|101\rangle$. Её схема подготовки и полная исходная рекурсивная программа сохранены ниже.

1. Найдите состояние $|a\rangle$, для которого $\mathrm{QFT}^\dagger|a\rangle=|100\rangle$.
2. Найдите состояние $|b\rangle$, для которого $\mathrm{QFT}^\dagger|b\rangle=|011\rangle$.
3. Напишите функцию QFT без рекурсии, то есть без вызова функции из неё самой. Проверьте результат симулятором унитарных матриц Qiskit.

Original complete recursive baseline:

import numpy as np
from numpy import pi
# importing Qiskit
from qiskit import QuantumCircuit, transpile, Aer, IBMQ
from qiskit.providers.ibmq import least_busy
from qiskit.tools.monitor import job_monitor
from qiskit.visualization import plot_histogram, plot_bloch_multivector

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(pi/2**(n-qubit), qubit, n)
    # At the end of our function, we call the same function again on
    # the next qubits (we reduced n by one earlier in the function)
    qft_rotations(circuit, n)

# Let's see how it looks:
qc = QuantumCircuit(4)
qft_rotations(qc,4)
qc.draw()

def swap_registers(circuit, n):
    for qubit in range(n//2):
        circuit.swap(qubit, n-qubit-1)
    return circuit

def qft(circuit, n):
    """QFT on the first n qubits in circuit"""
    qft_rotations(circuit, n)
    swap_registers(circuit, n)
    return circuit

# Let's see how it looks:
qc = QuantumCircuit(4)
qft(qc,4)
qc.draw()

def inverse_qft(circuit, n):
    """Does the inverse QFT on the first n qubits in circuit"""
    # First we create a QFT circuit of the correct size:
    qft_circ = qft(QuantumCircuit(n), n)
    # Then we take the inverse of this circuit
    invqft_circ = qft_circ.inverse()
    # And add it to the first n qubits in our existing circuit
    circuit.append(invqft_circ, circuit.qubits[:n])
    return circuit.decompose() # .decompose() allows us to see the individual gates

nqubits = 3
number = 5
qc = QuantumCircuit(nqubits)
for qubit in range(nqubits):
    qc.h(qubit)
qc.p(number*pi/4,0)
qc.p(number*pi/2,1)
qc.p(number*pi,2)

qc.draw()

qc_init = qc.copy()
qc_init.save_statevector()
sim = Aer.get_backend("aer_simulator")
statevector = sim.run(qc_init).result().get_statevector()
plot_bloch_multivector(statevector)

qc = inverse_qft(qc, nqubits)
qc.measure_all()
qc.draw()
Рисунок к задаче 1916

Сообщить об ошибке

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