СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

H Квантовый алгоритм Гровера в черновиках Из песочницы

Добрый вечер, хабросообщество!
Цель данной статьи рассказать об одном из чудес квантовой информатики, а именно — алгоритм Гровера, который позволяет достичь квадратичное ускорение в сравнении с классическими алгоритмами перебора.
Небольшое знание линейной алгебры желательно.
image


Классический алгоритм перебора



Пусть дана функция — булева функция. Цель: найти хотя бы один корень уравнения f(x) = 1. На классическом компьютере, если f — произвольна(например, некоторый черный ящик, оракул), нам понадобиться O(N) операций, где , то есть, полный перебор. Если f в конъюнктивой нормальной форме — то данная задача является NP-полной. Проблема о равенстве/неравенстве P и NP является открытой и по сей день.

Квантовый алгоритм



К сожалению, или к счастью, не известен квантовый(а классический тем более) для решения данной задачи за полиномиальное время. Но алгоритм Гровера позволяет получить квадратичное ускорение для полного перебора — за .

Краткое описание алгоритма



Используя n+1 кубит, мы приготавливаем первые n кубитов в суперпозицию всех возможных состояний, а последний в суперпозицию «нуля» и «единицы», но со «знаком минус» у «единицы». Тогда действуя раз оператором поворота, мы получаем состояние, при измерении которого с очень высокой вероятностью получаем решение уравнения.

Небольшой экскурс в терминологию.



Дираковские обозначения — |x> — обозначает вектор(столбец), а будет скалярным произведением. А |x> — обозначает тензорное произведение векторов, чаще записывают кратко: |x,y>.

Пример: |0> и |1> — в двумерном случае обозначают вектора (1,0) и (0,1) соответственно.
|0> В двумерном случае: |0>

Суперпозиция — линейная комбинация базисных состояний.

Кубит — наименьший элемент для хранения информации на квантовом компьютере. В отличие от классического бита, который может принимать только 1 и 0, квантовый бит может находится в суперпозиции двух состояний: |0> и |1>, которые «отвечают» за 0 и 1 соответственно.
image
Элемент Адамара(обозначаемый как H) — действует следующим образом:
H =
— матричное представление

Элемент Уолша-Адамара(обозначаемый как WH,W) — Тензорная степень H.


Квантовое состояние системы из n кубитов:
image, где — некоторый коэффициент(амплитуда), комплексное число, а — вектор, с единицей на i позиции.
Классическое состоянии системы из n битов будет одним из N вариантов(например, числом от 0 до N-1), то квантовое будет линейной комбинацией всех этих состояний с некоторым комплексным коэффициентом.
А получить какое-то состояние можно измерением. Тогда мы получим результат с вероятностью .

Ancilla — вспомогательные кубиты, которые нужны при вычислении.

Так как вычисления на квантовом компьютере обратимы, то оператор, соответствующий булевой функции f будет действовать следующим образом:
. Очевидно, что обратный к этому оператору — он же сам.

Зеркальное отражение относительно гиперплоскости — оператор, действующий следующим образом:

На произвольный вектор распространяется по линейности.

Алгоритм


