Неструктурований пошук
Зміст
Розпочнемо з опису задачі, яку розв'язує алгоритм Ґровера. Як завжди, позначимо двійковий алфавіт протягом усього обговорення.
Нехай
— функція з двійкових рядків довжини до бітів. Припустимо, що ми можемо ефективно обчислити цю функцію, але в іншому вона довільна і ми не можемо розраховувати на те, що вона має особливу структуру або конкретну реалізацію, яка нам підходить.
Алгоритм Ґровера виконує пошук рядка , для якого . Такі рядки ми називатимемо розв'язками задачі пошуку. Якщо розв'язків кілька, будь-який із них вважається правильною відповіддю; якщо розв'язків немає, правильна відповідь — повідомити про їхню відсутність.
Ця задача називається неструктурованим пошуком, оскільки ми не можемо покладатися на те, що має будь-яку конкретну структуру, яка спрощує пошук. Ми шукаємо не в упорядкованому списку й не в якійсь структурі даних, спеціально призначеній для пошуку, — ми буквально шукаємо голку в копиці сіна.
Інтуїтивно можна уявити собі надзвичайно складну булеву схему, яка обчислює , і ми можемо легко запустити цю схему на вибраному вхідному рядку. Але оскільки схема настільки складна, нам не вдасться розібратися в ній простим розглядом (окрім здатності обчислювати її значення на вибраних вхідних рядках).
Один класичний спосіб виконати це завдання пошуку — просто перебрати всі рядки , обчислюючи для кожного, щоб перевірити, чи є він розв'язком. Позначимо далі
для зручності. У є рядків, тому їх перебір вимагає обчислень . Якщо ми обмежені обчисленням на обраних вхідних даних і хочемо гарантовано знайти відповідь, це найкраще, що можна зробити детермінованим алгоритмом. При ймовірнісному підході можна спробувати заощадити час, випадково обираючи вхідні рядки для , але все одно знадобиться обчислень для високої ймовірності успіху.
Алгоритм Ґровера розв'язує цю задачу пошуку з високою ймовірністю, виконуючи лише обчислень . Уточнимо: ці обчислення функції відбуваються у суперпозиції, аналогічно до алгоритмів із запитами з уроку «Квантові алгоритми з запитами», включаючи алгоритм Дойча, алгоритм Дойча–Йожі та алгоритм Саймона. На відміну від них, алгоритм Ґровера є ітеративним: він обчислює на суперпозиціях вхідних рядків і чергує ці обчислення з іншими операціями, що створюють інтерференційні картини, приводячи до розв'язку з високою ймовірністю (якщо він існує) після ітерацій.
Формальна постановка задачі
Формалізуємо задачу, яку розв'язує алгоритм Ґровера, у моделі обчислень із запитами. Тобто припустимо, що ми маємо доступ до функції через гейт запиту, визначений звичайним чином:
для кожного та . Це дія на базисних станах, а її дія в загальному випадку визначається лінійністю.
Як обговорювалося в уроці «Основи квантових алгоритмів», маючи булеву схему для обчислення , її можна перетворити на квантову схему, що реалізує (використовуючи певну кількість додаткових кубітів, що починають і закінчують обчислення у стані ). Таким чином, хоча ми використовуємо модель запитів для формалізації задачі, яку розв'язує алгоритм Ґровера, він не обмежений цією моделлю: алгоритм Ґровера можна запускати для будь-якої функції , для якої є булева схема.
Ось точне формулювання задачі, яка називається Пошук, оскільки ми шукаємо розв'язок — рядок , для якого набуває значення .
Зауважимо, що це не задача з обіцянкою — функція є довільною. Проте корисно розглянути таку варіацію з обіцянкою, де гарантовано існує рівно один розв'язок. Ця задача наводилася як приклад задачі з обіцянкою в уроці «Квантові алгоритми з запитами».
Також зауважимо, що задача Або, згадана в тому ж уроці, тісно пов'язана із задачею Пошук. У тій задачі мета — лише визначити, чи існує розв'язок, а не знайти його.