Beberapa Qubit Dan Keterikatan
Beberapa Qubit Dan Keterikatan
1. Pengantar
Dapat dilihat beberapa efek menarik gerbang qubit tunggal, tetapi kekuatan sebenarnya
dari komputasi kuantum diwujudkan melalui interaksi antar qubit. Pada bagian ini akan
memperkenalkan beberapa gerbang qubit dan mengeksplorasi perilaku menarik dari sistem
multi-qubit.
Biasanya, gerbang yang dapat langsung diterapkan di perangkat keras hanya akan
bertindak pada satu atau dua qubit. Di sirkuit ini, akan menggunakan gerbang kompleks yang
bekerja pada sejumlah besar qubit. Untungnya, hal ini tidak menjadi masalah. Dengan satu
dan dua gerbang qubit yang diberikan oleh perangkat keras, dimungkinkan untuk
membangun gerbang lainnya.
Dalam bab ini, pertama akan memperkenalkan gerbang multi-qubit paling dasar, serta
matematika yang digunakan untuk mendeskripsikan dan menganalisisnya. Kemudian akan
menunjukkan cara membuktikan bahwa gerbang ini dapat digunakan untuk membuat
algoritme kuantum apa pun yang memungkinkan. Bab ini kemudian diakhiri dengan melihat
penggunaan gerbang kuantum skala kecil. Misalnya, kita melihat bagaimana membangun
gerbang tiga qubit seperti Toffoli dari operasi satu dan dua qubit.
* Ini adalah Toffoli dengan 3 qubit (q0, q1, q2) masing-masing. Dalam contoh rangkaian ini, q0
dihubungkan dengan q2 tetapi q0 tidak dihubungkan dengan q1.
00 01 10 11
Dan untuk menggambarkan keadaan dua qubit membutuhkan empat amplitudo yang
kompleks. Dan menyimpan amplitudo ini dalam vektor 4D seperti:
Jika kita memiliki dua qubit yang terpisah, kita dapat mendeskripsikan status kolektifnya
menggunakan produk tensor:
Dan mengikuti aturan yang sama, kita dapat menggunakan produk tensor untuk
mendeskripsikan status kolektif sejumlah qubit. Berikut adalah contoh dengan tiga qubit:
Jika kita punya n qubit, harus terus memantau 2n amplitudo kompleks. Seperti yang bisa kita
lihat, vektor-vektor ini tumbuh secara eksponensial dengan jumlah qubit. Inilah alasan
mengapa komputer kuantum dengan jumlah qubit yang besar sangat sulit untuk
disimulasikan. Laptop modern dapat dengan mudah mensimulasikan keadaan kuantum umum
sekitar 20 qubit, tetapi mensimulasikan 100 qubit terlalu sulit untuk superkomputer terbesar.
Mari kita lihat contoh rangkaian:
import numpy as np
qc = QuantumCircuit(3)
qc.draw()
Setiap qubit ada di keadaan |+⟩, jadi kita harus melihat vektornya:
svsim = Aer.get_backend('statevector_simulator')
qobj = assemble(qc)
final_state = svsim.run(qobj).result().get_statevector()
tetapi mungkin tidak jelas bagaimana gerbang-X akan bertindak pada qubit dalam vektor
multi-qubit. Untungnya, aturannya cukup sederhana; sama seperti kita menggunakan hasil
kali tensor untuk menghitung vektor keadaan banyak qubit, kita menggunakan hasil perkalian
tensor untuk menghitung matriks yang bekerja pada vektor keadaan ini. Misalnya pada
rangkaian di bawah ini:
qc = QuantumCircuit(2)
qc.h(0)
qc.x(1)
qc.draw()
Yang kemudian dapat kita terapkan ke statevector 4D |q1q0⟩. Ini bisa menjadi sangat
berantakan, Anda akan sering melihat notasi yang lebih jelas:
usim = Aer.get_backend('unitary_simulator')
qobj = assemble(qc)
unitary = usim.run(qobj).result().get_unitary()
dan lihat hasilnya,
Jika kita ingin menerapkan gerbang hanya ke satu qubit pada satu waktu (seperti pada
rangkaian di bawah), kita menggambarkannya menggunakan produk tensor dengan matriks
identitas, misalnya:
qc = QuantumCircuit(2)
qc.x(1)
qc.draw()
# simulasikan kesatuan
usim = Aer.get_backend('unitary_simulator')
qobj = assemble(qc)
unitary = usim.run(qobj).result().get_unitary()
# tampilkan hasilnya:
3. Gerbang Multi-Qubit
Sekarang kita tahu bagaimana merepresentasikan keadaan beberapa qubit. Gerbang dua-qubit
yang penting adalah gerbang CNOT.
# mengaplikasikan CNOT
qc.cx(0,1)
#melihat sirkuit:
qc.draw()
Ketika qubit tidak berada dalam superposisi dari |0⟩ atau |1⟩ (berperilaku sebagai bit klasik),
gerbang ini sangat sederhana dan intuitif untuk dipahami. Kita dapat menggunakan tabel
kebenaran klasik:
Dan bertindak pada vektor keadaan 4D, ia memiliki salah satu dari dua matriks:
tergantung pada qubit mana yang menjadi kontrol dan mana yang menjadi target. Buku,
simulator, dan makalah yang berbeda mengurutkan qubit mereka secara berbeda. Dalam
kasus ini, matriks kiri sesuai dengan CNOT di sirkuit di atas. Matriks ini menukar amplitudo |
01⟩ dan |11⟩ di status vektor:
Kita telah melihat bagaimana ini bekerja pada keadaan klasik, tetapi sekarang mari kita lihat
bagaimana ia bekerja pada qubit dalam superposisi. Kita akan menempatkan satu qubit di
keadaan |+⟩:
qc = QuantumCircuit(2)
qc.h(0)
qc.draw()
svsim = Aer.get_backend('statevector_simulator')
qobj = assemble(qc)
final_state = svsim.run(qobj).result().get_statevector()
Dan mari kita lihat apa yang terjadi ketika kita menerapkan gerbang CNOT:
qc = QuantumCircuit(2)
qc.h(0)
# Terapkan CNOT:
qc.cx(0,1)
qc.draw()
qobj = assemble(qc)
result = svsim.run(qobj).result()
plot_histogram(result.get_counts())
Keadaan gabungan ini tidak dapat ditulis sebagai dua keadaan qubit yang terpisah, yang
memiliki implikasi menarik. Meskipun qubit kita berada dalam superposisi, mengukur satu
akan memberi tahu kita keadaan yang lain dan meruntuhkan superposisinya. Misalnya, jika
kita mengukur qubit teratas dan mendapatkan status |1⟩, status kolektif qubit kita berubah
seperti ini:
Bahkan jika kita memisahkan qubit ini sejauh beberapa tahun cahaya, mengukur satu qubit
akan meruntuhkan superposisi dan tampaknya memiliki efek langsung pada qubit lainnya. Ini
adalah 'aksi seram di kejauhan' yang membuat marah banyak fisikawan di awal abad ke-20.
Penting untuk dicatat bahwa hasil pengukuran adalah acak, dan statistik pengukuran satu
qubit tidak terpengaruh oleh operasi apa pun pada qubit lainnya. Karena itu, tidak ada
cara untuk menggunakan status kuantum bersama untuk berkomunikasi. Ini dikenal sebagai
teorema tanpa komunikasi.
plot_bloch_multivector ( final_state )
Mengingat bagaimana kita mendefinisikan bola Bloch di bab-bab sebelumnya, mungkin tidak
jelas bagaimana Qiskit menghitung vektor Bloch dengan qubit keterikatan seperti ini. Dalam
kasus qubit tunggal, posisi vektor Bloch di sepanjang sumbu sesuai dengan nilai harapan
pengukuran dalam basis itu. Jika kita mengambil ini sebagai aturan yang merencanakan
Bloch vektor, kita sampai pada kesimpulan ini di atas. Ini menunjukkan kepada kita
bahwa tidak ada dasar pengukuran qubit tunggal yang menjamin pengukuran tertentu. Ini
kontras dengan status qubit tunggal kita, di mana selalu dapat memilih basis qubit
tunggal. Melihat qubit individu dengan cara ini, kita kehilangan efek penting dari korelasi
antara qubit. Kita tidak dapat membedakan antara keadaan keterikatan yang
berbeda. Misalnya, dua status:
keduanya akan terlihat sama pada bola Bloch yang terpisah ini, meskipun keadaannya sangat
berbeda dengan hasil pengukuran yang berbeda.
Bagaimana lagi kita bisa memvisualisasikan statevector ini? Vektor keadaan ini hanyalah
kumpulan dari empat amplitudo (bilangan kompleks), dan ada banyak cara untuk
memetakannya ke gambar. Salah satu visualisasi tersebut adalah Q-sphere, di sini setiap
amplitudo diwakili oleh gumpalan pada permukaan bola. Ukuran gumpalan sebanding
dengan besarnya amplitudo, dan warnanya sebanding dengan fase amplitudo. Amplitudo
untuk |00⟩ dan |11⟩ sama, dan semua amplitudo lainnya adalah 0:
plot_state_qsphere(final_state)
Di sini kita dapat dengan jelas melihat korelasi antara qubit. Bentuk Q-sphere tidak memiliki
arti penting, itu hanyalah cara yang bagus untuk mengatur gumpalan; jumlah 0s dalam
keadaan sebanding dengan posisi keadaan pada sumbu Z, jadi di sini kita dapat melihat
amplitudo dari |00⟩ berada di kutub atas bola, dan amplitudo |11⟩ berada di kutub bawah bola.
3. Phase Kickback
Pada bagian sebelumnya, kita melihat beberapa hasil yang sangat mendasar dengan gerbang
CNOT. Di sini kita akan mengeksplorasi beberapa hasil yang lebih menarik.
Dapat dilihat bahwa kita dapat menjerat dua qubit dengan menempatkan qubit kontrol dalam
status |+⟩:
Tetapi apa yang terjadi jika kita menempatkan qubit kedua dalam superposisi?
import numpy as np
qc = QuantumCircuit(2)
qc.h(0)
qc.h(1)
qc.cx(0,1)
qc.draw()
Dalam rangkaian di atas, kita memiliki CNOT yang bekerja pada keadaan:
Karena CNOT menukar amplitudo dari |01⟩ dan |11⟩, kita tidak melihat perubahan:
qc = QuantumCircuit(2)
qc.h(0)
qc.h(1)
qc.cx(0,1)
svsim = Aer.get_backend('statevector_simulator')
qobj = assemble(qc)
final_state = svsim.run(qobj).result().get_statevector()
plot_bloch_multivector(final_state)
Mari kita letakkan target qubit di keadaan |-⟩, sehingga memiliki fase negatif:
qc = QuantumCircuit(2)
qc.h(0)
qc.x(1)
qc.h(1)
qc.draw()
qc = QuantumCircuit(2)
qc.h(0)
qc.x(1)
qc.h(1)
display(qc.draw())
# lihat hasilnya
qobj = assemble(qc)
final_state = svsim.run(qobj).result().get_statevector()
plot_bloch_multivector(final_state)
Jika CNOT bekerja pada keadaan ini, kita akan menukar amplitudo |01⟩ dan |11⟩,
menghasilkan keadaan:
qc.cx(0,1)
display(qc.draw())
qobj = assemble(qc)
final_state = svsim.run(qobj).result().get_statevector()
plot_bloch_multivector(final_state)
Jika ingat transformasi gerbang -H |+⟩→|0⟩ dan |-⟩→|1⟩, kita dapat melihat bahwa membuat
CNOT di gerbang -H memiliki perilaku yang setara dengan CNOT yang bekerja dalam arah
yang berlawanan:
qc = QuantumCircuit(2)
qc.h(0)
qc.h(1)
qc.cx(0,1)
qc.h(0)
qc.h(1)
display(qc.draw())
usim = Aer.get_backend('unitary_simulator')
qobj = assemble(qc)
unitary = usim.run(qobj).result().get_unitary()
qc = QuantumCircuit(2)
qc.cx(1,0)
display(qc.draw())
qobj = assemble(qc)
unitary = usim.run(qobj).result().get_unitary()
Ketika qubit kontrol kita ada di keduanya |0⟩ atau |1⟩, fase ini mempengaruhi seluruh
keadaan, namun ini adalah fase global dan tidak memiliki efek yang dapat diamati:
Efek yang menarik adalah ketika qubit kontrol berada dalam superposisi, komponen qubit
kontrol yang terletak pada arah |1⟩ menerapkan faktor fase ini ke qubit target, yang pada
gilirannya mengembalikan fase relatif ke qubit kontrol:
Ini kemudian dapat ditulis sebagai dua status qubit yang dapat dipisahkan:
Membungkus CNOT dalam gerbang- H mengubah qubit dari basis komputasi menjadi (|+⟩,
|-⟩) dasar, di mana kita melihat efek ini. Identitas ini sangat berguna dalam perangkat keras,
karena beberapa perangkat keras hanya mengizinkan CNOT dalam satu arah di antara dua
qubit tertentu. Kita dapat menggunakan identitas ini untuk mengatasi masalah ini dan
memungkinkan CNOT di kedua arah.
qc = QuantumCircuit(2)
qc.cp(pi/4, 0, 1)
qc.draw()
qc = QuantumCircuit(2)
qc.cp(pi/4, 0, 1)
display(qc.draw())
# lihat hasilnya:
qobj = assemble(qc)
unitary = usim.run(qobj).result().get_unitary()
Ini adalah fase global dan tidak dapat diamati. Tetapi jika kita mengontrol operasi ini
menggunakan qubit lain di|+⟩|+⟩ state, the phase is no longer global but relative, which
changes the relative phase in our control qubit:
Ini memiliki efek memutar qubit kontrol kami di sekitar sumbu Z dari bola Bloch, sementara
membiarkan qubit target tidak berubah. Mari kita lihat ini di Qiskit:
qc = QuantumCircuit(2)
qc.h(0)
qc.x(1)
display(qc.draw())
# See Results:
qobj = assemble(qc)
final_state = svsim.run(qobj).result().get_statevector()
plot_bloch_multivector(final_state)
qc = QuantumCircuit(2)
qc.h(0)
qc.x(1)
# Add Controlled-T
qc.cp(pi/4, 0, 1)
display(qc.draw())
# See Results:
qobj = assemble(qc)
final_state = svsim.run(qobj).result().get_statevector()
plot_bloch_multivector(final_state)
Kita dapat melihat qubit paling kiri telah diputar oleh π/4π/4di sekitar sumbu Z bola
Bloch seperti yang diharapkan. Setelah menjelajahi perilaku ini, mungkin menjadi jelas
mengapa Qiskit menggambar gerbang rotasi Z terkontrol dengan cara simetris ini (dua
kontrol, bukan kontrol dan target). Tidak ada kontrol yang jelas atau target qubit untuk
semua kasus.
4. Identitas Sirkuit
5. Pembuktian Univesitalitas
6. Komputasi Klasik pada Komputer Quantum