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

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

Схемы используются для проведения экспериментов. Конкретно существует 2 типа квантовых симуляций:

  • Использование обычного компьютера для симуляции квантового компьютера. Например, использование Python для написания схемы и симулятора для её запуска, тогда как реальный квантовый компьютер физически реализовал бы схему.
  • Использование квантового компьютера для симуляции реальной квантовой системы (таких как атомы или электроны). В природе квантовые системы уже существуют, а классические компьютеры с трудом их симулируют, потому что пространство состояний растёт экспоненциально. С другой стороны, квантовые машины могут моделировать эти системы более эффективно, так как они естественным образом следуют тем же правилам.

    В этом учебнике я покажу вам, как запустить квантовую симуляцию на вашем компьютере. Эта статья является продолжением "Руководства для начинающих по квантовым вычислениям на Python".

    Настройка

    Прежде всего, нам нужно установить Qiskit (pip install qiskit), библиотеку с открытым исходным кодом для работы с квантовыми компьютерами, разработанную IBM, которая позволяет вам симулировать квантовое устройство на локальной машине.

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

    from qiskit import QuantumCircuit
    from qiskit.quantum_info import Statevector
    
    q = QuantumCircuit(1,0) #схема с 1 квантовым битом и 0 классическими битами
    state = Statevector.from_instruction(q) #измерить состояние
    state.probabilities() #вывести вероятность%
    
    Image

    Это означает, что вероятность того, что кубит равен 0 (первый элемент), составляет 100%, а вероятность того, что кубит равен 1 (второй элемент), равна 0%. Визуализируем состояние:

    from qiskit.visualization import plot_bloch_multivector
    
    plot_bloch_multivector(state, figsize=(3,3))
    
    Image

    Схемы

    Квантовый вентиль — это одиночная операция, которая изменяет квантовое состояние. Квантовая схема — это последовательность вентилей, применённых к кубитам во времени.

    Давайте начнём строить простую схему.

    q = QuantumCircuit(1,0) #схема с 1 квантовым битом и 0 классическими битами
    
    q.draw(output="mpl", scale=0.7) #показать схему с matplotlib
    
    Image

    У нас есть один кубит, но для его измерения нам нужно добавить классический бит в нашу схему.

    q = QuantumCircuit(1,1) #добавить 1 классический бит
    
    q.draw(output="mpl", scale=0.7)
    
    Image

    Чтобы построить схему, вы должны знать, что вы хотите достичь, или, другими словами, вам нужно знать вентили и то, что они делают. Подход похож на нейронные сети: вы просто используете один слой за другим для получения желаемого выхода (например, свёртки на изображениях и встраивания на тексте). Наиболее распространённая операция — это вентиль Адамара (вентиль H), который применяет суперпозицию к кубиту.

    q = QuantumCircuit(1,1)
    q.h(0) #вентиль Адамара (суперпозиция)
    
    q.draw(output="mpl", scale=0.7)
    
    Image

    На изображении мы видим, что красный вентиль H применён к кубиту, превращая его из определённого 0 в равномерную смесь 0 и 1 (50/50). Давайте добавим ящик измерения, который схлопывает эту суперпозицию в реальное значение (либо 0, либо 1), сохраняя этот результат в классическом бите.

    q = QuantumCircuit(1,1)
    q.h(0)
    q.measure(qubit=0, cbit=0) #измерить кубит классическим битом
    
    q.draw(output="mpl", scale=0.7)
    
    Image

    Схема была математически разработана моим классическим компьютером, как если бы она была написана на бумаге, но она ещё не была выполнена.

    Симуляция

    Квантовая симуляция — это когда вы используете компьютер для моделирования поведения квантовой системы. Если вы напишете схему (как я сделал выше), вы просто описываете математическую модель. Для её запуска вам нужен модуль выполнения, который выполняет квантовую схему в симуляции.

    Qiskit-Aer (pip install qiskit-aer) — это модуль, который выполняет квантовые схемы в симуляции. Aer позволяет вам запускать квантовые схемы на вашем компьютере, симулируя различные аспекты реального квантового оборудования (квантовое состояние, измерение, зашумленная система).

    Я собираюсь запустить эксперимент со схемой, написанной ранее (классический бит + кубит в суперпозиции) 1000 раз.

    from qiskit_aer import AerSimulator
    
    sim = AerSimulator()
    result = sim.run(q, shots=1000).result()
    result.get_counts()
    
    Image

    Кубит был измерен 1000 раз, в результате чего 1 появился 500 раз, а 0 — 500 раз. Мы можем это визуализировать:

    from qiskit.visualization import plot_histogram
    
    plot_histogram(result.get_counts(), 
    figsize=(5,4), color="black", title="1-кубит в суперпозиции")
    
    Image

    Результат идеально равномерный, потому что Aer может симулировать идеальные квантовые состояния, что было бы невозможно иметь на реальном оборудовании. В реальном мире квантовая информация чрезвычайно хрупка и работает под предположением, что система идеальна и стабильна, позволяя частицам существовать в нескольких состояниях (когерентность). Но в момент, когда кубит взаимодействует с чем-либо, например с теплом или вибрациями, система теряет свою гармонию и квантовые свойства (декогеренция). Таким образом, вы можете визуализировать кубит в суперпозиции (одновременно и 0, и 1) только в симуляции, но никогда в реальном мире. Потому что в момент, когда вы наблюдаете кубит, вы вносите шум и система схлопывается в одно число (0 или 1). На практике реальные квантовые компьютеры предназначены только для измерения результатов, а симуляции используются для проектирования квантовых моделей.

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

    from qiskit_aer import noise
    
    n = noise.NoiseModel()
    error = noise.depolarizing_error(param=0.10, num_qubits=1) #10% вероятность ошибки
    n.add_all_qubit_quantum_error(error=error, instructions=['h'])
    
    sim = AerSimulator(noise_model=n)
    result = sim.run(q, shots=1000).result()
    plot_histogram(result.get_counts(), 
    figsize=(5,4), color="black", title="1-кубит в суперпозиции")
    
    Image

    Заключение

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

    Полный код для этой статьи: GitHub

    Надеюсь, вам понравилось! Не стесняйтесь связаться со мной с вопросами и обратной связью или просто поделиться своими интересными проектами.