Øvelse – opret kvantedektanglement med Q#
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:
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
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.
Anvend en CNOT-handling på qubit-parret. Husk, at kontrolqubitten er i en superpositionstilstand, og qubitten target er i tilstanden $\ket{0_t}$ .
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):
- Åbn VS-kode.
- Åbn menuen Filer , og vælg derefter Ny tekstfil for at oprette en ny fil.
- Gem filen som Main.qs.
Opret en Bell-tilstand
For at skabe Bell-tilstanden $\ket{\phi^+}$ i Q#, følg disse trin:
Importer
Std.Diagnosticsnavneområdet fra Q# standardbiblioteket, så du kan bruge funktionenDumpMachine. 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.*;Opret den
Mainhandling, der returnerer toResulttypeværdier, som er målingsresultaterne for qubits.import Std.Diagnostics.*; operation Main() : (Result, Result) { // Your code goes here }Inde i operationen
Mainskal du tildele to qubits,q1der skal vikles ind, ogq2.import Std.Diagnostics.*; operation Main() : (Result, Result) { use (q1, q2) = (Qubit(), Qubit()); }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 erCNOTkontrol-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); }Brug
DumpMachinefunktionen til at få vist tilstanden af qubits, når du har viklet dem ind. Bemærk, atDumpMachineder ikke udføres en måling på qubits, såDumpMachinedet påvirker ikke qubit-tilstandene.import Std.Diagnostics.*; operation Main() : (Result, Result) { use (q1, q2) = (Qubit(), Qubit()); H(q1); CNOT(q1, q2); DumpMachine(); }Brug operationen
Mtil at måle qubits, og gem resultaterne im1ogm2. Brug derefter handlingenResettil 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); }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); }For at køre dit program på den indbyggede simulator skal du vælge Kør kodelinsen over handlingen
Maineller trykke på Ctrl + F5. Dit output vises i fejlfindingskonsollen.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.For at visualisere kredsløbsdiagrammet skal du vælge kredsløbskodelinsen over operationen.
MainKredsløbsdiagrammet viser Hadamard-porten, der anvendes på den første qubit, og CNOT-porten, der anvendes på begge qubits.
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:
Opret to qubits i tilstanden $\ket{00}$.
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}$$
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}$$
Anvend CNOT-operationen på kontrolqubitten og qubitten target , som er i tilstanden $\ket{0_t}$ .
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.