Algoritma Deutsch-Jozsa
Untuk modul Qiskit in Classrooms ini, siswa harus punya lingkungan Python yang berfungsi dengan paket-paket berikut terinstal:
qiskitv2.1.0 atau lebih baruqiskit-ibm-runtimev0.40.1 atau lebih baruqiskit-aerv0.17.0 atau lebih baruqiskit.visualizationnumpypylatexenc
Untuk mengatur dan menginstal paket-paket di atas, lihat panduan Install Qiskit. Untuk menjalankan job di komputer kuantum nyata, siswa perlu membuat akun di IBM Quantum® dengan mengikuti langkah-langkah di panduan Set up your IBM Cloud account.
Modul ini telah diuji dan menggunakan empat detik waktu QPU. Ini hanya estimasi. Penggunaan aktualmu mungkin berbeda.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'
Tonton video penjelasan modul oleh Dr. Katie McCormick di bawah, atau klik di sini untuk menontonnya di YouTube.
Intro​
Pada awal 1980-an, fisikawan kuantum dan ilmuwan komputer punya gagasan samar bahwa mekanika kuantum bisa dimanfaatkan untuk membuat komputasi yang jauh lebih powerful daripada yang bisa dilakukan komputer klasik. Alasan mereka begini: sulit bagi komputer klasik untuk menyimulasikan sistem kuantum, tapi komputer kuantum seharusnya bisa melakukannya lebih efisien. Dan kalau komputer kuantum bisa menyimulasikan sistem kuantum lebih efisien, mungkin ada tugas lain yang bisa dilakukannya lebih efisien daripada komputer klasik.
Logikanya masuk akal, tapi detailnya masih perlu dikerjakan. Ini dimulai pada 1985, ketika David Deutsch mendeskripsikan "komputer kuantum universal" pertama. Dalam makalah yang sama, dia memberikan contoh masalah pertama di mana komputer kuantum bisa menyelesaikan sesuatu lebih efisien daripada komputer klasik. Contoh mainan pertama ini sekarang dikenal sebagai "algoritma Deutsch." Peningkatan dalam algoritma Deutsch cukup sederhana, tapi Deutsch kemudian bekerja sama dengan Richard Jozsa beberapa tahun kemudian untuk semakin memperlebar kesenjangan antara komputer klasik dan kuantum.
Algoritma-algoritma ini — Deutsch, dan ekstensi Deutsch-Jozsa — tidak terlalu berguna secara praktis, tapi tetap sangat penting karena beberapa alasan:
- Secara historis, ini adalah beberapa algoritma kuantum pertama yang terbukti mengalahkan padanannya yang klasik. Memahaminya bisa membantu kita memahami bagaimana pemikiran komunitas tentang komputasi kuantum berkembang dari waktu ke waktu.
- Algoritma-algoritma ini bisa membantu kita memahami beberapa aspek dari jawaban atas pertanyaan yang ternyata cukup rumit: Apa yang membuat komputasi kuantum begitu powerful? Kadang, komputer kuantum dibandingkan dengan prosesor paralel klasik yang sangat besar dan berskala eksponensial. Tapi ini tidak sepenuhnya tepat. Meskipun sebagian jawabannya terletak pada "paralelisme kuantum," mengekstrak informasi sebanyak mungkin dalam satu kali jalan adalah seni yang rumit. Algoritma Deutsch dan Deutsch-Jozsa menunjukkan bagaimana hal ini bisa dilakukan.
Dalam modul ini, kita akan belajar tentang algoritma Deutsch, algoritma Deutsch-Jozsa, dan apa yang bisa kita pelajari dari keduanya tentang kekuatan komputasi kuantum.
Paralelisme kuantum dan batasannya​
Sebagian kekuatan komputasi kuantum berasal dari "paralelisme kuantum," yang pada dasarnya adalah kemampuan untuk melakukan operasi pada banyak input sekaligus, karena state input Qubit bisa berada dalam superposisi dari banyak state yang diperbolehkan secara klasik. NAMUN, meskipun sebuah Circuit kuantum mungkin bisa mengevaluasi banyak state input sekaligus, mengekstrak semua informasi itu dalam satu kali pengukuran adalah hal yang mustahil.
Untuk memahami maksudnya, katakanlah kita punya sebuah bit, dan suatu fungsi yang diterapkan pada bit tersebut, . Ada empat kemungkinan fungsi biner yang mengambil satu bit ke satu bit lainnya:
| 0 | 0 | 0 | 1 | 1 |
| 1 | 0 | 1 | 0 | 1 |
Kita ingin tahu fungsi mana (1-4) yang merupakan kita. Secara klasik, kita perlu menjalankan fungsi dua kali — sekali untuk , sekali untuk . Tapi mari lihat apakah kita bisa melakukan lebih baik dengan Circuit kuantum. Kita bisa mempelajari fungsinya dengan Gate berikut:
Di sini, Gate menghitung , di mana adalah state dari Qubit 0, dan menerapkannya ke Qubit 1. Jadi, state yang dihasilkan, , menjadi ketika . Ini mengandung semua informasi yang kita butuhkan untuk mengetahui fungsi : Qubit 0 memberi tahu kita apa itu , dan Qubit 1 memberi tahu kita apa itu . Jadi, jika kita menginisialisasi , maka state akhir dari kedua Qubit akan menjadi: . Tapi bagaimana kita mengakses informasi itu?
2.1. Coba di Qiskit:​
Menggunakan Qiskit, kita akan memilih secara acak salah satu dari empat fungsi yang mungkin di atas dan menjalankan Circuit-nya. Kemudian tugasmu adalah menggunakan pengukuran Circuit kuantum untuk mempelajari fungsinya dengan sesedikit mungkin percobaan.
Dalam eksperimen pertama ini dan sepanjang modul, kita akan menggunakan kerangka kerja untuk komputasi kuantum yang dikenal sebagai "Qiskit patterns," yang membagi alur kerja menjadi langkah-langkah berikut:
- Langkah 1: Petakan input klasik ke masalah kuantum
- Langkah 2: Optimalkan masalah untuk eksekusi kuantum
- Langkah 3: Eksekusi menggunakan Qiskit Runtime Primitives
- Langkah 4: Post-processing dan analisis klasik
Mari mulai dengan memuat beberapa paket yang diperlukan, termasuk Qiskit Runtime primitives. Kita juga akan memilih komputer kuantum yang paling tidak sibuk yang tersedia untuk kita.
Ada kode di bawah untuk menyimpan kredensialmu saat pertama kali digunakan. Pastikan untuk menghapus informasi ini dari notebook setelah menyimpannya ke lingkunganmu, agar kredensialmu tidak sengaja dibagikan saat kamu berbagi notebook. Lihat Set up your IBM Cloud account dan Initialize the service in an untrusted environment untuk panduan lebih lanjut.
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService
# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler
# Syntax for first saving your token. Delete these lines after saving your credentials.
# QiskitRuntimeService.save_account(channel='ibm_quantum_platform', instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR_API_KEY>', overwrite=True, set_as_default=True)
# service = QiskitRuntimeService(channel='ibm_quantum_platform')
# Load saved credentials
service = QiskitRuntimeService()
# Use the least busy backend, or uncomment the loading of a specific backend like "ibm_brisbane".
# backend = service.least_busy(operational=True, simulator=False, min_num_qubits = 127)
backend = service.backend("ibm_brisbane")
print(backend.name)
sampler = Sampler(mode=backend)
ibm_brisbane
Cell di bawah ini memungkinkanmu untuk beralih antara menggunakan simulator atau hardware nyata sepanjang notebook. Kami sarankan untuk menjalankannya sekarang:
# Load the backend sampler
from qiskit.primitives import BackendSamplerV2
# Load the Aer simulator and generate a noise model based on the currently-selected backend.
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel
# Alternatively, load a fake backend with generic properties and define a simulator.
noise_model = NoiseModel.from_backend(backend)
# Define a simulator using Aer, and use it in Sampler.
backend_sim = AerSimulator(noise_model=noise_model)
sampler_sim = BackendSamplerV2(backend=backend_sim)
# You could also define a simulator-based sampler using a generic backend:
# backend_gen = GenericBackendV2(num_qubits=18)
# sampler_gen = BackendSamplerV2(backend=backend_gen)
Sekarang setelah kita memuat paket-paket yang diperlukan, kita bisa melanjutkan dengan alur kerja Qiskit patterns. Pada langkah pemetaan di bawah, kita pertama-tama membuat fungsi yang memilih di antara empat fungsi yang mungkin yang mengambil satu bit ke satu bit lainnya.
# Step 1: Map
from qiskit import QuantumCircuit
qc = QuantumCircuit(2)
def twobit_function(case: int):
"""
Generate a valid two-bit function as a `QuantumCircuit`.
"""
if case not in [1, 2, 3, 4]:
raise ValueError("`case` must be 1, 2, 3, or 4.")
f = QuantumCircuit(2)
if case in [2, 3]:
f.cx(0, 1)
if case in [3, 4]:
f.x(1)
return f
# first, convert oracle circuit (above) to a single gate for drawing purposes. otherwise, the circuit is too large to display
# blackbox = twobit_function(2).to_gate() # you may edit the number inside "twobit_function()" to select among the four valid functions
# blackbox.label = "$U_f$"
qc.h(0)
qc.barrier()
qc.compose(twobit_function(2), inplace=True)
qc.measure_all()
qc.draw("mpl")
Pada Circuit di atas, Gate Hadamard "H" mengambil Qubit 0, yang awalnya dalam state , ke state superposisi . Kemudian, mengevaluasi fungsi dan menerapkannya ke Qubit 1.
Selanjutnya kita perlu mengoptimalkan dan mentranspilasi Circuit agar bisa dijalankan di komputer kuantum:
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
Akhirnya, kita jalankan Circuit yang telah ditranspilasi di komputer kuantum dan visualisasikan hasilnya:
# Step 3: Run the job on a real quantum computer
job = sampler.run([qc_isa], shots=1)
# job = sampler_sim.run([qc_isa],shots=1) # uncomment this line to run on simulator instead
res = job.result()
counts = res[0].data.meas.get_counts()
# Step 4: Visualize and analyze results
## Analysis
from qiskit.visualization import plot_histogram
plot_histogram(counts)
Di atas adalah histogram dari hasil kita. Tergantung pada jumlah shots yang kamu pilih untuk menjalankan Circuit di langkah 3 di atas, kamu mungkin melihat satu atau dua batang, yang mewakili state terukur dari kedua Qubit di setiap shot. Seperti biasa dengan Qiskit dan dalam notebook ini, kita menggunakan notasi "little endian," yang berarti state dari Qubit 0 hingga n ditulis dalam urutan naik dari kanan ke kiri, sehingga Qubit 0 selalu paling kanan.
Jadi, karena Qubit 0 berada dalam state superposisi, Circuit mengevaluasi fungsi untuk keduanya dan pada saat yang sama — sesuatu yang tidak bisa dilakukan komputer klasik! Tapi masalahnya muncul ketika kita ingin mempelajari fungsi — ketika kita mengukur Qubit, kita meng-collapse state-nya. Jika kamu memilih "shots = 1" untuk hanya menjalankan Circuit sekali, kamu hanya akan melihat satu batang dalam histogram di atas, dan informasimu tentang fungsi tersebut akan tidak lengkap.
Uji pemahamanmu​
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Berapa kali kita harus menjalankan algoritma di atas untuk mempelajari fungsi ? Apakah ini lebih baik dari kasus klasik? Apakah kamu lebih memilih komputer klasik atau kuantum untuk menyelesaikan masalah ini?
Jawaban:
Karena pengukuran akan meng-collapse superposisi dan hanya mengembalikan satu nilai, kita perlu menjalankan Circuit minimal dua kali untuk mendapatkan kedua output dari fungsi dan . Paling baik, ini bekerja sama seperti kasus klasik, di mana kita menghitung baik maupun dalam dua kueri pertama. Tapi ada kemungkinan kita perlu menjalankannya lebih dari dua kali, karena pengukuran akhir bersifat probabilistik dan mungkin mengembalikan nilai yang sama di dua kali pertama. Aku lebih memilih komputer klasik dalam kasus ini.
Jadi, meskipun paralelisme kuantum bisa sangat powerful ketika digunakan dengan cara yang tepat, tidak benar untuk mengatakan bahwa komputer kuantum bekerja seperti prosesor paralel klasik yang sangat besar. Tindakan pengukuran meng-collapse state kuantum, sehingga kita hanya bisa mengakses satu output dari komputasi tersebut.
Algoritma Deutsch​
Meskipun paralelisme kuantum saja tidak memberi kita keunggulan atas komputer klasik, kita bisa menggabungkannya dengan fenomena kuantum lain, interferensi, untuk mencapai percepatan. Algoritma yang sekarang dikenal sebagai "algoritma Deutsch" adalah contoh pertama dari algoritma yang berhasil melakukan ini.
Masalahnya​
Inilah masalahnya:
Diberikan sebuah bit input, , dan fungsi input , tentukan apakah fungsinya balanced atau constant. Artinya, jika balanced, maka output dari fungsinya adalah 0 setengah dari waktu dan 1 setengah lainnya. Jika constant, maka output dari fungsinya selalu 0 atau selalu 1. Ingat tabel empat fungsi yang mungkin yang mengambil satu bit ke satu bit lainnya:
| 0 | 0 | 0 | 1 | 1 |
| 1 | 0 | 1 | 0 | 1 |
Fungsi pertama dan terakhir, dan , adalah constant, sementara dua fungsi di tengah, dan , adalah balanced.
Algoritmanya​
Cara Deutsch mendekati masalah ini adalah melalui "model kueri." Dalam model kueri, fungsi input ( di atas) terkandung dalam sebuah "kotak hitam" — kita tidak punya akses langsung ke isinya, tapi kita bisa melakukan kueri ke kotak hitam tersebut dan ia akan memberikan output dari fungsinya. Kadang kita mengatakan bahwa sebuah "oracle" menyediakan informasi ini. Lihat Lesson 1: Quantum Query Algorithms dari kursus Fundamentals of Quantum Algorithms untuk informasi lebih lanjut tentang model kueri.
Untuk menentukan apakah algoritma kuantum lebih efisien dari algoritma klasik dalam model kueri, kita bisa membandingkan jumlah kueri yang perlu kita lakukan ke kotak hitam di setiap kasus. Dalam kasus klasik, untuk mengetahui apakah fungsi yang terkandung dalam kotak hitam itu balanced atau constant, kita perlu melakukan kueri ke kotak tersebut dua kali untuk mendapatkan dan .
Dalam algoritma kuantum Deutsch, ia menemukan cara untuk mendapatkan informasi hanya dengan satu kueri! Ia membuat satu penyesuaian pada Circuit "paralelisme kuantum" di atas, sehingga ia menyiapkan state superposisi pada kedua Qubit, bukan hanya pada Qubit 0. Kemudian dua output dari fungsi, dan berinterferensi untuk mengembalikan 0 jika keduanya 0 atau keduanya 1 (fungsinya constant), dan mengembalikan 1 jika keduanya berbeda (fungsinya balanced). Dengan cara ini, Deutsch bisa membedakan antara fungsi constant dan balanced hanya dengan satu kueri.
Berikut adalah diagram Circuit dari algoritma Deutsch:

Untuk memahami cara kerja algoritma ini, mari lihat state kuantum dari Qubit pada tiga titik yang ditandai pada diagram di atas. Coba kerjakan state-nya sendiri sebelum mengklik untuk melihat jawabannya:
Uji pemahamanmu​
Baca pertanyaan-pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Apa state ?
Jawaban:
Menerapkan Hadamard mengubah state menjadi dan state menjadi . Jadi, state penuhnya menjadi: