Skip to main content
IBM Quantum Platform

Qiskit Aer 프리미티브를 활용한 안정화 회로의 효율적 시뮬레이션

  • 이 페이지의 코드는 다음 요구 사항을 사용하여 개발되었습니다. 다음 버전 이상을 사용하는 것이 좋습니다.

    qiskit[all]~=2.5.2
    qiskit-aer~=0.17
    

이 페이지는 키스킷 에어 프리미티브를 사용하여 폴리 노이즈가 있는 회로를 포함한 안정기 회로를 효율적으로 시뮬레이션하는 방법을 보여줍니다.

클리포드 회로라고도 하는 안정화 회로는 고전적으로 효율적으로 시뮬레이션할 수 있는 중요한 제한적 종류의 양자 회로입니다. 스태빌라이저 회로를 정의하는 몇 가지 동등한 방법이 있습니다. 한 가지 정의는 안정화 회로는 다음 게이트로만 구성된 양자 회로라는 것입니다:

하다마드와 S를 사용하면 모든 폴리 회전 게이트( RxR_x, RyR_yRzR_z ) that has an angle contained in the set {0,π2,π,3π2}\{0, \frac{\pi}{2}, \pi, \frac{3\pi}{2}\} (up to global phase), so we can include these gates in the definition as well.

안정화 회로는 양자 오류 수정 연구에 중요한 역할을 합니다. 고전적인 시뮬레이션 가능성으로 인해 양자 컴퓨터의 출력을 검증하는 데도 유용합니다. 예를 들어 양자 컴퓨터에서 100개의 큐비트를 사용하는 양자 회로를 실행하고 싶다고 가정해 보겠습니다. 양자 컴퓨터가 올바르게 작동하는지 어떻게 알 수 있나요? 100큐비트의 양자 회로는 무차별 대입 방식의 기존 시뮬레이션으로는 불가능합니다. 안정화 회로가 되도록 회로를 수정하면 원하는 회로와 구조가 비슷하지만 기존 컴퓨터에서 시뮬레이션할 수 있는 회로를 양자 컴퓨터에서 실행할 수 있습니다. 안정화 회로에서 양자 컴퓨터의 출력을 확인하면 비안정화 회로에서도 올바르게 작동하고 있다는 확신을 얻을 수 있습니다. 이 아이디어를 실제로 적용한 예는 내결함성 이전의 양자 컴퓨팅의 유용성에 대한 증거를 참조하세요.

키스킷 에어 프리미티브를 사용한 정확하고 잡음이 많은 시뮬레이션에서는 키스킷 에어를 사용하여 일반 양자 회로의 정확하고 잡음이 많은 시뮬레이션을 수행하는 방법을 보여줍니다. 이 글에서 사용된 예제 회로는 효율적인_su2를 사용하여 구축된 8-큐비트 회로입니다:

from qiskit.circuit.library import efficient_su2

n_qubits = 8
circuit = efficient_su2(n_qubits)
circuit.draw("mpl")

Output:

Output of the previous code cell

키스킷 에어를 사용하여 이 회로를 쉽게 시뮬레이션할 수 있었습니다. 하지만 큐비트 수를 500으로 설정한다고 가정해 보겠습니다:

n_qubits = 500
circuit = efficient_su2(n_qubits)
# don't try to draw the circuit because it's too large

양자 회로를 시뮬레이션하는 비용은 큐비트 수에 따라 기하급수적으로 증가하기 때문에, 이러한 대규모 회로는 일반적으로 키스킷 에어와 같은 고성능 시뮬레이터의 성능을 초과합니다. 일반적인 양자 회로의 고전적인 시뮬레이션은 큐비트 수가 약 50~100 큐비트를 초과하면 실행이 불가능해집니다. 그러나 efficient_su2 회로는 RyR_yRzR_z 게이트의 각도에 따라 파라미터화되어 있다는 점에 유의하세요. 이 모든 각도가 세트에 포함되어 있으면 {0,π2,π,3π2}\{0, \frac{\pi}{2}, \pi, \frac{3\pi}{2}\}, 회로는 안정기 회로이며 효율적으로 시뮬레이션할 수 있습니다!

다음 셀에서는 안정기 회로 시뮬레이터가 지원하는 샘플러 프리미티브로 회로를 실행하고, 회로가 안정기 회로가 되도록 임의로 선택한 파라미터를 사용하여 회로를 실행합니다.

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

스태빌라이저 회로 시뮬레이터는 노이즈 시뮬레이션도 지원하지만 제한된 종류의 노이즈 모델에 대해서만 지원합니다. 특히 모든 양자 잡음은 반드시 폴리 오류 채널을 특징으로 해야 합니다. 탈분극 오류도 이 범주에 속하므로 시뮬레이션할 수 있습니다. 판독 오류와 같은 고전적인 노이즈 채널도 시뮬레이션할 수 있습니다.

다음 코드 셀은 이전과 동일한 시뮬레이션을 실행하지만 이번에는 각 CX 게이트에 2%의 디분극 오차를 추가하는 노이즈 모델과 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()

이제 안정기 시뮬레이터가 지원하는 추정기 프리미티브를 사용하여 관측값 ZZZZZ \cdots Z 의 기대값을 계산해 보겠습니다. 안정기 회로의 특수한 구조로 인해 결과는 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

Output:

0.0

다음 단계

권장사항
이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.