Übersicht und Vergleich von Quanten-Software-Plattformen auf Gate-Ebene

Hallo Habr! Ich präsentiere Ihnen die Übersetzung des Artikels "Überblick und Vergleich von Quanten-Software-Plattformen auf Gate-Ebene" von Ryan LaRose.


Quantencomputer stehen für die Verwendung in der Cloud-Infrastruktur zur Verfügung. Gleichzeitig kann der jüngste Boom bei Quantensoftwareplattformen für diejenigen, die sich für eine Verwendung entscheiden, überwältigend sein. Dieser Artikel bietet ein aktuelles Bild der sich schnell entwickelnden Landschaft des Quantencomputers, indem vier Softwareplattformen - Forest (pyQuil), QISKit, ProjectQ und Quantum Development Kit - verglichen werden, mit denen Forscher reale und simulierte Quantengeräte verwenden können. Diese Analyse umfasst die Anforderungen und die Installation, die Syntax der Sprache am Beispiel von Programmen, die Unterstützung auf Bibliotheksebene und die Möglichkeiten eines Quantensimulators für jede Plattform. Für Plattformen, die Quantencomputer unterstützen, vergleichen wir Hardware, Quantenassemblersprachen und Quantencompiler. Abschließend werden wir die Funktionen der einzelnen Funktionen betrachten und kurz andere Softwarepakete für das Quantencomputing erwähnen.


Inhalt


I. Einleitung
II. Softwareplattformen
A. pyQuil
B. QISKit
C. ProjectQ
D. Quatum Development Kit
III. Vergleich
A. Bibliotheksunterstützung
B. Quantenhardware
C. Quantencompiler
D. Simulatorleistung
E. Merkmale
IV. Diskussion und Schlussfolgerungen
Referenzliste
Anhang A. Andere Softwareplattformen
Anhang B. Testen der Simulatorleistung
Anhang C. Beispielprogramm: Teleportationsschema


I. Einleitung


Quantenprogrammiersprachen wurden vor mindestens zwei Jahrzehnten in Betracht gezogen [1-3], waren jedoch größtenteils theoretisch und ohne vorhandene Ausrüstung. Quantencomputer sind mittlerweile Realität, und es gibt Quantenprogrammiersprachen, mit denen jeder, der Zugang zum Internet hat, sie nutzen kann. Eine ganze Reihe von Forschern aus Industrie und Wissenschaft haben kleine Quantengeräte entwickelt, die an einem Schaltungsmodell des Quantencomputers arbeiten. Diese Computer sind klein, laut und nicht so leistungsfähig wie moderne klassische Computer. Aber sie entstehen, wachsen stetig und lassen die unvorstellbar große Rechenleistung der Zukunft für die Aufgaben Chemie [4, 5], maschinelles Lernen [6, 7], Optimierung [8], Finanzsektor [9] und mehr [10] ahnen. Diese Geräte sind ein Prüfstand für die Schulung der nächsten Generation von Quantensoftware-Ingenieuren zur Lösung der derzeit bestehenden klassisch komplexen Aufgaben der Computertechnologie. In der Tat wurde Cloud Quantum Computing bereits verwendet, um die Deuteronbindungsenergie [11] und Testroutinen in Algorithmen für maschinelles Lernen [12, 13] zu berechnen.


In jüngster Zeit hat die Quantencomputersoftware für eine Vielzahl klassischer Computersprachen rasant zugenommen. Eine Liste von Open-Source-Projekten mit mehr als fünfzig ist in [14] verfügbar, und eine Liste von Quantencomputersimulationen ist in [15] verfügbar. Diese große Anzahl von Programmen, die das Wachstum auf diesem Gebiet positiv widerspiegeln, erschwert es Studenten und Forschern, zu entscheiden, welches Softwarepaket verwendet werden soll, um nicht in der Dokumentation verloren zu gehen oder sich über das erforderliche Anfangswissen schockieren zu lassen.


Dieser Artikel soll einen kurzen Überblick und einen Vergleich der wichtigsten Softwareplattformen für das allgemeine Quantencomputing auf Gate-Ebene bieten. Vier wurden aus einer langen Liste ausgewählt: drei, die dem Benutzer die Möglichkeit geben, sich mit realen Quantengeräten zu verbinden - pyQuil von Rigetti [16], QISKit von IBM [17] und ProjectQ von der ETH Zürich [18, 19] und eines mit ähnlicher Funktionalität, aber ohne die derzeitige Möglichkeit, eine Verbindung zu einem Quantencomputer herzustellen - Quantum Development Kit von Microsoft [20]. Für die Wahl dieser Plattformen ist die Möglichkeit geworden, eine Verbindung zu einem echten Quantengerät herzustellen. Aus diesem Grund und der Kürze halber werden einige seriöse Programme bewusst weggelassen. Einige von ihnen sind in Anhang A aufgeführt.


Derzeit besteht das Hauptziel darin, ein Landschaftsbild des Quantencomputers zu präsentieren, das durch diese vier Plattformen verursacht wird. In Abschnitt II werden wir uns nacheinander mit jeder Plattform befassen und Anforderungen und Installation, Dokumentation und Tutorials, Sprachsyntax und Quantenausrüstung erörtern. Abschnitt III bietet einen detaillierten Vergleich der Plattformen. Es umfasst: Unterstützung von Quantenalgorithmen in III A auf Bibliotheksebene, Unterstützung von Quantenhardware in III B , Compiler von Quantenschaltungen in III C und Quantencomputersimulatoren III D. In Abschnitt IV werden einige subjektive Kommentare zu jeder Plattform erörtert. Anhang A enthält Informationen zu anderen Quantensoftware, Anhang B enthält detaillierte Informationen zum Testen von Quantenschaltungssimulatoren, und Anhang C enthält den Code für Quantenteleportationsschemata in jeder der vier Sprachen zum direkten Vergleich.


II. Softwareplattformen


Die Abbildung 1 zeigt verschiedene Quantencomputer und Software, die zum Verbinden mit Geräten verwendet werden. Derzeit können Sie auf vier Softwareplattformen eine Verbindung zu vier verschiedenen Quantencomputern herstellen - einer von Rigetti, einem 8-Qubit-Quantencomputer, den Sie mit pyQuil verbinden können [41]; und drei von IBM mit den höchsten verfügbaren 16 Qubits, die mit QISKit oder ProjectQ verbunden werden können. Darüber hinaus bietet IBM einen vierten 20-Qubit-Quantencomputer an. Dieses Gerät steht jedoch nur Mitgliedern des IBM Q Network zur Verfügung [42]: einer Gruppe von Unternehmen, Universitäten und nationalen Labors, die an Quantencomputern interessiert sind und in diese investieren. Abbildung 1 zeigt auch die Quantencomputer von Unternehmen wie Google, IBM und Intel, die angekündigt wurden, aber derzeit für reguläre Benutzer nicht verfügbar sind.



Abbildung 1. Ein schematisches Diagramm, das zeigt, wie ein Personal Computer auf Gate-Ebene mit dem verwendeten Quantencomputer verbunden wird. Ausgehend von einem PC (unten in der Mitte) zeigen die grünen Knoten Software an, die auf dem PC des Benutzers installiert werden kann. Graue Knoten zeigen an, dass Simulatoren lokal ausgeführt werden (dh auf dem Computer eines Benutzers). Die gestrichelten Linien zeigen die API / Cloud-Verbindungen zu Unternehmensressourcen in gelben „Clouds“. Die Quantensimulatoren und die verwendeten Quantencomputer, die von diesen Cloud-Ressourcen bereitgestellt werden, sind in Blau bzw. Gold dargestellt. Rote Rahmen zeigen die Anforderungen für die ausgewählte Methode. Um beispielsweise eine Verbindung zu Rigetti Forest herzustellen und den Agave 8-Qubit-Quantencomputer zu verwenden, müssen Sie pyQuil (verfügbar unter MacOS, Windows und Linux) herunterladen und installieren, sich auf der Rigetti-Website registrieren, um einen API-Schlüssel zu erhalten, und dann online Zugriff auf das Gerät anfordern Form. Anmerkungen: (i) Die virtuelle Quantenmaschine Rigetti erfordert eine Erhöhung der Rechte für mehr als 30 Qubits. (Ii) Lokale Simulatoren hängen vom Computer des Benutzers ab, daher sind die angegebenen Zahlen ungefähr und (iii) die Quantencomputer, die angekündigt wurden, aber welche Derzeit für reguläre Benutzer nicht verfügbar.


Die Technologie der Quantenausrüstung ändert sich rasant. Es ist sehr wahrscheinlich, dass bis Ende des Jahres neue Computer erscheinen, und in zwei oder drei Jahren ist diese Liste möglicherweise vollständig veraltet. Was jedoch bleibt, ist die Software, die verwendet wird, um eine Verbindung zu dieser Technologie herzustellen. Es wäre sehr einfach, neue Quantencomputer zu verwenden und nur wenige Codezeilen zu ändern, ohne die Syntax zu ändern, die zum Erzeugen oder Ausführen der Quantenschaltung verwendet wird. In QISKit müssen Sie beispielsweise nur den Namen des Backend-Geräts ändern, wenn Sie das Schema ausführen:


execute(quantum_circuit, backend="name", ...) 

Listing 1. Die Zeichenfolge „name“ gibt ein Backend-Gerät an, mit dem Quantenprogramme mit QISKit ausgeführt werden können. Wenn zukünftige Quantencomputer veröffentlicht werden, ist das Ausführen auf neuer Hardware so einfach wie das Ändern des Namens.


Obwohl sich die Software mit der Veröffentlichung der neuen Version [43] ebenfalls ändert, handelt es sich zum größten Teil um relativ geringfügige syntaktische Änderungen, die die Funktionalität der Software nicht wesentlich verändern.


In diesem Abschnitt werden wir uns die vier Plattformen ansehen und Anforderungen und Installation, Dokumentation und Handbücher, Sprachsyntax, Quantensprache, Quantenausrüstung und Simulatorfunktionen erörtern. Diese Rezension soll die Sprache nicht vollständig vermitteln, vermittelt dem Leser jedoch ein Verständnis für jede Plattform, bevor er in eine (oder mehrere) der ausgewählten Plattformen eintaucht. Die aktuelle Analyse enthält ausreichend Informationen, um Algorithmen auf Quantencomputern auszuführen. Trotzdem wird der Leser, wenn er eine bestimmte Plattform ausgewählt hat, zur vollständigen Information an eine spezielle Dokumentation gesendet. Für jedes Softwarepaket wurden Links zu Dokumentationen und Lernquellen hinzugefügt. Es wird auch angenommen, dass es Grundkenntnisse des Quantencomputers gibt, für die es inzwischen viele gute Referenzen gibt [21, 22].


Alle in diesem Dokument enthaltenen Codefragmente und Programme wurden getestet und auf einem Dell XPS 13 Developer Edition-Laptop unter Linux Ubuntu 16.04 LTS ausgeführt, dessen vollständige Spezifikationen in [23] aufgeführt sind. Obwohl alle Softwarepakete in allen drei Hauptbetriebssystemen funktionieren, ist es für den Autor viel einfacher, die Software auf der Plattform zu installieren und zu verwenden, auf der sie entwickelt wurde. Unter Linux Ubuntu gab es bei der Installation dieser Softwarepakete keine Schwierigkeiten oder ungewöhnlichen Fehlermeldungen.


pyQuilQISKitProjectqQDK
InstitutionRigettiIbmEt zurichMicrosoft
Erste Veröffentlichungv0.0.2 am 15. Januar 20170.1 am 7. März 2017v0.1.0 am 3. Januar 20170.1.1712.901 am 4. Januar 2018 (Vorabversion)
Aktuelle Versionv1.9.0 am 6. Juni 20180,5,4 am 11. Juni 2018v0.3.6 am 6. Februar 20180.2.1802.2202 am 26. Februar 2018 (Vorabversion)
Open Source
LizenzApache 2.0Apache 2.0Apache 2.0MIT
HomepageZuhauseZuhauseZuhauseZuhause
GithubGitGitGitGit
DokumentationDocs , Tutorials ( Grove )Dokumente , Lernhefte , HardwareDokumente , Beispielprogramme , PapierDocs
BetriebssystemMac, Windows, LinuxMac, Windows, LinuxMac, Windows, LinuxMac, Windows, Linux
AnforderungenPython 3, Anaconda (empfohlen)Python 3.5+, Jupyter Notebooks (für Tutorials), Anaconda 3 (empfohlen)Python 2 oder 3Visual Studio Code (dringend empfohlen)
Klassische SprachePythonPythonPythonQ #
QuantenspracheQuilOpenqasmkeine / hybridQ #
Quantenhardware8 QubitsIBMQX2 (5 Qubits), IBMQX4 (5 Qubits), IBMQX5 (16 Qubits), QS1_1 (20 Qubits)Keine dedizierte Hardware, kann eine Verbindung zu IBM Backends herstellenkeine
Simulator∼20 Qubits lokal, 26 Qubits mit den meisten API-Schlüsseln für QVM, 30+ mit privatem Zugriff25 Qubits lokal, 30 durch Cloud28 Qubits vor Ort30 Qubits lokal, 40 über die Azure-Cloud
EigenschaftenGenerieren Sie Quil-Code, Beispielalgorithmen in Grove, topologiespezifischen Compiler, Rauschfunktionen im Simulator, Community-Slack-KanalGenerieren Sie QASM-Code, topologiespezifischen Compiler, Community-Slack-Kanal, Schaltungsschublade und ACQUA-BibliothekZeichnen Sie Schaltkreise, stellen Sie eine Verbindung zu IBM Backends und mehreren Bibliotheks-Plug-Ins herEingebaute Algorithmen, Beispielalgorithmen

pyQuil

A. pyQuil


pyQuil ist eine Open-Source-Python-Bibliothek, die von Rigetti entwickelt wurde, um Quantenprogramme zu erstellen, zu analysieren und auszuführen. Es basiert auf der Quil-Sprache - einer offenen Sprache von Quantenanweisungen (oder einfach einer Quantensprache ), die speziell für die vielversprechendsten Quantencomputer entwickelt wurde und auf einem gemeinsamen klassischen / Quantenspeichermodell basiert [24] (dies bedeutet, dass sowohl Qubits als auch klassische Bits). pyQuil ist eine der in Forest entwickelten Kernbibliotheken, die die Schlüsselplattform für alle Rigetti-Software darstellt. Forest enthält auch Grove und Reference QVM, die später beschrieben werden.


a. Anforderungen und Installation


Für die Installation und Verwendung von pyQuil sind Python 2- oder 3-Versionen erforderlich, obwohl Python 3 dringend empfohlen wird, da zukünftige Entwicklungsfunktionen nur Python 3 unterstützen. Darüber hinaus wird die Python Anaconda-Distribution für verschiedene Python-Modulabhängigkeiten empfohlen, obwohl dies nicht erforderlich ist.


Der einfachste Weg, pyQuil zu installieren, ist die Verwendung des Python-Paketmanager-Befehls. Geben Sie an der Linux Ubuntu-Eingabeaufforderung ein


 pip install pyquil 

für eine erfolgreiche Softwareinstallation. Wenn Anaconda installiert ist, kann pyQuil alternativ durch Eingabe installiert werden


 conda install −c rigetti pyquil 

in der Kommandozeile. Eine andere Alternative besteht darin, den Quellcode aus dem Git-Repository herunterzuladen und die Software zu installieren. Geben Sie dazu folgende Befehle ein:


 git clone https://github.com/rigetticomputing/pyquil cd pyquil pip install −e 

Diese letzte Methode wird allen Benutzern empfohlen, die zu pyQuil beitragen können. Weitere Informationen finden Sie im GitHub-Einzahlungshandbuch.


b. Dokumentation und Tutorials


pyQuil verfügt über eine hervorragende Dokumentation im Internet mit einer Einführung in Quantencomputer, Installationsanweisungen, Basisprogrammen und Gate-Operationen, einem Simulator, der als Quantenvirtuelle Maschine (QVM) bezeichnet wird, einem realen Quantencomputer und einer Quil-Sprache mit einem Compiler. Wenn Sie den pyQuil-Quellcode von GitHub herunterladen, erhalten Sie auch einen Ordner mit Beispielen in Jupyter-Notizbüchern, regulären Python-Beispielen und einem Programm $ inline $ \ textef {run_quil.py} $ inline $ , die in Quil geschriebene Textdokumente mit einer virtuellen Quantenmaschine ausführen können. Erwähnen Sie abschließend Grove , eine Reihe von Quantenalgorithmen, die mit pyQuil und der Rigetti Forest-Umgebung erstellt wurden.


c. Syntax


Die pyQuil-Syntax ist sehr einfach und praktisch. Das Hauptelement zum Aufzeichnen von Quantenschaltungen ist das Programm und kann aus importiert werden  textefpyquil.quil . Gate-Operationen finden Sie in  textefpyquil.gates . Modul  textefapi ermöglicht es Ihnen, Quantenschaltungen in einer virtuellen Maschine auszuführen. Eine der schönen Eigenschaften von pyQuil ist, dass Qubit-Register und klassische Register nicht a priori definiert werden müssen und dynamisch im Speicher zugeordnet werden können. Qubits im Qubit-Register werden durch Indizes (0, 1, 2, ...) und ähnlich für Bits im klassischen Register bezeichnet. Somit kann die Zufallsgeneratorschaltung wie folgt geschrieben werden:


 # random number generator circuit in pyQuil from pyquil.quil import Program import pyquil.gates as gates from pyquil import api qprog = Program() qprog += [gates.H(0), gates.MEASURE(0, 0)] qvm = api.QVMConnection() print(qvm.run(qprog)) 

Listing 2. PyQuil-Code für einen Zufallszahlengenerator.


Die ersten drei Zeilen importieren das Minimum, das erforderlich ist, um ein Quantenschema / -programm zu deklarieren (Zeile 2), Gate-Operationen an Qubits durchzuführen (Zeile 3) [44] und das Schema auszuführen (Zeile 4). In Zeile 6 wird ein Quantenprogramm erstellt, und in Zeile 7-8 wird eine Liste von Anweisungen an dieses gesendet: Zuerst auf das Hadamard-Gate einwirken H über dem Qubit bei Index 0 messen wir dasselbe Qubit in ein klassisches Bit unter Index 0. Zeile 10 stellt eine Verbindung mit QVM her, und bei 11 wird das Ergebnis unserer Schaltung gestartet und angezeigt. Dieses Programm druckt die Standardausgabe von pyQuil als Liste von Ganzzahllisten: in unserem Fall -  textef[[[0]] oder  textef[[[1]] . Im Allgemeinen entspricht die Anzahl der Elemente in einer externen Liste der Anzahl der durchgeführten Tests. Ganzzahlen in internen Listen sind die endgültigen Dimensionen im klassischen Register. Da wir nur einen Test durchgeführt haben (dies ist als Argument in angegeben  textefapi.QVMConnection.run (standardmäßig auf Eins eingestellt), erhalten wir nur eine interne Liste. Da wir im klassischen Register nur ein Bit hatten, erhalten wir nur eine ganze Zahl.


d. Quantensprache


Quil ist eine Sprache der Quantenbefehle oder einfach eine Quantensprache, die Befehle an einen Quantencomputer überträgt. Dies ähnelt dem Assembler auf klassischen Computern. Der Kern der Quil-Syntax ist  textefGATEIndex wo  textefGATE ist ein Quantentor, das für indizierte Qubits gilt  textefindex (0, 1, 2, ...). pyQuil hat eine Funktion zum Generieren von Quil-Code aus einem bestimmten Programm. Zum Beispiel könnten wir in dem oben erwähnten Quantenzufallszahlengenerator die Zeile hinzufügen:


 print(qprog) 

am Ende, um den Quil-Diagrammcode zu erhalten, der unten gezeigt wird:


 H 0 MEASURE 0 [0] 

Listing 3. Quil-Code für einen Zufallszahlengenerator.


Wenn jemand anfängt, Quil zu verstehen, schreiben Sie möglicherweise Quantenschaltungen in einen Texteditor in Quil und führen Sie die Schaltung dann mit dem Programm auf QVM aus $ inline $ \ textef {run_quil.py} $ inline $ . Sie können auch ändern $ inline $ \ textef {run_quil.py} $ inline $ um die Schaltung auf QPU zu betreiben. Beachten Sie, dass der pyQuil-Compiler (in der Dokumentation auch als Quil-Compiler bezeichnet) die angegebene Schaltung in Quil-Code konvertiert, den ein echter Quantencomputer verstehen kann. Wir werden dies in Abschnitt III C genauer diskutieren.


f. Quantenhardware


Rigetti verfügt über einen Quantenprozessor, der von denjenigen verwendet werden kann, die Zugriff anfordern. Um den Zugriff anzufordern, müssen Sie die Rigetti- Website besuchen und den vollständigen Namen, die E-Mail-Adresse, den Namen der Organisation sowie eine Beschreibung des Grunds für den Zugriff auf die QPU angeben. Sobald dies erledigt ist, wird ein Unternehmensvertreter Sie per E-Mail kontaktieren, um einen Zeitpunkt festzulegen, zu dem der Benutzer Zugriff auf die QPU erhält. Der Vorteil dieses Planungsprozesses im Gegensatz zum QISKit-Warteschlangensystem, das später erläutert wird, besteht darin, dass viele Aufgaben in einem verteilten Zeitintervall mit deterministischen Ausführungszeiten ausgeführt werden können, was für Variations- und Hybridalgorithmen von entscheidender Bedeutung ist. Diese Arten von Algorithmen senden Daten zwischen klassischen und Quantencomputern hin und her - die Notwendigkeit, in der Schlange zu stehen, verlängert diesen Prozess erheblich. Der Nachteil (möglicherweise) ist, dass Aufgaben zu keinem Zeitpunkt ausgeführt werden können, wenn die QPU verfügbar ist und eine bestimmte Zeit angegeben und vereinbart werden muss.


Nach den Erfahrungen des Autors sind die Mitarbeiter bereit zu helfen, und der Prozess ist normalerweise erfolgreich. Das eigentliche Gerät, dessen Topologie in Abbildung 2 dargestellt ist, besteht aus 8 Qubits mit der Konnektivität zum nächsten Nachbarn. Wir werden uns diesen Computer in Abschnitt III B genauer ansehen.


g. Simulator


Quantum Virtual Machine (QVM) ist das Hauptdienstprogramm zur Ausführung von Quantenschaltungen. Dieses Programm, das für die Ausführung auf einem klassischen Prozessor geschrieben wurde, empfängt Quil-Code und simuliert die Entwicklung eines Prozesses auf einem realen Quantencomputer. Um eine Verbindung zu QVM herzustellen, müssen Sie unter https://www.rigetti.com/forest kostenlos einen API-Schlüssel mit einem Namen und einer E-Mail-Adresse registrieren. Anschließend erhalten Sie eine E-Mail mit dem API-Schlüssel und der Benutzer-ID, die beim Start konfiguriert werden müssen:


 pyquil−config−setup 

in der Kommandozeile (natürlich nach der Installation von pyQuil). Anschließend werden Sie aufgefordert, die Schlüssel aus der E-Mail einzugeben.


Gemäß der Dokumentation bieten die meisten API-Schlüssel Zugriff auf QVMs mit bis zu 30 Qubits, und Sie können den Zugriff auf weitere Qubits anfordern. Der API-Schlüssel des Autors ermöglicht den Zugriff auf 26 Qubits (es wurden keine Aktualisierungen angefordert).


Darüber hinaus enthält die Gesamtstrukturbibliothek einen in Python und Open Source geschriebenen lokalen Simulator, der als Referenz-QVM bezeichnet wird . Es ist nicht so produktiv wie QVM, aber Benutzer können Schaltkreise mit einer Anzahl von Qubits ausführen, die durch die Speichermenge auf lokalen Computern begrenzt ist. In der Regel können Schaltkreise mit weniger als 20 Qubits mit einer Vielzahl von Geräten betrieben werden. Referenz-QVM muss separat installiert werden, was möglich ist  textefpip ::


 pip install referenceqvm 

Um Referenz-QVM anstelle von QVM zu verwenden, importieren Sie einfach  textefapi von  textefreferenceqvm anstelle von pyQuil:


 import referenceapi.api as api 


Abbildung 2. Schematische Darstellung der Topologie (Konnektivität) einer 8-Qubit-Agave-QPU Rigetti. Qubits sind mit ganzen Zahlen 0, 1, ..., 7 markiert, und die Linien, die die Qubits verbinden, zeigen an, dass zwei Qubit-Operationen zwischen diesen Qubits ausgeführt werden können. Zum Beispiel können wir Controlled- ausführen. Z. über Qubits 0 und 1, aber nicht zwischen 0 und 2. Um letzteres zu erreichen, konvertiert der Quil-Compiler Controlled- Z. (0, 2) in der Operation, die die QPU ausführen kann. Dieses Diagramm stammt aus der pyQuil-Dokumentation.


QISKit

B. QISKit


Das Quantum Information Software Kit (QISKit) ist ein Open Source Software Development Kit (SDK) für die Arbeit mit der Quantensprache OpenQASM und Quantenprozessoren in der IBM Q-Plattform. Es ist für Python, JavaScript und Swift verfügbar, wird hier jedoch nur erläutert Python-Version.


a. Anforderungen und Installation


QISKit ist unter MacOS, Windows und Linux verfügbar. Für die Installation von QISKit ist Python 3.5+ erforderlich. Weitere nützliche, aber nicht erforderliche Komponenten sind Jupyter Notebooks für Tutorials und die Python Anaconda 3-Distribution, die alle erforderlichen Abhängigkeiten enthält.


Der einfachste Weg, QISKit zu installieren, ist die Verwendung des Pip-Paket-Managers für Python. Geben Sie an der Eingabeaufforderung zur Installation der Software Folgendes ein:


 pip install qiskit 

Bitte beachten Sie das  textefpip verarbeitet automatisch alle Abhängigkeiten und installiert immer die neueste Version. Benutzer, die möglicherweise an einem Beitrag zu QISKit interessiert sind, können den Quellcode installieren, indem sie an einer Eingabeaufforderung Folgendes eingeben. Es wird davon ausgegangen, dass git installiert ist:


 git clone https://github.com/QISKit/qiskit−core cd qiskit−core python −m pip install −e 

Informationen zu Einzahlungen finden Sie in der Online-Dokumentation des Einzahlungsleitfadens auf GitHub.


b. Dokumentations- und Schulungsmaterialien


Die QISKit-Dokumentation finden Sie im Internet unter https://qiskit.org/documentation/ . Es enthält Installations- und Konfigurationsanweisungen, Beispielprogramme und die Verbindung zu realen Quantengeräten, die Projektorganisation, eine QISKit-Überprüfung und Entwicklerdokumentation. Grundlegende Informationen zum Quantencomputing finden Sie auch für Benutzer, die neu auf dem Gebiet sind. Eine sehr gute Ressource ist ein Link zum SDK, über das Benutzer Informationen zur Quellcodedokumentation finden.


QISKit enthält auch eine große Anzahl von Tutorials in einem separaten GitHub-Repository (ähnlich wie pyQuil und Grove). Dazu gehören verschränkte Zustände; Standardalgorithmen wie Deutsch Jozh, Grovers Algorithmus, Phasenschätzung und Quanten-Fourier-Transformation; auch komplexere Algorithmen, wie das Lösen eines Quantenvariationseigenwertproblems und das Anwenden auf Fermion-Hamiltonianer; und sogar einige lustige Spiele, wie die Quanten "Seeschlacht". Darüber hinaus enthält die ACQUA-Bibliothek (Algorithms and Circuits for QUantum Applications) multidisziplinäre Algorithmen für Chemie und künstliche Intelligenz mit zahlreichen Beispielen.


Es gibt auch eine sehr detaillierte Dokumentation für jedes der vier Quanten-Backends, die Informationen zu Konnektivität, Kohärenzzeit und Gate-Nutzungszeit enthält. Erwähnen Sie abschließend die IBM Q Experience- Website und die Benutzerhandbücher. Die Website enthält eine grafische Oberfläche für eine Quantenschaltung, in der Benutzer Gates auf eine Schaltung ziehen können, was zum Erkunden von Quantenschaltungen nützlich ist. Die Benutzerhandbücher enthalten weitere Anweisungen zum Quantencomputing und zur QISKit-Sprache.


c. Syntax


Die QISKit-Syntax kann im folgenden Beispielprogramm angezeigt werden. Im Gegensatz zu pyQuil müssen Sie hier explizit zwischen Quanten- und klassischen Registern unterscheiden. Unten finden Sie ein Programm für das Zufallszahlenschema von QISKit:


 # random number generator circuit in QISKit from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit, execute qreg = QuantumRegister(1) creg = ClassicalRegister(1) qcircuit = QuantumCircuit(qreg , creg) qcircuit.h(qreg[0]) qcircuit.measure(qreg[0], creg[0]) result = execute(qcircuit, 'local qasm simulator').result() print(result.get_counts()) 

Listing 4. QISKit-Code für einen Zufallszahlengenerator.


Zeile 2 importiert Werkzeuge zum Erstellen von Quanten- und klassischen Registern, eine Quantenschaltung und Funktionen zum Ausführen dieser Schaltung. Dann erstellen wir ein Quantenregister mit einem Qubit (Zeile 4), ein klassisches Register mit einem Bit (Zeile 5) und eine Quantenschaltung mit diesen beiden Registern (Zeile 6). Nachdem die Schaltung erstellt wurde, geben wir Anweisungen: In Zeile 8 wenden wir das Hadamard-Gatter auf das Null-Qubit in unserem Quantenregister an (das das einzige Qubit im Quantenregister ist). In Zeile 9 messen wir dieses Qubit in ein klassisches Bit, das in unserem klassischen Register (das das einzige im klassischen Register ist) mit Null indiziert ist [45]. Nachdem die Quantenschaltung aufgebaut ist, führen Sie sie in Zeile 11 aus und drucken Sie das Ergebnis in Zeile 12. Mit Hilfe der Ausgabe $ inline $ \ textef {result.get_counts ()} $ inline $ Wir erhalten die "Berechnungen" der Schaltung, dh das Wörterbuch der Ausgabedaten und wie oft jedes Ergebnis empfangen wurde. In unserem Fall sind die einzigen möglichen Ausgaben 0 oder 1, und ein Beispiel für die Ausgabe des obigen Programms ist  textef0:532,1:492 Dies zeigt an, dass wir 532 Instanzen von 0 und 492 Instanzen von 1 erhalten haben. (Standardmäßig wird die Anzahl der Zyklen zum Starten der aufgerufenen Schaltung angegeben  textefSchüsse in QISKit ist 1024.)


d. Quantensprache


OpenQASM (die offene Quantenassemblersprache [25], die wir einfach als QASM bezeichnen können) ist eine Quantensprache, die Anweisungen für reale Quantengeräte enthält, die Assembler auf klassischen Computern ähneln. Die Basis der QASM-Syntax ist  textefgatequbit wo  textefgate legt die Operation des Quantengatters fest und  TextsfQubit - Qubit. QISKit hat eine Funktion zum Generieren von QASM-Code aus einem Schema. Im obigen Zufallszahlenschema könnten wir eine Zeile hinzufügen.


 print(qcircuit.qasm()) 

am Ende, um den QASM-Code für die unten gezeigte Schaltung zu erhalten:


 OPENQASM 2.0; includeqelib1.inc”; qreg q0[1]; creg c0[1]; h q0[0]; measure q0[0] −> c0[0]; 

Listing 5. OpenQASM-Code für einen Zufallszahlengenerator.


Die ersten beiden Zeilen sind in jeder QASM-Datei enthalten. Zeile 3 (4) erzeugt ein Quantenregister (klassisch), und die Zeilen 5 und 6 geben Anweisungen für die Schaltung. In OpenQASM können Sie kleine Schaltungen wie diese schreiben. Bei größeren Schaltungen ist es jedoch besser, Tools in QISKit für die kostenlose und effiziente Programmierung von Quantencomputern zu verwenden.


e. Quantenhardware


Es gibt eine große Menge an Dokumentation für Quanten-Backends, die von QISKit unterstützt werden. Diese Geräte umfassen IBMQX2 (5 Qubits), IBMQX4 (5 Qubits), IBMQX5 (16 Qubits) und QS1_1 (20 Qubits, nur für Mitglieder des IBM Q-Netzwerks verfügbar). Dokumentation für alle ist auf GitHub verfügbar. Wir werden uns IBMQX5 in Abschnitt III B genauer ansehen, dessen Topologie in Abbildung 3 dargestellt ist.


f. Simulator


IBM , . , 12 , , 25 . , III D.



Abbildung 3. Schematische Topologie von IBMQX5 aus [30]. Richtungspfeile zeigen Verwicklungsmöglichkeiten an. Zum Beispiel könnten wir eine Operation ausführen (in QASM) cx Q1, Q2 aber keine Operation cx Q2, Q1 . Um letzteres zu tun, übersetzt der Compiler den Befehl in äquivalente Gates, die in der Topologie und im Satz von Gates ausgeführt werden.


Projectq

C. ProjectQ


ProjectQ — IBM, . ProjectQ Thomas Häner Damien S. Steiger Matthias Troyer ETH Zurich, .


a.


ProjectQ Python (2.7 3.4+). . pip ::


 python −m pip install −−user projectq 

( ). :


 git clone https://github.com/ProjectQ−Framework/ProjectQ cd projectq python −m pip install −−user 

, , . ProjectQ GitHub.


b.


ProjectQ . , . - ( , ). — / , . [18, 19] , , - .


c.


ProjectQ , . ProjectQ ( ProjectQ), — / . , :


 # random number generator circuit in ProjectQ from projectq import MainEngine import projectq.ops as ops eng = MainEngine() qbits = eng.allocate_qureg(1) ops.H | qbits[0] ops.Measure | qbits[0] eng.flush() print(int(qbits[0])) 

6. ProjectQ .


2 , 3 . 5 (engine) MainEngine , 6 . 8 9 : 0, . « » . — operation | qubit , H|0> , . , /. pyQuil QISKit, ProjectQ . , qbits[0] 9, , int , 12.


d.


, ProjectQ . ProjectQ IBM, OpenQASM: IBM.


e.


ProjectQ . , IBM ProjectQ.


f.


ProjectQ , C++, , , Python. , ProjectQ ClassicalSimulator (stabilizer circuits), . . , , , CNOT [26]. , , , , . , C++ Simulator .


C++ Simulator ProjectQ . [23]() (, ), 26 5 , 28 20 — . [III D]() 6.


h. ProjectQ


ProjectQ , , . , pyQuil ProjectQ [27], Microsoft QDK Thomas Häner Damian Steiger ETH Zurich [28], . ( , , QDK ProjectQ C++, .)


Quantenentwicklungskit

D. Quantum Development Kit


Rigetti IBM, Microsoft . [29] , , , . , Microsoft , Quantum Development Kit (QDK), , . , QDK «-» Q#, Visual Studio Visual Studio Code 30 . 2018 , -, MacOS, Windows Linux.


a.


, Visual Studio Code , . ( VS Code, Visual Studio . - - , , VS Code.) , QDK , Bash:


 dotnet new −i "Microsoft.Quantum.ProjectTemplates::0.2 −*" 

QDK GitHub ( , QDK), :


 git clone https://github.com/Microsoft/Quantum.git cd Quantum code 

b.


— Q#, - , , , Q# . ; , .


c.


Q# . C#: , Python, , C#. , :


 // random number generator circuit in QDK operation random (count: Int, initial: Result) : (Int, Int) { body { mutable numOnes = 0; using ( qubits = Qubit[1]) { for (test in 1..count) { Set(initial, qubits[0]); H(qubits[0]); let res = M(qubits[0]); // count the number of ones if (res == One) { set numOnes = numOnes + 1; } } Set(Zero, qubits[0]); } // return statistics return (count − numOnes, numOnes); } } 

7. Q# .


, , /, , . . , , , . — .qs Q#, Driver.cs .qs , .csproj , . , 65 . -, , «Quickstart» .


, QDK , . , — (a+b) , . QDK , , ( C , , , , .


d. /


, QDK . Q# / .


e.


QDK , 30 . , QDK ProjectQ, , ProjectQ. ( III D.) Azure , 40 . QDK , .


, QDK (trace simulator), , , , . , . , . , , - , . . . - QDK.


III. Vergleich


Später in diesem Abschnitt, wenn die Grundlagen jeder Plattform berücksichtigt wurden, werden wir alle zusätzlichen Merkmale vergleichen, einschließlich der Unterstützung auf Bibliotheks-, Quantenausrüstungs- und Quantencompilerebene. Wir werden auch einige der bemerkenswerten und nützlichen Funktionen jeder Plattform auflisten.


A. Bibliotheksunterstützung


« » ( ) (, language.DoQuantumFourierTransform (...) ) . , , 4.


, , , . , , , .


, pyQuil, QISKit QDK . ProjectQ FermiLib, FermiLib, OpenFermion, . , , , ProjectQ. Microsoft QDK , , . , QDK , , QDK, . QISKit .


B.


pyQuil QISKit, . , — — « ». ( ), , / . , , --. IBMQX5 Agave, . - .


a. IBMQX5


IBMQX5 — 16- ( 3). (T2) 31±5 0- , — 89±17 15- . 80 10 . CNOT - , 170- cx q[6], q[7] 348 cx q[3], q[14] . 99,5% ( = 1 — ). - 94,9% . 12,4% 6%. [30].


, , IBM , , . Agave Rigetti, -, , . , .


b. Agave


Agave 8 (transmon) , 2. (T2) 9,2 1- , 15,52 2- . Controlled- Z 118 195 . 96,2% ( , = 1 — ) 93,2%. - 87% - . . - pyQuil.


AlgorithmpyQuilQISKitProjectQQDK
Random Number Generator(T)(T)(T)(T)
Teleportation(T)(T)(T)(T)
Swap Test(T)
Deutsch-Jozsa(T)(T)(T)
Grover's Algorithm(T)(T)(T)(B)
Quantum Fourier Transform(T)(T)(B)(B)
Shor's Algorithm(T)(D)
Bernstein Vazirani(T)(T)(T)
Phase Estimation(T)(T)(B)
Optimization/QAOA(T)(T)
Simon's Algorithm(T)(T)
Variational Quantum Eigensolver(T)(T)(P)
Amplitude Amplification(T)(B)
Quantum Walk(T)
Ising Solver(T)(T)
Quantum Gradient Descent(T)
Five Qubit Code(B)
Repetition Code(T)
Steane Code(B)
Draper Adder(T)(D)
Beauregard Adder(T)(D)
Arithmetic(B)(D)
Fermion Transforms(T)(T)(P)
Trotter Simulation(D)
Electronic Structure (FCI, MP2, HF, etc.)(P)
Process Tomography(T)(T)(D)
Meyer-Penny Game(D)
Vaidman Detection Test(T)
Battleships Game(T)
Emoji Game(T)
Counterfeit Coin Game(T)

4. , . « » (T), (D), (B) (P).

C.


, , , . / . — , , . QISKit Rigetti, .


IBMQX5 u1 , u2 , u3 und CNOT wo



, u1 Rz(θ) , u2 und u3Rx(π/2)



, .



wo X und Z — . IBM Rz(θ) « », , . , z , z () , .


IBMQX5 3. , CNOT , CNOT



, CNOT QISKit, , , QISKit CNOT, . QISKit , , .


8- Agave Rigetti Rx(kπ/2) kZ , Rz(θ) Controlled- Z . , , Controlled- Z ( CZ )



Agave 2. QISKit, pyQuil ( ).


, , 5. , pyQuil, Agave, QISKit — IBMQX5. , QISKit (. . ), pyQuil. , - . , IBMQX5 , , pyQuil, . , ( ) - - (, , [32]), . [46], .



5. ( ), pyQuil 8- Agave Rigetti ( ) , QISKit IBM IBMQX5 16- . , Agave, 0, 1 2 ( 2), , IBMQX5, 0, 1 2. , H , Rx Rz . CNOT IBMQX5, Agave — pyQuil CNOT Controlled- Z . ProjectQ.


D.


, . , , (. . ) . , , , , , . . QISKit , C++, ProjectQ , B . QVM pyQuil.


a. pyQuil


Rigetti, Quantum Virtual Machine (QVM), , . , API. API 30- , . 16- 10 2,61 . 23 10 56,33 , , QVM API. - - , QVM , QVM , ProjectQ QISKit.


QVM . , . , , . Noise and Quantum Computation pyQuil.


b. QISKit


QISKit , :local_qasm_simulator ,local_state_vector_simulator ,ibmq_qasm_simulator ,local_unitary_simulator undlocal_clifford_simulator . . () . , / . [33], [34-36] . ClassicalSimulator ProjectQ,local_clifford_simulator (stabilizer circuits), .


, 10 10 23,55 . — 239,97 , 12 1000 ( 17 ). , n 2n×2n .


C . 25 . 20 . 6 7.


s ProjectQ


ProjectQ C++, . , , 28 , (569,71 ) 20-. [18]. 6 7.



6. QISKit () ProjectQ C++ (), ( ) ( ). , ( ). **B**.



7. , ProjectQ C++ QISKit, . , X , CNOT, . , . ProjectQ.


E.


pyQuil Grove, GitHub, pyQuil. Rigetti , Slack Rigetti Forest. Quil ( ). , pyQuil OpenFermion [37], Python , .


QISKit JavaScript Swift. Python - . Grove, QISKit . , ACQUA QISKit . . IBM , . 3 , QISKit, 80000 , 60 , IBM [31]. QISKit Slack , , . , QISKit .


, ProjectQ . , TikZ TEX . ProjectQ. ProjectQ , . ProjectQ , IBM. , ProjectQ , OpenFermion, .


QDK Windows , 2018 macOS Linux. QDK, . , Q# , , . QDK , , , , , . .


IV.


, , , (-) (-) . — , . / .


, , :


  • , , QISKit ( ProjectQ) pyQuil — .
  • , , QISKit, pyQuil QDK — .
  • , , Python — .
  • , C/C#, QDK — .
  • , , , ProjectQ — .
  • , - , pyQuil — .
  • , , Strawberry Fields .

, , . . , , .



  1. Bernhard Ömer, A procedural formalism for quantum computing , Master's thesis, Department of Theoretical Physics, Technical University of Vienna, 1998.
  2. S. Bettelli, L. Serafini, T. Calarco, Toward an architecture for quantum programming , Eur. Phys. J. D, Vol. 25, No. 2, pp. 181-200 (2003).
  3. Peter Selinger (2004), A brief survey of quantum programming languages , in: Kameyama Y., Stuckey PJ (eds) Functional and Logic Programming. FLOPS 2004. Lecture Notes in Computer Science, vol 2998. Springer, Berlin, Heidelberg.
  4. Benjamin P. Lanyon, James D. Whitfield, Geoff G. Gillet, Michael E. Goggin, Marcelo P. Almeida, Ivan Kassal, Jacob D. Biamonte, Masoud Mohseni, Ben J. Powell, Marco Barbieri, Alaґn Aspuru-Guzik, Andrew G. White, Towards quantum chemistry on a quantum computer , Nature Chemistry 2 , pages 106-111 (2010), doi:10.1038/nchem.483.
  5. Jonathan Olson, Yudong Cao, Jonathan Romero, Peter Johnson, Pierre-Luc Dallaire-Demers, Nicolas Sawaya, Prineha Narang, Ian Kivlichan, Michael Wasielewski, Alaґn Aspuru-Guzik, Quantum information and computation for chemistry , NSF Workshop Report, 2017.
  6. Jacob Biamonte, Peter Wittek, Nicola Pancotti, Patrick Rebentrost, Nathan Wiebe, Seth Lloyd, Quantum machine learning , Nature volume 549 , pages 195-202 (14 September 2017).
  7. Seth Lloyd, Masoud Mohseni, Patrick Rebentrost, Quantum principal component analysis , Nature Physics volume 10 , pages 631-633 (2014).
  8. Vadim N. Smelyanskiy, Davide Venturelli, Alejandro Perdomo-Ortiz, Sergey Knysh, and Mark I. Dykman, Quantum annealing via environment-mediated quantum diffusion , Phys. Rev. Lett. 118 , 066802, 2017.
  9. Patrick Rebentrost, Brajesh Gupt, Thomas R. Bromley, Quantum computational finance: Monte Carlo pricing of financial derivatives , arXiv preprint (arXiv:1805.00109v1), 2018.
  10. IM Georgescu, S. Ashhab, Franco Nori, Quantum simulation , Rev. Mod. Phys. 86, 154 (2014), DOI: 10.1103/RevModPhys.86.153.
  11. EF Dumitrescu, AJ McCaskey, G. Hagen, GR Jansen, TD Morris, T. Papenbrock, RC Pooser, DJ Dean, P. Lougovski, Cloud quantum computing of an atomic nucleus , Phys. Rev. Lett. 120 , 210501 (2018), DOI: 10.1103/PhysRevLett.120.210501.
  12. Lukasz Cincio, Yigit Subasi, Andrew T. Sornborger, and Patrick J. Coles, Learning the quantum algorithm for state overlap , arXiv preprint (arXiv:1803.04114v1), 2018
  13. Patrick J. Coles, Stephan Eidenbenz, Scott Pakin, et al., Quantum algorithm implementations for beginners , arXiv preprint (arXiv:1804.03719v1), 2018.
  14. Mark Fingerhuth, Open-Source Quantum Software Projects , accessed May 12, 2018.
  15. Quantiki: List of QC Simulators , accessed May 12, 2018
  16. R. Smith, MJ Curtis and WJ Zeng, A practical quantum instruction set architecture , 2016.
  17. QISKit, originally authored by Luciano Bello, Jim Challenger, Andrew Cross, Ismael Faro, Jay Gambetta, Juan Gomez, Ali Javadi-Abhari, Paco Martin, Diego Moreda, Jesus Perez, Erick Winston, and Chris Wood, https://github.com/QISKit/qiskit-sdk-py .
  18. Damian S. Steiger, Thomas Häner, and Matthias Troyer ProjectQ: An open source software framework for quantum computing , 2016.
  19. Thomas Häner, Damian S. Steiger, Krysta M. Svore, and Matthias Troyer A software methodology for compiling quantum programs , 2016.
  20. The Quantum Development Kit by Microsoft, homepage: https://www.microsoft.com/en — us/quantum/development-kit, github: https://github.com/Microsoft/Quantum .
  21. Michael A. Nielsen and Isaac L. Chuang, Quantum Computation and Quantum Information 10th Anniversary Edition, Cambridge University Press, 2011.
  22. Doug Finke, Education , Quantum Computing Report, https://quantumcomputingreport.com/resources/education/ , accessed May 26, 2018.
  23. All code in this paper was run and tested on a Dell XPS 13 Developer Edition laptop running 64 bit Ubuntu 16.04 LTS with 8 GB RAM and an Intel Core i7-8550U CPU at 1.80 GHz. Programs were run primarily from the command line but the Python developer environment Spyder was also used for Python programs and Visual Studio Code was used for C# (Q#) programs.
  24. Forest: An API for quantum computing in the cloud, https://www.rigetti.com/index.php/forest , accessed May 14, 2018.
  25. Andrew W. Cross, Lev S. Bishop, John A. Smolin, Jay M. Gambetta, Open quantum assembly language , 2017.
  26. Scott Aaronson, Daniel Gottesman, Improved Simulation of Stabilizer Circuits , Phys. Rev. A 70 , 052328, 2004.
  27. pyQuil Lisence, github.com/rigetticomputing/pyquil/blob/master/LICENSE#L204 , accessed June 7, 2018.
  28. Microsoft Quantum Development Kit License, marketplace.visualstudio.com/items/quantum.DevKit/license , accessed June 7, 2018.
  29. Hao Zhang, Chun-Xiao Liu, Sasa Gazibegovic, et al. Quantized Majorana conductance , Nature 556 , 74-79 (05 April 2018).
  30. 16-qubit backend: IBM QX team, “ibmqx5 backend specification V1.1.0,” (2018). Retrieved from https://ibm.biz/qiskit-ibmqx5 and https://quantumexperience.ng.bluemix.net/qx/devices on May 23, 2018.
  31. Talia Gershon, Celebrating the IBM Q Experience Community and Their Research , March 8, 2018.
  32. M. Reck, A. Zeilinger, HJ Bernstein, and P. Bertani, Experimental realization of any discrete unitary operator , Physical Review Letters, 73, p. 58, 1994.
  33. Ryan LaRose, Distributed memory techniques for classical simulation of quantum circuits , arXiv preprint (arXiv:1801.01037v1), 2018.
  34. Thomas Haner, Damian S. Steiger, 0.5 petabyte simulation of a 45-qubit quantum circuit , arXiv preprint (arXiv:1704.01127v2), September 18, 2017.
  35. Jianxin Chen, Fang Zhang, Cupjin Huang, Michael Newman, Yaoyun Shi, Classical simulation of intermediate-size quantum circuits , arXiv preprint (arXiv:1805.01450v2), 2018.
  36. Alwin Zulehner, Robert Wille, Advanced simulation of quantum computations , arXiv preprint ( arXiv:1707.00865v2 ), November 7, 2017.
  37. Jarrod R. McClean, Ian D. Kivlichan, Kevin J. Sung, et al., OpenFermion: The electronic structure package for quantum computers , arXiv:1710.07629, 2017.
  38. Nathan Killoran, Josh Izaac, Nicols Quesada, Ville Bergholm, Matthew Amy, Christian Weedbrook, Strawberry Fields: A Software Platform for Photonic Quantum Computing , arXiv preprint (arXiv:1804.03159v1), 2018.
  39. IonQ website, https://ionq.co/ , accessed June 15, 2018.
  40. D-Wave: The quantum computing company, https://www.dwavesys.com/home , accessed June 20, 2018.
  41. 4 2018 Rigetti 20- , . , 8- «- ». , 20- (, , ).
  42. IBMQ Network , 2017 — JP Morgan Chase , Daimler , Samsung , Honda , Oak Ridge National Lab , — , 2018 — Zapata Computing , Strangeworks , QxBranch , Quantum Benchmark , QC Ware , Q-CTRL , Cambridge Quantum Computing (CQC) , 1QBit . North Carolina State University , IBM Q Hub, University of Oxford University of Melbourne . https://www.research.ibm.com/ibmq/network/ .
  43. , - - . QISKit, ACQUA , pyQuil.
  44. pyQuil : , from pyquil.gates import H, MEASURE . pyquil.gates , , , .
  45. , () . , () , , .
  46. IBM, 31 2018 , « » Python Cython, .

A

A.


, . Players Quantum Computing Report [22]. , , . / — .


a. Strawberry Fields


Xanadu , , Strawberry Fields Python , [38]. Xanadu «qumodes» ( ), , , . Strawberry Fields Numpy TensorFlow, Blackbird. GitHub, , , , . , Xanadu https://www.xanadu.ai/ , .


b. IonQ


IonQ — -, College Park , . IonQ , . 171 Yb , IonQ T2 () 15- , T2 1 . , T1 ( ) 20 000 , 104 . , -- - , «» . , .


IonQ , IonQ . . , - [39].


c. D-Wave Systems


D-Wave [40], , . D-Wave, 1999 , , , ,


H=ihiσxi+i,jJijσziσzj.


D-Wave , — 2048 , Matlab, C/C++ Python . /, D-Wave . D-Wave .


B

B.


ProjectQ C++. Dell XPS 13 Developer Edition 64- Ubuntu 16.04 LTS 8 Intel Core i7-8550U 1,80 .


 # ------------------------------------------------------------------------------ # imports # ------------------------------------------------------------------------------ from projectq import MainEngine import projectq.ops as ops from projectq.backends import Simulator import sys import time # ------------------------------------------------------------------------------ # number of qubits and depth # ------------------------------------------------------------------------------ if len(sys.argv) > 1: n = int(sys.argv[1]) else: n = 16 if len(sys.argv) > 1: depth = int(sys.argv[2]) else: depth = 10 # ------------------------------------------------------------------------------ # engine and qubit register # ------------------------------------------------------------------------------ eng = MainEngine(backend=Simulator(gate_fusion=True), engine_list=[]) qbits = eng.allocate_qureg(n) # ------------------------------------------------------------------------------ # circuit # ------------------------------------------------------------------------------ # timing -- get the start time start = time.time() # random circuit for level in range(depth): for q in qbits: ops.H | q ops.SqrtX | q if q != qbits[0]: ops.CNOT | (q, qbits[0]) # measure for q in qbits: ops.Measure | q # flush the engine eng.flush() # timing -- get the end time runtime = time.time() - start # print out the runtime print(n, depth, runtime) 

, , 7. , QISKit — .


C

C. :


. , QDK , , . — , — — . . , , , — , .


, , . , QISKit.



8. , circuit_drawer , QISKit v0.5.4.


pyQuil


 #!/usr/bin/env python3 # -*- coding: utf-8 -*- # ============================================================================== # teleport.py # # Teleportation circuit in pyQuil. # ============================================================================== # ------------------------------------------------------------------------------ # imports # ------------------------------------------------------------------------------ from pyquil.quil import Program from pyquil import api import pyquil.gates as gate # ------------------------------------------------------------------------------ # program and simulator # ------------------------------------------------------------------------------ qprog = Program() qvm = api.QVMConnection() # ------------------------------------------------------------------------------ # teleportation circuit # ------------------------------------------------------------------------------ # teleport |1> to qubit three qprog += gates.X(0) # main circuit qprog += [gates.H(1), gates.CNOT(1, 2), gates.CNOT(0, 1), gates.H(0), gates.MEASURE(0, 0), gates.MEASURE(1, 1)] # conditional operations qprog.if_then(0, gates.Z(2)) qprog.if_then(1, gates.X(2)) # measure qubit three qprog.measure(2, 2) # ------------------------------------------------------------------------------ # run the circuit and print the results # ------------------------------------------------------------------------------ print(qvm.run(qprog)) # optionally print the quil code print(qprog) 

QISKit


 #!/usr/bin/env python3 # -*- coding: utf-8 -*- # ============================================================================== # teleport.py # # Teleportation circuit in QISKit. # ============================================================================== # ------------------------------------------------------------------------------ # imports # ------------------------------------------------------------------------------ from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit, execute # ------------------------------------------------------------------------------ # registers and quantum circuit # ------------------------------------------------------------------------------ qreg = QuantumRegister(3) creg = ClassicalRegister(3) qcircuit = QuantumCircuit(qreg, creg) # ------------------------------------------------------------------------------ # do the circuit # ------------------------------------------------------------------------------ # teleport |1> to qubit three qcircuit.x(qreg[0]) # main circuit qcircuit.h(qreg[0]) qcircuit.cx(qreg[1], qreg[2]) qcircuit.cx(qreg[0], qreg[1]) qcircuit.h(qreg[0]) qcircuit.measure(qreg[0], creg[0]) qcircuit.measure(qreg[1], creg[1]) # conditional operations qcircuit.z(qreg[2]).c_if(creg[0][0], 1) qcircuit.x(qreg[2]).c_if(creg[1][0], 1) # measure qubit three qcircuit.measure(qreg[2], creg[2]) # ------------------------------------------------------------------------------ # run the circuit and print the results # ------------------------------------------------------------------------------ result = execute(qcircuit, 'local_qasm_simulator').result() counts = result.get_counts() print(counts) # optionally print the qasm code print(qcircuit.qasm()) # optionally draw the circuit from qiskit.tools.visualization import circuit_drawer circuit_drawer(qcircuit) 

ProjectQ


 #!/usr/bin/env python3 # -*- coding: utf-8 -*- # ============================================================================== # teleport.py # # Teleportation circuit in ProjectQ. # ============================================================================== # ------------------------------------------------------------------------------ # imports # ------------------------------------------------------------------------------ from projectq import MainEngine from projectq.meta import Control import projectq.ops as ops # ------------------------------------------------------------------------------ # engine and qubit register # ------------------------------------------------------------------------------ # engine eng = MainEngine() # allocate qubit register qbits = eng.allocate_qureg(3) # ------------------------------------------------------------------------------ # teleportation circuit # ------------------------------------------------------------------------------ # teleport |1> to qubit three ops.X | qbits[0] # main circuit ops.H | qbits[1] ops.CNOT | (qbits[1], qbits[2]) ops.CNOT | (qbits[0], qbits[1]) ops.H | qbits[0] ops.Measure | (qbits[0], qbits[1]) # conditional operations with Control(eng, qbits[1]): ops.X | qbits[2] with Control(eng, qbits[1]): ops.Z | qbits[2] # measure qubit three ops.Measure | qbits[2] # ------------------------------------------------------------------------------ # run the circuit and print the results # ------------------------------------------------------------------------------ eng.flush() print("Measured:", int(qbits[2])) 

Quantum Developer Kit


 // ============================================================================= // teleport.qs // // Teleportation circuit in QDK. // ============================================================================= operation Teleport(msg : Qubit, there : Qubit) : () { body { using (register = Qubit[1]) { // get auxiliary qubit to prepare for teleportation let here = register[0]; // main circuit H(here); CNOT(here, there); CNOT(msg, here); H(msg); // conditional operations if (M(msg) == One) { Z(there); } if (M(here) == One) { X(there); } // reset the "here" qubit Reset(here); } } } operation TeleportClassicalMessage(message : Bool) : Bool { body { mutable measurement = false; using (register = Qubit[2]) { // two qubits let msg = register[0]; let there = register[1]; // encode message to send if (message) { X(msg); } // do the teleportation Teleport(msg, there); // check what message was sent if (M(there) == One) { set measurement = true; } // reset all qubits ResetAll(register); } return measurement; } } 

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


All Articles