Uživatelská Q# příručka pro kvantový programovací jazyk

KvantovýQ# programovací jazyk je součástí microsoftu Quantum Development Kit, který poskytuje bohatou podporu integrovaného vývojového prostředí a nástroje pro vizualizaci a analýzu programů. Pomocí Q# sady a Quantum Development Kit (QDK) můžete psát kvantové programy a spouštět je na skutečném kvantovém hardwaru pomocí Azure Quantum.

Další informace najdete v tématu Konfigurace prostředí pro vývoj kvantových aplikací a odesílání Q# úloh do Azure Quantum.

Uživatelská Q# příručka obsahuje:

  • Způsoby spuštění Q# programu: Program Q# lze spustit jako samostatnou aplikaci nebo s dalším hostitelským programem napsaným v Pythonu nebo v jazyce .NET.

  • Testování a ladění Q# programů: Stejně jako u klasického programování je důležité mít možnost zkontrolovat, jestli kvantové programy fungují podle očekávání, a umět diagnostikovat nesprávné chování. Pro Quantum Development Kit testování a ladění kvantových programů.

  • Průvodce Q# jazykem: Q# je samostatný jazyk, který nabízí vysokou úroveň abstrakce. Neexistuje žádná představa kvantového stavu nebo okruhu; Q# místo toho implementuje programy z hlediska příkazů a výrazů, podobně jako klasické programovací jazyky. Průvodce Q# jazykem poskytuje úplnou specifikaci a dokumentaci k kvantovému programovacímu Q# jazyku.

  • Dokumentace ke kvantovým simulátorům: Kvantové simulátory jsou softwarové programy, které běží na klasických počítačích a fungují jako target počítač pro Q# program, což umožňuje spouštět a testovat kvantové programy na klasických počítačích.

  • Q# Dokumentace ke knihovně: Poskytuje Quantum Development Kit další funkce specifické pro doménu prostřednictvím balíčků NuGet, které lze přidat do vašich Q# projektů. Dokumentace obsahuje operace, funkce, uživatelem definované typy, příklady a koncepty, které tvoří standardní Q# knihovnu, a také kvantovou chemii, kvantové strojové učení a knihovny kvantových čísel.

Co je v Q# programu?

Pojďme se podívat na obecné části, které se vejdou do Q# programu. Zvažte následující Q# program:

namespace HelloQuantum {

    open Microsoft.Quantum.Canon;
    open Microsoft.Quantum.Intrinsic;


    @EntryPoint()
    operation SayHelloQ() : Unit {
        Message("Hello quantum world!");
    }
}

EntryPoint řekne kompilátoru Q# , kde má spustit program. Program vypíše tuto zprávu:

    Hello quantum world!

Obory názvů

Každý Q# soubor obvykle začíná oborem názvů. Tady je příklad:

namespace HelloQuantum {
    // Your code goes here.
}

Obory názvů pomáhají uspořádat související funkce. Jejich použití je důležité, když používáte Q# knihovny ve svých programech a když píšete vlastní knihovny.

Knihovny

Q# ve velké míře využívá knihovny. Knihovna je balíček, který obsahuje funkce a operace, které můžete použít v kvantových programech.

Například knihovna Microsoft.Quantum.Chemistry pomáhá provádět kvantové výpočty související s chemií. Existuje několik standardních knihoven, které obsahují velké množství základních operací.

Při volání funkce nebo operace z knihovny zadáte obor názvů knihovny. Tady je příklad, který volá Message funkci z knihovny Microsoft.Quantum.Intrinsic pro tisk zprávy do konzoly:

namespace HelloQuantum {

    @EntryPoint()
    operation SayHelloQ() : Unit {
        Microsoft.Quantum.Intrinsic.Message("Hello quantum world!");
    }
}

Častěji se používá direktiva open, aby byl kód výstižnější a čitelnější.

Tento příklad provede totéž jako ten předchozí, ale použije direktivu open k přenosu oboru názvů Microsoft.Quantum.Intrinsic do programu:

namespace HelloQuantum {

    open Microsoft.Quantum.Intrinsic;

    @EntryPoint()
    operation SayHelloQ() : Unit {
        Message("Hello quantum world!");
    }
}

Zde můžete jednoduše zadat Message a kompilátor pochopí, do kterého oboru názvů patří.

Q# Dokumentace poskytuje úplnou referenční dokumentaci pro každou integrovanou knihovnu. Další informace najdete v dokumentaci ke Q# knihovnám.

Typy

