Langkau ke kandungan utama

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 q0q_0 hingga bit paling bererti qnq_n.

# 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")

Output of the previous code cell

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")

Output of the previous code cell

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 QuantumCircuit sering 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")

Output of the previous code cell

Untuk menggabungkan dua litar, gunakan kaedah compose. Ini menerima QuantumCircuit lain dan senarai pemetaan qubit yang pilihan.

nota

Kaedah compose mengembalikan litar baharu dan tidak mengubah mana-mana litar yang ia bertindak ke atasnya. Untuk mengubah litar yang anda panggil kaedah compose, gunakan argumen inplace=True.

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")

Output of the previous code cell

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")

Output of the previous code cell

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")

Output of the previous code cell

Untuk melihat apa yang berlaku, anda boleh menggunakan kaedah decompose untuk mengembangkan setiap arahan ke dalam definisinya.

nota

Kaedah decompose mengembalikan litar baharu dan tidak mengubah litar yang ia bertindak ke atasnya.

qc_a.decompose().draw("mpl")

Output of the previous code cell

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.

  1. 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.

  2. 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 qiq_i disimpan dalam cbit measimeas_i). Ia juga menambah halangan sebelum pengukuran.

  3. QuantumCircuit.measure_active : serupa dengan measure_all, tetapi hanya mengukur qubit yang mempunyai operasi.

qc1 = QuantumCircuit(2, 2)
qc1.measure(0, 1)
qc1.draw("mpl", cregbundle=False)

Output of the previous code cell

qc2 = QuantumCircuit(2)
qc2.measure_all()
qc2.draw("mpl", cregbundle=False)

Output of the previous code cell

qc3 = QuantumCircuit(2)
qc3.x(1)
qc3.measure_active()
qc3.draw("mpl", cregbundle=False)

Output of the previous code cell

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")

Output of the previous code cell

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")

Output of the previous code cell

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

Cadangan