Cvičení – vytvoření různých stavů superpozice pomocí Q#

Dokončeno

V předchozích lekcích jste se dozvěděli o superpozici a zápisu Dirac. To je teď dost teorie! Pojďme napsat nějaký kód pro prozkoumání superpozice v Q#.

V této lekci vytvoříte v Q# kvantové stavy superpozice a prozkoumáte roli pravděpodobnosti ve výsledku měření. Pomocí DumpMachine funkce v jazyce Q# také prozkoumáte, jak se stav systému mění během kvantového výpočtu.

Vytvoření nového souboru Q#

  1. Otevřete Visual Studio Code (VS Code).
  2. Otevřete nabídku Soubor a potom zvolte Nový textový soubor a vytvořte nový soubor.
  3. Uložte soubor jako Main.qs.

Začínáme se superpozicí

Začněme jednoduchým programem Q#, který používá qubit ve stavu superpozice k vygenerování náhodné bitové hodnoty 0 nebo 1. V našem kódu použijeme DumpMachine funkci k zobrazení stavu qubitu v různých bodech programu.

  1. Zkopírujte a vložte následující kód do souboru Main.qs :

    import Std.Diagnostics.*;
    
    operation Main() : Result {
        use q = Qubit();
        Message("Initialized qubit:");
        DumpMachine(); // First dump
        Message(" ");
        H(q);
        Message("Qubit after applying H:");
        DumpMachine(); // Second dump
        Message(" ");
        let randomBit = M(q);
        Message("Qubit after the measurement:");
        DumpMachine(); // Third dump
        Message(" ");
        Reset(q);
        Message("Qubit after resetting:");
        DumpMachine(); // Fourth dump
        Message(" ");
        return randomBit;
    }
    
  2. Pokud chcete program spustit na integrovaném simulátoru, zvolte čočku Run kódu nad Main operací nebo stiskněte Ctrl + F5. Výstup se zobrazí v konzole ladění.

  3. Prozkoumejte konzolu ladění a vyhledejte výsledek měření, buď Zero nebo One.

Funkce DumpMachine vytvoří tabulku informací, která popisuje stav kvantového systému, což je v tomto případě jeden qubit. Informace z DumpMachine zahrnují amplitudu pravděpodobnosti, pravděpodobnost měření a fázi v radiánech pro každý základní stav.

Kód volá DumpMachine funkci čtyřikrát:

  • Po přidělení qubitu
  • Po vložení qubitu do stavu superpozice
  • Po měření stavu qubitu
  • Po resetování qubitu

Pojďme se podívat na výstup každého volání DumpMachine:

  • Inicializovaný qubit: Když přidělíte qubit s příkazem use , qubit se vždy spustí ve stavu $|0\rangle$.

    Initialized qubit:
    
     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
       |0⟩ |  1.0000+0.0000𝑖 |   100.0000% |   0.0000
    
  • Qubit po aplikaci H: Po aplikaci operace H je qubit ve stavu rovnovážné superpozice, $|\psi\rangle=\frac1{\sqrt2} |0\rangle + \frac1{\sqrt2} |1\rangle$.

    Qubit after applying H:
    
     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
       |0⟩ |  0.7071+0.0000𝑖 |    50.0000% |   0.0000
       |1⟩ |  0.7071+0.0000𝑖 |    50.0000% |   0.0000
    
    
  • Qubit po měření: Po měření qubitu je výsledek buď Zero nebo Onea qubit je plně ve stavu, který jste změřili.

    Qubit after the measurement:
    
     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
       |1⟩ |  1.0000+0.0000𝑖 |   100.0000% |   0.0000
    

    Poznámka:

    Výstup po DumpMachine měření se může lišit od ukázkového výstupu, protože máte 50% šanci změřit každý stav. Pravděpodobnosti výsledků jsou deterministické, ale výsledek individuálního měření není.

  • Qubit po resetování: Operace Reset resetuje qubit do stavu $|0\rúhel$, aby se mohl znovu použít pro budoucí výpočty.

    Qubit after resetting:
    
     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
       |0⟩ |  1.0000+0.0000𝑖 |   100.0000% |   0.0000
    

Prozkoumání dalších stavů superpozice

Teď, když víte, jak zkontrolovat stav qubitového systému pomocí DumpMachine, pojďme prozkoumat další operace, které systém umístí do různých druhů stavů superpozice.

Aktuální generátor náhodných bitů vytvoří buď Zero nebo One s 50% pravděpodobností. V dalším příkladu se pravděpodobnosti nerovnají.

Asymetrický generátor náhodných bitů

Předpokládejme, že chcete vytvořit generátor náhodných bitů, který se zkosí, což znamená, že pravděpodobnost získání Zero se liší od pravděpodobnosti získání One.

Chcete například výsledek Zero s pravděpodobností $P$ a výsledek One s pravděpodobností $1 – P$. Tady je platný stav qubitu, který vytváří takový generátor náhodných bitů:

$$|\psi\rangle=\sqrt{P}|0\rangle+\sqrt{1 - P}|1\rangle$$

Pro tento stav $|\psi\rangle$, $\alpha=\sqrt{P}$ a $\beta=\sqrt{1 – P}$ jsou amplitudy pravděpodobnosti základního stavu $|0\rúhlu$ a $|1\rúhlu$.

Chcete-li získat tento stav, můžete postupně použít operátor $R_y(2\cos^{-1}\sqrt{P})$ na qubit, který začíná ve stavu $|0\rúhel$. K dosažení tohoto výsledku v jazyce Q# použijte standardní knihovnu Ry .

Tip

Další informace o matematice za operacemi s jedním qubitem si prohlédněte v kurzu Jednobitové brány v Quantum Katas.

Pokud chcete vytvořit nerovnoměrný stav superpozice v jazyce Q#, postupujte takto:

  1. Nahraďte veškerý kód v souboru Main.qs následujícím příkladem a pak soubor uložte. Tento příklad zvolí $\alpha$ tak, aby byl přibližně $\frac13$.

    import Std.Diagnostics.*;
    import Std.Math.*;
    
    operation Main() : Result {
        use q = Qubit();
        let P = 0.333333; // P is 1/3
        Ry(2.0 * ArcCos(Sqrt(P)), q);
        Message("The qubit is in the desired state.");
        DumpMachine(); // Dump the state of the qubit 
        Message("Your skewed random bit is:");
        let skewedrandomBit = M(q);
        Reset(q);
        return skewedrandomBit;
    }
    
  2. Pokud chcete program spustit na integrovaném simulátoru, zvolte Run nad operací Main nebo stiskněte Ctrl + F5. Výstup se zobrazí v konzole ladění.

  3. Prozkoumejte výstup DumpMachine a výsledek měření. Výstup je například podobný následujícímu:

    The qubit is in the desired state.
    
     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
       |0⟩ |  0.5773+0.0000𝑖 |    33.3333% |   0.0000
       |1⟩ |  0.8165+0.0000𝑖 |    66.6667% |   0.0000
    
    Your skewed random bit is:
    
    One
    

Všimněte si, že pravděpodobnost výsledku Zero měření je přibližně 33,33% a pravděpodobnost One výsledku je přibližně 66,67%. Tento generátor náhodných bitů je posunutý směrem k One.

Poznámka:

Výstup výsledku měření se může lišit od ukázkového výstupu, protože generátor náhodných bitů je pravděpodobnostní. Pravděpodobnosti výsledků jsou deterministické, ale výsledek individuálního měření není.

Superpozice více qubitů

Zatím jsme se zabývali pouze systémy s jedním qubitem. Dobrý kvantový počítač ale k provádění užitečných výpočtů potřebuje hodně qubitů. Jak kvantové stavy a superpozice fungují, když má náš systém více než jeden qubit?

Představte si například systém tří qubitů. Každý qubit může mít při měření hodnotu 0 nebo 1, takže existuje osm možných stavů, ve kterých můžete systém najít:

$$|000\rangle,|001\rangle,|010\rangle,|011\rangle,|100\rangle,|101\rangle,|110\rangle,|111\rangle$$

Tento systém může mít osm možných stavů, protože každý qubit může být při měření buď 0, nebo 1. Obecně platí, že počet možných stavů se rovná $2^n$, kde $n$ je počet qubitů.

Stejně jako u jednoho qubitu je libovolný stav superpozice pro 3 qubitový systém reprezentován jako vážený součet těchto osmi stavů, kde váhy jsou amplitudy pravděpodobnosti:

$$|\psi\rangle=\alpha_0|000\rangle+\alpha_1|001\rangle+\alpha_2|010\rangle+\alpha_3|011\rangle+\alpha_4|100\rangle+\alpha_5|101\rangle+\alpha_6|110\rangle+\alpha_7|111\rangle$$

Amplitudy $\alpha_i$ jsou opět komplexní čísla, která splňují podmínku $\sum\limits_{i=0}^{i=7}|\alpha_i|^2=1$.

Qubity můžete například umístit do jednotné superpozice použitím H u každého qubitu. Tuto jednotnou superpozici pak můžete použít k vytvoření kvantového generátoru náhodných čísel, který místo jednobitových čísel generuje trojbitová čísla:

Základní stav Počet
$\ket{000}$ 0
$\ket{001}$ 4
$\ket{010}$ 2
$\ket{011}$ 6
$\ket{100}$ 1
$\ket{101}$ 5
$\ket{110}$ 3
$\ket{111}$ 7

Poznámka:

Standardním způsobem zápisu bitových řetězců je mít nejmenší číslici vpravo a největší číslici vlevo, stejně jako u běžných desetinných čísel. V Q# (a mnoha dalších kvantových programovacích jazycích) je pořadí obrácené, takže nejmenší číslice je vlevo a největší číslice je vpravo. DumpMachine Vzhledem k tomu, že funkce zobrazuje kvantové stavy ve standardním pořadí, desetinná celá čísla odpovídající stavům nejsou seřazena postupně od 0 do $n-1$.

Chcete-li vytvořit tento druh generátoru náhodných čísel, postupujte takto:

  1. Nahraďte kód v Main.qs následujícím příkladem a pak soubor uložte:

    import Std.Diagnostics.*;
    import Std.Convert.*;
    
    operation Main() : Int {
        use qubits = Qubit[3];
        ApplyToEach(H, qubits);
        Message("The qubit register in a uniform superposition: ");
        DumpMachine();
        let result = MeasureEachZ(qubits);
        Message("Measuring the qubits collapses the superposition to a basis state.");
        DumpMachine();
        ResetAll(qubits);
        return ResultArrayAsInt(result);
    }
    
  2. Pokud chcete program spustit na integrovaném simulátoru, zvolte Run nad operací Main nebo stiskněte Ctrl + F5. Výstup se zobrazí v konzole ladění.

  3. Prozkoumejte výstup DumpMachine a výsledek měření. Výstup je například podobný následujícímu:

    The qubit register in a uniform superposition: 
    
     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
     |000⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |001⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |010⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |011⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |100⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |101⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |110⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |111⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
    
    Measuring the qubits collapses the superposition to a basis state.
    
     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
     |011⟩ |  1.0000+0.0000𝑖 |   100.0000% |   0.0000
    
    6
    

    Poznámka:

    Výstup má pravděpodobně jiný výsledek než ukázkový výstup, protože generátor náhodných čísel je pravděpodobnostní. Pravděpodobnosti výsledků jsou deterministické, ale výsledek individuálního měření není.

Pokud chcete pracovat s několika qubity, kód Q# má následující úpravy:

  • Proměnná qubits teď představuje pole Qubit o délce 3.
  • Operace ApplyToEach a MeasureEachZ používají kvantové operace na více qubitů jediným řádkem kódu. Knihovny Q# nabízejí mnoho funkcí a operací, které vám zjednodušují kvantové programování.
  • Funkce ResultArrayAsInt z Std.Convert knihovny transformuje binární Result pole na desítkové celé číslo.

