Open Source im professionellen Einsatz
Linux-Magazin Online Artikel/

Quantenrechner simulieren, Teil 2

Rechnen mit Quantensprüngen

14.04.2008

Die quelloffene C-Bibliothek Libquantum ermöglicht simuliertes Quantencomputing auf einem gewöhnlichen PC. Der erste Teil des zweiteiligen Artikels führt in Quantencomputing ein und endet mit einer allgemeinen Beschreibung von Libquantum. Der zweite Teil wird an einem Beispiel zeigen, was sich mit der Libquantum-Bibliothek anstellen lässt.

1039

Nach der Installation funktioniert Libquantum wie jede andere C-Bibliothek. Beachten muss der Programmierer lediglich, dass er die Bibliothek mit dem Linker-Flag -lquantum einbindet. Wenn er Funktionen aus der Mathematik-Bibliothek verwenden möchte, muss er sein Programm natürlich ebenfalls (mittels -lm) gegen diese linken. Libquantum braucht außerdem den Zufallszahlengenerator der C-Standard-Bibliothek.

Um ein Quantenregister für N Qubits vollständig auf einem klassischen PC abzubilden, braucht man 2^N komplexe Zahlen. Das Register für einen einfachen Algorithmus, wie zum Beispiel das Faktorisieren der Zahl 15 mit dem Algorithmus von Shor, müsste für die 21 benötigten Qubits also rund 2 Millionen komplexe Zahlen speichern können. Um diesen enormen Speicherbedarf zu reduzieren - und damit die Geschwindigkeit der Bibliothek zu erhöhen - wurde bei der Darstellung der Quantenregister in Libquantum eine wichtige Eigenschaft von Quantenalgorithmen berücksichtigt: Bei einem typischen Quantenalgorithmus besitzen nur wenige Basiszustände eine von Null verschiedene, also relevante Besetzungswahrscheinlichkeit (Abbildung 1).

Der Endzustand des Shor-Algorithmus ist ein typisches Beispiel für einen Zustand mit nur wenigen relevanten Basiszuständen.

Deshalb setzt Libquantum auf eine besondere Darstellung von Quantenregistern. Der gesamte Zustand eines Quantenregisters besteht aus einer Kombination von Basiszuständen, die je nach ihrer Wahrscheinlichkeit gewichtet sind. Das Gesamt-Gewicht eines Quantenregisters kann auch Null ergeben. Die Bibliothek enthält nun nur von Null verschiedene Zustände. Der zusätzliche Speicheraufwand, der mit dem Speichern von Zustand und dem dazugehörigen Ausschlag verbunden ist, wird kompensiert durch das Weglassen all derjenigen Zustände, die gleich Null sind. Denn für einige Gatteroperationen sind Zustände mit einer Wahrscheinlichkeit von Null irrelevant.

Mein erstes Quantenprogramm

Unser erstes Programm soll ein Quantenregister initialisieren, das ein einzelnes Qubit aufnimmt. Dann soll es den Zustand des Registers anzeigen (Listing 1). Die Zustandsanzeige des Registers ist auf einem Quantenrechner eigentlich nicht möglich, weil ein Quantenzustand schließlich nicht eindeutig ist. Informationen über den Zustand eines Systems erhält man auf einem Quantenrechner aber indirekt über Messungen. Diese Messungen kann man mit seperaten Funktionen wie zum Beispiel quantum_bmeasure() vornehmen.

Listing 1: Register initialisieren und Zustand ausgeben

#include <quantum.h>
int main ()
{
  quantum_reg reg;
  reg = quantum_new_qureg(0, 1);
  quantum_print_qureg(reg);
  return 0;
}

Zur Initialisierung des Registers dient die Funktion quantum_new_qureg. Sie erwartet zwei Parameter: Der erste gibt den (klassischen) Initialisierungswert an, der zweite die Breite des Registers, also die Anzahl der Qubits. Die Ausgabe von quantum_print_qureg() gibt für jeden Basiszustand (der größer als Null ist, die gleich Null werden ja nicht gespeichert) eine Zeile aus, die aus vier Feldern besteht (Abbildung 2). Das erste Feld gibt die komplexe Amplitude des Basiszustands eines Qubits an. Die Amplitude eines Basiszustandes ist eine komplexe Zahl, die sowohl die Wahrscheinlichkeit eines Basiszustands als auch die gesamte Phaseninformation des Qubits enthält. Im zweiten Feld gibt die Funktion den Basiszustand des Qubits in der Dirac-Notation aus. In Klammern steht anschließend die Wahrscheinlichkeit in dezimaler Form. Libquantum errechnet die Wahrscheinlichkeit aus dem Betragsquadrat der Amplitude. Die Quadrierung muss erfolgen, weil die Amplitude eine komplexe Zahl ist, Wahrscheinlichkeiten aber reell und positiv sein müssen. Der letzte Teil gibt den Basiszustand des Qubits schließlich als Binärzahl an. Die Reihenfolge dieser Ausgabe ist im Verlaufe der Entwicklung gewachsen und, zugegeben, eventuell nicht unbedingt die sinnfälligste.

Die Ausgabe des Programms aus Listing 1 zeigt von links nach rechts: Die Amplitude des Basiszustands, den Basiszustand in Dirac-Notation, die Wahrscheinlichkeit des Basiszustands in Dezimalform und schließlich den Basiszustand in Binärdarstellung.

Als nächstes wird auf das initialisierte Qubit im Register eine Quantenoperation angewendet (Listing 2). In Libquantum ist jede Funktion gleich aufgebaut. Gatter repräsentieren die Quantenoperationen. Erst wird das Qubit (beziehungsweise die Qubits) angegeben, auf die das Gatter wirkt. Manche Gatter erlauben auch noch die Übergabe eines zusätzlichen Parameters wie beispielsweise eines Drehwinkels, dies ist jedoch bei dem hier gezeigten so genannten Hadamard-Gatter nicht der Fall. Das Hadamard-Gatter dient hier zur Demonstration einer Quantenoperation, weil es die für alle Quantenalgorithmen wichtige Operationen vornimmt, Superpositionen aufzubauen und Phaseninformation in Besetzungswahrscheinlichkeiten umzuwandeln. Mathematisch wirkt es wie folgt: Befindet sich das Qubit im Zustand |0>, ist der Endzustand |0>+|1>. Für ein Qubit im Zustand |1> lautet der Endzustand hingegen |0>-|1>. Wenn sich ein Qubit anfangs in einer Superposition befindet, erreicht das Gatter den Endzustand durch Addieren der beiden Anfangszustände, wobei diese mit ihrer jeweiligen Amplitude gewichtet werden. Im aktuellen Beispiel befindet sich das Qubit also im Zustand |0>+|1>, was durch die Ausgabe der Funktion quantum_print_qureg() ersichtlich wird.

Listing 2: Zustand nach einer Quantenoperation

#include <quantum.h>
int main ()
{
  quantum_reg reg;
  reg = quantum_new_qureg(0, 1);
  quantum_hadamard(0, &reg);
  quantum_print_qureg(reg);
  return 0;
}

Als letzter Parameter muss immer das Quantenregister angegeben werden. Das Hadamard-Gatter ist für alle Quantenalgorithmen sehr bedeutend, denn es kann Superpositionen aufbauen und Phaseninformation in Besetzungswahrscheinlichkeiten umwandeln. Mathematisch wirkt es wie folgt: Befindet sich das Qubit im Zustand |0>, ist der Endzustand |0>+|1>. Für ein Qubit im Zustand |1> lautet der Endzustand hingegen |0>-|1>. Wenn sich ein Qubit anfangs in einer Superposition befindet, kann der Endzustand durch einfaches Addieren der beiden Anfangszustände erreicht werden, wobei diese mit ihrer jeweiligen Amplitude gewichtet werden. Im aktuellen Beispiel befindet sich das Qubit also im Zustand |0>+|1>, was durch die Ausgabe der Funktion quantum_print_qureg() auch ersichtlich wird.

Die Zustände kriegen

Um den Zustand des Registers nun anzuzeigen, lässt man Libquantum einzelne Qubits mit der Funktion quantum_bmeasure messen (Listing 3). Der Zusatz bitpreserve sorgt dafür, dass das gemessene Qubit nicht aus dem Quantenregister entfernt wird (was bei einem einzelnen Qubit ja auch unpraktisch wäre). Die Mess-Funktion wählt unter Berücksichtigung der Besetzungswahrscheinlichkeit zufällig ein Messergebnis aus. Im Beispiel ist der Zufallszahlengenerator mit einem zeitabhängigen Wert initialisiert. Nach der Messung befindet sich das Qubit dann im zum Messergebnis passenden Zustand.

Listing 3: Messung des Zustandes an einem Qubit

#include <quantum.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>

int main ()
{
  quantum_reg reg;
  srand(time(0));
  reg = quantum_new_qureg(0, 1);
  quantum_hadamard(0, &reg);
  printf("Gemessen: %i\n", quantum_bmeasure_bitpreserve(0, &reg));
  quantum_print_qureg(reg);
  return 0;
}
Vergleich der Erfolgswahrscheinlichkeiten für den Deutsch-Jozsa-Algorithmus unter Berücksichtigung von Dekohärenz und QEC.

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Quantenrechner simulieren, Teil 1

    Die quelloffene C-Bibliothek Libquantum ermöglicht simuliertes Quantencomputing auf einem gewöhnlichen PC. Der erste Teil des zweiteiligen Artikels führt in Quantencomputing ein und endet mit einer allgemeinen Beschreibung von Libquantum. Der zweite Teil zeigt an einem Beispiel, was sich mit der Libquantum-Bibliothek anstellen lässt.

  • Quantenrechner simulieren - jetzt auch mit Hamilton

    Die C-Bibliothek Libquantum erreicht Version 1.0.0 und erhält gleichzeitig eine neue Entwicklerversion 1.1.0. Die GPL-Software hilft, quantenmechanische Systeme auf normalen Rechnern zu simulieren.

  • IBM Q: Qubits as a Service

    Für kommerzielle Zwecke will IBM in den kommenden Jahren über seine Cloud den Zugriff auf stärkere Quantencomputer anbieten. Angepeilt sind rund 50 Qubit.

  • Programmbibliothek für Quantensimulation springt auf Version 0.9.1

    Die C-Bibliothek Libquantum springt nach fast drei Jahren von Version 0.2.4 auf 0.9.1. An Bord ist ein neues API, mit dem sich quantenmechanische Zustände simulieren lassen.

  • Quantenkonferenz: "Mehr Qubits!"

    Der "Quanten-Commodore" lässt noch auf sich warten, Verschlüsselung funktioniert noch ein Weilchen, aber Fehlerkorrekturen klappen grundsätzlich: Für die rund 220 Besucher der Quanten-Konferenz unserer Kollegen von Golem.de im Berliner Zoo-Palast waren einige aufschlussreiche Vorträge dabei.

comments powered by Disqus

Ausgabe 09/2017

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.