Quantum Computation Language
QCL (Quantum Computation Language) Nedir?
QCL (Kuantum Hesaplama Dili), kuantum bilgisayarlar için mimariden bağımsız yüksek seviyeli bir programlama dilidir. Kuantum algoritmalarının eksiksiz uygulanmasını ve simülasyonunu sağlar[1].
Şekil 1. QCL’nin Hibrit Mimarisi [2].
QCL dili C++ ile yazılmış yorumlayıcı program üzerinden kullanılabilmektedir. Kuantum arkaplanını taklit etmek için sayısal simülasyon kütüphanesini (libqc) kullanmaktadır. Bu program açık kaynak olarak geliştirilmiştir ve http://tph.tuwien.ac.at/~oemer/qcl.html adresinden temin edinilebilir. En son sürümü 0.6.4 versiyon numarasıyla 2014 yılında yayınlanmıştır.
Yorumlayıcının Çalıştırılması (Windows İçin):
Dil Linux’a uyumlu çıkarıldığı için Windows’da çalışması bazı özel ayarların yapılması gerekmektedir. Bunun için öncelikle Cygwin aracının indirilmesi (https://cygwin.com) ve kurulum sırasında da aşağıda belirtilen paketlerin seçilip indirilmesi gerekmektedir[3].
Yükleme esnasında seçilip indirilmesi istenen paketler:
Devel altındaki..
- bison
- flex
- gcc-g++
- libreadline-devel
- make
Graphics altındaki..
- libplotter-devel
Libs altındaki..
- libncurses-devel
- libX11-devel
- libXt-devel
Web altındaki..
- wget
İndirme ve yükleme işlemi tamamlandıktan sonra Cygwin programı yönetici modda açılıp, aşağıda belirtilen komutlar çalıştırılır. (Bu komutlar o andaki mevcut QCL sürümlerine göre değişiklik gösterebilir.) Aşağıdaki komutlar, QCL kaynak kodları bilgisayara indirir ve sıkıştırılmış halde olan dosyayı indirildiği dizine çıkarır.
$ wget http://tph.tuwien.ac.at/~oemer/tgz/qcl-0.6.4.tgz $ tar xvzf qcl-0.6.4.tgz
Daha sonra indirilen QCL kaynak kodu aşağıdaki komutlar kullanılarak derlenir.
$ cd qcl-0.6.4 $ make
QCL yorumlayıcısını/simülatörünü çalıştırmak içinde aşağıdaki komut kullanılır.
$ ./qcl
QCL çalıştığında komut satırında aşağıdakine benzer bir çıktının elde edileceği görülecektir.
QCL Quantum Computation Language (64 qubits, seed 1494298832) [0/64] 1 |0> qcl>
QCL ‘deki Bazı Önemli Noktalar
- Veri Tipleri ve Değişkenler
Tablo 1: Klasik veri tipleri
Örnek: Bir değişkenin tanımlanması.
qcl> int a; //degiskenin tanimlanmasi qcl> a=17; //degiskene deger atanmasi qcl> print a; //degiskenin ekrana basilmasi
- Operatörler
Tablo 2: QCL operatörler
- Fonksiyonlar
Tablo 3: QCL Aritmatik fonksiyonlar
Örnek: Bir sayının logaritmasının hesaplanması ( log2 32 = 5 )
qcl> print log(32,2); : 5
- Diğer Fonksiyonlar
Tablo 4: QCL diğer fonksiyonlar
- Girdi (Input)
Konsoldan girdi değerleri “input” komutuyla alınır.
Örnek:
qcl> int sayi; qcl> input "Bir sayi giriniz : ",sayi; ? Bir sayi giriniz : 35
- Çıktı (Output)
Çıktılar ekrana “print” komutuyla basılır. Virgülle ayrılmış ifade veya değişkenlerin listesini konsol ekranına yazdırır.
Örnek:
qcl> int i=3; real x=pi; complex z=(0,1); boolean b; qcl> print i,x,z,b; : 3 3.14159 (0,1) false
- Koşullu İfadeler (If - else)
Koşullu ifadeler klasik programlama dillerinde olduğu gibi “if - else” komutlarıyla gerçekleştirilir.
Örnek:
qcl> int a=1; int b=2; if (a==b) {print "a esittir b ye.";} else {print "a esit degildir b ye.";} : a esit degildir b ye.
- Döngüler
Döngüler “for” komutuyla oluşturulur. For içerisinde integer bir sayaç tanımlanır ve bu sayaç süresince ilgili bloğun tekrar tekrar çalıştırılması sağlanır.
Örnek:
qcl> int i; qcl> for i=10 to 0 step -2 {print "sayi : ",i;} : sayi : 10 : sayi : 8 : sayi : 6 : sayi : 4 : sayi : 2 : sayi : 0
- Koşullu Döngüler
Döngüler koşul sağlandığı müddetçe devam ettirilir. Bu durum “until” veya “while” komutuyla sağlanır. “until” de önce ilgili blok çalıştırılır sonra koşul kontrol ettirilir, “while” da ise önce koşul kontrol edilir sonra blok çalıştırılır.
Örnek:
qcl> {print "i degeri : ",i," oldu."; i=i-1;}until i==0; : i degeri : 5 oldu. : i degeri : 4 oldu. : i degeri : 3 oldu. : i degeri : 2 oldu. : i degeri : 1 oldu.
veya
while i>0 {print "i degeri : ",i," oldu."; i=i-1;}; : i degeri : 5 oldu. : i degeri : 4 oldu. : i degeri : 3 oldu. : i degeri : 2 oldu. : i degeri : 1 oldu.
Kuantum Depolama ve Kayıtçılar (Registers)
Kuantum bilgisayarlarda olduğu gibi QCL’de de en küçük depolama birimi qubit’tir. QCL’de qubit formatında değişken tanımlanması klasik programlamadaki pointer’lar gibi bellekten alan tahsisiyle gerçekleştirilmektedir. Simülasyon ortamı olarak 32 veya 64 qubitlik alan tahsisi etmemize imkan sağlamaktadır. Bu değişken tanımı ve alan tahsisi işlemi için “qureg” komutu kullanılmaktadır. “dump” komutu ise değişkenimizin bra-ket notasyonunda ekrana basılmasını sağlar.
Şekil 2. Bloch küresi üzerinde bir qubit'in durumu
Örnek:
qcl> qureg x[1]; // 1 qubitlik x isminde alan ayir qcl> dump; // x degiskenini braket notasyonunda ekrana bas. : STATE: 1 / 64 qubits allocated, 63 / 64 qubits free 1 |0>
Kapılar
Kuantum bilgisayarlar kapılar tersinebilir (reversible) özelliklidir. Yani bir girdi için aldığımız sonuca, aynı işlemi uyguladığımızda başlangıçtaki girdi değerini elde edebilir. Örneğin, ket 0 ifadesine bir Not kapısı uyguladık diyelim; Not (|0>) = |1> elde ederiz. Daha sonra elde ettiğimiz sonuç olan ket 1’e tekra Not kapısı uygularsak Not(|1>) = |0> ket 0’ı yani başlangıçtaki durumu elde etmiş oluruz.
Bazı önemli kapılar
- Pauli Kapıları:
X, Y ve Z Pauli kapıları, Bloch küresinde(Şekil 2) sırasıyla x,y ve z eksenleri etrafında döndürmelere karşılık gelmektedir. Matrissel gösterim şekilleri aşağıdaki gibidir.
Şekil 3. Pauli Kapılarının matrissel gösterimi
Örnek:
qcl> qureg a[1]; qcl> dump; : STATE: 1 / 64 qubits allocated, 63 / 64 qubits free 1 |0> qcl> Not(a); [1/64] 1 |1>
Tersinebilir (reversible) özelliği
qcl> Not(a); [1/64] 1 |0>
- Hadamard Kapısı:
Bu kapı qubitleri süperpozisyon durumuna getirmektedir. Aşağıda gösterildiği gibi H matrisi ile ifade edilmektedir.
Şekil 4. Hadamard kapısının matrissel ifadesi
Şekil 5. Hadamard kapısının Ket 0 ve Ket 1'e etkisi
Örnek:
qcl> qureg a[1]; // 1 qubitlik degisken tanimla qcl> dump; // bra-ket notasyonunda goster : STATE: 1 / 64 qubits allocated, 63 / 64 qubits free 1 |0> qcl> H(a); // a degiskenine Hadamard uygula [1/64] 0.70711 |0> + 0.70711 |1>
Mevcut Kütüphane ve Algoritmaların Çalıştırılması
QCL ile birlikte birkaç tane kütüphane ve hazır yazılmış algoritmalar gelmektedir. Bu kütüphaneler QCL'nin bulunduğu dizinde lib klasörü altında bulunmaktadır (Benim bilgisayarımda bulunduğu yer C:qcllib). Buradaki kütüphaneleri kodumuza dahil edip kullanabilmek için aşağıdaki komutları uygulamamız gerekmektedir.
Örnek: Mevcut Grover arama algoritmasının çalıştırılması.
omer@OMR ~ $ cd qcl-0.6.4 //qcl nin bulundugu dizine git omer@OMR ~/qcl-0.6.4 $ ./qcl //qcl yi calistir QCL Quantum Computation Language (64 qubits, seed 1494971969) [0/64] 1 |0> qcl> include "grover.qcl"; //grover isimli kutuphaneyi dahil et qcl> grover(50); //grover kutuphanesinde bulunan grover() fonk. calistir : 6 qubits, using 4 iterations : measured 50
Kaynakça:
- [1] Bernhard Omer. Mar 27 2014. http://tph.tuwien.ac.at/~oemer/qcl.html
- [2] Bernhard Omer. Jan 20 2000. Quantum Programming in QCL
- [3] Brian Pursley. Dec 20 2015. https://blog.cinlogic.com/2015/12/20/running-qcl-quantum-computationlanguage-on-windows/