Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Квантовые вычисления. Теория и практика. Учебник
.pdf
Приложение 3. Глоссарий
Дойча – Йожи позволяет определить, является функция
константной или сбалансированной, за один запуск алгоритма. Для того чтобы определить класс такой функции классическим способом, в самом удачном случае требуется всего
два запуска (при условии, что функция сбалансирована и
в двух запусках с разным набором аргументов получены раз-
n–1
ные выходные значения), а в худшем – сделать 2
+ 1 запусков. Таким образом, квантовый алгоритм экспоненциально ускоряет решение задачи. Необходимо также отметить,
что рассматриваемая функция может относиться только
к одному из двух классов – являться сбалансированной или
константной. Если же функция не является ни сбалансированной, ни константной, алгоритм Дойча – Йожи не будет
корректно работать.
Алгоритм Саймона – квантовый алгоритм, используемый для определения свойств функции определенного вида.
Данная функция, принимающая на вход один аргумент,
обладает свойством выдавать одно и то же значение при использовании пар разных аргументов. Данные пары аргументов можно найти, зная скрытую строку s, вычислить которую помогает алгоритм Саймона.
Алгоритм Шора – квантовый алгоритм, служащий для
решения задачи поиска простых множителей числа посредством поиска периода функции. Данный алгоритм известен
тем, что при его применении на компьютерах с достаточным
количеством кубитов (недоступным на данный момент) может использоваться для расшифровки сообщений, зашифрованных с помощью алгоритма RSA и других подобных
алгоритмов криптографии. Для расшифровки сообщений
достаточно будет знать только публичный ключ, так как
с помощью него алгоритм Шора помогает найти неизвестный приватный ключ. Алгоритм Шора в качестве своей составной части использует алгоритм квантового преобразования Фурье.
191

Приложения
Декогеренция – процесс, характеризующийся увеличением рассогласованности квантовой системы при взаимодействии ее с окружающей средой. Это постепенный процесс,
результатом которого для квантового компьютера является
рост процента ошибок в квантовых вычислениях.
Квантовая запутанность – квантовый эффект, при котором две частицы приведены в такой состояние, что результат
измерения одной частицы коррелирует с результатом измерения другой. Данный эффект является нелокальным, то
есть две частицы могут оставаться в запутанном состоянии,
даже если их разнести на большое расстояние.
Квантовая схема – схема, содержащая набор кубитов и
операторов (однокубитных и многокубитных), применяемых
к кубитам. На изображениях квантовых схем кубиты обозначаются в виде линий, а операторы, действующие на них,
в виде значков, расположенных слева направо, в порядке
применения. В конце квантовой схемы, как правило, используется операция измерения, применяемая либо ко всем
кубитам, либо к части кубитов. Оператор, используемый
в квантовой схеме, может быть верхнеуровневым, то есть соответствовать не одной, а нескольким операциям, которые
задействуются в квантовом компьютере для практической
реализации данного оператора.
Квантовое преобразование Фурье – квантовый алгоритм, классическим аналогом которого является дискретное преобразование Фурье. Квантовое преобразование Фурье
на основании входных дискретных значений некоторой периодической функции помогает найти спектр частот данной
функции. Используется как составная часть в других квантовых алгоритмах, например в алгоритме Шора и в оценке
квантовой фазы.
Квантовые вычисления – вычисления, для которых,
в отличие от классических вычислений, используются кубиты вместо битов. Кубиты, как и биты, могут находиться
192

Приложение 3. Глоссарий
в состояниях 0 и 1, но также одним из вариантов состояния
может быть суперпозиция. Помимо этого, кубиты в квантовой схеме могут находиться в состоянии квантовой запутанности.
Квантовый компьютер – устройство, производящее вычисления с использованием кубитов. Данное устройство
производит квантовые вычисления, применяя квантовые
эффекты – суперпозицию и квантовую запутанность, за счет
которых некоторые вычисления могут ускоряться. Устройство квантового компьютера зависит от того, какие частицы
используются в качестве кубитов. Одними из первых квантовых компьютеров были устройства, использующие ядерномагнитный резонанс, в настоящее время не используемый
из-за плохой масштабируемости. Наиболее часто современные квантовые компьютеры строятся на основе сверхпроводящих кубитов, фотонов или ионных ловушек.
Классические вычисления – вычисления с использованием битов, каждый из которых может в данный момент
времени находиться в одном из состояний: 0 или 1.
Кубит – единица вычислений в квантовом компьютере,
аналогично биту в классическом компьютере. В качестве кубита теоретически может выступать любая микрочастица:
электрон, фотон, ион, небольшая молекула и т.д.
Логический кубит – один либо несколько физических
кубитов, используемых для реализации функциональности
одного кубита. Несколько кубитов для реализации одного
кубита применяют в том случае, если процент ошибок в вычислениях недостаточно мал для совершения квантовых вычислений с требуемой точностью. Для того чтобы повысить
точность вычислений, используют различные методы исправления квантовых ошибок.
Состояния Белла – простейшие примеры квантовой запутанности. Два примера состояний Белла соответствуют случаям, когда два запутанных кубита после измерения нахо-
193

