Øvelse – opret kvantedektanglement med Q#

Fuldført

I det forrige undermodul lærte du om begrebet quantum entanglement og Bell-stater.

I denne enhed bruger du Microsoft Quantum Development Kit (QDK) til at skrive Q# kode, der skaber sammenfiltrede Bell-tilstande mellem to qubits. Hvis du vil oprette din første Bell-tilstand, skal du anvende to kvantehandlinger: Hadamard-handlingen og handlingen Controlled-NOT (CNOT).

Lad os først forstå, hvordan disse operationer fungerer, og hvorfor de skaber sammenfiltrede tilstande.

Hadamard-operationen

Husk, at Hadamard- eller H-operationen placerer en qubit, der er i en ren $\ket{0}$ tilstand eller $\ket{1}$ tilstand, i en lige superpositionstilstand.

$$ H \ket{0} = \frac1{\sqrt2} \ket{0} + \frac1{\sqrt2} \ket{1}$$ $$ H \ket{1} = \frac1{\sqrt2} \ket{0} - \frac1{\sqrt2} \ket{1}$$

Det første trin til at oprette din Bell-tilstand er at udføre en Hadamard-operation på en af qubits.

CNOT-handlingen (Controlled-NOT)

Når to qubits er viklet ind, afhænger tilstanden af en qubit af tilstanden for den anden qubit. Derfor skal man anvende en multi-qubit-operation for at sammenflette to qubits, hvilket er en operation, der virker på begge qubits samtidig. Controlled-NOT, eller CNOT, er en multi-qubit-operation, der hjælper med at skabe sammenfiltring.

CNOT-operationen tager to qubits som input. Den ene qubit er kontrolqubiten, og den anden qubit er target qubitten. Hvis kontrolqubitten er i tilstanden $\ket{1}$ , vender CNOT-operationen qubittens target tilstand. Ellers gør CNOT ingenting.

I følgende tilstande med to qubit er kontrolqubitten f.eks. qubitten længst til venstre, og qubitten target er qubitten længst til højre.

Input til CNOT Output fra CNOT
$\ket{00}$ $\ket{00}$
$\ket{01}$ $\ket{01}$
$\ket{10}$ $\ket{11}$
$\ket{11}$ $\ket{10}$

I Q#virker CNOT handlingen på en matrix med to qubits, og den vender kun den anden qubit, hvis den første qubit er One.

Entanglement med Hadamard- og CNOT-handlinger

Antag, at du har et to-qubit system i tilstanden $\ket{00}$. I denne tilstand er qubittene ikke viklet ind. For at placere disse qubits i den sammenfiltrede Bell-tilstand $\ket{\phi^+}=\frac1{\sqrt2}(\ket{00}+\ket{11})$, anvend Hadamard- og CNOT-operationerne.

Sådan fungerer det:

  1. Vælg én qubit i c-tilstanden som kontrolqubit og den anden qubit som target qubit. Her vælger vi, at qubit længst til venstre skal være kontrolelementet, og qubit længst til højre skal være .target

  2. Sæt kun kontrol-qubitten i en lige superpositionstilstand. For at gøre dette skal du kun anvende en H-handling på kontrolqubitten:

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

    Notat

    Indeksene ${}_c$ og ${}_t$ specificerer henholdsvis kontrol og target qubits.

  3. Anvend en CNOT-handling på qubit-parret. Husk, at kontrolqubitten er i en superpositionstilstand, og qubitten target er i tilstanden $\ket{0_t}$ .

Skærmbilledet viser trin-for-trin anvendelsen af en CNOT-gate på et qubit-par.

Staten $\frac{1}{\sqrt2}(\ket{0_c 0_t}+\ket{1_c 1_t})$ er sammenfiltret. Denne særlige sammenfiltrede tilstand er en af de fire Bell-tilstande, $\ket{\phi^{+}}$.

Notat

I kvantecomputere kaldes operationer ofte gates. For eksempel H-porten og CNOT-porten.

Opret kvantevikling i Q#

Hvis du vil oprette en Bell-tilstand med Q# kode, skal du følge disse trin i Visual Studio Code (VS Code):

  1. Åbn VS-kode.
  2. Åbn menuen Filer , og vælg derefter Ny tekstfil for at oprette en ny fil.
  3. Gem filen som Main.qs.

Opret en Bell-tilstand

