Programın yapısı Q#

Bu makalede, bir Q# programı oluşturan genel bileşenler incelenmiştir. Q# Jupyter Notebooks'ta yazılan programların bu bileşenlerden bazılarını kullanmadığını unutmayın; bu farklılıklar her bölümde açıklanmaktadır.

Aşağıdaki Q# programı göz önünde bulundurun:

namespace Superposition {

    @EntryPoint()
    operation MeasureOneQubit() : Result {
        // Allocate a qubit, by default it is in zero state      
        use q = Qubit();  
        // We apply a Hadamard operation H to the state
        // It now has a 50% chance of being measured 0 or 1  
        H(q);      
        // Now we measure the qubit in Z-basis.
        let result = M(q);
        // We reset the qubit before releasing it.
        Reset(q);
        // Finally, we return the result of the measurement.
        return result;
    }
}

Açıklamaları ()// okuyarak, bu programın bir kubit ayırdığını, bunu süper konuma koymak için bir işlem uyguladığını, kubitin durumunu ölçdüğünü, ardından sıfırlayıp sonucu döndürdüğünü söyleyebilirsiniz.

Bu programı Visual Studio Code'da çalıştırmak için bkz. Programları ve VS Code'u kullanmaya Q# başlama.

Kullanıcı ad alanları

Q# programlar genellikle kullanıcı tarafından adlandırılmış bir ad alanıyla başlar, örneğin

namespace Superposition {
    // Your code goes here.
}

Ad alanları ilgili işlevleri düzenlemenize yardımcı olur. Ad alanları kullanıcı adıyla adlandırılır ve qsharp (*.qs) başına yalnızca bir namespace dosya olabilir.

Standart Q# kitaplık, kuantum programlarında kullanabileceğiniz işlevleri ve işlemleri içeren önceden tanımlanmış ad alanlarına sahiptir. Daha fazla bilgi için bkz . Yerleşik ad alanları.

Jupyter Not Defterleri kullanıcı ad alanlarını kullanmaz.

EntryPoint()

