Sdílet prostřednictvím


Úvod do kvantového programovacího jazyka Q#

Q#je opensourcový programovací jazyk vysoké úrovně pro vývoj a spouštění kvantových algoritmů. Q# je součástí sady Quantum Development Kit (QDK). Další informace najdete v tématu Nastavení sady Quantum Development Kit.

Jako kvantový programovací jazyk Q# splňuje následující požadavky na jazyk, kompilátor a modul runtime:

  • Nezávislá na hardwaru: Qubity v kvantových algoritmech nejsou svázané s konkrétním kvantovým hardwarem nebo rozložením. Kompilátor Q# a modul runtime zpracovávají mapování z qubitů programu na fyzické qubity.
  • Integruje kvantové a klasické výpočty: Schopnost provádět klasické a kvantové výpočty je zásadní v univerzálním kvantovém počítači.
  • Respektuje zákony fyziky:Q# a kvantové algoritmy se řídí pravidly kvantové fyziky. Například nemůžete přímo kopírovat nebo přistupovat ke stavu qubitu v Q#.

Q# Struktura programu

Než začnete psát kvantové programy, je důležité porozumět jejich struktuře a komponentám. Představte si následující Q# program, který vytvoří stav superpozice:

namespace Superposition {
    @EntryPoint()
    operation MeasureOneQubit() : Result {
        // Allocate a qubit. By default, it's in the 0 state.  
        use q = Qubit();  
        // Apply the Hadamard operation, H, to the state.
        // It now has a 50% chance of being measured as 0 or 1.
        H(q);      
        // Measure the qubit in the Z-basis.
        let result = M(q);
        // Reset the qubit before releasing it.
        Reset(q);
        // Return the result of the measurement.
        return result;
    }
}

