Přeskočit na hlavní obsah

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")

Output of the previous code cell

Viz Standard gates v API dokumentaci circuit library.

Nevíš, jak se tvůj Gate jmenuje? Zkus se zeptat Qiskit Code Assistant.

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")

Output of the previous code cell

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")

Output of the previous code cell

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 2n2^n čísel v jednom stavu, ale implementace může být nákladná.
  • Bázové kódování, které kóduje celé číslo kk přípravou odpovídajícího bázového stavu k|k\rangle.
  • Ú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")

Output of the previous code cell

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")

Output of the previous code cell

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")

Output of the previous code cell

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")

Output of the previous code cell

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

Doporučení