5 квантовых языков программирования: как они устроены и где их учить
Объяснили, как квантовые языки программирования работают с аналоговыми кубитами, какие языки существуют и в чём преимущества каждого из них.
5К открытий8К показов
Если вы знакомы с квантовыми компьютерами, вы знаете, что кубит — это частица.
В случае с битами принцип работы языков программирования ясен: все операции по сути являются последовательностью нулей и единиц, то есть наличием сигнала или его отсутствием. Но как языки программирования могут манипулировать частицами?
В этой статье мы расскажем, как языки программирования работают с аналоговыми кубитами, какие квантовые языки существуют и в чём преимущества каждого из них.
Как работают квантовые языки программирования
Они используют два основных свойства кубита: суперпозицию и способность принимать одно из полярных значений — 0 или 1. Это база квантовых операций. О том, как работают квантовые компьютеры, мы писали ранее. Ознакомиться с принципом их работы можно здесь:
В общем, все операции с кубитами связаны с измерением или изменением их физических свойств, с положением кубитов и их связью с другими частицами.
Вот некоторые из самых популярных операций в квантовых языках программирования и их воздействие на кубиты:
- Операция применения единичного преобразования (Unitary operations). Например, оператор Хадамара (
H
) создает суперпозицию состояний|0⟩
и|1⟩
, а оператор Ши (S
) применяет фазовый сдвиг к состоянию. - Операция измерения (Measurement). Измерение кубита приводит к коллапсу состояния в одно из базисных состояний
|0⟩
или|1⟩
. Измерение позволяет получить информацию о состоянии кубита и использовать её в дальнейших вычислениях. - Операция запутывания (Entanglement). Она позволяет создавать состояния, в которых два или более кубита становятся коррелированными таким образом, что изменение состояния одного кубита немедленно отражается на другом. Используется для передачи информации и решения задач на квантовое шифрование и квантовую телепортацию.
- Операция управляемого вращения (Controlled rotations). Позволяет применять унитарные операции к кубитам при выполнении определенных условий. Например, оператор
CNOT
(управляемое НЕ) применяет операциюNOT
к целевому кубиту только в том случае, если управляющий кубит находится в состоянии|1⟩
. - Операция декогеренции и исправление ошибок (Decoherence and error correction). Декогеренция — это разрушение квантового состояния, которое является неотъемлемой частью квантовых систем. Квантовые языки программирования позволяют находить и исправлять ошибки, чтобы повысить точность вычислений.
Квантовые языки программирования с примерами кода
1. Q# (Q sharp)
Это высокоуровневый квантовый язык программирования, разработанный Microsoft. У Q# есть несколько весомых преимуществ перед остальными квантовыми языками: на нём можно писать программы с использованием неквантового языка программирования C#, а ещё Q# поддерживается Microsoft Quantum Development Kit.
Полезные ссылки:
Вот, как выглядит программа на Q#:
Читаем код:
namespace Quantum.Examples
– это определение пространства имен. Все операции и типы данных для квантовых вычислений будут находиться в пространстве именQuantum.Examples
.open Microsoft.Quantum.Primitive
– операторopen
импортирует пространство именMicrosoft.Quantum.Primitive
. Оно содержит основные операции и функции, необходимые для работы с квантовыми вычислениями.operation SuperpositionExample() : Result
– определение операции с именемSuperpositionExample
. Операция не принимает никаких аргументов и возвращает значенияResult
. ТипResult
представляет результат измерения кубита и может принимать значения 0 или 1.using (qubit = Qubit())
– конструкцияusing
используется для создания кубита и автоматического освобождения ресурсов после использования. Кубит помещается в переменнуюqubit
.H(qubit)
– вызов операцииH
, которая применяет операцию Хадамара к кубитуqubit
. Операция Хадамара создает суперпозицию состояний|0⟩
и|1⟩
, что означает, что кубит может находиться в обоих состояниях одновременно.return M(qubit)
– измеряет кубитqubit
и возвращает результат измерения. ОперацияM
измеряет состояние кубита и возвращает 0 или 1 в зависимости от того, в каком положении кубит был измерен.
2. Quantum
Quantum – это квантовый язык программирования, разработанный для IBM Quantum и платформы Qiskit. По сравнению с другими языками, Quantum предлагает простой синтаксис для разработки квантовых алгоритмов.
Ещё Quantum использует открытый доступ к платформе IBM Quantum Experience и поддерживает OpenQASM — язык для описания квантовых схем.
Полезные ссылки:
Пример кода:
Описание кода:
open quantum;
– открывает пространство именquantum
с основными операциями и функциями для работы с квантовыми вычислениями.operation SuperpositionExample() : Result
– определяет операциюSuperpositionExample
. Операция не принимает аргументов и возвращает значениеResult
. ТипResult
представляет результат измерения кубита и может принимать значения 0 или 1.using (qubit = Qubit())
– конструкцияusing
используется для создания кубита (переменнаяqubit
) на основе типа данныхQubit
. После вычислений в блокеusing
, конструкция автоматически освобождает ресурсы, связанные с кубитом.H(qubit);
– применяет операцию Хадамара (H
) к кубитуqubit
, создавая суперпозицию кубита, что означает, что кубит может находиться в состояниях 0 и 1 одновременно.let result = M(qubit);
– выполняет измерение кубитаqubit
и сохраняет результат измерения в переменнуюresult
в виде 0 или 1.return result;
– возвращает результат измерения кубита после выполнения операцииSuperpositionExample
.
3. Cirq
Cirq – фреймворк и язык программирования от Google, предназначенный для разработки на квантовых процессорах.
У Cirq простой синтаксис, он поддерживает симуляции и может выполняться на реальных квантовых устройствах. Интегрируется с другими инструментами Google вроде TensorFlow.
Полезные ссылки:
Пример кода:
Вот, что делает этот код:
import cirq
– импортирует модульcirq
, который предоставляет функционал для создания квантовых цепочек, операций и симуляции квантовых вычислений.def superposition_example():
– определяет функциюsuperposition_example
, которая содержит код для создания квантовой цепочки.qubit = cirq.LineQubit(0)
– создает объектqubit
на нулевой позиции.circuit = cirq.Circuit()
– создает квантовую цепочку, в которую будут добавлены операции.circuit.append(cirq.H(qubit))
– добавляет операцию Хадамара (H
) к кубитуqubit
в квантовую цепочку. Создает суперпозицию состояний кубита.circuit.append(cirq.measure(qubit, key='result'))
– добавляет операцию измеренияqubit
в квантовую цепочку. Результат измерений будет сохранен под ключом'result'
.simulator = cirq.Simulator()
– создает объектsimulator
для симуляции квантовой цепочки.result = simulator.run(circuit)
– запускаетsimulator
для выполнения квантовой цепочкиcircuit
и сохраняет результаты выполнения.measurement_result = result.measurements['result']
– получает результаты измерений из объектаresult
для ключа'result'
.return measurement_result[0]
– возвращает первый элемент из результатов измерений, представляющий значение измерения кубита.result = superposition_example()
– вызывает функциюsuperposition_example
и сохраняет результат измерения в переменнуюresult
.print(result)
– выводит значение измерения кубита на экран.
4. pyQuil
pyQuil – это библиотека на Python, разработанная компанией Rigetti Computing.
pyQuil позволяет создавать, симулировать и выполнять квантовые программы на кубитах суперпроводников. Он интегрирован с другими научными библиотеками Python.
Полезные ссылки:
Пример кода:
Объясняем код:
from ... import ...
– импортируем необходимые модули из pyQuil.p = Program()
– создаем объектProgram
, который представляет квантовую программу.p += H(0)
– Применяем операцию Хадамара (H
) на первом кубите. Операция Хадамара создает суперпозицию кубита, превращая его из начального состояния|0>
в состояние(|0> + |1>)/sqrt(2)
.p += CNOT(0, 1)
– применяем операциюCNOT
на обоих кубитах. ОперацияCNOT
инвертирует второй кубит только тогда, когда первый кубит находится в состоянии|1>
.simulator = WavefunctionSimulator()
– создаем объектWavefunctionSimulator
, который позволяет симулировать выполнение программы.wavefunction = simulator.simulate(p)
– симулируем выполнение программы и получаем волновую функцию (wavefunction
) после выполнения.- print(wavefunction) – выводим волновую функцию.
5. Qiskit
Qiskit – это открытая библиотека программного обеспечения, разработанная IBM для разработки и исполнения квантовых алгоритмов.
Благодаря открытому исходному коду и активному сообществу разработчиков, Qiskit предоставляет широкий спектр инструментов и ресурсов для изучения и применения квантового программирования.
Qiskit также предоставляет возможность интеграции с другими языками программирования, такими как Python, что делает его более удобным для разработчиков, уже знакомых с ним.
Полезные ссылки:
Пример программы на Qiskit:
Что делает программа:
from ... import ...
– импортируем необходимые модули из Qiskit.qc = QuantumCircuit(2, 2)
– создаем объектQuantumCircuit
с двумя кубитами и двумя классическими битами.qc.h(0)
– применяем операцию Хадамара (H
) на первом кубите. Операция Хадамара создает суперпозицию изначально|0>
состояния кубита, превращая его в(|0> + |1>)/sqrt(2)
.qc.cx(0, 1)
– применяем операцию CNOT (cx
) на обоих кубитах. Операция CNOT применяет преобразование, которое инвертирует второй кубит, только если первый кубит находится в состоянии|1>
.qc.measure([0,1], [0,1])
– измеряем состояния кубитов и сохраняем результаты в классические биты.simulator = Aer.get_backend('qasm_simulator')
– запускаем квантовый симулятор.job = execute(qc, simulator, shots=1000)
– выполняем схему на симуляторе, указывая количество повторений (shots
) равным 1000.result = job.result()
– сохраняем результаты симуляции.counts = result.get_counts(qc) // print(counts)
– получаем результаты выполнения симуляции и выводим их.
Заключение
Если вы всё же решились попробовать себя в квантовом программировании, сообщите нам, какой язык программирования вы выбрали и каким был ваш опыт: какие языки вы изучали до этого, сложно ли было освоить квантовые языки и каких вы достигли успехов.
Если вы уже кодите на квантовых языках, напишите в комментариях, что мы забыли упомянуть в статье. Возможно, вы знаете о каких-либо языках или инструментах, которые мы несправедливо обошли стороной.
До встречи в квантовом будущем! ?
5К открытий8К показов