KonuAnlatım.com

NumPy ile Bilimsel Hesaplama

Kuantum Hesaplama · Bölüm 3Kuantum HesaplamaDers

Bilimsel Python dünyasının temel taşı NumPy'dır; kuantum durumlarını vektör, kapıları matris olarak tutma alışkanlığı kuantum hesaplamanın da bel kemiğidir. Bu derste ndarray dizilerini, vektörel işlemleri ve broadcasting'i öğrenecek; |0⟩ durumuna Hadamard kapısı uygulayan küçük ama eksiksiz bir hesap akışını adım adım kuracaksın. Serinin tamamı için Kuantum Hesaplama dersleri sayfasına bakabilirsin; Python'da daha yeniysen önce Kuantum Hesaplama için Python Temelleri dersini tamamlamanı öneririz.

NumPy Nedir, Neden Kuantum Hesaplamada Kullanılır?

NumPy (Numerical Python), sayısal dizilerle hızlı ve bellek verimli çalışan, açık kaynak bir Python kütüphanesidir. Python listeleri her tür nesneyi karışık tutabilir; bedeli, her elemanın bellekte ayrı bir nesne olması ve işlemin döngüyle yürümesidir. NumPy dizisi aynı türden verileri bellekte art arda saklar; işlemler derlenmiş kodda, döngü yazmadan tek satırda tamamlanır. Qiskit gibi kuantum çerçeveleri de durum vektörlerini içeride NumPy dizisi olarak taşır.

  • Python listesi: karışık türler barındırır, boyutu esnektir; işlem için döngü yazarsın; büyük veri yığınlarında yavaştır.
  • NumPy dizisi (ndarray): tek tür veri tutar (örneğin hepsi karmaşık sayı), boyutu kurulunca sabittir; işlem tüm elemanlara tek satırda uygulanır; bellek art arda olduğu için çok hızlıdır.

Ölçek neden önemli? n kübitlik durum 2ⁿ genlik taşır: 10 kübit, 1024 elemanlı bir vektördür ve boyut üstel büyür. Bu boyutlarda döngüyle çalışmak pratik değildir; vektörel çalışmak zorunluluktur.

ndarray: Şekil, dtype ve Karmaşık Sayılar

NumPy'ın temel veri yapısı ndarray, yani n boyutlu dizidir. Kübit durumunu tek satırda kurarsın: psi = np.array([1, 0], dtype=complex). psi.shape şekli verir — (2,) yani iki elemanlı vektör; psi.dtype türü verir — complex128, her genlik için gerçek ve sanal kısımdan iki 64 bitlik sayı. Kapılar da iki boyutlu dizidir; örneğin σₓ kapısı np.array([[0, 1], [1, 0]]) ile |0⟩ ile |1⟩'i yer değiştirir.

Genlikler karmaşık sayıdır (α = a + bi; temeli tazelemek için Karmaşık Sayılar dersine bak) ve faz içeren her hesapta diziyi baştan dtype=complex ile kurmak gerekir. Gerçek dizide np.sqrt(-1) çağırırsan NumPy hata vermez ama nan üretir; bu tür sessiz hatalar en sinsi olanlardır.

Vektörel İşlemler ve Broadcasting

NumPy'da işlem yazmak matematikteki yazımla örtüşür: psi * 2 genlikleri ikiyle çarpar, np.abs(psi) ** 2 mutlak kareleri alır. Şekli aynı dizilerin işlemi eleman elemana yürür. Olasılık hesabının ta kendisi budur: |α|², yani np.abs(psi) ** 2, her temel durumun ölçüm olasılığını verir.

Broadcasting (yayın), farklı ama uyumlu şekillerdeki dizilerin işleme otomatik uyumlanmasıdır: (2, 2)'lik bir matrisi (2,) boyutlu vektörle * ile çarparsan vektör her satıra yayılır ve çarpım satır satır yapılır. Tam burada büyük bir yanılgı başlar: * matris çarpımı değildir; durumu evrilen işlem @ operatörüyledir. Farkı bir sonraki bölümde canlı göreceksin.

Küçük Bir Hesap Akışı: |0⟩ Durumuna Hadamard Uygulamak

Şimdi küçük hesabı baştan sona kuralım. Hadamard kapısı H = (1/√2)·[[1, 1], [1, −1]] matrisidir; |0⟩ = (1, 0) vektörüne uygulanınca (|0⟩ + |1⟩)/√2, yani eşit süperpozisyonu üretir. Akış beş adımda yürür:

  1. Durumu kur: psi = np.array([1, 0], dtype=complex) — bu, |0⟩'dur.
  2. Kapıyı kur: H = np.array([[1, 1], [1, -1]], dtype=complex) / np.sqrt(2).
  3. Uygula: psi = H @ psi. Sonuç array([0.70710678+0.j, 0.70710678+0.j]) — yani (1/√2)·(1, 1).
  4. Normalizasyonu denetle: np.vdot(psi, psi), kayan nokta payıyla 1.0000000000000002 gibi 1'e eşit çıkar. vdot ilk argümanı eşlenikler; böylece ⟨ψ|ψ⟩ = Σ ψᵢ*ψᵢ = 1 kuralını denetlemiş olursun. (np.dot eşlenik almaz; iç çarpım için vdot doğrudur.)
  5. Olasılıkları hesapla: np.abs(psi) ** 2 → array([0.5, 0.5]). Ölçümde 0 da 1 de %50 çıkar; toplam 1'dir.

