Quantenverschränkung mit Q# erzeugen

Abgeschlossen

Jetzt erstellen wir einige Quantenverschränkungen mithilfe von Q# und Azure Quantum Development Kit.

Der Controlled-NOT-Vorgang (CNOT)

Wenn zwei Qubits verschränkt werden, hängt der Zustand eines Qubits vom Zustand des anderen Qubits ab. Um zwei Qubits zu verschränken, benötigen Sie daher einen Vorgang, der auf beide Qubits gleichzeitig wirkt. Dies wird als Multiqubit-Vorgang oder Gate bezeichnet.

Um eine Quantenverschränkung zu erstellen, benötigen Sie den Multiqubit-Vorgang CNOT, der für Controlled-NOT steht. Bei diesem Vorgang werden zwei Qubits als Eingabe verwendet, eine fungiert als Steuerungsqubit und das andere ist der target Qubit. Der CNOT-Gate schaltet den Zustand des zweiten Qubits (des target-Qubits) ausschließlich dann um, wenn der Zustand des ersten Qubits (des Steuerungsqubits) $|1\rangle$ lautet.

Eingabe Ausgabe
$\ket{00}$ $\ket{00}$
$\ket{01}$ $\ket{01}$
$\ket{10}$ $\ket{11}$
$\ket{11}$ $\ket{10}$

In Q# wirkt der CNOT Vorgang auf ein Array von zwei Qubits, und er schaltet den zweiten Qubit um, wenn der erste Qubit One ist.

Verschränkung mit einem CNOT-Vorgang

Durch Anwenden des H Vorgangs und des CNOT Vorgangs können Sie zwei Qubits im Zustand $|00\rangle$ in den Bell-Zustand $\ket{\phi^+}=\frac1{\sqrt2}(|00\rangle+|11\rangle)$ transformieren.

