Przejdź do głównej treści

Kwantowa transformata Fouriera

W tym module Qiskit in Classrooms studenci muszą mieć działające środowisko Python z zainstalowanymi następującymi pakietami:

  • qiskit w wersji 2.1.0 lub nowszej
  • qiskit-ibm-runtime w wersji 0.40.1 lub nowszej
  • qiskit-aer w wersji 0.17.0 lub nowszej
  • qiskit.visualization
  • numpy
  • pylatexenc

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.

Pojedynczy sygnał sinusoidalny przedstawiony jako funkcja czasu.

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

Widmo częstotliwościowe przebiegu dźwiękowego. Jedno wyraźne ostre maksimum przy 260 Hz.

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:

Wykres amplitudy w funkcji czasu dla kilku fal sinusoidalnych jednocześnie, tworzących bardziej skomplikowany wzorzec periodyczny.

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

Widmo częstotliwościowe powyższego przebiegu dźwiękowego. Trzy maksima przy około 260 Hz, 330 Hz i 392 Hz. Ostatnie maksimum jest bardzo słabe, ale widoczne.

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 NN punktów danych — a nie funkcję ciągłą. W tym przypadku stosujemy dyskretną transformatę Fouriera. Dyskretna transformata Fouriera (DFT) działa na wektorze (x0,...,xN1)(x_0, ..., x_{N-1}) i odwzorowuje go na wektor (y0,...,yN1)(y_0, ..., y_{N-1}) zgodnie ze wzorem:

yk=1Nj=0N1xjωNjky_k = \frac{1}{\sqrt{N}}\sum_{j=0}^{N-1}x_j\omega_N^{jk}

gdzie przyjmujemy ωNjk=e2πijkN\omega_N^{jk} = e^{2\pi i \frac{jk}{N}}. (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 e2πijkNe^{2\pi i \frac{jk}{N}} to funkcja periodyczna o okresie Nk\frac{N}{k}. Zatem, mnożąc przez tę funkcję, transformata Fouriera jest w istocie sposobem na rozbicie (dyskretnej) funkcji {xj}\{x_{j}\} na liniową kombinację jej składowych funkcji periodycznych, każda o okresie Nk\frac{N}{k}.

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 ψ|\psi\rangle może być wyrażony w bazie obliczeniowej ψ=c00+c11|\psi\rangle = c_0 |0\rangle + c_1 |1\rangle, ze stanami bazowymi 0|0\rangle i 1|1\rangle, lub w bazie XX: ψ=c+++c|\psi\rangle = c_+ |+\rangle + c_- |-\rangle ze stanami bazowymi +=12(0+1)|+\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |1\rangle) oraz =12(01)|-\rangle = \frac{1}{\sqrt{2}} (|0\rangle - |1\rangle). 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 ϕy|\phi_y\rangle, zamiast zwykłych stanów bazy obliczeniowej x|x\rangle. Aby to zrobić, należy zastosować kwantową transformatę Fouriera (QFT):

ϕy=1Nx=0N1ωNyxx | \phi_y \rangle = \frac{1}{\sqrt{N}}\sum_{x=0}^{N-1}\omega_N^{y x} \vert x \rangle

gdzie ωNyx=e2πiyxN\omega_N^{yx} = e^{\frac{2\pi i y x}{N}} jak powyżej, a NN to liczba stanów bazowych w twoim układzie kwantowym. Zauważ, że ponieważ teraz pracujemy z Qubitami, mm Qubitów daje 2m2^m stanów bazowych, więc N=2mN=2^m. Tutaj stany bazowe są zapisane jako pojedyncza liczba x|x\rangle, gdzie xx przyjmuje wartości od 00 do N1N-1, ale częściej możesz spotykać stany bazowe wyrażone jako 00...00|00...00\rangle, 00...01|00...01\rangle, 00...11|00...11\rangle, ..., 11...11|11...11\rangle, gdzie każda cyfra binarna reprezentuje stan Qubit 0 do m1m-1, 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 00...00=0|00...00\rangle = |0\rangle, 00...01=1|00...01\rangle = |1\rangle, 00...10=2|00...10\rangle = |2\rangle, 00...11=3|00...11\rangle = |3\rangle i tak dalej, aż do 11...11=2m1=N1|11...11\rangle = |2^m -1\rangle = |N-1\rangle.

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 00 lub 11, a my porządkujemy je od stanu, w którym wszystkie Qubity mają wartość 00, 00...00|00...00\rangle, do stanu, w którym wszystkie mają wartość 11, 11...11|11...11\rangle.

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:

ϕ0=12(00+01+10+11)|\phi_0\rangle = \frac{1}{2} (|00\rangle + |01\rangle + |10\rangle + |11\rangle)

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 ϕ0|\phi_0\rangle faza pozostaje stała:

Wykres słupkowy zespolonej amplitudy (płaszczyzna x-y) dla każdego stanu bazy obliczeniowej (oś z) dla phi_0. Wszystkie są rzeczywiste, więc słupki wskazują na +1 na osi x.

Następny stan bazy Fouriera to ten, którego fazy składowych obracają się od 00 do 2π2\pi dokładnie raz:

ϕ1=12(00+eiπ/201+eiπ10+e3iπ/211)=12(00+i0110i11)|\phi_1\rangle = \frac{1}{2} (|00\rangle + e^{i\pi/2}|01\rangle + e^{i\pi}|10\rangle + e^{3i\pi/2}|11\rangle) = \frac{1}{2}(|00\rangle + i|01\rangle - |10\rangle - i|11\rangle)

To obrót możemy zobaczyć na wykresie zespolonej amplitudy w funkcji stanu bazy obliczeniowej:

Wykres słupkowy zespolonej amplitudy (płaszczyzna x-y) dla każdego stanu bazy obliczeniowej (oś z) dla phi_1. Czerwona linia pokazuje, jak faza zespolona narasta tak, że obraca się o 2\pi raz w trakcie przechodzenia przez wszystkie stany bazy obliczeniowej.

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

ϕ2=12(00+eiπ01+e2iπ10+e3iπ11)=12(0001+1011)|\phi_2\rangle = \frac{1}{2} (|00\rangle + e^{i\pi}|01\rangle + e^{2i\pi}|10\rangle + e^{3i\pi}|11\rangle) = \frac{1}{2} (|00\rangle - |01\rangle + |10\rangle - |11\rangle)

Wykres słupkowy zespolonej amplitudy (płaszczyzna x-y) dla każdego stanu bazy obliczeniowej (oś z) dla phi_2. Czerwona linia pokazuje, jak faza zespolona narasta tak, że obraca się o 2\pi dwa razy w trakcie przechodzenia przez wszystkie stany bazy obliczeniowej.

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 2π2\pi trzy razy:

ϕ3=12(00+e3iπ/201+e6iπ/210+e9iπ/211)=12(00i0110+i11)|\phi_3\rangle = \frac{1}{2} (|00\rangle + e^{3i\pi/2}|01\rangle + e^{6i\pi/2}|10\rangle + e^{9i\pi/2}|11\rangle) = \frac{1}{2} (|00\rangle - i|01\rangle - |10\rangle + i|11\rangle)

Wykres słupkowy zespolonej amplitudy (płaszczyzna x-y) dla każdego stanu bazy obliczeniowej (oś z) dla phi_3. Czerwona linia pokazuje, jak faza zespolona narasta tak, że obraca się o 2\pi trzy razy w trakcie przechodzenia przez wszystkie stany bazy obliczeniowej.

Ogólnie, dla stanu mm-kubitowego, będzie 2m2^m stanów bazy Fouriera, których częstotliwość zmian fazy waha się od stałej dla ϕ0|\phi_0\rangle, do szybko zmieniającej się dla ϕ2m1|\phi_{2^m-1}\rangle, wykonując 2m12^m-1 obrotów wokół 2π2\pi 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")

Output of the previous code cell

# 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)

Output of the previous code cell

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")

Output of the previous code cell

# 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)

Output of the previous code cell

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 ΔxΔp/2\Delta x \Delta p \ge \hbar / 2. Jeśli więc niepewność w xx (Δx\Delta x) jest mała, niepewność w pędzie (Δp\Delta p) musi być duża i odwrotnie. Okazuje się, że przejście z bazy położenia xx do bazy pędu pp 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ę:

ψ=12(0+N/2)=12(000...0+100...0)|\psi\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |N/2\rangle) = \frac{1}{\sqrt{2}} (|000...0\rangle + |100...0\rangle)

# 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")

Output of the previous code cell

# 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)

Output of the previous code cell

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")

Output of the previous code cell

# 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)

Output of the previous code cell

Ten wynik może być nieco zaskakujący. Wygląda na to, że QFT stanu ψ=12(0+N/2)|\psi\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |N/2\rangle) jest superpozycją wszystkich parzystych stanów bazowych. Ale jeśli wrócimy do naszej wizualizacji każdego stanu bazowego ϕy|\phi_y\rangle i tego, jak faza każdego składnika okrąża 2π2\pi yy 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 ψ=12(0+N/2)|\psi\rangle = \frac{1}{\sqrt{2}} (|0\rangle + |N/2\rangle), jest oczekiwany.

Odpowiedź:

Oryginalny stan ma względną fazę równą 0 (lub całkowitej wielokrotności 2π2\pi) 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 ϕy|\phi_y\rangle składa się z wyrazów, których faza narasta z prędkością 2πy/N2\pi y/N, co oznacza, że każdy wyraz w superpozycji, uszeregowany w zwykły sposób, ma fazę o 2πy/N2\pi y/N większą niż poprzedni. Zatem w połowie drogi, przy N/2N/2, chcemy, żeby faza 2πy/NN/22\pi y/N \cdot N/2 była całkowitą wielokrotnością 2π2\pi. Dzieje się to wtedy, gdy yy jest parzyste.

Jaka superpozycja stanów obliczeniowych odpowiadałaby QFT z pikami na każdej nieparzystej liczbie binarnej?

Odpowiedź:

Gdybyś zastosował QFT do stanu ψ=0N/2\psi = |0\rangle - |N/2\rangle, 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. QFT2_2 przekształca stany bazy obliczeniowej 0|0\rangle i 1|1\rangle w stany bazy Fouriera ϕ0\phi_0 i ϕ1\phi_1:

ϕ0=12(0+1)|\phi_0\rangle = \frac{1}{\sqrt{2}}(|0\rangle + |1\rangle)

ϕ1=12(01)|\phi_1\rangle = \frac{1}{\sqrt{2}}(|0\rangle - |1\rangle)

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:

ϕy=1Nx=0N1ωNyxx | \phi_y \rangle = \frac{1}{\sqrt{N}}\sum_{x=0}^{N-1}\omega_N^{y x} \vert x \rangle

Dla jednego Qubitu (n=1n=1), N=2n=2N=2^n=2 i ωNxy=e2πiyx2\omega_N^{xy} = e^{2\pi i \frac {y x}{2}}. Mamy więc:

ϕ0=12(e2πi0×020+e2πi0×121)=12(0+1) | \phi_0 \rangle = \frac{1}{\sqrt{2}}(e^{2\pi i \frac {0 \times 0}{2}}|0\rangle + e^{2\pi i \frac {0 \times 1}{2}}|1\rangle) = \frac{1}{\sqrt{2}}(|0\rangle + |1\rangle)

ϕ1=12(e2πi1×020+e2πi1×121)=12(01) | \phi_1 \rangle = \frac{1}{\sqrt{2}}(e^{2\pi i \frac {1 \times 0}{2}}|0\rangle + e^{2\pi i \frac {1 \times 1}{2}}|1\rangle) = \frac{1}{\sqrt{2}}(|0\rangle - |1\rangle)

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 0|0\rangle i 1|1\rangle w odpowiednie stany bazy Fouriera ϕ0|\phi_0\rangle i ϕ1|\phi_1\rangle. To bramka Hadamarda! Staje się to jeszcze bardziej widoczne, gdy wprowadzimy macierzową reprezentację operacji QFTN_N:

QFTN=1Nx=0N1y=0N1ωNxyxy \text{QFT}_N = \frac{1}{\sqrt{N}} \sum_{x=0}^{N-1} \sum_{y=0}^{N-1} \omega_N^{xy} \vert x \rangle \langle y \vert

