量子ビット、重ね合わせ、もつれ: 量子物理学を使わない量子基礎
量子コンピューティングの入門はすべて、量子力学、つまり方程式から始まるように見えます。 シュレディンガーと波動粒子の双対性。その結果、ほとんどの開発者は 量子コンピュータが量子コンピュータと異なる理由を理解する前に、物理的な詳細に迷ってしまう 古典的な。この記事はその逆で、基本的な概念、つまり量子ビット、重ね合わせ、 もつれとデコヒーレンス — アクセス可能な数学的アナロジーと Qiskit コードを使用して、次のことが可能です 今すぐ走ってください。
量子力学の知識は必要ありません。ベクトルと確率が必要になります。
何を学ぶか
- 数学的に量子ビットとは何ですか: 2D ヒルベルト空間のベクトル
- ブロッホ球: 量子ビットの状態を視覚化する
- 重ね合わせ: 魔法ではなく確率
- もつれ: 通信を伴わない量子相関
- デコヒーレンス: 量子コンピューティングが難しい理由
- 対策: 国家の崩壊とその結果
- 各コンセプトを視覚化するためのすべての Qiskit コード
クラシックビットと量子ビット
古典的なビットは、0 または 1 の 2 つの値のうちの 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...}
ブロッホ球: 量子ビットの視覚化
ブロッホ球は、表面上の各点が状態を表す半径 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
概念的な鍵: アダマール ゲートは、いわば「量子ビットを重ね合わせる」ものではありません 曖昧な物理的位置。 状態ベクトルを北極から赤道まで回転します ブロッホ球の。 「重ね合わせ」は単に一方向を指す量子ビットです |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 番目の基本概念です。 2 つのもつれ合った量子ビットには相関関係のある状態があります。 一方の測定により、もう一方の測定結果が独立して即座に決定されます。 遠くから。しかし、これが多くの記事が間違っている点です。 これは違います 超光速通信を可能にする.
ベル状態は、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 に崩壊します。
- 重ね合わせ: 変数は「まだ決定されていない」状態です。 —solve() の前の Promise のようなもの。測定とresolve()
- もつれ: 完全な相関関係が保証された 2 つの変数 — 不変の参照を共有するが値がわからない 2 つのオブジェクトのようなもの 「読む」まで
- 干渉: 計算パスの追加/キャンセル 波 — 正解を増幅することができます
- デコヒーレンス: 量子ビットの腐敗 — システムはその特性を失います 環境との干渉による量子
測定と崩壊
量子状態から古典的な情報を抽出する測定と操作 - 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
結論
量子コンピューティングの基本概念 - 量子ビット、重ね合わせ、エンタングルメント、デコヒーレンス — それらはすべて、難解な物理学を使わずに、線形代数と確率で記述可能です。ブロッホ sphere および Qiskit 状態ベクトルは、それらを視覚化し、操作するための具体的なツールです。
次の記事は、これらの基本に基づいて構築されています: 変換としての量子ゲート 線形、最初の実際のアルゴリズム (ベル状態) の構築と IBM ハードウェアでの実行。







