Mulai cepat: Kirim sirkuit dengan Qiskit ke Azure Quantum

Pelajari cara menggunakan azure-quantumPython paket untuk mengirimkan sirkuit kuantum Qiskit ke komputasi target kuantum IonQ, Quantinuum, atau Rigetti melalui layanan Azure Quantum. Untuk informasi selengkapnya, lihat Sirkuit kuantum.

Prasyarat

  • Akun Azure dengan langganan aktif. Membuat akun secara gratis.

  • Buat ruang kerja Azure Quantum. Untuk informasi selengkapnya, lihat Buat ruang kerja Azure Quantum.

  • Instal paket terbaru azure-quantumPython menggunakan tag [qiskit].

    Catatan

    Sebelum menginstal atau memperbarui paket azure-quantum, hapus instalan semua versi pyqir, pyqir-*, dan qiskit-qir pada komputer Anda untuk menghindari konflik dependensi.

    Tip

    Jika menggunakan Miniconda atau Anaconda, Anda dapat secara opsional membuat lingkungan baru dengan mengunduh environment.yml dan menjalankan hal berikut:

    conda env create -f environment.yml
    

    Ini akan menciptakan lingkungan conda baru yang dapat Anda aktifkan dengan langkah berikut:

    conda activate azurequantum
    
  • Mulai editor kode favorit Anda atau alat interaktif Python, seperti VS Code, Jupyter, atau iPython.

Catatan

Contoh dalam Mulai Cepat ini menggunakan lingkungan Jupyter Notebook. Dari lingkungan conda Anda, jalankan Jupyter Notebook.

Memuat impor yang diperlukan

Di Jupyter Notebooks, buat buku catatan baru yang menggunakan Python 3 kernel. Di sel pertama, jalankan kode berikut untuk memuat impor yang diperlukan:

from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from qiskit.tools.monitor import job_monitor
from azure.quantum.qiskit import AzureQuantumProvider

Menyambungkan ke layanan Azure Quantum

Untuk dapat tersambung ke layanan Azure Quantum, program Anda memerlukan ID sumber daya dan lokasi ruang kerja Azure Quantum Anda. Masuk ke akun Azure Anda, https://portal.azure.com, navigasikan ke ruang kerja Azure Quantum Anda, dan salin nilai dari header.

Cara mengambil ID sumber daya dan lokasi dari ruang kerja Azure Quantum

Tempelkan nilai ke konstruktor berikut AzureQuantumProvider untuk membuat objek provider yang terhubung ke ruang kerja Azure Quantum Anda.

provider = AzureQuantumProvider(
  resource_id="",
  location=""
)

Mencantumkan semua backend

Anda sekarang dapat mencetak semua backend komputasi kuantum yang tersedia di ruang kerja Anda:

print("This workspace's targets:")
for backend in provider.backends():
    print("- " + backend.name())
This workspace's targets:
- ionq.qpu
- ionq.qpu.aria-1
- ionq.simulator
- microsoft.estimator
- quantinuum.hqs-lt-s1
- quantinuum.hqs-lt-s1-apival
- quantinuum.hqs-lt-s2
- quantinuum.hqs-lt-s2-apival
- quantinuum.hqs-lt-s1-sim
- quantinuum.hqs-lt-s2-sim
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.qpu.h1-2
- quantinuum.sim.h1-2sc
- quantinuum.sim.h1-1e
- quantinuum.sim.h1-2e
- rigetti.sim.qvm
- rigetti.qpu.aspen-11
- rigetti.qpu.aspen-m-2
- rigetti.qpu.aspen-m-3

Menjalankan sirkuit sederhana

Pertama, buat sirkuit Qiskit sederhana untuk dijalankan.

# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(3, 3)
circuit.name = "Qiskit Sample - 3-qubit GHZ circuit"
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure([0,1,2], [0, 1, 2])

# Print out the circuit
circuit.draw()
     ┌───┐          ┌─┐      
q_0: ┤ H ├──■───────┤M├──────
     └───┘┌─┴─┐     └╥┘┌─┐   
q_1: ─────┤ X ├──■───╫─┤M├───
          └───┘┌─┴─┐ ║ └╥┘┌─┐
q_2: ──────────┤ X ├─╫──╫─┤M├
               └───┘ ║  ║ └╥┘
