양자컴퓨터 1,000번 실행하면 매번 50:50일까? 실제 IBM QPU로 10번 반복해봤다

양자컴퓨터에서 같은 회로를 1,000번 실행하면 항상 비슷한 결과가 나올까요? 이번 글에서는 IBM의 실제 QPU를 직접 실행하여 동일한 양자회로를 반복 실행해 결과 비율이 얼마나 달라지는지 직접 비교해보았습니다. 아래 글을 함께 살펴보시죠.

실제 양자컴퓨터에서 1,000샷씩 10회 반복 실행한 QPU 실험
같은 양자회로를 실제 QPU에서 1,000샷씩 반복하면 매번 완전히 같은 결과가 나오는지 확인합니다.

양자컴퓨터에서 똑같은 회로를 똑같이 실행하면 결과도 항상 똑같을까요? 이번에는 시뮬레이터가 아니라 IBM의 실제 양자 프로세서에서 하나의 큐비트를 중첩 상태로 만든 뒤 1,000회 측정을 여러 번 반복해봤습니다. 각 실행에서 0과 1의 비율이 얼마나 달라지는지 비교하면 양자 측정의 확률성과 실제 하드웨어의 특성을 함께 살펴볼 수 있습니다.

1. 이번 실험에서 확인하려는 것

Hadamard 게이트를 하나의 큐비트에 적용하면 이상적인 상태에서는 0과 1을 각각 약 50%의 확률로 측정하게 됩니다. 하지만 1,000번 측정했다고 해서 정확히 500번씩 나오는 것은 아닙니다.

이번 실험에서는 같은 회로를 1,000샷씩 10회 반복하고, 매 회차마다 0과 1이 몇 번 측정됐는지 확인합니다. 이를 통해 단순한 확률적 흔들림뿐 아니라 실제 QPU에서 결과가 어느 정도 일관되게 나타나는지도 살펴봅니다.

  • 사용 회로: 1큐비트 Hadamard 회로
  • 측정 횟수: 회차당 1,000 shots
  • 반복 횟수: 10회
  • 총 측정 횟수: 10,000 shots
  • 실행 환경: IBM Quantum 실제 QPU

2. 왜 정확히 50:50이 나오지 않을까?

양자회로가 이상적으로 동작한다고 해도 1,000회의 측정 결과가 정확히 500 대 500으로 나올 필요는 없습니다. 각 측정은 확률적으로 결정되기 때문에 같은 실험을 반복할 때마다 결과가 조금씩 달라질 수 있습니다.

이상적인 50% 확률에서 1,000번 측정할 경우 비율의 통계적 표준편차는 약 1.58%포인트입니다. 단순한 샘플링 변동만 생각하면 많은 실행이 대략 50% 부근에 모이지만, 각각의 회차는 서로 조금 다른 값을 가질 수 있습니다.

실제 QPU에서는 여기에 측정 오류, 게이트 오류, 큐비트 상태의 변화와 같은 하드웨어 요인이 추가될 수 있습니다. 따라서 단순한 시뮬레이터보다 결과가 어느 한쪽으로 조금 치우치거나 실행별 차이가 커질 가능성도 있습니다.

3. 실험에 사용할 양자회로

회로는 최대한 단순하게 구성했습니다. 큐비트 하나를 |0⟩ 상태에서 시작한 뒤 Hadamard 게이트를 적용하고 바로 측정합니다.

from qiskit import QuantumCircuit

qc = QuantumCircuit(1)

qc.h(0)
qc.measure_all()

print(qc)

이론적으로 Hadamard 게이트를 통과한 큐비트는 측정 전까지 0과 1이 같은 확률을 갖는 중첩 상태가 됩니다.

4. 실제 IBM QPU에 맞게 회로 변환하기

작성한 추상적인 양자회로를 실제 QPU에서 바로 실행할 수 있는 것은 아닙니다. 양자 프로세서마다 사용할 수 있는 게이트와 큐비트 연결 구조가 다르기 때문에 QPU가 이해할 수 있는 ISA 회로로 변환하는 과정이 필요합니다.

from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit.transpiler import generate_preset_pass_manager

service = QiskitRuntimeService()

backend = service.least_busy(
    operational=True,
    simulator=False
)

print("선택된 QPU:", backend.name)

pm = generate_preset_pass_manager(
    backend=backend,
    optimization_level=1,
    seed_transpiler=42
)

isa_circuit = pm.run(qc)

print(isa_circuit)

여기서는 현재 사용 가능한 실제 양자 프로세서 가운데 대기 작업이 비교적 적은 backend를 선택한 뒤, 동일한 회로를 해당 장치에 맞게 변환합니다.

5. 1,000샷을 10회 반복 실행하기

이번 실험의 핵심입니다. 하나의 ISA 회로를 10개의 독립적인 실험 단위로 제출하고 각각 1,000샷씩 측정합니다.

from qiskit_ibm_runtime import SamplerV2 as Sampler
import pandas as pd

sampler = Sampler(mode=backend)

shots = 1000
repeat_count = 10

# 같은 회로를 10개의 PUB으로 제출
pubs = [isa_circuit] * repeat_count

job = sampler.run(
    pubs,
    shots=shots
)

result = job.result()

rows = []

