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 spustit import 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, DoubleBoola , spolu Strings 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 ResultM operace měří qubit a vrací Resulthodnotu .

...
// 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ý Resulttyp :

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 Mje , k měření výsledků a Messagek 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);
    }
    
}