c: 3/════════════════╩══╩══╩═
                     0  1  2 

Untuk mendapatkan hasil kembali dengan cepat, gunakan provider.get_backend untuk membuat objek Backend agar dapat terhubung ke backend IonQ Simulator:

simulator_backend = provider.get_backend("ionq.simulator")

Backend IonQ mendukung gerbang dari set gerbang yang ditentukan dan dikompilasi agar dapat berjalan secara optimal di perangkat keras. Jika sirkuit Anda berisi gerbang yang tidak ada dalam daftar ini, Anda harus mengubah rute ke set gerbang yang didukung menggunakan fungsi transpile yang disediakan oleh Qiskit:

from qiskit import transpile
circuit = transpile(circuit, simulator_backend)

Ini akan mengembalikan objek sirkuit baru dengan gerbang yang terurai akan menjadi gerbang yang didukung oleh backend yang ditentukan.

Anda sekarang dapat menjalankan program melalui layanan Azure Quantum dan mendapatkan hasilnya. Sel berikut mengirimkan pekerjaan yang menjalankan sirkuit dengan 100 bidikan:

job = simulator_backend.run(circuit, shots=100)
job_id = job.id()
print("Job id", job_id)
Job id 00000000-0000-0000-0000-000000000000

Untuk memantau kemajuan pekerjaan, Anda dapat menggunakan Qiskit job_monitor yang diimpor lebih awal untuk melacak status Pekerjaan. Panggilan ini akan diblokir hingga pekerjaan selesai:

job_monitor(job)
Job Status: job has successfully run

Untuk menunggu sampai pekerjaan selesai dan mengembalikan hasilnya, jalankan:

result = job.result()

Langkah ini akan memunculkan objek qiskit.Result.

type(result)
qiskit.result.result.Result
print(result)
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=100, success=True, meas_level=2, data=ExperimentResultData(counts={'000': 50, '111': 50}, probabilities={'000': 0.5, '111': 0.5}), header=QobjExperimentHeader(meas_map='[0, 1, 2]', name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])

Karena hasilnya adalah objek asli paket Qiskit, Anda dapat menggunakan Qiskit result.get_counts dan plot_histogram untuk memvisualisasikan hasilnya. Untuk memastikan bahwa semua kemungkinan label bitstring diwakili, tambahkan ke counts.

counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
{'000': 50, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 50}

Hasil sirkuit Qiskit pada Simulator IonQ

Memperkirakan biaya pekerjaan

Sebelum menjalankan pekerjaan di QPU, Anda dapat memperkirakan berapa biaya untuk menjalankannya. Untuk memperkirakan biaya menjalankan pekerjaan di QPU, Anda dapat menggunakan metode estimate_cost ini:

backend = provider.get_backend("ionq.qpu")
cost = backend.estimate_cost(circuit, shots=1024)

print(f"Estimated cost: {cost.estimated_total}")

Langkah ini akan mencetak perkiraan biaya dalam USD.

Untuk detail harga terbaru, lihat Harga IonQ, atau temukan ruang kerja Anda dan lihat opsi harga di tab "Penyedia" ruang kerja melalui: aka.ms/aq/myworkspaces.

Menjalankan di IonQ QPU

Untuk terhubung ke perangkat keras nyata ( Quantum Processor Unit (QPU)), cukup berikan nama target"ionq.qpu" ke provider.get_backend metode :

qpu_backend = provider.get_backend("ionq.qpu")

Kirimkan sirkuit untuk dijalankan di Azure Quantum.

Catatan

Waktu yang diperlukan untuk menjalankan sirkuit di QPU dapat bervariasi bergantung pada waktu antrean saat ini.

Seperti sebelumnya, gunakan job_monitor untuk melacak status pekerjaan, dan plot_histogram untuk merencanakan hasilnya.

# Submit the circuit to run on Azure Quantum
qpu_job = qpu_backend.run(circuit, shots=1024)
job_id = qpu_job.id()
print("Job id", job_id)

# Monitor job progress and wait until complete:
job_monitor(qpu_job)