Výstup z DumpMachine ukazuje, že akt měření sbalí stav superpozice do jednoho z osmi možných bázových stavů, stejně jako u jednoho qubitu. Pokud například získáte výsledek 6, znamená to, že stav systému byl sbalený na $|011\rangle$.

Teď se podrobněji podíváme na to, jak se systém mění při měření jednotlivých qubitů. Předchozí kód použil MeasureEachZ operaci k měření všech tří qubitů najednou. Místo toho použijeme for smyčku k měření qubitů po jednom a použijeme DumpMachine k zobrazení stavu systému po každém měření.

  1. Nahraďte kód v Main.qs následujícím příkladem a pak soubor uložte:

    import Std.Diagnostics.*;
    import Std.Convert.*;
    
    operation Main() : Int {
        use qubits = Qubit[3];
        ApplyToEach(H, qubits);
        Message("The qubit register is in a uniform superposition: ");
        DumpMachine();
        mutable results = [];
        for q in qubits {
            Message(" ");
            results += [M(q)];
            DumpMachine();
        }
        ResetAll(qubits);
        Message("Your random number is: ");
        return ResultArrayAsInt(results);
    }
    
  2. Pokud chcete program spustit na integrovaném simulátoru, zvolte Run nad operací Main nebo stiskněte Ctrl + F5. Výstup se zobrazí v konzole ladění.

  3. Prozkoumejte výstup DumpMachine a výsledek měření.

Výstup ukazuje, jak každé po sobě jdoucí měření mění kvantový stav, a proto pravděpodobnosti získání každého výsledku. Pojďme se například podívat na jednotlivé části výstupu v případě, že váš výsledek je 5:

  • Příprava stavu: Systém je ve stejném stavu superpozice po použití H na každý qubit.

    The qubit register is in a uniform superposition: 
    
     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
     |000⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |001⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |010⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |011⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |100⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |101⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |110⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
     |111⟩ |  0.3536+0.0000𝑖 |    12.5000% |   0.0000
    
  • První měření: Výsledek je One pro první měření, takže teď jediné možné stavy, ve kterých může systém skončit, jsou stavy, ve kterých je bit úplně vlevo 1. Amplitudy stavů, kde je levý qubit 0, zmizely a pravděpodobnosti zbývajících možných stavů se zvyšují z 12,5 % na 25,0 %, aby součet pravděpodobností zůstal 100 %.

     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
     |100⟩ |  0.5000+0.0000𝑖 |    25.0000% |   0.0000
     |101⟩ |  0.5000+0.0000𝑖 |    25.0000% |   0.0000
     |110⟩ |  0.5000+0.0000𝑖 |    25.0000% |   0.0000
     |111⟩ |  0.5000+0.0000𝑖 |    25.0000% |   0.0000
    
  • Druhé měření: Výsledek je Zero pro druhé měření, takže teď jediné možné stavy, ve kterých může systém skončit, jsou stavy, ve kterých jsou dva bity nejvíce vlevo 10. Teď máme jen dva možné výsledky, když změříme třetí qubit s pravděpodobností 50% pro každý výsledek.

     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
     |100⟩ |  0.7071+0.0000𝑖 |    50.0000% |   0.0000
     |101⟩ |  0.7071+0.0000𝑖 |    50.0000% |   0.0000
    
  • Třetí měření: Ve třetím měření je Onevýsledek . Systém je plně měřený, a proto již není ve stavu superpozice podle očekávání.

     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
     |101⟩ |  1.0000+0.0000𝑖 |   100.0000% |   0.0000
    
    Your random number is: 
    
    5
    

Pomocí Q# můžete vytvořit systém qubitů, umístit qubity do stavu superpozice a prozkoumat, jak se systém mění při použití kvantových operací nebo měření.