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

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

Установка Qiskit

Прежде чем говорить о кодах, нам нужна платформа, на которой мы можем их писать и запускать. В этом уроке я буду использовать qiskit, библиотеку Python для квантового программирования и один из самых популярных инструментов для квантового программирования в целом. Эту библиотеку можно установить либо локально, либо в онлайн-среде, такой как Google Colab. Если ваша цель — просто увидеть квантовые вычисления в действии и вы хотите сделать это как можно быстрее, то я бы рекомендовал использовать Colab, но локальная установка Qiskit также довольно проста.

Локальная установка Qiskit: Чтобы установить Qiskit на свой компьютер, у вас уже должен быть установлен Python 3. Кроме того, Qiskit часто используется в ноутбуках, поэтому вам также необходимо установить Jupyter. Вы можете получить оба из них от Anaconda, поэтому рекомендуется установить его на свой компьютер, но также можно загрузить Python и Jupyter, следуя инструкциям на их сайтах. После этого можно переходить к установке самого Qiskit. Для этого откройте терминал и введите команду в соответствии с вашей ОС:

  • MAC/Windows: $ pip install qiskit;
  • Linux: $ pip install -U pip && pip install qiskit.

А затем вам просто нужно открыть новый блокнот Jupyter и начать использовать qiskit.

Установка Qiskit в Google colab: Учитывая, что в Colab уже установлен Python и он работает как блокнот, единственное, что вам нужно сделать, это установить Qiskit. В Colab создайте новый блокнот Python, а затем вставьте команду $ pip install qiskit в ячейку, запустите эту ячейку и дождитесь завершения установки. После этого вы готовы начать использовать Qiskit. Если вы не знакомы с блокнотами Colab или Python, ознакомьтесь с этим введением, сделанным людьми из TensorFlow.

Установив Qiskit, вы можете запустить ноутбук и начать использовать мощь квантовых компьютеров. Но важно отметить одну вещь: как вы, наверное, знаете, квантовые компьютеры довольно редки, поэтому, чтобы использовать их, вам нужно ждать в очереди. Чтобы этого избежать, принято запускать свои программы в симуляторе, поскольку они являются хорошим приближением к квантовым компьютерам, которые вы можете использовать прямо сейчас, учитывая, что количество смоделированных кубитов довольно близко к количеству реальных кубитов. на доступных компьютерах. По этой причине я покажу вам, как сначала запускать коды на симуляторе, а после этого — как запускать их на реальном квантовом компьютере. Таким образом можно будет показать и их различия.

Запуск вашего первого кода

Теперь, когда у нас есть где написать и запустить наш алгоритм, нам нужен сам код. Если у вас есть некоторый опыт программирования, особенно с языками программирования высокого уровня, такими как Python, то вы привыкли к переменным, инструкциям и функциям. Учитывая, что Qiskit — это библиотека Python, она также использует эти функции для создания кодов.

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

С учетом сказанного, наконец пришло время что-то реализовать. Давайте начнем с простой схемы, чтобы вы могли освоиться с Qiskit. Первый шаг — настроить нашу среду, импортировав необходимые инструменты для нашего кода.

from qiskit import QuantumCircuit, Aer
from qiskit.visualization import plot_histogram

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

  • Функция QuantumCircuit позволяет нам создать пустую схему, в которую мы добавим кубиты, биты, вентили и/или измерения.
  • Aer помогает нам использовать симуляторы, и это необходимо, когда вы не собираетесь запускать свой код на реальном компьютере.
  • Функция plot_histogram очень важна для просмотра ваших результатов. Это связано с тем, что квантовая механика является вероятностной, поэтому, если вы запустите свой код только один раз, есть вероятность, что вы не получите ожидаемого результата (поскольку все еще существует небольшая вероятность неожиданного результата). Чтобы решить эту проблему, код выполняется много раз, и вы получаете распределение результатов, которые коррелируют с вероятностями возможных результатов. plot_histogram показывает вам это распределение.

Теперь мы можем начать строить нашу схему.

qc = QuantumCircuit(1, 1)
qc.x(0)
qc.measure(0,0) # measures the 0 qubits into the 0 bits
qc.draw()
Output: Circuit 1
     ┌───┐┌─┐
  q: ┤ X ├┤M├
     └───┘└╥┘
c: 1/══════╩═
           0