For at skabe Bell-tilstanden $\ket{\phi^+}$ i Q#, følg disse trin:

  1. Importer Std.Diagnostics navneområdet fra Q# standardbiblioteket, så du kan bruge funktionen DumpMachine . Denne funktion viser oplysninger om qubit-tilstandene, når du kalder funktionen i din kode. Hvis du vil importere navneområdet, skal du kopiere følgende Q# kode til filen Main.qs :

    import Std.Diagnostics.*;
    
  2. Opret den Main handling, der returnerer to Result typeværdier, som er målingsresultaterne for qubits.

    import Std.Diagnostics.*;
    
    operation Main() : (Result, Result) {
        // Your code goes here
    }
    
  3. Inde i operationen Main skal du tildele to qubits, q1 der skal vikles ind, og q2.

    import Std.Diagnostics.*;
    
    operation Main() : (Result, Result) {
        use (q1, q2) = (Qubit(), Qubit());
    }
    
  4. Anvend Hadamard-porten, H, på kontrol-qubit'en,q1. Dette sætter kun den qubit i en superpositionstilstand. Anvend derefter CNOT-porten, CNOT, på begge qubits for at vikle de to qubits. Det første argument er CNOT kontrol-qubitten, og det andet argument er qubitten target .

    import Std.Diagnostics.*; 
    
    operation Main() : (Result, Result) {
        use (q1, q2) = (Qubit(), Qubit());
    
        H(q1);
        CNOT(q1, q2);
    }
    
  5. Brug DumpMachine funktionen til at få vist tilstanden af qubits, når du har viklet dem ind. Bemærk, at DumpMachine der ikke udføres en måling på qubits, så DumpMachine det påvirker ikke qubit-tilstandene.

    import Std.Diagnostics.*;
    
    operation Main() : (Result, Result) {
        use (q1, q2) = (Qubit(), Qubit());
    
        H(q1);
        CNOT(q1, q2);
    
        DumpMachine();
    }
    
  6. Brug operationen M til at måle qubits, og gem resultaterne i m1 og m2. Brug derefter handlingen Reset til at nulstille qubits.

    import Std.Diagnostics.*;
    
    operation Main() : (Result, Result) {
    
        use (q1, q2) = (Qubit(), Qubit());
    
        H(q1);
        CNOT(q1, q2);
        DumpMachine();
    
        let (m1, m2) = (M(q1), M(q2));
        Reset(q1);
        Reset(q2);
    
    }
    
  7. Returner måleresultaterne for qubitsene med sætningen return . Her er det endelige program i din Main.qs-fil :

    import Std.Diagnostics.*;
    
    operation Main() : (Result, Result) {
        use (q1, q2) = (Qubit(), Qubit());
    
        H(q1);
        CNOT(q1, q2);
    
        DumpMachine();
    
        let (m1, m2) = (M(q1), M(q2));
        Reset(q1);
        Reset(q2);
    
        return (m1, m2);
    }
    
  8. For at køre dit program på den indbyggede simulator skal du vælge Kør kodelinsen over handlingen Main eller trykke på Ctrl + F5. Dit output vises i fejlfindingskonsollen.

  9. Måleresultaterne er korreleret, så i slutningen af programmet får du et resultat af (Zero, Zero) eller (One, One) med samme sandsynlighed. Kør programmet igen flere gange, og observer outputtet for at overbevise dig selv om sammenhængen.

  10. For at visualisere kredsløbsdiagrammet skal du vælge kredsløbskodelinsen over operationen.Main Kredsløbsdiagrammet viser Hadamard-porten, der anvendes på den første qubit, og CNOT-porten, der anvendes på begge qubits.

    Skærmbillede af det kredsløb, der opretter Bell-tilstanden.

Opret andre klokketilstande

For at skabe andre Bell-tilstande skal der anvendes yderligere Pauli- $X$ eller $Z$ operationer på qubits.

For eksempel, for at skabe Bell-tilstanden $\ket{\phi^-}=\frac1{\sqrt2}(\ket{00}-\ket{11})$, skal Pauli-operationen $Z$ anvendes på kontrolqubitten efter du har anvendt Hadamard-porten, men før du anvender CNOT. Operationen $Z$ vender tilstanden $\ket{+}$ til $\ket{-}$.

Notat

Tilstandene $\frac{1}{\sqrt{2}}(\ket{0}+\ket{1})$ og $\frac{1}{\sqrt{2}}(\ket{0} - \ket{1})$ er også kendt som $\ket{+}$ henholdsvis og $\ket{-}$.

Sådan opretter $\ket{\phi^-}$ du staten:

  1. Opret to qubits i tilstanden $\ket{00}$.

  2. Sæt kontrolqubitten i en superpositionstilstand med operationen $H$ :

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

  3. Anvend operationen $Z$ på kontrolqubitten.

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

  4. Anvend CNOT-operationen på kontrolqubitten og qubitten target , som er i tilstanden $\ket{0_t}$ .

    Skærmbilledet viser den algebraiske afledning af at anvende en CNOT-port på en kontrolqubit i superposition.

For at oprette Bell-tilstanden $\ket{\phi^-}$ i Q#, erstatter du koden i din Main.qs med følgende kode:

import Std.Diagnostics.*;
    
operation Main() : (Result, Result) {
    use (q1, q2) = (Qubit(), Qubit());
    
    H(q1);
    Z(q1); // Apply the Pauli Z operation to the control qubit
    CNOT(q1, q2);
    
    DumpMachine();
    
    let (m1, m2) = (M(q1), M(q2));
    Reset(q1);
    Reset(q2);

    return (m1, m2);
}

På samme måde kan du skabe Bell-tilstandene $\ket{\psi^+}$ and $\ket{\psi^-}$ ved at anvende Pauli- $X$ og $Z$ operationerne på qubits.

  • For at skabe Bell-tilstanden $\ket{\psi^+}=\frac1{\sqrt2}(\ket{01}+\ket{10})$skal du anvende Pauli-porten $X$ på qubitten, target efter du har anvendt Hadamard-porten på kontrolqubitten. Anvend derefter CNOT-porten.
  • For at skabe Bell-tilstanden $\ket{\psi^-}=\frac1{\sqrt2}(\ket{01}-\ket{10})$skal du anvende Pauli $Z$ på kontrolqubitten og Pauli $X$ på qubitten, target efter du har anvendt Hadamard-porten på kontrolqubitten. Anvend derefter CNOT-porten.

I den næste enhed lærer du, hvordan du bruger sammenfiltring til at sende kvanteinformation, en proces kendt som kvanteteleportation.