Перейти до основного вмісту

Опис алгоритму Гровера

У цьому розділі ми розглянемо алгоритм Гровера. Почнемо з обговорення фазових query-гейтів і способів їх побудови, а потім перейдемо до опису самого алгоритму Гровера. Насамкінець коротко поговоримо про те, як цей алгоритм природно застосовується до задач пошуку.

Фазові query-гейти

Алгоритм Гровера використовує операції, відомі як фазові query-гейти. На відміну від звичайного query-гейта Uf,U_f, визначеного для заданої функції ff стандартним способом, фазовий query-гейт для функції ff визначається так:

Zfx=(1)f(x)xZ_f \vert x\rangle = (-1)^{f(x)} \vert x\rangle

для кожного рядка xΣn.x\in\Sigma^n.

Операцію ZfZ_f можна реалізувати за допомогою одного query-гейта UfU_f, як показано на цій схемі:

Квантова схема, що реалізує гейт Z_f за допомогою одного query-гейта та ефекту phase kickback

Ця реалізація використовує ефект phase kickback і потребує одного допоміжного кубіта, ініціалізованого в стан \vert -\rangle. Після завершення роботи цей кубіт залишається в стані \vert - \rangle і може бути повторно використаний (наприклад, для реалізації наступних гейтів ZfZ_f) або просто відкинутий.

Окрім операції Zf,Z_f, ми також використаємо фазовий query-гейт для nn-бітної функції АБО, яка визначається так для кожного рядка xΣn.x\in\Sigma^n.

OR(x)={0x=0n1x0n\mathrm{OR}(x) = \begin{cases} 0 & x = 0^n\\[0.5mm] 1 & x \neq 0^n \end{cases}

Явно фазовий query-гейт для nn-бітної функції АБО діє так:

ZORx={xx=0nxx0n.Z_{\mathrm{OR}} \vert x\rangle = \begin{cases} \vert x\rangle & x = 0^n \\[0.5mm] - \vert x\rangle & x \neq 0^n. \end{cases}

Зауважимо, що це дія ZORZ_{\mathrm{OR}} на стандартних базисних станах; її поведінка на довільних станах визначається з цього виразу за лінійністю.

Операцію ZORZ_{\mathrm{OR}} можна реалізувати у вигляді квантової схеми: спочатку будуємо булеву схему для функції АБО, потім конструюємо операцію UORU_{\mathrm{OR}} (тобто стандартний query-гейт для nn-бітної функції АБО) за процедурою, описаною в уроці Квантово-алгоритмічні основи, і, нарешті, отримуємо операцію ZORZ_{\mathrm{OR}} за допомогою ефекту phase kickback, як описано вище. Зверни увагу, що операція ZORZ_{\mathrm{OR}} не залежить від функції ff і тому може бути реалізована квантовою схемою, що не містить жодного query-гейта.

Опис алгоритму

Маючи дві операції ZfZ_f та ZOR,Z_{\mathrm{OR}}, ми можемо описати алгоритм Гровера.

Алгоритм задається числом tt — кількістю ітерацій (і, відповідно, кількістю запитів до функції ff). Це число tt не фіксується самим алгоритмом Гровера у тій формі, яку ми розглядаємо; пізніше в уроці ми обговоримо, як його вибирати.

Алгоритм Гровера
  1. Ініціалізуй регістр Q\mathsf{Q} з nn кубітів у нульовий стан 0n\vert 0^n \rangle, а потім застосуй операцію Адамара до кожного кубіта Q.\mathsf{Q}.
  2. Застосуй tt разів унітарну операцію G=HnZORHnZfG = H^{\otimes n} Z_{\mathrm{OR}} H^{\otimes n} Z_f до регістра Q\mathsf{Q}
  3. Виміряй кубіти Q\mathsf{Q} в стандартному базисі і виведи отриманий рядок.

Операцію G=HnZORHnZfG = H^{\otimes n} Z_{\mathrm{OR}} H^{\otimes n} Z_f, що ітерується на кроці 2, упродовж усього уроку ми будемо називати операцією Гровера. Нижче наведено зображення квантової схеми для операції Гровера при n=7 ⁣:n=7\!:

Квантова схема для операції Гровера

На цій діаграмі операція ZfZ_f зображена більшою за ZORZ_{\mathrm{OR}} — як неформальна візуальна підказка, що вона, ймовірно, є більш витратною. Зокрема, у рамках query-моделі ZfZ_f потребує одного запиту, тоді як ZORZ_{\mathrm{OR}} — жодного. Якщо ж ми маємо булеву схему для функції ff і перетворюємо її на квантову схему для Zf,Z_f, то можна очікувати, що отримана квантова схема буде більшою і складнішою, ніж схема для ZOR.Z_{\mathrm{OR}}.

Нижче зображено квантову схему для всього алгоритму при n=7n=7 і t=3.t=3. Для більших значень tt можна просто вставляти додаткові копії операції Гровера перед вимірюваннями.

К�вантова схема алгоритму Гровера при t=3

Алгоритм Гровера можна застосувати до задачі пошуку таким чином:

  • Вибери число tt на кроці 2. (Це обговорюється пізніше в уроці.)
  • Запусти алгоритм Гровера на функції ff з вибраним значенням t,t, щоб отримати рядок xΣn.x\in\Sigma^n.
  • Зроби запит до функції ff на рядку x,x, щоб перевірити, чи є він допустимим розв'язком:
    • Якщо f(x)=1,f(x) = 1, — ми знайшли розв'язок, можна зупинитися і вивести x.x.
    • Якщо f(x)=0,f(x) = 0, — можна або запустити процедуру знову (можливо, з іншим tt), або відмовитися і вивести «немає розв'язку».

Після аналізу роботи алгоритму Гровера ми побачимо, що, взявши t=O(N),t = O(\sqrt{N}), отримаємо розв'язок задачі пошуку (якщо він існує) з великою ймовірністю.