Як застосований алгоритм Гровера до бази даних?


12

Питання

Я хочу використовувати алгоритм Grover для пошуку несортованої бази даних для елемента х . Тепер виникає питання, як я ініціалізую індекс і значення бази даних з кубітами?

Приклад

  • Скажімо, у мене є 4 кубіти. Таким чином, можна відобразити 24=16 класичних значень.
  • Моя несортована база даних г має такі елементи: г[Значення]=[3,2,0,1] .
  • Я хочу шукати х=2г=10б=|10 .
  • Мій підхід: індексувати базу даних г з г[(Індекс, значення)]=[(0,3),(1,2),(2,0),(3,1)] . Регістри 0 і 1 для індексу та регістри 2 і 3 для значення. Потім застосуйте алгоритм Гровера лише до регістрів 2 і 3(Значення) . Чи можна це реалізувати? Чи є інший підхід?

Що я вже реалізував ( на GitHub )

"Алгоритм Гроувера з 2-, 3-, 4-кубітами", але це робиться просто: біти ініціалізуються з |0 , оракул відзначатиме моє рішення х (яке просто число , як 2г=10б ), то Гровер частина буде збільшувати ймовірність обраного елемента х і зменшити всі інші ймовірності , а потім кубіти зчитуються по суті нанесено на класичні біти. Ми дозволяємо цьому процесу виконуватись кілька разів поспіль і, таким чином, отримуємо розподіл ймовірностей, де найбільшу ймовірність має наш шуканий елемент х .

Вихід завжди такий, як той, який позначений в оракулі. Як я можу генерувати більше інформації з результатів, про які я не знаю в той час, коли будував оракул?

Відповіді:


9

Я також працював над цією проблемою. Як початківцю, так і класичному програмісту (тобто я не кажу про квантову механіку) важко зрозуміти поняття без повних прикладів. Я працював із зразком пошуку бази даних Microsoft Q # . Він просто шукає певний індекс / ключ у базі даних, що не дуже корисно. Я розширив цей зразок для пошуку списку значень у базі даних та повернення відповідного ключа.

Як і у вашому прикладі, для індексів існує один двокібітний «реєстр ключів» та окремий двохубітний регістр для значень. Існує також п'ятий "позначений кубіт", що надходить із зразка Microsoft, щоб вказати, коли знайдено потрібне значення. Ключі та значення пов'язані через заплутування. Це найкраще демонструється схемою. Клацніть тут, щоб побачити фактичну схему Quirk .

Ключ / значення Oracle Circuit

Зауважте, що ця схема містить лише оракул. Він не реалізує весь алгоритм Гровера.

  • Два верхніх кубіта - це регістр ключів, наступні два - регістр значень, а нижній кубіт - позначений кубіт.
  • У першому розділі реєстр ключів ставить у єдиний суперпозицію за допомогою воріт Харамарда, як того вимагає алгоритм Гровера.
  • Другий розділ - це те, де ключі пов'язані зі значеннями за допомогою заплутування. Кожен ключ заплутується відповідним значенням у регістрі значень, застосовуючи (Анти-) керовані ворота X. Отже, коли реєстр ключів дорівнює 0, тоді регістр значень буде встановлений на 3. Коли ключ дорівнює 1, значення встановлюється на 2 тощо.
  • Третій розділ схеми - це пошуковий оракул. Реєстр значень переплутаний позначеним кубітом. У цьому прикладі бажане значення дорівнює 2. Коли регістр значень містить 2, позначений кубіт буде встановлений у 1.
  • Алгоритм Гровера переглядає реєстр ключів і позначений кубіт. Оракул пошуку розглядає регістр значень і встановлює позначений кубіт. Це призведе до посилення ключа 1, коли значення дорівнює 2.

Цікаво зазначити, що ключі та значення зберігаються не в кубітах, а в ланцюзі / програмі. Можна сказати, що це насправді не база даних. Це більше схоже на оператор switch / case, але такий, який може працювати на суперпозиції значень.

Детальніше, застереження та код Q # див. У моєму сховищі GitHub .

EDIT: Щось я краще розумію після відповіді ... ви повинні повернути / скасувати ланцюг як частину кожної ітерації. У коді Q # виклик суміжного стануPreparationOracle () в рамках операції ReflectStart () обробляє це, тому мені не довелося це робити явно. Я не знаю, чи має Qiskit подібну особливість. Якщо я зробив переклад належним чином, ось цілий контур для прикладу вище.


Дякую! Саме це я і шукав.
alex

Отже, для Гровер-Частини: мені потрібно робити лише посилення за допомогою ключових регістрів (2 кубіти в цьому прикладі)? Як вони пов'язані з позначеним кубітом?
alex

Відповідно до зразка Q # "алгоритм Гровера вимагає роздумів про позначений стан та стан запуску", тому вам потрібно працювати як з позначеним кубітом, так і з реєстром ключів. Якщо ви будете слідувати коду в операції QuantumSearch (), ви побачите, що ReflectMarked () викликається лише позначеним кубітом. ReflectZero () також пізніше викликається комбінацією позначеного кубіта та реєстру ключів. Також див. Редагування вище.
Джоел Ліч

3

н=4

i|i|г(i)
f(i)=2

Я думаю, що краще розглядати алгоритм квантового пошуку як оптимізацію функції, а не пошук у списку / базі даних. Ось стаття, над якою я працював, де квантовий пошук використовується для вирішення комбінаторної задачі максимізації, якщо ви хочете продовжити своє розуміння алгоритму.


Дякую за вашу відповідь! Отже, алгоритм Гровера менш підходить для пошуку в базі даних. Я знайшов відповідне питання тут .
alex

Чи є псевдокод (або код Qiskit) для вирішення цієї проблеми пошуку в БД?
alex

Вам доведеться подивитися, але це має бути легко знайти серед рамок.
Канада

3

Вам потрібно перетворити оракул, щоб утримувати базу даних, як результат, загальний Oracle (Phase Inversion) матиме два суб-оракули. Схема алгоритму генерала Гровера для пошуку в базі даних

Перший суб-оракул, який треба підготувати, - це схема пам'яті, на відміну від QRAM, яка зберігає в своєму тілі квантові дані (стан), ця схема пам'яті (масиву) готова зберігати у своїй рамці лише класичну інформацію. Приклад такого типу схеми, що зберігає масив бінарних файлів [010, 110, 100, 011], наведено нижче: приклад схеми пам'яті Для більш детального ознайомлення з цим документом .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.