Die Quantenprogrammiersprache Q#

Alles, was Sie über die Programmiersprache Q# wissen müssen, finden Sie im Q#-Sprachführer. Die Entwicklung der Sprache erfolgt wie das gesamte Projekt auf Open-Source-Basis, und wir freuen uns über Beiträge. Weitere Hintergrundinformationen zu den Grundlagen und dem Zweck von Q# finden Sie unter Why do we need Q#? (Warum benötigen wir Q#?, in englischer Sprache).
Q# wird zusammen mit dem Quantum Development Kit (QDK) bereitgestellt. Eine kurze Übersicht finden Sie unter Was sind die Programmiersprache Q# und das Quantum Development Kit (QDK)?.

Was ist ein Quantenprogramm?

Ein Quantenprogramm kann als spezieller Satz klassischer Unterroutinen betrachtet werden, die eine Berechnung durchführen, indem sie mit einem Quantensystem interagieren. Ein in Q# geschriebenes Programm modelliert nicht direkt den Quantenzustand, sondern beschreibt, wie ein klassischer Computer mit Qubits interagiert. Dies ermöglicht vollkommene Unabhängigkeit vom tatsächlichen Quantenzustand auf den jeweiligen Zielcomputern, der je nach Computer unterschiedlich interpretiert werden kann.

Eine wichtige Folge davon ist, dass für Q# der Zustand eines Qubits oder andere Eigenschaften der Quantenmechanik nicht direkt ersichtlich sind. Dies gewährleistet, dass ein Q#-Programm physisch auf einem Quantencomputer ausgeführt werden kann. Stattdessen kann ein Programm Operationen aufrufen, z. B.Measure, um klassische Informationen aus einem Qubit zu extrahieren.

Nach der Zuordnung kann ein Qubit an Operationen und Funktionen übergeben werden, die auch als Callables (aufrufbare Operationen/Funktionen) bezeichnet werden. Gewissermaßen ist dies alles, was ein Q#-Programm mit einem Qubit ausführen kann. Alle direkten Aktionen für den Zustand eines Qubits werden durch systeminterne Callables, z. B. X und H, definiert, d. h. Callables, deren Implementierungen nicht in Q#, sondern vom Zielcomputer definiert werden. Was diese Operationen tatsächlich ausführen, hängt von dem Zielcomputer ab, auf dem das jeweilige Q#-Programm ausgeführt wird.

Wenn Sie das Programm beispielsweise auf unserem Simulator für den vollständigen Zustand ausführen, führt dieser die entsprechenden mathematischen Operationen für das simulierte Quantensystem aus. Wenn es sich bei dem Zielcomputer jedoch um einen echten (zukünftigen) Quantencomputer handelt, wird dieser durch den Aufruf solcher Operationen in Q# angewiesen, die entsprechenden tatsächlichen Operationen für das tatsächliche Quantensystem auszuführen (z. B. exakt getaktete Laserpulse).

Ein Q#-Programm kombiniert diese Operationen gemäß der Definition durch den Zielcomputer zu allgemeineren Operationen für die Quantenberechnung. Auf diese Weise erleichtert Q# das Ausdrücken der Logik, die Quantenalgorithmen und hybriden quantenklassischen Algorithmen zugrunde liegt, und ist gleichzeitig allgemein in Bezug auf die Struktur eines Zielcomputers oder Simulators.

Ein einfaches Beispiel ist das folgende Programm, das ein Qubit im Zustand $\ket{0}$ zuordnet, dann die Hadamard-Transformation H auf es anwendet und das Ergebnis in der PauliZ-Basis berechnet.

@EntryPoint()
operation MeasureOneQubit() : Result {
    // The following using block creates a fresh qubit and initializes it
    // in the |0〉 state.
    use qubit = Qubit();
    // We apply a Hadamard operation H to the state, thereby preparing the
    // state 1 / sqrt(2) (|0〉 + |1〉).
    H(qubit);
    // Now we measure the qubit in Z-basis.
    let result = M(qubit);
    // As the qubit is now in an eigenstate of the measurement operator,
    // we reset the qubit before releasing it.
    if result == One { X(qubit); }
    // Finally, we return the result of the measurement.
    return result;
    
}

Unsere Quanten-Katas bieten eine gute Einführung in Konzepte des Quantencomputings, z. B. allgemeine Quantenoperationen und das Bearbeiten von Qubits. Weitere Beispiele finden Sie unter Systeminterne Operationen und Funktionen.