Jeśli nie jesteś zaznajomiony(-a) z tym zapisem wyrażania operatora kwantowego, nie martw się! Jest to sposób reprezentacji macierzy N×NN \times N, gdzie xx i yy indeksują kolumny i wiersze macierzy od 00 do N1N-1, a ωNxy\omega_N^{xy} to wartość danego wpisu. Na przykład wpis w kolumnie 0. i wierszu 2. wynosiłby po prostu ωN0,2=e2πi0×2N=1\omega_N^{0,2} = e^{2 \pi i \frac{0 \times 2}{N}} = 1.

W tej reprezentacji każdy stan bazy obliczeniowej odpowiada jednemu z wektorów bazowych:

(100),1=(010),N1=(001).\begin{pmatrix} 1 \\ 0 \\ \vdots \\ 0 \end{pmatrix}, |1\rangle = \begin{pmatrix} 0 \\ 1 \\ \vdots \\ 0 \end{pmatrix}, |N-1\rangle = \begin{pmatrix} 0 \\ 0 \\ \vdots \\ 1 \end{pmatrix}.

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 QFT4_4. Korzystając z powyższego wzoru, otrzymujemy:

QFT4=12(11111i1i11111i1i)\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}

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ę α\alpha do stanu Qubitu docelowego, pod warunkiem że Qubit kontrolny jest w stanie 1|1\rangle. W postaci macierzowej wygląda to tak:

CPα=(100001000010000eiα)\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}

Ponieważ zmieniany jest tylko stan 11|11\rangle, 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:

SWAPα=(1000001001000001)\text{SWAP}_\alpha = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix}

Procedura budowania Circuit QFT2m_{2^m} na mm Qubitach jest iteracyjna — najpierw stosuje się QFT2m1_{2^{m-1}} do Qubitów od 11 do m1m-1, a następnie dodaje się pewne Gate'y między Qubitem 00 a pozostałymi m1m-1 Qubitami. Ale żeby zastosować QFT2m1_{2^{m-1}}, trzeba najpierw zastosować QFT2m2_{2^{m-2}} do Qubitów od 2 do m1m-1, a następnie dodać Gate'y między Qubitem 1 a pozostałymi Qubitami od 22 do m1m-1. Przypomina to rosyjskie matrioszki: każda lalka zwiększa wymiar Circuit QFT dwukrotnie, a najmniejsza lalka w samym centrum to QFT2_2, 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ę:

  1. Najpierw zastosuj QFT2m1_{2^{m-1}} do m1m-1 Qubitów na dole. To jest twoja „mniejsza lalka" z zestawu rosyjskich matrioszek, którą zaraz umieścisz w następnej, większej.
  2. Użyj kolejnego Qubitu powyżej jako kontrolnego i zastosuj kontrolowane bramki fazowe do każdego z dolnych m1m-1 Qubitów, z fazami odpowiadającymi stanom standardowej bazy każdego z pozostałych m1m-1 Qubitów.
  3. Wykonaj operację Hadamarda na tym samym górnym Qubicie, który był używany jako kontrolny w bramkach fazowych.
  4. 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")

Output of the previous code cell

qc = QuantumCircuit(2)
qc.compose(QFTGate(2), inplace=True)
qc.decompose().draw("mpl")

Output of the previous code cell

qc = QuantumCircuit(3)
qc.compose(QFTGate(3), inplace=True)
qc.decompose().draw("mpl")

Output of the previous code cell

qc = QuantumCircuit(4)
qc.compose(QFTGate(4), inplace=True)
qc.decompose().draw("mpl")

Output of the previous code cell

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 λ\lambda operatora unitarnego ma moduł λ=1|\lambda| = 1. Możemy więc zapisać każdą wartość własną jako liczbę zespoloną o module jeden:

λ=e2πiθ\lambda = e^{2\pi i \theta}

gdzie θ\theta 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 λ\lambda jest periodyczna względem θ\theta. 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ć θ=0\theta = 0 od θ=1/2\theta = 1/2, ale nie robi tego lepiej. Oto schemat obwodu:

Schemat obwodu algorytmu QPE dla jednego Qubitu danych. Bramka Hadamarda jest stosowana do Qubitu danych. Następnie algorytm używa dodatkowego Qubitu pomocniczego, na którym stosowana jest bramka kontrolowana-U z Qubitem danych jako kontrolą. Po kolejnej bramce Hadamarda na Qubicie 0 Qubity są mierzone.

Qubity są przygotowane w stanie π0=ψ0|\pi_0\rangle = |\psi\rangle|0\rangle, gdzie Qubit 00 jest w stanie 0|0\rangle, a pozostałe Qubity są w stanie ψ|\psi\rangle, który jest stanem własnym UU. Po pierwszej bramce Hadamarda stan Qubitów przyjmuje postać:

π1=12ψ(0+1)|\pi_1\rangle = \frac{1}{\sqrt{2}}|\psi\rangle (|0\rangle + |1\rangle)

Następna bramka to bramka „kontrolowana-UU". Stosuje ona operację unitarną UU do dolnych Qubitów w stanie ψ|\psi\rangle, jeśli Qubit 0 jest w stanie 1|1\rangle, lecz nie robi nic z ψ|\psi\rangle, gdy Qubit 0 jest w stanie 0|0\rangle. Przekształca to Qubity do stanu:

π2=12(ψ0+e2πiθψ1)|\pi_2\rangle = \frac{1}{\sqrt{2}}( |\psi\rangle|0\rangle + e^{2\pi i \theta}|\psi\rangle|1\rangle) =12ψ(0+e2πiθ1)= \frac{1}{\sqrt{2}}|\psi\rangle (|0\rangle + e^{2\pi i \theta}|1\rangle)

Stało się coś dziwnego: bramka kontrolowana-UU używa Qubitu 00 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 00. 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 00, co daje stan:

π3=ψ(1+e2πiθ20+1e2πiθ21)=ψ(cos(πθ)0isin(πθ)1)|\pi_3\rangle = |\psi\rangle ( \frac{1+e^{2\pi i \theta}}{2} |0\rangle + \frac{1 - e^{2\pi i \theta}}{2}|1\rangle) = |\psi\rangle ( \cos(\pi\theta) |0\rangle - i \sin(\pi\theta)|1\rangle)

Tak więc gdy na końcu mierzymy Qubit 00, zmierzymy 0|0\rangle z prawdopodobieństwem 100%, jeśli θ=0\theta = 0, i zmierzymy 1|1\rangle z prawdopodobieństwem 100%, jeśli θ=12\theta = \frac{1}{2} (i jeśli nasz komputer kwantowy jest idealny, bez szumów). Jeśli θ\theta 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 00 do pomiaru fazy użyjemy mm Qubitów od 00 do m1m-1, będziemy w stanie estymować fazę z dokładnością do mm bitów. Zobaczmy, jak to działa:

Schemat obwodu algorytmu QPE dla wielu Qubitów. Bramki Hadamarda są stosowane do Qubitów danych od 0 do m-1. Następnie do m Qubitów pomocniczych stosowana jest seria bramek kontrolowanych-U. Na końcu do Qubitów stosowana jest odwrotna QFT i są one mierzone.

Ten bardziej precyzyjny obwód QPE rozpoczyna się tak samo jak wersja jednobitowa: bramki Hadamarda są stosowane do pierwszych mm Qubitów, a pozostałe Qubity są przygotowane w stanie ψ|\psi\rangle, tworząc stan:

π1=12m/2ψ(0+1)(0+1)...(0+1)|\pi_1\rangle = \frac{1}{2^{m/2}}|\psi\rangle(|0\rangle+|1\rangle)(|0\rangle+|1\rangle)...(|0\rangle+|1\rangle)

