Membuat Circuit
Versi paket
Kode di halaman ini dikembangkan menggunakan persyaratan berikut. Kami merekomendasikan menggunakan versi ini atau yang lebih baru.
qiskit[all]~=2.3.0
Halaman ini membahas lebih lanjut tentang kelas QuantumCircuit di Qiskit SDK, termasuk beberapa metode yang lebih canggih yang bisa kamu gunakan untuk membuat quantum circuit.
Apa itu quantum circuit?β
Quantum circuit sederhana adalah kumpulan Qubit dan daftar instruksi yang bekerja pada Qubit tersebut. Sebagai contoh, cell berikut membuat circuit baru dengan dua Qubit baru, lalu menampilkan atribut qubits dari circuit tersebut, yaitu daftar Qubit yang diurutkan dari bit paling tidak signifikan hingga bit paling signifikan .
# Added by doQumentation β required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit
qc = QuantumCircuit(2)
qc.qubits
[<Qubit register=(2, "q"), index=0>, <Qubit register=(2, "q"), index=1>]
Beberapa objek QuantumRegister dan ClassicalRegister bisa digabungkan untuk membuat sebuah circuit. Setiap QuantumRegister dan ClassicalRegister juga bisa diberi nama.
from qiskit.circuit import QuantumRegister, ClassicalRegister
qr1 = QuantumRegister(2, "qreg1") # Create a QuantumRegister with 2 qubits
qr2 = QuantumRegister(1, "qreg2") # Create a QuantumRegister with 1 qubit
cr1 = ClassicalRegister(3, "creg1") # Create a ClassicalRegister with 3 cbits
combined_circ = QuantumCircuit(
qr1, qr2, cr1
) # Create a quantum circuit with 2 QuantumRegisters and 1 ClassicalRegister
combined_circ.qubits
[<Qubit register=(2, "qreg1"), index=0>,
<Qubit register=(2, "qreg1"), index=1>,
<Qubit register=(1, "qreg2"), index=0>]
Kamu bisa mencari indeks dan register sebuah Qubit dengan menggunakan metode find_bit dari circuit dan atribut-atributnya.
desired_qubit = qr2[0] # Qubit 0 of register 'qreg2'
print("Index:", combined_circ.find_bit(desired_qubit).index)
print("Register:", combined_circ.find_bit(desired_qubit).registers)
Index: 2
Register: [(QuantumRegister(1, 'qreg2'), 0)]
Menambahkan instruksi ke circuit akan menambahkan instruksi tersebut ke atribut data dari circuit. Output cell berikut menunjukkan bahwa data adalah daftar objek CircuitInstruction, yang masing-masing memiliki atribut operation dan atribut qubits.
qc.x(0) # Add X-gate to qubit 0
qc.data
[CircuitInstruction(operation=Instruction(name='x', num_qubits=1, num_clbits=0, params=[]), qubits=(<Qubit register=(2, "q"), index=0>,), clbits=())]
Cara termudah untuk melihat informasi ini adalah melalui metode draw, yang mengembalikan visualisasi dari sebuah circuit. Lihat Visualisasi circuit untuk berbagai cara menampilkan quantum circuit.
qc.draw("mpl")
Objek instruksi circuit bisa memuat circuit "definisi" yang mendeskripsikan instruksi tersebut dalam bentuk instruksi-instruksi yang lebih mendasar. Misalnya, X-gate didefinisikan sebagai kasus khusus dari U3-gate, sebuah Gate single-Qubit yang lebih umum.
# Draw definition circuit of 0th instruction in `qc`
qc.data[0].operation.definition.draw("mpl")
Instruksi dan circuit mirip satu sama lain karena keduanya mendeskripsikan operasi pada bit dan Qubit, tetapi memiliki tujuan yang berbeda:
- Instruksi diperlakukan sebagai tetap, dan metode-metodenya biasanya mengembalikan instruksi baru (tanpa mengubah objek aslinya).
- Circuit dirancang untuk dibangun melalui banyak baris kode, dan metode
QuantumCircuitsering kali mengubah objek yang sudah ada.
Apa itu kedalaman circuit?β
depth() dari quantum circuit adalah ukuran jumlah "lapisan" Gate kuantum yang dieksekusi secara paralel untuk menyelesaikan komputasi yang didefinisikan oleh circuit tersebut. Karena Gate kuantum membutuhkan waktu untuk diimplementasikan, kedalaman circuit secara kasar mencerminkan jumlah waktu yang diperlukan komputer kuantum untuk mengeksekusi circuit tersebut. Oleh karena itu, kedalaman circuit adalah salah satu besaran penting yang digunakan untuk mengukur apakah sebuah quantum circuit bisa dijalankan pada suatu perangkat.
Sisa halaman ini mengilustrasikan cara memanipulasi quantum circuit.
Membangun Circuitβ
Metode seperti QuantumCircuit.h dan QuantumCircuit.cx menambahkan instruksi spesifik ke circuit. Untuk menambahkan instruksi ke circuit secara lebih umum, gunakan metode append. Metode ini menerima sebuah instruksi dan daftar Qubit yang akan diterapkan instruksi tersebut. Lihat dokumentasi API Circuit Library untuk daftar instruksi yang didukung.
from qiskit.circuit.library import HGate
qc = QuantumCircuit(1)
qc.append(
HGate(), # New HGate instruction
[0], # Apply to qubit 0
)
qc.draw("mpl")
Untuk menggabungkan dua circuit, gunakan metode compose. Metode ini menerima QuantumCircuit lain dan daftar pemetaan Qubit opsional.
qc_a = QuantumCircuit(4)
qc_a.x(0)
qc_b = QuantumCircuit(2, name="qc_b")
qc_b.y(0)
qc_b.z(1)
# compose qubits (0, 1) of qc_a to qubits (1, 3) of qc_b respectively
combined = qc_a.compose(qc_b, qubits=[1, 3])
combined.draw("mpl")
Kamu mungkin juga ingin mengompilasi circuit menjadi instruksi agar circuit kamu lebih terorganisir. Kamu bisa mengonversi sebuah circuit menjadi instruksi menggunakan metode to_instruction, lalu menambahkannya ke circuit lain seperti instruksi biasa. Circuit yang digambar di cell berikut secara fungsional setara dengan circuit yang digambar di cell sebelumnya.
inst = qc_b.to_instruction()
qc_a.append(inst, [1, 3])
qc_a.draw("mpl")
Jika circuit kamu bersifat unitary, kamu bisa mengonversinya menjadi Gate menggunakan metode to_gate. Objek Gate adalah jenis instruksi khusus yang memiliki beberapa fitur tambahan, seperti metode control, yang menambahkan kontrol kuantum.
gate = qc_b.to_gate().control()
qc_a.append(gate, [0, 1, 3])
qc_a.draw("mpl")
Untuk melihat apa yang terjadi, kamu bisa menggunakan metode decompose untuk memperluas setiap instruksi ke dalam definisinya.
Metode decompose mengembalikan circuit baru dan tidak mengubah circuit yang digunakannya.
qc_a.decompose().draw("mpl")
Mengukur Qubitβ
Pengukuran digunakan untuk mengambil sampel keadaan masing-masing Qubit dan mentransfer hasilnya ke register klasik. Perlu diperhatikan bahwa jika kamu mengirimkan circuit ke primitif Sampler, pengukuran diperlukan. Namun, circuit yang dikirimkan ke primitif Estimator tidak boleh mengandung pengukuran.
Qubit bisa diukur menggunakan tiga metode: measure, measure_all dan measure_active. Untuk mempelajari cara memvisualisasikan hasil pengukuran, lihat halaman Visualisasi hasil.
-
QuantumCircuit.measure: mengukur setiap Qubit pada argumen pertama ke bit klasik yang diberikan sebagai argumen kedua. Metode ini memberikan kontrol penuh atas di mana hasil pengukuran disimpan. -
QuantumCircuit.measure_all: tidak menerima argumen dan bisa digunakan untuk quantum circuit tanpa bit klasik yang sudah ditentukan. Metode ini membuat wire klasik dan menyimpan hasil pengukuran secara berurutan. Misalnya, pengukuran Qubit disimpan di cbit ). Metode ini juga menambahkan barrier sebelum pengukuran. -
QuantumCircuit.measure_active: mirip denganmeasure_all, tetapi hanya mengukur Qubit yang memiliki operasi.
qc1 = QuantumCircuit(2, 2)
qc1.measure(0, 1)
qc1.draw("mpl", cregbundle=False)
qc2 = QuantumCircuit(2)
qc2.measure_all()
qc2.draw("mpl", cregbundle=False)
qc3 = QuantumCircuit(2)
qc3.x(1)
qc3.measure_active()
qc3.draw("mpl", cregbundle=False)
Circuit berparameterβ
Banyak algoritma kuantum jangka pendek melibatkan eksekusi berbagai variasi quantum circuit. Karena membangun dan mengoptimalkan circuit yang besar bisa sangat mahal secara komputasional, Qiskit mendukung circuit berparameter. Circuit ini memiliki parameter yang belum ditentukan, dan nilainya tidak perlu ditentukan hingga sesaat sebelum circuit dieksekusi. Hal ini memungkinkan kamu memindahkan konstruksi dan optimasi circuit ke luar loop program utama. Cell berikut membuat dan menampilkan circuit berparameter.
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.circuit import Parameter
angle = Parameter("angle") # undefined number
# Create and optimize circuit once
qc = QuantumCircuit(1)
qc.rx(angle, 0)
qc = generate_preset_pass_manager(
optimization_level=3, basis_gates=["u", "cx"]
).run(qc)
qc.draw("mpl")
Cell berikut membuat banyak variasi circuit ini dan menampilkan salah satu variasinya.
circuits = []
for value in range(100):
circuits.append(qc.assign_parameters({angle: value}))
circuits[0].draw("mpl")
Kamu bisa menemukan daftar parameter yang belum ditentukan dari sebuah circuit di atribut parameters-nya.
qc.parameters
ParameterView([Parameter(angle)])
Mengubah nama parameterβ
Secara default, nama parameter untuk circuit berparameter diawali dengan x- misalnya, x[0]. Kamu bisa mengubah nama-nama tersebut setelah didefinisikan, seperti yang ditunjukkan pada contoh berikut.
from qiskit.circuit.library import z_feature_map
from qiskit.circuit import ParameterVector
# Define a parameterized circuit with default names
# For example, x[0]
circuit = z_feature_map(2)
# Set new parameter names
# They will now be prefixed by `hi` instead
# For example, hi[0]
training_params = ParameterVector("hi", 2)
# Assign parameter names to the quantum circuit
circuit = circuit.assign_parameters(parameters=training_params)
Langkah selanjutnyaβ
- Untuk mempelajari algoritma kuantum jangka pendek, ikuti kursus Desain algoritma variasional.
- Lihat contoh penggunaan circuit dalam tutorial Algoritma Grover.
- Bekerja dengan circuit sederhana menggunakan IBM Quantum Composer.