Transformata Fourier cuantică
Pentru acest modul Qiskit in 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 computere 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 13 secunde de timp QPU. Aceasta este o estimare de bună-credință; utilizarea ta reală poate varia.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer 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
Transformata Fourier este un instrument omniprezent cu aplicații în matematică, fizică, procesarea semnalelor, compresia datelor și nenumărate alte domenii. O versiune cuantică a transformatei Fourier, numită pe bună dreptate transformata Fourier cuantică, stă la baza unora dintre cei mai importanți algoritmi cuantici.
Astăzi, după o reîmprospătare a transformatei Fourier clasice, vom vorbi despre cum implementăm transformata Fourier cuantică pe un computer cuantic. Apoi, vom discuta una dintre aplicațiile transformatei Fourier cuantice într-un algoritm numit algoritmul de estimare a fazei. Estimarea cuantică a fazei este o subrutină în celebrul algoritm de factorizare al lui Shor, uneori denumit „bijuteria de coroană" a calculului cuantic. Acest modul se îndreaptă spre un alt modul dedicat în întregime algoritmului lui Shor, dar este conceput și ca unul de sine stătător. Transformata Fourier cuantică este un algoritm fascinant și util în sine!
Transformata Fourier clasică
Înainte să ne aruncăm în transformata Fourier cuantică, să ne reîmprospătăm mai întâi cunoștințele despre versiunea clasică. Transformata Fourier este o metodă de transformare dintr-o „bază" în alta. Poți să te gândești la două baze ca la perspective diferite ale aceleiași probleme — ambele sunt moduri valide de a exprima o funcție, dar una sau cealaltă poate fi mai revelatoare, în funcție de problema în cauză. Câteva exemple de perechi de baze conectate prin transformata Fourier sunt poziția și momentul cinetic, respectiv timpul și frecvența.
Să vedem un exemplu despre cum ne poate ajuta transformata Fourier să determinăm ce notă cântă un instrument pe baza formei de undă audio. De obicei, vedem formele de undă reprezentate în baza timp — adică amplitudinea undei este exprimată ca funcție de timp.

Putem aplica transformata Fourier acestei forme de undă pentru a trece din baza timp în baza frecvență:

În baza frecvență, putem vedea cu ușurință un vârf clar la aproximativ 260 Hz. Acesta este un Do central!
Acum, poate ai fi reușit să determini că se cânta un Do central fără să folosești transformata Fourier, dar ce se întâmplă dacă mai multe note sunt cântate simultan? Atunci forma de undă devine mai complicată atunci când o reprezentăm în baza timp:

Dar spectrul de frecvență identifică clar trei vârfuri:

Acesta a fost un acord Do major, cântând notele Do, Mi și Sol.
Acest tip de analiză Fourier ne poate ajuta să extragem componentele de frecvență ale oricărui semnal complicat.
Transformata Fourier discretă
Transformata Fourier este utilă pentru numeroase aplicații de procesare a semnalelor. Dar în majoritatea acestor aplicații din lumea reală (inclusiv exemplul muzical de mai sus), dorim să transformăm un set discret de puncte de date — nu o funcție continuă. În acest caz, folosim transformata Fourier discretă. Transformata Fourier discretă (DFT) acționează asupra unui vector și îl mapează la vectorul conform formulei:
unde luăm . (Rețineți că există și alte convenții care au un semn minus în exponent, deci fii atent când întâlnești DFT în practică.) Reamintim că este o funcție periodică, cu perioada . Astfel, prin înmulțirea cu această funcție, transformata Fourier este, în esență, o modalitate de a descompune funcția (discretă) într-o combinație liniară a funcțiilor periodice constitutive, fiecare cu perioada .
Transformata Fourier cuantică
Acum am văzut cum transformata Fourier este folosită pentru a reprezenta o funcție ca o combinație liniară a unui nou set de „funcții de bază". Transformările de bază se fac regulat și pe stările qubit. De exemplu, starea unui singur qubit poate fi exprimată în baza computațională , cu stările de bază și , sau în baza cu stările de bază și . Ambele sunt la fel de valide, dar una poate fi mai naturală decât cealaltă, în funcție de tipul de problemă pe care încerci să o rezolvi.
Stările qubit pot fi exprimate și în baza Fourier, unde o stare este exprimată în funcție de o combinație liniară a stărilor de bază Fourier , mai degrabă decât stările de bază computaționale obișnuite, . Pentru a face acest lucru, trebuie să aplici o transformată Fourier cuantică (QFT):
cu ca mai sus, iar este numărul de stări de bază din sistemul tău cuantic. Rețineți că, deoarece lucrăm acum cu Qubiți, Qubiți îți dau stări de bază, deci . Aici, stările de bază sunt scrise ca un singur număr unde variază de la la , dar mai frecvent vei vedea stările de bază exprimate ca , , , ..., , unde fiecare cifră binară reprezintă starea Qubitului 0 până la , de la dreapta la stânga. Există o modalitate simplă de a converti aceste stări binare la un singur număr: tratează-le pur și simplu ca numere binare! Deci, , , , , și așa mai departe, până la .
Construiește intuiția pentru stările de bază Fourier
Deci, tocmai am trecut în revistă care sunt stările de bază computaționale și cum sunt ordonate: sunt setul de stări în care fiecare qubit este fie în , fie în , și le ordonăm de la starea în care toți Qubiții sunt , , până la starea în care sunt toți , .
Dar cum putem înțelege stările de bază Fourier? Toate stările de bază Fourier sunt superpoziții egale ale tuturor stărilor de bază computaționale, dar fiecare stare diferă de celelalte prin periodicitatea fazei componentelor. Pentru a înțelege acest lucru mai concret, să aruncăm o privire la cele patru stări de bază Fourier ale unui sistem cu doi Qubiți. Cea mai joasă stare Fourier este cea a cărei fază nu variază deloc:
Putem vizualiza această stare reprezentând amplitudinea complexă a fiecăruia dintre termeni. Linia roșie ghidează ochiul pentru a-ți arăta cum faza acestei amplitudini se răsucește în jurul planului complex ca funcție a stării de bază computaționale. Pentru , faza rămâne constantă:

Următoarea stare de bază Fourier este cea ale cărei faze ale componentelor se răsucesc de la la o singură dată:
Și putem vedea această răsucire în graficul amplitudinii complexe față de starea de bază computațională:

Deci, fiecare stare are o fază cu radiani mai mare decât starea anterioară, când sunt ordonate în mod standard, deoarece în acest exemplu avem patru stări de bază (). Următoarea stare de bază se răsucește de la 0 la de două ori:

În sfârșit, cea mai înaltă componentă Fourier este cea cu faza variind cel mai rapid. Pentru exemplul nostru cu doi Qubiți, este cea ale cărei faze se răsucesc de la 0 la de trei ori:

În general, pentru o stare cu Qubiți, vor exista stări de bază Fourier, a căror frecvență în variația fazei variază de la constantă, pentru , la rapid variabilă pentru , completând răsuciri în jurul lui peste superpoziția de stări. Deci, când aplicăm QFT unui stat cuantic, facem practic aceeași analiză de bază pe care am făcut-o pentru forma de undă muzicală în Introducere. Determinăm componentele de frecvență Fourier care contribuie la crearea stării cuantice de interes.
Încearcă câteva exemple de QFT-uri
Să continuăm să ne construim intuiția pentru transformata cuantică Fourier prin crearea unui stare în baza computațională, apoi să vedem ce se întâmplă când aplicăm QFT-ul asupra ei. Deocamdată, vom trata QFT-ul ca pe o cutie neagră pe care o aplicăm folosind QFTGate din biblioteca de circuite Qiskit. Mai târziu, vom arunca o privire sub capotă pentru a vedea cum este implementat.
Începem prin a încărca pachetele necesare și a selecta un dispozitiv pe care să rulăm Circuit-ul nostru:
import numpy as np
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from qiskit.circuit.library import QFTGate
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService
# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler
service = QiskitRuntimeService()
# Use the least busy backend
# backend = service.least_busy(operational=True, simulator=False, min_num_qubits = 127)
backend = service.backend("ibm_pinguino2")
print(backend.name)
ibm_pinguino2
Dacă nu ai timp disponibil în contul tău sau dorești să folosești un simulator din orice motiv, poți rula celula de mai jos pentru a configura un simulator care va imita dispozitivul cuantic selectat anterior:
# Load the backend sampler
from qiskit.primitives import BackendSamplerV2
# Load the Aer simulator and generate a noise model based on the currently-selected backend.
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel
noise_model = NoiseModel.from_backend(backend)
# Define a simulator using Aer, and use it in Sampler.
backend_sim = AerSimulator(noise_model=noise_model)
sampler_sim = BackendSamplerV2(backend=backend_sim)
# Alternatively, load a fake backend with generic properties and define a simulator.
from qiskit.providers.fake_provider import GenericBackendV2
backend_gen = GenericBackendV2(num_qubits=18)
sampler_gen = BackendSamplerV2(backend=backend_gen)
O singură stare din baza computațională
Mai întâi, să încercăm să transformăm o singură stare din baza computațională. Vom începe prin a crea o stare computațională aleatoare:
# Step 1: Map
qubits = 4
N = 2**qubits
qc = QuantumCircuit(qubits)
# flip state of random qubits to put in a random single computational basis state
for i in range(1, qubits):
if np.random.randint(0, 2):
qc.x(i)
# make a copy of the above circuit. (to be used when we apply the QFT in next part)
qc_qft = qc.copy()
qc.measure_all()
qc.draw("mpl")
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
# Step 3: Run the job on a real quantum computer OR try fake backend
sampler = Sampler(mode=backend)
pubs = [qc_isa]
# Run the job on real quantum device
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# OR Run the job on the Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# res = job.result()
# counts = res[0].data.meas.get_counts()
# Step 4: Post-Process
plot_histogram(counts)
Acum, să transformăm Fourier această stare folosind QFTGate:
# Step 1: Map
qc_qft.compose(QFTGate(qubits), inplace=True)
qc_qft.measure_all()
qc_qft.draw("mpl")
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc_qft)
# Step 3: Run the job on a real quantum computer - try fake backend
sampler = Sampler(mode=backend)
pubs = [qc_isa]
# Run the job on real quantum device
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# OR Run the job on the Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# res = job.result()
# counts = res[0].data.meas.get_counts()
# Step 4: Post-Process
plot_histogram(counts)
După cum poți vedea, măsurăm populațiile fiecărei stări ca fiind mai mult sau mai puțin egale, cu mici variații datorate zgomotului experimental și statistic. Deci, dacă aplici QFT-ul unui singur stat din baza computațională, rezultatul este o superpozitie egală a tuturor stărilor. Dacă ești familiarizat cu transformatele Fourier, acest lucru probabil nu te surprinde. Un principiu de bază care ne poate ajuta să construim o legătură intuitivă între o funcție și transformata sa Fourier este că lățimea unei funcții este invers proporțională cu lățimea transformatei sale Fourier. Deci, ceva foarte localizat în timp, de exemplu, ca un impuls foarte scurt, va necesita o gamă largă de frecvențe pentru a genera acel impuls. Acel semnal va fi foarte larg în spațiul Fourier.
Acest fapt este de fapt legat de incertitudinea cuantică! Principiul incertitudinii al lui Heisenberg este enunțat de obicei ca . Deci, dacă incertitudinea în () este mică, incertitudinea în impuls () trebuie să fie mare, și invers. Se dovedește că trecerea din baza de poziție în baza de impuls se realizează printr-o transformată Fourier.
Notă: Ține minte că măsurăm populațiile în fiecare dintre stările de bază, deci pierdem informații despre fazele relative dintre diferitele părți ale superpozitiei. Deci, deși QFT-ul oricărui singur stat din baza computațională va produce aceeași distribuție egală a populației peste toate stările de bază, fazele nu vor fi neapărat aceleași.
Două stări din baza computațională
Acum, haideți să vedem ce se întâmplă atunci când pregătim o superpunere de stări din baza computațională. Ce crezi că va arăta transformata Fourier în acest caz?
Să alegem superpunerea:
# Step 1: Map
qubits = 4
N = 2**qubits
qc = QuantumCircuit(qubits)
# To make this state, we just need to apply a Hadamard to the last qubit
qc.h(qubits - 1)
qc_qft = qc.copy()
qc.measure_all()
qc.draw("mpl")
# First, let's go through steps 2-4 for the first circuit, qc
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
# Step 3: Run the job on a real quantum computer - try fake backend
sampler = Sampler(mode=backend)
pubs = [qc_isa]
# Run the job on real quantum device
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# OR run the job on the Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# res = job.result()
# counts = res[0].data.meas.get_counts()
# Step 4: Post-process
plot_histogram(counts)
Acum, haideți să aplicăm transformata Fourier acestei stări cu QFTGate:
# Step 1: Map
qc_qft.compose(QFTGate(qubits), inplace=True)
qc_qft.measure_all()
qc_qft.draw("mpl")
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc_qft)
# Step 3: Run the job on a real quantum computer OR try fake backend
sampler = Sampler(mode=backend)
pubs = [qc_isa]
# Run the job on real quantum device
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# OR run the job on the Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# res = job.result()
# counts = res[0].data.meas.get_counts()
# Step 4: Post-process
plot_histogram(counts)
Acesta ar putea fi un rezultat mai surprinzător. Se pare că QFT-ul stării este o superpunere a tuturor stărilor din baza cu index par. Dar dacă ne gândim înapoi la vizualizarea fiecărei stări din baza și la modul în care faza fiecărei componente se înfășoară de ori în jurul lui , motivul pentru care obținem acest rezultat poate deveni clar.
Check your understanding
Read the question(s) below, think about your answer, then click the triangle to reveal the solution.
Folosind indiciul de mai sus, explică de ce rezultatul obținut pentru QFT-ul lui este de așteptat.
Răspuns:
Starea originală are o fază relativă de 0 (sau un multiplu întreg al lui ) între cele două părți ale superpunerii. Deci știm că această stare are componente Fourier ale căror faze se potrivesc în același mod: cele care au o deplasare de fază de 0 între termenul |0000> și termenul |1000>. Fiecare stare din baza Fourier este compusă din termeni a căror fază se acumulează cu o rată de , adică, ordonați în modul obișnuit, fiecare termen din superpunere are o fază cu mai mare decât termenul precedent. Deci, la jumătatea drumului , vrem ca faza să fie un multiplu întreg al lui . Acest lucru se întâmplă când este par.
Ce superpunere de stări computaționale ar corespunde unui QFT cu vârfuri pe fiecare număr binar impar?
Răspuns:
Dacă ai aplica QFT-ul stării , ai vedea vârfuri pe fiecare stare cu număr binar impar.
Descompunerea algoritmului QFT
Acum că am căpătat mai multă intuiție despre relația dintre stările qubit din baza computațională și baza Fourier, haideți să aprofundăm algoritmul QFT în sine. Cu alte cuvinte, ce poartă-uri implementăm efectiv pe calculatorul cuantic pentru a realiza această transformare?
Să începem cu ceva simplu, cu un singur qubit. Asta înseamnă că vom avea două stări de bază. QFT transformă stările din baza computațională și în stările din baza Fourier și :
Verifică-ți înțelegerea
Citește întrebarea (întrebările) de mai jos, gândește-te la răspuns, apoi apasă pe triunghi pentru a dezvălui soluția.
Folosește ecuația pentru QFT din secțiunea anterioară pentru a verifica cele două stări ale bazei Fourier de mai sus.
Răspuns:
Formula generală a QFT este:
Pentru un singur qubit (), , și . Astfel, avem
Aruncă o privire la acele două ecuații. Poate că știi deja ce poartă cuantic poate fi folosit pentru a implementa această transformată. Adică există un poartă care transformă stările bazei computaționale și în stările respective ale bazei Fourier și . Este un Gate Hadamard! Acest lucru devine și mai clar dacă introducem o reprezentare matriceală a operației QFT:
Dacă nu ești familiarizat cu această notație pentru exprimarea unui operator cuantic, nu-i bai! Este o modalitate de a reprezenta o matrice , unde și indexează coloanele și rândurile matricei, de la la , iar este valoarea acelei intrări particulare. Astfel, intrarea din coloana 0 și rândul 2, de exemplu, ar fi .
În această reprezentare, fiecare stare a bazei computaționale este asociată cu unul dintre vectorii bazei:
Dacă dorești să înveți mai în profunzime despre această reprezentare, consultă lecția lui John Watrous despre sisteme multiple din cursul Basics of quantum information.
Să încercăm să construim matricea pentru QFT. Folosind formula de mai sus, găsim că
\text\{QFT\}_4 = \frac\{1\}\{2\} \begin\{pmatrix\} 1 & 1 & 1 & 1 \\ 1 & i & -1 & -i \\ 1 & -1 & 1 & -1 \\ 1 & -i & -1 & i \\ \end\{pmatrix\}
Pentru a implementa această matrice pe un calculator cuantic, va trebui să determinăm ce combinație de poartă-uri aplicate căror Qubiți ne va oferi o transformare unitară care să corespundă matricei de mai sus. Știm deja unul dintre Gate-urile necesare: Hadamard. Un alt Gate de care vom avea nevoie este poartă-ul de fază controlată, care aplică o fază relativă stării Qubitului țintă, atât timp cât qubit-ul de control se află în starea . În formă matriceală, acesta arată astfel:
\text\{CP\}_\alpha = \begin\{pmatrix\} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & e^\{i\alpha\} \\ \end\{pmatrix\}
Deoarece doar starea este modificată, de fapt nu contează care qubit este considerat „control" și care este „țintă." Rezultatul va fi același în ambele cazuri.
În final, vom mai avea nevoie și de câteva Gate-uri SWAP. Un poartă SWAP schimbă stările a doi Qubiți. Arată astfel:
\text\{SWAP\}_\alpha = \begin\{pmatrix\} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ \end\{pmatrix\}
Procedura pentru a construi un circuit QFT pe Qubiți este iterativă — mai întâi aplici QFT pe Qubiții până la , apoi adaugi câteva Gate-uri între qubit-ul și ceilalți Qubiți. Dar pentru a aplica QFT, trebuie mai întâi să aplici QFT pe Qubiții 2 până la , apoi să adaugi câteva Gate-uri între qubit-ul 1 și Qubiții rămași până la . Este ca o păpușă matrioșcă: fiecare păpușă adaugă un factor de doi la dimensiunea Circuit-ului QFT, cea mai mică păpușă aflându-se chiar în centru, fiind QFT, sau Gate-ul Hadamard.
Pentru a introduce o păpușă în următoarea mărime mai mare, mărind astfel dimensiunea QFT cu un factor de doi, urmezi întotdeauna aceeași procedură:
- Mai întâi, aplică QFT pe cei Qubiți de la bază. Aceasta este „păpușa mai mică" din setul de matrioșcă pe care urmează să o introduci în păpușa mai mare.
- Folosește qubit-ul următor de deasupra ca și control și aplică Gate-uri de fază controlată fiecăruia dintre cei Qubiți de la bază, cu faze corespunzătoare stărilor bazei standard ale fiecăruia dintre cei Qubiți rămași.
- Aplică un Hadamard pe acel qubit de la vârf care a fost folosit ca și control în Gate-urile de fază.
- Folosește Gate-uri SWAP pentru a permuta ordinea Qubiților, astfel încât bitul cel mai puțin semnificativ (de sus) să devină bitul cel mai semnificativ (de jos), iar toți ceilalți să se deplaseze cu unul în sus.
Am folosit deja funcția QFTGate din biblioteca de circuit-uri Qiskit, dar acum să aruncăm o privire în interiorul câtorva dintre aceste poartă-uri QFT pentru a verifica procedura de mai sus. Putem face asta cu decompose().
qc = QuantumCircuit(1)
qc.compose(QFTGate(1), inplace=True)
qc.decompose().draw("mpl")
qc = QuantumCircuit(2)
qc.compose(QFTGate(2), inplace=True)
qc.decompose().draw("mpl")
qc = QuantumCircuit(3)
qc.compose(QFTGate(3), inplace=True)
qc.decompose().draw("mpl")
qc = QuantumCircuit(4)
qc.compose(QFTGate(4), inplace=True)
qc.decompose().draw("mpl")
Sperăm că, din primele patru QFT-uri, poți începe să observi cum fiecare este imbricată în cea mai mare de dimensiune superioară. Poate ai observat, totuși, că unele dintre Gate-urile de fază nu sunt exact conform procedurii prezentate mai sus, iar SWAP-urile nu apar după fiecare subrutină, ci doar la sfârșitul QFT complet. Aceasta ne economisește Gate-uri inutile, care ar face Circuit-ul să dureze mai mult și să fie mai predispus la erori. În loc să implementeze SWAP-ul după fiecare păpușă imbricată, Circuit-ul urmărește unde ar trebui să se afle fiecare stare de qubit și ajustează în consecință Qubiții la care aplică Gate-urile de fază. Apoi, un set final de SWAP-uri la sfârșit pune totul la locul potrivit.
Aplică QFT: Estimarea fazei
Să vedem cum poate fi folosit QFT pentru a rezolva o problemă utilă în calculul cuantic. Calculul transformatei cuantice Fourier inverse este un pas necesar într-un algoritm cunoscut sub denumirea de Estimare Cuantică a Fazei (QPE), care este ea însăși o subrutină în multe alte algoritme, inclusiv în „bijuteria de coroană" a algoritmelor cuantice, algoritmul de factorizare al lui Shor.
Scopul QPE este de a estima valorile proprii ale unui operator unitar. Operatorii unitari sunt omniprezenti în calculul cuantic și, adesea, găsirea valorilor proprii ale vectorilor proprii asociați este un pas necesar într-un algoritm mai amplu. În funcție de problemă, o valoare proprie poate reprezenta energia unui Hamiltonian într-o problemă de tip simulare, ne poate ajuta să găsim factorii primi ai unui număr în algoritmul lui Shor sau poate conține alte informații esențiale. QPE este una dintre cele mai importante și mai utilizate subrutine din calculul cuantic.
Deci, ce legătură are aceasta cu o transformată cuantică Fourier? Ei bine, după cum poate îți amintești, orice valoare proprie a unui operator unitar are magnitudinea . Deci putem scrie fiecare valoare proprie ca un număr complex cu magnitudinea unu:
unde este un număr real între 0 și 1. Dacă dorești mai multe informații despre matricele unitare, vezi lecția lui John Watrous pe acest subiect în Basics of quantum information.
Observă că este periodic în . Deja, aceasta îți poate sugera că ar putea fi implicat un QFT, deoarece am văzut cât de utile sunt QFT-urile pentru analiza funcțiilor periodice. Mai jos, vom parcurge algoritmul și vom vedea exact cum intervine QFT-ul.
Cum funcționează QPE
Mai întâi, vom începe cu cel mai simplu algoritm QPE, care estimează aproximativ faza la un singur digit binar de precizie. Cu alte cuvinte, acest algoritm poate distinge între și , dar nu poate face mai bine de atât. Iată diagrama Circuit-ului:

Qubiții sunt pregătiți în starea , unde qubit-ul se află în starea , iar Qubiții rămași se află în starea , care este o stare proprie a lui . După primul Hadamard, starea Qubiților devine:
Următorul Gate este un poartă „controlled-". Acesta aplică operația unitară Qubiților de jos care se află în starea dacă qubit-ul 0 se află în starea , dar nu face nimic față de dacă qubit-ul 0 se află în starea . Aceasta transformă Qubiții în starea:
Tocmai s-a întâmplat ceva ciudat: Gate-ul controlled- folosește doar qubit-ul ca qubit de control, deci s-ar putea crede că acest poartă nu ar schimba deloc starea qubit-ului 0. Totuși, o face! Chiar dacă operația a fost aplicată Qubiților de jos, efectul general al poartă-ului este de a schimba faza qubit-ului . Acesta este cunoscut sub denumirea de „mecanismul de phase kickback" și este folosit în multe algoritme cuantice, inclusiv algoritmele Deutsch-Josza și Grover. Dacă dorești să afli mai multe despre mecanismul de phase kickback, vezi lecția lui John Watrous despre Algoritme de interogare cuantică din Fundamentals of quantum algorithms.
După phase kickback, aplicăm încă un Hadamard qubit-ului , ceea ce duce la starea:
Deci, când măsurăm qubit-ul la final, vom măsura cu certitudine 100% dacă și vom măsura cu certitudine 100% dacă (și dacă calculatorul nostru cuantic este perfect, fără zgomot). Dacă este altceva, măsurătoarea finală este doar probabilistică și ne spune doar atât.
QPE cu mai multă precizie: mai mulți Qubiți
Putem extinde acest concept simplu la un algoritm mai complex cu precizie arbitrară. Dacă, în loc să folosim doar qubit-ul pentru a măsura faza, folosim Qubiți de la la , vom putea estima faza cu biți de precizie. Să vedem cum funcționează:
Acest circuit QPE mai precis începe la fel ca versiunea cu un singur bit: Hadamard-urile sunt aplicate primilor Qubiți, iar Qubiții rămași sunt pregătiți în starea , creând starea:
Acum, unitarele controlate sunt aplicate. Qubit-ul este controlul pentru același unitar ca înainte. Dar acum, qubit-ul este controlul pentru unitarul , care este pur și simplu aplicat de două ori. Astfel, valoarea proprie a lui este . În general, fiecare qubit de la 0 la va fi controlul pentru unitarul . Aceasta înseamnă că fiecare dintre acești Qubiți va experimenta un phase kickback de . Rezultă starea:
Aceasta poate fi rescrisă ca o sumă peste stările bazei computaționale:
Suma îți pare familiară? Este un QFT! Reamintește-ți ecuația pentru o transformată cuantică Fourier:
Deci, dacă faza pentru un număr întreg între și , atunci aplicând QFT-ul invers acestei stări vom obține starea:
și din , putem deduce .
Dacă nu este un multiplu întreg, totuși, atunci aplicând QFT-ul invers vom aproxima doar . Cât de bine aproximează va fi probabilistic, adică nu vom obține întotdeauna cea mai bună aproximare, dar va fi destul de aproape, iar cu cât mai mulți Qubiți folosești, cu atât mai bună va fi aproximarea. Pentru a afla cum se cuantifică această aproximare a lui , consultă lecția lui John Watrous despre Estimarea fazei și factorizare din Fundamentals of quantum algorithms.
Concluzie
Acest modul a oferit o prezentare generală a ce este un QFT, cum este implementat pe un calculator cuantic și cât de util poate fi în rezolvarea problemelor. Ți-am oferit o idee despre utilitatea sa când am văzut cum poate fi folosit în estimarea cuantică a fazei pentru a afla informații despre valorile proprii ale unei matrice unitare.
Concepte critice
- Transformata Fourier Cuantică este analogul cuantic al Transformatei Fourier Discrete.
- QFT este un exemplu de transformare a bazei.
- Procedura de Estimare Cuantică a Fazei se bazează pe mecanismul de retroacțiune a fazei din operațiile unitare controlate, precum și pe o QFT inversă.
- QFT și QPE sunt ambele subrutine utilizate pe scară largă în numeroși algoritmi cuantici.
Întrebări
Adevărat/Fals
- A/F Transformata Fourier Cuantică este analogul cuantic al transformatei Fourier discrete clasice (DFT).
- A/F QFT poate fi implementată folosind doar porți Hadamard și CNOT.
- A/F QFT este o componentă esențială a algoritmului lui Shor.
- A/F Rezultatul Estimării Cuantice a Fazei este o stare cuantică ce reprezintă vectorul propriu al operatorului.
- A/F QPE necesită utilizarea Transformatei Fourier Cuantice inverse (QFT).
- A/F În QPE, dacă faza este reprezentabilă exact cu biți, algoritmul dă rezultatul corect cu probabilitatea 1.
Răspunsuri scurte
- Câți qubiți sunt necesari pentru a efectua o QFT pe un sistem cu puncte de date?
- Poate fi utilizată QFT pe o stare care nu este o stare de bază computațională? Dacă da, ce se întâmplă?
- Cum influențează numărul de qubiți de control utilizați în QPE rezoluția estimării fazei rezultate?
Probleme
- Folosește înmulțirea matriceală pentru a verifica că pașii algoritmului QFT conduc într-adevăr la matricea :
(Nu trebuie să faci asta manual!)
Probleme de provocare
- Creează o stare cu patru qubiți care să fie o superpoziție egală a tuturor bazelor computaționale impare: . Apoi efectuează o QFT pe stare. Care este starea rezultată? Explică de ce rezultatul tău are sens, folosind cunoștințele tale despre transformatele Fourier.