So funktioniert es:

  1. Nehmen Sie zum Beispiel zwei Qubits mit dem Zustand $|00\rangle$. Der erste Qubit ist der Steuerungsqubit und der zweite Qubit ist der target Qubit.

  2. Erstellen Sie durch Anwenden von $$H$ ein Superpositionszustand nur im Steuerungsqubit vor.

    $$H |0_c\rangle=\frac{1}{\sqrt{{2}}(|0_c\rangle+|1_c\rangle)$$

    Hinweis

    Die Indizes ${}_c$ and ${}_t$ geben die Steuerungs- und die target-Qubits an.

  3. Wenden Sie den $CNOT-Operator$ auf das Steuerungsqubit an, das sich in einem Superpositionszustand befindet, und den target-Qubit, der sich im Zustand $|0_t\rangle$ befindet.

    $$ CNOT \frac{1}{\sqrt{2}}(\ket{0_c}+\ket{1_c})\ket{0}_t = CNOT \frac{1}{\sqrt2}(\ket{0_c 0_t}+|\ket{1_c 0_t})=$$$$=\frac{{1}{\sqrt2}(CNOT \ket{0_c 0_t} + CNOT \ket{1_c 0_t})=$$$$=\frac{1}{\sqrt2}(\ket{0_c 0_t}+\ket{1_c 1_t})$$

Erstellen und Messen der Bell-Zustände mithilfe von Q#

  1. Öffnen Sie Visual Studio Code.
  2. Wählen Sie Datei> Neue Textdatei speichern aus, und speichern Sie sie unter Entanglement.qs.
  3. Wählen Sie Ansicht -> Befehlspalette und Typ Q# aus: Legen Sie das Azure Quantum QIRtarget Profil fest. Drücken Sie die EINGABETASTE.
  4. Wählen Sie Q#: Nicht eingeschränkt.

Erstellen des Bell-Zustands $\ket{\phi^+}$

Beginnen wir mit dem Erstellen des Bell-Zustands $\ket{\phi^+}=\frac1{\sqrt2}(|00\rangle+|11\rangle)$.

  1. Kopieren Sie den folgenden Q# Code, und fügen Sie ihn in die Entanglement.qs Datei ein.

    namespace Entanglement {
        open Microsoft.Quantum.Diagnostics;
    
        @EntryPoint()
        operation EntangleQubits() : (Result, Result) {
            // Allocate the two qubits that will be entangled.
            use (q1, q2) = (Qubit(), Qubit());
    
            // Set the first qubit in superposition by calling the `H` operation,
            // which applies a Hadamard transformation to the qubit.
            // Then, entangle the two qubits using the `CNOT` operation.
            H(q1);
            CNOT(q1, q2);
    
            // Show the entangled state using the `DumpMachine` function.
            DumpMachine();
    
            // Measurements of entangled qubits are always correlated.
            let (m1, m2) = (M(q1), M(q2));
            Reset(q1);
            Reset(q2);
            return (m1, m2);
        }
    }
    
  2. Wenn Sie Ihr Programm lokal im integrierten Simulator ausführen möchten, klicken Sie auf Ausführen in der Liste der Befehle unter @EntryPoint() oder drücken Sie STRG+F5. Die Ausgabe wird in der Debugkonsole angezeigt.

    Screenshot von VS Code, der zeigt, wie eine Q# Datei mit den Codelens unter Einstiegspunkt ausgeführt wird.

  3. Die Messergebnisse werden korreliert, sodass Sie am Ende des Programms ein Ergebnis von (Zero, Zero) oder (One, One) mit gleicher Wahrscheinlichkeit erhalten.

  4. Sie können das Schaltungsdiagramm visualisieren, indem Sie auf Schaltung in der Liste der Befehle unter @EntryPoint() klicken. Das Schaltungsdiagramm zeigt das Hadamard-Gate, das auf das erste Qubit angewendet wird, und das CNOT-Gate, das auf beide Qubits angewendet wird.

    Screenshot der Schaltung des Bell-Zustands.

Erstellen des Bell-Zustands $\ket{\phi^-}$

Um weitere Bell-Zustände zu erstellen, müssen Sie zusätzliche Pauli $X$- und $Z$-Vorgänge auf die Qubits anwenden.

Um z. B. den Bell-Zustand $\ket{\phi^-}=\frac1{\sqrt2}(|00-11\rangle|\rangle)$ zu erstellen, können Sie den Pauli $Z-Vorgang$ auf das Steuerungsqubit anwenden, nachdem das Hadamard-Gate angewendet wurde. Der $Z-Vorgang$ schaltet den Zustand $\ket{+}$ in $\ket{-}$ um.

Hinweis

Die Zustände $\frac{{1}{\sqrt{2}}(|0\rangle+|1\rangle)$ und $\frac{1}{\sqrt{{2}}(|0\rangle -|1\rangle)$ werden auch als $\ket{+}$ bzw $\ket{{-}$ bezeichnet.

So funktioniert es:

  1. Nehmen Sie zum Beispiel zwei Qubits mit dem Zustand $|00\rangle$.

  2. Erstellen Sie durch Anwenden von $$H$ ein Superpositionszustand nur im Steuerungsqubit vor.

    $$H |0_c\rangle=\frac{{1}{\sqrt{2}}(|0_c\rangle+|1_c\rangle) =\ket{+}_c$$

  3. Wenden Sie den $Z-Vorgang$ auf das Steuerungsqubit an.

    $$Z \frac{{1}{\sqrt{{2}}(|0_c\rangle+|1_c\rangle)=\frac{1}{\sqrt{{2}}(|0_c\rangle-|1_c\rangle)=\ket{{-}_c$$

  4. Wenden Sie den $CNOT-Operator$ auf das Steuerungsqubit und den target Qubit an, der sich im Zustand $|0_t\rangle$ befindet.

    $$ CNOT \frac{1}{\sqrt{2}}(\ket{0_c}-\ket{1_c})\ket{0}_t = CNOT \frac{1}{\sqrt2}(\ket{0_c 0_t}-|\ket{1_c 0_t})=$$$$=\frac{{1}{\sqrt2}(CNOT \ket{0_c 0_t} - CNOT \ket{1_c 0_t})=$$$$=\frac{1}{\sqrt2}(\ket{0_c 0_t}-\ket{1_c 1_t})$$

Ändern Sie den Q# Code, um den Bell-Zustand $\ket{\phi^-}$ zu erstellen. Führen Sie das Programm aus, um den verschränkten Zustand und das Schaltungsdiagramm anzuzeigen.

namespace Entanglement {
    open Microsoft.Quantum.Diagnostics;

    @EntryPoint()
    operation EntangleQubits() : (Result, Result) {
        // Allocate the two qubits that will be entangled.
        use (q1, q2) = (Qubit(), Qubit());

        // Set the first qubit in superposition by calling the `H` operation,
        // which applies a Hadamard transformation to the qubit.
        // Then, entangle the two qubits using the `CNOT` operation.
        H(q1);
        Z(q1); // Apply the Pauli Z operation to the control qubit
        CNOT(q1, q2);

        // Show the entangled state using the `DumpMachine` function.
        DumpMachine();

        // Measurements of entangled qubits are always correlated.
        let (m1, m2) = (M(q1), M(q2));
        Reset(q1);
        Reset(q2);
        return (m1, m2);
    }
}

Zusätzliche Übung: Erstellen Sie die Bell-Zustände $\ket{\psi^+}$ und $\ket{\psi^-}$

Ebenso können Bell-Zustände $\ket{\psi^+}$ und $\ket{\psi^-}$ erstellt werden, indem die Pauli $X$- und $Z-Vorgänge$ auf die Qubits angewendet werden.

  • Der Bell-Zustand $\ket{\psi^+}=\frac1{\sqrt2}(|01\rangle+|10\rangle)$ kann erstellt werden, indem der Pauli $X-Vorgang$ auf das target Qubit angewendet wird, nachdem das Hadamard-Gate angewendet wurde.
  • Der Bell-Zustand $\ket{\psi^-}=\frac1{\sqrt2}(|01-10\rangle\rangle|)$ kann erstellt werden, indem das Pauli $Z$ auf das Steuerungsqubit und das Pauli $X$ auf den target Qubit angewendet werden, nachdem das Hadamard-Gate angewendet wurde.

Ändern Sie das Programm Entanglement.qs, um die Bell-Zustände $\ket{\psi^+}$ und $\ket{\psi^-}$ zu erstellen.