Q# Struktura programu
Tento článek se zabývá obecnými komponentami, které tvoří Q# program. Všimněte si, že Q# programy napsané v aplikaci Jupyter Notebooks některé z těchto komponent nepoužívají – tyto rozdíly jsou popsány v jednotlivých částech.
Zvažte následující Q# program:
namespace Superposition {
@EntryPoint()
operation MeasureOneQubit() : Result {
// Allocate a qubit, by default it is in zero state
use q = Qubit();
// We apply a Hadamard operation H to the state
// It now has a 50% chance of being measured 0 or 1
H(q);
// Now we measure the qubit in Z-basis.
let result = M(q);
// We reset the qubit before releasing it.
Reset(q);
// Finally, we return the result of the measurement.
return result;
}
}
Pouhým čtením komentářů (//) poznáte, že tento program přidělí qubit, použije operaci, která ho umístí do superpozice, změruje stav qubitu, pak ho resetuje a vrátí výsledek.
Pokud chcete tento program spustit v editoru Visual Studio Code, přečtěte si téma Začínáme s Q# programy a editorem VS Code.
Uživatelské obory názvů
Q# programy obvykle začínají oborem názvů s uživatelským názvem, například
namespace Superposition {
// Your code goes here.
}
Obory názvů pomáhají uspořádat související funkce. Obory názvů mají uživatelský název a pro každý soubor qsharp (*.qs) může existovat pouze jeden namespace
.
Standardní Q# knihovna má předdefinované obory názvů, které obsahují funkce a operace, které můžete použít v kvantových programech. Další informace najdete v tématu Předdefinované obory názvů.
Poznámkové bloky Jupyter nepoužívají uživatelské obory názvů.
EntryPoint()
Atribut @EntryPoint()
říká kompilátoru Q# , kde má spustit program. V programech s více definicemi funkcí a operací může být umístěna dříve, @EntryPoint()
než odtamtud začne jakákoli funkce nebo operace a tok programu a pokračuje postupně.
...
@EntryPoint()
operation MeasureOneQubit() : Result {
...
Poznámkové bloky Jupyter nepoužívají vstupní body.
Příkaz %%qsharp
Programy v poznámkových blocích Jupyter ve výchozím nastavení Q# používají jádro Pythonu ipykernel . Pokud chcete přidat Q# kód do buňky poznámkového bloku, musíte použít %%qsharp
příkaz , který je povolený s balíčkem Pythonu qsharp
. Například předchozí vzorový kód v Jupyter Notebook vypadá takto:
import qsharp
%%qsharp
operation MeasureOneQubit() : Result {
// Allocate a qubit, by default it is in zero state
use q = Qubit();
// We apply a Hadamard operation H to the state
// It now has a 50% chance of being measured 0 or 1
H(q);
// Now we measure the qubit in Z-basis.
let result = M(q);
// We reset the qubit before releasing it.
Reset(q);
// Display the result
Message($"Result is {result}");
// Finally, we return the result of the measurement.
return result;
}
MeasureOneQubit();
Všimněte si, že pro poznámkové bloky Jupyter chybí uživatelský obor názvů nebo @EntryPoint()
, které nejsou potřeba. Místo vstupního bodu se operace volá přímo na posledním řádku. Všimněte si také, že Message
do kódu Jupyter Notebook byl přidán příkaz pro zobrazení výsledku. Když v editoru VS Code spustíte dřívější Q# program, zobrazí ve výchozím nastavení integrovaný simulátor výsledek.
Při použití %%qsharp
příkazu:
- Abyste povolili
%%qsharp
příkaz , musíte nejprve spustitimport qsharp
příkaz . - Příkaz
%%qsharp
je vymezený na celou buňku, ve které se zobrazí. - Kód Q# , který následuje za příkazem, musí dodržovat standardní Q# syntaxi kódování. Komentáře například označíte pomocí namísto
//
#
uvnitř%%qsharp
buněk a řádky kódu musí končit středníkem;
. - Před
%%qsharp
příkazem nemůže být příkaz Pythonu v jeho buňce ani za ním.
Příklad práce s Jupyter Notebook programem najdete v tématu Začínáme s Q# programy a VS Code.
Typy
Q#poskytuje mnoho předdefinovaných typů, které jsou společné pro většinu jazyků, včetně Int
, Double
Bool
a , spolu String
s typy, které jsou specifické pro kvantové výpočty. Typ například Result
představuje výsledek libovolného měření qubitu a může mít jednu ze dvou možných definovaných hodnot: One
a Zero
. V ukázkovém programu operace MeasureOneQubit()
očekává návratový typ a Result
M
operace měří qubit a vrací Result
hodnotu .
...
// operation definition expecting a return type of Result
operation MeasureOneQubit() : Result {
...
// Now we measure the qubit in Z-basis, returning a Result type
let result = M(q);
...
}
Q# poskytuje také typy, které definují rozsahy, pole a řazené kolekce členů. Můžete dokonce definovat vlastní typy.
Přidělování qubitů
V Q#systému se qubity přidělují prostřednictvím klíčového use
slova .
Náš příklad definuje jeden qubit:
// Allocate a qubit.
use q = Qubit();
...
Můžete ale také přidělit více qubitů a přistupovat ke každému z nich prostřednictvím jejich indexu:
...
use qubits = Qubit[2];
X(qubits[1]);
H(qubits[0]);
...
Ve výchozím nastavení se každý qubit, který přidělíte pomocí klíčového use
slova, spustí v nulovém stavu. Každý qubit se musí před uvolněním na konci programu resetovat zpět do stavu nula. Selhání resetování qubitu aktivuje chybu za běhu.
// Reset a qubit.
Reset(q);
...
Kvantové operace
Po přidělení je možné qubit předat operacím a funkcím, které se označují také jako volatelné. Operace jsou základní stavební bloky Q# programu. Operace Q# je kvantový podprogram. To znamená, že jde o volatelnou rutinu, která obsahuje operace upravující stav registru qubitu.
Pokud chcete definovat Q# operaci, zadejte její název spolu s jejími vstupy a výstupem. V našem příkladu je jedinou operací v podstatě celý program. Nebere žádné parametry a očekává návratový Result
typ :
operation MeasureOneQubit() : Result {
...
}
Tady je základní příklad, který nepřijímá žádné parametry a neočekává žádnou návratovou hodnotu. Hodnota Unit
je ekvivalentní hodnotě NULL
v jiných jazycích.
operation SayHelloQ() : Unit {
Message("Hello quantum world!");
}
Standardní Q# knihovna také poskytuje operace, které můžete použít ve svých programech, například Hadamard nebo H
operace, která se používá v ukázkovém programu. Vzhledem k tomu, že je qubit v základu Z, H
převede operace qubit do rovnoměrné superpozice. Jakmile je qubit v superpozici, má 50% šanci, že se změří jako nula nebo jedna.
Měření qubitů
Existuje mnoho typů kvantových měření, ale Q# zaměřuje se na projektivní měření jednotlivých qubitů, označovaných také jako Pauliho měření. Při měření v dané bázi (například výpočetní základna $\ket{0},\ket{1}$) se stav qubitu promítá na jakýkoli změřený základní stav, čímž se zničí jakákoli superpozice mezi nimi.
Náš ukázkový program používá M
operaci , která provede měření jednoho qubitu na základě Pauliho Z a vrátí Result
typ.
Předdefinované obory názvů
Standardní Q# knihovna využívá předdefinované obory názvů, které obsahují funkce a operace, které můžete použít v kvantových programech. Obor názvů Microsoft.Quantum.Intrinsic
například obsahuje běžně používané operace a funkce, jako M
je , k měření výsledků a Message
k zobrazení zpráv uživatelů kdekoli v programu.
Funkci nebo operaci můžete volat zadáním úplného oboru názvů nebo pomocí open
příkazu zpřístupnit všechny funkce a operace pro tento obor názvů a usnadnit čtení kódu. Tyto dva příklady volají stejnou operaci:
Microsoft.Quantum.Intrinsic.Message("Hello quantum world!");
open Microsoft.Quantum.Intrinsic;
Message("Hello quantum world!");
Všimněte si, že v ukázkovém programu neexistují žádné open
příkazy ani volání s úplnými obory názvů. Je to proto, že Q# vývojové prostředí ve výchozím nastavení automaticky načte dva obory názvů – Microsoft.Quantum.Core
a Microsoft.Quantum.Intrinsic
– které obsahují běžně používané funkce a operace.
Můžete využít obor Microsoft.Quantum.Measurement
názvů a použít MResetZ
operaci k optimalizaci kódu v ukázkovém programu. MResetZ
kombinuje operace měření a resetování do jednoho kroku, jak je znázorněno v následujícím příkladu:
namespace Superposition {
// open the namespace for the MResetZ operation
open Microsoft.Quantum.Measurement;
@EntryPoint()
operation MeasureOneQubit() : Result {
// Allocate a qubit, by default it is in zero state
use q = Qubit();
// We apply a Hadamard operation H to the state
// It now has a 50% chance of being measured 0 or 1
H(q);
// Measure and reset the qubit, and return the result value
return MResetZ(q);
}
}
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat Problémy GitHubu jako mechanismus zpětné vazby pro obsah a nahradíme ho novým systémem zpětné vazby. Další informace najdete tady:Odeslat a zobrazit názory pro