Na základě komentářů (//), Superposition program nejprve přidělí qubit, použije operaci, která umístí qubit do superpozice, měří stav qubitu, resetuje qubit a nakonec vrátí výsledek. Pojďme tento program rozdělit do jejích součástí.

Obory názvů uživatelů

Q# programy můžou volitelně začínat uživatelem definovaným oborem názvů, například:

namespace Superposition {
    // Your code goes here.
}

Obory názvů vám můžou pomoct uspořádat související funkce. Každý Q# program může mít pouze jeden namespace. Pokud není zadaný obor názvů, Q# kompilátor použije název souboru jako obor názvů. Program může být například Superposition napsán takto:

@EntryPoint()
operation MeasureOneQubit() : Result {
    // Allocate a qubit. By default, it's in the 0 state.  
    use q = Qubit();  
    // Apply the Hadamard operation, H, to the state.
    // It now has a 50% chance of being measured as 0 or 1.
    H(q);      
    // Measure the qubit in the Z-basis.
    let result = M(q);
    // Reset the qubit before releasing it.
    Reset(q);
    // Return the result of the measurement.
    return result;
}

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 naleznete v tématu Předdefinované obory názvů.

Vstupní body

Ve výchozím nastavení Q# kompilátor spustí program z Main() operace, pokud je k dispozici, který může být umístěn kdekoli v programu. Volitelně můžete pomocí atributu @EntryPoint() určit jakoukoli operaci v programu jako bod provádění.

Superposition V programu je popisnější MeasureOneQubit() operací vstupní bod programu.

@EntryPoint()
operation MeasureOneQubit() : Result {
    ...

Program však lze také zapsat bez atributu @EntryPoint() přejmenováním MeasureOneQubit() operace na Main():

// The Q# compiler automatically detects the Main() operation as the entry point. 

operation Main() : Result {
    // Allocate a qubit. By default, it's in the 0 state.  
    use q = Qubit();  
    // Apply the Hadamard operation, H, to the state.
    // It now has a 50% chance of being measured as 0 or 1.
    H(q);      
    // Measure the qubit in the Z-basis.
    let result = M(q);
    // Reset the qubit before releasing it.
    Reset(q);
    // Return the result of the measurement.
    return result;
}

Typy

Q#poskytuje integrované typy, které jsou společné pro většinu jazyků, včetně BoolIntDouble, , a Stringa typů, které jsou specifické pro kvantové výpočty. Result Například typ představuje výsledek měření qubitu a může mít jednu ze dvou hodnot: Zero nebo One.

Superposition V programu MeasureOneQubit() vrátí Result operace typ, který odpovídá návratovém typu M operace. Výsledek měření se uloží do nové proměnné, která je definovaná pomocí let příkazu:

// The operation definition returns a Result type.
operation MeasureOneQubit() : Result {
    ...
    // Measure the qubit in the 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#případě přidělení qubitů pomocí klíčového use slova. Qubity se vždy přidělují ve $\ket{0}$ stavu.

Program Superposition definuje jeden qubit:

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

Můžete také přidělit více qubitů a přistupovat k jednotlivým qubitům prostřednictvím jeho indexu:

use qubits = Qubit[2]; // Allocate two qubits.
H(qubits[0]); // Apply H to the first qubit.
X(qubits[1]); // Apply X to the second qubit.

Další informace naleznete v tématu Příkaz Use.

Kvantové operace

Po přidělení qubitu ho můžete předat operacím a funkcím, označovaným také jako volatelné. Operace jsou základní stavební bloky Q# programu. Operace Q# je kvantový podprogram nebo volatelná rutina, která obsahuje kvantové operace, které mění stav registru qubitu.

Pokud chcete definovat Q# operaci, zadáte název operace, její vstupy a výstup. Superposition V programu je operace MeasureOneQubit() v podstatě celý program. Nepřijímá žádné parametry a vrací 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í NULL v jiných jazycích:

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

Standardní Q# knihovna také poskytuje operace, které můžete použít v kvantových programech, jako je operace Hadamard, Hv Superposition programu. Vzhledem k qubitu v základu H Z umístí qubit do sudé superpozice, kde má 50% šanci změřit jako Zero nebo One.

Měření qubitů

I když existuje mnoho typů kvantových měření, Q# zaměřuje se na projektová měření na jednotlivých qubitech, označovaných také jako pauliová měření.

Operace Q#Measure měří jeden nebo více qubitů v zadaném základu Pauli, který může být PauliX, PauliYnebo PauliZ. MeasureResult vrátí typ nebo Zero One.

K implementaci měření ve výpočetním základu $\lbrace\ket{0},\ket{1}\rbrace$ můžete také použít M operaci, která měří qubit v základu Pauli Z. To činí M ekvivalentem Measure([PauliZ], [qubit]).

Program Superposition používá M operaci:

// Measure the qubit in the Z-basis.
let result = M(q);

Resetování qubitů

Qubity Q#musí být ve $\ket{0}$ stavu, kdy jsou uvolněny. Reset Pomocí operace resetujte každý qubit do $\ket{0}$ stavu před jeho uvolněním na konci programu. Při resetování qubitu dojde k chybě za běhu.

// Reset a qubit.
Reset(q);

Předdefinované obory názvů

Standardní Q# knihovna má integrované obory názvů, které obsahují funkce a operace, které můžete použít v kvantových programech. Obor názvů například Microsoft.Quantum.Intrinsic obsahuje běžně používané operace a funkce, jako M je měření výsledků a Message zobrazení uživatelských zpráv kdekoli v programu.

Chcete-li volat funkci nebo operaci, můžete zadat úplný obor názvů nebo použít import příkaz, který zpřístupňuje všechny funkce a operace pro tento obor názvů a usnadňuje čtení kódu. Následující příklady volají stejnou operaci:

Microsoft.Quantum.Intrinsic.Message("Hello quantum world!");
// imports all functions and operations from the Microsoft.Quantum.Intrinsic namespace.
import Microsoft.Quantum.Intrinsic.*;
Message("Hello quantum world!");

// imports just the `Message` function from the Microsoft.Quantum.Intrinsic namespace.
import Microsoft.Quantum.Intrinsic.Message;
Message("Hello quantum world!");
// namespaces in the standard library may be imported using `Std` instead of `Microsoft.Quantum`. 
import Std.Intrinsic.*;
Message("Hello quantum world!");

Program Superposition nemá žádné import příkazy ani volání s úplnými obory názvů. Je to proto, že Q# vývojové prostředí automaticky načte dva obory názvů: Microsoft.Quantum.Core a Microsoft.Quantum.Intrinsic, které obsahují běžně používané funkce a operace.

K optimalizaci Superposition programu můžete využít výhod Microsoft.Quantum.Measurement oboru názvůMResetZ. MResetZ kombinuje operace měření a resetování do jednoho kroku, jak je znázorněno v následujícím příkladu:

// Import the namespace for the MResetZ operation.
import Microsoft.Quantum.Measurement.*;

@EntryPoint()
operation MeasureOneQubit() : Result {
    // Allocate a qubit. By default, it's in the 0 state.      
    use q = Qubit();  
    // Apply the Hadamard operation, H, to the state.
    // It now has a 50% chance of being measured as 0 or 1. 
    H(q);   
    // Measure and reset the qubit, and then return the result value.
    return MResetZ(q);
}

Vývoj kvantových programů s využitím Q# Azure Quantum

Q# a Azure Quantum představují výkonnou kombinaci pro vývoj a spouštění kvantových programů. S Q# Azure Quantum můžete psát kvantové programy, simulovat jejich chování, odhadnout požadavky na prostředky a spouštět je na skutečném kvantovém hardwaru. Tato integrace vám umožní prozkoumat potenciál kvantových výpočtů a vyvíjet inovativní řešení složitých problémů. Ať už jste začátečník nebo zkušený kvantový vývojář, Q# a Azure Quantum poskytuje nástroje a prostředky, které potřebujete k odemknutí výkonu kvantových výpočtů.

Následující diagram znázorňuje fáze, kterými kvantový program prochází při vývoji pomocí Q# Azure Quantum. Váš program začíná vývojovým prostředím a končí odesláním úlohy do skutečného kvantového hardwaru.

Diagram znázorňující pracovní postup vývoje kvantového programování

Pojďme si rozdělit kroky v diagramu.

Volba vývojového prostředí

Spusťte kvantové programy ve vašem upřednostňovaném vývojovém prostředí. Online editor kódu můžete použít na webu Azure Quantum, hostované poznámkové bloky Jupyter v pracovním prostoru Azure Quantum na webu Azure Portal nebo místní vývojové prostředí pomocí editoru Visual Studio Code. Další informace naleznete v tématu Různé způsoby spouštění Q# programů.

Psaní kvantového programu

Kvantové programy můžete psát pomocí Q# sady Quantum Development Kit (QDK). Pokud chcete začít, přečtěte si článek Rychlý start: Vytvoření prvního Q# programu.

Kromě toho Q#QDK nabízí podporu pro další jazyky pro kvantové výpočty, jako je Qiskit a Cirq.

Integrace s Pythonem

V různých prostředích IDEs můžete používat Q# samostatně nebo společně s Pythonem. K volání Q# operací můžete například použít Q# projekt s hostitelským programem Pythonu. V poznámkových blocích Jupyter můžete také integrovat Q# s Pythonem. Další informace naleznete v tématu Různé způsoby spouštění Q# programů.

Příkaz %%qsharp

Ve výchozím nastavení Q# používají programy v Poznámkových blocích ipykernel Jupyter Balíček Pythonu. Pokud chcete do buňky poznámkového bloku přidat Q# kód, použijte %%qsharp příkaz, který je povolený s balíčkem qsharp Pythonu a za ním váš Q# kód.

Při použití %%qsharpmějte na paměti následující skutečnosti:

  • Nejprve je nutné spustit import qsharp , aby bylo možné povolit %%qsharp.
  • %%qsharp obory na buňku poznámkového bloku, ve které se zobrazí, a změní typ buňky z Pythonu na Q#.
  • Příkaz Pythonu nelze vložit před nebo za %%qsharp.
  • Q# kód, který následuje %%qsharp , musí dodržovat Q# syntaxi. Použijte například // místo # k označení komentářů a ; ke konci řádků kódu.

Poznámka:

Poznámkové bloky Azure na webu Azure Portal zahrnují nejnovější verze qsharp balíčků a azure-quantum balíčků Pythonu, takže nemusíte nic instalovat. Další informace najdete v tématu Začínáme s Q# poznámkovými bloky Azure Quantum.

Odhad prostředků

Než začnete používat skutečný kvantový hardware, budete muset zjistit, jestli váš program může běžet na existujícím hardwaru a kolik prostředků bude spotřebovávat.

Estimátor prostředků Azure Quantum umožňuje vyhodnotit rozhodnutí o architektuře, porovnat technologie qubitu a určit prostředky potřebné k provedení daného kvantového algoritmu. Můžete si vybrat z předem definovaných protokolů odolných proti chybám a zadat předpoklady základního fyzického qubitového modelu.

Další informace najdete v tématu Spuštění prvního odhadu prostředků.

Poznámka:

Estimátor prostředků Azure Quantum je bezplatný a nevyžaduje účet Azure.

Spuštění programu v simulaci

Když zkompilujete a spustíte kvantový program, QDK vytvoří instanci kvantového simulátoru a předá Q# mu kód. Simulátor podle kódu Q# vytvoří simulované qubity a podle zadaných transformací bude manipulovat s jejich stavy. Výsledky kvantových operací ze simulátoru se pak vrátí do programu. Izolování kódu Q# v simulátoru zajišťuje, že algoritmy budou odpovídat zákonům kvantové fyziky a budou správně fungovat i na kvantových počítačích.

Odeslání programu do skutečného kvantového hardwaru

Programy Q# (označované také jako úlohy) můžete odeslat do Azure Quantum prostřednictvím upřednostňovaného vývojového prostředí, a to jak místně, tak online. Další informace najdete v tématu odesílání Q# úloh. Můžete také spouštět a odesílat kvantové okruhy napsané v jazycích Qiskit a Cirq.

Azure Quantum nabízí některé z nejúraznějších a různorodých kvantových hardwarů, které jsou dnes k dispozici od předních oborů. Aktuální seznam podporovaných poskytovatelů hardwaru najdete v tématu Poskytovatelé kvantových výpočtů.

Poznámka:

Cloudový cíl emulátoru Quantinuum H-Series je k dispozici bez účtu Azure. Pokud chcete odeslat úlohu zbývajícím poskytovatelům Azure Quantum, potřebujete účet Azure a kvantový pracovní prostor. Pokud nemáte kvantový pracovní prostor, přečtěte si téma Vytvoření pracovního prostoru Azure Quantum.

Následující diagram znázorňuje základní pracovní postup po odeslání úlohy:

Diagram znázorňující pracovní postup po odeslání úlohy do Azure Quantum