Alıştırma 2. Bölüm - Kuantum rastgele sayı oluşturucu oluşturma
Bu ünitede kuantum rastgele sayı oluşturucunuzun ikinci bölümünü uygulayacaksınız. Birden çok rastgele biti birleştirerek daha büyük bir rastgele sayı oluşturursunuz. Bu bölüm, önceki ünitede önceden oluşturduğunuz rastgele bit oluşturucu üzerinde oluşturulur.
Birden çok rastgele biti birleştirerek daha büyük bir sayı oluşturma
Önceki ünitede, bir kubiti süper konum durumuna yerleştiren ve ardından her biri 50% olasılığı olan 0 veya 1 rastgele bit değeri oluşturmak için bu kubiti ölçen rastgele bir bit oluşturucu oluşturdunuz. Bu bitin değeri gerçekten rastgeledir, ölçüm sonucunun ne olacağını önceden bilmenin bir yolu yoktur. Ancak bu davranışı daha büyük rastgele sayılar oluşturmak için nasıl kullanabilirsiniz?
İşlemi dört kez yinelerseniz, şu ikili basamak dizisini oluşturabilirsiniz:
$${0, 1, 1, 0}$$
Bu bitleri bir bit dizesi olarak birleştirirseniz, daha büyük bir sayı oluşturabilirsiniz. Bu örnekte ikilideki ${0110}$ bit dizisi ondalık olarak 6 sayısıyla eşdeğerdir.
$${0110_{\ binary} \equiv 6_{\ decimal}}$$
Rastgele olarak büyük bir rastgele sayı oluşturmak için bu işlemi birçok kez tekrarlamanız gerekir. Ardından, tüm bitleri ikili sayı olarak birleştirin ve bu ikili sayıyı ondalık sayıya dönüştürün.
Rastgele sayı oluşturucu mantığını tanımlama
Q# kodunuzu yazmadan önce rastgele bir sayı oluşturmak için mantığı özetleyelim:
- Oluşturmak istediğiniz en büyük ondalık sayı olarak tanımlayın
max. - Oluşturulacak
nBitsiçin gereken rastgele bit sayısınımaxbelirleyin. -
nBitsuzunluğunda rastgele bir bit dizesi oluşturun. - Bit dizesi değerinden
maxbüyük bir sayıyı temsil ederse önceki adıma geri dönün. - Aksi takdirde işlem tamamlanır. Oluşturulan sayıyı ondalık tamsayı olarak döndürür.
Örneğin, 12 olarak tanımlayalım max . Yani 12, rastgele sayı oluşturucunuzun vermesi gereken en büyük sayıdır.
İkili dosyada 12 sayısını göstermek için gereken bit sayısını belirlemek için aşağıdaki denklemi kullanın:
$${\lfloor ln(12) / ln(2) + 1 \rfloor}$$
Bu denkleme göre, 0 ile 12 arasında bir sayıyı temsil etmek için 4 bit gerekir.
Örneğin, dört kez rastgele bir bit oluşturduğunuzu ve ${1101_{\ binary}}$ bit dizesini elde ettiğinizi varsayalım. İkili sayı sistemindeki bu değer ondalık 13'e eşittir. 13, 12'den büyük olduğu için işlemi tekrarlamanız gerekir.
Ardından ${6_{\ decimal}}$ değerine eşit olan ${0110_{\ binary}}$ bit dizesini oluşturursunuz. 6, 12'den küçük olduğu için işlem tamamlanır.
Kuantum rastgele sayı oluşturucu 6 sayısını döndürür.
Q'da tam bir rastgele sayı oluşturucu oluşturma#
Burada, rastgele sayı oluşturucunuzu oluşturmak için önceki dersten gelen Main.qs dosyasını genişletirsiniz.
Gerekli kitaplıkları içeri aktarma
İlk olarak, programınızı yazmak için ihtiyacınız olan işlevleri ve işlemleri içeren Q# standart kitaplığındaki ad alanlarını içeri aktarın. Q# derleyicisi birçok yaygın işlevi ve işlemi otomatik olarak yükler. Ancak kuantum rastgele sayı oluşturucu için iki Q# ad alanından bazı ek işlevlere ve işlemlere ihtiyacınız vardır: Std.Math ve Std.Convert.
Aşağıdaki import yönergeleri kopyalayıp dosyanızın Main.qs başına yapıştırın:
import Std.Convert.*;
import Std.Math.*;
İşlemi olarak yeniden adlandırın MainGenerateRandomBit
Rastgele sayı oluşturucu programı, rastgele bir bit oluşturmak için önceki ünitede yazdığınız işlemi kullanır Main .
Main işlemi, programın giriş noktası olmaması ve daha açıklayıcı bir ada sahip olması için GenerateRandomBit olarak yeniden adlandırın.
Aşağıdaki kodu kopyalayıp içine Main.qsyapıştırın:
import Std.Convert.*;
import Std.Math.*;
operation GenerateRandomBit() : Result {
// Allocate a qubit.
use q = Qubit();
// Set the qubit into superposition of 0 and 1 using the Hadamard
H(q);
// Measure the qubit and store the result.
let result = M(q);
// Reset qubit to the |0〉 state.
Reset(q);
// Return the result of the measurement.
return result;
}
Rastgele sayı oluşturucu işlemini tanımlama
adlı GenerateRandomNumberInRangeyeni bir işlem oluşturun. Bu işlem bir bit dizesi derlemek için GenerateRandomBit işlemini tekrar tekrar çağırır.
Aşağıdaki kodu kopyalayın ve dosyanızdaki GenerateRandomBit işleminin hemen önüne Main.qs yerleştirin.
/// Generates a random number between 0 and `max`.
operation GenerateRandomNumberInRange(max : Int) : Int {
// Determine the number of bits needed to represent `max` and store it
// in the `nBits` variable. Then generate `nBits` random bits which will
// represent the generated random number.
mutable bits = [];
let nBits = BitSizeI(max);
for idxBit in 1..nBits {
set bits += [GenerateRandomBit()];
}
let sample = ResultArrayAsInt(bits);
// Return random number if it's within the requested range.
// Generate it again if it's outside the range.
return sample > max ? GenerateRandomNumberInRange(max) | sample;
}
burada içindeki GenerateRandomNumberInRangekoda genel bir bakış bulabilirsiniz:
-
BitSizeIişleviniStd.Mathkitaplığından çağırarakmaxiçinde depolanan tamsayıyı temsil etmek için gereken bit sayısını hesaplayın. -
fordöngüsünü kullanaraknBitskadar rastgele bit oluşturun. Rastgele bitleri oluşturmak için işleminiziGenerateRandomBitçağırın. - Döngünün
foriçinde, her yeni rastgele bit içinsetdeğişkenini güncellemek üzerebitsifadesini kullanın. değişkenbits, değiştirilebilir bir değişkendir ve bu da değerininbitshesaplama sırasında değişebileceği anlamına gelir. -
ResultArrayAsIntkitaplığındakiStd.Convertişlevini çağırarakbitsiçindeki bit dizisinisample'te depolanan pozitif bir tamsayıya dönüştürün. -
returnifadesinde,sample'inmax'den büyük olup olmadığını kontrol edin. Eğersamplemax'den büyükse,GenerateRandomNumberInRangetekrar arayın ve baştan başlayın. Aksi takdirde, içindesampledepolanan rastgele sayıyı döndürür.
Giriş noktası ekleme
Son olarak, derleyicinin programınızı çalıştırabilmesi için kodunuza bir giriş noktası işlemi ekleyin. Varsayılan olarak, Q# derleyicisi bir Main işlemi arar ve Main dosyanızda nerede bulunursa bulunsun giriş noktası olarak kullanır. Burada, Main işlemi max için bir değer ayarlar ve 0 ile GenerateRandomNumberInRange arasında rastgele bir sayı oluşturmak için max işlemini çağırır.
Örneğin, 0 ile 100 arasında rastgele bir sayı oluşturmak için aşağıdaki kodu dosyanıza Main.qs kopyalayın:
operation Main() : Int {
let max = 100;
Message($"Generating a random number between 0 and {max}: ");
// Generate random number in the 0..max range.
return GenerateRandomNumberInRange(max);
}
Son program
programınızın Q# kodunun tamamı aşağıdadır Main.qs:
import Std.Convert.*;
import Std.Math.*;
operation Main() : Int {
let max = 100;
Message($"Generating a random number between 0 and {max}: ");
// Generate random number in the 0..max range.
return GenerateRandomNumberInRange(max);
}
/// Generates a random number between 0 and `max`.
operation GenerateRandomNumberInRange(max : Int) : Int {
// Determine the number of bits needed to represent `max` and store it
// in the `nBits` variable. Then generate `nBits` random bits which will
// represent the generated random number.
mutable bits = [];
let nBits = BitSizeI(max);
for idxBit in 1..nBits {
set bits += [GenerateRandomBit()];
}
let sample = ResultArrayAsInt(bits);
// Return random number if it's within the requested range.
// Generate it again if it's outside the range.
return sample > max ? GenerateRandomNumberInRange(max) | sample;
}
operation GenerateRandomBit() : Result {
// Allocate a qubit.
use q = Qubit();
// Set the qubit into superposition of 0 and 1 using the Hadamard operation
H(q);
// Measure the qubit value using the `M` operation, and store the
// measurement value in the `result` variable.
let result = M(q);
// Reset qubit to the |0〉 state.
Reset(q);
// Return the result of the measurement.
return result;
}
Programı çalıştırma
Yeni kuantum rastgele sayı oluşturucunuzu deneyin!
Programınızı çalıştırmak için işlemin üzerindeki komut listesinden Çalıştır kod lensini seçin. Veya Ctrl + F5 tuşlarına basın. Çıkışınız hata ayıklama konsolunda görüntülenir. Programı birden çok kez çalıştırın ve sonucun nasıl değiştiğine dikkat edin.
Tebrikler! Q# dilinde gerçekten rastgele bir kuantum sayı oluşturucu oluşturdunuz.
Ek alıştırma
Programı, oluşturulan rastgele sayının sıfır yerine bir minimum pozitif sayıdan minbüyük olmasını gerektirecek şekilde değiştirmeyi deneyin.