Q#poskytuje mnoho předdefinovaných typů, které už znáte, včetně Int, DoubleBool, a , a Stringtaké typů, které jsou specifické pro kvantové výpočty. Typ například Result představuje výsledek měření qubitu a může mít jednu ze dvou možných hodnot: One a Zero. Q# poskytuje také typy, které definují oblasti, pole a řazené kolekce členů. Můžete dokonce definovat vlastní typy.

Q# Systém typů je celkem minimalistický v tom smyslu, že neexistuje explicitní pojem tříd nebo rozhraní, jak by se dalo použít z klasických jazyků, jako je C# nebo Java.

Přidělování qubitů

V Q#systému se qubity přidělují prostřednictvím klíčového use slova. Najednou můžete přidělit jeden nebo více qubitů.

Tady je příklad, který přiděluje jeden qubit:

// Allocate a qubit.
use q = Qubit();

// Do something with q here.

Ve výchozím nastavení začíná každý qubit, který přidělíte pomocí klíčového use slova, v nulovém stavu.

Kvantové operace

Po přidělení lze qubit předat operacím a funkcím, které se označují také jako volatelné. V určitém smyslu je to vše Q# , co program může dělat s qubitem. 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 název operace spolu s jejími vstupy a výstupem. Tady je jednoduchý příklad:

operation SayHelloQ() : Unit {
    Message("Hello quantum world!");
}

SayHelloQ zde představuje název operace. Přebírá jako svůj vstup nula argumentů a vrací typ Unit, což znamená, že operace nevrátí žádné informace.

KnihovnyQ# také poskytují operace, které můžete použít ve svých programech, například Hadamard nebo H operace. Vzhledem k tomu, že je qubit v základu H Z, operace převede qubit do rovnoměrné superpozice. Jakmile je qubit v superpozici, má 50% pravděpodobnost, že se změří jako nula nebo jedna.

Všechny přímé akce na stav qubitu jsou definovány vnitřními volatelnými možnostmi, jako X jsou a H – to znamená volatables, jejichž implementace nejsou definovány v rámci Q# , ale jsou definovány target počítačem. To, co tyto operace ve skutečnosti dělají , je provedeno pouze strojem target , který se rozhodnete spustit konkrétní Q# program. Další informace najdete v tématu Q# Implementace programu.

Pokud například spustíte program na simulátoru úplného stavu, simulátor provede odpovídající matematické operace se simulovaným kvantovým systémem. Ale když se podíváme do budoucnosti, když se jedná o target skutečný kvantový počítač, zavolání takových operací nasměruje Q# kvantový počítač k provedení odpovídajících reálných operací na skutečném kvantovém hardwaru. Například v kvantovém počítači s zachycenými ionty jsou kvantové operace realizovány přesně načasovanými laserovými impulsy.

Program Q# překombinuje tyto operace tak, jak jsou definovány target počítačem, a vytvoří tak nové operace vyšší úrovně pro vyjádření kvantového výpočtu. Tímto způsobem usnadňuje vyjádření logiky, Q# která je základem kvantového a hybridního kvantového a klasického algoritmu, a zároveň je obecná s ohledem na strukturu počítače nebo simulátoru target .

Měření qubitů

Existuje mnoho druhů kvantových měření, ale Q# zaměřuje se na projektivní měření na jednotlivých qubitech, označovaných také jako Pauliho měření. Při měření v daném základu (například výpočetní báze $\ket{0},\ket{1}$) se stav qubitu promítá na libovolný základní stav, který byl změřen, a tím se zničí jakákoli superpozice mezi těmito dvěma hodnotami.

V Q#nástroji se pauliho měření provádí použitím Measure operace, která provádí společné měření jednoho nebo více qubitů v zadaných Pauliho bázích. Measure operace vrátí Result typ.

Poznámka

Pokud jsou základní pole a qubitové pole různě dlouhé, Measure operace selže.

Pokud chcete implementovat měření ve výpočetní bázi $\ket{0},\ket{1}$, můžete použít M také operaci, která provede měření jednoho qubitu v základu Pauliho Z. Proto M je operace ekvivalentní použití Measure([PauliZ], [qubit]).

Jednoduchým příkladem je následující program, který přidělí jeden qubit ve stavu $\ket{0}$, pak na něj použije hadamardovou operaci H a změruje výsledek v základu PauliZ .

@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(qubit);
    // We reset the qubit before releasing it.
    if result == One { X(qubit); }
    // Finally, we return the result of the measurement.
    return result;
    
}

Pro provádění měření nad rámec jednoho společného měření Microsoft.Quantum.Measurement zahrnuje obor názvů konkrétnější operace. Operace například MultiM vezme pole qubitů a vrátí pole výsledků měření na výpočetní bázi.

Další kroky