image
Пусть нам известно, что у f(x) = 1 есть L решений( L Тогда пусть искомый вектор имеет вид:
, где — некоторое решение. При измерении такого состояния мы получим одно из решений.
Пусть начальное состояние — суперпозиция всех возможных состояний(базисных векторов), полученная действием элемента Уолша-Адамара на |0>.
Тогда для решения потребуется n+1 кубит, где первые n займет |X>, а последний — ancilla.
Установим анциллу в состояние , что получается действием элемента Адамара на |1>.
Тогдa, очевидно, что , где |X> некоторый вектор состояния для n кубитов. (Что следует из тензорного произведения векторов и того, что ).
То есть, Quf — задало зеркальное отражение относительно гиперплоскости, перпендикулярной вектору решений!

Зададим еще один оператор, который производит зеркальное отражение относительно вектора :
, где I — единичная матрица. Не сложно проверить, что это верно определенный оператор.

Тогда пусть — произведение(композиция) двух операторов. Тогда G задает поворот на некоторый угол .
Не сложно проверить, что этот угол равен = .
Что следует из разложения арксинуса в ряд Тейлора при условии, что L Тогда G, действуя на |X>, поворачивает его на угол в сторону !

А так как угол, то повторив операцию раз, мы получим почти вектор !
Вероятность ошибки составит Perr = L/N, что при L

Заключение



Несмотря на то, что данный алгоритм имеет экспоненциальную сложность, он все-таки является примером, когда квантовый компьютер превосходит классический, ибо дает квадратичное ускорение в сравнении с классическими алгоритмами. Такую возможность нам дает тот факт, что мы можем делать поворот в сторону вектора решения, не зная сами решения.

Заранее приношу свои извинения за возможные ошибки/неточности в терминологии и описании алгоритма.
О всех подобных и орфографических ошибках прошу уведомлять в личку, чему буду рад, если оные найдутся!
Замечания приветствуются!

комментарии (31)

+10
AdaStreamer ,  

Похоже мне сейчас плохо станет от прочитанного. Надо еще раз почитать — с первого раза вот так вот и не врубишься.

+10
TakeOver ,  

Ну материал сам по себе сложный и достаточно абстрактный. В общем алгоритм можно представить как:
— мы определяем оператор, который поворачивает вектор состояния в сторону вектора решений.
— мы повторяем эту операцию O(sqrt(N)) раз и получает почти искомый вектор
— тогда измерение дает верный ответ с очень большой вероятностью.
Фишка состоит в том, что мы может делать отражение относительно гиперплоскости, перпендикулярной вектору решения, не зная сам вектор.

Тому, кто поставил минус в карму: если у вас есть замечания по статье, я буду рад их выслушать!

+7
+8 –1
EvgeshaS ,  

Я не ставил минусов, но небольшое пожелание выскажу.

Есть такой мем, что каждая формула уменьшает количество (понимающих) читателей вдвое, а каждая картинка — увеличивает. Напрашиваются картинки, из которых было бы понятно, что вообще происходит. Формальные упражнения с операторами и векторами для неспециалистов ничего не разъясняют.

И раз статья вводная, неплохо хотя бы в виде результатов рассказать о модифицированных вариантах алгоритма (например, если в базе есть N искомых значений), а также о важной связи алгоритма Гровера с другими квантовыми алгоритмами (кое-что можно найти тут), которые, скорее всего, местной публике были бы куда интереснее, нежели абстрактный поиск в абстрактной базе.

Экспериментальные реализации также заслуживают внимания. Они хоть пока и довольно тривиальные по сути, но все равно представляют большой интерес.

+2
TakeOver ,  

Спасибо за пожелание!
В следующей статье я постараюсь уменьшить «нагрузку» материала и рассказать более подробно и понятно и разъяснить некоторые сложные моменты алгоритма Гровера. Все таки написание статей — для меня нечто новое, и умение писать понятно — надо развивать.

0
Bagow ,   * (был изменён)

Я по ходу статьи два раза потерял суть. Вы возможно видели на Д3.ру, есть такой автор который ведет рубрику «Объяснение на пальцах», для хабра я думаю можно посложнее, но все же в этом стиле :).

И еще очень важно, что бы вы описали зачем все это… Понятно что можно прочитать про алгоритм Гровера, но легенда я думаю не помешает, я например с легендой воспринимаю лучше. Вот пример хорошей легенды cosmos.d3.ru/comments/479037/

А в общем спасибо зато что дали почувствовать себя глупым школьником :)

+2
NeoNN ,  

Теория простоты Эйнштейна: Если вы не можете объяснить это просто — значит, вы сами не понимаете этого до конца.

0
AdaStreamer ,  

На вики есть ссылка на книгу Федотова И.Е. — «Модели параллельного программирования». Думаю, с нее можно начать что-то пробовать.

+4
TakeOver ,  

я бы посоветовал книжку Нильсен и Чанг «Квантовые вычисления», в ней изложен и весь мат.апарат, что используется на протяжении книги, да и само изложение очень хорошее.

0
AdaStreamer ,  

Спасибо, посмотрю обязательно!

+3
+4 –1
Turbo ,  

Так и не прочитал ни одной статьи про квантовые алгоритмы, где на пальцах бы объяснялось, как именно находится решение. Куча формул и как правило ни одного численного примера или наглядных иллюстраций. Или же численный пример принципиально невозможен?

–2
leanid ,  