Kapının kendisini de sınayabilirsin: np.round(H @ H, 12) birim matrisi verir (H² = I, yani H üniteryendir); np.linalg.eigvals(H) ise +1 ve −1 özdeğerlerini döndürür. Üniteryen matrisin özdeğerleri |λ| = 1 kuralına uymak zorundadır; H'de bunlar tam olarak ±1'dir.

Dağılımı grafikle denetlemek istersen Matplotlib ile Grafik Çizimi dersindeki çubuk grafik tam bu işe yarar; olasılık temelleri için Olasılık ve İstatistik Temelleri dersine dönebilirsin.

Sık Yapılan Hatalar ve Yanılgılar

  • Python listesiyle devam etmek: liste üzerinde vektörel işlem olmaz; her adım yavaş bir döngüye döner. Durum vektörünü baştan ndarray yap.
  • dtype=complex yazmayı atlamak: gerçek dizide faz adımları (e^(iθ)) nan üretir, hata mesajı gelmez. Karmaşık her dizide türü baştan belirt.
  • * ile @ karıştırmak: * eleman elemana çarpar, @ matris çarpımı yapar. H * psi satırları vektörle yayarak çarpar; durumu evrilen doğru işlem H @ psi'dir.
  • İç çarpımda np.dot kullanmak: ⟨ψ|φ⟩ = Σ ψᵢ*φᵢ tanımı eşlenik ister; np.vdot eşleniği alır, np.dot almaz. Gerçek sayılarda fark görünmez; kuantumda fark hatadır.
  • Dilimi kopya sanmak: b = psi[:2] yeni dizi değil, aynı belleğe bakan görünümdür; b'deki değişiklik psi'yi de bozar. Bağımsız kopya için psi.copy() yaz.
  • Normalizasyonu varsaymak: uzun hesaplarda kayan nokta hataları birikir, Σ|genlik|² 1'den kayar. Ara sıra np.vdot(psi, psi).real değerine bak; saparsa psi = psi / np.linalg.norm(psi) ile normalize et.

Bu denemeleri kurmak için ayrı kurulum gerekmez; Jupyter ile Çalışma Ortamı dersindeki hücre hücre çalışma biçimi, adım adım akışları denemek için idealdir.

Bu derste kurduğun alışkanlıklar bir sonraki ünitenin zemini: kuantum durumları vektör, kapılar matris, devre üst üste binmiş matris çarpımlarıdır. Sonraki ünitede önce Vektörler, ardından Matrisler ve Matris Çarpımı dersleriyle bu üç kavramı derinlemesine işleyeceğiz; çok kübitli durumlar ⊗ ile kurulurken bugünkü shape ve broadcasting bilgin doğrudan işine yarayacak.

Sık Sorulan Sorular

NumPy nedir ve ne işe yarar?

NumPy, Python'da sayısal dizilerle hızlı çalışan açık kaynak bir bilimsel hesaplama kütüphanesidir. Veriyi bellekte art arda saklayıp işlemleri döngüsüz (vektörel) yürüttüğü için büyük hesaplarda düz Python listelerinden kat kat hızlıdır; kuantumda durum vektörleri ve kapı matrisleri bu yapıda tutulur.

NumPy dizisi ile Python listesi arasındaki fark nedir?

Python listesi karışık türler barındırır ve boyutu esnektir ama her elemanı ayrı nesne olduğu için işlemler döngüyle yavaş yürür. NumPy dizisi tek tür veriyi art arda saklar ve işlemi tek satırda uygular. n kübitlik durum 2ⁿ genlik taşıdığı için kuantumda bu fark tercih değil, zorunluluktur.

np.dot ile np.vdot arasındaki fark nedir?

np.dot eşlenik almadan çarpar; np.vdot birinci argümanı eşleniğe çevirir: np.vdot(psi, phi) = Σ ψᵢ*φᵢ = ⟨ψ|φ⟩. Genlikler karmaşık olduğundan kuantumda iç çarpım için vdot doğrudur; np.vdot(psi, psi) ≈ 1 normalizasyon denetimi böyledir.

Kuantum hesaplamada NumPy neden kullanılır?

Bir kübitin durumu 2 boyutlu karmaşık vektör, kapılar 2×2 üniteryen matristir; n kübitte vektör 2ⁿ boyuta çıkar. NumPy bu işlemleri derlenmiş kodda vektörel yaptığı için simülasyon pratikleşir; Qiskit gibi çerçeveler de durumları içeride NumPy dizisi olarak taşır.

Kaynaklar ve İleri Okuma

NumPy — Vikipedi (Türkçe) — kütüphanenin ne olduğu ve temel özellikleri için Türkçe genel bakış.

NumPy: the absolute basics for beginners — dizi oluşturma ve temel işlemleri adım adım anlatan resmî başlangıç rehberi.

NumPy Quickstart (resmî dokümantasyon) — vektörel işlemler ve broadcasting dahil resmî hızlı başlangıç kılavuzu.

Qiskit quantum_info modülü (IBM Quantum) — kuantum durumlarının ve operatörlerin NumPy dizileriyle temsil edilişini gösteren resmî API belgeleri.

IBM Quantum Learning — vektör-matris alışkanlığının kuantum devrelerinde kullanıldığı resmî öğrenme platformu.

Dersler

Tümü →