Skip to content

Skript‐Syntax

Jonas Jelonek edited this page Oct 26, 2023 · 2 revisions

Das qsfw baut, wie andere deutlich umfangreichere Frameworks auch, auf der Idee eines Quantenschaltkreises auf. Die Idee basiert dabei auf der Analogie zu regulären Schaltkreisen aus der Elektrotechnik, in denen man ebenso Eingangssignale (hier Zustände der Qubits) hat und diese durch Gatter (hier Quanten-Gatter) verändert werden. Dies bietet einige Vorteile hinsichtlich des Verständnisses, der Abstraktion von Algorithmus sowie der Umsetzung in GUIs.

Die Skripting-Schnittstelle zwischen dem Quantensimulationsframework (qsfw) und dem Anwender stellt die Gatter als eine Abfolge von Anweisungen dar, die vom Anwender erstellt wird und dann an das qsfw übergeben, dort verarbeitet und ausgeführt wird. Diese Anweisungsliste ist grundsätzlich in einer Datei zu hinterlegen, vorzugsweise mit der Endung .qs. Im Folgenden wird das Format der Anweisungsabfolge sowie der Anweisungen selbst beschrieben.

Abfolge der Anweisungen / Programmcode

Die Abfolge der Anweisungen kann als primitiver, imperativer Programmcode verstanden werden. Eine Anweisung besteht immer aus den zwei Komponenten 'Funktion'/'Kommando' und 'Argumente' und hat stets ein festes Format:

<funktion/kommando>(<argumente>);

Syntaktisch entspricht das einem Funktionsaufruf wie er aus üblichen Programmiersprachen bekannt ist.

<funktion/kommando> kann aus einer vorgegebenen, nicht erweiterbaren Liste von Funktionen/Kommandos gewählt werden. Diese Liste wird im nächsten Abschnitt besprochen.

Wie auch in C werden Anweisungen stets mit einem ;(Semikolon) abgeschlossen. Weiterhin sind Kommentare wie man sie aus C kennt möglich, also:

  • einzeilige Kommentare beginnend mit // die den folgenden Text bis zum Zeilenumbruch als Kommentar kennzeichen
  • mehrzeilige Kommentare beginnend mit /* und abschließend mit */

Auch ist es möglich, die Argumentenliste über mehrere Zeilen zu verteilen. Eine Anweisung wird erst mit einem Semikolon abgeschlossen und Whitespaces (also Leerzeichen, Tabulatoren, Zeilenumbrüche, etc.) werden in diesem Fall innerhalb einer Anweisung ignoriert.

Verfügbare Anweisungen

Grundlegende Funktionen

Funktion Argumente Beschreibung
circuit circuit definiert einen Quantenschaltkreis, der für die nachfolgenden Aktionen die Grundlage bildet. Alle weiteren Funktionen können nur auf einem existierenden Quantenschaltkreis ausgeführt werden. Die Qubits, die mit diesem Befehl im Quantenschaltkreis initialisiert werden, bekommen eine ID zugewiesen die für nachfolgende Befehle genutzt wird und sich während der gesamten Lebenszeit des Schaltkreises nicht ändert. Es gibt zwei Varianten des circuit Befehls die sich im Format der Argumente unterscheiden.
(1) (n: int) Die Übergabe eines Integer-Werts, definiert den Schaltkreis mit n Qubits und jeweils dem Standardzustand von |0>. Die Qubits bekommen implizit eine aufsteigende ID zugewiesen, startend bei 0.
(2) (q0: (str, int), q1: (str, int), ...) Werden dem Befehl mehrere komma-separierte 2-Tupel (syntaktisch: (..,..)) übergeben, können damit explizit die Qubits mit ihren IDs und den Anfangszuständen festgelegt werden. Beispielsweise würde ein Tupel ('a', 1) festlegen, dass ein Qubit initialisiert wird mit der festen ID a und dem Anfangszustand 1.

1-Qubit-Gates

Funktion Argumente Beschreibung
ident (qubit: str) Identitäts-Gate
hadamard (qubit: str) Hadamard-Gate
phase (qubit: str, angle: float) Phase-Shift-Gate; angle ist NICHT in Grad sondern Radiant, also basierend auf π. Als Winkel kann bspw. auch ein Ausdruck wie 2 * π oder π / 4 genutzt werden um nicht Dezimalzahlen nutzen zu müssen. Alternativ zum Unicode-Zeichen π kann auch pi genutzt werden.
pauliX (qubit: str) Pauli-X-Gate, auch NOT-Gate genannt.
pauliY (qubit: str) Pauli-Y-Gate
pauliZ (qubit: str) Pauli-Z-Gate; ist eine Spezialform des Phase-Shift-Gate mit einem Winkel von π.
sphase (qubit: str) S-Gate; ist eine Spezialform des Phase-Shift-Gate mit einem Winkel von π/2.
tphase (qubit: str) T-Gate; ist eine Spezialform des Phase-Shift-Gate mit einem Winkel von π/4 (historisch auch π/8-Gate genannt).
measure (qubit: str) Führt eine Messung an einem Qubit durch. Die Messung erzeugt eine Ausgabe, deren Inhalt noch nicht genau festgelegt ist aber den gemessenen Zustand des Qubits widerspiegelt.

2-Qubit-Gates

Funktion Argumente Beschreibung
cnot (qubit0: str, qubit1: str) Controlled-NOT-Gate; Wie das Pauli-X-Gate nur kontrolliert durch qubit0.
swap (qubit0: str, qubit1: str) Swap-Gate; vertauscht die Zustände von qubit0 und qubit1.
cz (qubit0: str, qubit1: str) Controlled-Z-Gate; Wie das Pauli-Z-Gate nur kontrolliert durch qubit0.
cphase (qubit0: str, qubit1: str, angle: float) Controlled-Phase-Shift-Gate; Wie das Phase-Shift-Gate nur kontrolliert durch qubit0.

3-Qubit-Gates

Funktion Argumente Beschreibung
toffoli (qubit0: str, qubit1: str, qubit2: str) Toffoli-Gate; auch Deutsch-Gate oder CCNOT-Gate genannt. Ist also wie ein NOT-Gate das durch qubit0 und qubit1 gesteuert qubit2 negiert. Alternativ wie ein CNOT-Gate das durch ein weiteres Qubit gesteuert wird.
cswap (qubit0: str, qubit1: str, qubit2: str) Controlled-Swap-Gate; auch Fredkin-Gate genannt. Ist wie ein Swap-Gate und vertauscht die Zustände von qubit1 und qubit2 abhängig vom Zustand von qubit0.