for i, pub_result in enumerate(result, start=1):
    counts = pub_result.data.meas.get_counts()

    count_0 = counts.get("0", 0)
    count_1 = counts.get("1", 0)

    ratio_0 = count_0 / shots * 100
    ratio_1 = count_1 / shots * 100

    rows.append({
        "회차": i,
        "0 횟수": count_0,
        "1 횟수": count_1,
        "0 비율(%)": ratio_0,
        "1 비율(%)": ratio_1
    })

df = pd.DataFrame(rows)

print(df)

SamplerV2에서는 각 회로 실행 결과가 별도의 결과 객체로 반환되기 때문에 각 회차의 측정값을 따로 확인할 수 있습니다.

6. 실제 QPU 반복 측정 결과

실제 QPU에서 1,000샷씩 10회 반복 실행한 측정값 1의 비율 그래프
실제 QPU에서 동일한 양자회로를 1,000샷씩 10회 실행한 결과입니다. 각 회차의 측정값 1 비율이 이상적인 50%를 중심으로 조금씩 달라지는 모습을 확인할 수 있습니다.
회차0 횟수1 횟수1 비율
150749349.3%
249051051.0%
351848248.2%
449350750.7%
547452652.6%
651148948.9%
748251851.8%
851448648.6%
949850250.2%
1050549549.5%

10번의 실행 결과는 완전히 같지 않았습니다. 가장 낮은 1 측정 비율은 48.2%, 가장 높은 값은 52.6%였으며, 10회 평균은 50.08%였습니다.

7. 실행마다 결과가 얼마나 달라졌는지 계산하기

mean_ratio = df["1 비율(%)"].mean()
std_ratio = df["1 비율(%)"].std()
min_ratio = df["1 비율(%)"].min()
max_ratio = df["1 비율(%)"].max()

print(f"평균: {mean_ratio:.2f}%")
print(f"표준편차: {std_ratio:.2f}%p")
print(f"최솟값: {min_ratio:.2f}%")
print(f"최댓값: {max_ratio:.2f}%")
print(f"최대-최소 차이: {max_ratio-min_ratio:.2f}%p")

단순히 각 회차가 50%에 가까운지만 보는 것보다 평균, 표준편차, 최솟값과 최댓값을 함께 확인하면 반복 실행 결과의 안정성을 좀 더 객관적으로 볼 수 있습니다.

8. 시뮬레이터와 비교하면 무엇이 다를까?

이상적인 양자 시뮬레이터와 실제 QPU의 측정 결과 및 오류 요인 비교
이상적인 양자 시뮬레이터는 샷 수에 따른 통계적 변동만 나타나는 반면, 실제 QPU에서는 노이즈·캘리브레이션·판독 오류 등 물리적 하드웨어 요인이 추가로 영향을 줄 수 있습니다.

이상적인 시뮬레이터에서도 1,000샷을 사용하면 매번 정확히 50:50이 나오지는 않습니다. 유한한 횟수만 측정하기 때문에 샘플링에 따른 통계적 변동이 존재하기 때문입니다.

그러나 실제 QPU에는 샘플링 변동 이외에도 게이트 오류, 읽기 오류, 큐비트의 환경 변화 등 실제 장치에서 발생하는 요소가 추가될 수 있습니다. 따라서 실제 QPU와 시뮬레이터의 차이를 비교할 때는 단순히 ‘50%에서 얼마나 벗어났는가’만으로 하드웨어 오류를 단정해서는 안 됩니다.

9. 이번 실험에서 주의할 점

  • 실제 QPU는 실행 시점과 장치 상태에 따라 결과가 달라질 수 있습니다.
  • 1,000샷 자체에도 통계적 변동이 존재합니다.
  • 10개의 동일 회로를 한 작업으로 제출한 결과는 장시간에 걸친 장치 드리프트를 측정하는 실험과는 다릅니다.
  • 시간에 따른 변화를 확인하려면 서로 다른 시간대 또는 날짜에 별도의 작업을 실행해야 합니다.
  • 한 장치에서 얻은 결과를 모든 양자 프로세서에 일반화할 수는 없습니다.

10. 결론: 같은 양자회로도 결과는 매번 조금씩 달라진다

이번 실험의 목적은 실제 양자컴퓨터가 매번 완전히 다른 결과를 내놓는다는 것을 보여주는 것이 아닙니다. 오히려 같은 회로와 같은 1,000샷 조건에서도 측정 결과가 일정한 범위 안에서 조금씩 변한다는 점을 확인하는 데 의미가 있습니다.

실제 실행에서는 1의 비율이 평균 50.08%였고, 실행 사이의 범위는 4.4%p였습니다. 이 값이 이상적인 50%에서 얼마나 벗어나는지, 그리고 시뮬레이터 반복 실행과 비교했을 때 변동폭이 얼마나 다른지를 살펴보면 실제 양자 하드웨어의 특성을 조금 더 구체적으로 이해할 수 있습니다.

관련 실험

참고자료

  • IBM Quantum Documentation — SamplerV2
  • IBM Quantum Documentation — Sampler inputs and outputs
  • IBM Quantum Documentation — Transpile with pass managers
  • IBM Quantum Learning — Superposition with Qiskit
Andrew Shin

양자컴퓨팅을 처음 접하는 사람도 이해할 수 있도록 복잡한 개념과 기술을 쉽게 풀어 설명합니다. 기초 원리부터 큐비트, 양자게이트, 하드웨어, 실제 활용 분야와 최신 기술 흐름까지 신뢰할 수 있는 자료를 바탕으로 정리합니다.

문의: jyamee01@gmail.com

댓글 남기기