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ızimport 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
, Bool
ve String
gibi 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ü Result
bekler:
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 M
yaygın olarak kullanılan işlemleri ve Message
iş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);
}
}
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin