Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Квантовые вычисления. Теория и практика. Учебник

.pdf
Скачиваний:
3
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
Приложение 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