Eğitim
Modül
Azure Quantum Geliştirme Seti'ni kullanarak ilk Q# programınızı oluşturma - Training
Bir kuantum rastgele sayı oluşturucu derleyerek Q# ile programlamaya başlayın.
Bu tarayıcı artık desteklenmiyor.
En son özelliklerden, güvenlik güncelleştirmelerinden ve teknik destekten faydalanmak için Microsoft Edge’e yükseltin.
Bu öğreticide, tek tek kubitler üzerinde çalışan temel bir kuantum programının nasıl yazıldığını ve simülasyonunu nasıl gerçekleştirdiğiniz gösterilir.
Öncelikle büyük ölçekli kuantum programları için üst düzey bir programlama dili olarak oluşturulmuş olsa Q# da, kuantum programlamanın alt düzeyini, yani belirli kubitleri doğrudan ele almak için de kullanılabilir. Özellikle, bu öğretici birçok büyük kuantum algoritmasının ayrılmaz bir alt parçası olan Quantum Fourier Dönüşümü'ne (QFT) daha yakından bakar.
Bu öğreticide şunların nasıl yapılacağını öğreneceksiniz:
Not
Kuantum bilgi işlemenin bu alt düzey görünümü genellikle bir sistemin belirli kubitlerine geçitlerin veya işlemlerin sıralı uygulamasını temsil eden kuantum devreleri açısından açıklanmaktadır. Bu nedenle, sırayla uyguladığınız tek ve çok kubitli işlemler devre diyagramlarında kolayca temsil edilebilir. Örneğin, bu öğreticide kullanılan üç kubitli kuantum Fourier dönüşümlerinin tamamı, devre olarak aşağıdaki gösterime sahiptir:
İpucu
Kuantum bilişim yolculuğunuzu hızlandırmak istiyorsanız Azure Quantum web sitesinin benzersiz bir özelliği olan Azure Quantum ile kod bölümüne bakın. Burada yerleşik Q# örnekleri veya kendi Q# programlarınızı çalıştırabilir, istemlerinizden yeni Q# kod oluşturabilir, kodunuzu tek tıklamayla Web için VS Code'da açıp çalıştırabilir ve Copilot'a kuantum bilişimi hakkında sorular sorabilirsiniz.
Visual Studio Code'un en son sürümü veya Vs Code'un Web'de açılması.
Azure Quantum Development Kit (QDK) uzantısının en son sürümü. Yükleme ayrıntıları için bkz. QDK uzantısını ayarlama.
Jupyter Notebooks'u kullanmak istiyorsanız Pythonqsharp
gerekir. Bunu yapmak için bir terminal açın ve aşağıdaki komutu çalıştırın:
$ pip install --upgrade qsharp
Bu öğreticinin ilk bölümü, üç kubit üzerinde kuantum Fourier dönüşümünü gerçekleştiren işlemini Q#tanımlamaktırMain
.
DumpMachine
işlevi, üç kubitli sistemin simülasyon dalga işlevinin işlem genelinde nasıl geliştiğini gözlemlemek için kullanılır. Öğreticinin ikinci bölümünde ölçüm işlevselliği ekler ve kubitlerin ölçüm öncesi ve son durumlarını karşılaştırırsınız.
İşlemi adım adım oluşturursunuz. Aşağıdaki bölümlerde yer alan kodu kopyalayıp QFTcircuit.qs dosyasına yapıştırın.
Bu bölümün tam Q# kodunu başvuru olarak görüntüleyebilirsiniz.
Dosyanızın Q# içinde ilgili Microsoft.Quantum.*
ad alanlarını içeri aktarın.
import Microsoft.Quantum.Diagnostics.*;
import Microsoft.Quantum.Math.*;
import Microsoft.Quantum.Arrays.*;
// operations go here
Ardından işlemi tanımlayın Main
:
operation Main() : Unit {
// do stuff
}
İşlem Main()
hiçbir zaman bağımsız değişken almaz ve şimdilik Python'da C# veya boş bir tanımlama grubu Unit
döndürmeye void
benzer bir Tuple[()]
nesne döndürür.
Daha sonra, bir ölçüm sonuçları dizisi döndürmek için işlemi değiştirirsiniz.
İşlemin içinde Q# anahtar sözcüğüyle use
üç kubitin bir kaydını ayırın. ile use
, kubitler otomatik olarak
use qs = Qubit[3]; // allocate three qubits
Message("Initial state |000>:");
DumpMachine();
Gerçek kuantum hesaplamalarında olduğu gibi Q# kubit durumlarına doğrudan erişmenize izin vermez. Ancak, DumpMachine
işlemi target makinenin geçerli durumunu yazdırır, böylece tam durum simülatörüyle birlikte kullanıldığında hata ayıklama ve öğrenme için değerli içgörüler sağlayabilir.
Ardından, işlemin kendisini oluşturan Main
işlemleri uygularsınız.
Q# zaten ad alanında Microsoft.Quantum.Intrinsic
bunların çoğunu ve diğer temel kuantum işlemlerini içerir.
Not
Microsoft.Quantum.Intrinsic
Tüm Q# programlar için derleyici tarafından otomatik olarak yüklendiğinden, önceki kod parçacığında diğer ad alanlarıyla içeri aktarılamdığını unutmayın.
Uygulanan ilk işlem, ilk kubite (Hadamard) işlemidir H
:
Bir yazmaçtan belirli bir kubite işlem uygulamak için (örneğin, bir dizideki Qubit
tek Qubit[]
bir işlem), standart dizin gösterimini kullanın.
Bu nedenle, kaydın H
ilk kubitine qs
işlemi uygulamak şu şekilde olur:
H(qs[0]);
QFT devresi, işlemi tek tek kubitlere uygulamanın H
yanı sıra öncelikli olarak kontrollü R1
döndürmelerden oluşur. Genel olarak bir R1(θ, <qubit>)
işlem,
Q# bir işlemin çalışmasını bir veya birden çok denetim kubitine göre koşula bağlamayı kolaylaştırır. Genel olarak, çağrısı ile Controlled
başlanır ve işlem bağımsız değişkenleri aşağıdaki gibi değişir:
Op(<normal args>)
Controlled Op([<control qubits>], (<normal args>))
Tek bir kubit için olsa bile denetim kubiti bağımsız değişkeninin bir dizi olması gerektiğini unutmayın.
QFT'deki denetlenen işlemler, ilk kubit üzerinde işlem gerçekleştiren (ve ikinci ve üçüncü kubitler tarafından denetlenen) işlemlerdir R1
:
Dosyanızda Q# bu işlemleri şu deyimlerle çağırarak:
Controlled R1([qs[1]], (PI()/2.0, qs[0]));
Controlled R1([qs[2]], (PI()/4.0, qs[0]));
PI()
işlevi, döndürmeleri pi radyan açısından tanımlamak için kullanılır.
İlgili H
işlemlerini ve denetimli döndürmeleri ikinci ve üçüncü kubitlere uyguladıktan sonra, devre şöyle görünür:
//second qubit:
H(qs[1]);
Controlled R1([qs[2]], (PI()/2.0, qs[1]));
//third qubit:
H(qs[2]);
Son olarak, devreyi tamamlamak için birinci ve üçüncü kubitlere bir SWAP
işlem uygularsınız. Kuantum Fourier dönüşümü kubitleri ters sırada çıkardığından bu işlem gereklidir, bu nedenle değiştirme işlemleri alt düğümün daha büyük algoritmalarla sorunsuz tümleştirilmesine olanak tanır.
SWAP(qs[2], qs[0]);
Şimdi kuantum Fourier dönüşümünün kubit düzeyindeki işlemlerini işleminize yazmayı tamamladınız Q# :
Son adım, işlem sonrası durumunu görmek ve kubitleri serbest bırakmak için yeniden çağırmaktır DumpMachine()
. Kubitleri ayırdığınızda ResetAll
ilk durumlarına sıfırlanması gerekiyor.
Tüm kubitlerin açıkça use
ayırma bloğunun sonunda gerçekleştirilmezse bir çalışma zamanı hatası ortaya çıkabilir.
Dosyanıza Q# aşağıdaki satırları ekleyin:
Message("After:");
DumpMachine();
ResetAll(qs); // deallocate qubits
Program Q# tamamlandı. QFTcircuit.qs dosyanız şu şekilde görünmelidir:
import Microsoft.Quantum.Diagnostics.*;
import Microsoft.Quantum.Math.*;
import Microsoft.Quantum.Arrays.*;
operation Main() : Unit {
use qs = Qubit[3]; // allocate three qubits
Message("Initial state |000>:");
DumpMachine();
//QFT:
//first qubit:
H(qs[0]);
Controlled R1([qs[1]], (PI()/2.0, qs[0]));
Controlled R1([qs[2]], (PI()/4.0, qs[0]));
//second qubit:
H(qs[1]);
Controlled R1([qs[2]], (PI()/2.0, qs[1]));
//third qubit:
H(qs[2]);
SWAP(qs[2], qs[0]);
Message("After:");
DumpMachine();
ResetAll(qs); // deallocate qubits
}
Şimdilik işlem Main
herhangi bir değer döndürmez, işlem değer döndürür Unit
. Daha sonra, işlemi bir ölçüm sonuçları dizisi (Result[]
) döndürecek şekilde değiştirirsiniz.
Main()
işlemi varsayılan simülatörde çalıştırır.Message
ve DumpMachine
çıkışları hata ayıklama konsolunda görünür.Diğer giriş durumlarının nasıl etkilendiğini merak ediyorsanız, dönüştürmeden önce diğer kubit işlemlerini uygulamayı denemeniz tavsiye edilir.
DumpMachine
işlevinden görüntülenen görüntüde işlemin sonuçları gösterilir, ancak ne yazık ki kuantum mekaniğinin bir köşe taşı, gerçek bir kuantum sisteminin böyle bir DumpMachine
işlevine sahip olmadığını belirtir.
Bunun yerine, bilgiler ölçümler aracılığıyla ayıklanır ve genel olarak tam kuantum durumu hakkında bilgi sağlanmaz, aynı zamanda sistemin kendisini önemli ölçüde değiştirebilir.
Birçok tür kuantum ölçümü vardır, ancak buradaki örnek en temel ölçümlere odaklanır: tek kubitlerdeki yansıtıcı ölçümler.
Belirli bir temelde ölçüldükten sonra (örneğin, hesaplama temeli
Bir Q# program içinde ölçümler uygulamak için bir tür döndüren M
işlemi kullanınResult
.
İlk olarak, işlemi yerine bir ölçü sonuçları Main
Result[]
dizisi döndürecek şekilde değiştirinUnit
.
operation Main() : Result[] {
Kubitleri ayırmadan önce üç öğeli bir dizi (her kubit için bir tane Result
) bildirin ve bağlayın:
mutable resultArray = [Zero, size = 3];
mutable
Anahtar sözcük prefacing resultArray
değişkeninin kodda daha sonra değiştirilmesini sağlar, örneğin ölçüm sonuçlarınızı eklerken.
QFT dönüştürme işlemlerden sonra aşağıdaki kodu ekleyin:
for i in IndexRange(qs) {
resultArray w/= i <- M(qs[i]);
}
Bir IndexRange
dizide çağrılan işlev (örneğin kubit dizisi), qs
dizinin dizinleri üzerinde bir aralık döndürür.
Burada, M(qs[i])
deyimini kullanarak her kubiti sıralı olarak ölçmek için for
döngüsünde kullanılır.
Ölçülen Result
her tür ( Zero
veya One
) bir update-and-reassign deyimiyle içindeki ilgili dizin konumuna resultArray
eklenir.
Not
Bu deyimin söz dizimi için Q#benzersizdir, ancak F# ve R gibi diğer dillerde görülen benzer değişken yeniden atamasına resultArray[i] <- M(qs[i])
karşılık gelir.
anahtar sözcüğü set
her zaman kullanarak mutable
bağlı değişkenleri yeniden atamak için kullanılır.
Üç kubitin de ölçülmesi ve sonuçların resultArray
'a eklenmesiyle, kubitleri daha önce olduğu gibi sıfırlayabilir ve serbest bırakabilirsiniz. Ölçümleri döndürmek için şunu ekleyin:
return resultArray;
Şimdi işlevlerin yerleşimini DumpMachine
değiştirerek ölçümlerden önceki ve sonraki durumu çıkış olarak belirleyin.
Son Q# kodunuz şu şekilde görünmelidir:
import Microsoft.Quantum.Diagnostics.*;
import Microsoft.Quantum.Math.*;
import Microsoft.Quantum.Arrays.*;
operation Main() : Result[] {
mutable resultArray = [Zero, size = 3];
use qs = Qubit[3];
//QFT:
//first qubit:
H(qs[0]);
Controlled R1([qs[1]], (PI()/2.0, qs[0]));
Controlled R1([qs[2]], (PI()/4.0, qs[0]));
//second qubit:
H(qs[1]);
Controlled R1([qs[2]], (PI()/2.0, qs[1]));
//third qubit:
H(qs[2]);
SWAP(qs[2], qs[0]);
Message("Before measurement: ");
DumpMachine();
for i in IndexRange(qs) {
resultArray w/= i <- M(qs[i]);
}
Message("After measurement: ");
DumpMachine();
ResetAll(qs);
Message("Post-QFT measurement results [qubit0, qubit1, qubit2]: ");
return resultArray;
}
İpucu
Yeniden çalıştırmadan önce kodda her değişiklik eklediğinizde dosyanızı kaydetmeyi unutmayın.
Main()
işlemi varsayılan simülatörde çalıştırır.Message
ve DumpMachine
çıkışları hata ayıklama konsolunda görünür.Çıkışınız şuna benzer görünmelidir:
Before measurement:
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
After measurement:
Basis | Amplitude | Probability | Phase
-----------------------------------------------
|010⟩ | 1.0000+0.0000𝑖 | 100.0000% | 0.0000
Post-QFT measurement results [qubit0, qubit1, qubit2]:
[Zero, One, Zero]
Bu çıkış birkaç farklı şeyi gösterir:
DumpMachine
ile döndürülen sonucu karşılaştırdığınızda, QFT sonrası süperpozisyonun temel durumlar üzerindeki açıkça gösterilmediği görülmektedir. Ölçüm, sistemin dalga işlevindeki bu durumun genliği tarafından belirlenen bir olasılıkla yalnızca tek bir temel durum döndürür.DumpMachine
sonrası durumundan ölçümün durumu değiştirdiğini ve bunu temel durumlar üzerinden ilk süper pozisyondan ölçülen değere karşılık gelen tek temel duruma yansıttığını görürsünüz.Bu işlemi birçok kez tekrarlarsanız, sonuç istatistiklerinin her çekimde rastgele bir sonuca neden olan QFT sonrası durumunun eşit ağırlıklı süper konumunu göstermeye başladığına bakın.
Ancak, verimsiz ve hala kusurlu olmasının yanı sıra, bu yine de aralarındaki göreli aşamaları değil, yalnızca temel durumların göreli genliklerini yeniden üretir.
İkincisi bu örnekte bir sorun değildir, ancak QFT'ye
Girişte belirtildiği gibi, 'nin gücünün Q#çoğu, bireysel kubitlerle ilgilenme endişelerini soyutlamanıza olanak sağlaması gerçeğinde durmektedir.
Aslında, tam ölçekli, geçerli kuantum programları geliştirmek istiyorsanız, bir işlemin belirli bir H
döndürmeden önce mi yoksa sonra mı geçeceği konusunda endişelenmeniz sizi yalnızca yavaşlatır. Azure Quantum, istediğiniz sayıda kubit için kullanabileceğiniz ve uygulayabileceğiniz işlemi sağlar ApplyQFT
.
İlk H
işlemden işleme (dahil) kadar SWAP
her şeyi şununla değiştirin:
ApplyQFT(qs);
Kodunuz şimdi şöyle görünmelidir
import Microsoft.Quantum.Diagnostics.*;
import Microsoft.Quantum.Math.*;
import Microsoft.Quantum.Arrays.*;
operation Main() : Result[] {
mutable resultArray = [Zero, size = 3];
use qs = Qubit[3];
//QFT:
//first qubit:
ApplyQFT(qs);
Message("Before measurement: ");
DumpMachine();
for i in IndexRange(qs) {
resultArray w/= i <- M(qs[i]);
}
Message("After measurement: ");
DumpMachine();
ResetAll(qs);
Message("Post-QFT measurement results [qubit0, qubit1, qubit2]: ");
return resultArray;
}
Q# Programı yeniden çalıştırın ve çıkışın öncekiyle aynı olduğuna dikkat edin.
İşlemleri kullanmanın Q# gerçek avantajını görmek için kubit sayısını dışında 3
bir şeyle değiştirin:
mutable resultArray = [Zero, size = 4];
use qs = Qubit[4];
//...
Böylece, her kubite yeni H
işlemler ve döndürmeler ekleme konusunda endişelenmenize gerek kalmadan, belirli sayıda kubit için uygun QFT'yi uygulayabilirsiniz.
Diğer Q# öğreticileri keşfedin:
Eğitim
Modül
Azure Quantum Geliştirme Seti'ni kullanarak ilk Q# programınızı oluşturma - Training
Bir kuantum rastgele sayı oluşturucu derleyerek Q# ile programlamaya başlayın.