Efektivní simulace stabilizátorových obvodů s primitivami Qiskit Aer
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 nebo novější verze.
qiskit[all]~=2.4.0
qiskit-aer~=0.17
Tato stránka ukazuje, jak používat primitiva Qiskit Aer k efektivní simulaci stabilizátorových obvodů, včetně těch, které podléhají Pauliho šumu.
Stabilizátorové obvody, známé také jako Cliffordovy obvody, jsou důležitou omezenou třídou kvantových obvodů, které lze efektivně simulovat klasicky. Existuje několik ekvivalentních způsobů, jak definovat stabilizátorové obvody. Jedna definice říká, že stabilizátorový obvod je kvantový obvod, který se skládá výhradně z následujících hradel:
Pomocí Hadamarda a S lze sestavit libovolné hradlo pro Pauliho rotaci (, a ) s úhlem z množiny (až na globální fázi), takže tato hradla lze do definice zahrnout také.
Stabilizátorové obvody jsou důležité pro studium kvantové korekce chyb. Jejich klasická simulovatelnost je také činí užitečnými pro ověřování výstupu kvantových počítačů. Představ si například, že chceš spustit kvantový obvod využívající 100 qubitů na kvantovém počítači. Jak zjistíš, že se kvantový počítač chová správně? Kvantový obvod na 100 qubitech je mimo dosah hrubé klasické simulace. Úpravou obvodu tak, aby se stal stabilizátorovým obvodem, můžeš na kvantovém počítači spouštět obvody s podobnou strukturou jako tvůj požadovaný obvod, ale které lze simulovat na klasickém počítači. Ověřením výstupu kvantového počítače na stabilizátorových obvodech získáš jistotu, že se správně chová i na nestabilizátorových obvodech. Příklad tohoto přístupu v praxi viz Evidence for the utility of quantum computing before fault tolerance.
Přesná a zašuměná simulace s primitivami Qiskit Aer ukazuje, jak pomocí Qiskit Aer provádět přesné a zašuměné simulace obecných kvantových obvodů. Uvažuj ukázkový obvod z tohoto článku – obvod s 8 qubity sestavený pomocí efficient_su2:
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer
from qiskit.circuit.library import efficient_su2
n_qubits = 8
circuit = efficient_su2(n_qubits)
circuit.draw("mpl")
S Qiskit Aer jsme tento obvod dokázali snadno simulovat. Předpokládejme ale, že nastavíme počet qubitů na 500:
n_qubits = 500
circuit = efficient_su2(n_qubits)
# don't try to draw the circuit because it's too large
Protože náklady na simulaci kvantových obvodů rostou exponenciálně s počtem qubitů, takový velký obvod by obecně překročil schopnosti i výkonného simulátoru, jako je Qiskit Aer. Klasická simulace obecných kvantových obvodů se stává neproveditelnou, když počet qubitů překročí přibližně 50 až 100. Všimni si však, že obvod efficient_su2 je parametrizován úhly na hradlech a . Pokud jsou všechny tyto úhly z množiny , pak je obvod stabilizátorový a lze jej efektivně simulovat!
V následující buňce spustíme obvod s primitivem sampler podpořeným simulátorem stabilizátorových obvodů, přičemž parametry jsou zvoleny náhodně tak, aby byl obvod zaručeně stabilizátorový.
import numpy as np
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_aer import AerSimulator
from qiskit_aer.primitives import SamplerV2 as Sampler
measured_circuit = circuit.copy()
measured_circuit.measure_all()
rng = np.random.default_rng(1234)
params = rng.choice(
[0, np.pi / 2, np.pi, 3 * np.pi / 2],
size=circuit.num_parameters,
)
# Initialize a Sampler backed by the stabilizer circuit simulator
exact_sampler = Sampler(
options=dict(backend_options=dict(method="stabilizer"))
)
# The circuit needs to be transpiled to the AerSimulator target
pass_manager = generate_preset_pass_manager(
1, AerSimulator(method="stabilizer")
)
isa_circuit = pass_manager.run(measured_circuit)
pub = (isa_circuit, params)
job = exact_sampler.run([pub])
result = job.result()
pub_result = result[0]
counts = pub_result.data.meas.get_counts()
Simulátor stabilizátorových obvodů také podporuje zašuměnou simulaci, ale pouze pro omezenou třídu šumových modelů. Konkrétně jakýkoli kvantový šum musí být charakterizován kanálem Pauliho chyby. Depolarizační chyba do této kategorie spadá, takže ji lze simulovat také. Simulovat lze i klasické šumové kanály jako chyba čtení.
Následující buňka kódu spouští stejnou simulaci jako dříve, tentokrát ale s šumovým modelem, který přidává depolarizační chybu 2 % ke každému hradlu CX, a zároveň chybu čtení, která každý naměřený bit překlopí s pravděpodobností 5 %.
from qiskit_aer.noise import NoiseModel, depolarizing_error, ReadoutError
noise_model = NoiseModel()
cx_depolarizing_prob = 0.02
bit_flip_prob = 0.05
noise_model.add_all_qubit_quantum_error(
depolarizing_error(cx_depolarizing_prob, 2), ["cx"]
)
noise_model.add_all_qubit_readout_error(
ReadoutError(
[
[1 - bit_flip_prob, bit_flip_prob],
[bit_flip_prob, 1 - bit_flip_prob],
]
)
)
noisy_sampler = Sampler(
options=dict(
backend_options=dict(method="stabilizer", noise_model=noise_model)
)
)
job = noisy_sampler.run([pub])
result = job.result()
pub_result = result[0]
counts = pub_result.data.meas.get_counts()
Nyní použijeme primitiv estimator podpořený simulátorem stabilizátorových obvodů k výpočtu střední hodnoty observablu . Díky speciální struktuře stabilizátorových obvodů bude výsledek s velkou pravděpodobností 0.
from qiskit.quantum_info import SparsePauliOp
from qiskit_aer.primitives import EstimatorV2 as Estimator
observable = SparsePauliOp("Z" * n_qubits)
exact_estimator = Estimator(
options=dict(backend_options=dict(method="stabilizer")),
)
isa_circuit = pass_manager.run(circuit)
pub = (isa_circuit, observable, params)
job = exact_estimator.run([pub])
result = job.result()
pub_result = result[0]
exact_value = float(pub_result.data.evs)
exact_value
0.0
Další kroky
- Pokud chceš simulovat obvody s Qiskit Aer, viz Přesná a zašuměná simulace s primitivami Qiskit Aer.
- Prostuduj dokumentaci Qiskit Aer.