# Get the job results (this method also waits for the Job to complete):
result = qpu_job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Job id 00000000-0000-0000-0000-000000000000
Job Status: job has successfully run
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'0': 505, '1': 6, '2': 1, '3': 1, '4': 1, '5': 10, '6': 11, '7': 488}, probabilities={'0': 0.4932, '1': 0.0059, '2': 0.001, '3': 0.001, '4': 0.001, '5': 0.0098, '6': 0.0117, '7': 0.4766}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])
{'000': 505, '001': 6, '010': 1, '011': 1, '100': 1, '101': 10, '110': 11, '111': 488}

Hasil sirkuit Qiskit pada IonQ QPU

Memuat impor yang diperlukan

Di Jupyter Notebooks, buat buku catatan baru yang menggunakan Python 3 kernel. Di sel pertama, jalankan kode berikut untuk memuat impor yang diperlukan:

from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from qiskit.tools.monitor import job_monitor
from azure.quantum.qiskit import AzureQuantumProvider

Menyambungkan ke layanan Azure Quantum

Untuk dapat tersambung ke layanan Azure Quantum, program Anda memerlukan ID sumber daya dan lokasi ruang kerja Azure Quantum Anda. Masuk ke akun Azure Anda, https://portal.azure.com, navigasikan ke ruang kerja Azure Quantum Anda, dan salin nilai dari header.

Cara mengambil ID sumber daya dan lokasi dari ruang kerja Azure Quantum

Tempelkan nilai ke konstruktor berikut AzureQuantumProvider untuk membuat objek provider yang terhubung ke ruang kerja Azure Quantum Anda.

provider = AzureQuantumProvider(
  resource_id="",
  location=""
)

Mencantumkan semua backend

Catatan

Nama target untuk Pemeriksa Sintaks Quantinuum, Emulator, dan QPU baru-baru ini berubah. Nama yang diperbarui digunakan dalam topik ini. Untuk detailnya, lihat topik penyedia Quantinuum .

Anda sekarang dapat mencetak semua backend komputasi kuantum yang tersedia di ruang kerja Anda:

print("This workspace's targets:")
for backend in provider.backends():
    print("- " + backend.name())
This workspace's targets:
- ionq.qpu
- ionq.qpu.aria-1
- ionq.simulator
- microsoft.estimator
- quantinuum.hqs-lt-s1
- quantinuum.hqs-lt-s1-apival
- quantinuum.hqs-lt-s2
- quantinuum.hqs-lt-s2-apival
- quantinuum.hqs-lt-s1-sim
- quantinuum.hqs-lt-s2-sim
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.qpu.h1-2
- quantinuum.sim.h1-2sc
- quantinuum.sim.h1-1e
- quantinuum.sim.h1-2e
- rigetti.sim.qvm
- rigetti.qpu.aspen-11
- rigetti.qpu.aspen-m-2
- rigetti.qpu.aspen-m-3

Jalankan pada pemeriksa sintaks

Untuk menguji program sebelum menjalankannya pada perangkat keras, pertama-tama jalankan pada pemeriksa sintaks Quantinuum.

Catatan

Backend pemeriksa sintaks Quantinuum akan selalu mengembalikan 0 pada pengukuran.

# Get Quantinuum's syntax checker backend:
syntax_backend = provider.get_backend("quantinuum.sim.h1-1sc")
# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(3, 3)
circuit.name = "Qiskit Sample - 3-qubit GHZ circuit"
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure([0,1,2], [0, 1, 2])

# Print out the circuit
circuit.draw()
     ┌───┐          ┌─┐      
q_0: ┤ H ├──■───────┤M├──────
     └───┘┌─┴─┐     └╥┘┌─┐   
q_1: ─────┤ X ├──■───╫─┤M├───
          └───┘┌─┴─┐ ║ └╥┘┌─┐
q_2: ──────────┤ X ├─╫──╫─┤M├
               └───┘ ║  ║ └╥┘
c: 3/════════════════╩══╩══╩═
                     0  1  2 

Anda sekarang dapat menjalankan program melalui layanan Azure Quantum dan mendapatkan hasilnya. Sel berikut mengirimkan pekerjaan yang menjalankan sirkuit dengan 1024 bidikan:

# Submit the circuit to run on Azure Quantum
job = syntax_backend.run(circuit, shots=1024)
job_id = job.id()
print("Job id", job_id)

# Monitor job progress and wait until complete:
job_monitor(job)

