Заменить оракул в поиске
Замените оракул 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()