Ú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ě Bool
Int
Double
, , a String
a 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, H
v 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
, PauliY
nebo PauliZ
. Measure
Result
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.
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í %%qsharp
mě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: