Qubitler, Süperpozisyon ve Dolaşma: Kuantum Fiziği Olmayan Kuantum Temelleri
Kuantum hesaplamaya her giriş kuantum mekaniğiyle başlıyor gibi görünüyor, denklemler Schrödinger ve dalga-parçacık ikiliği. Sonuç olarak çoğu geliştirici bir kuantum bilgisayarın neden bir kuantum bilgisayardan farklı olduğunu anlayamadan fiziksel ayrıntılarda kaybolursunuz klasik. Bu makale tam tersini yapıyor: temel kavramları açıklıyor - kübitler, süperpozisyon, dolaşıklık ve eşevresizlik — erişilebilir matematiksel analojiler ve Qiskit kodunu kullanarak şunları yapabilirsiniz: şimdi koş.
Kuantum mekaniğini bilmenize gerek kalmayacak. Vektörlere ve olasılıklara ihtiyacınız olacak.
Ne Öğreneceksiniz
- Matematiksel olarak kübit nedir: 2 boyutlu Hilbert uzayında vektör
- Bloch küresi: bir kübitin durumunun görselleştirilmesi
- Süperpozisyon: olasılık, sihir değil
- Dolanıklık: iletişim olmadan kuantum korelasyonu
- Eşevresizlik: kuantum hesaplamanın neden zor olduğu
- Tedbir: devletin çöküşü ve sonuçları
- Her konsepti görselleştirmek için tüm Qiskit kodu
Klasik Bit ve Qubit
Klasik bir bit tam olarak iki değerden birine sahiptir: 0 veya 1. Fiziksel olarak bir transistördür akımı ileten veya iletmeyen. Belirsizlik yoktur: bit her zaman tanımlanmış bir durumdadır.
Bir kübit matematiksel olarak şu şekilde tanımlanır: 2-hilbert uzayında vektör boyutlar. Bir kübitin genel durumu şöyledir:
|ψ⟩ = α|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 |β|²
İşte kritik nokta: α ve β olasılık değil, genliktir. Olasılıklar genliklerin büyüklüğünün karesi alınarak elde edilir. Bu ayrım ve temel çünkü genlikler dalgalar gibi girişimde bulunabilir (birbirini ekleyebilir veya birbirini iptal edebilir), klasik olasılıklar ise böyle değildir.
# 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 Küresi: Bir Qubit'i Görselleştirmek
Bloch küresi, yüzeydeki her noktanın bir durumu temsil ettiği 1 yarıçaplı bir küredir. saf kuantum (bir kübit). Kuzey kutbu |0⟩, güney kutbu ise |1⟩. Ekvator üzerindeki noktalar bunlar |0⟩ ve |1⟩'nin eşit olasılıklı süperpozisyonlarıdır.
# 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
Kavramsal anahtar: Hadamard kapısı, kübiti olduğu gibi "süperpozisyona sokmaz" belirsiz bir fiziksel konum. Durum vektörünü kuzey kutbundan ekvatora döndürür Bloch küresinin. "Süperpozisyon" basitçe kübitin bir yöne işaret etmesidir |0⟩ ve |1⟩'den farklıdır.
Girişim: Kuantumun Gerçek Gücü
Süperpozisyon tek başına işe yaramaz; tek başına ölçtüğünüz süperpozisyondaki bir kübit rastgele bir parça. Kuantum hesaplamanın gerçek gücü,parazit yapmak: genlikler birbirini artırabilir (yapıcı girişim) veya birbirini iptal edebilir (yıkıcı girişim), doğru cevaba götüren yolları güçlendirmenize ve yanlış olanları bastırmanıza olanak tanır.
# 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)
Dolanıklık: Kuantum Korelasyonu
Dolanıklık ikinci temel kavramdır. İki dolaşmış kübitin birbiriyle ilişkili durumları vardır: birinin ölçümü diğerinin ölçüm sonucunu bağımsız olarak anında belirler mesafeden. Ancak - ve birçok makalenin yanlış anladığı nokta da budur - bu değil ışıktan daha hızlı iletişim sağlar.
Bell durumu, 2 kübitlik dolaşıklığın en basit örneğidir:
# 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.
Çünkü dolaşıklık iletişime izin vermiyor: kübitinizi ölçtüğünüzde, rastgele bir sonuç elde edersiniz (her biri %50 olasılıkla 0 veya 1). Yalnızca iletişim kurduğunuzda Bu sonucu karşıdaki kişiye klasik kanaldan ulaştırır, elinde ne olduğunu anlar. Kanal Işık hızıyla sınırlı olan klasik, bilgi elde etmek için her zaman gereklidir kullanışlı.
Eşevresizlik: Kuantum Bilişimin Düşmanı
Kuantum bilgisayarları oluşturmanın bu kadar zor olmasının nedeni uyumsuzluk: kübitler çevreyle (termal fotonlar, manyetik alanlar, titreşimler) etkileşime girer ve sızıntı yapar kuantum özellikleri klasik durumlara çöküyor. Bu süreç şu şekilde gerçekleşir: Mevcut donanımda mikrosaniye.
# 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"
Temel Kavramlar için Geliştirici Analojisi
- Kübitler: 0, 1 veya dağılımı olabilecek bir değişken olasılık {0,1}'in üzerindedir - ancak onu "okuduğunuzda" (ölçtüğünüzde) 0 veya 1'e düşer
- Süperpozisyon: değişken "henüz belirlenmemiş" durumdadır — çözümleme() işleminden önceki Promise gibi. Ölçüm ve çözüm()
- Dolaşma: garantili mükemmel korelasyona sahip iki değişken — değişmez bir referansı paylaşan ancak değerini bilmeyen iki nesne gibi "okuyana" kadar
- Parazit yapmak: Hesaplamalı yollar şu şekilde eklenir/iptal edilir: dalgalar — doğru cevabı güçlendirmenizi sağlar
- Uyumsuzluk: kuantum bit çürüğü — sistem özelliklerini kaybeder çevreye müdahale yoluyla kuantum
Ölçme ve Çöktürme
Kuantum durumundan klasik bilgiyi çıkaran ölçüm ve işlem — e devleti onarılamaz biçimde yok eder. Ve kuantum hesaplamanın temel bir kısıtlaması: bir hesaplamanın ara durumunu, onu yok etmeden "okuyamazsınız".
# 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
Sonuçlar
Kuantum hesaplamanın temel kavramları - kübitler, süperpozisyon, dolaşma ve eşevresizlik — hepsi ezoterik fizik olmadan doğrusal cebir ve olasılık ile tanımlanabilir. Bloch küre ve Qiskit durum vektörleri, bunları görselleştirmek ve onlarla çalışmak için somut araçlardır.
Bir sonraki makale bu temeller üzerine inşa ediliyor: Dönüşümler olarak kuantum kapıları doğrusal, ilk gerçek algoritmanın (Bell durumu) oluşturulması ve IBM donanımında yürütülmesi.







