Algoritmul lui Grover
Pentru acest modul Qiskit în Classrooms, studenții trebuie să aibă un mediu Python funcțional cu următoarele pachete instalate:
qiskitv2.1.0 sau mai nouqiskit-ibm-runtimev0.40.1 sau mai nouqiskit-aerv0.17.0 sau mai nouqiskit.visualizationnumpypylatexenc
Pentru a configura și instala pachetele de mai sus, consultă ghidul Instalare Qiskit. Pentru a rula joburi pe calculatoare cuantice reale, studenții vor trebui să își creeze un cont IBM Quantum® urmând pașii din ghidul Configurează-ți contul IBM Cloud.
Acest modul a fost testat și a folosit 12 secunde de timp QPU. Aceasta este o estimare de bună-credință; utilizarea ta efectivă poate varia.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'
Introducere
Algoritmul lui Grover este un algoritm cuantic fundamental care abordează problema căutării nestructurate: dat fiind un set de elemente și o modalitate de a verifica dacă un anumit element este cel căutat, cât de repede poți găsi elementul dorit? În calculul clasic, dacă datele nu sunt sortate și nu există nicio structură de exploatat, cea mai bună abordare este să verifici fiecare element unul câte unul, ceea ce duce la o complexitate a interogărilor de — în medie, va trebui să verifici aproximativ jumătate dintre elemente înainte de a găsi ținta.

Algoritmul lui Grover, introdus de Lov Grover în 1996, demonstrează cum un calculator cuantic poate rezolva această problemă mult mai eficient, necesitând doar pași pentru a găsi elementul marcat cu probabilitate ridicată. Aceasta reprezintă o accelerare pătratică față de metodele clasice, semnificativă pentru seturi mari de date.
Algoritmul operează în următorul context:
- Configurarea problemei: Ai o funcție care returnează 1 dacă este elementul dorit și 0 în caz contrar. Această funcție este adesea numită oracol sau cutie neagră, deoarece poți afla informații despre date doar interogând .
- Utilitatea cuantică: În timp ce algoritmii clasici pentru această problemă necesită, în medie, interogări, algoritmul lui Grover poate găsi soluția în aproximativ interogări, ceea ce este mult mai rapid pentru mare.
- Cum funcționează (la nivel înalt):
- Calculatorul cuantic creează mai întâi o superpozițe a tuturor stărilor posibile, reprezentând toate elementele posibile simultan.
- Apoi aplică în mod repetat o secvență de operații cuantice (iterația Grover) care amplifică probabilitatea răspunsului corect și o diminuează pe cea a celorlalte.
- După suficiente iterații, măsurarea stării cuantice produce răspunsul corect cu probabilitate ridicată.
Iată o diagramă foarte simplificată a algoritmului lui Grover, care omite multe detalii. Pentru o diagramă mai detaliată, consultă acest articol.

