Mulai menggunakan Qiskit di kelas
Untuk modul Qiskit in Classrooms ini, siswa harus memiliki lingkungan Python yang berfungsi dengan paket-paket berikut terinstal:
qiskitv2.1.0 atau lebih baruqiskit-ibm-runtimev0.40.1 atau lebih baruqiskit-aerv0.17.0 atau lebih baruqiskit.visualizationnumpypylatexenc
Untuk mengatur dan menginstal paket-paket di atas, lihat panduan Install Qiskit. Agar bisa menjalankan job di komputer kuantum sungguhan, siswa perlu membuat akun di IBM Quantumยฎ dengan mengikuti langkah-langkah di panduan Set up your IBM Cloudยฎ account.
Modul ini telah diuji dan menggunakan 2 detik waktu QPU pada prosesor Heron v2. Ini hanya perkiraan. Penggunaan aktualmu bisa berbeda.
# Added by doQumentation โ required packages for this notebook
!pip install -q qiskit qiskit-aer qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'
Pengantarโ
Dalam modul Qiskit in the Classroom, kamu akan berkesempatan menggunakan komputer kuantum untuk menjelajahi berbagai konsep di bidang yang berdekatan dengan komputasi kuantum seperti mekanika kuantum, ilmu komputer, kimia, dan lainnya. Modul ini menjadi prasyarat untuk modul-modul lainnya โ modul ini memperkenalkan dasar-dasar komputasi kuantum dan cara menggunakan Qiskit untuk menjalankan sirkuit kuantum.
Pertama, kita akan memberi kamu gambaran singkat tentang cara kerja komputer klasik, lalu kita tunjukkan bagaimana konsep-konsep tersebut diadaptasi ke paradigma komputasi kuantum. Terakhir, kita tunjukkan cara menggabungkan konsep-konsep ini untuk membangun dan mengeksekusi sirkuit kuantum pertamamu.
Komputer klasikโ
Kamu mungkin sudah familiar dengan dasar-dasar cara kerja komputer klasik, tapi di sini kita akan menyoroti beberapa fitur utama agar kita bisa membandingkannya dengan komputer kuantum.
Unit informasi dasar: bitโ
Komputer klasik memproses informasi klasik, dan unit dasar informasi klasik adalah bit. Satu bit bisa menyimpan jawaban dari satu pertanyaan "ya/tidak". Kita biasanya merepresentasikan dua keadaan biner dari sebuah bit sebagai "0" dan "1".
Tinjauan bilangan binerโ
Menggabungkan bit memungkinkan kamu menyimpan lebih banyak informasi. Misalnya, jika kamu ingin menyimpan angka dari 0 hingga 15, kamu bisa melakukannya dengan empat bit seperti berikut:
| 0 = 0000 | 4 = 0100 | 8 = 1000 | 12 = 1100 |
| 1 = 0001 | 5 = 0101 | 9 = 1001 | 13 = 1101 |
| 2 = 0010 | 6 = 0110 | 10 = 1010 | 14 = 1110 |
| 3 = 0011 | 7 = 0111 | 11 = 1011 | 15 = 1111 |
Secara umum, untuk mengonversi bilangan biner sebanyak bit ke angka basis-10 yang biasa kamu kenal, kalikan bit paling tidak signifikan (paling kanan) dengan , bit berikutnya ke kiri dengan , lalu berikutnya dengan , dan seterusnya, hingga mencapai bit paling signifikan (paling kiri), yang dikali .
Jadi, artinya bit bisa berada di salah satu dari keadaan yang berbeda.
Cek pemahamanmuโ
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Berapa bit yang kamu butuhkan untuk merepresentasikan angka 86? Tuliskan bitstring yang mengkodekan angka ini dalam biner.
Jawaban:
Ingat, bit memungkinkan kamu merepresentasikan angka hingga , jadi menggunakan enam bit akan menghasilkan angka hingga . Itu belum cukup. Kita tambahkan satu bit lagi untuk mencapai . Sekarang mari kita uraikan 86 ke dalam pangkat 2:
Operasi dasar: gateโ
Sekarang, komputer perlu bisa melakukan sesuatu dengan bit agar bisa, ya, melakukan komputasi. Gate biner adalah operasi yang membentuk blok bangunan fundamental dari semua algoritma dan kode yang lebih kompleks.
Gate satu bit:โ
NOTโ
Jika kamu hanya punya satu bit, hanya ada satu cara untuk mengubah keadaannya: membalik keadaan dari 0 ke 1 atau dari 1 ke 0. Kita menyebut ini Gate "NOT". Efek gate ini โ dan gate-gate lain yang akan kita bahas di bawah โ dapat direpresentasikan dalam apa yang disebut "tabel kebenaran," dengan kolom untuk keadaan input dan output dari qubit. Tabel kebenaran untuk Gate NOT adalah:
| Input | Output |
|---|---|
| 0 | 1 |
| 1 | 0 |
Gate multi-bit:โ
ANDโ
AND adalah gate dua bit yang mengambil dua bit input dan menghasilkan satu bit output. Menghasilkan 1 jika kedua bit input adalah 1, dan 0 jika sebaliknya:
| Input | Output |
|---|---|
| 00 | 0 |
| 01 | 0 |
| 10 | 0 |
| 11 | 1 |
ORโ
OR adalah gate dua bit lain dengan satu bit output. Menghasilkan 1 jika salah satu bit adalah 1:
| Input | Output |
|---|---|
| 00 | 0 |
| 01 | 1 |
| 10 | 1 |
| 11 | 1 |
XORโ
XOR singkatan dari "exclusive OR" dan mirip dengan Gate OR, tapi menghasilkan 1 jika hanya satu dari bit input yang bernilai 1. Menghasilkan 0 jika keduanya bernilai 1 atau keduanya bernilai 0:
| Input | Output |
|---|---|
| 00 | 0 |
| 01 | 1 |
| 10 | 1 |
| 11 | 0 |
Pengukuran:โ
Biasanya, ketika belajar tentang komputasi klasik, tidak banyak perhatian yang diberikan pada proses membaca keadaan bit. Ini karena tidak terlalu rumit dari sudut pandang konseptual. Kamu bisa mengukur bit kapan saja sebelum, selama, atau setelah komputasi, dan itu tidak mempengaruhi hasilnya. Hal ini tidak berlaku dalam komputasi kuantum, seperti yang akan kita bahas di bawah.
Circuit:โ
Dengan menggabungkan gate-gate di atas, kamu bisa melakukan segala jenis operasi yang diinginkan pada komputer. Mari kita ambil contoh sederhana: Menggunakan gate AND dan XOR, kamu bisa membangun sirkuit half-adder, yang menghitung jumlah dua bit. Ini direpresentasikan dalam diagram sirkuit logika, di mana kabel-kabel merepresentasikan bit dan gate-gate yang beroperasi pada bit ditampilkan sebagai simbol pada kabel yang sesuai:
Jadi, dua bit disalin dan dimasukkan ke gate AND dan gate XOR. Hasil dari gate XOR adalah "bit jumlah" (S), yang tetap berada di posisi satuan bilangan biner, dan hasil dari gate AND adalah "bit carry" (C), yaitu nilai digit paling signifikan berikutnya dalam bilangan biner. Berikut tabel kebenarannya:
| Sum () | Carry () | ||
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
Cek pemahamanmuโ
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Verifikasi bahwa tabel kebenaran di atas menghasilkan solusi yang benar untuk sirkuit adder. Yaitu, untuk masing-masing dari empat pilihan A dan B, verifikasi bahwa .
Jawaban:
Komputer kuantumโ
Bit qubitโ
Sama seperti bit adalah unit dasar informasi klasik, bit kuantum, atau "qubit," adalah unit dasar informasi kuantum. Seperti bit klasik, keadaan sebuah Qubit bisa berupa 0 atau 1, yang biasanya kita notasikan sebagai dan . Tapi tidak seperti bit klasik, bit kuantum juga bisa berada dalam superposisi dari kedua keadaan dan secara bersamaan. Secara umum, sebuah Qubit bisa berada dalam keadaan dengan bentuk:
di mana dan adalah amplitudo kompleks dengan .
Fase kuantumโ
Karena dan adalah bilangan kompleks, masing-masing bisa ditulis sebagai di mana disebut fase. Jika kita mengalikan seluruh keadaan dengan faktor fase keseluruhan yang sama, tidak ada yang berubah secara fisik โ ini disebut fase global, dan tidak memiliki konsekuensi yang bisa diamati.
Untuk itu, konvensinya adalah "memfaktorkan" , sehingga:
di mana adalah fase relatif dari keadaan kuantum, yang memang memiliki konsekuensi yang bisa diamati.
Fase ini memainkan peran yang sangat penting dalam komputasi kuantum, dan kamu akan menjelajahi berbagai konsekuensinya dalam modul Qiskit in the Classroom berikutnya.
Banyak qubitโ
Sementara keadaan beberapa bit bisa diekspresikan secara sederhana sebagai string 0 dan 1, keadaan beberapa qubit menjadi sedikit lebih rumit karena prinsip superposisi dan entanglement.
Ingat bahwa bit bisa berada di salah satu dari keadaan yang mungkin mulai dari bilangan biner 000...000 hingga 111...111. Tapi sekarang, karena prinsip superposisi, qubit bisa berada dalam superposisi dari semua keadaan tersebut sekaligus!
Ini bisa diekspresikan sebagai
di mana, seperti dalam kasus klasik, keadaan bersesuaian dengan keadaan di mana setiap qubit berada dalam kombinasi 0 dan 1 yang tepat untuk menghasilkan bilangan biner . Ini dikenal sebagai "keadaan basis komputasi" dari sistem kuantum. Misalnya, keadaan tiga qubit bisa ditulis sebagai superposisi dari delapan keadaan basis komputasinya:
Setiap qubit dalam sistem ditandai dengan indeks hingga . Konvensinya adalah membaca keadaan qubit dari kanan ke kiri, sehingga keadaan qubit adalah yang paling kanan dan keadaan qubit adalah yang paling kiri. Ini dikenal sebagai notasi "little-endian," dan mungkin terasa tidak intuitif pada awalnya karena kita terbiasa membaca dari kiri ke kanan.
Cek pemahamanmuโ
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Pada pandangan pertama, mungkin terasa tidak intuitif untuk mengurutkan qubit dari kanan ke kiri seperti dalam notasi little-endian, tapi sebenarnya ini sangat logis! Jelaskan mengapa. (Ingat diskusi kita di atas tentang konversi bilangan biner ke basis-10.)
Jawaban:
Jika kita mengurutkan qubit dari kanan ke kiri, sehingga qubit 0 paling jauh ke kanan dan qubit N-1 paling jauh ke kiri, maka logis untuk mengasosiasikan qubit dengan bit paling tidak signifikan, yang dikalikan dengan dan qubit dengan bit paling signifikan, yang dikalikan dengan .
Entanglementโ
Seperti yang kita sebutkan sebelumnya, fitur kunci lain dari qubit adalah bahwa mereka bisa terjerat satu sama lain. Mari kita ambil contoh keadaan dua qubit, di mana dan :
Jadi, keadaan qubit 0 bisa berupa atau dengan probabilitas yang sama, begitu pula dengan keadaan qubit 1. Tapi probabilitas-probabilitas ini tidak lagi saling independen. Jika kita menemukan keadaan qubit 0 adalah , maka kita tahu bahwa qubit 1 juga akan berada dalam . Ini berlaku tidak peduli seberapa jauh satu sama lain, itulah mengapa tindakan mengukur keadaan yang terjerat terkadang disebut sebagai "aksi seram dari jarak jauh."
Entanglement juga bisa mengambil bentuk lain. Misalnya, keadaan
menghasilkan hasil yang berlawanan setiap saat: jika satu qubit diukur , yang lain dijamin ditemukan dalam keadaan .
Cek pemahamanmuโ
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Apakah keadaan terjerat? Mengapa atau mengapa tidak?
Jawaban:
Ini tidak terjerat. Meskipun hasilnya selalu sama saat kamu mengukur kedua qubit, ini hanya karena setiap qubit selalu berada dalam keadaan . Hasil pengukuran satu qubit sebenarnya tidak bergantung pada yang lain โ keduanya hanya selalu .
Secara umum, jika kamu bisa mendeskripsikan keadaan setiap qubit secara terpisah lalu mengalikannya seperti ini:
Maka ini dikenal sebagai "keadaan produk" dan tidak terjerat.
Notasi vektorโ
Seringkali berguna untuk menggunakan vektor dan matriks untuk melihat bagaimana keadaan kuantum berubah di bawah operasi yang berbeda. Dalam representasi ini, keadaan kuantum kita akan berupa vektor, dan gate kuantum kita (dibahas di bagian berikutnya) akan berupa matriks yang mentransformasi vektor.
Untuk satu qubit, bentuk vektor dari keadaan dipilih sebagai: Dengan cara ini, keadaan sembarang bisa ditulis sebagai
Untuk keadaan -qubit umum, kita akan membutuhkan vektor berdimensi , dengan keadaan basis yang diurutkan seperti yang mungkin kamu harapkan, dalam nilai biner yang meningkat:
Dengan pilihan notasi vektor ini, kita bisa memperkenalkan gate kuantum yang dibutuhkan, efeknya pada keadaan kuantum, dan bentuk matriksnya.
Cek pemahamanmuโ
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Ada empat keadaan basis komputasi untuk sistem dua qubit. Tuliskan masing-masing dalam notasi ket dan vektor.
Jawaban:
Gate gate kuantumโ
Sama seperti gate klasik seperti NOT, AND, OR, dan XOR bisa digabungkan untuk membangun sirkuit klasik sembarang, gate kuantum memainkan peran yang sama dalam komputasi kuantum. Karena qubit memiliki fitur mekanika kuantum tambahan, gate kuantum pun menjadi lebih kaya. Meskipun kita masih bisa mendeskripsikan aksinya pada keadaan basis dan dengan tabel kebenaran, ini tidak menangkap gambaran keseluruhan. Untuk gate kuantum, seringkali lebih alami menggunakan representasi matriks, karena gate juga bekerja pada superposisi keadaan basis.
Di bawah ini kita akan memperkenalkan gate kuantum yang paling umum dan bagaimana mereka mentransformasi qubit yang berinteraksi dengannya. Jika berlaku, kita akan menghubungkannya kembali ke gate klasik yang sudah familiar.
Gate satu qubitโ
Gate : Ini adalah padanan kuantum dari operasi NOT. Tabel kebenarannya terlihat persis seperti Gate NOT klasik:
| Input | Output |
|---|---|
Dan representasi matriksnya:
Di Qiskit, membuat Circuit dengan Gate terlihat seperti ini:
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")
Dalam diagram Circuit yang sangat sederhana ini, qubit direpresentasikan oleh sebuah kabel, garis horizontal hitam, dan gate muncul sebagai kotak pada kabel tersebut.
Gate Hadamard: Membuat keadaan superposisi. Tabel kebenaran:
| Input | Output |
|---|---|
Representasi matriks:
Circuit dengan Gate Hadamard dibuat sebagai berikut:
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")
Gate : Menambahkan pergeseran fase ke keadaan :
| Input | Output |
|---|---|
Di Qiskit, membuat Circuit dengan Gate terlihat seperti ini:
qc = QuantumCircuit(1)
qc.z(0)
qc.draw("mpl")
Gate : Menambahkan pergeseran fase ke keadaan :
| Input | Output |
|---|---|
Di Qiskit, membuat Circuit dengan Gate terlihat seperti ini:
qc = QuantumCircuit(1)
qc.t(0)
qc.draw("mpl")
Gate multi-qubitโ
Gate dua qubit bisa menyerupai gate dua bit klasik, tapi dengan satu catatan penting: semua gate kuantum harus reversibel. Dalam istilah aljabar linear, artinya mereka direpresentasikan oleh matriks uniter. Dengan demikian, dua qubit input selalu dipetakan ke dua qubit output, dan operasi tersebut, pada prinsipnya, bisa dibalik. Ini bertentangan dengan gate klasik yang kita lihat di atas seperti AND atau OR, yang kehilangan informasi dan tidak dapat dibalik โ diberikan output, kamu tidak dapat menentukan input secara unik.
Gate CNOT (Controlled-NOT): Dua qubit input disebut qubit "kontrol" dan "target". Qubit kontrol tetap tidak berubah, tapi keadaannya menentukan apa yang terjadi pada qubit target. Jika qubit kontrol berada dalam keadaan , maka Gate diterapkan pada target; jika keadaan qubit kontrol adalah , maka tidak ada perubahan yang dibuat. Dalam notasi di bawah, asumsikan qubit (qubit paling kanan) adalah kontrol, dan qubit (qubit paling kiri) adalah target. Di bawah, notasi yang digunakan adalah
| Input | Output |
|---|---|
Jadi, matriks yang merepresentasikan aksi ini adalah:
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")
Ini adalah diagram Circuit pertama yang kita lihat dengan dua qubit, yang direpresentasikan oleh dua kabel. Gate CNOT diimplementasikan di antara dua qubit, dengan sebagai kontrol dan sebagai target.
Cek pemahamanmuโ
Baca pertanyaan di bawah ini, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Sebagian besar Gate memiliki bentuk matriks yang sama di Qiskit seperti di tempat lain. Tapi Gate CNOT bekerja pada dua Qubit, sehingga tiba-tiba konvensi pengurutan Qubit menjadi masalah. Teks yang mengurutkan Qubit akan menunjukkan bentuk matriks yang berbeda untuk Gate CNOT mereka. Verifikasi dengan perkalian matriks eksplisit bahwa matriks CNOT di atas memiliki aksi yang benar pada keadaan
Jawaban:
Gate SWAP: Gate ini menukar keadaan dua Qubit. Tabel kebenaran:
| Input | Output |
|---|---|
Jadi, matriks yang merepresentasikan aksi ini adalah:
qc = QuantumCircuit(2)
qc.swap(0, 1)
qc.draw("mpl")
Gate SWAP sebenarnya bisa dibangun dari tiga CNOT. Untuk melihat caranya, kita bisa decompose() Gate tersebut dengan Qiskit:
qc = QuantumCircuit(2)
qc.swap(0, 1)
qc.decompose().draw("mpl")
Di sini kita melihat untuk pertama kalinya bagaimana beberapa Gate ditampilkan dalam diagram Circuit. Kita membacanya dari kiri ke kanan, jadi Gate paling kiri diterapkan pertama.
Cek pemahamanmuโ
Baca pertanyaan di bawah ini, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Verifikasi bahwa kombinasi CNOT di atas menghasilkan Gate SWAP. Kamu bisa melakukannya dengan perkalian matriks atau metode lain apa pun.
Jawaban:
Dengan perkalian matriks:
Menggunakan tabel kebenaran untuk melihat bagaimana keadaan berubah dengan setiap CNOT. Pada kolom terakhir, keadaan harus setara dengan kolom "output" dari tabel kebenaran SWAP:
| Input | CNOT(A,B) | CNOT(B,A) | CNOT(A,B) |
|---|---|---|---|
Gate Toffoli (atau "controlled-controlled-NOT" (CCNOT)): Ini adalah Gate tiga Qubit. Nama "controlled-controlled-NOT" mungkin sudah memberi tahu kamu cara kerjanya: ada dua Qubit kontrol dan satu Qubit target, dan keadaan Qubit target dibalik hanya jika kedua Qubit kontrol berada dalam keadaan . Kita menggunakan konvensi pengurutan yang sama seperti yang kita gunakan dengan CNOT:
Jadi tabel kebenarannya adalah:
| Input | Output |
|---|---|
Dan matriks yang merepresentasikan aksi ini adalah:
qc = QuantumCircuit(3)
qc.ccx(0, 1, 2)
qc.draw("mpl")
Gate Toffoli juga bisa didekomposisi menjadi CNOT, bersama dengan beberapa Gate lainnya. Namun, ini jauh lebih rumit daripada dekomposisi Gate SWAP, sehingga akan dibiarkan sebagai latihan opsional di akhir modul untuk mengeksplorasi dan memverifikasi dekomposisi ini.
Pengukuranโ
Pengukuran memainkan peran khusus dalam komputasi kuantum โ peran yang tidak memiliki analog dalam komputasi klasik. Sementara dalam komputasi klasik, kamu bisa memeriksa bit-bit kamu di titik mana pun yang kamu pilih selama suatu algoritma, dalam komputasi kuantum, kamu harus sangat selektif tentang kapan harus melihat Qubit-mu karena pengukuran meruntuhkan keadaannya dan menghancurkan superposisi yang memberi Qubit kompleksitas komputasinya.
Secara khusus, diberikan keadaan kuantum -bit , sebuah pengukuran akan meruntuhkan keadaan ke salah satu fungsi basis dengan probabilitas sama dengan .
Tapi efek destruktif dari pengukuran ini tidak selalu menjadi hambatan. Ini sebenarnya adalah sumber daya kunci dalam algoritma dan protokol tertentu, seperti teleportasi kuantum dan distribusi kunci kuantum.
Di Qiskit, ketika pengukuran dilakukan, pengukuran tersebut dikirim ke register klasik di mana disimpan sebagai bit klasik. Membuat Circuit dengan pengukuran terlihat seperti ini:
qc = QuantumCircuit(
1, 1
) # the second number is the number of classical bits in the circuit
qc.measure(0, 0)
qc.draw("mpl")
Circuitโ
Sekarang kita tahu cara kerja Qubit, Gate, dan pengukuran, mari kita buat dan jalankan Circuit kuantum kita sendiri! Untuk ini, kita perlu mengenalkan kamu pada alur kerja yang berguna yang disebut Qiskit patterns.
Kerangka Qiskit patternsโ
Kerangka Qiskit patterns adalah prosedur umum untuk mendekati dan memecahkan masalah dengan komputer kuantum. Ini terdiri dari empat langkah:
- Pemetaan masalah kita ke Circuit kuantum dan operator
- Optimasi Circuit untuk hardware target
- Eksekusi pada hardware target
- Pasca-pemrosesan hasil kita
Untuk mengilustrasikan langkah-langkah ini, kita akan mengimplementasikan versi kuantum dari Circuit half-adder yang dibahas di atas.
1. Pemetaanโ
Circuit adder klasik menggunakan Gate XOR dan AND untuk menghitung bit sum dan carry, masing-masing. Kita bisa mengadaptasi Gate-Gate ini ke konteks kuantum untuk membuat quantum half adder. Pertama, ingat bahwa Gate kuantum bersifat reversibel, kita tidak bisa begitu saja menimpa input-nya. Sebaliknya, kita memperkenalkan dua Qubit helper yang diinisialisasi ke untuk menyimpan output sum dan carry. Jadi, keadaan kuantum penuh kita akan terdiri dari Qubit dan , serta Qubit sum dan carry, yang akan kita beri label dan :
Sekarang, kita perlu Gate kuantum yang menyelesaikan apa yang Gate XOR dan AND lakukan dalam Circuit klasik.
Sum:
Untuk XOR, kita menerapkan dua CNOT, masing-masing dengan Qubit kontrol dan serta Qubit target untuk keduanya. Jika dan berbeda, maka salah satu Gate CNOT akan membalik ke keadaan . Jika dan keduanya , maka tidak ada yang terjadi pada dan tetap dalam keadaan . Jika dan keduanya , maka keadaan akan dibalik dua kali, membawanya kembali ke keadaan .
Carry:
Untuk bit carry, kita perlu sesuatu yang bekerja seperti Gate AND klasik.
Cek pemahamanmuโ
Baca pertanyaan di bawah ini, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Lihat kembali Gate-Gate yang telah kita diskusikan untuk melihat apakah kamu bisa menebak Gate kuantum mana yang akan kita gunakan sebagai pengganti Gate AND klasik:
Jawaban:
Itu adalah Gate Toffoli! Ingat, Gate Toffoli, atau controlled-controlled-NOT, membalik keadaan target jika dan hanya jika Qubit kontrol 0 DAN Qubit kontrol 1 keduanya . Jadi, jika Qubit target dimulai dalam keadaan , maka aksinya sama dengan Gate AND.
Jadi, sekarang kita memiliki semua bahan yang kita butuhkan untuk membuat Circuit kuantum:
# qubits: a, b, sum, carry
qc = QuantumCircuit(4)
# Choose values for A and B:
a = 0
b = 0
# Prepare A and B qubits according to selected values:
if a:
qc.x(0)
if b:
qc.x(1)
# XOR (sum) into qubit 2
qc.cx(0, 2)
qc.cx(1, 2)
# AND (carry) into qubit 3
qc.ccx(0, 1, 3) # a AND b
# measure
qc.measure_all()
qc.draw("mpl")
Di atas adalah diagram Circuit untuk Circuit quantum half-adder. Seperti yang disebutkan sebelumnya, kabel mewakili Qubit hingga yang diurutkan dari atas ke bawah, dan register bit klasik adalah kabel berlapis ganda di bagian bawah. Kemudian, membaca dari kiri ke kanan, kita melihat bagaimana Gate diterapkan pada setiap Qubit dengan melihat di mana kotak-kotak muncul pada kabel yang sesuai. Terakhir, pengukuran ditampilkan di bagian akhir. Pengukuran meruntuhkan keadaan Qubit menjadi nilai atau yang pasti, dan hasilnya dikirim ke register klasik.
Satu hal yang perlu diperhatikan: meskipun diagram Circuit digambar dari kiri ke kanan, ketika menulis ekspresi matriks yang sesuai kita harus membacanya dari kanan ke kiri. Ini karena dalam perkalian matriks, operator yang paling dekat dengan vektor keadaan (yang paling kanan) bertindak pertama. Jadi, misalnya, Circuit di atas (mengabaikan pengukuran) akan ditulis sebagai:
2. Optimasi:โ
Selanjutnya, kita perlu mengoptimalkan Circuit untuk dijalankan pada hardware kuantum. Optimasi ini dilakukan melalui Transpiler, yang menerjemahkan Circuit abstrak yang ditunjukkan di atas menjadi instruksi yang akan dipahami oleh komputer kuantum. Ini menetapkan Qubit logis di atas ke Qubit fisik nyata pada prosesor dan menulis ulang Gate dalam hal set Gate native-nya sendiri yang telah dioptimalkan untuk dijalankan pada komputer kuantum. Akhirnya, Transpiler juga mengimplementasikan sesuatu yang disebut "penekanan dan mitigasi kesalahan" untuk mencoba meminimalkan efek kesalahan pada hasil. Ini tidak terlalu penting untuk Circuit kita yang sangat sederhana, tapi jika kamu melanjutkan perjalanan komputasi kuantum untuk menjalankan Circuit yang lebih rumit, kamu akan segera melihat nilai penekanan dan mitigasi kesalahan. Jika kamu ingin mempelajari lebih lanjut tentang ini, lihat kursus Olivia Lane, Quantum Computing in Practice.
Pertama, kita memuat paket yang diperlukan untuk berkomunikasi dengan komputer kuantum IBMยฎ dan memilih Backend untuk dijalankan. Kita bisa memilih Backend yang paling tidak sibuk, atau memilih Backend tertentu yang propertinya sudah kita ketahui.
Ada kode di bawah ini untuk menyimpan kredensial kamu saat pertama kali digunakan. Pastikan untuk menghapus informasi ini dari notebook setelah menyimpannya ke lingkunganmu, agar kredensialmu tidak secara tidak sengaja dibagikan saat kamu berbagi notebook. Lihat Siapkan akun IBM Cloud kamu dan Inisialisasi layanan di lingkungan yang tidak tepercaya untuk panduan lebih lanjut.
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService
# Load the Qiskit Runtime service
# Syntax for first saving your token. Delete these lines after saving your credentials.
# QiskitRuntimeService.save_account(channel='ibm_quantum_platform', instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR-API_KEY>', overwrite=True, set_as_default=True)
# service = QiskitRuntimeService(channel='ibm_quantum_platform')
# Load saved credentials
service = QiskitRuntimeService()
# Use the least busy backend, or uncomment the loading of a specific backend like "ibm_brisbane".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_brisbane")
print(backend.name)
ibm_fez
Sekarang, kita menggunakan Transpiler untuk mengoptimalkan Circuit. Kita bisa memilih tingkat optimasi dari 0 (tanpa optimasi) hingga 3 (optimasi tertinggi). Untuk melihat apa yang dihasilkan setiap tingkat, kunjungi panduan Atur tingkat optimasi Transpiler. Circuit yang dihasilkan akan terlihat sangat berbeda dari Circuit logis yang kita buat pada langkah pemetaan.
# Transpile the circuit and optimize for running on the quantum computer selected
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
qc_isa.draw("mpl")
"Sampler" adalah primitif yang dirancang untuk mengambil sampel kemungkinan keadaan yang dihasilkan dari Circuit kuantum, dan mengumpulkan statistik tentang keadaan apa yang mungkin diukur dan dengan probabilitas berapa. Kita mengimpor Qiskit Runtime Sampler di sini:
# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler
sampler = Sampler(mode=backend)
Jika kamu telah menghabiskan waktu yang dialokasikan pada komputer kuantum nyata atau jika kamu tidak memiliki koneksi internet, kamu mungkin lebih memilih menggunakan simulator. Untuk melakukan ini, jalankan sel di bawah ini dan batalkan komentar pada baris terkait di langkah "Eksekusi".
# Load the backend sampler
from qiskit.primitives import BackendSamplerV2
# Load the Aer simulator and generate a noise model based on the currently-selected backend.
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel
noise_model = NoiseModel.from_backend(backend)
# Define a simulator using Aer, and use it in Sampler.
backend_sim = AerSimulator(noise_model=noise_model)
sampler_sim = BackendSamplerV2(backend=backend_sim)
# Alternatively, load a fake backend with generic properties and define a simulator.
# backend_gen = GenericBackendV2(num_qubits=18)
# sampler_gen = BackendSamplerV2(backend=backend_gen)
3. Eksekusiโ
Setelah mempersiapkan Circuit, kita sekarang bisa menjalankannya di komputer kuantum!
job = sampler.run([qc_isa], shots=100)
# job = sampler_sim.run([qc_isa]) # uncomment if you want to run on a simulator
res = job.result()
counts = res[0].data.meas.get_counts()
4. Pasca-pemrosesanโ
Sekarang kita siap melihat hasil kita! Kita akan menampilkan histogram dari 100 sampel Circuit.
from qiskit.visualization import plot_histogram
print("counts = ", counts)
plot_histogram(counts)
counts = {'0000': 90, '0100': 4, '1100': 3, '0010': 3}
Histogram di atas menunjukkan hasil pengukuran dari keempat Qubit di akhir Circuit. Komputer kuantum ideal dengan nol noise akan selalu mengukur Qubit memiliki nilai yang sama setiap kali, tapi pada kenyataannya, noise akan menyebabkan beberapa run menghasilkan kesalahan.
Cek pemahamanmuโ
Baca pertanyaan di bawah ini, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Menggunakan bitstring dengan jumlah terbanyak sebagai nilai kamu untuk , , , dan , verifikasi bahwa Circuit quantum adder bekerja.
Jawaban:
Kita perlu memverifikasi bahwa . Ingat bahwa urutan bitstring mengikuti notasi little-endian, jadi dibaca CSBA.
Dari histogram di atas, kita melihat bahwa bitstring 0000 adalah yang dominan.
Kembali dan ubah nilai dan menjadi dan lalu jalani kembali langkah-langkah Qiskit patterns untuk menjalankan ulang Circuit. Verifikasi bahwa Circuit adder bekerja lagi.
Jawaban:
Kamu seharusnya mendapatkan histogram dengan bitstring dominan 1011:
Salah satu fitur tambahan dari quantum half-adder dibanding classical half-adder adalah bahwa ia bisa berjalan dengan input kuantum. Artinya, ia bisa "menjumlahkan" Qubit dan meskipun keduanya berada dalam keadaan superposisi. Di bagian Pertanyaan Tantangan di bawah, kamu akan diminta untuk mempersiapkan Qubit dalam superposisi dan melihat apa yang terjadi!
Kesimpulanโ
Modul ini dirancang untuk memberimu pemahaman dasar yang kuat tentang prinsip-prinsip dasar di balik komputasi kuantum dengan membandingkannya dengan komputasi klasik. Kita melihat Circuit classical half-adder lalu menunjukkan cara mengadaptasi Circuit tersebut untuk dijalankan dengan Qubit di komputer kuantum. Sekarang kamu siap untuk menjelajahi modul-modul Qiskit in the Classroom lainnya!
Konsep penting:โ
- Berbeda dengan bit klasik yang hanya bisa mengambil nilai 0 dan 1, Qubit juga bisa berada dalam keadaan superposisi dari keduanya.
- Beberapa Qubit bisa berada dalam superposisi atas bitstring yang diizinkan secara klasik yang disebut keadaan basis komputasi.
- Beberapa Qubit bisa terjerat sehingga keadaan satu bergantung pada keadaan yang lain.
- Konvensi Qiskit adalah menggunakan notasi little-endian, yang menempatkan Qubit paling tidak signifikan, , di posisi paling kanan dan Qubit paling signifikan, , paling kiri.
- Gate kuantum adalah operasi reversibel yang direpresentasikan oleh matriks uniter yang bekerja pada vektor keadaan kuantum. Dalam notasi ini, matriks yang paling dekat dengan vektor (yang paling kanan) bertindak pertama.
- Pengukuran meruntuhkan keadaan superposisi kuantum menjadi salah satu keadaan yang diizinkan secara klasik, dengan probabilitas sama dengan kuadrat amplitudo keadaan basis komputasi yang sesuai dalam superposisi.
- Circuit kuantum sering direpresentasikan menggunakan diagram Circuit kuantum, di mana Qubit digambarkan sebagai kabel horizontal, dan Gate kuantum muncul di sepanjang kabel ini dari kiri ke kanan.
- Untuk menjalankan Circuit kuantum, kita menggunakan empat langkah dalam alur kerja Qiskit patterns: Peta, Optimasi, Eksekusi, Pasca-proses.
Pertanyaanโ
Pertanyaan Benar/Salahโ
-
Satu bit dalam komputer klasik hanya bisa menyimpan nilai 0 atau 1.
-
Keterikatan berarti keadaan satu Qubit tidak bergantung pada keadaan Qubit lain.
-
Gate kuantum umumnya adalah operasi yang tidak reversibel.
-
Konvensi Qiskit menempatkan Qubit paling tidak signifikan, , di posisi paling kiri.
-
Mengukur keadaan kuantum selalu memberikan hasil yang sama persis jika diulang berkali-kali.
-
Gate Hadamard menciptakan superposisi dalam satu Qubit.
-
Circuit kuantum mungkin menyertakan operasi pengukuran yang meruntuhkan keadaan superposisi menjadi salah satu keadaan yang diizinkan secara klasik.
-
Jumlah kemungkinan keadaan klasik untuk bit adalah .
-
Probabilitas hasil untuk pengukuran kuantum diberikan oleh kuadrat amplitudo keadaan basis yang dapat diukur secara klasik.
Pertanyaan Jawaban Singkatโ
-
Apa saja perbedaan utama antara bit dan Qubit?
-
Apa yang terjadi pada keadaan kuantum ketika diukur?
-
Mengapa kita menggunakan notasi little-endian di Qiskit?
-
Apa saja empat langkah dalam alur kerja Qiskit patterns?
Pertanyaan Tantangan:โ
-
Dalam modul ini, kita hanya menggunakan adder untuk menjumlahkan keadaan yang diizinkan secara klasik untuk dan . Tapi kita juga bisa mempersiapkan dan dalam superposisi! Ubah kode untuk mempersiapkan setiap Qubit dalam superposisi yang sama dari 0 dan 1, lalu jalankan Circuit baru dan dapatkan histogram baru. Apa yang kamu lihat? Jelaskan apa yang terjadi.
-
Dekomposisi Gate Toffoli. Gunakan
decompose()untuk menunjukkan bagaimana Gate Toffoli didekomposisi menjadi Gate satu dan dua Qubit, lalu verifikasi konstruksi ini dengan perkalian matriks. Ingat bahwa meskipun diagram Circuit dibaca dari kiri ke kanan, matriks diterapkan ke keadaan kuantum dari kanan ke kiri!