Algoritma Deutsch
Algoritma Deutsch memecahkan masalah paritas untuk kasus khusus bahwa Dalam konteks komputasi kuantum masalah ini kadang-kadang disebut sebagai masalah Deutsch, dan kita akan mengikuti nomenklatur tersebut dalam pelajaran ini.
Lebih tepatnya, inputnya diwakili oleh fungsi dari satu bit ke satu bit. Ada empat fungsi seperti itu:
Fungsi pertama dan terakhir bersifat konstan dan dua yang di tengah bersifat seimbang, artinya dua nilai keluaran yang mungkin untuk fungsi tersebut terjadi dengan jumlah yang sama saat kita merentang masukan. Masalah Deutsch adalah menentukan kategori mana yang dimiliki fungsi input: konstan atau seimbang.
Jika kita melihat fungsi input dalam masalah Deutsch sebagai mewakili akses acak ke sebuah string, kita sedang memikirkan string dua-bit:
Dilihat dari cara ini, masalah Deutsch adalah menghitung paritas (atau, setara, XOR eksklusif) dari dua bit.
Setiap algoritma kueri klasik yang memecahkan masalah ini dengan benar harus mengkueri kedua bit: dan Jika kita mengetahui bahwa misalnya, jawabannya masih bisa atau tergantung apakah atau masing-masing. Setiap kasus lainnya serupa; mengetahui hanya satu dari dua bit tidak memberikan informasi apapun tentang paritasnya. Jadi, sirkuit Boolean yang dijelaskan di bagian sebelumnya adalah yang terbaik yang bisa kita lakukan dalam hal jumlah kueri yang diperlukan untuk memecahkan masalah ini.
Deskripsi sirkuit kuantumβ
Algoritma Deutsch memecahkan masalah Deutsch menggunakan satu kueri, sehingga memberikan keunggulan yang dapat diukur dari kuantum atas komputasi klasik. Ini mungkin merupakan keunggulan yang sederhana β satu kueri dibanding dua β tetapi kita harus mulai dari suatu tempat. Kemajuan ilmiah kadang-kadang memiliki asal-usul yang tampaknya sederhana.
Berikut adalah sirkuit kuantum yang mendeskripsikan algoritma Deutsch:
Analisisβ
Untuk menganalisis algoritma Deutsch, kita akan menelusuri aksi sirkuit di atas dan mengidentifikasi keadaan qubit pada waktu yang disarankan oleh gambar ini:
Keadaan awalnya adalah dan dua operasi Hadamard di sisi kiri sirkuit mengubah keadaan ini menjadi
(Seperti biasa, kita mengikuti konvensi urutan qubit Qiskit, yang menempatkan qubit atas di sebelah kanan dan qubit bawah di sebelah kiri.) Mungkin terasa tidak intuitif untuk menulis keadaan produk ini sebagian didistribusikan (membiarkan keadaan qubit 1 difaktorkan keluar), tetapi ini akan membuat ekspresi kita selanjutnya lebih ringkas.
Selanjutnya, gate dilakukan. Sesuai definisi gate , nilai fungsi untuk keadaan klasik qubit atas/paling kanan di-XOR ke qubit bawah/paling kiri, yang mengubah menjadi keadaan
Kita bisa menyederhanakan ekspresi ini dengan mengamati bahwa rumus
berlaku untuk kedua nilai yang mungkin Lebih eksplisit, dua kasusnya adalah sebagai berikut.
Dengan demikian, kita bisa mengekspresikan secara alternatif seperti ini:
Sesuatu yang menarik baru saja terjadi! Meskipun aksi gate pada keadaan basis standar membiarkan qubit atas/paling kanan sendirian dan meng-XOR nilai fungsi ke qubit bawah/paling kiri, di sini kita melihat bahwa keadaan qubit atas/paling kanan telah berubah (secara umum) sementara keadaan qubit bawah/paling kiri tetap sama β secara khusus berada dalam keadaan sebelum dan sesudah gate dilakukan. Fenomena ini dikenal sebagai phase kickback, dan kita akan membahasnya lebih lanjut segera.
Dengan satu penyederhanaan akhir, yaitu menarik faktor ke luar dari jumlahan, kita mendapatkan ekspresi keadaan ini:
Perhatikan bahwa dalam ekspresi ini, kita memiliki di eksponen bukan yang mungkin kita harapkan dari sudut pandang aljabar murni, tetapi kita mendapatkan hasil yang sama dengan cara manapun. Ini karena nilai untuk bilangan bulat manapun hanya bergantung pada apakah genap atau ganjil.
Menerapkan gate Hadamard akhir ke qubit atas meninggalkan kita dengan keadaan
yang mengarah ke hasil yang benar dengan probabilitas ketika qubit kanan/paling atas diukur.
Catatan lebih lanjut tentang phase kickbackβ
Sebelum melanjutkan, mari kita lihat analisis di atas dari sudut yang sedikit berbeda yang mungkin memberikan pencerahan tentang fenomena phase kickback.
Pertama, perhatikan bahwa rumus berikut berlaku untuk semua pilihan bit
Ini bisa diverifikasi dengan memeriksa untuk dua nilai yang mungkin dan :
Menggunakan rumus ini, kita melihat bahwa
untuk setiap pilihan bit Karena rumus ini benar untuk dan kita lihat dengan linearitas bahwa
untuk semua vektor keadaan qubit dan oleh karena itu
Kunci yang membuat ini bekerja adalah bahwa Dalam istilah matematis, vektor adalah eigenvector dari matriks yang memiliki eigenvalue
Kita akan membahas eigenvector dan eigenvalue secara lebih rinci dalam pelajaran mendatang tentang Estimasi fase dan faktorisasi, di mana fenomena phase kickback digeneralisasikan ke operasi uniter lainnya.
Mengingat bahwa skalar mengalir bebas melalui produk tensor, kita menemukan cara alternatif untuk menalar bagaimana operasi mengubah menjadi dalam analisis di atas:
Implementasi dalam Qiskitβ
Sekarang mari kita lihat bagaimana kita bisa mengimplementasikan algoritma Deutsch dalam Qiskit. Kita akan mulai dengan pemeriksaan versi kemudian melakukan impor yang diperlukan khusus untuk implementasi ini. Untuk implementasi algoritma lain yang mengikuti, kita akan melakukan impor yang diperlukan secara terpisah demi modularitas yang lebih besar.
# Added by doQumentation β required packages for this notebook
!pip install -q qiskit qiskit-aer
from qiskit import __version__
print(__version__)
2.1.1
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
Pertama kita akan mendefinisikan sirkuit kuantum yang mengimplementasikan gate kueri untuk salah satu dari empat fungsi atau dari satu bit ke satu bit yang dijelaskan sebelumnya. Seperti yang sudah disebutkan, implementasi gate kueri sebenarnya bukan bagian dari algoritma Deutsch itu sendiri; di sini kita pada dasarnya hanya menunjukkan satu cara untuk mempersiapkan input, dalam bentuk implementasi sirkuit dari gate kueri.
def deutsch_function(case: int):
# This function generates a quantum circuit for one of the 4 functions
# from one bit to one bit
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
Kita bisa melihat seperti apa setiap sirkuit menggunakan metode draw. Berikut adalah sirkuit untuk fungsi
display(deutsch_function(3).draw(output="mpl"))
Selanjutnya kita akan membuat sirkuit kuantum aktual untuk algoritma Deutsch, menggantikan gate kueri dengan implementasi sirkuit kuantum yang diberikan sebagai argumen. Sebentar lagi kita akan memasukkan salah satu dari empat sirkuit yang didefinisikan oleh fungsi deutsch_function yang kita definisikan sebelumnya.
Barrier disertakan untuk menunjukkan pemisahan visual antara implementasi gate kueri dan sisa sirkuit.
def compile_circuit(function: QuantumCircuit):
# Compiles a circuit for use in Deutsch's algorithm.
n = function.num_qubits - 1
qc = QuantumCircuit(n + 1, n)
qc.x(n)
qc.h(range(n + 1))
qc.barrier()
qc.compose(function, inplace=True)
qc.barrier()
qc.h(range(n))
qc.measure(range(n), range(n))
return qc
Sekali lagi kita bisa melihat seperti apa sirkuit menggunakan metode draw.
display(compile_circuit(deutsch_function(3)).draw(output="mpl"))
Akhirnya, kita akan membuat fungsi yang menjalankan sirkuit yang sebelumnya didefinisikan satu kali dan mengeluarkan hasil yang sesuai: "constant" atau "balanced."
def deutsch_algorithm(function: QuantumCircuit):
# Determine if a one-bit function is constant or balanced.
qc = compile_circuit(function)
result = AerSimulator().run(qc, shots=1, memory=True).result()
measurements = result.get_memory()
if measurements[0] == "0":
return "constant"
return "balanced"
Kita sekarang bisa menjalankan algoritma Deutsch pada salah satu dari empat fungsi yang didefinisikan di atas.
f = deutsch_function(3)
display(deutsch_algorithm(f))
'balanced'