Bernstein–Vazirani — gizli bit dizisini tek sorguda oku
Bernstein–Vazirani algoritması, oracle içine gizlenmiş bitlik bir diziyi () bulma problemidir. Klasik bilgisayar gizli dizinin her bitini tek tek sorgulamak zorundayken, kuantum devresi phase kickback ve girişim sayesinde bütün diziyi tek oracle çağrısıyla geri çıkarır.
Bernstein–Vazirani nedir?
Bernstein–Vazirani, Deutsch–Jozsa ailesinin bir adım daha hedef odaklı versiyonudur: oracle'ın sabit mi dengeli mi olduğunu sormaz; oracle'ın içinde saklanan gizli bit dizisini doğrudan bulmaya çalışır. Gizli dizi ise, oracle her giriş için şu fonksiyonu uygular:
Buradaki iç çarpım klasik anlamda bit bit çarpma ve mod 2 toplama demektir. Örneğin ise oracle, girişin ilk iki anlamlı bitini kontrol eder ve bunların parity bilgisini döndürür. Kuantum devresi ise bu fonksiyonun cevabını tek tek okumak yerine, gizli dizinin hangi konumlarında olduğunu faz değişimlerinden geri inşa eder.
Problem tanımı
Elimizde bitlik bir giriş alan ve tek bitlik sonuç döndüren bir fonksiyon vardır: . Fonksiyonun içinde bilinmeyen bir dizisi saklıdır ve amaç bu diziyi eksiksiz bulmaktır.
-
Fonksiyonun yapısı
Oracle, kuralını uygular. Sonuç, giriş dizisinin gizli dizideki konumlarıyla yaptığı mod 2 toplamdır.
-
Klasik yaklaşım
dizisi bit uzunluğundaysa klasik kesin çözüm sorgu ister: , , gibi taban girdilerle her bit ayrı ayrı test edilir.
-
Kuantum yaklaşımı
Kuantum devresi oracle'ı yalnızca bir kez çağırır. Son Hadamard katmanı faz işaretlerini tekrar bit değerlerine çevirir ve ölçüm doğrudan dizisini verir.
-
Ölçeklenebilirlik
Klasik sorgu sayısı gibi büyürken kuantum sorgu sayısı kalır. Bu yüzden Bernstein–Vazirani, "N vs 1" ayrımını en sade gösteren oracle örneklerinden biridir.
Algoritmanın mantığı: tersine mühendislik
Bernstein–Vazirani'nin güzelliği, fonksiyonu çok kez çalıştırmak yerine fonksiyonun yapısını faz geri tepmesiyle tersine okumasındadır. Oracle, dizisindeki her için ilgili giriş kübitine faz işareti bırakır; son Hadamard katmanı da bu işaretleri tekrar durumlarına çevirir.
-
1
Süperpozisyonun gücü
Giriş kübitleri Hadamard kapılarıyla tüm olası bit dizilerinin süperpozisyonuna getirilir. Yardımcı kübit durumundan durumuna taşınır.
-
2
Oracle etkileşimi
Gizli dizide olan her pozisyon için ilgili giriş kübitinden ancilla'ya CNOT eklenir. Ancilla durumunda olduğu için bu CNOT'lar bit değerini değil, faz işaretini değiştirir.
-
3
Hadamard ile geri dönüş
İkinci Hadamard katmanı faz değişimlerini tekrar ölçülebilir bit desenine çevirir. Gizli dizide karşılığı olan kübitler , karşılığı olanlar olarak döner.
-
4
Tek ölçüm
Giriş register'ı ölçülür ve sonuç doğrudan dizisidir. İdeal simülatörde bu sonuç deterministiktir; olasılık dağılımı değil, kesin cevap üretir.
Algoritmanın Qiskit reçetesi
Qiskit devresi giriş kübiti, bir ancilla ve klasik bitten oluşur. Kodun tek parametresi gizli bit dizisidir; oracle bu dizide olan pozisyonları CNOT kapılarıyla devreye işler.
-
Başlangıç
hazırlanır. Qiskit kodunda qc.x(n) satırı ancilla'yı durumuna çevirir.
-
Hadamard katmanı
qc.h(range(n + 1)) hem giriş kübitlerini tüm değerlerinin süperpozisyonuna alır hem de ancilla'yı durumuna taşır.
-
Oracle
secret_bitstring içindeki bitleri için qc.cx(i, n) uygulanır. Bu CNOT'lar gizli diziyi ölçüme değil, faz desenine yazar.
-
Geri dönüş ve ölçüm
Giriş kübitlerine ikinci kez Hadamard uygulanır. Ölçüm sonucu doğrudan gizli dizi olur.
Qiskit kodu
Aşağıdaki örnekte gizli dizi 110 olarak seçildi. Qiskit'in bit sıralaması nedeniyle oracle içinde dizi ters çevrilerek okunur; böylece ölçüm çıktısı kullanıcıya verdiğimiz gizli diziyle aynı yönde yorumlanır.
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
def bv_algorithm(secret_bitstring):
n = len(secret_bitstring)
# n giriş kübiti + 1 yardımcı (ancilla) kübit
qc = QuantumCircuit(n + 1, n)
# 1. Hazırlık: ancilla'yı |1> yap ve hepsine H uygula.
qc.x(n)
qc.h(range(n + 1))
qc.barrier()
# 2. Oracle: gizli diziyi devreye işle.
# secret_bitstring içindeki "1" olan yerlere CNOT ekle.
for i, bit in enumerate(reversed(secret_bitstring)):
if bit == "1":
qc.cx(i, n)
qc.barrier()
# 3. Girişim ve ölçüm
qc.h(range(n))
qc.measure(range(n), range(n))
return qc
secret = "110"
qc = bv_algorithm(secret)
# Simülasyon
simulator = AerSimulator()
result = simulator.run(qc, shots=1).result()
counts = result.get_counts()
print(f"Gizli Dizi: {secret}")
print(f"Kuantumun Bulduğu Sonuç: {list(counts.keys())[0]}")
Kodun derinlemesine analizi
QuantumCircuit(n + 1, n) satırı, giriş kübiti ve bir ancilla oluşturur. Klasik register yalnızca bittir, çünkü ancilla ölçülmez; gizli dizi giriş register'ında okunur.
qc.cx(i, n) oracle'ın kalbidir. Gizli dizide olan her konum için ilgili giriş kübitinden ancilla'ya CNOT eklenir. Ancilla durumunda olduğu için bu CNOT, hedef kübiti kalıcı olarak değiştirmekten çok kontrol kübitinin fazına eksi işareti teptirir.
reversed(secret_bitstring) Qiskit'in küçük endian bit sıralamasıyla uyum sağlamak için kullanılır. Böylece secret = "110" seçildiğinde devre ilgili fiziksel kübitlere doğru CNOT kapılarını ekler ve çıktı kullanıcı tarafında yine 110 olarak okunur.
shots=1 algoritmanın deterministik olduğunu gösterir. İdeal Bernstein–Vazirani devresinde sonuç olasılıksal bir dağılım değildir; oracle doğru kurulduysa tek ölçüm gizli diziyi verir.
Devre ve doğrulama
Aşağıdaki şema için devrenin ana akışını gösterir. Oracle bloğu içinde gizli dizide olan konumlar CNOT kapılarıyla ancilla'ya bağlanır. Son Hadamard katmanı bu bağlantıların faz izini ölçülebilir bit dizisine çevirir.
Hedef: oracle içindeki dizisini tek ölçümle okumak.
- secret = 110
- ölçüm = 110
- shots=1 deterministik ideal devre
-
Neden tek sorgu?
Oracle tüm değerlerine aynı anda faz işareti bıraktığı için gizli dizinin bütün bitleri aynı ölçüm desenine taşınır.
-
Klasik fark
Klasik çözümde dizisinin her biti ayrı sorguyla öğrenilir. Kuantum çözümde sorgu sayısı sabit kalır; yalnızca devre genişliği artar.
-
Gerçek donanım notu
İdeal simülatörde tek sonuç görülür. Gerçek cihazda kapı ve okuma gürültüsü nedeniyle küçük oranlarda hatalı bit dizileri gözlenebilir.