Bina litar
Package versions
Kod pada halaman ini dibangunkan menggunakan keperluan berikut. Kami mengesyorkan penggunaan versi ini atau yang lebih baharu.
qiskit[all]~=2.4.0
Halaman ini mengkaji dengan lebih mendalam kelas QuantumCircuit dalam SDK Qiskit, termasuk beberapa kaedah yang lebih lanjut yang boleh anda gunakan untuk mencipta litar kuantum.
Apakah litar kuantum?
Litar kuantum mudah ialah koleksi qubit dan senarai arahan yang bertindak ke atas qubit tersebut. Untuk menunjukkan, sel berikut mencipta litar baharu dengan dua qubit baharu, kemudian memaparkan atribut qubits litar, 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 litar. 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 litar 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 litar menambahkan arahan tersebut ke atribut data litar. 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 litar. Lihat Visualisasikan litar untuk cara berbeza memaparkan litar kuantum.
qc.draw("mpl")
Objek arahan litar boleh mengandungi litar "definisi" yang menggambarkan arahan dari segi arahan yang lebih asas. Contohnya, X-gate ditakrifkan sebagai kes tertentu U3-gate, sebuah get qubit tunggal yang lebih umum.
# Draw definition circuit of 0th instruction in `qc`
qc.data[0].operation.definition.draw("mpl")
Arahan dan litar 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).
- Litar direka untuk dibina merentasi banyak baris kod, dan kaedah
QuantumCircuitsering mengubah objek yang sedia ada.
Apakah kedalaman litar?
Kedalaman (depth()) litar kuantum ialah ukuran bilangan "lapisan" get kuantum, yang dilaksanakan secara selari, yang diperlukan untuk melengkapkan pengiraan yang ditakrifkan oleh litar tersebut. Oleh kerana get kuantum mengambil masa untuk dilaksanakan, kedalaman litar lebih kurang sepadan dengan jumlah masa yang diambil oleh komputer kuantum untuk melaksanakan litar tersebut. Oleh itu, kedalaman litar merupakan salah satu kuantiti penting yang digunakan untuk mengukur sama ada litar kuantum boleh dijalankan pada peranti.
Selebihnya halaman ini menggambarkan cara memanipulasi litar kuantum.
Bina litar
Kaedah seperti QuantumCircuit.h dan QuantumCircuit.cx menambah arahan tertentu kepada litar. Untuk menambah arahan kepada litar secara lebih umum, gunakan kaedah append. Ini mengambil arahan dan senarai qubit untuk menerapkan arahan tersebut. Lihat dokumentasi API Pustaka Litar 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 litar, 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 litar ke dalam arahan untuk memastikan litar anda teratur. Anda boleh menukar litar kepada arahan dengan menggunakan kaedah to_instruction, kemudian menambahkan ini kepada litar lain seperti mana-mana arahan lain. Litar yang dilukis dalam sel berikut secara fungsional setara dengan litar yang dilukis dalam sel sebelumnya.
inst = qc_b.to_instruction()
qc_a.append(inst, [1, 3])
qc_a.draw("mpl")
Jika litar 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 litar baharu dan tidak mengubah litar 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 litar kepada primitif Sampler, pengukuran diperlukan. Walau bagaimanapun, litar 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 litar 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)
Litar berparameter
Banyak algoritma kuantum jangka pendek melibatkan pelaksanaan banyak variasi litar kuantum. Oleh kerana membina dan mengoptimumkan litar yang besar boleh memakan masa secara komputasi, Qiskit menyokong litar berparameter. Litar ini mempunyai parameter yang tidak ditakrifkan, dan nilainya tidak perlu ditakrifkan sehingga sejurus sebelum melaksanakan litar. Ini membolehkan anda memindahkan pembinaan dan pengoptimuman litar keluar daripada gelung program utama. Sel berikut mencipta dan memaparkan litar 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 litar 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 litar yang tidak ditakrifkan dalam atribut parameters-nya.
qc.parameters
ParameterView([Parameter(angle)])
Tukar nama parameter
Secara lalai, nama parameter untuk litar 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 litar yang digunakan dalam tutorial Algoritma Grover.
- Bekerja dengan litar mudah menggunakan IBM Quantum Composer.