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

Заменить оракул в поиске

Замените оракул CZ, отмечающий 11, в приведённой схеме на каждый из трёх фазовых оракулов для 00,01,10. Получаются ли ожидаемые результаты?

Речь о трёх оракулах для 00,01,10: каждый меняет знак только выбранной строки. Исходный оракул CZ отмечает 11. Схема: подготовить равномерное состояние двух кубитов, применить оракул и данный диффузор, измерить. Диффузор задан H на обоих, X на обоих, CZ, X на обоих, H на обоих. Все определения и проверка сохранены ниже.

Исходная программа (сохранена без исполнения):

from qiskit import QuantumCircuit

oracle = QuantumCircuit(2)
oracle.cz(0,1)  # invert phase of |11>
oracle.draw()

def display_unitary(qc, prefix=""):
    """Simulates a simple circuit and display its matrix representation.
    Args:
        qc (QuantumCircuit): The circuit to compile to a unitary matrix
        prefix (str): Optional LaTeX to be displayed before the matrix
    Returns:
        None (displays matrix as side effect)
    """
    from qiskit import Aer
    from qiskit.visualization import array_to_latex
    sim = Aer.get_backend('aer_simulator')
    # Next, we'll create a copy of the circuit and work on
    # that so we don't change anything as a side effect
    qc = qc.copy()
    # Tell the simulator to save the unitary matrix of this circuit
    qc.save_unitary()
    unitary = sim.run(qc).result().get_unitary()
    display(array_to_latex(unitary, prefix=prefix))

display_unitary(oracle, "U_\\text{oracle}=")

diffuser = QuantumCircuit(2)
diffuser.h([0, 1])
diffuser.draw()

diffuser.x([0,1])
diffuser.draw()

diffuser.cz(0,1)
diffuser.x([0,1])
diffuser.h([0,1])
diffuser.draw()

grover = QuantumCircuit(2)
grover.h([0,1])  # initialise |s>
grover = grover.compose(oracle)
grover = grover.compose(diffuser)
grover.measure_all()
grover.draw()

from qiskit import Aer
sim = Aer.get_backend('aer_simulator')
sim.run(grover).result().get_counts()