Kwantowa transformata Fouriera
W tym module Qiskit in Classrooms studenci muszą mieć działające środowisko Python z zainstalowanymi następującymi pakietami:
qiskitw wersji 2.1.0 lub nowszejqiskit-ibm-runtimew wersji 0.40.1 lub nowszejqiskit-aerw wersji 0.17.0 lub nowszejqiskit.visualizationnumpypylatexenc
Aby skonfigurować i zainstalować powyższe pakiety, zapoznaj się z przewodnikiem Instalacja Qiskit. Aby uruchamiać zadania na prawdziwych komputerach kwantowych, studenci muszą założyć konto IBM Quantum®, postępując zgodnie z krokami opisanymi w przewodniku Konfiguracja konta IBM Cloud.
Ten moduł był testowany i zużył 13 sekund czasu QPU. To szacunek w dobrej wierze — rzeczywiste zużycie może się różnić.
# 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'
Wprowadzenie
Transformata Fouriera to wszechobecne narzędzie mające zastosowanie w matematyce, fizyce, przetwarzaniu sygnałów, kompresji danych i niezliczonych innych dziedzinach. Kwantowa wersja transformaty Fouriera, trafnie nazwana kwantową transformatą Fouriera, stanowi podstawę niektórych z najważniejszych algorytmów kwantowych.
Dzisiaj, po przypomnieniu klasycznej transformaty Fouriera, omówimy, jak implementujemy kwantową transformatę Fouriera na komputerze kwantowym. Następnie omówimy jedno z zastosowań kwantowej transformaty Fouriera w algorytmie zwanym algorytmem estymacji fazy. Kwantowa estymacja fazy jest podprogramem słynnego algorytmu faktoryzacji Shora, który bywa określany mianem „klejnotu koronnego" informatyki kwantowej. Ten moduł prowadzi do kolejnego modułu poświęconego w całości algorytmowi Shora, ale jest też zaprojektowany jako samodzielna całość. Kwantowa transformata Fouriera to fascynujący i użyteczny algorytm sam w sobie!
Klasyczna transformata Fouriera
Zanim przejdziemy do kwantowej transformaty Fouriera, najpierw przypomnijmy sobie jej klasyczną wersję. Transformata Fouriera to metoda przejścia z jednej tak zwanej „bazy" do innej. Możesz myśleć o dwóch bazach jak o różnych perspektywach tego samego problemu — obie są poprawnymi sposobami wyrażenia funkcji, ale jedna lub druga może być bardziej pouczająca, w zależności od rozpatrywanego problemu. Przykładami par baz połączonych transformatą Fouriera są: położenie i pęd oraz czas i częstotliwość.
Zobaczmy przykład, jak transformata Fouriera może nam pomóc ustalić, jaką nutę gra instrument, na podstawie jego przebiegu dźwiękowego. Zazwyczaj przebiegi są reprezentowane w bazie czasu — to znaczy amplituda fali jest wyrażana jako funkcja czasu.

Możemy wykonać transformatę Fouriera tego przebiegu, aby przejść z bazy czasu do bazy częstotliwości:

W bazie częstotliwości możemy łatwo zobaczyć wyraźne maksimum przy około 260 Hz. To środkowe C!
Być może byłeś w stanie stwierdzić, że grane jest środkowe C bez użycia transformaty Fouriera, ale co jeśli kilka nut jest granych jednocześnie? Wtedy przebieg staje się bardziej skomplikowany, gdy przedstawimy go w bazie czasu:

Ale widmo częstotliwościowe wyraźnie identyfikuje trzy maksima:

