Lewati ke konten utama

Mulai menggunakan Qiskit di kelas

Untuk modul Qiskit in Classrooms ini, siswa harus memiliki lingkungan Python yang berfungsi dengan paket-paket berikut terinstal:

  • qiskit v2.1.0 atau lebih baru
  • qiskit-ibm-runtime v0.40.1 atau lebih baru
  • qiskit-aer v0.17.0 atau lebih baru
  • qiskit.visualization
  • numpy
  • pylatexenc

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 = 00004 = 01008 = 100012 = 1100
1 = 00015 = 01019 = 100113 = 1101
2 = 00106 = 011010 = 101014 = 1110
3 = 00117 = 011111 = 101115 = 1111

Secara umum, untuk mengonversi bilangan biner sebanyak NN bit ke angka basis-10 yang biasa kamu kenal, kalikan bit paling tidak signifikan (paling kanan) dengan 20=12^0 = 1, bit berikutnya ke kiri dengan 21=22^1 = 2, lalu berikutnya dengan 22=42^2 = 4, dan seterusnya, hingga mencapai bit paling signifikan (paling kiri), yang dikali 2N12^{N-1}.

Jadi, artinya NN bit bisa berada di salah satu dari 2N2^N 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, NN bit memungkinkan kamu merepresentasikan angka 00 hingga 2N12^N - 1, jadi menggunakan enam bit akan menghasilkan angka hingga 261=632^6 - 1 = 63. Itu belum cukup. Kita tambahkan satu bit lagi untuk mencapai 271=1272^7 - 1 = 127. Sekarang mari kita uraikan 86 ke dalam pangkat 2:

86=64+16+4+2=26×1+25×0+24×1+23×0+22×1+21×1+20×0=1010110\begin{aligned} 86 &= 64 + 16 + 4 + 2 \\ &= 2^6 \times 1 + 2^5 \times 0 + 2^4 \times 1 + 2^3 \times 0 + 2^2 \times 1 + 2^1 \times 1 + 2^0 \times 0 \\ &= 1010110 \end{aligned}

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:

InputOutput
01
10

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:

InputOutput
000
010
100
111

OR

OR adalah gate dua bit lain dengan satu bit output. Menghasilkan 1 jika salah satu bit adalah 1:

InputOutput
000
011
101
111

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:

InputOutput
000
011
101
110

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:

Diagram sirkuit klasik untuk sirkuit half-adder. Gate XOR menghasilkan bit output Sum dan gate AND menghasilkan bit output Carry.

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:

AABBSum (ABA \oplus B)Carry (ABA \wedge B)
0000
0110
1010
1101

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 A+B=S+2×CA+B=S+2 \times C.

Jawaban:

0+0=0+0=0 0+1=1+0=1 1+0=1+0=1 1+1=0+2=2 \begin{aligned} 0+0 &= 0+0 = 0 ~\checkmark \\ 0+1 &= 1+0 = 1 ~\checkmark \\ 1+0 &= 1+0 = 1 ~\checkmark \\ 1+1 &= 0+2 = 2 ~\checkmark \\ \end{aligned}

Komputer kuantum

Bit \rightarrow 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 0\vert 0\rangle dan 1\vert 1\rangle. Tapi tidak seperti bit klasik, bit kuantum juga bisa berada dalam superposisi dari kedua keadaan 0\vert 0\rangle dan 1\vert 1\rangle secara bersamaan. Secara umum, sebuah qubit bisa berada dalam keadaan ψ\vert \psi\rangle dengan bentuk:

ψ=c00+c11\vert \psi\rangle = c_0 \vert 0\rangle + c_1 \vert 1\rangle

di mana c0c_0 dan c1c_1 adalah amplitudo kompleks dengan c02+c12=1\vert c_0 \vert ^2+\vert c_1\vert ^2=1.

Fase kuantum

Karena c0c_0 dan c1c_1 adalah bilangan kompleks, masing-masing bisa ditulis sebagai ci=cieiϕic_i = \vert c_i\vert e^{i\phi_i} di mana ϕi\phi_i 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" eiϕ0e^{i\phi_0}, sehingga:

