큐비트, 중첩 및 얽힘: 양자 물리학이 없는 양자 기초
양자 컴퓨팅에 대한 모든 소개는 양자 역학, 즉 방정식에서 시작되는 것 같습니다. 슈뢰딩거와 파동-입자 이중성. 그 결과 대부분의 개발자들은 양자 컴퓨터가 양자 컴퓨터와 다른 이유를 이해하기도 전에 물리적인 세부 사항에 빠져들게 됩니다. 클래식. 이 기사는 그 반대입니다. 큐비트, 중첩, 얽힘과 결맞음 — 접근 가능한 수학적 비유와 키스킷 코드를 사용하여 지금 달려라.
양자역학을 알 필요는 없습니다. 벡터와 확률이 필요합니다.
무엇을 배울 것인가
- 수학적으로 큐비트란 무엇입니까: 2D 힐베르트 공간의 벡터
- Bloch 구: 큐비트 상태 시각화
- 중첩: 마법이 아닌 확률
- 얽힘: 의사소통이 없는 양자 상관관계
- 결맞음: 양자 컴퓨팅이 어려운 이유
- 측정 : 국가 붕괴와 그 결과
- 각 개념을 시각화하기 위한 모든 키스킷 코드
클래식 비트와 큐비트(Qubit)
클래식 비트는 0 또는 1의 두 값 중 정확히 하나를 갖습니다. 물리적으로 이는 트랜지스터입니다. 전류를 전도하거나 전도하지 않는 것. 모호성은 없습니다. 비트는 항상 정의된 상태에 있습니다.
큐비트는 수학적으로 다음과 같이 설명됩니다. 2-힐베르트 공간의 벡터 치수. 큐비트의 일반적인 상태는 다음과 같습니다.
|ψ⟩ = α|0⟩ + β|1⟩
dove:
|0⟩ e il vettore [1, 0] (stato base "zero")
|1⟩ e il vettore [0, 1] (stato base "uno")
α e β sono numeri complessi (ampiezze)
con il vincolo: |α|² + |β|² = 1
La probabilita di misurare 0 e |α|²
La probabilita di misurare 1 e |β|²
이것이 중요한 포인트입니다: α와 β는 확률이 아니라 진폭입니다.. 진폭의 크기를 제곱하여 확률을 얻습니다. 이 구별 진폭이 파동처럼 간섭(서로 추가 또는 상쇄)될 수 있기 때문에 기본적입니다. 고전적인 확률은 그렇지 않습니다.
# Visualizzare lo stato di un qubit con Qiskit
from qiskit import QuantumCircuit
from qiskit.visualization import plot_bloch_multivector, plot_histogram
from qiskit.quantum_info import Statevector
import numpy as np
# Stato |0⟩ — qubit "a zero"
qc_zero = QuantumCircuit(1)
sv_zero = Statevector.from_instruction(qc_zero)
print(f"Stato |0⟩: {sv_zero}")
# Statevector([1.+0.j, 0.+0.j], dims=(2,))
# probabilita di misurare 0: |1|^2 = 1.0 (100%)
# probabilita di misurare 1: |0|^2 = 0.0 (0%)
# Stato |1⟩ — applico gate X (equivalente al NOT classico)
qc_one = QuantumCircuit(1)
qc_one.x(0)
sv_one = Statevector.from_instruction(qc_one)
print(f"Stato |1⟩: {sv_one}")
# Statevector([0.+0.j, 1.+0.j], dims=(2,))
# Stato in superposizione — applico gate Hadamard
qc_plus = QuantumCircuit(1)
qc_plus.h(0) # Hadamard: |0⟩ -> (|0⟩ + |1⟩)/√2
sv_plus = Statevector.from_instruction(qc_plus)
print(f"Stato |+⟩ (superposizione): {sv_plus}")
# Statevector([0.707+0.j, 0.707+0.j], dims=(2,))
# probabilita 0: 0.707^2 = 0.5 (50%)
# probabilita 1: 0.707^2 = 0.5 (50%)
# Verifica le probabilita
probs = sv_plus.probabilities_dict()
print(f"Probabilita di misura: {probs}")
# {'0': 0.4999..., '1': 0.4999...}
Bloch Sphere: 큐비트 시각화
Bloch 구는 표면의 각 점이 상태를 나타내는 반지름 1의 구입니다. 순수 양자(1큐비트). 북극은 |0⟩, 남극은 |1⟩입니다. 적도상의 점들 |0⟩과 |1⟩의 등확률 중첩입니다.
# Visualizzare vari stati sulla Bloch sphere
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector
from qiskit.visualization import plot_bloch_multivector
def show_state_on_bloch(circuit: QuantumCircuit, label: str) -> None:
sv = Statevector.from_instruction(circuit)
probs = sv.probabilities_dict()
print(f"\nStato: {label}")
print(f"Statevector: {sv.data}")
print(f"P(0)={probs.get('0', 0):.3f}, P(1)={probs.get('1', 0):.3f}")
# Polo Nord: |0⟩
qc_north = QuantumCircuit(1)
show_state_on_bloch(qc_north, "|0⟩ (polo nord)")
# Polo Sud: |1⟩
qc_south = QuantumCircuit(1)
qc_south.x(0)
show_state_on_bloch(qc_south, "|1⟩ (polo sud)")
# Equatore: |+⟩ = (|0⟩ + |1⟩)/√2 — Hadamard da |0⟩
qc_plus = QuantumCircuit(1)
qc_plus.h(0)
show_state_on_bloch(qc_plus, "|+⟩ (equatore, fase reale +)")
# Equatore: |−⟩ = (|0⟩ - |1⟩)/√2 — X poi Hadamard
qc_minus = QuantumCircuit(1)
qc_minus.x(0)
qc_minus.h(0)
show_state_on_bloch(qc_minus, "|−⟩ (equatore, fase reale -)")
# Stato arbitrario: rotazione di pi/4 attorno all'asse Y
qc_ry = QuantumCircuit(1)
qc_ry.ry(np.pi/4, 0) # Rotazione Y di 45 gradi
show_state_on_bloch(qc_ry, "RY(π/4)|0⟩ (stato intermedio)")
# P(0) ≈ 0.854, P(1) ≈ 0.146
개념적 핵심: Hadamard 게이트는 "큐비트를 중첩 상태로 두지" 않습니다. 모호한 물리적 위치. 상태 벡터를 북극에서 적도로 회전합니다. 블로흐 구체의. "중첩"은 단순히 한 방향을 가리키는 큐비트입니다. |0⟩ 및 |1⟩과 다릅니다.
간섭: 양자의 진정한 힘
중첩만으로는 유용하지 않습니다. 중첩의 큐비트만 측정하면 됩니다. 무작위 비트. 양자컴퓨팅의 진정한 힘은간섭: 진폭은 서로 추가되거나(보강 간섭) 상쇄될 수 있습니다(상쇄 간섭). 올바른 답으로 이어지는 경로를 확대하고 잘못된 답을 억제할 수 있습니다.
# Interferenza: l'Hadamard applicato due volte
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector
# H applicato due volte torna allo stato iniziale (interferenza perfetta)
qc_hh = QuantumCircuit(1)
qc_hh.h(0) # Prima H: |0⟩ -> |+⟩ = (|0⟩+|1⟩)/√2
qc_hh.h(0) # Seconda H: le ampiezze interferiscono
sv = Statevector.from_instruction(qc_hh)
print(f"H|H|0⟩ = {sv.data}")
# [1.+0.j, 0.+0.j] — torna esattamente a |0⟩!
# Perche? La matematica:
# Prima H: [1/√2, 1/√2]
# Seconda H: il gate applica la matrice [[1/√2, 1/√2], [1/√2, -1/√2]]
# Risultato: [1/√2*1/√2 + 1/√2*1/√2, 1/√2*1/√2 - 1/√2*1/√2]
# = [1, 0] = |0⟩
# Il termine per |1⟩ si annulla (interferenza distruttiva)!
# Gli algoritmi quantum sfruttano questa interferenza:
# - Amplificano stati con la risposta giusta (interferenza costruttiva)
# - Sopprimono stati con risposte sbagliate (interferenza distruttiva)
얽힘: 양자 상관관계
얽힘은 두 번째 기본 개념입니다. 두 개의 얽힌 큐비트는 상관된 상태를 갖습니다. 하나의 측정은 즉시 다른 측정 결과를 독립적으로 결정합니다. 멀리서. 하지만 - 그리고 이것이 바로 많은 기사가 잘못된 점입니다 - 이것은 아니다 빛보다 빠른 통신 가능.
벨 상태는 2큐비트 얽힘의 가장 간단한 예입니다.
# Creare e misurare il Bell State
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector
from qiskit_aer import AerSimulator
from qiskit import transpile
# Crea il Bell State |Φ+⟩ = (|00⟩ + |11⟩) / √2
qc_bell = QuantumCircuit(2, 2)
qc_bell.h(0) # Superposizione sul qubit 0
qc_bell.cx(0, 1) # CNOT: se qubit 0 e |1⟩, nega qubit 1
# Lo stato e: (|00⟩ + |11⟩) / √2
# NON e separabile: impossibile scrivere come |a⟩ ⊗ |b⟩
sv = Statevector.from_instruction(qc_bell)
print(f"Bell State: {sv.data}")
# [0.707, 0, 0, 0.707] -> 50% |00⟩, 50% |11⟩
# Misura
qc_bell.measure([0, 1], [0, 1])
simulator = AerSimulator()
compiled = transpile(qc_bell, simulator)
result = simulator.run(compiled, shots=10000).result()
counts = result.get_counts()
print(f"Risultati (10000 shots): {counts}")
# Solo '00' e '11' — MAI '01' o '10'!
# Se qubit 0 e 0, qubit 1 e sempre 0. Se qubit 0 e 1, qubit 1 e sempre 1.
# Questo e l'entanglement: non si manifesta come comunicazione
# ma come CORRELAZIONE perfetta nelle misure.
# "Misuro il qubit 0: ottengo 0. So con certezza che qubit 1 sara 0."
# La correlazione vale anche se i due qubit sono a chilometri di distanza.
# Einstein chiamava questo "spooky action at a distance" — e reale e verificato.
얽힘은 소통을 허용하지 않기 때문에: 큐비트를 측정할 때, 무작위 결과를 얻습니다(각각 50% 확률로 0 또는 1). 소통할 때만 이 결과를 클래식 채널을 통해 다른 사람에게 전달하면 그녀는 자신이 무엇을 가지고 있는지 이해하게 됩니다. 운하 빛의 속도에 의해 제한되는 고전적인 방법은 정보를 추출하는 데 항상 필요합니다. 유용합니다.
결맞음: 양자 컴퓨팅의 적
양자컴퓨터를 만드는 것이 어려운 이유는 결맞음: 큐비트는 환경(열 광자, 자기장, 진동)과 상호 작용하여 누출됩니다. 그들의 양자 특성은 고전적 상태로 붕괴됩니다. 이 과정은 현재 하드웨어의 마이크로초.
# Simulare l'effetto della decoerenza con noise model
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel, depolarizing_error
from qiskit import QuantumCircuit, transpile
# Noise model semplice: errore di depolarizzazione dopo ogni gate
noise_model = NoiseModel()
error_1qubit = depolarizing_error(0.01, 1) # 1% di errore per gate a 1 qubit
error_2qubit = depolarizing_error(0.05, 2) # 5% di errore per gate a 2 qubit
noise_model.add_all_qubit_quantum_error(error_1qubit, ['h', 'x', 'ry'])
noise_model.add_all_qubit_quantum_error(error_2qubit, ['cx'])
# Test: Bell state con e senza noise
def run_bell(shots: int, noisy: bool = False) -> dict:
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
if noisy:
sim = AerSimulator(noise_model=noise_model)
else:
sim = AerSimulator()
compiled = transpile(qc, sim)
result = sim.run(compiled, shots=shots).result()
return result.get_counts()
ideal = run_bell(10000, noisy=False)
noisy = run_bell(10000, noisy=True)
print("Senza noise:")
for state, count in sorted(ideal.items()):
print(f" |{state}⟩: {count/10000*100:.1f}%")
print("\nCon noise (1% per gate, 5% per CNOT):")
for state, count in sorted(noisy.items()):
print(f" |{state}⟩: {count/10000*100:.1f}%")
# Output tipico con noise:
# |00⟩: ~49%, |11⟩: ~49%, |01⟩: ~1%, |10⟩: ~1%
# Gli stati '01' e '10' compaiono a causa del noise — "bit flip errors"
주요 개념에 대한 개발자 비유
- 큐비트: 0, 1 또는 분포일 수 있는 변수 {0,1}에 대한 확률 - 그러나 이를 "읽기"(측정)하면 0 또는 1로 축소됩니다.
- 위에 놓기: 변수가 "아직 결정되지 않음" 상태입니다. — 해결() 전의 약속과 같습니다. 측정 및 해결()
- 녹채: 완벽한 상관관계가 보장된 두 변수 — 불변 참조를 공유하지만 값을 모르는 두 객체와 같습니다. "읽기"까지
- 간섭: 계산 경로를 다음과 같이 추가/취소합니다. 파도 — 정답을 증폭시킬 수 있습니다
- 결맞음: 양자 비트 부패 - 시스템이 속성을 잃습니다. 환경 간섭에 의한 양자
측정 및 축소
양자 상태에서 고전적인 정보를 추출하는 측정 및 연산 - e 국가를 돌이킬 수 없게 파괴합니다. 그리고 양자 컴퓨팅의 근본적인 제약은 다음과 같습니다. 계산을 파괴하지 않고는 계산의 중간 상태를 "읽을" 수 없습니다.
# Il collasso della misura: dimostrazione pratica
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector
# Crea superposizione
qc = QuantumCircuit(1)
qc.h(0)
sv_before = Statevector.from_instruction(qc)
print(f"Prima della misura: {sv_before.data}")
# [0.707+0j, 0.707+0j] — superposizione
# Misura (simulata 1000 volte)
qc_measure = QuantumCircuit(1, 1)
qc_measure.h(0)
qc_measure.measure(0, 0)
from qiskit_aer import AerSimulator
from qiskit import transpile
sim = AerSimulator()
compiled = transpile(qc_measure, sim)
result = sim.run(compiled, shots=1000).result()
print(f"Dopo 1000 misure: {result.get_counts()}")
# {'0': ~500, '1': ~500}
# Punto critico: ogni singola misura collassa il qubit
# Non puoi misurare |+⟩ e poi continuare a lavorarci
# Devi preparare di nuovo lo stato dall'inizio
# Questo e perche no-cloning theorem: non puoi copiare uno stato sconosciuto
결론
양자 컴퓨팅의 기본 개념 - 큐비트, 중첩, 얽힘 및 결맞음 — 난해한 물리학 없이 선형 대수와 확률로 모두 설명할 수 있습니다. 블로흐 구와 키스킷 상태 벡터는 이를 시각화하고 작업하기 위한 구체적인 도구입니다.
다음 기사는 변환으로서의 양자 게이트라는 기본 사항을 기반으로 합니다. 선형, 최초의 실제 알고리즘(Bell 상태) 구성 및 IBM 하드웨어에서의 실행.







