Каковы основные компоненты программы 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;
    }