Алгоритм Дойча
Contents
Алгоритм Дойча#
Автор(ы):
Алгоритм Дойча (в английском варианте – Deutsch’s algorithm) – это один из первых алгоритмов, показавших, что квантовый компьютер может решать задачи особым способом, отличающимся как от алгоритмов классического компьютера, так и от интуиции и здравого смысла человека. При этом такое решение может занимать меньшее количество шагов.
Нужно прежде всего сказать, что алгоритм Дойча не имеет практического применения в силу своей предельной простоты, зато является простейшим примером, с помощью которого можно понять, в чем состоит отличие квантовых алгоритмов от классических. Данный алгоритм был предложен в 1985 году, когда квантовых компьютеров еще не было, а практически он был реализован в 1998 году на 2-кубитном квантовом компьютере, работавшем на принципах ядерно-магнитного резонанса.
Дэвид Дойч
Помимо занятий теоретической физикой в Оксфордском университете, Дэвид Дойч – автор книг “Структура реальности” и “Начало бесконечности”, в которых он популярно излагает идеи квантовых вычислений с точки зрения многомировой интерпретеции (сторонником которой является) и философствует о будущем науки и человечества. Так что можно сказать, что работа алгоритма, согласно замыслу создателя, производится в параллельных вселенных. Так это или нет, пока проверить невозможно, но вычисления работают, и это главное.
Итак, в чем состоит задача, которую решает алгоритм? Представьте, что у вас есть функция, которая представляет собой “черный ящик”, принимающий на вход число из множества
Рассмотрим все варианты этих двух классов. Всего их четыре, то есть по две функции в каждом классе. Начнем с несбалансированных:
Это функция, всегда возвращающая
Такая функция всегда возвращает
Ну а теперь посмотрим на сбалансированные функции. Для них характерно то, что они могут возвращать как
Это тождественная функция, которая ничего не делает с входным значением. Для нее справедливо следующее:
А вот эта функция инвертирует входное значение, то есть возвращает не то число, которое было подано на вход, а другое:
Классический компьютер справляется с задачей за два шага. Например, нам дана некоторая функция-“черный ящик”, и мы должны установить, сбалансирована ли она. На первом шаге мы отправляем в функцию входное значение
Способа, с помощью которого на классическом компьютере можно за одно действие установить, сбалансирована функция или нет, не существует. И здесь свое преимущество показывает квантовый компьютер: он может установить класс функции за одно действие.
Для начала рассмотрим простейшую схему, с помощью которой можно отправлять число на вход и получать ответ от черного ящика:

Fig. 29 Схема 1#
Но нам важно будет не только сохранить значение
Операции
a |
b |
a XOR b |
---|---|---|
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
Операция
Схема 1 пока что не дает преимущества по сравнению с классическим компьютером, но мы можем ее немного усовершенствовать:

Fig. 30 Схема 2#
В новой схеме оба кубита вначале будут находиться в состоянии
а нижний - в такой:
Если рассмотреть это как систему
Сразу после
После того, как
Дело в том, что ответ на вопрос о том, сбалансирована функция
Разберемся подробнее, почему это происходит. Рассмотрим все возможные
В этом случае
Видно, что при применении функций
Рассмотрим теперь сбалансированные функции
Здесь ситуация сложнее, так как
Видно, что первый кубит поменял свое состояние - теперь он в суперпозиции
Здесь будет похожая ситуация:
Получили то же состояние
Теперь можно получить более компактную формулу, которая подходит для всех четырех функций:
Задание
С помощью квантовых операторов попробуйте создать
Задание рекомендуется сделать до прочтения программистской части по алгоритму Дойча, так как там содержится ответ.
Алгоритм Дойча в коде#
Запрограммируем алгоритм с помощью библиотеки PennyLane. Предполагается, что функция, находящаяся в черном ящике, изначально присутствует, но для учебного примера создадим также и ее, точнее, все ее четыре варианта. Для того, чтобы нам не сразу было известно, какая из этих функций анализируется алгоритмом (иначе будет неинтересно), будем использовать случайный выбор функции.
Импортируем все необходимые библиотеки и модули, а также создадим квантовое устройство-симулятор, рассчитанное на схему из двух кубитов:
import pennylane as qml
from pennylane import numpy as np
dev = qml.device("default.qubit", shots=1, wires=2)
/home/runner/work/qmlcourse/qmlcourse/.venv/lib/python3.8/site-packages/_distutils_hack/__init__.py:33: UserWarning: Setuptools is replacing distutils.
warnings.warn("Setuptools is replacing distutils.")
Теперь создадим функции для черного ящика. Обратите внимание, что здесь уже учтено сложение по модулю
def f1():
pass
def f2():
qml.PauliX(wires=[1])
def f3():
qml.CNOT(wires=[0, 1])
def f4():
qml.PauliX(wires=0)
qml.CNOT(wires=[0, 1])
qml.PauliX(wires=0)
Создадим словарь с функциями и их названиями:
black_boxes_dict = {"f1": f1, "f2": f2, "f3": f3, "f4": f4}
А вот таким образом мы будем случайно выбирать название функции для черного ящика:
def random_black_box(black_boxes_dict):
black_boxes_dict_list_keys = list(black_boxes_dict.keys())
n = np.random.randint(0, len(black_boxes_dict_list_keys))
return black_boxes_dict_list_keys[n]
А теперь самое важное – сам алгоритм Дойча:
@qml.qnode(dev, interface=None)
def circuit(black_box_name):
qml.Hadamard(wires=0)
qml.PauliX(wires=1)
qml.Hadamard(wires=1)
black_boxes_dict[black_box_name]()
qml.Hadamard(wires=0)
return qml.sample(qml.PauliZ([0]))
Итак, подготовительные действия завершены, можно приступать к демонстрации работы алгоритма.
Выберем случайным образом функцию:
black_box_name = random_black_box(black_boxes_dict)
А затем запустим алгоритм Дойча и выведем результат его работы. Собственное значение
result = circuit(black_box_name)
print(result)
1
Проверим, насколько правильно сработал алгоритм. Для этого посмотрим на функцию из черного ящика:
print(black_box_name)
f2
Также посмотрим, как выглядит квантовая схема:
qml.drawer.use_style("default")
fig, ax = qml.draw_mpl(circuit)(black_box_name)
fig.show()

На примере алгоритма Дойча мы видим, что уже двухкубитная схема дает прирост скорости в два раза. Если же увеличивать количество входных параметров (как в аналогичном алгоритме Дойча-Йожи), то ускорение будет экспоненциальным.
Для специалистов, занимающихся искусственным интеллектом, алгоритм может быть интересен тем, что не просто решает задачу нахождения некоторого значения, действуя как калькулятор, а дает возможность определить скрытую функцию. Это похоже на задачи машинного обучения, когда дата сайентист, производя математические манипуляции с данными, в итоге получает модель (фактически – функцию), описывающую связь признаков с целевой переменной. Таким образом, интерес специалистов ИИ к квантовым вычислениям, вполне понятен, как и перспективы квантовых вычислений в этой области.