özniteliği derleyiciye @EntryPoint()Q# programı yürütmeye nereden başlayacağını söyler. Birden çok işlev ve işlem tanımına sahip programlarda, @EntryPoint() herhangi bir işlev veya işlem ve program akışı oradan başlamadan önce yerleştirilebilir ve sırayla devam eder.

    ...
    @EntryPoint()
    operation MeasureOneQubit() : Result {
        ...

Jupyter Not Defterleri giriş noktalarını kullanmaz.

%%qsharp komutu

Jupyter Notebooks'taki programlar varsayılan olarak Q#ipykernel Python çekirdeğini kullanır. Not defteri hücresine kod eklemek Q# için Python paketiyle qsharp birlikte etkinleştirilen komutunu kullanmanız %%qsharp gerekir. Örneğin, bir Jupyter Notebook önceki örnek kod şöyle görünür:

import qsharp
%%qsharp

    operation MeasureOneQubit() : Result {
        // Allocate a qubit, by default it is in zero state      
        use q = Qubit();  
        // We apply a Hadamard operation H to the state
        // It now has a 50% chance of being measured 0 or 1  
        H(q);      
        // Now we measure the qubit in Z-basis.
        let result = M(q);
        // We reset the qubit before releasing it.
        Reset(q);
        // Display the result
        Message($"Result is {result}");
        // Finally, we return the result of the measurement.
        return result;
    
    }
    MeasureOneQubit();

Jupyter Not Defterleri için gerekli olmayan bir @EntryPoint()kullanıcı ad alanı veya yokluğuna dikkat edin. Giriş noktası yerine, işlem doğrudan son satırda çağrılır. Ayrıca sonucu görüntülemek için Jupyter Notebook koduna bir Message deyim eklendiğini unutmayın. Önceki Q# programı VS Code'da çalıştırdığınızda, yerleşik simülatör sonucu varsayılan olarak görüntüler.

Komutu kullanırken %%qsharp :

  • komutunu etkinleştirmek %%qsharp için önce komutunu çalıştırmanız import qsharp gerekir.
  • Komutun %%qsharp kapsamı, içinde göründüğü tüm hücreye göre belirlenmiştir. Not defteri hücre türünü Python'danQ#olarak değiştirdiğini unutmayın.
  • Q# Komutu izleyen kod, standart Q# kodlama söz dizimine uymalıdır. Örneğin, içindeki hücreler yerine #%%qsharp kullanarak // açıklamaları belirtirsiniz ve kod satırlarının noktalı virgülle ;bitmesi gerekir.
  • Komutun %%qsharp başında veya ardından hücresinde bir Python deyimi olamaz.

Jupyter Notebook bir programla çalışma örneği için bkz. Programları ve VS Code'ı kullanmaya Q# başlama.

Türler

Q#, Double, Boolve Stringgibi Intçoğu dil için ortak olan birçok yerleşik türün yanı sıra kuantum bilişimine özgü türler sağlar. Örneğin, Result türü herhangi bir kubit ölçümünün sonucunu temsil eder ve iki olası tanımlı değerden birine sahip olabilir: One ve Zero. Örnek programda, işlem MeasureOneQubit() bir dönüş türü Result bekler ve M işlem kubiti ölçer ve döndürür Result.

...
// operation definition expecting a return type of Result
operation MeasureOneQubit() : Result {
    ...
    // Now we measure the qubit in Z-basis, returning a Result type
    let result = M(q);
    ...
}

Q# ayrıca aralıkları, dizileri ve tanımlama demetlerini tanımlayan türler de sağlar. Kendi özel türlerinizi bile tanımlayabilirsiniz.

Qubitleri ayırma

içinde Q#kubitler anahtar sözcüğü aracılığıyla use ayrılır.

Örneğimiz tek bir kubit tanımlar:

// Allocate a qubit.
use q = Qubit();
...

ancak birden çok kubit ayırabilir ve her birine dizini aracılığıyla erişebilirsiniz:

...
use qubits = Qubit[2];
X(qubits[1]);
H(qubits[0]);
...

Varsayılan olarak, anahtar sözcüğüyle use ayırdığınız her kubit sıfır durumunda başlar. Programın sonunda yayımlanmadan önce her kubit sıfır durumuna sıfırlanmalıdır . Kubitin sıfırlanamaması çalışma zamanı hatasını tetikler.

// Reset a qubit.
Reset(q);
...

Kuantum işlemleri

Ayrıldıktan sonra, çağrılabilenler olarak da adlandırılan işlemlere ve işlevlere bir kubit geçirilebilir. İşlemler , bir Q# programın temel yapı taşlarıdır. İşlem Q# bir kuantum alt yordamdır. Yani, qubit yazmaç durumunu değiştiren kuantum işlemleri içeren çağrılabilir bir yordamdır.

Bir Q# işlemi tanımlamak için, işlemin girişleriyle ve çıkışıyla birlikte bir ad belirtirsiniz. Bizim örneğimizde tek işlem temelde programın tamamıdır. Parametre almaz ve dönüş türü Resultbekler:

operation MeasureOneQubit() : Result {
    ...
}

Burada parametre almama ve dönüş değeri beklememe gibi temel bir örnek verilmiştir. Unit Değer, diğer dillerdeki ile NULL eşdeğerdir.

operation SayHelloQ() : Unit {
    Message("Hello quantum world!");
}

Standart Q# kitaplık, programlarınızda kullanabileceğiniz hadamard veya H örnek programda kullanılan işlem gibi işlemler de sağlar. Z tabanında bir kubit verüldüğünde, H işlem kubiti eşit bir süper pozisyona yerleştirir. Süper pozisyona geçtikten sonra kubitin sıfır veya bir olarak ölçülebilme olasılığı %50'dir.

Kubitleri ölçme

Birçok kuantum ölçümü türü vardır, ancak Q# Pauli ölçümleri olarak da bilinen tek kubitlerdeki yansıtıcı ölçümlere odaklanır. Belirli bir temelde ölçüldükten sonra (örneğin, hesaplama temeli $\ket{0},\ket{1}$) kubit durumu ölçülen temel duruma yansıtılır ve bu nedenle ikisi arasındaki süper pozisyon yok edilir.

Örnek programımız, Pauli Z temelinde tek bir kubitin ölçümlerini gerçekleştiren ve bir Result tür döndüren işlemi kullanırM.

Yerleşik ad alanları

Standart Q# kitaplık, kuantum programlarında kullanabileceğiniz işlevler ve işlemler içeren yerleşik ad alanlarını kullanır. Örneğin ad alanı Microsoft.Quantum.Intrinsic , sonuçları ölçmek için ve kullanıcı iletilerini programın herhangi bir yerinde görüntülemek için gibi Myaygın olarak kullanılan işlemleri ve Messageişlevleri içerir.

Tam ad alanını belirterek bir işlev veya işlem çağırabilir veya bir open deyimi kullanarak bu ad alanına yönelik tüm işlevleri ve işlemleri kullanılabilir hale getirmek ve kodunuzun daha kolay okunmasını sağlayabilirsiniz. Bu iki örnek aynı işlemi çağırır:

 Microsoft.Quantum.Intrinsic.Message("Hello quantum world!");
open Microsoft.Quantum.Intrinsic;
Message("Hello quantum world!");

Örnek programda tam ad alanlarına sahip deyim veya çağrı olmadığına open dikkat edin. Bunun nedeni, geliştirme ortamının Q# varsayılan olarak Microsoft.Quantum.Core iki ad alanını (ve Microsoft.Quantum.Intrinsic ) otomatik olarak yüklemesi ve yaygın olarak kullanılan işlevleri ve işlemleri içermesidir.

Ad alanının avantajlarından yararlanabilir Microsoft.Quantum.Measurement ve örnek programdaki MResetZ kodu iyileştirmek için işlemini kullanabilirsiniz. MResetZ aşağıdaki örnekte olduğu gibi ölçüm ve sıfırlama işlemlerini tek adımda birleştirir:

namespace Superposition {

    // open the namespace for the MResetZ operation
    open Microsoft.Quantum.Measurement;

    @EntryPoint()
    operation MeasureOneQubit() : Result {
        // Allocate a qubit, by default it is in zero state      
        use q = Qubit();  
        // We apply a Hadamard operation H to the state
        // It now has a 50% chance of being measured 0 or 1  
        H(q);   
        // Measure and reset the qubit, and return the result value   
        return MResetZ(q);
    }
    
}