Teraz stosowane są bramki kontrolowane-unitarne. Qubit 00 jest kontrolą dla tej samej operacji unitarnej UU co poprzednio. Ale teraz Qubit 11 jest kontrolą dla operacji unitarnej U2U^2, czyli po prostu UU zastosowanej dwukrotnie. Wartość własna U2U^2 wynosi zatem e22πiθe^{2*2\pi i \theta}. Ogólnie, każdy Qubit kk od 0 do m1m-1 będzie kontrolą dla operacji unitarnej U2kU^{2^k}. Oznacza to, że każdy z tych Qubitów dozna przeniesienia fazy równego e2k2πiθe^{2^k*2\pi i \theta}. Daje to stan:

π2=ψ12m/2(0+e2m12πiθ1)(0+e2m22πiθ1)...(0+e2πiθ1)|\pi_2\rangle = |\psi\rangle \otimes \frac{1}{2^{m/2}} (|0\rangle+e^{2^{m-1}2\pi i \theta}|1\rangle)(|0\rangle+e^{2^{m-2}2\pi i \theta}|1\rangle)...(|0\rangle+e^{2\pi i \theta}|1\rangle)

Można to przepisać jako sumę po stanach bazy obliczeniowej:

π2=ψ12m/2k=02m1e2πikθk|\pi_2\rangle = |\psi\rangle \otimes \frac{1}{2^{m/2}} \sum_{k=0}^{2^{m}-1} e^{2\pi i k \theta} |k\rangle

Czy ta suma wygląda znajomo? To jest QFT! Przypomnij sobie równanie kwantowej transformaty Fouriera:

QFT2my=12mx=02m1ω2myxx \text{QFT}_{2^m}| y \rangle = \frac{1}{\sqrt{2^m}}\sum_{x=0}^{2^m-1}\omega_{2^m}^{y x} \vert x \rangle

Tak więc, jeśli faza θ=y/2m\theta = y/2^m dla pewnej liczby całkowitej yy z przedziału od 00 do 2m12^m-1, to zastosowanie odwrotnej QFT do tego stanu da stan:

π3=ψy|\pi_3\rangle = |\psi\rangle \otimes |y\rangle

a z y|y\rangle możemy wyznaczyć θ\theta.

Jeśli jednak θ/2m\theta/2^m nie jest całkowitą wielokrotnością, zastosowanie odwrotnej QFT jedynie przybliży θ\theta. 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 mm użyjemy, tym lepsze przybliżenie uzyskamy. Aby dowiedzieć się, jak skwantyfikować to przybliżenie θ\theta, 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

  1. P/F Kwantowa transformata Fouriera jest kwantowym odpowiednikiem klasycznej dyskretnej transformaty Fouriera (DFT).
  2. P/F QFT można zaimplementować używając wyłącznie bramek Hadamarda i CNOT.
  3. P/F QFT jest kluczowym składnikiem algorytmu Shora.
  4. P/F Wynikiem kwantowej estymacji fazy jest stan kwantowy reprezentujący wektor własny operatora.
  5. P/F QPE wymaga użycia odwrotnej kwantowej transformaty Fouriera (QFT^\dag).
  6. P/F W QPE, jeśli faza ϕ\phi jest dokładnie reprezentowalna za pomocą nn bitów, algorytm daje poprawny wynik z prawdopodobieństwem 1.

Krótkie odpowiedzi

  1. Ile Qubitów jest potrzebnych do wykonania QFT na układzie z 2n2^n punktami danych?
  2. Czy QFT można zastosować do stanu, który nie jest stanem bazy obliczeniowej? Jeśli tak, co się wtedy dzieje?
  3. Jak liczba Qubitów kontrolnych użytych w QPE wpływa na rozdzielczość wynikowej estymacji fazy?

Zadania

  1. Użyj mnożenia macierzowego, aby zweryfikować, że kroki algorytmu QFT rzeczywiście dają macierz QFT4\text{QFT}_4:
QFT4=12(11111i1i11111i1i)\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}

(Nie musisz robić tego ręcznie!)

Zadania dodatkowe

  1. Skonstruuj cztero-Qubitowy stan będący równą superpozycją wszystkich nieparzystych baz obliczeniowych: ψ=0001+0011+0101+0111+1001+1011+1101+1111|\psi\rangle = |0001\rangle + |0011\rangle + |0101\rangle + |0111\rangle +|1001\rangle +|1011\rangle +|1101\rangle +|1111\rangle. 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.