Согласен. Думаю это вообще бред, но я плохо знаю математику, поэтому могу ошибаться. Предлагаю проверить на практике, возьмем простую задачу: дано слово из восьми букв (const pass[8] = {...}) и мы должны его «отгадать» когда имеем возможность вызывать функцию IsPassCorrect(const char (&pass_to_test)[8])->bool. Уверен, что решение с банальным перебором порвет в клочья «квантовые алгоритмы» по скорости, простоте, памяти…

+3
TakeOver ,  

Ну, вы решили сравнивать квантовые алгоритмы с классическими на чем? Банальный перебор как-раз и будет за O(2^n), в то время как на квантовом компьютере алгоритм Гровера будет работать за O(2^(n/2)). По простоте оно, возможно и порвет, но не по скорости)

+2
DankoUA ,  

Многие квантовые явления выглядят бредом для неспециалистов. Если сейчас писать обычные программы можно и не зная устройство компьютера, то придумать квантовый алгоритм не понимая квантовую механику невозможно. Хотя может через столетия это будет также просто.

+1
TakeOver ,   * (был изменён)

Численный пример:
Буду рассматривать только вещественные коэффициенты.Пусть число кубитов n = 3, тогда число вариантов — 8. Нижеприведенные вектора содержат коэф. при i варианте. (То есть размер вектора 8). Тогда число итераций будет 2. Пусть решением будет x = 001.
Начальное состояние:
[0.3535533905932737,0.3535533905932737,0.3535533905932737,0.3535533905932737,0.3535533905932737,0.3535533905932737,0.3535533905932737,0.3535533905932737]

После 1ой итерации:
[0.1767766952966368,0.8838834764831838,0.1767766952966368,0.1767766952966368,0.1767766952966368,0.17677669529663675,0.1767766952966368,0.1767766952966368]

Видно, что модуль коэф. при всех вариантах, кроме 001 уменьшились, а при 001 наоборот увеличился.
И вторая итерация:
[-8.838834764831832e-2,0.9722718241315017,-8.838834764831832e-2,-8.838834764831832e-2,-8.838834764831832e-2,-8.838834764831832e-2,-8.838834764831832e-2,-8.838834764831832e-2]

Коэф. при 001 стал равен 0.97.., то есть при измерении мы получим 001 с вероятностью примерно 0.95.

Тут видно, что коэф. у решения увеличивается с каждой итерацией, а у остальных уменьшается.
Реализовал это численно, " в лоб", умножая матрицы размера 8x8.

0
Turbo ,  

А если n будет равно 100, то количество элементов вектора куда-нить поместится? )

+2
TakeOver ,  

Это на классическом оно не поместиться, а на квантовом для этого хватит 100 кубитов)

0
Turbo ,  

Ну вот тут как раз и не понятно, если известны только векторы в количестве 2^n, то пока мы посмотрим вероятность каждого из них, то получится полный перебор. Разве нет? Или же мы все таки смотрим состояние кубитов и по ним делаем вывод?

0
TakeOver ,  

мы можем измерить состояние системы и с некоторой вероятностью получить ответ. А получив ответ, мы сможем его проверить — если он, вдруг, не подошел — можно повторить вычисление.

+1
torbasow ,  

Измерить состояние системы — это означает, что если оно физически определяется восемью векторами, то мы не обязаны получать все эти векторы, а можем получить его в виде трёхзначного двоичного числа за один шаг?

0
Turbo ,  

Плюсую вопрос, так как на трех кубитах это не принципиально, а вот на сотне уже становится очень критичным. Результат измерения может не поместиться в традиционную память.

0
TakeOver ,  

Результат вполне себе поместится, он займет всего лишь 100 классических бит.

0
Turbo ,  

Тогда не понятно как ваш численный пример выше соотносится с реальностью ) Там тогда должны быть циферки в количеств 3 штук на основании которых мы делаем заключение. Разве нет?

0
TakeOver ,  

Те циферки показывают как примерно изменяются вероятности получить тот или иной результат(как раз число возможных результатов 8). Можно (но не всегда) рассматривать кубиты по отдельности и рассматривать на каждом вероятность получить 0 или 1, то есть, если рассматривать кубиты «вместе», то будет как раз 2^3 вариантов.
Например, если у нас есть 1 кубит и он находится в состоянии: 1/2*|0> + sqrt(3)/2*|1>, то мы получим 0 с вероятностью 0.25 и получим 1 с вероятностью 0.75.