# Get the job results (this method also waits for the Job to complete):
result = job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Job id 00000000-0000-0000-0000-000000000000
Job Status: job has successfully run
Result(backend_name='quantinuum.qpu.h1-1sc', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'000': 1024}, probabilities={'000': 1.0}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit'))])
{'000': 1024, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 0}

Hasil sirkuit Qiskit pada validator API Quantinuum

Catatan

Meskipun pemeriksa sintaks memastikan bahwa kode Anda akan berjalan dengan sukses pada perangkat keras Quantinuum, ia juga mengembalikan 0 untuk setiap pengukuran kuantum. Untuk pengukuran kuantum yang benar, Anda perlu menjalankan sirkuit Anda pada perangkat keras kuantum.

Memperkirakan biaya pekerjaan

Sebelum menjalankan pekerjaan di QPU, Anda dapat memperkirakan berapa biaya untuk menjalankannya. Untuk memperkirakan biaya menjalankan pekerjaan di QPU, Anda dapat menggunakan metode estimate_cost ini:

qpu_backend = provider.get_backend("quantinuum.qpu.h1-1")
cost = qpu_backend.estimate_cost(circuit, shots=1024)

print(f"Estimated cost: {cost.estimated_total}")

Ini mencetak perkiraan biaya dalam H-System Quantum Credits (HQC).

Untuk detail harga terbaru, lihat Harga Azure Quantum, atau temukan ruang kerja Anda dan lihat opsi harga di tab Penyedia ruang kerja Anda melalui: aka.ms/aq/myworkspaces.

Menjalankan di Quantinuum QPU

Setelah berhasil berjalan di validator API, Anda dapat menjalankan pekerjaan di salah satu prosesor perangkat keras Quantinuum (Quantum Processor Unit (QPU)).

Catatan

Waktu yang diperlukan untuk menjalankan sirkuit di QPU dapat bervariasi bergantung pada waktu antrean saat ini.

# Get Quantinuum's QPU backend:
qpu_backend = provider.get_backend("quantinuum.qpu.h1-1")
# Submit the circuit to run on Azure Quantum
job = qpu_backend.run(circuit, shots=1024)
job_id = job.id()
print("Job id", job_id)

# Monitor job progress and wait until complete:
job_monitor(job)
Job id 00000000-0000-0000-0000-000000000000
Job Status: job has successfully run
# Get the job results (this method also waits for the Job to complete):
result = job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Result(backend_name='quantinuum.qpu.h1-1', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'011': 16, '010': 5, '001': 1, '000': 500, '111': 471, '101': 6, '100': 17, '110': 8}, probabilities={'011': 0.015625, '010': 0.0048828125, '001': 0.0009765625, '000': 0.48828125, '111': 0.4599609375, '101': 0.005859375, '100': 0.0166015625, '110': 0.0078125}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit'))])
{'000': 500, '001': 1, '010': 5, '011': 16, '100': 17, '101': 6, '110': 8, '111': 471}

Hasil sirkuit Qiskit pada QPU Quantinuum

Memuat impor yang diperlukan

Di Jupyter Notebooks, buat buku catatan baru yang menggunakan Python 3 kernel. Di sel pertama, jalankan kode berikut untuk memuat impor yang diperlukan:

from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from qiskit.tools.monitor import job_monitor
from azure.quantum.qiskit import AzureQuantumProvider

Menyambungkan ke layanan Azure Quantum

Untuk dapat tersambung ke layanan Azure Quantum, program Anda memerlukan ID sumber daya dan lokasi ruang kerja Azure Quantum Anda. Masuk ke akun Azure Anda, https://portal.azure.com, navigasikan ke ruang kerja Azure Quantum Anda, dan salin nilai dari header.

Cara mengambil ID sumber daya dan lokasi dari ruang kerja Azure Quantum

Tempelkan nilai ke konstruktor berikut AzureQuantumProvider untuk membuat objek provider yang terhubung ke ruang kerja Azure Quantum Anda.

provider = AzureQuantumProvider(
  resource_id="",
  location=""
)

Mencantumkan semua backend

Anda sekarang dapat mencetak semua backend komputasi kuantum yang tersedia di ruang kerja Anda:

print("This workspace's targets:")
for backend in provider.backends():
    print("- " + backend.name())
