Wie Quantencomputer die Softwareentwicklung beeinflussen können

Hallo allerseits!

Seit etwa sechs Monaten beschäftigt sich der Verlag aktiv mit dem Thema Quantencomputer und dessen praktische Anwendbarkeit. Lange Zeit war es nicht möglich, einen würdigen Artikel zur Übersetzung zu diesem interessanten Thema zu finden, bis ein solcher Artikel im Oracle-Blog erschien. Die Veröffentlichung bietet eine hervorragende Einführung in die Software-, Hardware- und rein naturwissenschaftlichen Probleme dieses neuen Paradigmas. Lesen ist daher ein Muss.



In den letzten Monaten und Jahren hat das Interesse an Quantencomputern erheblich zugenommen. Es erscheinen ständig neue Materialien von Forschungsinstituten, Unternehmen oder Regierungsorganisationen, die über bahnbrechende Erfolge in diesem Bereich berichten. Gleichzeitig diskutieren Artikel mit einer schwächeren technischen Basis die möglichen Konsequenzen des Quantencomputers. Prognosen reichen vom Hacken modernster Verschlüsselungstechniken bis hin zu Versprechungen, alle Krankheiten zu heilen und die Arbeit an der Schaffung einer vollwertigen KI abzuschließen. Allerdings sind nicht alle diese Erwartungen gleichermaßen realistisch.

Wenn Sie ein praktizierender nüchterner Programmierer sind, fragen Sie sich möglicherweise, wo die Grenze zwischen Fakten und Fiktion in diesen Berechnungen liegt und wie sich Quantencomputer in Zukunft auf die Softwareentwicklung auswirken werden.

Natürlich bleiben noch viele Jahre bis zur Schaffung funktionierender Hardware für das Quantencomputing. Die allgemeinen Prinzipien dieses Paradigmas sind jedoch bereits heute bekannt. Es gibt Abstraktionen, mit denen Entwickler Anwendungen erstellen können, in denen die Möglichkeiten des Quantencomputers mithilfe von Simulatoren realisiert werden.

Wird Quantencomputer auf einen anderen CPU-Gewinn reduziert?


Bei der herkömmlichen Softwareentwicklung mit klassischen Computern wird eine Programmiersprache auf hoher Ebene (z. B. Java) in Operationen übersetzt, die auf einer großen Anzahl von (Hardware-) Transistoren ausgeführt werden.

In Abbildung 1 ist dieser Prozess in seiner einfachsten Form schematisch dargestellt: Java-Quellcode wird in plattformunabhängigen Bytecode kompiliert, der wiederum in plattformspezifischen Maschinencode übersetzt wird. Der Maschinencode verwendet eine Reihe einfacher Operationen (Gates), die im Speicher ausgeführt werden. Die für diesen Zweck verwendete Haupthardwarekomponente ist der bekannte Transistor.



Abb. 1. Übersetzung einer Programmiersprache auf hoher Ebene in Operationen, die an Transistoren ausgeführt werden .

Die in den letzten Jahren erzielte Produktivitätssteigerung wurde hauptsächlich durch die Verbesserung der Hardwaretechnologien erreicht. Die Größe eines einzelnen Transistors hat sich drastisch verringert. Je mehr Transistoren Sie auf jeden Quadratmillimeter setzen können, desto mehr Speicher und Rechenleistung verfügt der Computer.

Quantum Computing ist eine disruptive Technologie, da hier die einfachsten Recheneinheiten keine klassischen Transistoren sind, sondern Qubits, über die wir weiter unten sprechen werden.

Der Punkt liegt nicht nur in den Unterschieden dieser Hauptelemente, sondern auch in einer anderen Vorrichtung von Ventilen. Somit ist der Stapel mit Abb. 1 im Quantencomputer ist nicht anwendbar.

Wird Quantencomputer den gesamten Stapel bis auf die Java-Ebene aufteilen?


Kurz gesagt - "nicht wirklich". Wissenschaftler sind sich allmählich einig, dass Quantencomputer besonders gut zur Lösung spezifischer Probleme geeignet sind, während andere Probleme mit herkömmlichen Computern rationaler gelöst werden können. Klingt vertraut, oder? Eine ähnliche Situation wird beim Vergleich von GPU und CPU beobachtet. Transistoren werden zwar auch in der GPU verwendet, unterscheiden sich jedoch im Prinzip von der CPU. Viele Anwendungen, die in einer Hochsprache geschrieben sind, nutzen jedoch die Funktionen der CPU und der GPU unter der Haube. GPUs eignen sich sehr gut für die Vektorverarbeitung, und in vielen Anwendungen und Bibliotheken unterscheidet sich die Arbeit von CPU und GPU.

