Bina Circuit
Versi pakej
Kod pada halaman ini dibangunkan menggunakan keperluan berikut. Kami mengesyorkan penggunaan versi ini atau yang lebih baharu.
qiskit[all]~=2.3.0
Halaman ini mengkaji dengan lebih mendalam kelas QuantumCircuit dalam SDK Qiskit, termasuk beberapa kaedah yang lebih lanjut yang boleh anda gunakan untuk mencipta Circuit kuantum.
Apakah Circuit kuantum?β
Circuit kuantum mudah ialah koleksi Qubit dan senarai arahan yang bertindak ke atas Qubit tersebut. Untuk menunjukkan, sel berikut mencipta Circuit baharu dengan dua Qubit baharu, kemudian memaparkan atribut qubits Circuit, yang merupakan senarai Qubit dalam susunan dari bit paling tidak bererti hingga bit paling bererti .
# 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>]
Berbilang objek QuantumRegister dan ClassicalRegister boleh digabungkan untuk mencipta sebuah Circuit. Setiap QuantumRegister dan ClassicalRegister juga boleh dinamakan.
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>]
Anda boleh mencari indeks dan daftar Qubit dengan menggunakan kaedah find_bit Circuit dan 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)]
Menambah arahan kepada Circuit menambahkan arahan tersebut ke atribut data Circuit. Output sel berikut menunjukkan data ialah senarai objek CircuitInstruction, setiap satunya mempunyai 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 maklumat ini ialah melalui kaedah draw, yang mengembalikan visualisasi Circuit. Lihat Visualisasikan Circuit untuk cara berbeza memaparkan Circuit kuantum.
qc.draw("mpl")
Objek arahan Circuit boleh mengandungi Circuit "definisi" yang menggambarkan arahan dari segi arahan yang lebih asas. Contohnya, X-gate ditakrifkan sebagai kes tertentu U3-gate, sebuah Gate Qubit tunggal yang lebih umum.
# Draw definition circuit of 0th instruction in `qc`
qc.data[0].operation.definition.draw("mpl")
Arahan dan Circuit adalah serupa kerana kedua-duanya menerangkan operasi pada bit dan Qubit, tetapi mempunyai tujuan yang berbeza:
- Arahan dianggap tetap, dan kaedahnya biasanya mengembalikan arahan baharu (tanpa mengubah objek asal).
- Circuit direka untuk dibina merentasi banyak baris kod, dan kaedah
QuantumCircuitsering mengubah objek yang sedia ada.
Apakah kedalaman Circuit?β
Kedalaman (depth()) Circuit kuantum ialah ukuran bilangan "lapisan" Gate kuantum, yang dilaksanakan secara selari, yang diperlukan untuk melengkapkan pengiraan yang ditakrifkan oleh Circuit tersebut. Oleh kerana Gate kuantum mengambil masa untuk dilaksanakan, kedalaman Circuit lebih kurang sepadan dengan jumlah masa yang diambil oleh komputer kuantum untuk melaksanakan Circuit tersebut. Oleh itu, kedalaman Circuit merupakan salah satu kuantiti penting yang digunakan untuk mengukur sama ada Circuit kuantum boleh dijalankan pada peranti.
Selebihnya halaman ini menggambarkan cara memanipulasi Circuit kuantum.
Bina Circuitβ
Kaedah seperti QuantumCircuit.h dan QuantumCircuit.cx menambah arahan tertentu kepada Circuit. Untuk menambah arahan kepada Circuit secara lebih umum, gunakan kaedah append. Ini mengambil arahan dan senarai Qubit untuk menerapkan arahan tersebut. Lihat dokumentasi API Pustaka Circuit untuk senarai arahan yang disokong.
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 kaedah compose. Ini menerima QuantumCircuit lain dan senarai pemetaan Qubit yang pilihan.
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")
Anda mungkin juga ingin mengkompil Circuit ke dalam arahan untuk memastikan Circuit anda teratur. Anda boleh menukar Circuit kepada arahan dengan menggunakan kaedah to_instruction, kemudian menambahkan ini kepada Circuit lain seperti mana-mana arahan lain. Circuit yang dilukis dalam sel berikut secara fungsional setara dengan Circuit yang dilukis dalam sel sebelumnya.
inst = qc_b.to_instruction()
qc_a.append(inst, [1, 3])
qc_a.draw("mpl")
Jika Circuit anda bersifat uniter, anda boleh menukarnya kepada Gate dengan menggunakan kaedah to_gate. Objek Gate adalah jenis arahan tertentu yang mempunyai beberapa ciri tambahan, seperti kaedah control, yang menambah kawalan kuantum.
gate = qc_b.to_gate().control()
qc_a.append(gate, [0, 1, 3])
qc_a.draw("mpl")
Untuk melihat apa yang berlaku, anda boleh menggunakan kaedah decompose untuk mengembangkan setiap arahan ke dalam definisinya.
Kaedah decompose mengembalikan Circuit baharu dan tidak mengubah Circuit yang ia bertindak ke atasnya.
qc_a.decompose().draw("mpl")
Ukur Qubitβ
Pengukuran digunakan untuk menyampel keadaan Qubit individu dan memindahkan keputusan ke daftar klasik. Perlu diingat bahawa jika anda menghantar Circuit kepada primitif Sampler, pengukuran diperlukan. Walau bagaimanapun, Circuit yang dihantar kepada primitif Estimator tidak boleh mengandungi pengukuran.
Qubit boleh diukur menggunakan tiga kaedah: measure, measure_all dan measure_active. Untuk mempelajari cara menvisualisasikan keputusan yang diukur, lihat halaman Visualisasikan keputusan.
-
QuantumCircuit.measure: mengukur setiap Qubit dalam argumen pertama ke atas bit klasik yang diberikan sebagai argumen kedua. Kaedah ini membolehkan kawalan penuh ke atas tempat keputusan pengukuran disimpan. -
QuantumCircuit.measure_all: tidak mengambil argumen dan boleh digunakan untuk Circuit kuantum tanpa bit klasik yang telah ditakrifkan. Ia mencipta wayar klasik dan menyimpan keputusan pengukuran mengikut susunan. Contohnya, pengukuran Qubit disimpan dalam cbit ). Ia juga menambah halangan sebelum pengukuran. -
QuantumCircuit.measure_active: serupa denganmeasure_all, tetapi hanya mengukur Qubit yang mempunyai 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 pelaksanaan banyak variasi Circuit kuantum. Oleh kerana membina dan mengoptimumkan Circuit yang besar boleh memakan masa secara komputasi, Qiskit menyokong Circuit berparameter. Circuit ini mempunyai parameter yang tidak ditakrifkan, dan nilainya tidak perlu ditakrifkan sehingga sejurus sebelum melaksanakan Circuit. Ini membolehkan anda memindahkan pembinaan dan pengoptimuman Circuit keluar daripada gelung program utama. Sel berikut mencipta dan memaparkan 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")
Sel berikut mencipta banyak variasi Circuit ini dan memaparkan salah satu variasinya.
circuits = []
for value in range(100):
circuits.append(qc.assign_parameters({angle: value}))
circuits[0].draw("mpl")
Anda boleh mencari senarai parameter Circuit yang tidak ditakrifkan dalam atribut parameters-nya.
qc.parameters
ParameterView([Parameter(angle)])
Tukar nama parameterβ
Secara lalai, nama parameter untuk Circuit berparameter diberikan awalan x- contohnya, x[0]. Anda boleh menukar nama selepas ia ditakrifkan, seperti yang ditunjukkan dalam 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 seterusnyaβ
- Untuk mempelajari tentang algoritma kuantum jangka pendek, ambil kursus Reka bentuk algoritma variatif.
- Lihat contoh Circuit yang digunakan dalam tutorial Algoritma Grover.
- Bekerja dengan Circuit mudah menggunakan IBM Quantum Composer.