Knihovna Circuit
Verze balíčků
Kód na této stránce byl vyvinut s použitím následujících požadavků. Doporučujeme používat tyto verze nebo novější.
qiskit[all]~=2.3.0
Qiskit SDK obsahuje knihovnu oblíbených Circuit, které můžeš využít jako stavební bloky ve svých vlastních programech. Použití předem definovaných Circuit šetří čas strávený průzkumem, psaním kódu a laděním. Knihovna zahrnuje oblíbené Circuit z oblasti kvantového výpočtu, Circuit, které je obtížné klasicky simulovat, a Circuit užitečné pro benchmarking kvantového hardwaru.
Tato stránka uvádí různé kategorie Circuit, které knihovna poskytuje. Úplný seznam Circuit najdeš v API dokumentaci circuit library.
Standardní Gate
Knihovna Circuit také obsahuje standardní kvantové Gate. Některé jsou základnější Gate (například UGate) a jiné jsou víceQubitové Gate, které obvykle potřebují být sestaveny z jedno- a dvouQubitových Gate. Chceš-li přidat importované Gate do svého Circuit, použij metodu append; prvním argumentem je Gate a dalším argumentem je seznam Qubitů, na které se Gate aplikuje.
Například následující buňka kódu vytvoří Circuit s Hadamardovým Gate a multi-controlled-X Gate.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit
from qiskit.circuit.library import HGate, MCXGate
mcx_gate = MCXGate(3)
hadamard_gate = HGate()
qc = QuantumCircuit(4)
qc.append(hadamard_gate, [0])
qc.append(mcx_gate, [0, 1, 2, 3])
qc.draw("mpl")
Viz Standard gates v API dokumentaci circuit library.
N-lokální Circuit
Tyto Circuit střídají vrstvy jednoqubitových rotačních Gate s vrstvami víceQubitových provazujících Gate.
Tato rodina Circuit je oblíbená ve variačních kvantových algoritmech, protože dokáže produkovat širokou škálu kvantových stavů. Variační algoritmy upravují parametry Gate tak, aby nalezly stavy s určitými vlastnostmi (například stavy, které představují dobré řešení optimalizačního problému). Pro tento účel je mnoho Circuit v knihovně parametrizovaných, což znamená, že je můžeš definovat bez pevně daných hodnot.
Následující buňka kódu importuje Circuit n_local, ve které jsou provazující Gate dvouQubitové Gate. Tento Circuit prokládá bloky parametrizovaných jednoqubitových Gate s provazujícími bloky dvouQubitových Gate. Následující kód vytvoří tříQubitový Circuit s jednoqubitovými RX-Gate a dvouQubitovými CZ-Gate.
from qiskit.circuit.library import n_local
two_local = n_local(3, "rx", "cz")
two_local.draw("mpl")
Ze atributu parameters získáš objekt podobný seznamu s parametry Circuit.
two_local.parameters
ParameterView([ParameterVectorElement(θ[0]), ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]), ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]), ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]), ParameterVectorElement(θ[7]), ParameterVectorElement(θ[8]), ParameterVectorElement(θ[9]), ParameterVectorElement(θ[10]), ParameterVectorElement(θ[11])])
Můžeš to také použít k přiřazení těchto parametrů skutečným hodnotám pomocí slovníku ve tvaru { Parameter: number }. Pro ukázku následující buňka kódu přiřadí každý parametr v Circuit hodnotě 0.
bound_circuit = two_local.assign_parameters(
{p: 0 for p in two_local.parameters}
)
bound_circuit.decompose().draw("mpl")
Další informace najdeš v části N-local gates v API dokumentaci circuit library nebo absolvuj kurz návrhu variačních algoritmů na IBM Quantum Learning.
Circuit pro kódování dat
Tyto parametrizované Circuit kódují data na kvantové stavy pro zpracování algoritmy kvantového strojového učení. Mezi Circuit podporované Qiskit patří:
- Amplitudové kódování, které kóduje každé číslo do amplitudy bázového stavu. Tímto způsobem lze uložit čísel v jednom stavu, ale implementace může být nákladná.
- Bázové kódování, které kóduje celé číslo přípravou odpovídajícího bázového stavu .
- Úhlové kódování, které nastavuje každé číslo v datech jako úhel otočení v parametrizovaném Circuit.
Nejlepší přístup závisí na specifikách tvé aplikace. Na současných kvantových počítačích však často používáme Circuit s úhlovým kódováním, jako je zz_feature_map.
from qiskit.circuit.library import zz_feature_map
features = [0.2, 0.4, 0.8]
feature_map = zz_feature_map(feature_dimension=len(features))
encoded = feature_map.assign_parameters(features)
encoded.draw("mpl")
Viz Data encoding circuits v API dokumentaci circuit library.
Circuit pro časový vývoj
Tyto Circuit simulují vývoj kvantového stavu v čase. Používej Circuit pro časový vývoj ke zkoumání fyzikálních jevů, jako je přenos tepla nebo fázové přechody v systému. Circuit pro časový vývoj jsou také základním stavebním blokem chemických vlnových funkcí (jako jsou zkušební stavy unitárního clusterového přístupu) a algoritmu QAOA, který používáme pro optimalizační problémy.
from qiskit.circuit.library import PauliEvolutionGate
from qiskit.circuit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp
# Prepare an initial state with a Hadamard on the middle qubit
state = QuantumCircuit(3)
state.h(1)
hamiltonian = SparsePauliOp(["ZZI", "IZZ"])
evolution = PauliEvolutionGate(hamiltonian, time=1)
# Evolve state by appending the evolution gate
state.compose(evolution, inplace=True)
state.draw("mpl")
Přečti si API dokumentaci PauliEvolutionGate.
Circuit pro benchmarking a teorii složitosti
Circuit pro benchmarking nám dávají představu o tom, jak dobře náš hardware skutečně funguje, a Circuit z oblasti teorie složitosti nám pomáhají pochopit, jak obtížné jsou problémy, které chceme řešit.
Například benchmark „quantum volume" měří, jak přesně kvantový počítač provádí určitý typ náhodného kvantového Circuit. Skóre kvantového počítače roste s velikostí Circuit, který dokáže spolehlivě spustit. Zohledňuje to všechny aspekty počítače, včetně počtu Qubitů, věrnosti instrukcí, konektivity Qubitů a softwarového zásobníku Transpileru a následného zpracování výsledků. Více o quantum volume si přečti v původním článku o quantum volume.
Následující kód ukazuje příklad Circuit quantum volume sestaveného v Qiskit, který běží na čtyřech Qubitech (bloky unitary jsou náhodné dvouQubitové Gate).
from qiskit.circuit.library import quantum_volume
quantum_volume(4).draw("mpl")
Knihovna Circuit také zahrnuje Circuit, o nichž se předpokládá, že je obtížné klasicky simulovat, jako jsou Circuit okamžitých kvantových polynomů (iqp). Tyto Circuit vkl ádají určité diagonální Gate (v výpočetní bázi) mezi bloky Hadamardových Gate.
Mezi další Circuit patří grover_operator pro použití v Groverově algoritmu a Circuit fourier_checking pro problém kontroly Fourierovy transformace. Tyto Circuit najdeš v části Particular quantum circuits v API dokumentaci circuit library.
Aritmetické Circuit
Aritmetické operace jsou klasické funkce, jako je sčítání celých čísel a bitové operace. Mohou být užitečné s algoritmy, jako je odhadování amplitud pro finanční aplikace, a v algoritmech jako je HHL algoritmus, který řeší soustavy lineárních rovnic.
Jako příklad zkusíme sečíst dvě tříbitová čísla pomocí Circuit „ripple-carry" k provedení sčítání na místě (FullAdderGate). Tato sčítačka sečte dvě čísla (budeme je nazývat „A" a „B") a výsledek zapíše do registru, který obsahoval B. V následujícím příkladu je A=2 a B=3.
from qiskit.circuit.library import FullAdderGate
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
adder = FullAdderGate(3) # Adder of 3-bit numbers
# Create the number A=2
reg_a = QuantumRegister(3, "a")
number_a = QuantumCircuit(reg_a)
number_a.initialize(2) # Number 2; |010>
# Create the number B=3
reg_b = QuantumRegister(3, "b")
number_b = QuantumCircuit(reg_b)
number_b.initialize(3) # Number 3; |011>
# Create a circuit to hold everything, including a classical register for
# the result
qregs = [
QuantumRegister(1, "cin"),
QuantumRegister(3, "a"),
QuantumRegister(3, "b"),
QuantumRegister(1, "cout"),
]
reg_result = ClassicalRegister(3)
circuit = QuantumCircuit(*qregs, reg_result)
# Compose number initializers with the adder. Adder stores the result to
# register B, so we'll measure those qubits.
circuit = (
circuit.compose(number_a, qubits=reg_a)
.compose(number_b, qubits=reg_b)
.compose(adder)
)
circuit.measure(reg_b, reg_result)
circuit.draw("mpl")
Simulace Circuit ukazuje, že pro všech 1024 měření (tj. s pravděpodobností 1.0) výstupem je 5.
from qiskit.primitives import StatevectorSampler
result = StatevectorSampler().run([circuit]).result()
print(f"Count data:\n {result[0].data.c0.get_int_counts()}")
Count data:
{5: 1024}
Viz Arithmetic v API dokumentaci circuit library.
Další kroky
- Nauč se pokročilé metody vytváření Circuit v tématu Sestavení Circuit.
- Podívej se na příklad použití Circuit v tutoriálu Groverův algoritmus.
- Prostuduj si referenci API circuit library.