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, arama tabanlı sorunları çözmek için Grover Q# algoritması uygulayacaksınız. Grover algoritmasının arkasındaki teorinin derinlemesine açıklaması için grover algoritması teorisine bakın.
Bu öğreticide şunları yaptınız:
İ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.
Kod örneğini Azure Quantum'daki Copilot'ta çalıştırmak için:
Visual Studio Code'da kod örneğini geliştirmek ve çalıştırmak için:
Grover algoritması, kuantum bilişimindeki en ünlü algoritmalardan biridir. Çözdüğü sorunun türü genellikle "veritabanında arama" olarak adlandırılır, ancak bunu arama sorunu açısından düşünmek daha doğru olur.
Herhangi bir arama sorunu,
Bu nedenle, herhangi bir arama sorununu şu şekilde formüle edebilirsiniz: klasik bir işlev
Grover algoritmasını kullanarak arama sorununu çözmek için şunları yapmanız gerekir:
Arama sorunu için
Bu bölümde, içinde algoritmanın Q#nasıl uygulanılacağı açıklanır. Grover algoritması uygulanırken dikkate alınması gereken birkaç şey vardır. İşaretli durumunuzun ne olduğunu, bu durumu nasıl yansıtabileceğinizi ve algoritmayı çalıştıracak yineleme sayısını tanımlamanız gerekir. Grover görevinin işlevini uygulayan kahini de tanımlamanız gerekir.
İlk olarak, aramada bulmaya çalıştığınız girişi tanımlarsınız. Bunu yapmak için Grover algoritmasından b, c ve d adımlarını uygulayan bir işlem yazın.
Bu adımlar birlikte Grover'ın
operation ReflectAboutMarked(inputQubits : Qubit[]) : Unit {
Message("Reflecting about marked state...");
use outputQubit = Qubit();
within {
// We initialize the outputQubit to (|0⟩ - |1⟩) / √2, so that
// toggling it results in a (-1) phase.
X(outputQubit);
H(outputQubit);
// Flip the outputQubit for marked states.
// Here, we get the state with alternating 0s and 1s by using the X
// operation on every other qubit.
for q in inputQubits[...2...] {
X(q);
}
} apply {
Controlled X(inputQubits, outputQubit);
}
}
İşlem, ReflectAboutMarked
değişen sıfırlar ve birlerle işaretlenmiş temel durumu yansıtır. Bunu yapmak için Grover'ın difüzyon işlecini giriş kubitlerine uygular. İşlem, outputQubit
Grover'ın araması, geçerli bir çıkışı ölçme olasılığı en yüksek olan en iyi yineleme sayısına sahiptir. Sorun
En uygun yineleme sayısını yinelemeye devam etmek,
Pratik uygulamalarda genellikle probleminizi çözene kadar kaç farklı çözümü olabileceği hakkında bilginiz olmaz. Bu sorunu ele almak için etkili bir strateji, iki güçteki tahminleri aşamalı olarak artırarak (1, 2, 4, 8, 16, ..., 2^n
Aşağıdaki Q# işlev, bir yazmaçtaki belirli bir kubit sayısı için en uygun yineleme sayısını hesaplar.
function CalculateOptimalIterations(nQubits : Int) : Int {
if nQubits > 63 {
fail "This sample supports at most 63 qubits.";
}
let nItems = 1 <<< nQubits; // 2^nQubits
let angle = ArcSin(1. / Sqrt(IntAsDouble(nItems)));
let iterations = Round(0.25 * PI() / angle - 0.5);
return iterations;
}
İşlev, CalculateOptimalIterations
yineleme sayısını hesaplamak için yukarıdaki formülü kullanır ve ardından en yakın tamsayıya yuvarlar.
Q# Grover arama algoritmasının işlemi üç girişe sahiptir:
nQubits : Int
yazmaçtaki kubit sayısı. Bu kayıt, belirsiz çözümü arama sorununa kodlar. İşlemden sonra ölçülür.iterations : Int
.phaseOracle : Qubit[] => Unit) : Result[]
. Bu işlem, genel bir kubit yazmaç üzerinde birimsel dönüştürme uygular.operation GroverSearch( nQubits : Int, iterations : Int, phaseOracle : Qubit[] => Unit) : Result[] {
use qubits = Qubit[nQubits];
PrepareUniform(qubits);
for _ in 1..iterations {
phaseOracle(qubits);
ReflectAboutUniform(qubits);
}
// Measure and return the answer.
return MResetEachZ(qubits);
}
İşlem, GroverSearch
Kod üç yardımcı işlemi kullanır: PrepareUniform
, ReflectAboutUniform
ve ReflectAboutAllOnes
.
All-zeros durumundaki bir yazmaç verüldüğünde, PrepareUniform
işlem tüm temel durumlara göre tekdüzen bir süper konum hazırlar.
operation PrepareUniform(inputQubits : Qubit[]) : Unit is Adj + Ctl {
for q in inputQubits {
H(q);
}
}
''ReflectAboutAllOnes' işlemi all-one durumu hakkında yansıtır.
operation ReflectAboutAllOnes(inputQubits : Qubit[]) : Unit {
Controlled Z(Most(inputQubits), Tail(inputQubits));
}
İşlem ReflectAboutUniform
, tekdüzen süper konum durumu hakkında yansıtır. İlk olarak, tekdüzen süper pozisyonu sıfıra dönüştürür. Ardından sıfır durumunu tümü bire bir durumuna dönüştürür. Son olarak, tümü bir durumunu yansıtır. tekdüzen süper konum durumu hakkında vektör alanında bir yansıma olarak geometrik olarak yorumlanabildiği için işlem çağrılır ReflectAboutUniform
.
operation ReflectAboutUniform(inputQubits : Qubit[]) : Unit {
within {
Adjoint PrepareUniform(inputQubits);
// Transform the all-zero state to all-ones
for q in inputQubits {
X(q);
}
} apply {
ReflectAboutAllOnes(inputQubits);
}
}
Artık Grover arama algoritmasının belirli bir örneğini uygulamak ve faktöring sorununu çözmek için tüm bileşenlere sahipsiniz. İşlemi tamamlamak Main
için kubit sayısını ve yineleme sayısını belirterek sorunu ayarlar
operation Main() : Result[] {
let nQubits = 5;
let iterations = CalculateOptimalIterations(nQubits);
Message($"Number of iterations: {iterations}");
// Use Grover's algorithm to find a particular marked state.
let results = GroverSearch(nQubits, iterations, ReflectAboutMarked);
return results;
}
Programınızı çalıştırmak için istediğiniz platformu seçin.
Kodunuzu Azure Quantum'da Copilot ile ücretsiz olarak test Q# edebilirsiniz. Tek ihtiyacınız bir Microsoft (MSA) e-posta hesabıdır. Azure Quantum'daki Copilot hakkında daha fazla bilgi için bkz . Azure Quantum'u keşfetme.
Tarayıcınızda Azure Quantum'da Copilot'i açın.
Aşağıdaki kodu kopyalayıp kod düzenleyicisine yapıştırın.
import Microsoft.Quantum.Convert.*;
import Microsoft.Quantum.Math.*;
import Microsoft.Quantum.Arrays.*;
import Microsoft.Quantum.Measurement.*;
import Microsoft.Quantum.Diagnostics.*;
operation Main() : Result[] {
let nQubits = 5;
let iterations = CalculateOptimalIterations(nQubits);
Message($"Number of iterations: {iterations}");
// Use Grover's algorithm to find a particular marked state.
let results = GroverSearch(nQubits, iterations, ReflectAboutMarked);
return results;
}
operation GroverSearch(
nQubits : Int,
iterations : Int,
phaseOracle : Qubit[] => Unit) : Result[] {
use qubits = Qubit[nQubits];
PrepareUniform(qubits);
for _ in 1..iterations {
phaseOracle(qubits);
ReflectAboutUniform(qubits);
}
// Measure and return the answer.
return MResetEachZ(qubits);
}
function CalculateOptimalIterations(nQubits : Int) : Int {
if nQubits > 63 {
fail "This sample supports at most 63 qubits.";
}
let nItems = 1 <<< nQubits; // 2^nQubits
let angle = ArcSin(1. / Sqrt(IntAsDouble(nItems)));
let iterations = Round(0.25 * PI() / angle - 0.5);
return iterations;
}
operation ReflectAboutMarked(inputQubits : Qubit[]) : Unit {
Message("Reflecting about marked state...");
use outputQubit = Qubit();
within {
// We initialize the outputQubit to (|0⟩ - |1⟩) / √2, so that
// toggling it results in a (-1) phase.
X(outputQubit);
H(outputQubit);
// Flip the outputQubit for marked states.
// Here, we get the state with alternating 0s and 1s by using the X
// operation on every other qubit.
for q in inputQubits[...2...] {
X(q);
}
} apply {
Controlled X(inputQubits, outputQubit);
}
}
operation PrepareUniform(inputQubits : Qubit[]) : Unit is Adj + Ctl {
for q in inputQubits {
H(q);
}
}
operation ReflectAboutAllOnes(inputQubits : Qubit[]) : Unit {
Controlled Z(Most(inputQubits), Tail(inputQubits));
}
operation ReflectAboutUniform(inputQubits : Qubit[]) : Unit {
within {
// Transform the uniform superposition to all-zero.
Adjoint PrepareUniform(inputQubits);
// Transform the all-zero state to all-ones
for q in inputQubits {
X(q);
}
} apply {
// Now that we've transformed the uniform superposition to the
// all-ones state, reflect about the all-ones state, then let the
// within/apply block transform us back.
ReflectAboutAllOnes(inputQubits);
}
}
İpucu
Azure Quantum'daki Copilot'tan, kod düzenleyicisinin sağ köşesindeki VS Code logosu düğmesini seçerek programınızı Web için VS Code'da açabilirsiniz.
Ayrıca programınızı ücretsiz Quantinuum Öykünücüsünesunabilirsiniz. Öykünücü, 20 kubitli bir kuantum bilgisayarın simülasyonunu oluşturur.
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.
Belgeler
Öğretici: Kuantum Rastgele Sayı Oluşturucu oluşturma - Azure Quantum
Q# Kuantum rastgele sayı oluşturucu oluşturarak süper pozisyon gibi temel kuantum kavramlarını gösteren bir proje oluşturun.
Öğretici: Q\ dilinde Quantum Fourier Dönüşümü # - Azure Quantum
Bu öğreticide, tek kubit düzeyinde çalışan bir kuantum programı yazmayı ve simülasyonunu yapmayı öğrenin.
Öğretici: Ile Kuantum Dolanıklığı Q# - Azure Quantum
Bu öğreticide Q# , kubitlerin süper konumunu ve dolanıklığını gösteren bir kuantum programı yazın.