Jakie są główne składniki programu w języku Q#?

Ukończone

Przed napisaniem własnych programów kwantowych ważne jest zrozumienie struktury i składników języka programowania Q#.

W tej lekcji poznasz podstawowe składniki programu języka Q#.

Main Operacja

Każdy program w języku Q# musi zawierać co najmniej jedną operację. Kompilator języka Q# rozpoczyna uruchamianie programu z operacji punktu wejścia, która jest operacją Main domyślnie. Na przykład następujący program w języku Q# zawiera operację o nazwie Main , która tworzy kubit i zwraca pomiar stanu kubitu:

// This operation is the entry point to your program because it's name is Main
operation Main() : Result {
    use q = Qubit();
    return M(q);
}

Kod języka Q# nie może działać bez operacji punktu wejścia. Jeśli chcesz użyć operacji innej niż Main jako punkt wejścia, użyj atrybutu @EntryPoint(). Na przykład poniższy kod daje poprzednią operację bardziej opisową nazwę , MeasureOneQubiti definiuje tę operację jako punkt wejścia do programu 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);
}

Typy

Język Q# udostępnia wiele wbudowanych typów danych, które mogą być już znane, takie jak Int, Double, Booli String. Język Q# udostępnia również typy specyficzne dla obliczeń kwantowych, takich jak Qubit i Result.

Na przykład operacja MeasureOneQubit zwraca wartość typu Result. Result Typ reprezentuje stan kubitu, gdy kubit jest mierzony i może mieć wartość Zero lub One.

Biblioteki kwantowe

Język Q# zawiera kilka bibliotek zawierających funkcje i operacje ułatwiające pisanie programów kwantowych. Aby wywołać funkcję lub operację z biblioteki, użyj import słowa kluczowego i określ przestrzeń nazw biblioteki. Na przykład, aby użyć funkcji Message z przestrzeni nazw Microsoft.Quantum.Intrinsic w kwantowej bibliotece standardowej, zastosuj następujący kod:

// 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!");
}

Gwiazdka oznacza, że importowane są wszystkie funkcje z przestrzeni nazw Microsoft.Quantum.Intrinsic. Alternatywnie można zaimportować tylko Message funkcję:

// 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!");
}

Uwaga / Notatka

W Q# typ Unit oznacza, że funkcja lub operacja nie zwraca wartości. Aby uzyskać więcej informacji na temat typów w języku Q#, zobacz System typów.

Przestrzenie nazw można importować w standardowej bibliotece za pomocą Std zamiast Microsoft.Quantum. Na przykład poniższy kod importuje wszystkie funkcje i operacje z Microsoft.Quantum.Intrinsic przestrzeni nazw:

// 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!");
}

Aby zapoznać się ze standardową biblioteką języka Q#, zobacz dokumentację interfejsu API.

Alokacja kubitu

Aby przydzielić kubit w języku Q#, użyj słowa kluczowego use i typu Qubit. Kubity przydzielane za pomocą słowa kluczowego use zawsze zaczynają się w stanie $\ket{0}$.

W tablicy kubitów można przydzielić jeden kubit lub wiele kubitów. Oto przykład przydzielenia pojedynczego kubitu do zmiennej q1 oraz tablicy pięciu kubitów do zmiennej q5.

use q1 = Qubit();  // Allocate one qubit
use q5 = Qubit[5]; // Allocate five qubits

Pomiar kubitu

W języku Q# Measure operacja wykonuje wspólną miarę jednego lub większej liczby kubitów w określonych bazach Pauli, które mogą być PauliX, PauliYlub PauliZ. Operacja Measure zwraca Result typ, który ma wartość Zero lub One.

Aby wykonać pomiar w podstawie obliczeniowej $\lbrace\ket{0}, \ket{1}\rbrace$, możesz również użyć operacji M. Operacja M jest równoważna operacji Measure w podstawie Pauli-Z, więc M([qubit]) zachowuje się dokładnie tak samo jak Measure([PauliZ], [qubit]). M Jednak operacja akceptuje tylko pojedyncze kubity jako dane wejściowe, a nie tablice kubitów.

Resetowanie kubitów

W języku Q# kubity muszą być w stanie $\ket{0}$ w celu ich zwolnienia. Po zakończeniu korzystania z kubitu wywołaj Reset operację, aby zresetować kubit do stanu $\ket{0}$. Na przykład poniższy kod przydziela kubit, mierzy stan kubitu, a następnie resetuje kubit:

operation Main() : Result {
    use q = Qubit();
    let result = M(q);

    // Reset the qubit so that you can release it
    Reset(q);

    return result;
    }