Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Q# je vysoce kvalitní opensourcový programovací jazyk vyvinutý Microsoftem pro psaní kvantových programů. 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 pro 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, což umožňuje, aby stejný kód běžel na různých kvantových procesorech.
- Integrace kvantových a klasických výpočtů:Q# umožňuje integraci kvantových a klasických výpočtů, což je nezbytné pro univerzální kvantové výpočty.
- správa Qubitu:Q# poskytuje integrované operace a funkce pro správu qubitů, včetně vytváření stavů superpozice, propletení qubitů a provádění kvantových měření.
- Respektovat zákony fyziky:Q# a kvantové algoritmy musí dodržovat pravidla kvantové fyziky. Například nemůžete přímo kopírovat nebo přistupovat ke stavu qubitu v Q#.
Další informace o původu Q#naleznete v blogovém příspěvku Proč potřebujeme Q#?.
Q# Struktura programu
Než začnete psát Q# programy, je důležité porozumět jejich struktuře a komponentám. Zvažte následující Q# program s názvem superpozice, 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ářů (//
), Q# 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 Q# program rozdělit do jeho součástí.
Jmenné prostory 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. Jmenné prostory jsou volitelné v Q# programech, to znamená, že program můžete napsat bez definování jmenného prostoru.
Například program Superpozice v tomto příkladu by mohl být napsán i bez oboru názvů jako:
@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;
}
Poznámka:
Každý Q# program může mít pouze jeden namespace
. Pokud nezadáte obor názvů, kompilátor Q# použije název souboru jako obor názvů.
Vstupní body
Každý program Q# musí mít vstupní bod, což je výchozí bod programu. Ve výchozím nastavení Q# kompilátor spustí program z Main()
operace, pokud je k dispozici, která se nachází kdekoli v programu. Volitelně můžete pomocí atributu @EntryPoint()
určit jakoukoli operaci v programu jako bod provádění.
Například v programu superpozice je operace MeasureOneQubit()
vstupním bodem programu, protože má před definicí operace atribut @EntryPoint()
:
@EntryPoint()
operation MeasureOneQubit() : Result {
...
}
Program však může být také zapsán bez atributu @EntryPoint()
přejmenováním operace MeasureOneQubit()
na Main()
, například:
// 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
Typy jsou nezbytné v jakémkoli programovacím jazyce, protože definují data, se kterými může program pracovat.
Q# poskytuje integrované typy, které jsou společné pro většinu jazyků, včetně Int
, Double
, Bool
a String
, a typů definujících rozsahy, pole a n-tice.
Q# také poskytuje typy specifické pro kvantové výpočty. Například typ Result
představuje výsledek měření qubitu a může mít dvě hodnoty: Zero
nebo One
.
V programu Superposition vrátí operace MeasureOneQubit()
typ Result
, který odpovídá návratovému typu operace M
. 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);
...
}
Dalším příkladem kvantového typu je typ Qubit
, který představuje kvantový bit.
Q# také umožňuje definovat vlastní typy. Další informace naleznete v tématu Deklarace typů.
Přidělování qubitů
V Q#přidělíte qubity pomocí klíčového slova use
a typu Qubit
. Qubity se vždy přidělují ve $\ket{0}$ stavu.
Například program superpozice definuje jeden qubit a uloží ho do proměnné q
:
// 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.
Kvantové operace
Po přidělení qubitu ho můžete předat operacím a funkcím. 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. V programu superpozice operace MeasureOneQubit()
nepřijímá žádné parametry a vrací typ Result
:
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, H
v Superposition
programu. Vzhledem k qubitu v bázi Z, H
nastaví qubit do sudé superpozice, kde má 50% pravděpodobnost, že bude změřen 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
, PauliY
nebo PauliZ
.
Measure
vrátí typ Result
, buď Zero
nebo 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])
.
Například program superpozice používá operaci M
:
// Measure the qubit in the Z-basis.
let result = M(q);
Resetování qubitů
Ve stavu Q# v musí $\ket{0}$ být, když jsou uvolněny, aby se zabránilo chybám v kvantovém hardwaru. Qubit můžete resetovat do $\ket{0}$ stavu pomocí operace Reset
na konci programu. Jestliže nedojde k resetování qubitu, dojde k chybě za běhu.
// Reset a qubit.
Reset(q);
Obory názvů standardní knihovny
Standardní Q# knihovna má integrované obory názvů, které obsahují funkce a operace, které můžete použít v kvantových programech. Například obor názvů Microsoft.Quantum.Intrinsic
obsahuje běžně používané operace a funkce, jako M
měřit výsledky a Message
zobrazit uživatelské zprávy 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 provádějí 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!");
Poznámka:
Program Superpozice neobsahuje žádné příkazy import
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.
Obor názvů Microsoft.Quantum.Measurement
můžete využít pomocí operace MResetZ
k optimalizaci programu superpozice.
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);
}
Naučte se vyvíjet kvantové programy pomocí Q# a 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.
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 v Q# pomocí 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ě Q# nabízí QDK podporu pro další jazyky pro kvantové výpočty, jako jsou 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. Můžete například použít projekt Q# s hostitelským programem Pythonu k volání Q# operací nebo integraci Q# s Pythonem v Poznámkových blocích Jupyter. Další informace najdete v tématu Integrace Q# a Pythonu.
Příkaz %%qsharp
Ve výchozím nastavení používají programy v Jupyter Notebooky pythonový balíček. 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í %%qsharp
mějte na paměti následující skutečnosti:
- Nejprve je nutné spustit
import qsharp
, aby bylo možné povolit%%qsharp
. -
%%qsharp
se vztahuje na buňku poznámkového bloku, ve které se objeví, 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.
Odhad prostředků
Než začnete používat skutečný kvantový hardware, musíte 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 naleznete v části Jak spustit první odhad zdrojů.
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.
Odešlete svůj program do skutečného kvantového hardwaru
Jakmile program otestujete v simulaci, můžete ho spustit na skutečném kvantovém hardwaru. Při spuštění kvantového programu v Azure Quantum vytvoříte a spustíte úlohu. Pokud chcete odeslat úlohu poskytovatelům Azure Quantum, potřebujete účet Azure a pracovní prostor quantum. Pokud nemáte kvantový pracovní prostor, přečtěte si téma Vytvoření pracovního prostoru Azure Quantum.
Azure Quantum nabízí některé z nejúraznějších a různorodých kvantových hardwarů. Aktuální seznam podporovaných poskytovatelů hardwaru najdete v tématu Poskytovatelé kvantových výpočtů.
Jakmile úlohu odešlete, Azure Quantum spravuje životní cyklus úlohy, včetně plánování, spouštění a monitorování úloh. Stav úlohy můžete sledovat a zobrazit výsledky na portálu Azure Quantum.