ψ=c00+c1eiϕ1\vert \psi\rangle = \vert c_0\vert \vert 0\rangle + \vert c_1\vert e^{i\phi}\vert 1\rangle

di mana ϕ=ϕ1ϕ0\phi = \phi_1-\phi_0 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 NN bit bisa berada di salah satu dari 2N2^N keadaan yang mungkin mulai dari bilangan biner 000...000 hingga 111...111. Tapi sekarang, karena prinsip superposisi, NN qubit bisa berada dalam superposisi dari semua keadaan tersebut sekaligus!

Ini bisa diekspresikan sebagai

ψN=i=02N1cii\psi_N = \sum_{i=0}^{2^N-1} c_i \vert i\rangle

di mana, seperti dalam kasus klasik, keadaan i\vert i\rangle bersesuaian dengan keadaan di mana setiap qubit berada dalam kombinasi 0 dan 1 yang tepat untuk menghasilkan bilangan biner ii. Ini dikenal sebagai "keadaan basis komputasi" dari sistem kuantum. Misalnya, keadaan tiga qubit bisa ditulis sebagai superposisi dari delapan keadaan basis komputasinya:

ψ3=c0000+c1001+c2010+c3011+c4100+c5101+c6110+c7111\psi_3 = c_0 \vert 000\rangle + c_1 \vert 001\rangle + c_2 \vert 010\rangle + c_3 \vert 011\rangle + c_4 \vert 100\rangle + c_5 \vert 101\rangle + c_6 \vert 110\rangle + c_7 \vert 111\rangle

Setiap qubit dalam sistem ditandai dengan indeks 00 hingga N1N-1. Konvensinya adalah membaca keadaan qubit dari kanan ke kiri, sehingga keadaan qubit 00 adalah yang paling kanan dan keadaan qubit N1N-1 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 00 dengan bit paling tidak signifikan, yang dikalikan dengan 202^0 dan qubit N1N-1 dengan bit paling signifikan, yang dikalikan dengan 2N12^{N-1}.

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 c0=c3=12c_0 = c_3 = \frac{1}{\sqrt{2}} dan c1=c2=0c_1 = c_2 = 0:

ψ=12(00+11)\vert \psi\rangle = \frac{1}{\sqrt{2}}(\vert 00\rangle + \vert 11\rangle)

Jadi, keadaan qubit 0 bisa berupa 0\vert 0\rangle atau 1\vert 1\rangle 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 0\vert 0\rangle, maka kita tahu bahwa qubit 1 juga akan berada dalam 0\vert 0\rangle. 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

ψ=12(01+10)\vert \psi\rangle = \frac{1}{\sqrt{2}}(\vert 01\rangle + \vert 10\rangle)

menghasilkan hasil yang berlawanan setiap saat: jika satu qubit diukur 0\vert 0\rangle, yang lain dijamin ditemukan dalam keadaan 1\vert 1\rangle.

Cek pemahamanmu

Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.

Apakah keadaan ψ=11\vert \psi\rangle = \vert 11\rangle 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 1\vert 1\rangle. Hasil pengukuran satu qubit sebenarnya tidak bergantung pada yang lain — keduanya hanya selalu 1\vert 1\rangle.

Secara umum, jika kamu bisa mendeskripsikan keadaan setiap qubit secara terpisah lalu mengalikannya seperti ini:

ψ=ψ1ψ0\vert \psi\rangle = \vert \psi_1\rangle \vert \psi_0\rangle

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: 0=(10)\vert 0\rangle = \begin{pmatrix}1 \\ 0\end{pmatrix} 1=(01)\vert 1\rangle = \begin{pmatrix}0 \\ 1\end{pmatrix} Dengan cara ini, keadaan sembarang ψ=a0+b1\vert \psi\rangle = a\vert 0\rangle+b\vert 1\rangle bisa ditulis sebagai ψ=(ab)\vert \psi\rangle =\begin{pmatrix}a \\ b\end{pmatrix}

Untuk keadaan nn-qubit umum, kita akan membutuhkan vektor berdimensi 2n2^n, dengan keadaan basis yang diurutkan seperti yang mungkin kamu harapkan, dalam nilai biner yang meningkat:

0000=(1000),0001=1110=(0010),1111=(0001)\vert 0 \dots 000\rangle = \begin{pmatrix}1 \\ 0 \\ 0 \\ \vdots \\ 0\end{pmatrix}, \vert 0 \dots 001 \rangle = \vert 1 \dots 110\rangle = \begin{pmatrix}0 \\ \vdots \\ 0 \\ 1 \\ 0\end{pmatrix}, \vert 1 \dots 111 \rangle = \begin{pmatrix}0 \\ \vdots \\ 0 \\ 0\\ 1\end{pmatrix}

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:

00=(1000),01=(0100),,10=(0010),11=(0001)\vert 00\rangle = \begin{pmatrix}1 \\ 0 \\ 0 \\ 0\end{pmatrix}, \vert 01 \rangle = \begin{pmatrix}0 \\ 1 \\ 0 \\ 0\end{pmatrix}, \dots, \vert 10\rangle = \begin{pmatrix}0 \\ 0 \\ 1 \\ 0\end{pmatrix}, \vert 11 \rangle = \begin{pmatrix}0 \\ 0 \\ 0\\ 1\end{pmatrix}

Gate \rightarrow 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 0|0\rangle dan 1|1\rangle 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 XX: Ini adalah padanan kuantum dari operasi NOT. Tabel kebenarannya terlihat persis seperti Gate NOT klasik:

InputOutput
0\vert 0\rangle1\vert 1\rangle
1\vert 1\rangle0\vert 0\rangle

Dan representasi matriksnya:

X=(0110)X=\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}

Di Qiskit, membuat Circuit dengan Gate XX terlihat seperti ini:

from qiskit import QuantumCircuit

qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")

Output of the previous code cell

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:

InputOutput
0\vert 0\rangle12(0+1)\frac{1}{\sqrt{2}}\left(\vert 0\rangle+\vert 1\rangle\right)
1\vert 1\rangle12(01)\frac{1}{\sqrt{2}}\left(\vert 0\rangle-\vert 1\rangle\right)

Representasi matriks: H=12(1111)H=\frac{1}{\sqrt{2}}\begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix}

Circuit dengan Gate Hadamard dibuat sebagai berikut:

from qiskit import QuantumCircuit

qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")

Output of the previous code cell

Gate ZZ: Menambahkan pergeseran fase Δϕ=π\Delta \phi = \pi ke keadaan 1|1\rangle:

InputOutput
0\vert 0\rangle0\vert 0\rangle
1\vert 1\rangle1-\vert 1\rangle

Z=(1001)Z=\begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}

Di Qiskit, membuat Circuit dengan Gate ZZ terlihat seperti ini:

qc = QuantumCircuit(1)
qc.z(0)
qc.draw("mpl")

Output of the previous code cell

Gate TT: Menambahkan pergeseran fase Δϕ=π/4\Delta \phi = \pi/4 ke keadaan 1|1\rangle:

InputOutput
0\vert 0\rangle0\vert 0\rangle
1\vert 1\rangleeiπ/41e^{i\pi/4}\vert 1\rangle

T=(100eiπ/4)T=\begin{pmatrix} 1 & 0 \\ 0 & e^{i\pi/4} \end{pmatrix}

Di Qiskit, membuat Circuit dengan Gate TT terlihat seperti ini:

qc = QuantumCircuit(1)
qc.t(0)
qc.draw("mpl")

Output of the previous code cell

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 1\vert 1\rangle, maka Gate XX diterapkan pada target; jika keadaan qubit kontrol adalah 0\vert 0\rangle, maka tidak ada perubahan yang dibuat. Dalam notasi di bawah, asumsikan qubit AA (qubit paling kanan) adalah kontrol, dan qubit BB (qubit paling kiri) adalah target. Di bawah, notasi yang digunakan adalah CNOT(qcontrol,qtarget)BA.CNOT(q_{control},q_{target})\vert BA\rangle.

CNOT(A,B)BAinput=BAoutputCNOT(A,B)\vert BA\rangle_{input} = \vert BA\rangle_{output}

