Alıştırma - Q# ile farklı süperpozisyon durumları oluşturma

Tamamlandı

Önceki ünitelerde süperpozisyon ve Dirac gösterimini öğrendiniz. Şimdilik bu kadar teori yeter! Şimdi Q# dilinde süperpozisyonu keşfetmek için kod yazalım.

Bu ünitede Q# dilinde kuantum süper pozisyon durumları oluşturacak ve ölçüm sonuçlarında olasılığın rolünü keşfedeceksiniz. Bir kuantum hesaplaması DumpMachine sırasında sistemin durumunun nasıl değiştiğini incelemek için Q# dilindeki işlevini de kullanırsınız.

Yeni bir Q# dosyası oluşturma

  1. Visual Studio Code'ı (VS Code) açın.
  2. Dosya menüsünü açın ve yeni bir dosya oluşturmak için Yeni Metin Dosyası'nı seçin.
  3. Dosyayı Main.qs olarak kaydedin.

Süperpozisyona başlayın

Rastgele bit değeri (0 veya 1) oluşturmak için süper konum durumunda kubit kullanan basit bir Q# programıyla başlayalım. Kodumuzda, kubitin durumunu programın farklı noktalarında görmek için işlevini kullanırız DumpMachine .

  1. Aşağıdaki kodu kopyalayıp Main.qs dosyasına yapıştırın:

    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. Programınızı yerleşik simülatörde çalıştırmak için işlemin üzerindeki Kod merceciniMain çalıştır'ı seçin veya Ctrl + F5 tuşlarına basın. Çıkışınız hata ayıklama konsolunda görünür.

  3. Veya ölçümünüzün ZeroOnesonucunu bulmak için hata ayıklama konsolunu inceleyin.

işlevi, DumpMachine kuantum sisteminin durumunu açıklayan ve bu örnekte tek bir kubit olan bir bilgi tablosu oluşturur. Gelen DumpMachine bilgiler olasılık genliğini, ölçüm olasılığını ve her bir temel durum için radyan cinsinden fazı içerir.

Kodunuz işlevi dört kez çağırır DumpMachine :

  • Qubiti ayırdıktan sonra
  • Kubiti süper pozisyon durumuna yerleştirdikten sonra
  • Kubitin durumunu ölçtükten sonra
  • Kubiti sıfırladıktan sonra

Şimdi her bir çağrının DumpMachine çıkışını inceleyelim.

  • Başlatılmış kubit:use deyimini kullanarak bir kubit ayırdığınızda, kubit her zaman $|0\rangle$ durumunda başlar.

    Initialized qubit:
    
     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
       |0⟩ |  1.0000+0.0000𝑖 |   100.0000% |   0.0000
    
  • H uygulandıktan sonra Kübit: İşlemi uyguladıktan H sonra kübit eşit süper pozisyon durumundadır, $|\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
    
    
  • Ölçümden sonra kubit: Kubiti ölçtükten sonra, sonuç veya Zeroşeklindedir One ve kubit tamamen ölçülen durumdadır.

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

    Not

    Ölçümden sonra DumpMachine çıkan çıkışınız, her durumu ölçme olasılığınız %50 olduğu için örnek çıktıdan farklı olabilir. Sonuçların olasılıkları belirleyicidir, ancak tek bir ölçümün sonucu değildir.

  • Sıfırladıktan sonra Kubit: İşlem, Reset kubiti $|0\rangle$ durumuna sıfırlar, böylece gelecekteki hesaplamalar için yeniden kullanılabilir.

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

Diğer süperpozisyon durumlarını keşfetme

ile DumpMachinebir kubit sisteminin durumunu nasıl inceleyebileceğinizi öğrendiğinize göre, şimdi sistemi farklı türlerde süper pozisyon durumlarına yerleştiren diğer işlemleri inceleyelim.

Geçerli rastgele bit oluşturucu, yüzde 50 olasılıkla ya Zero ya da One üretir. Sonraki örnekte olasılıklar eşit değildir.

Çarpıtılmış rastgele bit oluşturucusu

Çarpık bir rastgele bit oluşturucu yapmak istediğinizi varsayalım; bu, Zero elde etme olasılığının One elde etme olasılığından farklı olduğu anlamına gelir.

Örneğin, olasılık $P$ olan sonucu Zero ve $1 - P$ olasılıklı sonucu One istersiniz. Bu tür bir rastgele bit oluşturucu üreten geçerli bir kubit durumu aşağıdadır:

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