Приложения
дятся в одинаковых состояниях (с равной вероятностью оба
кубита будут в нулевом состоянии или оба в единичном). Эти
два примера отличаются только знаками амплитуд. Другие
два примера – когда два запутанных кубита после измерения
принимают разные состояния (0 и 1 или 1 и 0 с равной вероятностью). Различие этих двух примеров – также только
в знаках амплитуд.
Суперпозиция – квантовый эффект, при котором частица
может находиться в двух состояниях, которые можно условно обозначить как 0 и 1, одновременно. Суперпозиция исчезает после измерения частицы, и тогда состояние принимает
один из двух вариантов (0 или 1).
194

Приложение 4. Программирование с использованием Qiskit
Приложение 4. Программирование
с использованием Qiskit
П4.1. Создание квантовой запутанности
+
Напишем программу для создания состояния |
начала импортируем из библиотеки классы, отвечающие за
создание квантовой схемы, квантового регистра и классического регистра:
from qiskit import QuantumCircuit
from qiskit import ClassicalRegister,
QuantumRegister
Далее импортируем команду, отвечающую за запуск операторов квантовой схемы:
from qiskit import execute
Импортируем модуль BasicAer, который понадобится
для того, чтобы можно было использовать квантовый симулятор, встроенный в библиотеку Qiskit:
from qiskit import BasicAer
Создадим квантовый регистр, содержащий два кубита, и
классический регистр, содержащий два бита (в них будут записываться результаты измерения кубитов):
q = QuantumRegister(2)
c = ClassicalRegister(2)
Затем создадим квантовую схему на основе только что
созданных квантового и классического регистров:
circuit = QuantumCircuit(q, c)
Далее начнем добавлять операторы. После запуска этих
команд никаких действий над кубитами не будет произведено, будет только запланирована очередность применения
операторов. Для начала добавим оператор Адамара, в качестве кубита, на который он будет воздействовать, укажем
кубит, числящийся в квантовом регистре под индексом 0, то
есть верхний кубит:
. Для
195

Приложения
circuit.h(q[0])
После этого применим оператор CNOT, указывая в скобках сначала управляющий кубит, а затем целевой:
circuit.cx(q[0], q[1])
Если требуется вывести схему на экран, то можно применить самый простой способ – использовать стандартную команду Python:
print(circuit)
Затем запланируем измерение кубитов:
circuit.measure(q, c)
Создадим бэкенд, выбрав для него квантовый симулятор:
backend = BasicAer.get_backend(‘qasm_simulator’)
Теперь можно запустить квантовую схему на квантовом
симуляторе. В данном примере это делается 100 раз, чтобы
можно было получить данные в виде набора результатов измерений:
result = execute(circuit, backend, shots=100).
result()
Получить подсчет результатов измерений для каждого
возможного состояния можно с помощью этой команды:
print(result.get_counts())
В данном примере после измерений должно быть получено примерно одинаковое количество результатов для состояний 00 и 11. Программа выведет словарь, в котором
в качестве ключа будет содержаться измеренное состояние, а
в качестве величины – количество случаев получения данного состояния при измерении:
{‘00’: 52, ‘11’: 48}
Реализовать состояние |+ можно, если добавить оператор X, воздействующий на нижний кубит. Заново создадим
квантовую схему:
circuit = QuantumCircuit(q, c)
196

Приложение 4. Программирование с использованием Qiskit
Далее добавим необходимые операторы:
circuit.h(q[0])
circuit.x(q[1])
circuit.cx(q[0], q[1])
circuit.measure(q, c)
backend = BasicAer.get_backend(‘qasm_simulator’)
result = execute(circuit, backend, shots=100).
result()
print(result.get_counts())
В результате работы программы на экран будут выведены
результаты измерений для состояний 01 и 10:
{‘01’: 45, ‘10’: 55}
П4.2. Реализация алгоритма квантовой
телепортации
В данной программе в учебных целях реализуется алгоритм
квантовой телепортации. Этот алгоритм будет действовать
в пределах одного квантового компьютера (или симулятора),
то есть предполагается, что кубиты не перемещаются на большое расстояние относительно друг друга. Информация о результатах измерения двух верхних кубитов будет передаваться не по классическому каналу связи, а посредством условных
операторов CNOT и CZ, применяемых к нижнему кубиту. Тем
не менее в итоге результат будет аналогичен результату квантовой телепортации – состояние верхнего кубита будет передано
на нижний кубит. Вначале импортируем все необходимое:
from qiskit import QuantumCircuit
from qiskit import ClassicalRegister,
QuantumRegister
from qiskit import execute, BasicAer
Создадим квантовый и классический регистры, а также
квантовую схему. Укажем количество кубитов и битов, равное трем:
197