Это действительно простая схема. Фактически, это можно понять без представления каких-либо квантовых явлений.

  • В первой строке создается схема, и она назначается переменной «qc». Эта схема была создана с параметрами (1,1), то есть я хочу, чтобы схема имела 1 кубит (первый аргумент), а также 1 классический бит (второй аргумент). Когда схемы создаются таким образом, все кубиты запускаются в состоянии |0›.
  • После этого, всякий раз, когда вы хотите добавить вентиль в схему, вы можете написать что-то вроде «qc.gate(#qubit)», где «gate» — это имя квантового вентиля, который вы хотите применить, а «#qubit» являющийся номером кубита, в котором должен быть применен вентиль. В примере код qc.x(0) означает, что я применил вентиль X (НЕ) к кубиту 0. Важно отметить, что номер кубита соответствует стандартам позиций массива, поэтому кубит 0 является 1-й кубит.
  • Затем в схему добавляется оператор измерения, который сопоставляет измерение кубита 0 (первый аргумент) с битом 0 (второй аргумент). Когда у вас есть несколько кубитов и битов, измерения обычно записываются в одну строку. Для этого вместо чисел в качестве аргументов вы используете списки чисел, один список представляет кубиты, а другой — классические биты. В следующей строке показан пример добавления оператора измерения 4 кубитов к 4 классическим битам.
qc.measure([0,1,2,3], [0,1,2,3]) 
  • Наконец, функция .draw() использовалась, чтобы показать нам схему, как вы можете видеть в выводе. Если присмотреться, то выход называется Circuit 1, но это то, что я написал, чтобы сделать объяснение более ясным, и это не то, что вы увидите при выполнении кода.

Учитывая, что в схему больше нечего добавить, мы можем предсказать, какими будут результаты. Как я уже говорил, когда вы инициализируете схему, кубиты находятся в состоянии |0›, и мы применили НЕ к этому кубиту, что в данном случае переводит кубит в состояние |1›. Затем мы измерим этот кубит, и кубит, находящийся в состоянии |1›, означает, что он со 100% вероятностью будет измерен как 1.

Чтобы запустить этот код, нам нужно настроить симулятор, а затем запустить в нем схему. Для этого вы можете использовать следующие команды.

sim = Aer.get_backend('qasm_simulator')
result = sim.run(qc).result()
answer = result.get_counts()
plot_histogram(answer)

В этом примере переменная «sim» представляет симулятор, и с этой переменной вам просто нужно использовать команду .run(схема) для выполнения вашей схемы, а после этого использовать функцию .result() для получения результатов. . Чтобы закончить наш код, вы можете использовать функцию .get_counts(), чтобы получить распределение результатов, чтобы вы могли построить его в виде гистограммы.

И как видите, в результате мы получили 1, как и ожидалось.

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

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

qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0,1)
qc.barrier()#Used to split parts of the circuit
qc.measure([0,1],[0,1]) # measures the 0,1 qubits into the 0,1 bits
qc.draw()
Output: Circuit 2
     ┌───┐      ░ ┌─┐   
q_0: ┤ H ├──■───░─┤M├───
     └───┘┌─┴─┐ ░ └╥┘┌─┐
q_1: ─────┤ X ├─░──╫─┤M├
          └───┘ ░  ║ └╥┘
c: 2/══════════════╩══╩═
                   0  1

Что делает эту схему более сложной, чем предыдущая, так это тот факт, что вместо вентиля НЕ есть вентиль Адамара и вентиль CNOT (управляемое не), что означает, что в какой-то момент система окажется в суперпозиции. , и кубиты будут запутаны. Вы увидите, как это повлияет на результаты после того, как мы запустим наш код.

Как и раньше, теперь мы можем предварительно просмотреть результаты, посмотрев на схему. Система запускается в состоянии |00›. После вентиля Адамара первый кубит переходит в состояние |+›, переводя систему в состояние |+0›. Это означает, что эта система находится в суперпозиции состояний |00› и |10›.
После этого у нас есть ворота CNOT. Просто чтобы освежить ваши мысли, этот вентиль использует управляющий кубит (в данном случае первый кубит), чтобы определить, будет ли он воздействовать на целевой кубит (второй). Точнее, если управляющий кубит находится в состоянии |0›, то с целью ничего не происходит, но если управляющий кубит находится в состоянии |1›, то к цели применяется НЕ.
Если мы посмотрим на нашу систему, то можно заметить, что управляющий кубит находится в суперпозиции двух состояний, поэтому CNOT будет воздействовать на цель на основе суперпозиции. Это означает, что в случае, когда управляющий кубит находится в состоянии |0›, с целью ничего не произойдет и результирующее состояние по-прежнему будет |00›, но в случае, когда управляющий кубит находится в состоянии |1 › состояние, цель будет перевернута, и состояние изменится с |10› на |11›. Важно отметить, что обе эти вещи произойдут одновременно, поэтому фактическое состояние после CNOT будет суперпозицией |00› и |11›.

Несмотря на то, что система находится в обоих состояниях одновременно, мы точно знаем, что она должна коллапсировать в одно из этих состояний, когда мы измеряем систему, и в этом случае мы должны получить ответ «00» в 50% случаев. и «11» остальные 50%. Чтобы проверить, правильно ли это, давайте запустим код, используя тот же процесс, что и в первой схеме.

sim = Aer.get_backend('qasm_simulator')
result = sim.run(qc).result()
answer = result.get_counts()
plot_histogram(answer)

Вернемся к решению, в последней строке нанесены счетчики, и вы можете видеть, что они близки к ожидаемым значениям.

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

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

Запуск кода на реальном квантовом компьютере:

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

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

from qiskit import IBMQ, execute
IBMQ.save_account("*api_token*")
IBMQ.load_account()
provider = IBMQ.get_provider("ibm-q")

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

Хороший способ взглянуть на доступные компьютеры — использовать этот код, предоставленный sentdex, у которого есть хорошая серия видеороликов, посвященных квантовым вычислениям, на его канале YouTube.

for backend in provider.backends():
  try:
    qubit_count = len(backend.properties().qubits)
  except:
    qubit_count = "simulated"
  print(f"{backend.name()} has {backend.status().pending_jobs} queued and {qubit_count} qubits")

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

Запуск вашего кода. Чтобы использовать выбранный компьютер для запуска вашего кода, вы можете использовать приведенные выше строки, которые представляют собой адаптацию кода, используемого для симулятора. Как видите, структура по-прежнему очень похожа, и вам просто нужно выбрать другой бэкенд. Обратите внимание, что здесь я использую команду «выполнить», и ее также можно использовать для симулятора. Я просто хотел показать, что в Qiskit есть разные способы выполнения некоторых действий, и вы можете выбрать тот, который вам больше нравится.

backend = provider.get_backend("*chosen_computer*")
job = execute(qc, backend=backend, shots=500)
result = job.result()
answer = result.get_counts()
plot_histogram(answer)

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

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

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