InputOutput
00\vert 00\rangle00\vert 00\rangle
01\vert 01\rangle11\vert 11\rangle
10\vert 10\rangle10\vert 10\rangle
11\vert 11\rangle01\vert 01\rangle

Jadi, matriks yang merepresentasikan aksi ini adalah:

CNOT=(1000000100100100)CNOT=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix}

qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")

Output of the previous code cell

Ini adalah diagram Circuit pertama yang kita lihat dengan dua qubit, yang direpresentasikan oleh dua kabel. Gate CNOT diimplementasikan di antara dua qubit, dengan q0q_0 sebagai kontrol dan q1q_1 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 q0,q1,...\vert q_0,q_1,...\rangle 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 01.\vert 01\rangle.

Jawaban:

CNOT01=(1000000100100100)(0100)=(0001)=11CNOT\vert 01\rangle =\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix}\begin{pmatrix}0 \\ 1 \\ 0 \\0\end{pmatrix} = \begin{pmatrix}0 \\ 0 \\ 0 \\1\end{pmatrix} = \vert 11\rangle

Gate SWAP: Gate ini menukar keadaan dua qubit. Tabel kebenaran:

InputOutput
00\vert 00\rangle00\vert 00\rangle
01\vert 01\rangle10\vert 10\rangle
10\vert 10\rangle01\vert 01\rangle
11\vert 11\rangle11\vert 11\rangle

Jadi, matriks yang merepresentasikan aksi ini adalah:

SWAP=(1000001001000001)SWAP=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1\end{pmatrix}

qc = QuantumCircuit(2)
qc.swap(0, 1)
qc.draw("mpl")

Output of the previous code cell

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")

Output of the previous code cell

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:

(1000000100100100)(1000010000010010)(1000000100100100)=(1000001001000001)=SWAP \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0\end{pmatrix} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1\end{pmatrix} = SWAP ~\checkmark

Menggunakan tabel kebenaran untuk melihat bagaimana keadaan berubah dengan setiap CNOT. Pada kolom terakhir, keadaan harus setara dengan kolom "output" dari tabel kebenaran SWAP:

InputCNOT(A,B)CNOT(B,A)CNOT(A,B)
00\vert 00\rangle00\vert 00\rangle00\vert 00\rangle00\vert 00\rangle \checkmark
01\vert 01\rangle11\vert 11\rangle10\vert 10\rangle10\vert 10\rangle \checkmark
10\vert 10\rangle10\vert 10\rangle11\vert 11\rangle01\vert 01\rangle \checkmark
11\vert 11\rangle01\vert 01\rangle01\vert 01\rangle11\vert 11\rangle \checkmark

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 1\vert 1\rangle. Kita menggunakan konvensi pengurutan yang sama seperti yang kita gunakan dengan CNOT:

CCNOT(ControlA,ControlB,TargetC)CBACCNOT(Control A, Control B, Target C)\vert CBA\rangle

Jadi tabel kebenarannya adalah:

InputOutput
000\vert 000\rangle000\vert 000\rangle
001\vert 001\rangle001\vert 001\rangle
010\vert 010\rangle010\vert 010\rangle
011\vert 011\rangle111\vert 111\rangle
100\vert 100\rangle100\vert 100\rangle
101\vert 101\rangle101\vert 101\rangle
110\vert 110\rangle110\vert 110\rangle
111\vert 111\rangle011\vert 011\rangle

Dan matriks yang merepresentasikan aksi ini adalah:

CCNOT=(1000000001000000001000000000000100001000000001000000001000010000)CCNOT=\begin{pmatrix} 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\0 & 1 & 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0\end{pmatrix}
qc = QuantumCircuit(3)
qc.ccx(0, 1, 2)
qc.draw("mpl")

Output of the previous code cell

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 NN-bit ψ=i=02N1cii\vert \psi\rangle = \sum_{i=0}^{2^N-1} c_i \vert i\rangle, sebuah pengukuran akan meruntuhkan keadaan ke salah satu fungsi basis i\vert i\rangle dengan probabilitas sama dengan ci2\vert c_i\vert ^2.

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")

