Общие сведения о языке квантового программирования Q#
Q# — это высокоуровневый язык программирования с открытым кодом для разработки и запуска квантовых алгоритмов. Q# включается в комплект средств разработки Quantum (QDK). Дополнительные сведения см. в разделе "Настройка пакета средств разработки Quantum".
В качестве языка Q# квантового программирования соответствует следующим требованиям языка, компилятора и среды выполнения:
- Не зависит от аппаратного обеспечения: Кубиты в квантовых алгоритмах не привязаны к определенному квантовому оборудованию или макету. Q# Компилятор и среда выполнения обрабатывают сопоставление из кубитов программы на физические кубиты.
- Интегрирует квантовые и классические вычисления: возможность выполнения классических и квантовых вычислений необходима в универсальном квантовом компьютере.
- Уважает законы физики:Q# и квантовые алгоритмы следуют правилам квантовой физики. Например, вы не можете напрямую скопировать или получить доступ к состоянию кубита в Q#.
Q# Структура программы
Прежде чем приступить к написанию квантовых программ, важно понять их структуру и компоненты. Рассмотрим следующую Q# программу, которая создает состояние суперпозиции:
namespace Superposition {
@EntryPoint()
operation MeasureOneQubit() : Result {
// Allocate a qubit. By default, it's in the 0 state.
use q = Qubit();
// Apply the Hadamard operation, H, to the state.
// It now has a 50% chance of being measured as 0 or 1.
H(q);
// Measure the qubit in the Z-basis.
let result = M(q);
// Reset the qubit before releasing it.
Reset(q);
// Return the result of the measurement.
return result;
}
}
На основе комментариев (//
), Superposition
программа сначала выделяет кубит, применяет операцию для размещения кубита в суперпозиции, измеряет состояние кубита, сбрасывает кубит и, наконец, возвращает результат. Давайте разберем эту программу на ее компоненты.
Пространства имен пользователей
Q# Программы могут при необходимости начинаться с определяемого пользователем пространства имен, например:
namespace Superposition {
// Your code goes here.
}
Пространства имен помогают упорядочивать связанные функции. Каждая Q# программа может иметь только одну namespace
. Если пространство имен не указано, Q# компилятор использует имя файла в качестве пространства имен. Например, Superposition
программа может быть написана следующим образом:
@EntryPoint()
operation MeasureOneQubit() : Result {
// Allocate a qubit. By default, it's in the 0 state.
use q = Qubit();
// Apply the Hadamard operation, H, to the state.
// It now has a 50% chance of being measured as 0 or 1.
H(q);
// Measure the qubit in the Z-basis.
let result = M(q);
// Reset the qubit before releasing it.
Reset(q);
// Return the result of the measurement.
return result;
}
Стандартная Q# библиотека имеет предопределенные пространства имен, содержащие функции и операции, которые можно использовать в квантовых программах. Дополнительные сведения см. в встроенных пространствах имен.
Точки входа
По умолчанию Q# компилятор запускает выполнение программы из Main()
операции, если она доступна, которая может находиться в любом месте программы. При необходимости атрибут можно использовать @EntryPoint()
для указания любой операции в программе в качестве точки выполнения.
В программе Superposition
более описательная MeasureOneQubit()
операция является точкой входа программы.
@EntryPoint()
operation MeasureOneQubit() : Result {
...
Однако программа также может быть написана без атрибута @EntryPoint()
путем переименования операции Main()
в MeasureOneQubit()
:
// The Q# compiler automatically detects the Main() operation as the entry point.
operation Main() : Result {
// Allocate a qubit. By default, it's in the 0 state.
use q = Qubit();
// Apply the Hadamard operation, H, to the state.
// It now has a 50% chance of being measured as 0 or 1.
H(q);
// Measure the qubit in the Z-basis.
let result = M(q);
// Reset the qubit before releasing it.
Reset(q);
// Return the result of the measurement.
return result;
}
Типы
Q#предоставляет встроенные типы, которые являются общими для большинства языков, включая Int
, Bool
Double
и String
типы, относящиеся к квантовым вычислениям. Например, Result
тип представляет результат измерения кубита и может иметь одно из двух значений: Zero
или One
.
В программе Superposition
MeasureOneQubit()
операция возвращает Result
тип, соответствующий возвращаемому типу M
операции. Результат измерения хранится в новой переменной, определенной с помощью инструкции let
:
// The operation definition returns a Result type.
operation MeasureOneQubit() : Result {
...
// Measure the qubit in the Z-basis, returning a Result type.
let result = M(q);
...
Q# также предоставляет типы, определяющие диапазоны, массивы и кортежи. Можно даже определить собственные пользовательские типы.
Выделение кубитов
В Q#этом случае вы выделяете кубиты с помощью ключевого use
слова. Кубиты всегда выделяются в $\ket{0}$ состоянии.
Программа Superposition
определяет один кубит:
// Allocate a qubit.
use q = Qubit();
Вы также можете выделить несколько кубитов и получить доступ к каждому из них с помощью его индекса:
use qubits = Qubit[2]; // Allocate two qubits.
H(qubits[0]); // Apply H to the first qubit.
X(qubits[1]); // Apply X to the second qubit.
Дополнительные сведения см. в инструкции Use.
Квантовые операции
После выделения кубита его можно передать в операции и функции, также известные как вызываемые. Операции являются основными стандартными блоками программы Q#. Операция Q# — это квантовая подпрограмма или вызываемая подпрограмма, содержащая квантовые операции, которые изменяют состояние регистра кубита.
Чтобы определить Q# операцию, укажите имя операции, его входные данные и выходные данные. В программе Superposition
MeasureOneQubit()
операция по сути является всей программой. Он не принимает параметров и возвращает Result
тип:
operation MeasureOneQubit() : Result {
...
}
Ниже приведен базовый пример, который не принимает параметров и не ожидает возвращаемого значения. Значение Unit
эквивалентно другим языкам NULL
:
operation SayHelloQ() : Unit {
Message("Hello quantum world!");
}
Стандартная Q# библиотека также предоставляет операции, которые можно использовать в квантовых программах, таких как операция Hadamard, H
в программе Superposition
. Учитывая кубит в Z-основе, H
помещает кубитов в даже суперпозицию, где он имеет 50% шансов измерять как Zero
или One
.
Измерение кубитов
Хотя существует множество типов квантовых измерений, Q# основное внимание уделяется проецивным измерениям на отдельных кубитах, также известных как измерения Паули.
В Q#операции Measure
измеряется один или несколько кубитов в указанной базе Паули, которая может быть PauliX
, PauliY
или PauliZ
. Measure
Result
возвращает тип одного Zero
илиOne
.
Для реализации измерения в вычислительной базе $\lbrace\ket{0},\ket{1}\rbrace$ можно также использовать M
операцию, которая измеряет кубит в основе Паули Z. Это эквивалентно M
Measure([PauliZ], [qubit])
.
Программа Superposition
использует M
операцию:
// Measure the qubit in the Z-basis.
let result = M(q);
Сброс кубитов
В Q#, кубиты должны находиться в $\ket{0}$ состоянии при их освобождении. Reset
Используйте операцию для сброса каждого кубита $\ket{0}$ в состояние перед его освобождением в конце программы. Сбой сброса кубита приводит к ошибке среды выполнения.
// Reset a qubit.
Reset(q);
Встроенные пространства имен
В стандартной Q# библиотеке есть встроенные пространства имен, содержащие функции и операции, которые можно использовать в квантовых программах. Например, Microsoft.Quantum.Intrinsic
пространство имен содержит часто используемые операции и функции, такие как M
измерение результатов и Message
отображение сообщений пользователей в любой точке программы.
Чтобы вызвать функцию или операцию, можно указать полное пространство имен или использовать import
инструкцию, которая делает все функции и операции для этого пространства имен доступными и делает код более читаемым. В следующих примерах вызывается та же операция:
Microsoft.Quantum.Intrinsic.Message("Hello quantum world!");
// imports all functions and operations from the Microsoft.Quantum.Intrinsic namespace.
import Microsoft.Quantum.Intrinsic.*;
Message("Hello quantum world!");
// imports just the `Message` function from the Microsoft.Quantum.Intrinsic namespace.
import Microsoft.Quantum.Intrinsic.Message;
Message("Hello quantum world!");
// namespaces in the standard library may be imported using `Std` instead of `Microsoft.Quantum`.
import Std.Intrinsic.*;
Message("Hello quantum world!");
Программа Superposition
не имеет import
инструкций или вызовов с полными пространствами имен. Это связано с тем, что Q# среда разработки автоматически загружает два пространства имен: Microsoft.Quantum.Core
и Microsoft.Quantum.Intrinsic
, которые содержат часто используемые функции и операции.
Вы можете воспользоваться пространством Microsoft.Quantum.Measurement
имен с помощью MResetZ
операции оптимизации Superposition
программы. MResetZ
объединяет операции измерения и сброса на один шаг, как показано в следующем примере:
// Import the namespace for the MResetZ operation.
import Microsoft.Quantum.Measurement.*;
@EntryPoint()
operation MeasureOneQubit() : Result {
// Allocate a qubit. By default, it's in the 0 state.
use q = Qubit();
// Apply the Hadamard operation, H, to the state.
// It now has a 50% chance of being measured as 0 or 1.
H(q);
// Measure and reset the qubit, and then return the result value.
return MResetZ(q);
}
Разработка квантовых программ с помощью Q# Azure Quantum
Q# и Azure Quantum — это мощная комбинация для разработки и запуска квантовых программ. С Q# помощью Azure Quantum можно создавать квантовые программы, моделировать их поведение, оценивать требования к ресурсам и запускать их на реальном квантовом оборудовании. Эта интеграция позволяет исследовать потенциал квантовых вычислений и разрабатывать инновационные решения для сложных проблем. Независимо от того, является ли вы начинающим или опытным квантовым разработчиком, и Azure Quantum предоставляют инструменты и ресурсы, Q# необходимые для разблокировки мощности квантовых вычислений.
На следующей схеме показаны этапы, через которые выполняется квантовая программа при разработке с помощью Q# Azure Quantum. Программа начинается с среды разработки и заканчивается отправкой задания на реальное квантовое оборудование.
Давайте разберем шаги на схеме.
Выбор среды разработки
Запустите квантовые программы в предпочитаемой среде разработки. Вы можете использовать редактор кода в Интернете на веб-сайте Azure Quantum, размещенные записные книжки Jupyter в рабочей области Azure Quantum в портал Azure или локальную среду разработки с помощью Visual Studio Code. Дополнительные сведения см. в разделе "Различные способы запуска Q# программ".
Написание квантовой программы
Квантовые программы можно написать с Q# помощью комплекта средств разработки Quantum (QDK). Чтобы приступить к работе, см . краткое руководство. Создание первой Q# программы.
Q#Кроме того, QDK предлагает поддержку других языков для квантовых вычислений, таких как Qiskit и Cirq.
Интеграция с Python
Вы можете использовать Q# самостоятельно или вместе с Python в различных средах удостоверяемых удостоверствий. Например, можно использовать Q# проект с узлом Программы Python для вызова Q# операций. Вы также можете интегрироваться Q# с Python в Jupyter Notebook. Дополнительные сведения см. в разделе "Различные способы запуска Q# программ".
Команда %%qsharp
По умолчанию Q# программы в Jupyter Notebook используют ipykernel
пакет Python. Чтобы добавить Q# код в ячейку записной книжки, используйте %%qsharp
команду, которая включена с пакетом qsharp
Python, а затем Q# код.
При использовании %%qsharp
помните следующее:
- Необходимо сначала запустить
import qsharp
, чтобы включить%%qsharp
. %%qsharp
области в ячейку записной книжки, в которой она отображается, и изменяет тип ячейки с Python Q#на .- Вы не можете поместить инструкцию Python до или после
%%qsharp
нее. - Q#
%%qsharp
Следующий код должен соответствовать синтаксисуQ#. Например, используйте//
вместо#
обозначения комментариев и;
завершения строк кода.
Примечание.
Записные книжки Azure в портал Azure включают последние версии qsharp
пакетов Python, azure-quantum
поэтому устанавливать ничего не нужно. Дополнительные сведения см. в статье "Начало работы с Q# записными книжками Azure Quantum".
Оценка ресурсов
Прежде чем работать на реальном квантовом оборудовании, необходимо выяснить, может ли ваша программа работать на существующем оборудовании и сколько ресурсов он будет использовать.
Оценка квантовых ресурсов Azure позволяет оценивать архитектурные решения, сравнивать технологии кубитов и определять ресурсы, необходимые для выполнения заданного квантового алгоритма. Вы можете выбрать из предварительно определенных протоколов отказоустойчивости и указать предположения базовой физической модели кубита.
Дополнительные сведения см. в разделе "Запуск первой оценки ресурсов".
Примечание.
Оценка квантовых ресурсов Azure бесплатна и не требует учетной записи Azure.
Запуск программы в имитации
При компиляции и запуске квантовой программы QDK создает экземпляр квантового симулятора и передает Q# код в него. Симулятор использует код Q# для создания кубитов (имитирующих квантовые частицы) и выполняет операции по изменению их состояния. Результаты квантовых операций в симуляторе затем возвращаются в программу. Изоляция кода Q# в симуляторе гарантирует, что алгоритмы следуют законам квантовой физики и могут правильно работать на квантовых компьютерах.
Отправка программы на реальное квантовое оборудование
Вы можете отправлять Q# программы (также известные как задания) в Azure Quantum с помощью предпочтительной среды разработки, как локально, так и в сети. См. дополнительные сведения о том, как отправлять задания Q#. Вы также можете запускать и отправлять квантовые каналы, написанные на языках Qiskit и Cirq.
Azure Quantum предлагает некоторые из самых убедительных и разнообразных квантовых оборудования, доступных сегодня от лидеров отрасли. См. текущий список поддерживаемых поставщиков оборудования в статье Поставщики квантовых вычислений.
Примечание.
Целевой объект эмулятора H-series Quantinuum H-Series доступен без учетной записи Azure. Чтобы отправить задание в остальные поставщики Azure Quantum, требуется учетная запись Azure и рабочая область quantum. Если у вас нет квантовой рабочей области, см. статью "Создание рабочей области Azure Quantum".
На следующей схеме показан базовый рабочий процесс после отправки задания.