Câteva aspecte de reținut despre algoritmul lui Grover:
- Este optim pentru căutarea nestructurată: niciun algoritm cuantic nu poate rezolva problema cu mai puțin de interogări.
- Oferă doar o accelerare pătratică, nu exponențială — spre deosebire de alți algoritmi cuantici (de exemplu, algoritmul lui Shor pentru factorizare).
- Are implicații practice, cum ar fi accelerarea potențială a atacurilor prin forță brută asupra sistemelor criptografice, deși accelerarea nu este suficientă pentru a sparge singură cea mai mare parte din criptografia modernă.
Pentru studenții din ciclul universitar familiarizați cu conceptele de bază ale calculului și cu modelele de interogare, algoritmul lui Grover oferă o ilustrare clară a modului în care calculul cuantic poate depăși abordările clasice pentru anumite probleme, chiar și atunci când îmbunătățirea este „doar" pătratică. Servește, de asemenea, ca poartă de intrare în înțelegerea algoritmilor cuantici mai avansați și a potențialului mai larg al calculului cuantic.
Amplificarea amplitudinii este un algoritm cuantic de uz general, sau subrutină, care poate fi folosit pentru a obține o accelerare pătratică față de o serie de algoritmi clasici. Algoritmul lui Grover a fost primul care a demonstrat această accelerare pe probleme de căutare nestructurată. Formularea unei probleme de căutare Grover necesită o funcție oracol care marchează una sau mai multe stări din baza computațională drept stările pe care dorim să le găsim, și un Circuit de amplificare care crește amplitudinea stărilor marcate, suprimând în consecință stările rămase.
Aici demonstrăm cum să construiești oracoli Grover și să folosești GroverOperator din biblioteca de Circuit-uri Qiskit pentru a configura cu ușurință o instanță de căutare Grover. Primitivul Sampler din runtime permite execuția fără probleme a Circuit-urilor Grover.
Matematică
Să presupunem că există o funcție care mapează șiruri binare la o singură variabilă binară, adică
Un exemplu definit pe este
Un alt exemplu definit pe este
Ești solicitat să găsești stările cuantice corespunzătoare acelor argumente ale lui care sunt mapate la 1. Cu alte cuvinte, găsește toți astfel încât (sau, dacă nu există soluție, raportează acest lucru). Vom denumi non-soluțiile . Bineînțeles, vom face acest lucru pe un calculator cuantic, folosind stări cuantice, astfel că este util să exprimi aceste șiruri binare ca stări:
Folosind notația stărilor cuantice (Dirac), căutăm una sau mai multe stări speciale într-un set de stări posibile, unde este numărul de Qubiți, iar non-soluțiile sunt notate cu
Putem considera că funcția este furnizată de un oracol: o cutie neagră pe care o putem interoga pentru a-i determina efectul asupra unei stări În practică, vom cunoaște adesea funcția, dar poate fi foarte complicat de implementat, ceea ce înseamnă că reducerea numărului de interogări sau aplicații ale lui ar putea fi importantă. Alternativ, ne putem imagina o paradigmă în care o persoană interoghează un oracol controlat de o altă persoană, astfel încât nu cunoaștem funcția oracolului, ci cunoaștem doar acțiunea sa asupra anumitor stări prin interogare.
Aceasta este o problemă de căutare nestructurată, în sensul că nu există nimic special în care să ne ajute în căutare. Rezultatele nu sunt sortate și nici soluțiile nu sunt cunoscute a fi grupate și așa mai departe. Consideră cărțile de telefon vechi, tipărite, ca analogie. Această căutare nestructurată ar fi ca și cum ai parcurge cartea căutând un anumit număr, nu ca și cum ai căuta printr-o listă alfabetică de nume.
În cazul în care se caută o singură soluție, clasic, acest lucru necesită un număr de interogări liniar în . Evident, ai putea găsi o soluție din prima încercare, sau s-ar putea să nu găsești nicio soluție în primele încercări, astfel că trebuie să interoghezi al -lea input pentru a vedea dacă există vreo soluție. Deoarece funcțiile nu au nicio structură exploatabilă, vei necesita încercări în medie. Algoritmul lui Grover necesită un număr de interogări sau calcule ale lui care scalează ca
Schiță a Circuit-urilor din algoritmul lui Grover
O parcurgere matematică completă a algoritmului lui Grover poate fi găsită, de exemplu, în Fundamentals of quantum algorithms, un curs susținut de John Watrous pe IBM Quantum Learning. O tratare condensată este furnizată într-o anexă la sfârșitul acestui modul. Dar deocamdată, vom trece în revistă doar structura generală a Circuit-ului cuantic care implementează algoritmul lui Grover.
Algoritmul lui Grover poate fi descompus în următoarele etape:
- Pregătirea unei superpozițe inițiale (aplicarea Gate-urilor Hadamard pe toți Qubiții)
- „Marcarea" stării(stărilor) țintă cu o inversare de fază
- O etapă de „difuzie" în care Gate-uri Hadamard și o inversare de fază sunt aplicate pe toți Qubiții.
- Posibile repetări ale etapelor de marcare și difuzie pentru a maximiza probabilitatea de a măsura starea țintă
- Măsurare
Adesea, Gate-ul de marcare și straturile de difuzie formate din și sunt denumite colectiv „operatorul Grover". În această diagramă, este reprezentată o singură repetiție a operatorului Grover.
Gate-urile Hadamard sunt bine cunoscute și folosite pe scară largă în calculul cuantic. Gate-ul Hadamard creează stări de superpozițe. Concret, este definit prin
Acțiunea sa asupra oricărei alte stări este definită prin liniaritate. În special, un strat de Gate-uri Hadamard ne permite să trecem de la starea inițială cu toți Qubiții în (notată ) la o stare în care fiecare Qubit are o anumită probabilitate de a fi măsurat în sau aceasta ne permite să explorăm spațiul tuturor stărilor posibile diferit față de calculul clasic.
O proprietate corolar importantă a Gate-ului Hadamard este că aplicarea sa a doua oară poate anula astfel de stări de superpozițe:
Acest lucru va fi important imediat.
Verifică-ți înțelegerea
Citește întrebarea de mai jos, gândește-te la răspunsul tău, apoi apasă pe triunghi pentru a dezvălui soluția.
Pornind de la definiția Gate-ului Hadamard, demonstrează că o a doua aplicare a Gate-ului Hadamard anulează astfel de superpozițe, conform afirmației de mai sus.
Răspuns:
Când aplicăm X la starea , obținem valoarea +1 și la starea obținem -1, deci dacă am avea o distribuție 50-50, am obține o valoare de așteptare de 0.
Gate-ul este mai puțin comun și este definit conform
În final, Gate-ul este definit prin
Observă că efectul acestuia este că inversează semnul pe o stare țintă pentru care și lasă celelalte stări neafectate.
La un nivel foarte înalt și abstract, poți gândi pașii din Circuit în felul următor:
- Primul strat Hadamard: pune Qubiții într-o superpozițe a tuturor stărilor posibile.
- : marchează starea(stările) țintă adăugând un semn „-" în față. Acest lucru nu modifică imediat probabilitățile de măsurare, dar schimbă modul în care se va comporta starea țintă în pașii următori.
- Un alt strat Hadamard: semnul „-" introdus în pasul anterior va schimba semnul relativ dintre anumiți termeni. Deoarece Gate-urile Hadamard transformă un amestec de stări computaționale într-o stare computațională, și transformă în această diferență de semn relativ poate începe acum să joace un rol în ce stări sunt măsurate.
- Un ultim strat de Gate-uri Hadamard este aplicat, după care se efectuează măsurătorile. Vom vedea în mai mare detaliu cum funcționează acest lucru în secțiunea următoare.
Exemplu
Pentru a înțelege mai bine cum funcționează algoritmul lui Grover, să lucrăm printr-un exemplu mic, cu doi qubiți. Aceasta poate fi considerată opțională pentru cei care nu se concentrează pe mecanica cuantică și notația Dirac. Dar pentru cei care speră să lucreze substanțial cu calculatoare cuantice, este foarte recomandată.
Iată diagrama circuitului cu stările cuantice etichetate în diferite poziții pe parcurs. Reține că, cu doar doi qubiți, există doar patru stări posibile care ar putea fi măsurate în orice circumstanțe: , , și .