Dies ist beispielsweise genau der Fall, wenn Sie JavaFX oder Deeplearning4j verwenden. Wenn Sie eine Benutzeroberflächenanwendung mit JavaFX schreiben, arbeiten Sie nur mit Java-Code (möglicherweise auch mit FXML, um eine Benutzeroberfläche zu deklarieren). Wenn eine JavaFX-Szene auf dem Bildschirm angezeigt werden muss, verwenden interne JavaFX-Implementierungen Shader und Texturen, um die GPU-Treiber auf niedriger Ebene direkt zu kontaktieren (siehe Abbildung 2). Daher müssen Sie sich keine Gedanken darüber machen, welcher Teil des Codes besser für die Arbeit mit der CPU geeignet ist und welcher mit GPU.



Abb. 2. JavaFX delegiert die Arbeit der GPU und der CPU.

Wie in Abb. 2, JavaFX-Implementierungscode delegiert die Arbeit, indem er an die GPU und die CPU übergeben wird. Obwohl diese Vorgänge dem Entwickler verborgen bleiben (nicht über die API bereitgestellt), sind bestimmte Kenntnisse der GPU häufig hilfreich, wenn Sie leistungsfähigere JavaFX-Anwendungen entwickeln müssen.

Bei Verwendung von Deeplearning4j entwickelt sich eine ähnliche Situation. Deeplearning4j verfügt über eine Reihe von Implementierungen zum Ausführen der erforderlichen Vektor- und Matrixoperationen, von denen einige GPUs verwenden. Für Sie als Endentwickler spielt es jedoch keine Rolle, welche Kapazitäten Ihr Code verwenden wird - CPU oder GPU.

Es scheint, dass Quantencomputer Probleme hervorragend lösen können, die in der Regel exponentiell zunehmen, wenn das Volumen des Problems zunimmt, und daher mit klassischen Computern kaum gelöst oder fast unlösbar sind. Experten sprechen insbesondere von einer hybriden Ausführungsform: Eine typische End-to-End-Anwendung enthält klassischen Code, der auf der CPU ausgeführt wird, kann aber auch Quantencode enthalten.

Wie kann ein System Quantencode ausführen?


Hardware für Quantencomputer ist heute noch äußerst experimentell. Während große Unternehmen und vermutlich einige Staaten an der Entwicklung von Prototypen beteiligt sind, ist diese Technologie nicht allgemein verfügbar. Aber wenn es erscheint, kann seine Form anders sein:

  • Ein Quantencoprozessor kann in die CPU im System integriert werden.
  • Quantenprobleme können an Quantenwolkensysteme delegiert werden.

Obwohl nach wie vor enorme Unsicherheit über den praktischen Hintergrund solcher Entscheidungen besteht, sind wir uns zunehmend einig, wie ein Quantencode aussehen soll. Auf der untersten Ebene sollten sich die folgenden Bausteine ​​befinden: Qubits und Quantentore . Basierend darauf können Sie Quantensimulatoren erstellen, die das erwartete Verhalten implementieren.

Ein Quantensimulator ist daher ein ideales Werkzeug für eine solche Entwicklung.
Die Ergebnisse, die sie liefern, sollten fast die gleichen sein, die sie mit realen Geräten eines Quantencomputers erzielen würden - aber der Simulator arbeitet viel langsamer, da Quanteneffekte, die Quantengeräte beschleunigen, mit herkömmlicher Software simuliert werden müssen.

Was sind die Grundbausteine ​​des Quantencomputers?


Es ist oft wichtig, klassische Berechnungen mit Quantenberechnungen zu vergleichen. Im klassischen Rechnen haben wir Bits und Gates.

Ein Bit enthält ein einzelnes Informationsbit und sein Wert kann 0 oder 1 sein.
Ein Ventil wirkt auf ein oder mehrere Bits und kann auf diese einwirken. Zum Beispiel kehrt das in Abbildung 3 gezeigte NOT-Ventil den Wert eines Bits um. Wenn der Eingang 0 ist, ist der Ausgang des NOT-Gatters 1 und umgekehrt.



Abb. 3. NICHT Ventil

Beim Quantencomputing haben wir äquivalente Bits und Gates. Das Quantenäquivalent eines Bits ist Qubit. Der Wert eines Qubits kann wie bei einem klassischen Bit gleich 0 oder 1 sein, er kann sich jedoch auch in der sogenannten Überlagerung befinden. Dies ist ein komplexes Konzept, nach dem ein Qubit gleichzeitig in beiden Zuständen sein kann: 0 und 1.

Wenn sich ein Qubit überlagert, ist sein Wert eine lineare Kombination der Zustände 0 und 1. Dies kann wie in Fig. 1 gezeigt geschrieben werden. 4:



Abb. 4. Gleichheit, wenn sich das Qubit überlagert.

Hinweis: Qubits werden häufig in Klammern geschrieben , wobei der Variablenname zwischen den Zeichen "|" steht. und ">".

Der Ausdruck in Fig. 4 berichtet, dass sich Qubit x in einer Überlagerung der Zustände | 0> und | 1> befindet. Dies bedeutet nicht, dass es sich im Zustand | 0> ODER im Zustand | 1> befindet; Dies bedeutet, dass sein aktueller Zustand uns nicht bekannt ist.

Tatsächlich befindet es sich in beiden Zuständen gleichzeitig und kann in dieser Form manipuliert werden. Wenn wir jedoch das Qubit messen, befindet es sich in einem Zustand, entweder | 0> oder | 1>. Der obige Ausdruck enthält eine weitere Einschränkung: a ^ 2 + b ^ 2 = 1.
Die Werte von a und b sind probabilistisch: Es gibt eine Wahrscheinlichkeit a ^ 2, dass, wenn wir das Qubit | x> messen, es den Wert | 0> enthält, und die Wahrscheinlichkeit b ^ 2, dass das gemessene Qubit den Wert | 1> enthält.

Es gibt einen wichtigen begrenzenden Faktor, der die Freuden des Quantencomputers abbricht: Nachdem ein Qubit gemessen wurde, gehen alle Informationen über die mögliche Überlagerung verloren, in der es sich befand. Der Qubit-Wert kann 0 oder 1 sein.

In Berechnungen kann ein Qubit in Überlagerung gleichzeitig 0 und 1 entsprechen (mit unterschiedlichen Wahrscheinlichkeiten). Wenn wir zwei Qubits haben, können sie verwendet werden, um wiederum vier Zustände (00, 01, 10 und 11) mit unterschiedlichen Wahrscheinlichkeiten darzustellen. Hier kommen wir zum Kern der Kraft von Quantencomputern. Mit acht klassischen Bits können Sie genau eine Zahl im Bereich von 0 bis 255 darstellen. Die Werte für jedes der acht Bits sind 0 oder 1. Mit acht Qubits können Sie alle Zahlen von 0 bis 255 gleichzeitig darstellen.

Was nützt Überlagerung, wenn Sie nur einen Zustand messen können?


Oft ist das Ergebnis des Algorithmus einfach (ja oder nein), aber um zu diesem Ergebnis zu gelangen, ist viel paralleles Rechnen erforderlich. Wenn Sie Qubits während der Berechnungen überlagern, können Sie sofort viele verschiedene Optionen berücksichtigen. Ohne Entscheidungen für jede einzelne Kombination zu treffen, kann ein Quantencomputer alle Optionen in einem Schritt berechnen.
Dann beginnt in vielen Quantenalgorithmen die nächste wichtige Stufe: das Ergebnis des Algorithmus mit einer Messung zu verbinden, die ein aussagekräftiges Ergebnis liefert. Oft wird Interferenz berücksichtigt: Interessante Ergebnisse überlagern sich strukturell, während sich uninteressante gegenseitig aufheben (destruktive Interferenz).

Wie kann man ein Qubit in einen Überlagerungszustand „umwandeln“?


So wie klassische Gatter Bits manipulieren, manipulieren Quantengatter Qubits. Einige Quantentore ähneln klassischen; Beispielsweise überträgt das Pauli-X-Gatter das Qubit vom Zustand a | 0> + b | 1> in den Zustand b | 0 | + a | 1>, ähnlich dem Prinzip des klassischen NOT-Gatters. In der Tat befand sich das Qubit bei a = 1 und b = 0 zunächst im Zustand | 0>. Nach der Wirkung des Pauli-X-Ventils geht dieses Qubit in den Zustand | 1> über, wie in Abb. 5.



Abb. 5. Das Ergebnis der Verwendung des Pauli-X-Ventils.

In diesem Zusammenhang ist das Hadamard-Ventil sehr interessant. Es versetzt das Qubit in den Zustand | 0>: 1 / sqrt (2) * (| 0> + | 1>) in eine Überlagerung, wie in Abb. 6.



Abb. 6. Das Ergebnis der Anwendung des Hadamard-Ventils.

