Öğretici: Q# dilinde Kuantum Rastgele Sayı Oluşturucusu uygulamaTutorial: Implement a Quantum Random Number Generator in Q#

Kuantum rastgele sayı oluşturucusu, Q# dilinde yazılmış kuantum algoritmalarına örnek olarak gösterilebilir.A simple example of a quantum algorithm written in Q# is a quantum random number generator. Bu algoritma, kuantum mekaniklerinin özelliklerinden faydalanarak rastgele bir sayı üretir.This algorithm leverages the nature of quantum mechanics to produce a random number.

Ön koşullarPrerequisites

Q# işlemi yazmaWrite a Q# operation

Q# işlem koduQ# operation code

  1. Program.qs dosyasının içeriğini aşağıdaki kodla değiştirin:Replace the contents of the Program.qs file with the following code:
namespace Qrng {
    open Microsoft.Quantum.Convert;
    open Microsoft.Quantum.Math;
    open Microsoft.Quantum.Measurement;
    open Microsoft.Quantum.Canon;
    open Microsoft.Quantum.Intrinsic;
    
    operation SampleQuantumRandomNumberGenerator() : Result {
        using (q = Qubit())  {  // Allocate a qubit.
            H(q);               // Put the qubit to superposition. It now has a 50% chance of being 0 or 1.
            return MResetZ(q);  // Measure the qubit value.
        }
    }

}

Kuantum bilişimini anlama makalemizde de belirtildiği gibi kubit, süper konumda olabilen bir kuantum bilgi birimidir.As mentioned in our Understanding quantum computing article, a qubit is a unit of quantum information that can be in superposition. Bir kubit ölçüldüğünde yalnızca 0 veya 1 olabilir.When measured, a qubit can only be either 0 or 1. Ancak yürütme sırasında kubitin durumu bir ölçümle 0 veya 1 değerini elde etme olasılığını temsil eder.However, during execution the state of the qubit represents the probability of reading either a 0 or a 1 with a measurement. Olasılığa dayalı olan bu durum, süper konum olarak adlandırılır.This probabilistic state is known as superposition. Bu olasılığı kullanarak rastgele sayı oluşturabiliriz.We can use this probability to generate random numbers.

Q# işlemimizde yerel bir Q# veri türü olan Qubit veri türünü kullanacağız.In our Q# operation, we introduce the Qubit datatype, native to Q#. Qubit ayırmak için using deyimi kullanmamız gerekir.We can only allocate a Qubit with a using statement. Ayrılan kubit her zaman Zero durumunda olur.When it gets allocated, a qubit is always in the Zero state.

H işlemini kullanarak, Qubit öğemizi süper konuma alabiliriz.Using the H operation, we are able to put our Qubit in superposition. Kubiti ölçmek ve değerini okumak için M iç işlemi kullanılır.To measure a qubit and read its value, you use the M intrinsic operation.

Qubit öğemizi üst konuma alıp ölçtüğümüzde elde ettiğimiz sonuç, kod her çağrıldığında farklı bir değer verecektir.By putting our Qubit in superposition and measuring it, our result will be a different value each time the code is invoked.

Qubit serbest bırakıldığında açıkça Zero durumuna geri alınmalıdır, aksi halde simülatörde çalışma zamanı hatası oluşur.When a Qubit is de-allocated it must be explicitly set back to the Zero state, otherwise the simulator will report a runtime error. Bunu yapmanın kolay yollarından biri Reset çağırmaktır.An easy way to achieve this is invoking Reset.

Bloch küresi ile kodu görselleştirmeVisualizing the code with the Bloch sphere

Bloch küresinde kuzey kutbu klasik 0 değerini, güney kutbu ise klasik 1 değerini temsil eder.In the Bloch sphere, the north pole represents the classical value 0 and the south pole represents the classical value 1. Süper konum, küredeki bir nokta ile gösterilebilir (ok simgesi kullanılır).Any superposition can be represented by a point on the sphere (represented by an arrow). Okun ucu kutba ne kadar yakın olursa kubitin ölçüm sonrasında o kutba atanmış olan klasik değeri alma ihtimali o kadar yüksek olur.The closer the end of the arrow to a pole the higher the probability the qubit collapses into the classical value assigned to that pole when measured. Örneğin aşağıda kırmızı ok ile gösterilen kubit durumunun ölçüldüğünde 0 değerini verme olasılığı yüksektir.For example, the qubit state represented by the red arrow below has a higher probability of giving the value 0 if we measure it.

A qubit state with a high probability of measuring zero

