Jakie są główne składniki programu w języku Q#?
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;
}