To był akord C-dur, złożony z nut C, E i G.
Tego rodzaju analiza Fouriera może pomóc nam wyodrębnić składowe częstotliwościowe dowolnego skomplikowanego sygnału.
Dyskretna transformata Fouriera
Transformata Fouriera jest użyteczna w wielu zastosowaniach związanych z przetwarzaniem sygnałów. Jednak w większości tych zastosowań z prawdziwego życia (w tym w przykładzie muzycznym podanym powyżej) chcemy transformować dyskretny zbiór punktów danych — a nie funkcję ciągłą. W tym przypadku stosujemy dyskretną transformatę Fouriera. Dyskretna transformata Fouriera (DFT) działa na wektorze i odwzorowuje go na wektor zgodnie ze wzorem:
gdzie przyjmujemy . (Zwróć uwagę, że istnieją inne konwencje ze znakiem minus w wykładniku, więc bądź ostrożny, gdy napotkasz DFT gdzie indziej.) Przypomnij sobie, że to funkcja periodyczna o okresie . Zatem, mnożąc przez tę funkcję, transformata Fouriera jest w istocie sposobem na rozbicie (dyskretnej) funkcji na liniową kombinację jej składowych funkcji periodycznych, każda o okresie .
Kwantowa transformata Fouriera
Widzieliśmy już, jak transformata Fouriera służy do reprezentowania funkcji jako liniowej kombinacji nowego zbioru tak zwanych „funkcji bazowych". Transformacje bazy są regularnie wykonywane również na stanach Qubit. Na przykład stan pojedynczego Qubit może być wyrażony w bazie obliczeniowej , ze stanami bazowymi i , lub w bazie : ze stanami bazowymi oraz . Obie reprezentacje są równie poprawne, ale jedna może być bardziej naturalna niż druga, w zależności od rodzaju rozwiązywanego problemu.
Stany Qubit mogą być również wyrażone w bazie Fouriera, gdzie stan jest wyrażony w kategoriach liniowej kombinacji stanów bazy Fouriera , zamiast zwykłych stanów bazy obliczeniowej . Aby to zrobić, należy zastosować kwantową transformatę Fouriera (QFT):
gdzie jak powyżej, a to liczba stanów bazowych w twoim układzie kwantowym. Zauważ, że ponieważ teraz pracujemy z Qubitami, Qubitów daje stanów bazowych, więc . Tutaj stany bazowe są zapisane jako pojedyncza liczba , gdzie przyjmuje wartości od do , ale częściej możesz spotykać stany bazowe wyrażone jako , , , ..., , gdzie każda cyfra binarna reprezentuje stan Qubit 0 do , od prawej do lewej. Istnieje prosty sposób konwersji tych stanów binarnych na pojedynczą liczbę: wystarczy potraktować je jak liczby dwójkowe! Tak więc , , , i tak dalej, aż do .
Budowanie intuicji dla stanów bazy Fouriera
Omówiliśmy już, czym są stany bazy obliczeniowej i jak są uporządkowane: to zbiór stanów, w których każdy Qubit jest w stanie lub , a my porządkujemy je od stanu, w którym wszystkie Qubity mają wartość , , do stanu, w którym wszystkie mają wartość , .
Ale jak możemy rozumieć stany bazy Fouriera? Wszystkie stany bazy Fouriera są równymi superpozycjami wszystkich stanów bazy obliczeniowej, ale każdy stan różni się od pozostałych periodycznością fazy składowych. Aby lepiej to zrozumieć, przyjrzyjmy się czterem stanom bazy Fouriera układu dwukubitowego. Najniższy stan Fouriera to taki, którego faza w ogóle się nie zmienia:
Możemy zwizualizować ten stan, wykreślając zespoloną amplitudę każdego z wyrazów. Czerwona linia ułatwia śledzenie tego, jak faza tej amplitudy obraca się wokół zespolonej płaszczyzny jako funkcja stanu bazy obliczeniowej. Dla faza pozostaje stała:

Następny stan bazy Fouriera to ten, którego fazy składowych obracają się od do dokładnie raz:
To obrót możemy zobaczyć na wykresie zespolonej amplitudy w funkcji stanu bazy obliczeniowej:

Każdy stan ma fazę o radianów wyższą niż stan poprzedni, gdy są uporządkowane w standardowy sposób, ponieważ w tym przykładzie mamy cztery stany bazowe (). Następny stan bazowy obraca się od 0 do dwa razy:

Wreszcie najwyższa składowa Fouriera to ta o najszybciej zmieniającej się fazie. W naszym przykładzie z dwoma Qubitami to ta, której fazy obracają się od 0 do trzy razy:

Ogólnie, dla stanu -kubitowego, będzie stanów bazy Fouriera, których częstotliwość zmian fazy waha się od stałej dla , do szybko zmieniającej się dla , wykonując obrotów wokół w superpozycji stanów. Kiedy więc wykonujemy QFT stanu kwantowego, robimy zasadniczo to samo co w analizie przebiegu muzycznego we Wprowadzeniu. Wyznaczamy składowe częstotliwości Fouriera, które przyczyniają się do tworzenia interesującego nas stanu kwantowego.
Wypróbuj kilka przykładowych QFT
Spróbujmy dalej budować intuicję dotyczącą kwantowej transformaty Fouriera, tworząc stan w bazie obliczeniowej, a następnie obserwując, co się dzieje po zastosowaniu QFT. Na razie będziemy traktować QFT jako czarną skrzynkę, którą stosujemy przy użyciu QFTGate z biblioteki obwodów Qiskit. Później zajrzymy pod maskę, żeby zobaczyć, jak to działa w środku.
Zaczynamy od załadowania niezbędnych pakietów i wybrania urządzenia, na którym uruchomimy nasz Circuit:
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
Jeśli nie masz dostępnego czasu na swoim koncie lub z jakiegokolwiek powodu chcesz skorzystać z symulatora, możesz uruchomić poniższą komórkę, aby skonfigurować symulator naśladujący wybrane przez nas urządzenie kwantowe:
# 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)
Pojedynczy stan bazy obliczeniowej
Najpierw spróbujmy przetransformować pojedynczy stan bazy obliczeniowej. Zaczniemy od utworzenia losowego stanu obliczeniowego:
# 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)
Teraz przetransformujmy ten stan za pomocą 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)
Jak widać, mierzony rozkład populacji każdego stanu jest mniej więcej równy, z uwzględnieniem pewnych szumów eksperymentalnych i statystycznych. A zatem, jeśli zastosujesz QFT do pojedynczego stanu bazy obliczeniowej, wynikiem jest równa superpozycja wszystkich stanów. Jeśli znasz transformaty Fouriera, pewnie cię to nie dziwi. Jedna z podstawowych zasad, która pomaga budować intuicyjny związek między funkcją a jej transformatą Fouriera, mówi, że szerokość funkcji jest odwrotnie proporcjonalna do szerokości jej transformaty Fouriera. Tak więc coś, co jest bardzo zlokalizowane w czasie — na przykład bardzo krótki impuls — będzie wymagało szerokiego zakresu częstotliwości, żeby ten impuls wygenerować. Taki sygnał będzie bardzo szeroki w przestrzeni Fouriera.
Ten fakt jest w rzeczywistości związany z kwantową niepewnością! Zasada nieoznaczoności Heisenberga jest zazwyczaj zapisywana jako . Jeśli więc niepewność w () jest mała, niepewność w pędzie () musi być duża i odwrotnie. Okazuje się, że przejście z bazy położenia do bazy pędu realizuje się właśnie przez transformatę Fouriera.
Uwaga: pamiętaj, że mierzymy populacje w każdym ze stanów bazowych, więc tracimy informacje o względnych fazach między poszczególnymi częściami superpozycji. Dlatego choć QFT dowolnego pojedynczego stanu bazy obliczeniowej daje taki sam równomierny rozkład populacji po wszystkich stanach bazowych, fazy niekoniecznie będą takie same.
Dwa stany bazy obliczeniowej
Teraz zobaczmy, co się dzieje, gdy przygotujemy superpozycję stanów bazy obliczeniowej. Jak myślisz, jak będzie wyglądać transformata Fouriera w tym przypadku?
Wybierzmy superpozycję:
# 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)
Teraz przetransformujmy ten stan za pomocą 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)
Ten wynik może być nieco zaskakujący. Wygląda na to, że QFT stanu jest superpozycją wszystkich parzystych stanów bazowych. Ale jeśli wrócimy do naszej wizualizacji każdego stanu bazowego i tego, jak faza każdego składnika okrąża razy, powód, dla którego otrzymujemy ten wynik, może stać się jasny.
Sprawdź swoje rozumienie
Przeczytaj poniższe pytania, zastanów się nad odpowiedzią, a następnie kliknij trójkąt, żeby ujawnić rozwiązanie.
Korzystając z powyższej wskazówki, wyjaśnij, dlaczego wynik, który otrzymaliśmy dla QFT stanu , jest oczekiwany.
Odpowiedź:
Oryginalny stan ma względną fazę równą 0 (lub całkowitej wielokrotności ) między dwiema częściami superpozycji. Wiemy więc, że ten stan ma składowe Fouriera, których fazy dopasowują się w ten sposób: te, które mają zerowe przesunięcie fazy między wyrazem |0000> a wyrazem |1000>. Każdy stan bazowy Fouriera składa się z wyrazów, których faza narasta z prędkością , co oznacza, że każdy wyraz w superpozycji, uszeregowany w zwykły sposób, ma fazę o większą niż poprzedni. Zatem w połowie drogi, przy , chcemy, żeby faza była całkowitą wielokrotnością . Dzieje się to wtedy, gdy jest parzyste.
Jaka superpozycja stanów obliczeniowych odpowiadałaby QFT z pikami na każdej nieparzystej liczbie binarnej?
Odpowiedź:
Gdybyś zastosował QFT do stanu , zobaczyłbyś piki na każdym nieparzystym stanie binarnym.
Rozłóż algorytm QFT
Teraz, gdy lepiej rozumiemy związek między stanami kubitów w bazie obliczeniowej a bazą Fouriera, przyjrzyjmy się bliżej samemu algorytmowi QFT. Innymi słowy, jakie Gate'y faktycznie implementujemy na komputerze kwantowym, aby uzyskać tę transformację?
Zacznijmy od małego przykładu — jednego Qubitu. Oznacza to, że będziemy mieć dwa stany bazowe. QFT przekształca stany bazy obliczeniowej i w stany bazy Fouriera i :
Sprawdź swoje rozumienie
Przeczytaj poniższe pytanie(-a), zastanów się nad odpowiedzią, a następnie kliknij trójkąt, aby zobaczyć rozwiązanie.
Korzystając z równania QFT z poprzedniej sekcji, zweryfikuj powyższe dwa stany bazy Fouriera.
Odpowiedź:
Ogólny wzór QFT to:
Dla jednego Qubitu (), i . Mamy więc:
Przyjrzyj się tym dwóm równaniom. Być może znasz już bramkę kwantową, którą można wykorzystać do implementacji tej transformacji. Istnieje mianowicie Gate, który przekształca stany bazy obliczeniowej i w odpowiednie stany bazy Fouriera i . To bramka Hadamarda! Staje się to jeszcze bardziej widoczne, gdy wprowadzimy macierzową reprezentację operacji QFT:
Jeśli nie jesteś zaznajomiony(-a) z tym zapisem wyrażania operatora kwantowego, nie martw się! Jest to sposób reprezentacji macierzy , gdzie i indeksują kolumny i wiersze macierzy od do , a to wartość danego wpisu. Na przykład wpis w kolumnie 0. i wierszu 2. wynosiłby po prostu .
W tej reprezentacji każdy stan bazy obliczeniowej odpowiada jednemu z wektorów bazowych:
Jeśli chcesz dowiedzieć się więcej o tej reprezentacji, zajrzyj do lekcji Johna Watrousa o układach złożonych w kursie Basics of quantum information.
Spróbujmy zbudować macierz dla QFT. Korzystając z powyższego wzoru, otrzymujemy:
Aby zaimplementować tę macierz na komputerze kwantowym, musimy ustalić, jaką kombinację Gate'ów zastosowanych do jakich Qubitów da nam transformację unitarną odpowiadającą powyższej macierzy. Wiemy już, że jedną z potrzebnych bramek jest Hadamard. Kolejną potrzebną bramką jest kontrolowana bramka fazowa, która stosuje względną fazę do stanu Qubitu docelowego, pod warunkiem że Qubit kontrolny jest w stanie . W postaci macierzowej wygląda to tak:
Ponieważ zmieniany jest tylko stan , nie ma znaczenia, który Qubit jest „kontrolnym", a który „docelowym". Wynik będzie taki sam w obu przypadkach.
Na koniec będziemy potrzebować również bramek SWAP. Bramka SWAP zamienia stany dwóch Qubitów. Wygląda następująco:
Procedura budowania Circuit QFT na Qubitach jest iteracyjna — najpierw stosuje się QFT do Qubitów od do , a następnie dodaje się pewne Gate'y między Qubitem a pozostałymi Qubitami. Ale żeby zastosować QFT, trzeba najpierw zastosować QFT do Qubitów od 2 do , a następnie dodać Gate'y między Qubitem 1 a pozostałymi Qubitami od do . Przypomina to rosyjskie matrioszki: każda lalka zwiększa wymiar Circuit QFT dwukrotnie, a najmniejsza lalka w samym centrum to QFT, czyli bramka Hadamarda.
Aby włożyć lalkę do następnej, nieco większej, czyli zwiększyć wymiar QFT dwukrotnie, zawsze wykonujesz tę samą procedurę:
- Najpierw zastosuj QFT do Qubitów na dole. To jest twoja „mniejsza lalka" z zestawu rosyjskich matrioszek, którą zaraz umieścisz w następnej, większej.
- Użyj kolejnego Qubitu powyżej jako kontrolnego i zastosuj kontrolowane bramki fazowe do każdego z dolnych Qubitów, z fazami odpowiadającymi stanom standardowej bazy każdego z pozostałych Qubitów.
- Wykonaj operację Hadamarda na tym samym górnym Qubicie, który był używany jako kontrolny w bramkach fazowych.
- Użyj bramek SWAP, aby przestawić kolejność Qubitów tak, żeby najmniej znaczący (górny) bit stał się najbardziej znaczącym (dolnym) bitem, a wszystkie pozostałe przesunęły się o jeden w górę.
Używaliśmy już funkcji QFTGate z biblioteki Circuit Qiskit, ale teraz zajrzyjmy do środka niektórych z tych Gate'ów QFT, aby zweryfikować powyższą procedurę. Możemy to zrobić za pomocą 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")
Mam nadzieję, że na podstawie pierwszych czterech QFT zaczynasz dostrzegać, jak każda z nich jest zagnieżdżona wewnątrz kolejnej, większej. Być może zauważyłeś(-aś), że niektóre z bramek fazowych nie są dokładnie takie, jak opisano w procedurze powyżej, a operacje SWAP nie pojawiają się po każdej podrutynie, lecz tylko na samym końcu pełnego QFT. Pozwala to zaoszczędzić zbędne Gate'y, które wydłużałyby działanie Circuit i zwiększały podatność na błędy. Zamiast implementować SWAP po każdej zagnieżdżonej lalce, Circuit śledzi, gdzie powinien znajdować się każdy stan Qubitu, i odpowiednio dostosowuje Qubity, do których stosuje bramki fazowe. Następnie końcowy zestaw operacji SWAP na końcu układa wszystko na właściwym miejscu.
Zastosowanie QFT: estymacja fazy
Zobaczmy, jak QFT może być wykorzystana do rozwiązania użytecznego problemu w informatyce kwantowej. Obliczenie odwrotnej kwantowej transformaty Fouriera jest niezbędnym krokiem w algorytmie zwanym kwantową estymacją fazy (QPE), który sam w sobie jest podprogramem w wielu innych algorytmach — w tym w „klejnocie koronnym" algorytmów kwantowych, algorytmie faktoryzacji Shora.
Celem QPE jest estymacja wartości własnych operatora unitarnego. Operatory unitarne są wszechobecne w informatyce kwantowej i często wyznaczenie wartości własnych odpowiadających im wektorów własnych stanowi niezbędny krok w większym algorytmie. W zależności od problemu wartość własna może reprezentować energię hamiltonianu w zadaniu symulacyjnym, pomagać w znajdowaniu czynników pierwszych liczby w algorytmie Shora lub zawierać inne kluczowe informacje. QPE jest jednym z najważniejszych i najszerzej stosowanych podprogramów w informatyce kwantowej.
Co to ma wspólnego z kwantową transformatą Fouriera? Jak pewnie pamiętasz, każda wartość własna operatora unitarnego ma moduł . Możemy więc zapisać każdą wartość własną jako liczbę zespoloną o module jeden:
gdzie jest liczbą rzeczywistą z przedziału od 0 do 1. Jeśli chcesz dowiedzieć się więcej o macierzach unitarnych, zapoznaj się z lekcją Johna Watrusa na ten temat w kursie Podstawy informacji kwantowej.
Zauważ, że jest periodyczna względem . Już to może sugerować, że QFT może być zaangażowana, ponieważ widzieliśmy, jak użyteczne są QFT do analizy funkcji periodycznych. Poniżej przejdziemy przez algorytm i zobaczymy dokładnie, w jaki sposób QFT wchodzi do gry.
Jak działa QPE
Zaczniemy od najprostszego algorytmu QPE, który w przybliżeniu estymuje fazę z dokładnością do jednej cyfry binarnej. Innymi słowy, algorytm ten potrafi odróżnić od , ale nie robi tego lepiej. Oto schemat obwodu:

Qubity są przygotowane w stanie , gdzie Qubit jest w stanie , a pozostałe Qubity są w stanie , który jest stanem własnym . Po pierwszej bramce Hadamarda stan Qubitów przyjmuje postać:
Następna bramka to bramka „kontrolowana-". Stosuje ona operację unitarną do dolnych Qubitów w stanie , jeśli Qubit 0 jest w stanie , lecz nie robi nic z , gdy Qubit 0 jest w stanie . Przekształca to Qubity do stanu:
Stało się coś dziwnego: bramka kontrolowana- używa Qubitu jedynie jako Qubitu kontrolnego, więc można by sądzić, że ta bramka w ogóle nie zmienia stanu Qubitu 0. A jednak zmienia! Mimo że operacja była zastosowana do dolnych Qubitów, ogólny efekt bramki polega na zmianie fazy Qubitu . Zjawisko to znane jest jako „mechanizm przeniesienia fazy" (ang. phase kickback) i jest stosowane w wielu algorytmach kwantowych, m.in. w algorytmach Deutscha-Jozsy i Grovera. Jeśli chcesz dowiedzieć się więcej o mechanizmie przeniesienia fazy, zapoznaj się z lekcją Johna Watrusa dotyczącą kwantowych algorytmów zapytań w kursie Podstawy algorytmów kwantowych.
Po przeniesieniu fazy stosujemy jeszcze jedną bramkę Hadamarda do Qubitu , co daje stan:
Tak więc gdy na końcu mierzymy Qubit , zmierzymy z prawdopodobieństwem 100%, jeśli , i zmierzymy z prawdopodobieństwem 100%, jeśli (i jeśli nasz komputer kwantowy jest idealny, bez szumów). Jeśli ma inną wartość, pomiar końcowy jest jedynie probabilistyczny i dostarcza ograniczonej informacji.
QPE z większą precyzją: więcej Qubitów
Możemy rozszerzyć tę prostą koncepcję do bardziej skomplikowanego algorytmu o dowolnej precyzji. Jeśli zamiast tylko jednego Qubitu do pomiaru fazy użyjemy Qubitów od do , będziemy w stanie estymować fazę z dokładnością do bitów. Zobaczmy, jak to działa:
Ten bardziej precyzyjny obwód QPE rozpoczyna się tak samo jak wersja jednobitowa: bramki Hadamarda są stosowane do pierwszych Qubitów, a pozostałe Qubity są przygotowane w stanie , tworząc stan:
Teraz stosowane są bramki kontrolowane-unitarne. Qubit jest kontrolą dla tej samej operacji unitarnej co poprzednio. Ale teraz Qubit jest kontrolą dla operacji unitarnej , czyli po prostu zastosowanej dwukrotnie. Wartość własna wynosi zatem . Ogólnie, każdy Qubit od 0 do będzie kontrolą dla operacji unitarnej . Oznacza to, że każdy z tych Qubitów dozna przeniesienia fazy równego . Daje to stan:
Można to przepisać jako sumę po stanach bazy obliczeniowej:
Czy ta suma wygląda znajomo? To jest QFT! Przypomnij sobie równanie kwantowej transformaty Fouriera:
Tak więc, jeśli faza dla pewnej liczby całkowitej z przedziału od do , to zastosowanie odwrotnej QFT do tego stanu da stan:
a z możemy wyznaczyć .
Jeśli jednak nie jest całkowitą wielokrotnością, zastosowanie odwrotnej QFT jedynie przybliży . Jakość tego przybliżenia będzie probabilistyczna, co oznacza, że nie zawsze otrzymamy najlepsze przybliżenie, ale będzie ono całkiem bliskie prawdy — im więcej Qubitów użyjemy, tym lepsze przybliżenie uzyskamy. Aby dowiedzieć się, jak skwantyfikować to przybliżenie , zapoznaj się z lekcją Johna Watrusa dotyczącą estymacji fazy i faktoryzacji w kursie Podstawy algorytmów kwantowych.
Podsumowanie
Ten moduł przedstawił omówienie tego, czym jest QFT, jak jest implementowana na komputerze kwantowym i jak użyteczna może być przy rozwiązywaniu problemów. Pokazaliśmy jej użyteczność na przykładzie kwantowej estymacji fazy, gdzie służy do badania wartości własnych macierzy unitarnej.
Kluczowe pojęcia
- Kwantowa transformata Fouriera jest kwantowym odpowiednikiem dyskretnej transformaty Fouriera.
- QFT jest przykładem zmiany bazy.
- Procedura kwantowej estymacji fazy opiera się na mechanizmie przeniesienia fazy wynikającym z operacji kontrolowanych-unitarnych oraz na odwrotnej QFT.
- QFT i QPE są powszechnie stosowanymi podprogramami w licznych algorytmach kwantowych.
Pytania
Prawda/Fałsz
- P/F Kwantowa transformata Fouriera jest kwantowym odpowiednikiem klasycznej dyskretnej transformaty Fouriera (DFT).
- P/F QFT można zaimplementować używając wyłącznie bramek Hadamarda i CNOT.
- P/F QFT jest kluczowym składnikiem algorytmu Shora.
- P/F Wynikiem kwantowej estymacji fazy jest stan kwantowy reprezentujący wektor własny operatora.
- P/F QPE wymaga użycia odwrotnej kwantowej transformaty Fouriera (QFT).
- P/F W QPE, jeśli faza jest dokładnie reprezentowalna za pomocą bitów, algorytm daje poprawny wynik z prawdopodobieństwem 1.
Krótkie odpowiedzi
- Ile Qubitów jest potrzebnych do wykonania QFT na układzie z punktami danych?
- Czy QFT można zastosować do stanu, który nie jest stanem bazy obliczeniowej? Jeśli tak, co się wtedy dzieje?
- Jak liczba Qubitów kontrolnych użytych w QPE wpływa na rozdzielczość wynikowej estymacji fazy?
Zadania
- Użyj mnożenia macierzowego, aby zweryfikować, że kroki algorytmu QFT rzeczywiście dają macierz :
(Nie musisz robić tego ręcznie!)
Zadania dodatkowe
- Skonstruuj cztero-Qubitowy stan będący równą superpozycją wszystkich nieparzystych baz obliczeniowych: . Następnie wykonaj QFT na tym stanie. Jaki jest wynikowy stan? Wyjaśnij, dlaczego twój wynik ma sens, używając wiedzy o transformatach Fouriera.