Output of the previous code cell

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:

  1. Pemetaan masalah kita ke Circuit kuantum dan operator
  2. Optimasi Circuit untuk hardware target
  3. Eksekusi pada hardware target
  4. 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 0\vert 0\rangle untuk menyimpan output sum dan carry. Jadi, keadaan kuantum penuh kita akan terdiri dari qubit AA dan BB, serta qubit sum dan carry, yang akan kita beri label SS dan CC:

ψ=CSBA\vert \psi\rangle = \vert C S B A\rangle

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 AA dan BB serta qubit target SS untuk keduanya. Jika AA dan BB berbeda, maka salah satu Gate CNOT akan membalik SS ke keadaan 1\vert 1\rangle. Jika AA dan BB keduanya 0\vert 0\rangle, maka tidak ada yang terjadi pada SS dan tetap dalam keadaan 0\vert 0\rangle. Jika AA dan BB keduanya 1\vert 1\rangle, maka keadaan SS akan dibalik dua kali, membawanya kembali ke keadaan 0\vert 0\rangle.

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 1\vert 1\rangle. Jadi, jika qubit target dimulai dalam keadaan 0\vert 0\rangle, 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")

Output of the previous code cell

Di atas adalah diagram Circuit untuk Circuit quantum half-adder. Seperti yang disebutkan sebelumnya, kabel mewakili qubit 00 hingga 33 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 00 atau 11 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:

CCNOT(q0,q1,q3)CNOT(q1,q2)CNOT(q0,q2)q3q2q1q0CCNOT(q_0,q_1,q_3)CNOT(q_1, q_2)CNOT(q_0,q_2)\vert q_3 q_2 q_1 q_0\rangle

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")

Output of the previous code cell

"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}

Output of the previous code cell

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 AA, BB, SS, dan CC, verifikasi bahwa Circuit quantum adder bekerja.

Jawaban:

Kita perlu memverifikasi bahwa A+B=S+2×CA+B = S+2 \times C. Ingat bahwa urutan bitstring mengikuti notasi little-endian, jadi dibaca CSBA.

Dari histogram di atas, kita melihat bahwa bitstring 0000 adalah yang dominan.

0+0=0+0×2=0 0 + 0 = 0 + 0 \times 2 = 0 ~\checkmark

Kembali dan ubah nilai AA dan BB menjadi A=1A=1 dan B=1B=1 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:

1+1=0+1×2=2 1 + 1 = 0 + 1 \times 2 = 2 ~\checkmark

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 AA dan BB 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, q0q_0, di posisi paling kanan dan qubit paling signifikan, qNq_N, 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

  1. Satu bit dalam komputer klasik hanya bisa menyimpan nilai 0 atau 1.

  2. Keterikatan berarti keadaan satu qubit tidak bergantung pada keadaan qubit lain.

  3. Gate kuantum umumnya adalah operasi yang tidak reversibel.

  4. Konvensi Qiskit menempatkan qubit paling tidak signifikan, q0q_0, di posisi paling kiri.

  5. Mengukur keadaan kuantum selalu memberikan hasil yang sama persis jika diulang berkali-kali.

  6. Gate Hadamard menciptakan superposisi dalam satu qubit.

  7. Circuit kuantum mungkin menyertakan operasi pengukuran yang meruntuhkan keadaan superposisi menjadi salah satu keadaan yang diizinkan secara klasik.

  8. Jumlah kemungkinan keadaan klasik untuk NN bit adalah 2N2N.

  9. Probabilitas hasil untuk pengukuran kuantum diberikan oleh kuadrat amplitudo keadaan basis yang dapat diukur secara klasik.

Pertanyaan Jawaban Singkat

  1. Apa saja perbedaan utama antara bit dan qubit?

  2. Apa yang terjadi pada keadaan kuantum ketika diukur?

  3. Mengapa kita menggunakan notasi little-endian di Qiskit?

  4. Apa saja empat langkah dalam alur kerja Qiskit patterns?

Pertanyaan Tantangan:

  1. Dalam modul ini, kita hanya menggunakan adder untuk menjumlahkan keadaan yang diizinkan secara klasik untuk AA dan BB. Tapi kita juga bisa mempersiapkan AA dan BB 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.

  2. 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!