0
TakeOver ,  

Ну, при измерении мы получим некоторое значение с некоторой вероятностью, которая нам точно не известна. После измерения происходит коллапс волновой функции. То есть, как бы сказать, система окажется в том состоянии, которое дало измерение. В этом и заключается вероятностный характер квантовых вычислений. Но это уже больше физический вопрос.

0
torbasow ,  

Вопрос был в том, какое значение мы получим при измерении. Состояние в виде трёх бит при трёхкубитной системе?

0
TakeOver ,  

Да. Получим 3ех битный результат.

+1
p53 ,  

Не совсем в тему статьи, с другой стороны, это может оказаться полезно не только автору. Дираковские бракеты лучше с точки зрения типографики и правильнее с точки зрения семантики набирать в латехе как \left| x,y \right\rangle.

Сравните сами

image

\left\langle x\right|\ \left|y\right\rangle \qquad <x|\ |y>

Если в латех-документе вы используете их часто, можно подключить пакет braket.

0
TakeOver ,  

Спасибо!

+1
pavelk2 ,  

Передаю здесь комментарий моего друга Марата Мусакаева, который к сожалению не зарегистрирован на Хабрахабр.

Неплохо, но математически несколько неграмотно написано да и просто непонятно. Так, операция Адамара (Hadamard gate) непонятно записана. Должно быть H |0>=(|0> + |1>)/sqrt 2 и H |1>=(|0> — |1>)/sqrt 2.​
Далее операция Адамара и операция Уолша-Адамара (Walsh-Hadamard) не отличаются друг от друга в смысле собственно преобразования величины, к которой они применяются. Вторая — это просто многоразовое применение первой. Вы можете найти и другие названия, связанные с именами Радемахера и Фурье.
Далее если применять эту операцию в том виде, какой записан там, то все эти «легко проверить» проверить не удастся.
0
TakeOver ,  

Спасибо за замечания! Но оператор Адамара записан таки верно, что у вас, что у меня) операция Уолша-Адамара происходит сразу над несколькими кубитами и действие элемента Адамара на каждый кубит по отдельности даст тот же результат, с этим я согласен. А проверить эти операции можно геометрически, там важно только, что они задают зеркальное отображение (если вы об этом). Но спасибо за замечания!

+1
cheremin ,  

Идея простая: пусть у нас есть система из N квантовых объектов. Мы действуем на эту систему каким-то внешним воздействием (например, ЭМ-полем) — система эволюционирует. Согласно квантовой теории (которая обильно подтверждается экспериментами) система будет эволюционировать как единое целое, а не каждый объект отдельно.

Что значит «как единое целое»? — это значит, что если мы, после внешнего воздействия, возьмемся измерять состояние какого-то конкретного объекта, то в классическом случае на результат измерения будет влиять только его собственное начальное состояние, и ЭМ-воздействие. В квантовом же случае на результат измерения будет влиять еще и состояние всех остальных объектов в системе. То есть в состоянии одного конкретного объекта будет неким образом закодирована какая-то информация об состоянии всех остальных объектов системы. Чем-то напоминает голограмму — в каждом кусочке информация о целом, пусть и неполная.

И вот когда мы смотрим на это непотребство, мы задумываемся — нельзя ли как-то такую «голографичность» квантовых систем использовать в народном хозяйстве? Можем ли мы так подобрать внешнее воздействие, чтобы в каком-то конкретном, заранее выбранном объекте оказался не какой-то произвольный кусочек информации о целой системе, а конкретный кусочек, именно тот, который мы хотим узнать? Например такой — в каком именно элементе системы изначально (до воздействия) было нужное нам состояние?

Вот суть квантовых алгоритмов как раз в том, чтобы подобрать нужное воздействие, и указать, каким образом потом из результата измерения вытащить нужную нам информацию. Поскольку работа идет на абстрактном уровне, то воздействие находится в виде некоторого оператора над вектором состояния. Точно так же обычные алгоритмы пишутся для абстрактной машины Тьюринга, а не в виде «в этот транзистор такой-то потенциал». В реальности этот оператор будет соответствовать какому-то определенному физическому воздействию, которое нужно будет применить к системе.