Shors Algorithmus
Jetzt wenden wir uns dem Problem der ganzzahligen Faktorisierung zu und sehen, wie es auf einem Quantencomputer mithilfe von Phasenschätzung effizient gelöst werden kann. Der Algorithmus, den wir erhalten werden, ist Shors Algorithmus zur ganzzahligen Faktorisierung. Shor hat seinen Algorithmus nicht explizit in Begriffen der Phasenschätzung beschrieben, aber es ist eine natürliche und anschauliche Möglichkeit, seine Funktionsweise zu erklären.
Wir beginnen mit einem Zwischenproblem, dem sogenannten Ordnungsbestimmungsproblem, und sehen, wie die Phasenschätzung eine Lösung dafür liefert. Anschließend sehen wir, wie eine effiziente Lösung des Ordnungsbestimmungsproblems uns eine effiziente Lösung des ganzzahligen Faktorisierungsproblems gibt. (Wenn die Lösung eines Problems die Lösung eines anderen Problems liefert, sagen wir, dass das zweite Problem auf das erste reduziert — in diesem Fall reduzieren wir also die ganzzahlige Faktorisierung auf die Ordnungsbestimmung.) Dieser zweite Teil von Shors Algorithmus macht überhaupt keinen Gebrauch von Quantencomputing; er ist vollständig klassisch. Quantencomputing wird nur für die Ordnungsbestimmung benötigt.
Das Ordnungsbestimmungsproblem
Ein wenig Zahlentheorie
Um das Ordnungsbestimmungsproblem und seine Lösung durch Phasenschätzung zu erklären, hilft es, mit ein paar grundlegenden zahlentheoretischen Konzepten zu beginnen und dabei hilfreiche Notation einzuführen.
Zunächst definieren wir für eine beliebige positive ganze Zahl die Menge wie folgt.
Zum Beispiel: und so weiter.
Das sind Mengen von Zahlen, aber wir können sie als mehr als nur Mengen betrachten. Insbesondere können wir über arithmetische Operationen auf nachdenken, wie Addition und Multiplikation — und wenn wir uns darauf einigen, die Ergebnisse stets modulo zu nehmen (d. h. durch zu teilen und den Rest als Ergebnis zu verwenden), bleiben wir bei diesen Operationen immer in dieser Menge. Die beiden konkreten Operationen Addition und Multiplikation, beide modulo genommen, machen zu einem Ring, einem grundlegend wichtigen Objekt in der Algebra.
Zum Beispiel sind und Elemente von , und wenn wir sie multiplizieren, erhalten wir , was bei Division durch den Rest lässt. Das schreibt man manchmal so:
Wenn klar ist, dass wir in arbeiten, kann man aber auch einfach schreiben, um die Notation möglichst einfach zu halten.
Hier sind die Additions- und Multiplikationstabellen für als Beispiel.
Unter den Elementen von sind die Elemente mit besonders. Die Menge dieser Elemente wird häufig mit einem Stern bezeichnet:
Betrachtet man nur die Multiplikation, bildet eine Gruppe — genauer eine abelsche Gruppe — ein weiteres wichtiges Objekt in der Algebra. Eine grundlegende Eigenschaft dieser Mengen (und endlicher Gruppen im Allgemeinen) ist, dass man für jedes , wenn man wiederholt mit sich selbst multipliziert, schließlich immer die Zahl erhält.
Als erstes Beispiel nehmen wir . Es gilt , da , und wenn wir mit sich selbst multiplizieren, erhalten wir , wie die obige Tabelle bestätigt.
Als zweites Beispiel nehmen wir . Die Zahlen von bis , die mit den ggT haben, sind:
Für jedes dieser Elemente kann man die Zahl zu einer positiven ganzzahligen Potenz erheben und erhält . Hier sind die kleinsten Potenzen, für die das funktioniert:
Wir arbeiten für alle diese Gleichungen in , was wir nicht explizit hinschreiben — es ist implizit gemeint, um die Notation übersichtlich zu halten. Das werden wir im Rest der Lektion beibehalten.
Problemformulierung und Verbindung zur Phasenschätzung
Jetzt können wir das Ordnungsbestimmungsproblem formulieren.
Anders ausgedrückt: In der Notation von oben ist gegeben, und wir suchen die kleinste positive ganze Zahl mit . Diese Zahl heißt die Ordnung von modulo .
Um das Ordnungsbestimmungsproblem mit der Phasenschätzung zu verbinden, betrachten wir die Operation auf einem System, dessen klassische Zustände entsprechen, bei der wir mit einem festen Element multiplizieren.
Um das klarzustellen: Die Multiplikation findet in statt, also ist es implizit, dass wir das Produkt modulo im Ket auf der rechten Seite der Gleichung nehmen.
Nehmen wir zum Beispiel und . Die Wirkung von auf die Standardbasis ist:
Diese Operation ist unitär, sofern ; sie permutiert die Elemente der Standardbasis , ist also als Matrix eine Permutationsmatrix. Aus ihrer Definition ist offensichtlich, dass sie deterministisch ist, und eine einfache Möglichkeit, ihre Invertierbarkeit einzusehen, besteht darin, die Ordnung von modulo zu betrachten: Die Inverse von ist .
Es gibt noch eine andere Sichtweise auf die Inverse, die kein Wissen über voraussetzt (was schließlich das ist, was wir berechnen wollen). Für jedes Element gibt es immer ein eindeutiges Element mit . Dieses Element bezeichnen wir mit , und es kann effizient berechnet werden; eine Erweiterung von Euklids ggT-Algorithmus erledigt das mit quadratischem Aufwand in . Damit gilt:
Die Operation ist also sowohl deterministisch als auch invertierbar. Das bedeutet, dass sie durch eine Permutationsmatrix beschrieben wird und daher unitär ist.
Betrachten wir nun die Eigenvektoren und Eigenwerte der Operation , unter der Annahme . Wie gerade gezeigt, bedeutet diese Annahme, dass unitär ist.
Es gibt Eigenwerte von , möglicherweise inklusive Wiederholungen, und es gibt gewisse Freiheit bei der Wahl zugehöriger Eigenvektoren — aber wir brauchen uns nicht um alle Möglichkeiten zu kümmern. Beginnen wir einfach und identifizieren wir zunächst nur einen Eigenvektor von .
Die Zahl ist die Ordnung von modulo , hier und im weiteren Verlauf der Lektion. Der zugehörige Eigenwert ist , da der Zustand bei Multiplikation mit unverändert bleibt.
Das passiert, weil : jeder Standardbasiszustand wird für auf verschoben, und wird zurück auf verschoben. Bildlich gesprochen rühren wir in , aber da es bereits vollständig „durchgerührt" ist, ändert sich nichts.
Hier ist ein weiterer Eigenvektor von . Dieser ist im Kontext von Ordnungsbestimmung und Phasenschätzung interessanter.
Alternativ kann man diesen Vektor mit einer Summe schreiben:
Hier taucht die komplexe Zahl auf natürliche Weise auf, bedingt durch die Weise, wie die Multiplikation mit modulo funktioniert. Der zugehörige Eigenwert ist dieses Mal . Das sehen wir folgendermaßen:
Da und , ergibt sich:
also .
Mit demselben Argument können wir weitere Eigenvektor/Eigenwert-Paare für identifizieren. Für jede Wahl von gilt:
ist ein Eigenvektor von mit dem zugehörigen Eigenwert .
Es gibt noch weitere Eigenvektoren von , aber wir müssen uns nicht um sie kümmern — wir beschränken uns auf die Eigenvektoren , die wir gerade identifiziert haben.
Ordnungsbestimmung durch Phasenschätzung
Um das Ordnungsbestimmungsproblem für eine gegebene Wahl zu lösen, können wir das Phasenschätzungsverfahren auf die Operation anwenden.
Dazu müssen wir nicht nur effizient als Quantencircuit implementieren, sondern auch und so weiter, so weit wie nötig für eine ausreichend genaue Schätzung. Hier erklären wir, wie das gemacht werden kann, und wir werden später genau herausfinden, wie viel Präzision benötigt wird.
Fangen wir mit der Operation an sich an. Da wir natürlich im Quantencircuit-Modell arbeiten, verwenden wir Binärdarstellung, um die Zahlen zwischen und zu kodieren. Die größte Zahl, die wir kodieren müssen, ist , die Anzahl der benötigten Bits ist also:
Für zum Beispiel gilt . Hier ist die Kodierung der Elemente von als Binärstrings der Länge :
Und hier ist eine präzise Definition, wie als -Qubit-Operation definiert wird:
Es geht darum, dass wir zwar nur interessiert sind, wie auf wirkt, aber dennoch festlegen müssen, wie es auf die verbleibenden Standardbasiszustände wirkt — und das so, dass die Operation unitär bleibt. so zu definieren, dass es auf den verbleibenden Standardbasiszuständen nichts tut, erfüllt diese Anforderung.
Mithilfe der Algorithmen für ganzzahlige Multiplikation und Division, die in der vorherigen Lektion besprochen wurden, sowie der Methodik für reversible, müllfreie Implementierungen davon, können wir einen Quantencircuit für bauen — für jede Wahl von — mit Aufwand . Eine Möglichkeit ist folgende:
-
Baue einen Circuit für die Operation
wobei
nach der in der vorherigen Lektion beschriebenen Methode. Das ergibt einen Circuit der Größe .
-
Tausche die beiden -Qubit-Systeme mithilfe von Swap-Gates aus, indem du die Qubits einzeln tauschst.
-
Analog zum ersten Schritt, baue einen Circuit für die Operation
wobei die Inverse von in ist.
Durch Initialisierung der unteren Qubits und Komposition der drei Schritte erhält man folgende Transformation:
Die Methode benötigt Hilfs-Qubits, aber sie werden am Ende in ihren initialisierten Zustand zurückversetzt, was es uns erlaubt, diese Circuits für die Phasenschätzung zu verwenden. Der Gesamtaufwand des Circuits beträgt .
Um usw. zu implementieren, kann genau dieselbe Methode verwendet werden, außer dass wir durch usw. als Elemente von ersetzen. Das heißt: Für jede gewählte Potenz können wir einen Circuit für erstellen, nicht indem wir den Circuit für -mal iterieren, sondern indem wir berechnen und dann den Circuit für verwenden.
Die Berechnung von Potenzen ist das modulare Exponentierungsproblem, das in der vorherigen Lektion erwähnt wurde. Diese Berechnung kann klassisch durchgeführt werden, mithilfe des dort erwähnten Algorithmus für modulare Exponentierung (in der rechnerischen Zahlentheorie oft Potenzalgorithmus genannt). Tatsächlich benötigen wir nur Zweierpotenzen von , nämlich , und wir erhalten diese Potenzen durch iteriertes Quadrieren, Mal. Jedes Quadrieren kann durch einen booleschen Circuit der Größe durchgeführt werden.
Im Wesentlichen verlagern wir hier das Problem, bis zu Mal zu iterieren, auf eine effiziente klassische Berechnung. Und es ist ein glücklicher Umstand, dass das möglich ist! Bei einer beliebigen Wahl eines Quantencircuits im Phasenschätzungsproblem dürfte das nicht möglich sein — in diesem Fall wächst der Aufwand für die Phasenschätzung exponentiell in der Anzahl der Kontroll-Qubits .
Lösung mit einem geeigneten Eigenvektor
Um zu verstehen, wie wir das Ordnungsbestimmungsproblem durch Phasenschätzung lösen können, nehmen wir zunächst an, dass wir das Phasenschätzungsverfahren auf die Operation mit dem Eigenvektor anwenden. Diesen Eigenvektor zu beschaffen ist — wie sich herausstellt — nicht einfach, daher ist das nicht das Ende der Geschichte — aber es ist hilfreich, hier zu beginnen.
Der Eigenwert von , der zum Eigenvektor gehört, ist
Das heißt, für . Wenn wir also das Phasenschätzungsverfahren auf mit dem Eigenvektor anwenden, erhalten wir eine Approximation von . Durch Berechnung des Kehrwerts können wir dann bestimmen — vorausgesetzt, unsere Approximation ist gut genug.
Genauer gesagt: Wenn wir das Phasenschätzungsverfahren mit Kontroll-Qubits durchführen, erhalten wir eine Zahl . Wir nehmen als Schätzung für , also in unserem Fall. Um aus dieser Approximation zu bestimmen, liegt es nahe, den Kehrwert der Schätzung zu berechnen und zur nächsten ganzen Zahl zu runden:
Nehmen wir zum Beispiel und führen wir die Phasenschätzung auf mit dem Eigenvektor und Kontroll-Bits durch. Die beste 5-Bit-Approximation an ist , und wir erhalten mit ziemlich hoher Wahrscheinlichkeit (in diesem Fall etwa ) das Ergebnis aus der Phasenschätzung. Es gilt:
und Runden zur nächsten ganzen Zahl ergibt , was die richtige Antwort ist.
Andererseits erhalten wir möglicherweise nicht die richtige Antwort, wenn wir nicht genug Präzision verwenden. Wenn wir zum Beispiel Kontroll-Qubits bei der Phasenschätzung nehmen, erhalten wir möglicherweise die beste 4-Bit-Approximation an , nämlich . Der Kehrwert ergibt:
und Runden zur nächsten ganzen Zahl ergibt die falsche Antwort .
Wie viel Präzision benötigen wir also für die richtige Antwort? Wir wissen, dass die Ordnung eine ganze Zahl ist, und intuitiv brauchen wir genug Präzision, um von benachbarten Möglichkeiten zu unterscheiden, darunter und . Die nächstgelegene Zahl zu ist , und der Abstand zwischen diesen beiden Zahlen beträgt:
Um sicherzustellen, dass wir nicht mit verwechseln, reicht es daher aus, genug Präzision zu verwenden, damit eine beste Approximation an näher an liegt als an . Wenn wir genug Genauigkeit verwenden, sodass
der Fehler also kleiner als die Hälfte des Abstands zwischen und ist, dann liegt näher an als an jeder anderen Möglichkeit, einschließlich und .
Zur Überprüfung: Angenommen,
für mit
Beim Berechnen des Kehrwerts erhalten wir:
Durch Maximierung im Zähler und Minimierung im Nenner können wir die Abweichung von begrenzen:
Wir weichen weniger als von ab, sodass wir beim Runden erhalten, wie erwartet.
Leider können wir, da wir noch nicht kennen, es nicht verwenden, um zu bestimmen, wie viel Genauigkeit wir benötigen. Stattdessen können wir die Tatsache nutzen, dass kleiner als sein muss, um sicherzustellen, dass wir genug Präzision verwenden. Genauer: Wenn wir genug Genauigkeit verwenden, um sicherzustellen, dass die beste Approximation an erfüllt:
dann haben wir genug Präzision, um bei Berechnung des Kehrwerts korrekt zu bestimmen. Die Wahl stellt sicher, dass wir mit der oben beschriebenen Methode eine hohe Chance haben, eine Schätzung mit dieser Präzision zu erhalten. (Die Wahl reicht aus, wenn man mit einer unteren Schranke von 40% für die Erfolgswahrscheinlichkeit zufrieden ist.)
Allgemeine Lösung
Wie wir gerade gesehen haben, können wir durch Phasenschätzung bestimmen, wenn wir den Eigenvektor von besitzen — vorausgesetzt, wir verwenden genug Kontroll-Qubits für ausreichende Präzision. Leider ist es nicht einfach, diesen Eigenvektor zu beschaffen, daher müssen wir einen Weg finden, ohne ihn auszukommen.
Angenommen, wir gehen genauso vor wie oben, aber mit dem Eigenvektor anstelle von , für eine beliebige Wahl von . Das Ergebnis des Phasenschätzungsverfahrens ist eine Approximation:
Unter der Annahme, dass wir weder noch kennen, kann das uns verraten oder auch nicht. Wenn zum Beispiel , erhalten wir eine Approximation an , was uns leider nichts sagt. Das ist jedoch ein Sonderfall; für andere Werte von können wir zumindest etwas über lernen.
Wir können einen Algorithmus namens Kettenbruchalgorithmus verwenden, um aus unserer Approximation benachbarte Brüche zu berechnen — einschließlich , wenn die Approximation gut genug ist. Den Kettenbruchalgorithmus erklären wir hier nicht. Stattdessen geben wir eine bekannte Aussage über diesen Algorithmus an.
Haben wir eine sehr genaue Approximation an und führen den Kettenbruchalgorithmus für und aus, erhalten wir und wie im Fakt beschrieben. Eine Analyse des Fakts erlaubt uns zu schließen, dass:
Beachte insbesondere, dass wir nicht notwendigerweise und bestimmen, sondern nur in gekürzter Form.
Wie bereits festgestellt, werden wir aus nichts lernen. Aber das ist der einzige Wert von , bei dem das passiert. Wenn von null verschieden ist, kann es gemeinsame Teiler mit haben, aber die Zahl aus dem Kettenbruchalgorithmus muss zumindest ein Teiler von sein.
Es ist nicht offensichtlich, aber es stimmt: Wenn wir und für mit gleichmäßig zufällig gewähltem bestimmen können, können wir mit hoher Wahrscheinlichkeit nach nur wenigen Stichproben ermitteln. Insbesondere: Wenn unsere Schätzung für das kleinste gemeinsame Vielfache aller beobachteten Nennerwerte ist, sind wir mit hoher Wahrscheinlichkeit richtig. Intuitiv sind einige Werte von problematisch, da sie gemeinsame Teiler mit haben, und diese gemeinsamen Teiler werden versteckt, wenn wir und erhalten. Aber zufällige Wahlen von verbergen Faktoren von nicht lange, und die Wahrscheinlichkeit, dass wir nicht korrekt bestimmen, indem wir das kleinste gemeinsame Vielfache der beobachteten Nenner nehmen, fällt exponentiell in der Anzahl der Stichproben.
Es bleibt die Frage, wie wir einen Eigenvektor von erhalten, auf dem wir das Phasenschätzungsverfahren ausführen. Wie sich herausstellt, müssen wir ihn gar nicht explizit erzeugen!
Stattdessen führen wir das Phasenschätzungsverfahren auf dem Zustand aus — gemeint ist die -Bit-Binärkodierung der Zahl — anstelle eines Eigenvektors von . Bislang haben wir das Phasenschätzungsverfahren nur für einen konkreten Eigenvektor beschrieben, aber nichts hindert uns daran, es auf einem Eingabezustand auszuführen, der kein Eigenvektor von ist — und genau das tun wir hier mit dem Zustand . (Das ist kein Eigenvektor von , es sei denn , was uns nicht interessiert.)
Der Grund für die Wahl von anstelle eines Eigenvektors von ist, dass die folgende Gleichung gilt:
Eine Möglichkeit, diese Gleichung zu überprüfen, besteht darin, die Skalarprodukte beider Seiten mit jedem Standardbasiszustand zu vergleichen und dabei frühere Formeln der Lektion zu verwenden. Dadurch erhalten wir genau dieselben Messergebnisse, als hätten wir gleichmäßig zufällig gewählt und als Eigenvektor verwendet.
Im Detail: Stellen wir uns vor, wir führen das Phasenschätzungsverfahren mit dem Zustand anstelle eines der Eigenvektoren aus. Nach der inversen Quanten-Fourier-Transformation verbleiben wir im Zustand:
wobei
Der Vektor beschreibt den Zustand der oberen Qubits nach der inversen Quanten-Fourier-Transformation.
Da eine Orthonormalbasis ist, liefert eine Messung der oberen Qubits eine Approximation an den Wert , wobei gleichmäßig zufällig gewählt wird. Wie bereits diskutiert, erlaubt uns das, mit hoher Zuverlässigkeit nach mehreren unabhängigen Läufen zu bestimmen — was unser Ziel war.
Gesamtkosten
Der Aufwand zur Implementierung jedes gesteuerten Unitären beträgt . Es gibt gesteuerte unitäre Operationen, und da , beträgt der Gesamtaufwand für die gesteuerten unitären Operationen . Hinzu kommen Hadamard-Gates (die zum Aufwand beitragen) und die inverse Quanten-Fourier-Transformation, die beiträgt. Damit dominieren die gesteuerten unitären Operationen den Gesamtaufwand des Verfahrens — der also beträgt.
Neben dem Quantencircuit selbst gibt es einige klassische Berechnungen, die unterwegs durchgeführt werden müssen. Das umfasst die Berechnung der Potenzen in für , die zur Erstellung der gesteuerten unitären Gates benötigt werden, sowie den Kettenbruchalgorithmus, der Approximationen von in Brüche umwandelt. Diese Berechnungen können durch boolesche Circuits mit einem Gesamtaufwand von durchgeführt werden.
Wie üblich können all diese Schranken durch asymptotisch schnellere Algorithmen verbessert werden; diese Schranken setzen Standard-Algorithmen für grundlegende arithmetische Operationen voraus.
Faktorisierung durch Ordnungsbestimmung
Das Letzte, was wir besprechen müssen, ist, wie die Lösung des Ordnungsbestimmungsproblems bei der Faktorisierung hilft. Dieser Teil ist vollständig klassisch — er hat nichts mit Quantencomputing zu tun.
Die Grundidee ist folgende. Wir möchten die Zahl faktorisieren und können das rekursiv tun. Konkret können wir uns auf die Aufgabe konzentrieren, zu teilen, d. h. zwei ganze Zahlen zu finden, für die gilt. Das ist nicht möglich, wenn eine Primzahl ist, aber wir können mit einem Primzahltest zunächst effizient prüfen, ob prim ist, und wenn nicht, versuchen wir zu teilen. Sobald wir geteilt haben, können wir einfach rekursiv auf und vorgehen, bis alle Faktoren prim sind und wir die Primfaktorzerlegung von erhalten.
Gerade Zahlen zu teilen ist einfach: wir geben einfach und aus.
Auch vollständige Potenzen lassen sich leicht teilen — also Zahlen der Form für ganze Zahlen — indem man die Wurzeln usw. approximiert und nahe gelegene ganze Zahlen als Kandidaten für prüft. Man muss dabei nicht weiter als Schritte in dieser Folge gehen, denn ab dann fällt die Wurzel unter und liefert keine weiteren Kandidaten.
Es ist gut, dass wir beides können, denn die Ordnungsbestimmung hilft weder bei der Faktorisierung gerader Zahlen noch bei Primzahlpotenzen, wo eine Primzahl ist. Ist jedoch ungerade und keine Primzahlpotenz, erlaubt uns die Ordnungsbestimmung, zu teilen.
Ein Durchlauf dieses Algorithmus kann scheitern, einen Faktor von zu finden. Das passiert genau in zwei Situationen:
- Die Ordnung von modulo ist ungerade.
- Die Ordnung von modulo ist gerade und .
Mit elementarer Zahlentheorie lässt sich beweisen, dass für eine zufällige Wahl von mit Wahrscheinlichkeit mindestens keines dieser Ereignisse eintritt. Genauer gesagt ist die Wahrscheinlichkeit, dass eines der Ereignisse eintritt, höchstens , wobei die Anzahl der verschiedenen Primfaktoren von ist — deshalb ist die Annahme, dass keine Primzahlpotenz ist, erforderlich. (Die Annahme, dass ungerade ist, wird für die Gültigkeit dieser Aussage ebenfalls benötigt.)
Das bedeutet, dass jeder Durchlauf mit mindestens 50% Wahrscheinlichkeit teilt. Wenn wir den Algorithmus Mal ausführen, wobei wir jedes Mal zufällig wählen, werden wir mit Wahrscheinlichkeit mindestens erfolgreich teilen.
Die Grundidee des Algorithmus ist folgende. Wenn wir ein haben, für das die Ordnung von modulo gerade ist, dann ist eine ganze Zahl und wir können die Zahlen
betrachten. Mit der Formel folgt:
Wir wissen, dass per Definition der Ordnung — was gleichbedeutend damit ist, dass das Produkt teilt. Das bedeutet, dass das Produkt
teilt.
Damit das stimmt, müssen alle Primfaktoren von auch Primfaktoren von oder (oder beider) sein — und bei einer zufälligen Wahl von ist es unwahrscheinlich, dass alle Primfaktoren von nur einen der Terme teilen und keinen den anderen. Solange also einige der Primfaktoren von den ersten Term teilen und einige den zweiten, können wir durch Berechnung des ggT mit dem ersten Term einen nicht-trivialen Faktor von finden.