This workspace's targets:
- ionq.qpu
- ionq.qpu.aria-1
- ionq.simulator
- microsoft.estimator
- quantinuum.hqs-lt-s1
- quantinuum.hqs-lt-s1-apival
- quantinuum.hqs-lt-s2
- quantinuum.hqs-lt-s2-apival
- quantinuum.hqs-lt-s1-sim
- quantinuum.hqs-lt-s2-sim
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.qpu.h1-2
- quantinuum.sim.h1-2sc
- quantinuum.sim.h1-1e
- quantinuum.sim.h1-2e
- rigetti.sim.qvm
- rigetti.qpu.aspen-11
- rigetti.qpu.aspen-m-2
- rigetti.qpu.aspen-m-3

Jalankan pada simulator QVM

Untuk menguji program sebelum menjalankannya pada perangkat keras, pertama-tama jalankan pada simulator Rigetti QVM.

# Get Rigetti's QVM simulator backend:
qvm_backend = provider.get_backend("rigetti.sim.qvm")
# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(3, 3)
circuit.name = "Qiskit Sample - 3-qubit GHZ circuit"
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure([0,1,2], [0, 1, 2])

# Print out the circuit
circuit.draw()
     ┌───┐          ┌─┐      
q_0: ┤ H ├──■───────┤M├──────
     └───┘┌─┴─┐     └╥┘┌─┐   
q_1: ─────┤ X ├──■───╫─┤M├───
          └───┘┌─┴─┐ ║ └╥┘┌─┐
q_2: ──────────┤ X ├─╫──╫─┤M├
               └───┘ ║  ║ └╥┘
c: 3/════════════════╩══╩══╩═
                     0  1  2 

Anda sekarang dapat menjalankan program melalui layanan Azure Quantum dan mendapatkan hasilnya. Sel berikut mengirimkan pekerjaan yang menjalankan sirkuit dengan 1024 bidikan:

# Submit the circuit to run on Azure Quantum
job = qvm_backend.run(circuit, shots=1024)
job_id = job.id()
print("Job id", job_id)

# Monitor job progress and wait until complete:
job_monitor(job)

# Get the job results (this method also waits for the Job to complete):
result = job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Job id 00000000-0000-0000-0000-000000000000
Job Status: job has successfully run
Result(backend_name='rigetti.sim.qvm"', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'000': 1024}, probabilities={'000': 1.0}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit'))])
{'000': 1024, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 0}

Hasil sirkuit Qiskit pada simulator Rigetti QVM

Jalankan pada Rigetti QPU

Setelah berhasil berjalan pada simulator QVM, Anda dapat menjalankan pekerjaan Anda di salah satu prosesor perangkat keras Rigetti ( Quantum Processor Unit (QPU)).

Catatan

Waktu yang diperlukan untuk menjalankan sirkuit di QPU dapat bervariasi bergantung pada waktu antrean saat ini.

# Get Rigetti's QPU backend:
qpu_backend = provider.get_backend("rigetti.qpu.aspen-m-3")
# Submit the circuit to run on Azure Quantum
job = qpu_backend.run(circuit, shots=500)
job_id = job.id()
print("Job id", job_id)

# Monitor job progress and wait until complete:
job_monitor(job)
Job id 00000000-0000-0000-0000-000000000000
Job Status: job has successfully run
# Get the job results (this method also waits for the Job to complete):
result = job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Result(backend_name='rigetti.qpu.aspen-m-3', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'011': 16, '010': 5, '001': 1, '000': 500, '111': 471, '101': 6, '100': 17, '110': 8}, probabilities={'011': 0.015625, '010': 0.0048828125, '001': 0.0009765625, '000': 0.48828125, '111': 0.4599609375, '101': 0.005859375, '100': 0.0166015625, '110': 0.0078125}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit'))])
{'000': 500, '001': 1, '010': 5, '011': 16, '100': 17, '101': 6, '110': 8, '111': 471}

Hasil sirkuit Qiskit pada Rigetti QPU

Penting

Mengirimkan beberapa sirkuit pada satu pekerjaan saat ini tidak didukung. Sebagai solusinya, Anda dapat memanggil backend.run metode untuk mengirimkan setiap sirkuit secara asinkron, lalu mengambil hasil setiap pekerjaan. Contohnya:

jobs = []
for circuit in circuits:
    jobs.append(backend.run(circuit, shots=N))

results = []
for job in jobs:
    results.append(job.result())