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

Алгоритм Саймона

Алгоритм Саймона — це квантовий алгоритм запитів для задачі, відомої як задача Саймона. Це задача з обіцянкою, що за своїм характером схожа на задачі Дойча-Жожа та Бернштейна-Вазірані, але відрізняється деталями.

Алгоритм Саймона є значущим, оскільки він забезпечує експоненційну перевагу квантових алгоритмів над класичними (включаючи ймовірнісні), а використана в ньому техніка надихнула Пітера Шора на відкриття ефективного квантового алгоритму факторизації цілих чисел.

Задача Саймона

Функція на вхід задачі Саймона має вигляд

f:ΣnΣmf:\Sigma^n \rightarrow \Sigma^m

для натуральних чисел nn та m.m. З метою спрощення можна було б обмежитися випадком m=n,m = n, але це не дає суттєвої переваги — алгоритм Саймона та його аналіз залишаються практично однаковими в обох випадках.

Задача Саймона

Вхідні дані: функція f:ΣnΣmf:\Sigma^n \rightarrow \Sigma^m
Обіцянка: існує рядок sΣns\in\Sigma^n такий, що [f(x)=f(y)][(x=y)(xs=y)][f(x) = f(y)] \Leftrightarrow [(x = y) \vee (x \oplus s = y)] для всіх x,yΣnx,y\in\Sigma^n
Результат: рядок ss

Ми незабаром детальніше розберемо обіцянку, але вже зараз очевидно, що вона вимагає від функції ff дуже специфічної структури — більшість функцій не задовольняють цю обіцянку. Варто також зазначити, що ця задача не призначена мати практичне значення. Це штучна задача, спеціально створена, щоб бути простою для квантових комп'ютерів і складною для класичних.

