Qiskit#

Автор(ы):

В этой лекции мы посмотрим, как при помощи библиотеки Qiskit можно работать с кубитами и квантовыми схемами.

Warning

Во всех дальнейших лекциях мы будем, за редким исключением, использовать в основном библиотеку PennyLane, так что данная лекция исключительно обзорная и факультативная. В ней мы поверхностно познакомимся с концептами Qiskit и напишем пару примеров по работе с кубитами. Обзор экосистемы Qiskit, включая qiskit-machine-learning выходит за рамки этой лекции, но в конце мы дадим несколько ссылок для самостоятельного изучения.

Кубиты#

Импорты#

from qiskit import QuantumCircuit
from qiskit.providers.aer import QasmSimulator

from qiskit import version
print(f"Qiskit version: {version.get_version_info()}")
Qiskit version: 0.18.3

Симулятор#

Для запуска мы будем использовать симулятор квантового компьютера QasmSimulator:

simulator = QasmSimulator()

В Qiskit поддерживается несколько симуляторов, например:

  • UnitarySimulator – симулятор унитарной динамики идеальной схемы;

  • StatevectorSimulator – симулятор волновой функции идеальной схемы;

  • QasmSimulator – симулятор, который моделирует шумы;

Мы использовали лишь один из них. В целом, модуль qiskit.providers предоставляет базовые абстракции, которые позволяют запускать наш код на разных backend, включая реальные квантовые компьютеры, просто поменяв одну строчку в коде.

Квантовая схема#

Ключевым элементом в Qiskit является квантовая схема – экземпляр класса QuantumCircuit. Создадим такую схему:

circuit = QuantumCircuit(2, 2)

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

Квантовые гейты#

Давайте попробуем воспроизвести функцию make_entanglement из лекции про Pennylane. Применим гейт Адамара к первому кубиту, а потом применим гейт CNOT (CX):

circuit.h(0)
circuit.cx(0, 1)
<qiskit.circuit.instructionset.InstructionSet at 0x7f21d44d28b0>

И добавим шаг измерений:

circuit.measure([0,1], [0,1])
<qiskit.circuit.instructionset.InstructionSet at 0x7f2194129f70>

Компиляция и запуск схемы#

Квантовые схемы Qiskit должны быть скомпилированы в инструкции квантового ассемблера. Для этого используется функция transpile:

from qiskit import transpile

compiled_circuit = transpile(circuit, simulator)
job = simulator.run(compiled_circuit, shots=1000)
result = job.result()
counts = result.get_counts(compiled_circuit)

print(f"Number of '00': {counts['00']}")
print(f"Number of '11': {counts['11']}")
Number of '00': 539
Number of '11': 461

Мы получили результат, аналогичный полученному в лекции про Pennylane: вероятности получения результата \(\ket{00}\) и \(\ket{11}\) равны \(\sim 0.5\), а другие результаты мы получить не можем.

Визуализация#

В Qiskit есть очень мощные средства визуализации как результатов измерений, так и самих квантовых схем. Например, мы можем посмотреть результаты измерения counts в виде графика:

from qiskit.visualization import plot_histogram

plot_histogram(counts)
/home/runner/work/qmlcourse/qmlcourse/.venv/lib/python3.8/site-packages/qiskit/visualization/counts_visualization.py:226: MatplotlibDeprecationWarning: The label function was deprecated in Matplotlib 3.1 and will be removed in 3.8. Use Tick.label1 instead.
  tick.label.set_fontsize(14)
../../../_images/qiskit_13_1.png

А также визуализировать саму квантовую схему:

circuit.draw(output="mpl")
../../../_images/qiskit_15_0.png

В данном случае мы использовали MatplotlibDrawe, который позволяет делать очень красивые и легко читаемые визуализации квантовых схем – это одна из причин почему Qiskit часто используют в курсах по основам квантовых вычислений.

Экосистема Qiskit#

Для более подробного изучения всей экосистемы Qiskit мы рекомендуем онлайн книгу, которая также является прекрасным источником для изучения базовых и продвинутых квантовых алгоритмов. Для знакомства со средствами для квантового машинного обучения можно также изучить документацию библиотеки qiskit-machine-learning, в которой представлены высокоуровневые API для таких вещей, как, например, квантовый SVM, или квантовая Generative Adversarial Network.