Nachdem wir das Hadamard-Ventil auf ein Qubit angewendet und das Qubit gemessen haben, besteht eine 50% ige Wahrscheinlichkeit, dass der Qubit-Wert 0 ist, und eine 50% ige Wahrscheinlichkeit, dass der Qubit-Wert 1 beträgt. Bis das Qubit gemessen wird, bleibt es in einem Überlagerungszustand .

Wie ist das alles möglich?


Wenn Sie wirklich an der Antwort auf diese Frage interessiert sind, müssen Sie die Quantenphysik im Detail studieren. Glücklicherweise muss jedoch nicht die gesamte theoretische Grundlage dieser Phänomene verstanden werden. Während das Phänomen der Überlagerung unverständlich erscheint, ist es wichtig zu betonen, dass es diese Eigenschaften sind, die für Elementarteilchen in der Natur charakteristisch sind. Daher ist Quantencomputing den Grundlagen der physikalischen Realität viel näher, als es auf den ersten Blick scheint.

Soll ich ein paar Jahre warten und mir dann das Quantencomputing genauer ansehen?


Nein. In diesem Fall kommen Sie zu spät. Es ist theoretisch möglich, zuerst die Hardware zu entwickeln und dann mit dem Studium der Software-Ebene fortzufahren und zu sehen, was damit erreicht werden kann. Alle Konzepte sind jedoch bereits mehr oder weniger klar, und es ist bereits möglich, Quantensimulatoren in gängigen Sprachen wie Java, C #, Python und anderen zu schreiben.
Dann können diese Simulatoren verwendet werden, um an Quantenalgorithmen zu arbeiten. Obwohl diese Algorithmen keine solche Leistungssteigerung bewirken, die mit ihrer Hilfe bei der Arbeit an realen Quantengeräten erreichbar ist, sollten sie funktional vollständig sein.

Wenn Sie derzeit einen Quantenalgorithmus entwickeln, haben Sie Zeit, ihn zu verbessern, und Sie können ihn starten, wenn Quantenausrüstung im Zugriff erscheint.

Quantenalgorithmen erfordern einen anderen intellektuellen Ansatz als klassische. Prominente Wissenschaftler haben bereits im letzten Jahrhundert mit der Entwicklung von Quantenalgorithmen begonnen, und jetzt werden immer mehr Artikel veröffentlicht, die solche Algorithmen beschreiben, einschließlich solcher für die Ganzzahlmultiplikation, Listensuche, Pfadoptimierungsarbeit und vieles mehr.

Es gibt andere Gründe, warum es sich heute lohnen könnte, Quantencomputer zu betreiben. Das Refactoring eines Softwaresystems in einem modernen großen Unternehmen ist nicht eines der Dinge, die über Nacht erledigt werden können. Einer der Bereiche, in denen Quantencomputer eine echte Revolution darstellen werden, ist die Verschlüsselung. Schließlich basiert alles auf der Theorie, dass es auf einem klassischen Computer praktisch unmöglich ist, eine große ganze Zahl in Primfaktoren zu zerlegen.

Obwohl es viele Jahre dauern kann, bis Quantencomputer groß genug sind, um das Problem der ganzzahligen Faktorisierung leicht zu lösen, wissen Entwickler, dass es viele Jahre dauert, Systeme zu ändern und neue, sicherere Technologien in sie einzuführen.

Wie kann ich lernen, mit Quantenalgorithmen in Java zu arbeiten?


Sie können Strange , den Open-Source-Quantencomputersimulator in Java, herunterladen und beherrschen. Mit Strange können Sie einen Quantenalgorithmus simulieren, indem Sie eine Reihe von Qubits erstellen und mehrere Quantengatter auf sie anwenden.

Als einfaches Beispiel erstellen wir zwei Qubits, q [0] und q [1], so dass sich anfangs beide im Zustand 0 befinden. Dann wenden wir zwei einfache Gates auf jedes der Qubits an, so dass diese Operation grafisch der Abbildung entspricht. 7.

Das erste Qubit geht zuerst zum Pauli-X-Ventil und dann zum Hadamard-Ventil. Das Pauli-X-Ventil überträgt es vom Zustand | 0 & gt auf | 1 & gt, und das Hadamard-Ventil übersetzt es in eine Überlagerung mit gleichen Wahrscheinlichkeiten | 0 & gt und | 1 & gt. Wenn wir also die gesamte Sequenz 1000 Mal abschließen und das erste Qubit 1000 Mal am Ende dieses Zyklus messen, können wir im Durchschnitt erwarten, dass es in 500 Fällen einen Wert von 0 und in 500 Fällen einen Wert von 1 hat.

Das zweite Qubit ist noch einfacher. Wir beginnen mit dem Identitätsgatter, das das Verhalten des Qubits nicht ändert, und übergeben es dann an das Pauli-X-Gatter, wobei sein Wert von 0 auf 1 geändert wird.



Abb. 7. Ein Beispiel für einen Quantenalgorithmus, der mit Strange simuliert werden kann.

Um sicherzustellen, dass unsere Argumentation korrekt ist, können Sie mit Strange ein einfaches Quantenprogramm erstellen.

public static void main(String[] args) { Program p = new Program(2); Step s = new Step(); s.addGate(new X(0)); p.addStep(s); Step t = new Step(); t.addGate(new Hadamard(0)); t.addGate(new X(1)); p.addStep(t); SimpleQuantumExecutionEnvironment sqee = new SimpleQuantumExecutionEnvironment(); Result res = sqee.runProgram(p); Qubit[] qubits = res.getQubits(); Arrays.asList(qubits).forEach(q -> System.out.println("qubit with probability on 1 = "+q.getProbability()+", measured it gives "+ q.measure())); } 

In dieser Anwendung wird ein Quantenprogramm mit zwei Qubits erstellt:

  Program p = new Program(2); 

Im Rahmen dieses Programms durchlaufen wir zwei Phasen. Wenden Sie im ersten Schritt das Pauli-X-Ventil an q [0] an. Wir wenden das Ventil nicht auf q [1] an und implizieren daher, dass es mit dem Identitätsventil funktioniert. Fügen Sie diesen Schritt dem Programm hinzu:

  Step s = new Step(); s.addGate(new X(0)); p.addStep(s); 

Dann gehen wir zur zweiten Stufe, wo wir das Hadamard-Ventil auf q [0] und das Pauli-X-Ventil auf q [1] anwenden; Fügen Sie diesen Schritt dem Programm hinzu:

  Step t = new Step(); t.addGate(new Hadamard(0)); t.addGate(new X(1)); p.addStep(t); 

Unser Programm ist also fertig. Jetzt lass es uns tun. In Strange ist ein Quantensimulator integriert. Strange kann jedoch auch einen Cloud-Dienst verwenden, um Programme in einer Art Cloud auszuführen, z. B. in Oracle Cloud .

Im folgenden Beispiel verwenden wir einen einfachen integrierten Simulator, führen das Programm aus und erhalten die resultierenden Qubits:

  SimpleQuantumExecutionEnvironment sqee = new SimpleQuantumExecutionEnvironment(); Result res = sqee.runProgram(p); Qubit[] qubits = res.getQubits(); 

Bevor wir die Qubits messen (und alle Informationen verlieren), zeigen wir die Wahrscheinlichkeiten an. Messen Sie nun die Qubits und sehen Sie sich die Werte an:

 Arrays.asList(qubits).forEach(q -> System.out.println("qubit with probability on 1 = "+q.getProbability()+", measured it gives "+ q.measure())); 

Wenn Sie diese Anwendung ausführen, erhalten Sie die folgende Ausgabe:

qubit with probability on 1 = 0.50, measured it gives 1
qubit with probability on 1 = 1, measured it gives 1

Bitte beachten Sie: Für das erste Qubit kann erwartungsgemäß auch der Wert 0 gemessen werden.
Wenn Sie dieses Programm mehrmals ausführen, beträgt der Wert des ersten Qubits im Durchschnitt 0 in der Hälfte der Fälle und 1 in der Hälfte der Fälle.

Ist das alles, was Sie über Quantencomputer wissen müssen?


Natürlich nicht. Hier haben wir einige wichtige Konzepte nicht angesprochen , insbesondere die Feinheiten , die die Interaktion zwischen zwei Qubits sicherstellen, auch wenn sie physisch sehr weit voneinander entfernt sind, nicht erörtert. Wir haben nicht über die bekanntesten Quantenalgorithmen gesprochen, darunter den Shore-Algorithmus, mit dem ganze Zahlen in Primfaktoren zerlegt werden können. Wir haben auch eine Reihe von mathematischen und physikalischen Fakten ignoriert, insbesondere nicht berücksichtigt, dass in der Überlagerung | x> = a | 0> + b | 1> beide Zahlen a und b komplex sein können.

Der Hauptzweck dieses Artikels war es jedoch, Ihnen den Eindruck von Quantencomputern zu vermitteln und zu verstehen, wie sie in die Zukunft der Softwareentwicklung passen.

Source: https://habr.com/ru/post/de450480/


All Articles