Є два основні випадки: перший — коли ss є рядком із самих нулів 0n,0^n, другий — коли ss не є рядком із самих нулів.

  • Випадок 1: s=0n.s=0^n. Якщо ss — рядок із самих нулів, то обіцянка спрощується до [f(x)=f(y)][x=y].[f(x) = f(y)] \Leftrightarrow [x = y]. Це рівносильно тому, що ff є функцією «один до одного» (ін'єкцією).

  • Випадок 2: s0n.s\neq 0^n. Якщо ss не є рядком із самих нулів, то виконання обіцянки для цього рядка означає, що ff є функцією «два до одного», тобто для кожного можливого вихідного рядка ff існує рівно два вхідних рядки, що дають цей вихід. Більше того, ці два вхідних рядки мають вигляд ww та wsw \oplus s для деякого рядка w.w.

Важливо розуміти, що існує лише один рядок s,s, який задовольняє обіцянку, — тобто для функцій, що задовольняють обіцянку, завжди є єдина правильна відповідь.

Ось приклад функції вигляду f:Σ3Σ5,f:\Sigma^3 \rightarrow \Sigma^5, яка задовольняє обіцянку для рядка s=011.s = 011.

f(000)=10011f(001)=00101f(010)=00101f(011)=10011f(100)=11010f(101)=00001f(110)=00001f(111)=11010\begin{aligned} f(000) & = 10011 \\ f(001) & = 00101 \\ f(010) & = 00101 \\ f(011) & = 10011 \\ f(100) & = 11010 \\ f(101) & = 00001 \\ f(110) & = 00001 \\ f(111) & = 11010 \end{aligned}

Тут 88 різних вхідних рядків і 44 різних вихідних рядки, кожен із яких зустрічається двічі — тобто це функція «два до одного». Більше того, для будь-яких двох різних вхідних рядків, що дають однаковий вихід, порозрядне XOR цих рядків дорівнює 011,011, що рівносильно тому, що один із них дорівнює іншому, XOR-ованому з s.s.

Зауважимо, що насправді важливо лише те, чи збігаються вихідні рядки для різних вхідних, а не конкретні значення цих рядків. Наприклад, у наведеному прикладі як виходи ff зустрічаються чотири рядки: 10011,10011, 00101,00101, 00001,00001, 11010.11010. Ці чотири рядки можна замінити на будь-які чотири різних рядки, і правильна відповідь s=011s = 011 не зміниться.

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

Нижче наведено діаграму квантової схеми алгоритму Саймона.

Simon's algorithm

Уточнимо: зверху nn кубітів, на які діють вентилі Адамара, а знизу mm кубітів, що безпосередньо входять у вентиль запиту. Схема дуже схожа на алгоритми, розглянуті раніше в уроці, але цього разу немає фазового відлуння; нижні mm кубітів входять у вентиль запиту в стані 0.\vert 0\rangle.

Для розв'язання задачі Саймона за допомогою цієї схеми насправді потрібно кілька незалежних запусків із наступним класичним постобробленням, яке буде описано нижче після аналізу поведінки схеми.

Аналіз

Аналіз алгоритму Саймона починається аналогічно до алгоритму Дойча-Жожа. Після застосування першого шару вентилів Адамара до верхніх nn кубітів стан стає

12nxΣn0mx.\frac{1}{\sqrt{2^n}} \sum_{x\in\Sigma^n} \vert 0^m \rangle \vert x\rangle.

Після застосування UfU_f вихід функції ff XOR-ується до нульового стану нижніх mm кубітів, і стан стає

12nxΣnf(x)x.\frac{1}{\sqrt{2^n}} \sum_{x\in\Sigma^n} \vert f(x) \rangle \vert x\rangle.

Після застосування другого шару вентилів Адамара отримуємо такий стан, використовуючи ту саму формулу для дії шару вентилів Адамара:

12nxΣnyΣn(1)xyf(x)y\frac{1}{2^n} \sum_{x\in\Sigma^n} \sum_{y\in\Sigma^n} (-1)^{x\cdot y} \vert f(x) \rangle \vert y\rangle

На цьому місці аналіз відхиляється від попередніх алгоритмів.

Нас цікавить ймовірність того, що вимірювання дадуть кожен можливий рядок yΣn.y\in\Sigma^n. Використовуючи правила аналізу вимірювань із уроку «Множинні системи» курсу «Основи квантової інформації», отримуємо, що ймовірність p(y)p(y) отримати рядок yy дорівнює

p(y)=12nxΣn(1)xyf(x)2.p(y) = \left\|\frac{1}{2^n} \sum_{x\in\Sigma^n} (-1)^{x\cdot y} \vert f(x) \rangle \right\|^2.

Щоб краще зрозуміти ці ймовірності, введемо трохи більше позначень. По-перше, образ функції ff — це множина всіх вихідних рядків:

range(f)={f(x):xΣn}\operatorname{range}(f) = \{ f(x) : x\in \Sigma^n \}

По-друге, для кожного рядка zrange(f)z\in\operatorname{range}(f) множину всіх вхідних рядків, що відображаються у z,z, позначимо як f1({z}).f^{-1}(\{z\}).

f1({z})={xΣn:f(x)=z}f^{-1}(\{z\}) = \{ x\in\Sigma^n : f(x) = z \}

Множина f1({z})f^{-1}(\{z\}) відома як прообраз {z}\{z\} відносно f.f. Прообраз можна визначити для довільної множини замість {z}\{z\} аналогічним чином — це множина всіх елементів, що відображаються ff у цю множину. (Цю позначення не слід плутати з оберненою функцією f,f, яка може не існувати. Аргументом ліворуч є множина {z},\{z\}, а не елемент zz — це й дозволяє уникнути плутанини.)

Використовуючи ці позначення, розіб'ємо суму у виразі для ймовірностей:

p(y)=12nzrange(f)(xf1({z})(1)xy)z2.p(y) = \left\| \frac{1}{2^n} \sum_{z\in\operatorname{range}(f)} \Biggl(\sum_{x\in f^{-1}(\{z\})} (-1)^{x\cdot y}\Biggr) \vert z \rangle \right\|^2.

Кожен рядок xΣnx\in\Sigma^n зустрічається рівно один раз у двох сумах — ми, по суті, розкладаємо рядки по «кошиках» залежно від вихідного рядка z=f(x),z = f(x), а потім підсумовуємо окремо по кожному «кошику».

Обчислюємо квадрат евклідової норми:

p(y)=122nzrange(f)xf1({z})(1)xy2.p(y) = \frac{1}{2^{2n}} \sum_{z\in\operatorname{range}(f)} \left\vert \sum_{x\in f^{-1}(\{z\})} (-1)^{x\cdot y} \right\vert^2.

Щоб далі спростити ймовірності, розглянемо значення

xf1({z})(1)xy2(1)\left\vert \sum_{x\in f^{-1}(\{z\})} (-1)^{x\cdot y} \right\vert^2 \tag{1}

для довільного zrange(f).z\in\operatorname{range}(f).

Якщо s=0n,s = 0^n, то ff є функцією «один до одного» і для кожного zrange(f)z\in\operatorname{range}(f) існує рівно один елемент xf1({z}).x\in f^{-1}(\{z\}). Тоді значення виразу (1)(1) дорівнює 1.1.

Якщо ж s0n,s\neq 0^n, то в множині f1({z})f^{-1}(\{z\}) рівно два рядки. Якщо позначити будь-який із них як wf1({z}),w\in f^{-1}(\{z\}), то другий має бути wsw \oplus s за обіцянкою задачі Саймона. Використовуючи це спостереження, спростимо (1)(1):

xf1({z})(1)xy2=(1)wy+(1)(ws)y2=(1)wy(1+(1)sy)2=1+(1)ys2={4ys=00ys=1\begin{aligned} \left\vert \sum_{x\in f^{-1}(\{z\})} (-1)^{x\cdot y} \right\vert^2 & = \Bigl\vert (-1)^{w\cdot y} + (-1)^{(w\oplus s)\cdot y} \Bigr\vert^2 \\ & = \Bigl\vert (-1)^{w\cdot y} \Bigl(1 + (-1)^{s\cdot y}\Bigr) \Bigr\vert^2 \\ & = \Bigl\vert 1 + (-1)^{y\cdot s} \Bigr\vert^2 \\ & = \begin{cases} 4 & y \cdot s = 0\\[1mm] 0 & y \cdot s = 1 \end{cases} \end{aligned}

Отже, значення (1)(1) не залежить від конкретного вибору zrange(f)z\in\operatorname{range}(f) в обох випадках.

Завершимо аналіз, розглянувши ті самі два випадки окремо.

  • Випадок 1: s=0n.s = 0^n. У цьому випадку ff є функцією «один до одного», тому існує 2n2^n рядків zrange(f),z\in\operatorname{range}(f), і ми отримуємо

    p(y)=122n2n=12n.p(y) = \frac{1}{2^{2n}} \cdot 2^n = \frac{1}{2^n}.

    Тобто вимірювання дають рядок yΣn,y\in\Sigma^n, вибраний рівномірно випадково.

  • Випадок 2: s0n.s \neq 0^n. У цьому випадку ff є функцією «два до одного», тому в range(f)\operatorname{range}(f) є 2n12^{n-1} елементів. Використовуючи формулу вище, отримуємо, що ймовірність виміряти кожне yΣny\in\Sigma^n дорівнює

    p(y)=122nzrange(f)xf1({z})(1)xy2={12n1ys=00ys=1p(y) = \frac{1}{2^{2n}} \sum_{z\in\operatorname{range}(f)} \Biggl\vert \sum_{x\in f^{-1}(\{z\})} (-1)^{x\cdot y} \Biggr\vert^2 = \begin{cases} \frac{1}{2^{n-1}} & y \cdot s = 0\\[1mm] 0 & y \cdot s = 1 \end{cases}

    Тобто ми отримуємо рядок, вибраний рівномірно випадково з множини {yΣn:ys=0},\{y\in\Sigma^n : y \cdot s = 0\}, яка містить 2n12^{n-1} рядків. (Оскільки s0n,s\neq 0^n, рівно половина двійкових рядків довжини nn має двійковий скалярний добуток 11 з s,s, а інша половина — 0,0, як ми вже бачили в аналізі алгоритму Дойча-Жожа для задачі Бернштейна-Вазірані.)

Класичне постоброблення

Тепер ми знаємо ймовірності всіх можливих результатів вимірювань при запуску квантової схеми алгоритму Саймона. Чи достатньо цього для визначення ss?

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

Припустимо, що ми запускаємо схему незалежно kk разів, де k=n+10.k = n + 10. Це не унікальне значення — ми можемо взяти kk більшим (або меншим) залежно від допустимої ймовірності невдачі. Вибір k=n+10k = n + 10 гарантує успіх із ймовірністю понад 99.999.9%.

Запускаючи схему kk разів, ми отримуємо рядки y1,...,ykΣn.y^1,...,y^{k} \in \Sigma^n. Надрядкові індекси — це частини назв рядків, а не степені чи індекси бітів:

y1=yn11y01y2=yn12y02    yk=yn1ky0k\begin{aligned} y^1 & = y^1_{n-1} \cdots y^1_{0}\\[1mm] y^2 & = y^2_{n-1} \cdots y^2_{0}\\[1mm] & \;\; \vdots\\[1mm] y^{k} & = y^{k}_{n-1} \cdots y^{k}_{0} \end{aligned}

Формуємо матрицю MM з kk рядків та nn стовпців, взявши біти цих рядків як елементи:

M=(yn11y01yn12y02yn1ky0k)M = \begin{pmatrix} y^1_{n-1} & \cdots & y^1_{0}\\[1mm] y^2_{n-1} & \cdots & y^2_{0}\\[1mm] \vdots & \ddots & \vdots \\[1mm] y^{k}_{n-1} & \cdots & y^{k}_{0} \end{pmatrix}

Наразі ми не знаємо ss — наша мета якраз і полягає в тому, щоб його знайти. Але уявімо на мить, що ми знаємо s,s, і побудуємо вектор-стовпець vv з бітів рядка s=sn1s0s = s_{n-1} \cdots s_0:

v=(sn1s0)v = \begin{pmatrix} s_{n-1}\\ \vdots\\ s_0 \end{pmatrix}

Виконавши добуток матриці на вектор MvM v за модулем 22 — тобто звичайне множення, після якого від результату беруть лишок від ділення на 2,2, — отримаємо нульовий вектор:

Mv=(y1sy2syks)=(000)M v = \begin{pmatrix} y^1 \cdot s\\ y^2 \cdot s\\ \vdots\\[1mm] y^{k} \cdot s \end{pmatrix} = \begin{pmatrix} 0\\ 0\\ \vdots\\[1mm] 0 \end{pmatrix}

Тобто рядок s,s, записаний як вектор-стовпець v,v, завжди належить до нуль-простору матриці MM за модулем 2.2. Це вірно як у випадку s=0n,s = 0^n, так і в разі s0n.s\neq 0^n. Точніше, нульовий вектор завжди належить нуль-простору M,M, а у випадку s0ns\neq 0^n до нього також належить вектор з бітів s.s.

Питання лишається: чи можуть у нуль-просторі MM бути інші вектори, крім тих, що відповідають 0n0^n та ss? Відповідь: це стає дедалі менш імовірним зі зростанням kk — при k=n+10k = n + 10 нуль-простір MM не міститиме інших векторів із ймовірністю понад 99.999.9%. Загалом, замінивши k=n+10k = n + 10 на k=n+rk = n + r для довільного натурального r,r, ймовірність того, що нуль-простір MM містить лише вектори, що відповідають 0n0^n та s,s, становить щонайменше 12r.1 - 2^{-r}.

За допомогою лінійної алгебри можна ефективно обчислити нуль-простір матриці MM за модулем 2.2. Зокрема, це можна зробити методом Гаусового виключення, який при арифметиці за модулем 22 працює так само, як із дійсними або комплексними числами. Якщо вектори, що відповідають 0n0^n та s,s, є єдиними в нуль-просторі MM — а це відбувається з великою ймовірністю — ми можемо визначити ss за результатами цього обчислення.

Класична складність

Скільки запитів потребує класичний алгоритм запитів для розв'язання задачі Саймона? Відповідь: дуже багато в загальному випадку.

Можна зробити різні точні твердження про класичну складність цієї задачі, і ось одне з них. Якщо будь-який імовірнісний алгоритм запитів робить менше ніж 2n/2112^{n/2 - 1} - 1 запитів — а це експоненційна кількість відносно nn — то з ймовірністю щонайменше 1/21/2 він не зможе розв'язати задачу Саймона.

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

Ми намагаємося знайти прихований рядок s,s, але поки ми не запитуємо функцію на двох рядках із однаковим вихідним значенням, ми отримуємо дуже мало інформації про s.s. Інтуїтивно, ми дізнаємося лише те, що прихований рядок ss не є XOR жодних двох різних запитаних рядків. І якщо запитати менше ніж 2n/2112^{n/2 - 1} - 1 рядків, залишається ще безліч варіантів s,s, які ми не виключили, оскільки пар рядків недостатньо. Це не формальний доказ, а лише основна ідея.

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