Приложения
q = QuantumRegister(3)
c = ClassicalRegister(3)
circuit = QuantumCircuit(q, c)
Добавим операторы согласно алгоритму квантовой телепортации:
circuit.h(q[1])
circuit.cx(q[1], q[2])
После этих операций нижний кубит может быть перемещен на большое расстояние, но в данной реализации алгоритма это невозможно, так как все кубиты находятся
в одном квантовом компьютере (или существуют в виде математических моделей при использовании квантового симулятора), поэтому продолжим добавлять операторы в квантовую
схему. На данном этапе программы нужно решить, какое
состояние будет создано на верхнем кубите с целью дальнейшей передачи этого состояния на нижний кубит посредством
алгоритма квантовой телепортации. Создадим состояние для
передачи, это могло бы быть состояние суперпозиции, но для
того, чтобы можно было сделать быструю проверку результатов работы программы, пусть это будет состояние |1:
circuit.x(q[0])
Добавим операторы, которые будут действовать на два
верхних кубита в соответствии с алгоритмом квантовой телепортации:
circuit.cx(q[0], q[1])
circuit.h(q[0])
Добавим условные операторы для случая, когда схема
будет работать внутри одного квантового компьютера (без
использования классического канала связи). Перед их действием добавим также барьер. В данном случае его добавление, по существу, ничего не меняет, скорее барьер здесь служит для отделения одной части программы от другой:
circuit.barrier()
198

Приложение 4. Программирование с использованием Qiskit
circuit.cx(q[1], q[2])
circuit.cz(q[0], q[2])
Далее добавим оператор измерения:
circuit.measure(q, c)
Создадим бэкенд и запустим квантовую схему:
backend = BasicAer.get_backend(‘qasm_simulator’)
result = execute(circuit, backend, shots=100).
result()
print(result.get_counts())
Программа была запущена 100 раз, то есть квантовая телепортация (а точнее, ее симуляция) была произведена такое
же количество раз. Эти повторы были произведены для того,
чтобы собрать небольшую статистику измерений. В результатах измерений видно, что нижний кубит (в соответствии
с системой обозначений Qiskit – это самый левый кубит)
во всех случаях находится в состоянии 1:
{‘111’: 29, ‘101’: 21, ‘110’: 27, ‘100’: 23}
Таким образом, мы видим, что состояние верхнего кубита передалось на нижний кубит.
П4.3. Реализация алгоритма Гровера
Запрограммируем алгоритм Гровера для таблицы, состоящей из четырех строк. Для этого нам понадобятся три
кубита – два для кодирования идентификаторов записей
в таблице и один вспомогательный. Так же, как и в главе,
посвященной алгоритму Гровера, будем считать, что искомая запись одна и ее идентификатор равен 11. Воспользуемся той же схемой, что и в этой главе. В начале программы
импортируем необходимые модули:
from qiskit import QuantumCircuit
from qiskit import ClassicalRegister,
QuantumRegister
from qiskit import execute, BasicAer
199

Приложения
Создадим квантовую схему для трех кубитов:
q = QuantumRegister(3)
c = ClassicalRegister(3)
circuit = QuantumCircuit(q, c)
Добавим операторы для приведения кубитов в требуемое
состояние перед началом итераций:
circuit.h(q[0])
circuit.h(q[1])
circuit.x(q[2])
circuit.h(q[2])
Всего в данной реализации алгоритма будет одна итерация. Добавим барьер и операторы для первой части итерации:
circuit.barrier()
circuit.ccx(q[0], q[1], q[2])
Добавим еще один барьер и операторы для второй части
итерации:
circuit.barrier()
circuit.h(q[0])
circuit.h(q[1])
circuit.x(q[0])
circuit.x(q[1])
circuit.ccx(q[0], q[1], q[2])
circuit.x(q[0])
circuit.x(q[1])
circuit.h(q[0])
circuit.h(q[1])
Далее добавим измерение кубитов:
circuit.measure(q, c)
Создадим бэкенд и запустим квантовую схему:
backend = BasicAer.get_backend(‘qasm_simulator’)
200
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
