Funktionsaufruf und Oracle
 

Um die Berechnung einer Funktion als "Bauteil", der Quantenzustände in Quantenzustände überführt, in einen Quantencomputer einzubauen, müssen wir mehrere quantenmechanische Systeme betrachten, die aus mehreren Qubits bestehen. Für den einfachen Fall einer Funktion
f : {0, 1} –® {0, 1}
benötigen wir ein 2-Qubit-System. Für jede Funktion f : {0, 1} –® {0, 1} definieren wir die Operation Uf  durch
    Uf  |m> |n>  =  |m> |n + f(m)>    
wobei m und n die Werte 0 und 1 annehmen können und das Plus-Zeichen "Addition modulo 2" (also insbesondere 1 + 1 = 0) bedeutet. Da der resultierende Zustand im zweiten Register vom Ausgangszustand beider Register abhängt, handelt es sich hier um einen Prozess, der, physikalisch gesprochen, eine Wechselwirkung zwischen den beiden Registern (Qubits) darstellt.

Berechnen wir als Beispiel die Wirkung von Uf  für die konstante Funktion
f(0) = 1        f(1) = 1.
Wir finden leicht
Uf  |0>|0>  =  |0>|1> Uf  |0>|1>  =  |0>|0>
Uf  |1>|0>  =  |1>|1> Uf  |1>|1>  =  |1>|0>
Der Zustand im ersten Register bleibt immer unverändert. Haben wir es mit einer Superposition zu tun, so werden diese Formeln linear kombiniert. Beispielsweise ist
Uf  ( |0>|0> + |1>|0> )  =  |0>|1> + |1>|1>
Die Wirkung der Transformation Uf  auf den Zustand |0>|0> + |1>|0> wollen wir in folgender interaktiver Form darstellen:
 
Register 1 Register 2    
¯ ¯    
           ..|............ .............|............ ...............    |y> =
Uf  
   
           ..|............ .............|............ ...............    |y> =
Anklicken der Checkbox schaltet diesen Bauteil ein. Im vorliegenden Beispiel wird das zweite Register vor dem Funktionsaufruf im Zustand |0>, das erste Register in der Superposition |0> + |1> sein. Nach der Anwendung des Funktionsaufrufs ist |y> = |0>|1> + |1>|1>, was auch als
|y> = |0>|f(0)> + |1>|f(1)>
geschrieben werden kann. (Das gilt für jede Funktion f : {0, 1} –® {0, 1}, wie aus der obigen Definition von Uf  folgt). Hier liegt also ein Zustand vor, in dem alle Paare (m, f(m)), d.h. alle möglichen Funktionswerte ("gleichzeitig") enthalten sind!  Die Gesetze der Quantenphysik verbieten uns allerdings, sie alle mit Sicherheit "abzulesen", sofern wir nur eine einzige Kopie des Systems in diesem Zustand zur Verfügung haben (siehe Interpretation und Messung).

Der durch Uf  dargestellte Bauteil läßt sich für jede der vier Funktionen f : {0, 1} –® {0, 1} durch eine geeignete Hintereinanderschaltung von NOT-Gates und kontrollierten NOT-Gates realisieren. Wir illustrieren das in interaktiven Modellen anhand des Input-Zustands |y> = |0>|0> + |1>|0>:

Funktionsaufrufe dieses Typs finden bei der Konzeption von Quantencomputern in zweierlei Hinsicht Verwendung:
  • Als Aufruf eines (bekannten) "Unterprogramms" zur Berechnung einer Funktion: In diesem Fall dient der Bauteil einfach als "Abkürzung" für einen Unter-Schaltplan, um dessen Details man sich nicht zu kümmern braucht.
     
  • Als "Oracle": Das ist für grundsätzliche Überlegungen über Quantencomputer besonders wichtig. Ein "Oracle" ist ein Unterprogramm zur Berechnung einer Funktion, aber mit der zusätzlichen Spielregel, dass es uns ohne Kommentar überreicht wird und wir zunächst nicht wissen, welche Funktion es darstellt. Die einzige Möglichkeit, darüber etwas herauszufinden, besteht darin, es "aufzurufen", d.h. Zustände "hineinzuschicken", weiterzuverarbeiten und schließlich Messungen zu machen.
     
    Wie wir gesehen haben, ist es möglich, durch einen einzigen Aufruf einen Quantenzustand zu erhalten, in dem Informationen über alle Funktionswerte enthalten sind. So etwas gibt es in "klassischen" Computern natürlich nicht.

Theoretische Nachbemerkung über den Grund, warum wir zur Darstellung von Funktionen zwei Register benötigt haben:

Die Operation Uf  ist eine unitäre Transformation, weil sie eine (Orthonormal-)Basis in eine (Orthonormal-)Basis überführt (und daher eine Quantenzustand in einen Quantenzustand). Eine (Orthonormal-)Basis für das 2-Qubit-System ist durch
{|0>|0>,  |0>|1>,  |1>|0>,  |1>|1>}
gegeben. Die Wirkung von Uf  besteht lediglich darin, diese Basiselemente zu permutieren.
Der vielleicht zunächst naheliegendere Ansatz, eine Funktion als Operation
|0>® |f(0)>              |1>® |f(1)>
in einem einzigen Register darzustellen, führt nicht immer auf eine unitäre Transformation. Etwa für die konstante Funktion f(0) = f(1) = 1 hieße das ja
|0>® |1>              |1>® |1>.
Als Folge würde die Superposition |0> - |1> auf 0 abgebildet werden, und 0 (nicht zu verwechseln mit |0>) ist kein quantenmechanisch interpretierbarer Zustand.
Streben wir also eine Konstruktion an,
  • die sich für alle Funktionen eignet,
  • als Input jeden (normierten) Quantenzustand entgegennimmt und
  • als Output immer einen (normierten) Quantenzustand liefert,
so muss unser Quantencomputer aus (zumindest) zwei Registern bestehen.

All das lässt sich auf Funktionen zwischen beliebigen (endlichen) Zahlenmengen verallgemeinern, wobei die Zahl der zu verwendenden Register entsprechend groß gewählt werden muss.