Quantum bit, Gate, dan Circuit
Kifumi Numata (19 Apr 2024)
Klik di sini untuk mengunduh pdf kuliah aslinya. Perlu diperhatikan bahwa beberapa cuplikan kode mungkin sudah tidak berlaku karena ini adalah gambar statis.
Perkiraan waktu QPU untuk menjalankan eksperimen ini adalah 5 detik.
1. Pendahuluan
Bit, Gate, dan Circuit adalah blok bangunan dasar dari komputasi kuantum. Kamu akan belajar komputasi kuantum dengan model circuit menggunakan quantum bit dan gate, serta meninjau superposisi, pengukuran, dan entanglement.
Dalam pelajaran ini kamu akan belajar:
- Single-qubit Gate
- Bloch sphere
- Superposisi
- Pengukuran
- Two-qubit Gate dan kondisi entanglement
Di akhir kuliah ini, kamu akan belajar tentang kedalaman circuit (circuit depth), yang sangat penting untuk komputasi kuantum skala utilitas.
2. Komputasi sebagai diagram
Saat menggunakan qubit atau bit, kita perlu memanipulasinya agar input yang kita miliki bisa diubah menjadi output yang kita butuhkan. Untuk program paling sederhana dengan sangat sedikit bit, proses ini berguna untuk direpresentasikan dalam diagram yang dikenal sebagai circuit diagram.
Gambar kiri bawah adalah contoh circuit klasik, dan gambar kanan bawah adalah contoh quantum circuit. Dalam kedua kasus, input ada di sebelah kiri dan output ada di sebelah kanan, sementara operasi direpresentasikan oleh simbol. Simbol yang digunakan untuk operasi disebut "gate", sebagian besar karena alasan historis.
3. Single-qubit quantum Gate
3.1 Kondisi kuantum dan Bloch sphere
Kondisi sebuah Qubit direpresentasikan sebagai superposisi dari dan . Kondisi kuantum sembarang direpresentasikan sebagai
di mana dan adalah bilangan kompleks sehingga .
dan adalah vektor dalam ruang vektor kompleks dua dimensi:
Oleh karena itu, kondisi kuantum sembarang juga direpresentasikan sebagai
Dari sini, kita bisa melihat bahwa kondisi sebuah quantum bit adalah vektor satuan dalam ruang hasil kali dalam kompleks dua dimensi dengan basis ortonormal dan . Ini dinormalisasi ke 1.
|\psi\rangle =\begin\{pmatrix\} \alpha \\ \beta \end\{pmatrix\} juga disebut statevector.
Kondisi quantum single-qubit juga direpresentasikan sebagai
di mana dan adalah sudut pada Bloch sphere pada gambar berikut.
Pada beberapa sel kode berikutnya, kita akan membangun perhitungan dasar dari bagian-bagian penyusunnya di Qiskit. Kita akan membuat circuit kosong lalu menambahkan operasi kuantum, membahas gate dan memvisualisasikan efeknya seiring kita berjalan.
Kamu bisa menjalankan sel dengan "Shift" + "Enter". Import library-nya terlebih dahulu.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-aer qiskit-ibm-runtime
# Import the qiskit library
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
from qiskit.quantum_info import Statevector
from qiskit.visualization import plot_bloch_multivector
from qiskit_ibm_runtime import Sampler
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.visualization import plot_histogram
Menyiapkan quantum Circuit
Kita akan membuat dan menggambar single-qubit circuit.
# Create the single-qubit quantum circuit
qc = QuantumCircuit(1)
# Draw the circuit
qc.draw("mpl")
X Gate
X Gate adalah rotasi mengelilingi sumbu pada Bloch sphere. Menerapkan X Gate pada menghasilkan , dan menerapkan X Gate pada menghasilkan , sehingga ini adalah operasi yang mirip dengan gate NOT klasik, dan juga dikenal sebagai bit flip. Representasi matriks dari X Gate adalah sebagai berikut.
qc = QuantumCircuit(1) # Prepare the single-qubit quantum circuit
# Apply a X gate to qubit 0
qc.x(0)
# Draw the circuit
qc.draw("mpl")
Di IBM Quantum®, kondisi awal diatur ke , sehingga quantum circuit di atas dalam representasi matriks adalah
Selanjutnya, mari kita jalankan circuit ini menggunakan simulator statevector.
# See the statevector
out_vector = Statevector(qc)
print(out_vector)
# Draw a Bloch sphere
plot_bloch_multivector(out_vector)
Statevector([0.+0.j, 1.+0.j],
dims=(2,))
Vektor vertikal ditampilkan sebagai vektor baris, dengan bilangan kompleks (bagian imajiner diindeks dengan ).
H Gate
Hadamard Gate adalah rotasi mengelilingi sumbu yang berada di tengah antara sumbu dan pada Bloch sphere. Menerapkan H Gate pada membuat kondisi superposisi seperti . Representasi matriks dari H Gate adalah sebagai berikut.
qc = QuantumCircuit(1) # Create the single-qubit quantum circuit
# Apply an Hadamard gate to qubit 0
qc.h(0)
# Draw the circuit
qc.draw(output="mpl")
# See the statevector
out_vector = Statevector(qc)
print(out_vector)
# Draw a Bloch sphere
plot_bloch_multivector(out_vector)
Statevector([0.70710678+0.j, 0.70710678+0.j],
dims=(2,))
Ini adalah
Kondisi superposisi ini sangat umum dan penting, sehingga diberi simbolnya sendiri:
Dengan menerapkan gate pada , kita membuat superposisi dari dan di mana pengukuran dalam basis komputasi (sepanjang z dalam gambaran Bloch sphere) akan memberikan setiap kondisi dengan probabilitas yang sama.
Kondisi
Kamu mungkin sudah menduga bahwa ada kondisi yang bersesuaian:
Untuk membuat kondisi ini, pertama terapkan X Gate untuk membuat , kemudian terapkan H Gate.
qc = QuantumCircuit(1) # Create the single-qubit quantum circuit
# Apply a X gate to qubit 0
qc.x(0)
# Apply an Hadamard gate to qubit 0
qc.h(0)
# draw the circuit
qc.draw(output="mpl")
# See the statevector
out_vector = Statevector(qc)
print(out_vector)
# Draw a Bloch sphere
plot_bloch_multivector(out_vector)
Statevector([ 0.70710678+0.j, -0.70710678+0.j],
dims=(2,))
Ini adalah
Menerapkan gate pada menghasilkan superposisi yang sama dari dan , tapi tanda dari adalah negatif.
3.2 Kondisi quantum single-qubit dan evolusi uniter
Aksi semua gate yang sudah kita lihat sejauh ini bersifat uniter, yang berarti dapat direpresentasikan oleh operator uniter. Dengan kata lain, kondisi output dapat diperoleh dengan mengoperasikan kondisi awal dengan matriks uniter:
Matriks uniter adalah matriks yang memenuhi
Dalam konteks operasi komputer kuantum, kita bisa mengatakan bahwa menerapkan quantum Gate pada Qubit mengevolusi kondisi kuantum. Gate single-qubit yang umum mencakup yang berikut ini.
Gate Pauli:
di mana hasil kali luar dihitung sebagai berikut:
Gate single-qubit tipikal lainnya:
Arti dan penggunaan ini dijelaskan lebih rinci dalam kursus Basics of Quantum Information.
Latihan 1
Gunakan Qiskit untuk membuat quantum circuit yang menyiapkan kondisi yang dijelaskan di bawah ini. Kemudian jalankan setiap circuit menggunakan simulator statevector dan tampilkan kondisi yang dihasilkan pada Bloch sphere. Sebagai bonus, coba lihat apakah kamu bisa memperkirakan apa kondisi akhirnya berdasarkan intuisi tentang gate dan rotasi di Bloch sphere.
(1)
(2)
(3)
Tips: Z Gate bisa digunakan dengan
qc.z(0)
Solusi:
### (1) XX|0> ###
# Create the single-qubit quantum circuit
qc = QuantumCircuit(1) ##your code goes here##
# Add a X gate to qubit 0
qc.x(0) ##your code goes here##
# Add a X gate to qubit 0
qc.x(0) ##your code goes here##
# Draw a circuit
qc.draw(output="mpl")
# See the statevector
out_vector = Statevector(qc)
print(out_vector)
# Draw a Bloch sphere
plot_bloch_multivector(out_vector)
Statevector([1.+0.j, 0.+0.j],
dims=(2,))
### (2) HH|0> ###
##your code goes here##
qc = QuantumCircuit(1)
qc.h(0)
qc.h(0)
qc.draw("mpl")
# See the statevector
out_vector = Statevector(qc)
print(out_vector)
# Draw a Bloch sphere
plot_bloch_multivector(out_vector)
Statevector([1.+0.j, 0.+0.j],
dims=(2,))
### (3) HZH|0> ###
##your code goes here##
qc = QuantumCircuit(1)
qc.h(0)
qc.z(0)
qc.h(0)
qc.draw("mpl")
# See the statevector
out_vector = Statevector(qc)
print(out_vector)
# Draw a Bloch sphere
plot_bloch_multivector(out_vector)
Statevector([0.+0.j, 1.+0.j],
dims=(2,))
3.3 Pengukuran
Pengukuran secara teori adalah topik yang sangat rumit. Tapi secara praktis, melakukan pengukuran sepanjang (seperti yang dilakukan semua komputer kuantum IBM®) hanya memaksa kondisi Qubit menjadi atau dan kita mengamati hasilnya.
- adalah probabilitas kita mendapatkan saat mengukur.
- adalah probabilitas kita mendapatkan saat mengukur.
Jadi, dan disebut amplitudo probabilitas. (lihat "aturan Born")
Sebagai contoh, memiliki probabilitas yang sama untuk menjadi atau saat diukur. memiliki peluang 75% untuk menjadi .
Qiskit Aer Simulator
Selanjutnya, mari kita ukur sebuah circuit yang menyiapkan superposisi probabilitas sama di atas. Kita perlu menambahkan gate pengukuran, karena Qiskit Aer simulator mensimulasikan perangkat keras kuantum ideal (tanpa noise) secara default. Catatan: Simulator Aer juga bisa menerapkan model noise berdasarkan komputer kuantum nyata. Kita akan kembali ke model noise nanti.
# Create a new circuit with one qubits (first argument) and one classical bits (second argument)
qc = QuantumCircuit(1, 1)
qc.h(0)
qc.measure(0, 0) # Add the measurement gate
qc.draw(output="mpl")
Kita sekarang siap untuk menjalankan circuit kita pada simulator Aer. Dalam contoh ini, kita akan menggunakan shots=1024 secara default, yang berarti kita akan mengukur sebanyak 1024 kali. Kemudian kita akan memplot hitungan tersebut dalam histogram.
# Run the circuit on a simulator to get the results
# Define backend
backend = AerSimulator()
# Transpile to backend
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_qc = pm.run(qc)
# Run the job
sampler = Sampler(mode=backend)
job = sampler.run([isa_qc])
result = job.result()
# Print the results
counts = result[0].data.c.get_counts()
print(counts)
# Plot the counts in a histogram
plot_histogram(counts)
{'0': 521, '1': 503}
Kita melihat bahwa 0 dan 1 diukur dengan probabilitas hampir 50% masing-masing. Meskipun noise tidak disimulasikan di sini, kondisinya tetap bersifat probabilistik. Jadi meskipun kita mengharapkan distribusi kira-kira 50-50, kita jarang menemukan tepat seperti itu. Sama seperti 100 lemparan koin yang jarang menghasilkan tepat 50 masing-masing sisi.
4. Multi-qubit quantum gate dan entanglement
4.1 Multi-qubit quantum Circuit
Kita bisa membuat quantum Circuit dua qubit dengan kode berikut. Kita akan menerapkan H Gate ke setiap qubit.
# Create the two qubits quantum circuit
qc = QuantumCircuit(2)
# Apply an H gate to qubit 0
qc.h(0)
# Apply an H gate to qubit 1
qc.h(1)
# Draw the circuit
qc.draw(output="mpl")
# See the statevector
out_vector = Statevector(qc)
print(out_vector)
Statevector([0.5+0.j, 0.5+0.j, 0.5+0.j, 0.5+0.j],
dims=(2, 2))
Catatan: Urutan bit di Qiskit
Qiskit menggunakan notasi Little Endian saat mengurutkan qubit dan bit, artinya qubit 0 adalah bit paling kanan dalam bitstring. Contoh: berarti q0 adalah dan q1 adalah . Perhatikan ini karena sebagian literatur komputasi kuantum menggunakan notasi Big Endian (qubit 0 adalah bit paling kiri), begitu pula banyak literatur mekanika kuantum.
Hal lain yang perlu diperhatikan adalah saat merepresentasikan quantum Circuit, selalu ditempatkan di bagian atas Circuit. Dengan mempertimbangkan hal ini, keadaan kuantum pada Circuit di atas bisa ditulis sebagai tensor product dari keadaan kuantum single-qubit.
( )
Keadaan awal Qiskit adalah , jadi dengan menerapkan ke setiap qubit, keadaan berubah menjadi superposisi yang setara.
Aturan pengukuran juga sama seperti kasus single qubit, probabilitas mengukur adalah .
# Draw a Bloch sphere
plot_bloch_multivector(out_vector)

Selanjutnya, mari kita ukur Circuit ini.
# Create a new circuit with two qubits (first argument) and two classical bits (second argument)
qc = QuantumCircuit(2, 2)
# Apply the gates
qc.h(0)
qc.h(1)
# Add the measurement gates
qc.measure(0, 0) # Measure qubit 0 and save the result in bit 0
qc.measure(1, 1) # Measure qubit 1 and save the result in bit 1
# Draw the circuit
qc.draw(output="mpl")
Sekarang, kita akan menggunakan simulator Aer lagi untuk memverifikasi secara eksperimental bahwa probabilitas relatif dari semua kemungkinan keadaan output kira-kira setara.
# Run the circuit on a simulator to get the results
# Define backend
backend = AerSimulator()
# Transpile to backend
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_qc = pm.run(qc)
# Run the job
sampler = Sampler(mode=backend)
job = sampler.run([isa_qc])
result = job.result()
# Print the results
counts = result[0].data.c.get_counts()
print(counts)
# Plot the counts in a histogram
plot_histogram(counts)
{'10': 262, '01': 246, '00': 265, '11': 251}
Sesuai perkiraan, keadaan , , ,