Quanten-Fourier-Transformation
Für dieses Modul "Qiskit im Klassenzimmer" müssen die Schüler eine funktionierende Python Umgebung mit den folgenden Paketen installiert haben:
qiskitv2.1.0 oder neuerqiskit-ibm-runtimev0.40.1 oder neuerqiskit-aerv0.17.0 oder neuerqiskit.visualizationnumpypylatexenc
Um die oben genannten Pakete einzurichten und zu installieren, lesen Sie die Anleitung Qiskit installieren. Um Jobs auf echten Quantencomputern ausführen zu können, müssen die Schüler ein Konto bei IBM Quantum® einrichten, indem sie die Schritte in der Anleitung zur Einrichtung Ihres IBM Cloud Kontos befolgen.
Dieses Modul wurde getestet und verbrauchte 13 Sekunden QPU-Zeit. Dies ist eine Schätzung nach bestem Wissen und Gewissen; Ihr tatsächlicher Verbrauch kann davon abweichen.
# 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'Einführung
Die Fourier-Transformation ist ein allgegenwärtiges Werkzeug, das in der Mathematik, der Physik, der Signalverarbeitung, der Datenkompression und unzähligen anderen Bereichen Anwendung findet. Eine Quantenversion der Fourier-Transformation, treffend Quanten-Fourier-Transformation genannt, bildet die Grundlage für einige der wichtigsten Quantenalgorithmen.
Nach einer Erinnerung an die klassische Fourier-Transformation werden wir heute darüber sprechen, wie wir die Quanten-Fourier-Transformation auf einem Quantencomputer implementieren. Dann werden wir eine der Anwendungen der Quanten-Fourier-Transformation für einen Algorithmus namens Phasenschätzungsalgorithmus diskutieren. Die Quantenphasenschätzung ist eine Unterroutine in Shors berühmtem Factoring-Algorithmus, der manchmal als "Kronjuwel" der Quanteninformatik bezeichnet wird. Dieses Modul baut auf einem anderen Modul auf, das sich mit dem Shor-Algorithmus befasst, aber es ist auch als eigenständiges Modul gedacht. Die Quanten-Fourier-Transformation ist ein faszinierender und nützlicher Algorithmus für sich!
Die klassische Fourier-Transformation
Bevor wir uns mit der Quanten-Fourier-Transformation befassen, sollten wir uns zunächst an die klassische Version erinnern. Die Fourier-Transformation ist eine Methode zur Umwandlung von einer sogenannten "Basis" in eine andere. Man kann sich zwei Basen als unterschiedliche Sichtweisen desselben Problems vorstellen - beide sind gültige Möglichkeiten, eine Funktion auszudrücken, aber je nach Problemstellung ist die eine oder die andere vielleicht aufschlussreicher. Einige Beispiele für Basenpaare, die durch Fourier-Transformation verbunden sind, sind Position und Impuls sowie Zeit und Frequenz.
Anhand eines Beispiels soll gezeigt werden, wie die Fourier-Transformation uns dabei helfen kann, anhand der Audiowellenform herauszufinden, welche Note ein Instrument spielt. Normalerweise werden die Wellenformen in der Zeitbasis dargestellt, d. h. die Amplitude der Welle wird als Funktion der Zeit ausgedrückt.
Durch Fourier-Transformation können wir diese Wellenform von der Zeitbasis in die Frequenzbasis überführen:
Auf der Frequenzbasis ist eine deutliche Spitze bei etwa 260 Hz zu erkennen. Das ist ein mittleres C!
Nun hätten Sie vielleicht feststellen können, dass ein mittleres C gespielt wurde, ohne eine Fourier-Transformation zu verwenden, aber was ist, wenn mehrere Noten gleichzeitig gespielt werden? Dann wird die Wellenform komplizierter, wenn wir sie auf der Zeitbasis darstellen:
Im Frequenzspektrum sind jedoch eindeutig drei Spitzen zu erkennen:
Dies war ein C-Dur-Akkord mit den Noten C, E und G.
Diese Art der Fourier-Analyse kann uns dabei helfen, die Frequenzkomponenten von komplizierten Signalen aller Art zu extrahieren.
Diskrete Fourier-Transformation
Die Fourier-Transformation ist für eine Vielzahl von Signalverarbeitungsanwendungen nützlich. Aber in den meisten dieser realen Anwendungen (einschließlich des Musikbeispiels, das wir oben verwendet haben) wollen wir eine diskrete Menge von Datenpunkten transformieren - nicht eine kontinuierliche Funktion. In diesem Fall verwenden wir die diskrete Fourier-Transformation. Die diskrete Fourier-Transformation (DFT) wirkt auf einen Vektor und bildet ihn gemäß der Formel auf den Vektor ab:
wobei wir nehmen. (Beachten Sie, dass es auch andere Konventionen gibt, die ein Minuszeichen im Exponentialwert haben, seien Sie also vorsichtig, wenn Sie die DFT in freier Wildbahn sehen) Es sei daran erinnert, dass eine periodische Funktion mit der Periode ist. Durch Multiplikation mit dieser Funktion ist die Fourier-Transformation also im Wesentlichen eine Möglichkeit, die (diskrete) Funktion in eine Linearkombination ihrer einzelnen periodischen Funktionen zu zerlegen, die jeweils eine Periode haben.
Die Quanten-Fourier-Transformation
Wir haben nun gesehen, wie die Fourier-Transformation verwendet wird, um eine Funktion als Linearkombination einer neuen Gruppe von so genannten "Basisfunktionen" darzustellen Auch für Qubit-Zustände werden regelmäßig Basistransformationen durchgeführt. Der Zustand eines einzelnen Qubits kann zum Beispiel in der Berechnungsbasis mit den Basiszuständen und oder in der Basis mit den Basiszuständen und ausgedrückt werden. Beide sind gleichermaßen gültig, aber je nach Art des Problems, das Sie zu lösen versuchen, könnte eines natürlicher sein als das andere.
Qubit-Zustände können auch in der Fourier-Basis ausgedrückt werden, wobei ein Zustand als Linearkombination der Fourier-Basiszustände ausgedrückt wird, anstatt der üblichen, rechnerischen Basiszustände, . Dazu müssen Sie eine Quanten-Fourier-Transformation (QFT) durchführen:
mit wie oben und ist die Anzahl der Basiszustände in Ihrem Quantensystem. Beachten Sie, dass wir jetzt mit Qubits arbeiten und Qubits Ihnen Basiszustände liefern, sodass . Hier werden die Basiszustände als einzelne Zahl geschrieben: , wobei von bis reicht. Häufiger werden die Basiszustände jedoch als , , ,..., ausgedrückt, wobei jede Binärziffer den Zustand von Qubit 0 bis von rechts nach links darstellt. Es gibt eine einfache Möglichkeit, diese binären Zustände in eine einzige Zahl umzuwandeln: Behandeln Sie sie einfach wie Binärzahlen! Also, , , , und so weiter, bis hin zu .
Intuition für die Fourier-Basiszustände entwickeln
Wir haben also gerade besprochen, was die Zustände der Berechnungsbasis sind und wie sie geordnet sind: Sie sind die Menge der Zustände, in denen jedes Qubit entweder oder ist, und wir ordnen sie von dem Zustand, in dem alle Qubits , sind, bis zu dem Zustand, in dem sie alle , sind.
Aber wie können wir die Fourier-Basiszustände sinnvoll nutzen? Alle Fourier-Basiszustände sind gleiche Überlagerungen aller Berechnungsbasiszustände, aber jeder Zustand unterscheidet sich von den anderen durch die Periodizität der Phase der Komponenten. Um dies konkreter zu verstehen, betrachten wir die vier Fourier-Basiszustände eines Zwei-Qubit-Systems. Der niedrigste Fourier-Zustand ist ein Zustand, dessen Phase sich überhaupt nicht ändert:
Wir können diesen Zustand veranschaulichen, indem wir die komplexe Amplitude der einzelnen Terme aufzeichnen. Die rote Linie zeigt Ihnen, wie sich die Phase dieser Amplitude in Abhängigkeit vom Zustand der Berechnungsgrundlage um die komplexe Ebene windet. Bei bleibt die Phase konstant:
Der nächste Fourier-Basiszustand ist derjenige, dessen Phasen der Komponenten nur einmal von auf umlaufen:
Und wir können diese Wicklung im Diagramm der komplexen Amplitude gegen den Berechnungsbasiszustand sehen:
Jeder Zustand hat also eine Phase, die Radiant höher ist als der Zustand vor ihm, wenn sie in der Standardreihenfolge angeordnet sind, da wir in diesem Beispiel vier Basiszustände haben ( ). Der nächste Basiszustand windet sich zweimal von 0 bis 2 :
Schließlich ist die höchste Fourier-Komponente diejenige mit der sich am schnellsten ändernden Phase. In unserem Beispiel mit zwei Qubits ist es dasjenige, dessen Phase dreimal von 0 auf wechselt:
Im Allgemeinen gibt es für einen -Qubit-Zustand Fourier-Basiszustände, deren Frequenz in der Phasenänderung von konstant für bis zu schnell variierend für reicht und Windungen um über die Überlagerung der Zustände vervollständigt. Wenn wir also eine QFT eines Quantenzustands durchführen, führen wir im Wesentlichen dieselbe grundlegende Analyse durch, die wir für die musikalische Wellenform in der Einleitung durchgeführt haben. Wir bestimmen die Fourier-Frequenzkomponenten, die zur Erzeugung des interessierenden Quantenzustands beitragen.
Probieren Sie einige Beispiel-QFTs aus
Versuchen wir, unser Gespür für die Quanten-Fourier-Transformation weiter auszubauen, indem wir einen Zustand in der Rechenbasis definieren und dann beobachten, was passiert, wenn wir die QFT darauf anwenden. Vorerst betrachten wir die QFT einfach als eine Blackbox, die wir mithilfe der QFTGate aus der Qiskit-Schaltkreisbibliothek anwenden. Später werden wir uns näher mit den Einzelheiten der Umsetzung befassen.
Wir beginnen damit, die erforderlichen Pakete zu laden und ein Gerät auszuwählen, auf dem unsere Schaltung laufen soll:
import numpy as np
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from qiskit.circuit.library import QFTGate# Load IBM Quantum Compute 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)Output:
ibm_pinguino2
Wenn Sie auf Ihrem Konto keine Zeit zur Verfügung haben oder aus irgendeinem Grund einen Simulator verwenden möchten, können Sie die unten stehende Zelle ausführen, um einen Simulator einzurichten, der das oben ausgewählte Quantengerät nachahmt:
# 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)Einzelner Rechengrundzustand
Versuchen wir zunächst, einen einzelnen Zustand der Berechnungsgrundlage zu transformieren. Wir beginnen mit der Erstellung eines zufälligen Berechnungsstatus:
# 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:
# 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:
Nun wollen wir diesen Zustand mit QFTGate Fourier-transformieren:
# Step 1: Map
qc_qft.compose(QFTGate(qubits), inplace=True)
qc_qft.measure_all()
qc_qft.draw("mpl")Output:
# 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:
Wie Sie sehen, messen wir, dass die Populationen der einzelnen Zustände mehr oder weniger gleich sind, abgesehen von einigen experimentellen und statistischen Störungen. Nimmt man also die QFT eines einzelnen Basiszustandes, so ist das Ergebnis eine gleichwertige Überlagerung aller Zustände. Wenn Sie mit Fourier-Transformationen vertraut sind, wird Sie das wahrscheinlich nicht überraschen. Ein Grundprinzip, das uns helfen kann, eine intuitive Verbindung zwischen einer Funktion und ihrer Fouriertransformation herzustellen, ist, dass die Breite einer Funktion umgekehrt proportional zur Breite ihrer Fouriertransformation ist. Für etwas, das zeitlich sehr begrenzt ist, wie z. B. ein sehr kurzer Impuls, ist ein breites Spektrum an Frequenzen erforderlich, um diesen Impuls zu erzeugen. Dieses Signal wird im Fourier-Raum sehr breit sein.
Diese Tatsache hängt tatsächlich mit der Quantenunsicherheit zusammen! Die Heisenbergsche Unschärferelation wird üblicherweise als angegeben. Wenn also die Unsicherheit in ( ) klein ist, muss die Unsicherheit im Impuls ( ) groß sein, und umgekehrt. Es stellt sich heraus, dass die Umwandlung von der Positionsbasis in die Impulsbasis durch eine Fourier-Transformation erreicht wird.
Hinweis: Beachten Sie, dass wir die Populationen in jedem der Basiszustände messen, so dass wir Informationen über die relativen Phasen zwischen den verschiedenen Teilen der Überlagerung verlieren. Während also die QFT eines einzelnen Basiszustands die gleiche gleichmäßige Verteilung der Population über alle Basiszustände ergibt, sind die Phasen nicht notwendigerweise die gleichen.
Zwei rechnerische Grundzustände
Sehen wir uns nun an, was passiert, wenn wir eine Überlagerung von Berechnungsbasiszuständen vorbereiten. Wie wird die Fourier-Transformation in diesem Fall aussehen?
Entscheiden wir uns für die Überlagerung:
# 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:
# 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:
Nun wollen wir diesen Zustand mit QFTGate Fourier-transformieren:
# Step 1: Map
qc_qft.compose(QFTGate(qubits), inplace=True)
qc_qft.measure_all()
qc_qft.draw("mpl")Output:
# 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:
Dieser Fall könnte etwas überraschender sein. Es sieht so aus, als ob die QFT des Zustands eine Superposition aller geraden Basiszustände ist. Aber wenn wir an unsere Visualisierung der einzelnen Basiszustände zurückdenken und daran, wie die Phase jeder Komponente mal umkreist, dann wird der Grund für dieses Ergebnis vielleicht klar.
Überprüfen Sie Ihr Verständnis
Erkläre anhand des obigen Hinweises, warum das Ergebnis, das wir für die Quantenfeldtheorie von erhalten haben, zu erwarten ist.
Der ursprüngliche Zustand hat eine relative Phase von 0 (oder ein ganzzahliges Vielfaches von ) zwischen den beiden Teilen der Überlagerung. Wir wissen also, dass dieser Zustand Fourier-Komponenten hat, deren Phasen ebenfalls auf diese Weise übereinstimmen: diejenigen, die eine Phasenverschiebung von 0 zwischen dem Term |0000> und dem Term |1000> haben. Jeder Fourier-Basiszustand setzt sich aus Termen zusammen, deren Phase sich mit der Rate akkumuliert. Das bedeutet, dass jeder Term in der Überlagerung eine Phase von hat, die größer ist als die des vorhergehenden Terms, wenn er in der üblichen Weise angeordnet ist. Auf halber Strecke soll also die Phase ein ganzzahliges Vielfaches von sein. Dies ist der Fall, wenn gerade ist.
Welche Überlagerung von Zuständen würde einer Quantenfeldtheorie entsprechen, bei der die Spitzen bei jeder ungeraden Zweierzahl auftreten?
Nimmt man die QFT des Zustands , dann würde man bei jedem ungeraden binär nummerierten Zustand Spitzenwerte sehen.
Den QFT-Algorithmus aufschlüsseln
Nachdem wir nun ein besseres Verständnis für die Beziehung zwischen Qubitzuständen in der Berechnungsbasis und der Fourier-Basis gewonnen haben, wollen wir uns nun mit dem QFT-Algorithmus selbst befassen. Mit anderen Worten: Welche Gatter implementieren wir tatsächlich auf dem Quantencomputer, um diese Transformation zu erreichen?
Fangen wir klein an, mit einem einzigen Qubit. Das bedeutet also, dass wir zwei Basiszustände haben werden. QFT transformiert die Rechenbasiszustände und in die Fourier-Basiszustände und :
Überprüfen Sie Ihr Verständnis
Verwende die Gleichung für die Quantenfeldtheorie aus dem vorigen Abschnitt, um die beiden oben genannten Fourier-Basiszustände zu überprüfen.
Die allgemeine QFT-Formel lautet:
Für ein einzelnes Qubit ( ), , und . Wir haben also
Schauen Sie sich diese beiden Gleichungen an. Vielleicht kennen Sie bereits ein Quantengatter, mit dem sich diese Transformation durchführen lässt. Das heißt, es gibt ein Tor, das die Rechenbasiszustände und in die entsprechenden Fourier-Basiszustände und transformiert. Es ist ein Hadamard-Tor! Dies wird noch deutlicher, wenn wir eine Matrixdarstellung der QFT Operation einführen:
Wenn Sie mit dieser Notation für den Ausdruck eines Quantenoperators nicht vertraut sind, ist das kein Problem! Es ist eine Art, eine Matrix darzustellen, wobei und die Spalten und Zeilen der Matrix von bis indizieren und der Wert des jeweiligen Eintrags ist. Der Eintrag in der 0. Spalte und in der 2. Zeile wäre zum Beispiel einfach .
In dieser Darstellung ist jeder Zustand der Berechnungsgrundlage mit einem der Basisvektoren verbunden:
Wenn Sie mehr über diese Darstellung erfahren möchten, lesen Sie John Watrous' Lektion über multiple Systeme im Kurs Grundlagen der Quanteninformation.
Versuchen wir, die Matrix für die QFT zu konstruieren. Mit der obigen Formel finden wir, dass
Um diese Matrix auf einem Quantencomputer zu implementieren, müssen wir herausfinden, welche Kombination von Gattern, die auf welche Qubits angewendet werden, eine unitäre Transformation ergeben, die der obigen Matrix entspricht. Eines der Tore, die benötigt werden, kennen wir bereits: das Hadamard-Tor. Ein weiteres Gatter, das wir brauchen, ist das phasengesteuerte Gatter, das eine relative Phase auf den Zustand des Ziel-Qubits anwendet, solange sich das Kontroll-Qubit im Zustand befindet. In Matrixform sieht das wie folgt aus:
Da nur der Zustand geändert wird, ist es eigentlich egal, welches Qubit als "Kontrolle" und welches als "Ziel" betrachtet wird Das Ergebnis ist in beiden Fällen dasselbe.
Schließlich brauchen wir auch einige SWAP-Gates. Ein SWAP-Gatter vertauscht die Zustände von zwei Qubits. Sieht so aus:
Das Verfahren zur Konstruktion einer QFT Schaltung auf Qubits ist iterativ - man wendet zuerst QFT auf die Qubits bis an und fügt dann einige Gatter zwischen dem Qubit und den anderen Qubits hinzu. Aber um die QFT anzuwenden, muss man zuerst die QFT auf die Qubits 2 bis anwenden und dann einige Gatter zwischen Qubit 1 und den restlichen Qubits bis hinzufügen. Es ist wie eine russische Schachtelpuppe: Jede Puppe erhöht die Dimension des QFT-Schaltkreises um den Faktor zwei, wobei die kleinste Puppe in der Mitte die QFT oder das Hadamard-Gatter ist.
Um eine Puppe in die nächstgrößere Puppe zu stecken und damit die Dimension der QFT um den Faktor zwei zu vergrößern, geht man immer nach dem gleichen Verfahren vor:
- Zunächst wird die QFT auf die untersten Qubits angewendet. Dies ist die "kleinere Puppe" des russischen Nistpuppensets, die du bald in die nächstgrößere Puppe stecken wirst.
- Verwenden Sie das nächsthöhere Qubit als Kontrolle und wenden Sie kontrollierte Phasentore auf jedes der unteren Qubits an, mit Phasen zu den Standard-Basiszuständen jedes der verbleibenden Qubits.
- Führen Sie ein Hadamard-Verfahren für das oberste Qubit durch, das als Kontrolle für die Phasentore verwendet wurde.
- Verwenden Sie SWAP-Gatter, um die Reihenfolge der Qubits zu vertauschen, so dass das niedrigstwertige (obere) Bit zum höchstwertigen (unteren) Bit wird und alle anderen sich um eins nach oben verschieben.
Wir haben bereits die Funktion QFTGate aus der Qiskit-Schaltkreisbibliothek verwendet, aber jetzt wollen wir einen Blick in einige dieser QFT-Gatter werfen, um das obige Verfahren zu überprüfen. Wir können dies mit decompose() tun.
qc = QuantumCircuit(1)
qc.compose(QFTGate(1), inplace=True)
qc.decompose().draw("mpl")Output:
qc = QuantumCircuit(2)
qc.compose(QFTGate(2), inplace=True)
qc.decompose().draw("mpl")Output:
qc = QuantumCircuit(3)
qc.compose(QFTGate(3), inplace=True)
qc.decompose().draw("mpl")Output:
qc = QuantumCircuit(4)
qc.compose(QFTGate(4), inplace=True)
qc.decompose().draw("mpl")Output:
Anhand der ersten vier QFTs können Sie also hoffentlich erkennen, wie jede einzelne in die nächstgrößere verschachtelt ist. Sie haben vielleicht bemerkt, dass einige der Phasentore nicht genau so sind, wie in der oben beschriebenen Prozedur vorgeschrieben, und dass die SWAPs nicht nach jeder Unterroutine erscheinen, sondern erst ganz am Ende der vollständigen QFT. Dies erspart uns unnötige Gatter, die die Schaltung länger und fehleranfälliger machen würden. Anstatt den SWAP nach jeder verschachtelten Puppe zu implementieren, verfolgt die Schaltung, wo sich jedes Qubit befinden sollte, und passt die Qubits, auf die sie die Phasengatter anwendet, entsprechend an. Eine letzte Reihe von SWAPs am Ende bringt dann alles an seinen Platz.
Wenden Sie die QFT an: Phasenschätzung
Sehen wir uns an, wie die QFT zur Lösung eines nützlichen Problems in der Quanteninformatik verwendet werden kann. Die Berechnung der inversen Quanten-Fourier-Transformation ist ein notwendiger Schritt in einem Algorithmus, der als Quanten-Phasenschätzung (Quantum Phase Estimation, QPE) bekannt ist und selbst eine Unterroutine in vielen anderen Algorithmen ist, einschließlich des "Kronjuwels" der Quantenalgorithmen, dem Shor-Faktorisierungsalgorithmus.
Das Ziel von QPE ist es, die Eigenwerte eines unitären Operators zu schätzen. Unitäre Operatoren sind in der Quanteninformatik allgegenwärtig, und oft ist die Ermittlung der Eigenwerte ihrer zugehörigen Eigenvektoren ein notwendiger Schritt in einem größeren Algorithmus. Je nach Problemstellung kann ein Eigenwert die Energie eines Hamiltonianers in einem simulationsartigen Problem darstellen, uns helfen, Primfaktoren einer Zahl im Shor-Algorithmus zu finden, oder andere wichtige Informationen enthalten. QPE ist eines der wichtigsten und am häufigsten verwendeten Unterprogramme im Quantencomputing.
Was hat das nun mit einer Quanten-Fourier-Transformation zu tun? Wie Sie sich vielleicht erinnern, hat jeder Eigenwert eines unitären Operators den Betrag . Wir können also jeden Eigenwert als eine komplexe Zahl mit dem Betrag eins schreiben:
wobei eine reelle Zahl zwischen 0 und 1 ist. Wenn Sie weitere Informationen zu unitären Matrizen wünschen, sehen Sie sich die Lektion von John Watrous zu diesem Thema in „Grundlagen der Quanteninformation“ an.
Beachten Sie, dass in * periodisch* ist. Dies könnte bereits darauf hindeuten, dass eine QFT beteiligt sein könnte, da wir gesehen haben, wie nützlich QFTs für die Analyse periodischer Funktionen sind. Im Folgenden werden wir den Algorithmus durchgehen und genau sehen, wie die QFT ins Spiel kommt.
Wie QPE funktioniert
Beginnen wir mit dem einfachsten QPE-Algorithmus, der die Phase grob auf eine einzige Binärstelle genau schätzt. Mit anderen Worten, dieser Algorithmus kann zwischen und unterscheiden, kann aber nicht mehr als das. Hier ist der Schaltplan:
Die Qubits werden im Zustand vorbereitet, wobei sich das Qubit im Zustand und die übrigen Qubits im Zustand befinden, der ein Eigenzustand von ist. Nach dem ersten Hadamard wird der Qubit-Zustand:
Das nächste Tor ist ein "gesteuertes " Tor. Dies wendet die unitäre Operation auf die unteren Qubits an, die sich im Zustand befinden, wenn sich das Qubit 0 im Zustand befindet, tut aber nichts auf , wenn sich das Qubit 0 im Zustand befindet. Dies transformiert die Qubits in den Zustand:
Etwas Seltsames ist gerade passiert: Das kontrollierte Gatter verwendet nur das Qubit als Kontroll-Qubit, so dass man meinen könnte, dass dieses Gatter den Zustand von Qubit 0 überhaupt nicht verändern würde. Aber irgendwie tut es das doch! Obwohl die Operation auf die unteren Qubits angewendet wurde, besteht der Gesamteffekt des Gatters darin, die Phase des Qubits zu ändern. Dies ist als "Phase Kickback-Mechanismus" bekannt und wird in vielen Quantenalgorithmen verwendet, einschließlich der Algorithmen von Deutsch-Josza und Grover. Wenn Sie mehr über den Phase-Kickback-Mechanismus erfahren möchten, lesen Sie John Watrous' Lektion über Quantenabfragealgorithmen in Grundlagen der Quantenalgorithmen.
Nach dem Phasenkickback wenden wir ein weiteres Hadamard-Verfahren auf das Qubit an, was zu dem Zustand führt:
Wenn wir also am Ende das Qubit messen, werden wir mit 100%iger Sicherheit messen, wenn und wir werden mit 100%iger Sicherheit messen, wenn (und wenn unser Quantencomputer perfekt ist, ohne Rauschen). Wenn etwas anderes ist, ist die endgültige Messung nur probabilistisch und sagt uns nur so viel.
QPE mit höherer Präzision: mehr Qubits
Wir können dieses einfache Konzept auf einen komplizierteren Algorithmus mit beliebiger Genauigkeit erweitern. Wenn wir zur Messung der Phase nicht nur das Qubit verwenden, sondern auch die Qubits bis , dann können wir die Phase mit der Genauigkeit von schätzen. Schauen wir mal, wie das funktioniert:
Diese präzisere QPE-Schaltung beginnt genauso wie die Ein-Bit-Version: Hadamards werden auf die ersten Qubits angewandt, und die restlichen Qubits werden im Zustand vorbereitet, wodurch der Zustand entsteht:
Jetzt werden die kontrollierten Einheiten angewendet. Qubit ist das Steuerelement für die gleiche einheitliche wie zuvor. Aber jetzt ist das Qubit die Steuerung für das unitäre , das einfach zweimal angewendet wird. Der Eigenwert von ist also . Im Allgemeinen ist jedes Qubit von 0 bis die Steuerung für die Unitary . Das bedeutet, dass jedes dieser Qubits einen Phasenrückschlag von erfährt. Dies führt zu dem Zustand:
Dies kann als Summe über die Zustände der Berechnungsbasis umgeschrieben werden:
Kommt Ihnen die Summe bekannt vor? Es ist ein QFT! Erinnern Sie sich an die Gleichung für eine Quanten-Fourier-Transformation:
Wenn also die Phase für eine ganzzahlige zwischen und liegt, dann führt die inverse QFT dieses Zustands zu diesem Zustand:
und aus können wir ableiten.
Wenn jedoch kein ganzzahliges Vielfaches ist, dann wird die inverse QFT nur eine Annäherung an liefern. Wie gut angenähert wird, ist probabilistisch, d.h. wir werden nicht immer die beste Annäherung erhalten, aber sie wird ziemlich nahe sein, und je mehr Qubits verwendet werden, desto besser wird die Annäherung sein. Wie diese Annäherung an quantifiziert werden kann, erfahren Sie in John Watrous' Lektion über Phasenschätzung und Faktorisierung in Grundlagen der Quantenalgorithmen.
Fazit
Dieses Modul gab einen Überblick darüber, was eine QFT ist, wie sie auf einem Quantencomputer implementiert wird und wie nützlich sie bei der Lösung von Problemen sein kann. Wir haben Ihnen einen Vorgeschmack auf seine Nützlichkeit gegeben, als wir gesehen haben, wie es in der Quantenphasenschätzung verwendet werden kann, um etwas über die Eigenwerte einer Einheitsmatrix zu erfahren.
Kritische Konzepte
- Die Quanten-Fourier-Transformation ist das Quanten-Analogon zur Diskreten Fourier-Transformation.
- Die QFT ist ein Beispiel für eine Basistransformation.
- Das Verfahren zur Quanten-Phasenschätzung beruht auf dem Phasen-Kickback-Mechanismus der kontrolliert-unitären Operationen sowie auf einer inversen QFT.
- QFT und QPE sind beide weit verbreitete Unterprogramme in zahlreichen Quantenalgorithmen.
Fragen
True/False
- T/F Die Quanten-Fourier-Transformation ist das Quanten-Analogon der klassischen diskreten Fourier-Transformation (DFT).
- T/F QFT kann nur mit Hadamard- und CNOT-Gattern implementiert werden.
- T/F QFT ist eine Schlüsselkomponente des Shor-Algorithmus.
- T/F Das Ergebnis der Quantenphasenschätzung ist ein Quantenzustand, der den Eigenvektor des Operators darstellt.
- T/F QPE erfordert die Verwendung der inversen Quanten-Fourier-Transformation (QFT ).
- T/F Wenn bei QPE die Phase mit Bits exakt darstellbar ist, liefert der Algorithmus mit Wahrscheinlichkeit 1 das richtige Ergebnis.
Kurze Antworten
- Wie viele Qubits werden benötigt, um eine QFT für ein System mit Datenpunkten durchzuführen?
- Kann die QFT auf einen Zustand angewendet werden, der keine Berechnungsgrundlage ist? Wenn ja, was passiert dann?
- Wie wirkt sich die Anzahl der in QPE verwendeten Kontrollqubits auf die Auflösung der resultierenden Phasenschätzung aus?
Fehler
- Verwenden Sie die Matrixmultiplikation, um zu überprüfen, ob die Schritte des QFT-Algorithmus tatsächlich die Matrix ergeben:
(Sie müssen das nicht von Hand machen!)
Herausfordernde Probleme
- Erzeugen Sie einen Vier-Qubit-Zustand, der eine gleichwertige Superposition aller ungeraden Berechnungsbasen ist: . Führen Sie dann eine QFT für diesen Zustand durch. Wie sieht der daraus resultierende Zustand aus? Erläutern Sie, warum Ihr Ergebnis sinnvoll ist, und nutzen Sie dabei Ihre Kenntnisse über Fourier-Transformationen.