Каковы основные компоненты программы Q#?
Прежде чем писать собственные квантовые программы, важно понимать структуру и компоненты языка программирования Q#.
В этом уроке вы узнаете об основных компонентах программы Q#.
Операция Main
Каждая программа Q# должна содержать по крайней мере одну операцию. Компилятор Q# начинает запускать программу из операции точки входа, которая является Main операцией по умолчанию. Например, следующая программа Q# содержит операцию Main, которая создает кубит и возвращает результат измерения его состояния.
// This operation is the entry point to your program because it's name is Main
operation Main() : Result {
use q = Qubit();
return M(q);
}
Код Q# не может выполняться без операции точки входа. Если вы хотите использовать другую операцию вместо Main в качестве точки входа, используйте атрибут @EntryPoint(). Например, следующий код дает предыдущей операции более описательное имя и MeasureOneQubitопределяет эту операцию в качестве точки входа в программу Q#:
// The @EntryPoint() attribute tells the compiler to start running your code from this operation
@EntryPoint()
operation MeasureOneQubit() : Result {
use q = Qubit();
return M(q);
}
Типы
Q# предоставляет множество встроенных типов данных, с которыми вы уже знакомы, например Int, DoubleBoolи String. Q# также предоставляет типы, относящиеся к квантовым вычислениям, таким как Qubit и Result.
Например, MeasureOneQubit операция возвращает Result значение типа. Тип Result представляет состояние кубита при измерении кубита и может иметь значение либо ZeroOne.
Библиотеки квантовых вычислений
Q# поставляется с несколькими библиотеками, содержащими функции и операции, которые помогают создавать квантовые программы. Чтобы вызвать функцию или операцию из библиотеки, используйте import ключевое слово и укажите пространство имен библиотеки. Например, чтобы использовать функцию Message из Microsoft.Quantum.Intrinsic пространства имен в стандартной квантовой библиотеке, используйте следующий код:
// import all functions and operations from Microsoft.Quantum.Intrinsic
import Microsoft.Quantum.Intrinsic.*;
operation Main() : Unit {
// call the Message function from Microsoft.Quantum.Intrinsic
Message("Hello quantum world!");
}
Звездочка означает, что вы импортируете все функции из Microsoft.Quantum.Intrinsic пространства имен. Кроме того, можно импортировать только функцию Message :
// import only the Message function from Microsoft.Quantum.Intrinsic
import Microsoft.Quantum.Intrinsic.Message;
operation Main() : Unit {
// call the Message function from Microsoft.Quantum.Intrinsic
Message("Hello quantum world!");
}
Замечание
В Q# тип Unit означает, что функция или операция не возвращает значения. Дополнительные сведения о типах в Q#см. в разделе "Система типов".
Пространства имен можно импортировать в стандартную библиотеку с помощью Std вместо Microsoft.Quantum. Например, следующий код импортирует все функции и операции из Microsoft.Quantum.Intrinsic пространства имен:
// import everything from Std.Intrinsic (Microsoft.Quantum.Intrinsic)
import Std.Intrinsic.*;
operation Main() : Unit {
// call the Message function from Std.Intrinsic
Message("Hello quantum world!");
}
Сведения о стандартной библиотеке Q# см. в справочнике по API.
Выделение кубитов
Чтобы выделить кубит в Q#, используйте use ключевое слово и Qubit тип. Кубиты, выделенные ключевым словом use , всегда начинаются в состоянии $\ket{0}$.
Вы можете выделить один кубит или несколько кубитов в массиве кубитов. Ниже приведен пример, который выделяет один кубит в переменной q1 и массив из пяти кубитов в q5:
use q1 = Qubit(); // Allocate one qubit
use q5 = Qubit[5]; // Allocate five qubits
Измерение кубита
В Q# Measure операция выполняет совместное измерение одного или нескольких кубитов в указанных базах Паули, которые могут быть PauliX, PauliYили PauliZ. Операция Measure возвращает тип Result, значение которого либо Zero, либо One.
Чтобы выполнить измерение в вычислительной базе $\lbrace\ket{0},\ket{1}\rbrace$, можно также использовать операцию M. Операция M эквивалентна Measure операции в Pauli-Z основе, поэтому M([qubit]) ведет себя точно так же, как Measure([PauliZ], [qubit]). Однако операция M принимает только один кубиты в качестве входных данных, а не массивов кубитов.
Сброс кубитов
В Q# кубиты должны находиться в состоянии $\ket{0}$, чтобы высвободить их. Завершив использование кубита, вызовите Reset операцию для сброса кубита до состояния $\ket{0}$. Например, следующий код выделяет кубит, измеряет состояние кубита, а затем сбрасывает кубит.
operation Main() : Result {
use q = Qubit();
let result = M(q);
// Reset the qubit so that you can release it
Reset(q);
return result;
}