Я также работал над этой проблемой. Будучи новичком и классическим программистом (то есть я не говорю на квантовой механике), трудно получить представление о концепциях без полных примеров. Я работал с примером поиска в базе данных Microsoft Q # . Он просто ищет определенный индекс / ключ в базе данных, что не очень полезно. Я расширил этот пример, чтобы найти список значений в базе данных и вернуть соответствующий ключ.
Как и в вашем примере, есть один двухкбитовый «регистр ключей» для индексов и отдельный двухкбитовый регистр для значений. Существует также пятый «помеченный кубит», полученный из образца Microsoft, чтобы указать, когда будет найдено желаемое значение. Ключи и значения связаны через запутывание. Это лучше всего продемонстрировать на схеме. Нажмите здесь, чтобы увидеть фактическую схему Quirk .
Обратите внимание, что эта схема содержит только оракула. Он не реализует весь алгоритм Гровера.
- Два верхних кубита - это регистр ключа, следующие два - регистр значения, а нижний кубит - помеченный кубит.
- Первый раздел помещает регистр ключей в единую суперпозицию с использованием вентилей Харамара, как того требует алгоритм Гровера.
- Второй раздел, где ключи связаны со значениями через запутывание. Каждый ключ запутывается с соответствующим значением в регистре значений, применяя (Анти-) Контролируемые ворота X. Таким образом, когда регистр ключа равен 0, тогда регистр значения будет установлен на 3. Когда ключ равен 1, значение установлено на 2, и так далее.
- Третий раздел схемы - поисковый оракул. Регистр значений запутан с отмеченным кубитом. В этом примере требуемое значение равно 2. Когда регистр значений содержит 2, отмеченный кубит будет установлен в 1.
- Алгоритм Гровера смотрит на регистр ключей и помеченный кубит. Оракул поиска смотрит на регистр значений и устанавливает помеченный кубит. Это приведет к усилению клавиши 1, когда значение равно 2.
Интересно отметить, что ключи и значения хранятся не в кубитах, а в схеме / программе. Можно сказать, что на самом деле это не база данных. Это больше похоже на оператор switch / case, но может работать с суперпозицией значений.
Для получения дополнительной информации, предупреждений и кода Q # см. Мой репозиторий GitHub .
РЕДАКТИРОВАТЬ: Что-то, что я понимаю лучше с момента ответа ... вы должны повернуть / отменить схему как часть каждой итерации. В коде Q # это обрабатывает вызов Adjoint StatePreperationOracle () в операции ReflectStart (), поэтому мне не пришлось делать это явно. Я не знаю, есть ли у Qiskit похожая функция. Если я сделал перевод правильно, вот полная схема для примера выше.