Să presupunem că oracolul (, necunoscut nouă) marchează starea . Vom parcurge acțiunile fiecărui set de Gate-uri cuantice, inclusiv oracolul, și vom vedea ce distribuție de stări posibile apare la momentul măsurătorii. La bun început, avem
Folosind definiția Gate-urilor Hadamard, avem
Acum oracolul marchează starea țintă:
Observă că în această stare, toate cele patru rezultate posibile au aceeași probabilitate de a fi măsurate. Toate au o pondere de magnitudine ceea ce înseamnă că fiecare are o șansă de de a fi măsurată. Așadar, deși starea este marcată prin faza „-", aceasta nu a dus încă la nicio creștere a probabilității de a măsura acea stare. Continuăm aplicând următorul strat de Gate-uri Hadamard.
Combinând termenii similari, obținem
Acum inversează semnul tuturor stărilor cu excepția lui :
Și în final, aplicăm ultimul strat de Gate-uri Hadamard:
Merită să parcurgi combinarea acestor termeni ca să te convingi că rezultatul este într-adevăr:
Adică, probabilitatea de a măsura este de 100% (în absența zgomotului și a erorilor), iar probabilitatea de a măsura orice altă stare este zero.
Acest exemplu cu doi qubiți a fost un caz deosebit de curat; algoritmul lui Grover nu va produce întotdeauna o șansă de 100% de a măsura starea țintă. Mai degrabă, va amplifica probabilitatea de a măsura starea țintă. De asemenea, operatorul Grover poate fi necesar să fie repetat de mai multe ori.
În secțiunea următoare, vom pune acest algoritm în practică folosind calculatoare cuantice IBM® reale.
Avertisment evident
Pentru a aplica algoritmul lui Grover, a trebuit să construim operatorul Grover, ceea ce înseamnă că trebuie să putem inversa faza stărilor care satisfac criteriile noastre de soluție. Acest lucru ridică întrebarea: dacă ne cunoaștem mulțimea soluțiilor atât de bine încât putem proiecta un Circuit cuantic să le eticheteze pe fiecare, ce mai căutăm?! Răspunsul este triplu, și vom reveni la el pe tot parcursul tutorialului:
(1) Aceste tipuri de algoritmi de interogare implică adesea două părți: una care deține oracolul ce stabilește criteriile de soluție, și alta care încearcă să ghicească/găsească o stare de soluție. Faptul că o persoană poate construi oracolul nu elimină necesitatea căutării.
(2) Există probleme pentru care este mai ușor să specifici un criteriu de soluție decât să găsești soluția. Cel mai cunoscut exemplu în acest sens este probabil identificarea factorilor primi ai numerelor mari. Algoritmul lui Grover nu este deosebit de eficient în rezolvarea acelei probleme specifice; am folosi algoritmul lui Shor pentru factorizarea primară. Acesta este doar un exemplu pentru a sublinia că a cunoaște criteriul privind comportamentul unei stări nu este întotdeauna același lucru cu a cunoaște starea.
(3) Algoritmul lui Grover nu returnează doar date clasice. Adevărat, dacă facem o măsurătoare a stării finale după repetări ale operatorului Grover, este probabil să obținem informații clasice care identifică starea de soluție. Dar ce se întâmplă dacă nu dorim informații clasice; ce se întâmplă dacă dorim o stare de soluție pregătită pe un calculator cuantic pentru utilizare ulterioară într-un alt algoritm? Algoritmul lui Grover produce de fapt o stare cuantică cu soluțiile puternic ponderate. Prin urmare, te poți aștepta să găsești algoritmul lui Grover ca subrutină în algoritmi cuantici mai complecși.
Având acestea în vedere, să parcurgem mai multe exemple. Vom începe cu un exemplu în care starea de soluție este clar specificată, astfel încât să putem urmări logica algoritmului, și vom avansa spre exemple în care utilitatea algoritmului lui Grover devine mai clară.
Import-uri generale și abordare
Începem prin a importa mai multe pachete necesare.
# Built-in modules
import math
# Imports from Qiskit
from qiskit import QuantumCircuit
from qiskit.circuit.library import grover_operator, MCMTGate, ZGate
from qiskit.visualization import plot_distribution
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
Pe tot parcursul acestui și al altor tutoriale, vom folosi un cadru pentru calculul cuantic cunoscut sub numele de „Qiskit patterns", care împarte fluxurile de lucru în următorii pași:
- Pasul 1: Maparea intrărilor clasice la o problemă cuantică
- Pasul 2: Optimizarea problemei pentru execuție cuantică
- Pasul 3: Execuția folosind Qiskit Runtime Primitives
- Pasul 4: Post-procesare și analiză clasică
În general, vom urma acești pași, deși nu îi vom eticheta întotdeauna explicit.
Activitatea 1: Găsește o singură stare țintă dată
Pasul 1: Mapează intrările clasice la o problemă cuantică
Avem nevoie ca poarta de interogare de fază să aplice o fază globală (-1) pe stările soluție și să lase stările non-soluție neafectate. Altfel spus, algoritmul lui Grover necesită un oracol care specifică una sau mai multe stări ale bazei de calcul marcate, unde „marcat" înseamnă o stare cu o fază de -1. Acest lucru se realizează folosind o poartă controlled-Z sau generalizarea sa multi-controlată pe Qubiți. Pentru a înțelege cum funcționează, considerăm un exemplu specific pentru șirul de biți {110}. Dorim un Circuit care acționează asupra stării și aplică o fază dacă (unde am inversat ordinea șirului binar, din cauza notației din Qiskit, care plasează Qubit-ul cel mai puțin semnificativ (de obicei 0) la dreapta).
Astfel, dorim un Circuit care realizează