Kodun gerçekleştirdiği işlemleri görselleştirmek için şu gösterimi kullanabiliriz:We can use this representation to visualize what the code is doing:

  • İlk olarak 0 durumunda başlatılan bir kubitle başlıyoruz ve 0 ile 1 olasılıklarının aynı olduğu bir süper konum oluşturmak için buna H uyguluyoruz.First we start with a qubit initialized in the state 0 and apply H to create a superposition in which the probabilities for 0 and 1 are the same.
Preparing a qubit in superposition
  • Ardından kubiti ölçüp çıktıyı kaydediyoruz:Then we measure the qubit and save the output:
Measuring a qubit and saving the output

Ölçümün sonucu tamamen rastgele olduğundan rastgele bir bit elde ettik.Since the outcome of the measurement is completely random, we have obtained a random bit. Bu işlemi birkaç kere çağırarak farklı tamsayılar oluşturabiliriz.We can call this operation several times to create integers. Örneğin üç rastgele bit elde etmek için işlemi üç kez çağırarak rastgele 3 bitlik sayılar (0 ile 7 arasında rastgele bir sayı) oluşturabiliriz.For example, if we call the operation three times to obtain three random bits, we can build random 3-bit numbers (that is, a random number between 0 and 7).

Eksiksiz bir rastgele sayı oluşturucu oluşturmaCreating a complete random number generator

Artık rastgele bitler oluşturan bir Q# işlemimiz olduğuna göre, bu işlemi kullanarak eksiksiz bir kuantum rastgele sayı oluşturucu oluşturabiliriz.Now that we have a Q# operation that generates random bits, we can use it to build a complete quantum random number generator. Q# komut satırı uygulamalarını kullanabilir veya bir konak programı kullanabiliriz.We can use the Q# command line applications or use a host program.

Tam Q# komut satırı uygulamasını oluşturmak için Q# programınıza şu giriş noktasını ekleyin:To create the full Q# command line application, add the following entry point to your Q# program:

operation SampleRandomNumberInRange(max : Int) : Int {
    mutable bits = new Result[0];
    for (idxBit in 1..BitSizeI(max)) {
        set bits += [SampleQuantumRandomNumberGenerator()];
    }
    let sample = ResultArrayAsInt(bits);
    return sample > max
           ? SampleRandomNumberInRange(max)
           | sample;
}

@EntryPoint()
operation SampleRandomNumber() : Int {
    let max = 50;
    Message($"Sampling a random number between 0 and {max}: ");
    return SampleRandomNumberInRange(max);
}

Yürütülebilir dosya, proje yapılandırmasına ve komut satırı seçeneklerine bağlı olarak simülatör veya kaynak tahmini aracında @EntryPoint() özniteliğiyle işaretlenmiş işlemi ya da işlevi çalıştırır.The executable will run the operation or function marked with the @EntryPoint() attribute on a simulator or resource estimator, depending on the project configuration and command-line options.

namespace Qrng {
    open Microsoft.Quantum.Convert;
    open Microsoft.Quantum.Math;
    open Microsoft.Quantum.Measurement;
    open Microsoft.Quantum.Canon;
    open Microsoft.Quantum.Intrinsic;
    
    operation SampleQuantumRandomNumberGenerator() : Result {
        using (q = Qubit())  {  // Allocate a qubit.
            H(q);               // Put the qubit to superposition. It now has a 50% chance of being 0 or 1.
            return MResetZ(q);  // Measure the qubit value.
        }
    }

    operation SampleRandomNumberInRange(max : Int) : Int {
        mutable bits = new Result[0];
        for (idxBit in 1..BitSizeI(max)) {
            set bits += [SampleQuantumRandomNumberGenerator()];
        }
        let sample = ResultArrayAsInt(bits);
        return sample > max
               ? SampleRandomNumberInRange(max)
               | sample;
    }
    
    @EntryPoint()
    operation SampleRandomNumber() : Int {
        let max = 50;
        Message($"Sampling a random number between 0 and {max}: ");
        return SampleRandomNumberInRange(max);
    }
}

Visual Studio’da betiği yürütmek için Ctrl + F5 tuşlarına basmanız yeterlidir.In Visual Studio, simply press Ctrl + F5 to execute the script.

VS Code’da terminale aşağıdakileri yazarak Program.qs dosyasını ilk kez derleyin:In VS Code, build the Program.qs the first time by typing the below in the terminal:

dotnet build

Sonraki çalıştırmalar için tekrar derlenmesi gerekmez.For subsequent runs, there is no need to build it again. Çalıştırmak için aşağıdaki komutu girin ve Enter tuşuna basın:To run it, type the following command and press enter:

dotnet run --no-build