Algoritmul Deutsch-Jozsa
Algoritmul lui Deutsch depășește toți algoritmii clasici pentru o problemă de interogare, însă avantajul este destul de modest: o interogare față de două. Algoritmul Deutsch-Jozsa extinde acest avantaj — și, de fapt, poate fi folosit pentru a rezolva câteva probleme de interogare diferite.
Iată o descriere în circuit cuantic a algoritmului Deutsch-Jozsa. Un pas suplimentar de post-procesare clasică, neprezentat în figură, poate fi de asemenea necesar în funcție de problema specifică rezolvată.
Desigur, nu am discutat încă ce probleme rezolvă acest algoritm; acest lucru este tratat în cele două secțiuni care urmează.
Problema Deutsch-Jozsa
Vom începe cu problema de interogare pe care algoritmul Deutsch-Jozsa a fost inițial conceput să o rezolve, cunoscută sub numele de problema Deutsch-Jozsa.
Funcția de intrare pentru această problemă are forma pentru un număr întreg pozitiv arbitrar La fel ca în cazul problemei lui Deutsch, sarcina este să returnezi dacă este constantă și dacă este echilibrată, ceea ce înseamnă din nou că numărul șirurilor de intrare pentru care funcția ia valoarea este egal cu numărul șirurilor de intrare pentru care funcția ia valoarea .
Observă că, atunci când este mai mare decât există funcții de forma care nu sunt nici constante, nici echilibrate. De exemplu, funcția definită ca
nu se încadrează în niciuna dintre aceste două categorii. Pentru problema Deutsch-Jozsa, pur și simplu nu ne preocupăm de astfel de funcții — ele sunt considerate intrări de tip „nu contează". Adică, pentru această problemă avem o promisiune că este fie constantă, fie echilibrată.
Algoritmul Deutsch-Jozsa, cu o singură interogare, rezolvă această problemă în sensul următor: dacă fiecare dintre cele rezultate ale măsurătorii este atunci func ția este constantă; iar în caz contrar, dacă cel puțin unul dintre rezultatele măsurătorii este atunci funcția este echilibrată. O altă modalitate de a spune acest lucru este că circuitul descris mai sus este urmat de un pas de post-procesare clasică în care se calculează SAU logic al rezultatelor măsurătorii pentru a produce ieșirea.
Analiza algoritmului
Pentru a analiza performanța algoritmului Deutsch-Jozsa pentru problema Deutsch-Jozsa, este util să începem prin a gândi la acțiunea unui singur strat de porți Hadamard. O operație Hadamard poate fi exprimată ca o matrice în modul obișnuit,
dar putem exprima această operație și în termenii acțiunii sale asupra stărilor bazei standard:
Aceste două ecuații pot fi combinate într-o singură formulă,
care este adevărată pentru ambele alegeri ale lui
Să presupunem acum că, în loc de un singur Qubit, avem Qubiți, și o operație Hadamard este efectuată pe fiecare. Operația combinată pe cei Qubiți este descrisă de produsul tensorial ( ori), pe care îl scriem ca pentru concizie și claritate. Folosind formula de mai sus, urmată de extindere și simplificare, putem exprima acțiunea acestei operații combinate asupra stărilor bazei standard ale celor Qubiți astfel:
Menționăm că, în acest context, scriem șiruri binare de lungime ca și urmând convenția de indexare a Qiskit.
Această formulă ne oferă un instrument util pentru analiza circuitului cuantic de mai sus. După ce primul strat de porți Hadamard este efectuat, starea celor Qubiți (inclusiv cel mai din stânga/de jos Qubit, care este tratat separat față de restul) este
Când operația este efectuată, această stare este transformată în
prin exact același fenomen de revenire de fază pe care l-am văzut în analiza algoritmului lui Deutsch.
Apoi al doilea strat de porți Hadamard este efectuat, care (prin formula de mai sus) transformă această stare în
Această expresie pare oarecum complicată și nu se pot trage prea multe concluzii despre probabilitățile de a obține diferite rezultate ale măsurătorii fără a ști mai multe despre funcția
Din fericire, tot ce trebuie să știm este probabilitatea ca fiecare dintre rezultatele măsurătorii să fie — deoarece aceasta este probabilitatea că algoritmul determină că este constantă. Această probabilitate are o formulă simplă.
Mai în detaliu, dacă este constantă, atunci fie pentru orice șir caz în care valoarea sumei este fie pentru orice șir caz în care valoarea sumei este Împărțind cu și luând pătratul valorii absolute obținem
Dacă, pe de altă parte, este echilibrată, atunci ia valoarea pe jumătate dintre șirurile și valoarea pe cealaltă jumătate, astfel că termenii și din sumă se anulează și rămânem cu valoarea
Concluzionăm că algoritmul funcționează corect cu condiția că promisiunea este îndeplinită.
Dificultatea clasică
Algoritmul Deutsch-Jozsa funcționează de fiecare dată, oferindu-ne întotdeauna răspunsul corect când promisiunea este îndeplinită, și necesită o singură interogare. Cum se compară aceasta cu algoritmii de interogare clasici pentru problema Deutsch-Jozsa?
În primul rând, orice algoritm clasic determinist care rezolvă corect problema Deutsch-Jozsa trebuie să facă un număr exponențial de interogări: sunt necesare interogări în cel mai defavorabil caz. Raționamentul este că, dacă un algoritm determinist interoghează pe sau mai puține șiruri diferite și obține de fiecare dată aceeași valoare a funcției, atunci ambele răspunsuri sunt încă posibile. Funcția ar putea fi constantă sau ar putea fi echilibrată, dar din ghinioane interogările returnează toate aceeași valoare a funcției.
A doua posibilitate poate părea puțin probabilă — dar pentru algoritmii deterministi nu există aleatoare sau incertitudine, astfel că vor eșua sistematic pe anumite funcții. Avem, prin urmare, un avantaj semnificativ al calculului cuantic față de cel clasic în această privință.
Există totuși o capcană, și anume că algoritmii clasici probabilistici pot rezolva problema Deutsch-Jozsa cu o probabilitate foarte mare folosind doar câteva interogări. În special, dacă pur și simplu alegem câteva șiruri diferite de lungime în mod aleatoriu și interogăm pe acele șiruri, este puțin probabil să obținem aceeași valoare a funcției pentru toate atunci când este echilibrată.
Mai precis, dacă alegem șiruri de intrare uniform aleatoriu, evaluăm și răspundem cu dacă valorile funcției sunt toate aceleași și cu dacă nu, atunci vom fi întotdeauna corecți când este constantă și greșim în cazul că este echilibrată cu probabilitatea de doar Dacă luăm de exemplu, acest algoritm va răspunde corect cu o probabilitate mai mare de %.
Din acest motiv, avem totuși un avantaj destul de modest al calculului cuantic față de cel clasic — dar este un avantaj cuantificabil care reprezintă o îmbunătățire față de algoritmul lui Deutsch.
Deutsch-Jozsa cu Qiskit
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
import numpy as np
Pentru a implementa algoritmul Deutsch-Jozsa în Qiskit, vom începe prin a defini o funcție dj_query care generează un Circuit cuantic ce implementează un gate de interogare, pentru o funcție selectată aleatoriu ce satisface promisiunea problemei Deutsch-Jozsa.
Cu o probabilitate de 50%, funcția este constantă, iar cu o probabilitate de 50% funcția este echilibrată.
Pentru fiecare dintre cele două posibilități, funcția este selectată uniform dintre funcțiile de acel tip.
Argumentul reprezintă numărul de biți de intrare ai funcției.
def dj_query(num_qubits):
# Create a circuit implementing for a query gate for a random function
# satisfying the promise for the Deutsch-Jozsa problem.
qc = QuantumCircuit(num_qubits + 1)
if np.random.randint(0, 2):
# Flip output qubit with 50% chance
qc.x(num_qubits)
if np.random.randint(0, 2):
# return constant circuit with 50% chance
return qc
# Choose half the possible input strings
on_states = np.random.choice(
range(2**num_qubits), # numbers to sample from
2**num_qubits // 2, # number of samples
replace=False, # makes sure states are only sampled once
)
def add_cx(qc, bit_string):
for qubit, bit in enumerate(reversed(bit_string)):
if bit == "1":
qc.x(qubit)
return qc
for state in on_states:
qc.barrier() # Barriers are added to help visualize how the functions are created.
qc = add_cx(qc, f"{state:0b}")
qc.mcx(list(range(num_qubits)), num_qubits)
qc = add_cx(qc, f"{state:0b}")
qc.barrier()
return qc
Putem afișa implementarea ca Circuit cuantic a gate-ului de interogare folosind metoda draw, ca de obicei.
display(dj_query(3).draw(output="mpl"))
În continuare, definim o funcție care creează Circuit-ul Deutsch-Jozsa, primind ca argument o implementare ca Circuit cuantic a unui gate de interogare.
def compile_circuit(function: QuantumCircuit):
# Compiles a circuit for use in the Deutsch-Jozsa algorithm.
n = function.num_qubits - 1
qc = QuantumCircuit(n + 1, n)
qc.x(n)
qc.h(range(n + 1))
qc.compose(function, inplace=True)
qc.h(range(n))
qc.measure(range(n), range(n))
return qc
În final, este definită o funcție care rulează Circuit-ul Deutsch-Jozsa o singură dată.
def dj_algorithm(function: QuantumCircuit):
# Determine if a function is constant or balanced.
qc = compile_circuit(function)
result = AerSimulator().run(qc, shots=1, memory=True).result()
measurements = result.get_memory()
if "1" in measurements[0]:
return "balanced"
return "constant"
Putem testa implementarea noastră alegând o funcție aleatoriu, afișând implementarea ca Circuit cuantic a unui gate de interogare pentru această funcție și apoi rulând algoritmul Deutsch-Jozsa pe acea funcție.
f = dj_query(3)
display(f.draw("mpl"))
display(dj_algorithm(f))

'balanced'
Problema Bernstein-Vazirani
În continuare, vom discuta o problemă cunoscută sub numele de problema Bernstein-Vazirani. Se mai numește și problema eșantionării Fourier, deși există formulări mai generale ale acestei probleme care poartă același nume.
Mai întâi, să introducem câteva notații. Pentru oricare două șiruri binare și de lungime definim
Vom numi această operație produsul scalar binar. O modalitate alternativă de a o defini este următoarea.
Observă că aceasta este o operație simetrică, ceea ce înseamnă că rezultatul nu se schimbă dacă schimbăm și deci suntem liberi să facem asta ori de câte ori este convenabil. Uneori este util să ne gândim la produsul scalar binar ca la paritatea biților lui de pe pozițiile unde șirul are un sau echivalent, paritatea biților lui de pe pozițiile unde șirul are un
Cu această notație la îndemână, putem acum defini problema Bernstein-Vazirani.
Nu avem nevoie de un nou algoritm cuantic pentru această problemă; algoritmul Deutsch-Jozsa o rezolvă. În interesul clarității, să ne referim la Circuit-ul cuantic de mai sus, care nu include pasul clasic de post-procesare al calculului OR, ca la Circuit-ul Deutsch-Jozsa.
Analiza algoritmului
Pentru a analiza modul în care circuitul Deutsch-Jozsa funcționează pentru o funcție care satisface promisiunea problemei Bernstein-Vazirani, vom începe cu o observație rapidă. Folosind produsul scalar binar, putem descrie alternativ acțiunea a porți Hadamard asupra stărilor bazei standard ale qubiți astfel:
Similar cu ceea ce am văzut când am analizat algoritmul lui Deutsch, aceasta se datorează faptului că valoarea pentru orice întreg depinde doar de paritatea lui .
Revenind la circuitul Deutsch–Jozsa, după ce primul strat de porți Hadamard este aplicat, starea celor qubiți este
Poarta de interogare este apoi aplicată, care (prin fenomenul de retroacțiune a fazei) transformă starea în
Folosind formula noastră pentru acțiunea unui strat de porți Hadamard, vedem că al doilea strat de porți Hadamard transformă această stare în
Acum putem face câteva simplificări în exponentul lui din interiorul sumei. Ni se promite că pentru un șir deci putem exprima starea ca
Deoarece și sunt valori binare, putem înlocui adunarea cu SAU-exclusiv — din nou deoarece singurul lucru care contează pentru un întreg din exponentul lui este dacă acesta este par sau impar. Folosind simetria produsului scalar binar, obținem această expresie pentru stare:
(Parantezele au fost adăugate pentru claritate, deși nu sunt cu adevărat necesare, deoarece prin convenție produsul scalar binar are prioritate mai mare decât SAU-exclusiv.)
În acest punct, vom folosi următoarea formulă.
Putem obține această formulă printr-o formulă similară pentru biți,
împreună cu o expansiune a produsului scalar binar și SAU-exclusiv pe biți:
Aceasta ne permite să exprimăm starea circuitului imediat înainte de măsurători astfel:
Ultimul pas este să folosim încă o formulă, care funcționează pentru orice șir binar
Aici folosim o notație simplă pentru șiruri pe care o vom mai utiliza de câteva ori în lecție: este șirul de zerouri de lungime
Un mod simplu de a argumenta că această formulă funcționează este să considerăm cele două cazuri separat. Dacă atunci pentru orice șir deci valoarea fiecărui termen din sumă este și obținem prin sumarea și împărțirea la Pe de altă parte, dacă oricare dintre biții lui este egal cu atunci produsul scalar binar este egal cu pentru exact jumătate din posibilele alegeri pentru și pentru cealaltă jumătate — deoarece valoarea produsului scalar binar se inversează (de la la sau de la la ) dacă inversăm orice bit al lui într-o poziție unde are un
Dacă aplicăm acum această formulă pentru a simplifica starea circuitului înainte de măsurători, obținem
datorită faptului că dacă și numai dacă Astfel, măsurătorile dezvăluie exact șirul pe care îl căutăm.
Dificultatea clasică
În timp ce circuitul Deutsch-Jozsa rezolvă problema Bernstein-Vazirani cu o singură interogare, orice algoritm de interogare clasic trebuie să facă cel puțin interogări pentru a rezolva această problemă.
Aceasta poate fi argumentată printr-un argument numit teoretic informațional, care este foarte simplu în acest caz. Fiecare interogare clasică dezvăluie un singur bit de informație despre soluție, iar există biți de informație care trebuie descoperiți — deci sunt necesare cel puțin interogări.
Este, de fapt, posibil să rezolvi problema Bernstein-Vazirani clasic interogând funcția pe fiecare dintre cele șiruri care au un singur în fiecare poziție posibilă, și pentru toți ceilalți biți, ceea ce dezvăluie biții lui unul câte unul. Prin urmare, avantajul algoritmilor cuantici față de cei clasici pentru această problemă este de interogare față de interogări.
Bernstein-Vazirani cu Qiskit
Am implementat deja circuitul Deutsch-Jozsa mai sus, iar acum îl vom folosi pentru a rezolva problema Bernstein-Vazirani. Mai întâi vom defini o funcție care implementează o poartă de interogare pentru problema Bernstein-Vazirani pentru orice șir binar
def bv_query(s):
# Create a quantum circuit implementing a query gate for the
# Bernstein-Vazirani problem.
qc = QuantumCircuit(len(s) + 1)
for index, bit in enumerate(reversed(s)):
if bit == "1":
qc.cx(index, len(s))
return qc
display(bv_query("1011").draw(output="mpl"))
Acum putem crea o funcție care rulează circuitul Deutsch-Jozsa pe funcție, folosind funcția compile_circuit definită anterior.
def bv_algorithm(function: QuantumCircuit):
qc = compile_circuit(function)
result = AerSimulator().run(qc, shots=1, memory=True).result()
return result.get_memory()[0]
display(bv_algorithm(bv_query("1011")))
'1011'
Observație despre nomenclatură
În contextul problemei Bernstein-Vazirani, este frecvent ca algoritmul Deutsch-Jozsa să fie denumit „algoritmul Bernstein-Vazirani." Aceasta este ușor înșelător, deoarece algoritmul este algoritmul Deutsch-Jozsa, așa cum Bernstein și Vazirani au precizat clar în lucrarea lor.
Ceea ce au făcut Bernstein și Vazirani după ce au demonstrat că algoritmul Deutsch-Jozsa rezolvă problema Bernstein-Vazirani (așa cum este enunțată mai sus) a fost să definească o problemă mult mai complicată, cunoscută sub numele de problema recursivă a eșantionării Fourier. Aceasta este o problemă foarte artificială în care soluțiile la diferite instanțe ale problemei deblochează efectiv noi niveluri ale problemei organizate într-o structură arborescentă. Problema Bernstein-Vazirani este în esență doar cazul de bază al acestei probleme mai complicate.
Problema recursivă a eșantionării Fourier a fost primul exemplu cunoscut de problemă de interogare în care algoritmii cuantici au un avantaj super-polinomial față de algoritmii probabilistici, depășind astfel avantajul cuantic față de clasic oferit de algoritmul Deutsch-Jozsa. Intuitiv vorbind, versiunea recursivă a problemei amplifică avantajul de față de al algoritmilor cuantici la ceva mult mai mare.
Cel mai dificil aspect al analizei matematice care stabilește acest avantaj este demonstrarea că algoritmii de interogare clasici nu pot rezolva problema fără a face multe interogări. Aceasta este destul de tipic; pentru multe probleme poate fi foarte dificil să excluzi abordări clasice creative care le rezolvă eficient.
Problema lui Simon, și algoritmul pentru aceasta descris în secțiunea următoare, oferă un exemplu mult mai simplu de avantaj super-polinomial (și, de fapt, exponențial) al cuanticului față de clasic, și din acest motiv problema recursivă a eșantionării Fourier este mai rar discutată. Cu toate acestea, este o problemă computațională interesantă în sine.