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

Расширить пространство поиска Гровера

Увеличьте пространство поиска одним кубитом и постройте дополненный оракул, когда $M\geq N/2$. В исходном поиске N=8 и используется Oracle из полной программы ниже: X(1),Z(0),Z(1),X(1).

1. Разберитесь в проблеме.
A. Проверьте, что $\theta=\arcsin(2\sqrt{M(N-M)}/N)$ уменьшается при M от N/2 до N. Постройте зависимость θ(M) для N=2¹⁰.
B. Найдите θ и число итераций R для оракула первой части; объясните результат. Дана формула $R=CI(\arccos\sqrt{M/N}/\theta)$, где CI — ближайшее целое с округлением точных половин вниз, например CI(3.5)=3.
2. Найдите решения первой части.
A. Постройте Oracle_new на 2N=16 состояниях с теми же M решениями. Он должен отмечать строку, только если она является исходным решением и дополнительный бит q равен 0. Автор разрешает одно применение исходного Oracle и элементарные квантовые вентили.
B. Найдите нужное R в новом пространстве.
C. Создайте qc_final с R итерациями Гровера. Диффузор теперь должен действовать на четырёхкубитное пространство.
D. Проверьте найденные решения с помощью исходного Oracle.

Это все подпункты второй части. В первом предложении оригинального Goal случайно написано «more than or equal to the number of total items», но там же стоит $M\geq N/2$, и далее текст прямо говорит о половине; именно эта явно заданная область сохранена.

Исходные определения и заготовки (код сохранён без исполнения):

from qiskit import *
from qiskit.tools.visualization import plot_histogram
from qiskit.quantum_info import Operator, Statevector
from qiskit.tools.monitor import job_monitor
from qiskit.ignis.mitigation.measurement import *

import numpy as np
import matplotlib.pyplot as plt

## Create an Oracle

N = 8 # the number of total items in the search space
m = int(np.log2(N)) # the number of qubits required to construct the search space with N items

myqc = QuantumCircuit(m, name='Oracle')
myqc.x(1)
myqc.z(range(2))
myqc.x(1)

Oracle = myqc.to_gate()

qc = QuantumCircuit(m)
qc.append(Oracle, range(m))

### your code goes here













####

Grover = qc.to_gate()

###### your code goes here




























###################    
circ.draw()

sim = Aer.get_backend('qasm_simulator')
shots = 20000

####### Your code goes here
















## Your code goes here

















N = 8
## Your code goes here














## your code goes here




















## Your code goes here







## Your code goes here
























##########################

qc_final.draw()

count = execute(qc_final, sim ,shots=shots).result().get_counts()
plot_histogram(count)

## your code goes here