Bu durum için $|\psi\rangle$, $\alpha=\sqrt{P}$ ve $\beta=\sqrt{1 - P}$ sırasıyla $|0\rangle$ ve $|1\rangle$ temel durumlarının olasılık genlikleridir.

Bu durumu elde etmek için $R_y(2\cos^{-1}\sqrt{P})$ işlecini $|0\rangle$ durumunda başlayan bir kubite sırayla uygulayabilirsiniz. Q# dilinde bu sonucu elde etmek için standart kitaplıktan komutunu kullanın Ry .

İpucu

Tek kubitli işlemlerin arkasındaki matematik hakkında daha fazla bilgi edinmek için Quantum Katas'ta Tek KubitLi Geçitler öğreticisine göz atın.

Q# dilinde çarpık bir süper konum durumu oluşturmak için şu adımları izleyin:

  1. Main.qs dosyasındaki tüm kodu aşağıdaki örnekle değiştirin ve dosyayı kaydedin. Bu örnek yaklaşık $\frac13$ olacak şekilde $\alpha$ öğesini seçer.

    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. Programınızı yerleşik simülatörde çalıştırmak için işlemin üzerindeki Kod merceciniMain çalıştır'ı seçin veya Ctrl + F5 tuşlarına basın. Çıkışınız hata ayıklama konsolunda görünür.

  3. DumpMachine çıkışını ve ölçümünüzün sonucunu inceleyin. Örneğin, çıktı aşağıdakine benzer:

    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
    

Ölçüm Zero sonucunun olasılığının yaklaşık 33,33% ve sonuç One olasılığının yaklaşık 66,67%olduğuna dikkat edin. Bu rastgele bit oluşturucu One yönünde eğrilmiş.

Not

Rastgele bit oluşturucu olasılıksal olduğundan ölçüm sonucu çıkışınız örnek çıktıdan farklı olabilir. Sonuçların olasılıkları belirleyicidir, ancak tek bir ölçümün sonucu değildir.

Çok kubitli süper pozisyon

Şimdiye kadar yalnızca tek kubitli sistemleri ele aldık. Ancak iyi bir kuantum bilgisayarın yararlı hesaplamalar yapmak için çok fazla kubite ihtiyacı vardır. Sistemimizde birden fazla kubit olduğunda kuantum durumları ve süper pozisyon nasıl çalışır?

Örneğin, üç kubitli bir sistem düşünün. Her kubiti ölçtüdüğünüzde 0 veya 1 değerine sahip olabilir, bu nedenle sistemin içinde bulunabileceği sekiz olası durum vardır:

$$|000\raçısı,|001\raçısı,|010\raçısı,|011\raçısı,|100\raçısı,|101\raçısı, |110\raçısı,|111\raçısı $$

Bu sistem için sekiz olası durum vardır çünkü ölçüm yaptığımızda her kubit bağımsız olarak 0 veya 1 durumu olabilir. Genel olarak, olası durumların sayısı $2^n$ değerine eşittir; burada $n$ kubit sayısıdır.

Tek bir kubitte olduğu gibi, 3 kubitli sistem için rastgele bir süper pozisyon durumu, ağırlıkların olasılık genlikleri olduğu bu sekiz durumun ağırlıklı toplamı olarak temsil edilir:

$$|\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$$

Bir kez daha, $\alpha_i$ genlikleri $\sum\limits_{i=0}^{i=7}|\alpha_i|^2=1$ koşulunu karşılayan karmaşık sayılardır.

Örneğin, her kubite H uygulayarak bir kubiti tekdüzen bir süperpozisyona yerleştirebilirsiniz. Ardından bu tekdüzen süper pozisyonu kullanarak bir bit sayı yerine üç bit sayılar oluşturan bir kuantum rastgele sayı oluşturucu oluşturabilirsiniz:

Temel durum Sayı
$\ket{000}$ 0
$\ket{001}$ 4
$\ket{010}$ 2
$\ket{011}$ 6
$\ket{100}$ 1
$\ket{101}$ 5
$\ket{110}$ 3
$\ket{111}$ 7

Not

Bit dizeleri yazmanın standart yolu, normal ondalık sayılarında olduğu gibi en küçük basamağı sağda, en büyük basamağı ise soldan yazmaktır. Q# dilinde (ve diğer birçok kuantum programlama dilinde), en küçük basamak solda ve en büyük basamak sağda olacak şekilde sıra tersine çevrilir. DumpMachine İşlev kuantum durumlarını standart sırada görüntülediğinden, durumların karşılık geldiği ondalık tamsayılar sıralı olarak 0 ile $n-1$ sıralı olarak sıralanmamıştır.

