Přeskočit na hlavní obsah

Efektivní simulace stabilizátorových Circuit s primitiivami 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.3.0
qiskit-aer~=0.17

Tato stránka ukazuje, jak používat primitiva Qiskit Aer k efektivní simulaci stabilizátorových Circuit, včetně těch, které podléhají Pauliho šumu.

Stabilizátorové Circuit, známé také jako Cliffordovy Circuit, jsou důležitou omezenou třídou kvantových Circuit, které lze efektivně simulovat klasicky. Existuje několik ekvivalentních způsobů, jak definovat stabilizátorové Circuit. Jedna definice říká, že stabilizátorový Circuit je kvantový Circuit, který se skládá výhradně z následujících Gate:

Pomocí Hadamarda a S lze sestavit libovolný Gate pro Pauliho rotaci (RxR_x, RyR_y a RzR_z) s úhlem z množiny {0,π2,π,3π2}\{0, \frac{\pi}{2}, \pi, \frac{3\pi}{2}\} (až na globální fázi), takže tyto Gate lze do definice zahrnout také.

Stabilizátorové Circuit 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ý Circuit využívající 100 Qubitů na kvantovém počítači. Jak zjistíš, že se kvantový počítač chová správně? Kvantový Circuit na 100 Qubitech je mimo dosah hrubé klasické simulace. Úpravou Circuit tak, aby se stal stabilizátorovým Circuit, můžeš na kvantovém počítači spouštět Circuit s podobnou strukturou jako tvůj požadovaný Circuit, ale které lze simulovat na klasickém počítači. Ověřením výstupu kvantového počítače na stabilizátorových Circuit získáš jistotu, že se správně chová i na nestabilizátorových Circuit. 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 primitiivami Qiskit Aer ukazuje, jak pomocí Qiskit Aer provádět přesné a zašuměné simulace obecných kvantových Circuit. Uvažuj ukázkový Circuit z tohoto článku – Circuit 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")

Output of the previous code cell

S Qiskit Aer jsme tento Circuit 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 Circuit rostou exponenciálně s počtem Qubitů, takový velký Circuit by obecně překročil schopnosti i výkonného simulátoru, jako je Qiskit Aer. Klasická simulace obecných kvantových Circuit se stává neproveditelnou, když počet Qubitů překročí přibližně 50 až 100. Všimni si však, že Circuit efficient_su2 je parametrizován úhly na Gate RyR_y a RzR_z. Pokud jsou všechny tyto úhly z množiny {0,π2,π,3π2}\{0, \frac{\pi}{2}, \pi, \frac{3\pi}{2}\}, pak je Circuit stabilizátorový a lze jej efektivně simulovat!

V následující buňce spustíme Circuit s primitivem Sampler podpořeným simulátorem stabilizátorových Circuit, přičemž parametry jsou zvoleny náhodně tak, aby byl Circuit 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 Circuit 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 Gate 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 Circuit k výpočtu střední hodnoty observablu ZZZZZ \cdots Z. Díky speciální struktuře stabilizátorových Circuit 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

Doporučení