Bu tür bir rastgele sayı oluşturucu oluşturmak için şu adımları izleyin:

  1. Main.qs dosyasındaki kodunuzu aşağıdaki örnekle değiştirin ve dosyayı kaydedin:

    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. Programınızı yerleşik simülatörde çalıştırmak için işlemin üzerindeki Kod merceciniMain çalıştır'ı seçin veya Ctrl + F5 tuşlarına basın. Çıkışınız hata ayıklama konsolunda görünür.

  3. DumpMachine çıkışını ve ölçümünüzün sonucunu inceleyin. Örneğin, çıktı aşağıdakine benzer:

    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
    

    Not

    Rastgele sayı oluşturucu olasılıksal olduğundan çıkışınızın büyük olasılıkla örnek çıktıdan farklı bir sonucu vardır. Sonuçların olasılıkları belirleyicidir, ancak tek bir ölçümün sonucu değildir.

Birden çok kubitle çalışmak için Q# kodunuz aşağıdaki değişikliklere sahiptir:

  • qubits değişkeni, şimdi uzunluğu üç olan bir Qubit dizisini temsil eder.
  • İşlemler ApplyToEach ve MeasureEachZ kuantum işlemlerini tek bir kod satırıyla birden çok kubite uygular. Q# kitaplıkları, kuantum programlamayı sizin için basitleştiren birçok işlev ve işlem sunar.
  • Kitaplıkta bulunan Std.ConvertResultArrayAsInt işlevi, ikili olan Result diziyi ondalık tamsayıya dönüştürür.

DumpMachine çıkışı, ölçüm eyleminin süperpozisyon durumunu, tıpkı tek bir qubitte olduğu gibi, sekiz olası temel durumdan birine daralttığını gösterir. Örneğin, sonucunu 6 alırsanız, sistem durumunun $|011\rangle$ olarak daraldığını gösterir.

Şimdi her kubiti ölçtükçe sistemin nasıl değiştiğine daha ayrıntılı bir göz atalım. Yukarıdaki kod, üç kubitin MeasureEachZ tümünü aynı anda ölçmek için işlemini kullandı. Bunun yerine, kubitleri teker teker ölçmek için bir for döngü kullanalım ve her ölçümden sonra sistemin durumunu görüntülemek için kullanalım DumpMachine .

  1. Main.qs dosyasındaki kodu aşağıdaki örnekle değiştirin ve dosyayı kaydedin:

    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. Programınızı yerleşik simülatörde çalıştırmak için işlemin üzerindeki Kod merceciniMain çalıştır'ı seçin veya Ctrl + F5 tuşlarına basın. Çıkışınız hata ayıklama konsolunda görünür.

  3. DumpMachine çıkışını ve ölçümünüzün sonucunu inceleyin.

Çıktı, ardışık her ölçümün kuantum durumunu nasıl değiştirip her sonucu elde etme olasılıklarını gösterir. Örneğin, sonucunuzun 5olması durumunda çıkışın her bir bölümünü inceleyelim:

  • Durum hazırlığı: Her bir kubit için H uyguladıktan sonra sistem eşit süperpozisyon durumundadır.

    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
    
  • İlk ölçüm: Sonuç One ilk ölçüm içindir, bu nedenle şimdi sistemin sonlandığı tek olası durum en soldaki bitin 1 olduğu durumlardır. En soldaki kubitin 0 olduğu durumların genlikleri kayboldu ve kalan olası durumların olasılıkları 12,5% 25,0% artar, böylece olasılıkların toplamı 100%kalır.

     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
    
  • İkinci ölçüm: Sonuç Zero ikinci ölçüm içindir, bu nedenle sistemin sonlandığı tek olası durum, en soldaki iki bitin 10 olduğu durumlardır. Artık her sonuç için 50% olasılığıyla üçüncü kubiti ölçtüklerinde yalnızca iki olası sonuç elde ediyoruz.

     Basis | Amplitude      | Probability | Phase
     -----------------------------------------------
     |100⟩ |  0.7071+0.0000𝑖 |    50.0000% |   0.0000
     |101⟩ |  0.7071+0.0000𝑖 |    50.0000% |   0.0000
    
  • Üçüncü ölçüm: Üçüncü ölçümde sonuç şeklindedir One. Sistem tamamen ölçüldü ve bu nedenle beklendiği gibi artık süperpozisyon durumunda değil.

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

Q# ile bir kubit sistemi oluşturabilir, kubitleri süper konum durumuna alabilir ve kuantum işlemleri uygularken veya ölçümler gerçekleştirirken sistemin nasıl değiştiğini inceleyebilirsiniz.