Algoritma Deutsch-Jozsa
Algoritma Deutsch mengungguli semua algoritma klasik untuk masalah query, tapi keuntungannya cukup sederhana: satu query versus dua. Algoritma Deutsch-Jozsa memperluas keuntungan ini β dan, sebenarnya, algoritma ini bisa digunakan untuk menyelesaikan beberapa masalah query yang berbeda.
Berikut deskripsi Circuit kuantum dari algoritma Deutsch-Jozsa. Langkah pemrosesan klasik tambahan, yang tidak ditampilkan dalam gambar, mungkin juga diperlukan tergantung pada masalah spesifik yang sedang diselesaikan.
Tentu saja, kita belum membahas masalah apa yang diselesaikan algoritma ini; hal itu dilakukan di dua bagian berikut.
Masalah Deutsch-Jozsaβ
Kita akan mulai dengan masalah query yang awalnya dimaksudkan untuk diselesaikan oleh algoritma Deutsch-Jozsa, yang dikenal sebagai masalah Deutsch-Jozsa.
Fungsi input untuk masalah ini berbentuk untuk bilangan bulat positif yang sembarang. Seperti masalah Deutsch, tugasnya adalah mengeluarkan jika konstan dan jika seimbang, yang kembali berarti bahwa jumlah string input di mana fungsi mengambil nilai sama dengan jumlah string input di mana fungsi mengambil nilai .
Perhatikan bahwa, ketika lebih besar dari ada fungsi berbentuk yang bukan konstan maupun seimbang. Misalnya, fungsi yang didefinisikan sebagai
tidak termasuk dalam salah satu dari dua kategori ini. Untuk masalah Deutsch-Jozsa, kita tidak perlu khawatir tentang fungsi seperti ini β mereka dianggap sebagai input "don't care". Artinya, untuk masalah ini kita memiliki janji bahwa adalah konstan atau seimbang.
Algoritma Deutsch-Jozsa, dengan satu querynya, menyelesaikan masalah ini dalam pengertian berikut: jika setiap satu dari hasil pengukuran adalah maka fungsi adalah konstan; dan sebaliknya, jika setidaknya satu dari hasil pengukuran adalah maka fungsi adalah seimbang. Cara lain untuk mengatakannya adalah bahwa Circuit yang dijelaskan di atas diikuti oleh langkah pemrosesan klasik di mana OR dari hasil pengukuran dihitung untuk menghasilkan output.
Analisis algoritmaβ
Untuk menganalisis kinerja algoritma Deutsch-Jozsa untuk masalah Deutsch-Jozsa, ada baiknya kita mulai dengan memikirkan aksi dari satu lapisan Gate Hadamard. Operasi Hadamard dapat diekspresikan sebagai matriks dengan cara biasa,
tapi kita juga bisa mengekspresikan operasi ini dalam hal aksinya pada keadaan basis standar:
Kedua persamaan ini dapat digabungkan menjadi satu rumus tunggal,
yang berlaku untuk kedua pilihan
Sekarang misalkan alih-alih hanya satu Qubit kita punya Qubit, dan operasi Hadamard dilakukan pada masing-masing. Operasi gabungan pada Qubit dijelaskan oleh produk tensor ( kali), yang kita tulis sebagai untuk keringkasan dan kejelasan. Menggunakan rumus dari atas, dilanjutkan dengan mengekspansi kemudian menyederhanakan, kita dapat mengekspresikan aksi dari operasi gabungan ini pada keadaan basis standar dari Qubit seperti ini:
Di sini, ngomong-ngomong, kita menulis string biner panjang sebagai dan mengikuti konvensi pengindeksan Qiskit.
Rumus ini memberi kita alat yang berguna untuk menganalisis Circuit kuantum di atas. Setelah lapisan pertama Gate Hadamard dilakukan, keadaan Qubit (termasuk Qubit paling kiri/bawah, yang diperlakukan secara terpisah dari yang lain) adalah
Ketika operasi dilakukan, keadaan ini diubah menjadi
melalui fenomena phase kick-back yang persis sama seperti yang kita lihat dalam analisis algoritma Deutsch.
Kemudian lapisan kedua Gate Hadamard dilakukan, yang (berdasarkan rumus di atas) mengubah keadaan ini menjadi
Ekspresi ini terlihat agak rumit, dan tidak banyak yang bisa disimpulkan tentang probabilitas untuk mendapatkan hasil pengukuran yang berbeda tanpa mengetahui lebih banyak tentang fungsi
Untungnya, yang perlu kita ketahui hanyalah probabilitas bahwa setiap satu dari hasil pengukuran adalah β karena itulah probabilitas bahwa algoritma menentukan bahwa adalah konstan. Probabilitas ini memiliki rumus sederhana.
Lebih rinci, jika konstan, maka entah untuk setiap string dalam hal ini nilai jumlahnya adalah atau untuk setiap string dalam hal ini nilai jumlahnya adalah Membagi dengan dan mengambil kuadrat dari nilai absolut menghasilkan
Di sisi lain, jika seimbang, maka mengambil nilai pada setengah dari string dan nilai pada setengah lainnya, sehingga suku-suku dan dalam jumlah saling menghilangkan dan kita mendapat nilai
Kita menyimpulkan bahwa algoritma beroperasi dengan benar asalkan janji terpenuhi.
Kesulitan klasikβ
Algoritma Deutsch-Jozsa bekerja setiap saat, selalu memberi kita jawaban yang benar ketika janji terpenuhi, dan hanya membutuhkan satu query. Bagaimana ini dibandingkan dengan algoritma query klasik untuk masalah Deutsch-Jozsa?
Pertama, algoritma klasik deterministik mana pun yang dengan benar menyelesaikan masalah Deutsch-Jozsa harus membuat query dalam jumlah eksponensial: query diperlukan dalam kasus terburuk. Alasannya adalah bahwa, jika sebuah algoritma deterministik melakukan query pada atau lebih sedikit string yang berbeda, dan mendapatkan nilai fungsi yang sama setiap saat, maka kedua jawaban masih mungkin. Fungsinya mungkin konstan, atau mungkin seimbang tetapi karena kemalangan, query-query tersebut semuanya mengembalikan nilai fungsi yang sama.
Kemungkinan kedua mungkin tampak tidak mungkin β tetapi untuk algoritma deterministik tidak ada keacakan atau ketidakpastian, sehingga mereka akan gagal secara sistematis pada fungsi-fungsi tertentu. Oleh karena itu kita memiliki keuntungan yang signifikan dari algoritma kuantum dibandingkan algoritma klasik dalam hal ini.
Namun ada kendala, yaitu algoritma klasik probabilistik dapat menyelesaikan masalah Deutsch-Jozsa dengan probabilitas sangat tinggi hanya menggunakan beberapa query. Khususnya, jika kita hanya memilih beberapa string berbeda panjang secara acak, dan melakukan query pada string-string tersebut, tidak mungkin kita mendapatkan nilai fungsi yang sama untuk semuanya ketika seimbang.
Lebih spesifik, jika kita memilih string input secara seragam secara acak, mengevaluasi dan menjawab jika nilai fungsinya semua sama, dan jika tidak, maka kita akan selalu benar ketika konstan, dan salah dalam kasus bahwa seimbang dengan probabilitas hanya Jika kita mengambil misalnya, algoritma ini akan menjawab dengan benar dengan probabilitas lebih besar dari %.
Karena alasan ini, kita tetap memiliki keuntungan yang cukup sederhana dari kuantum dibandingkan algoritma klasik β tetapi tetap saja merupakan keuntungan yang dapat dikuantifikasi yang mewakili peningkatan atas algoritma Deutsch.
Deutsch-Jozsa dengan Qiskitβ
# Added by doQumentation β required packages for this notebook
!pip install -q numpy qiskit qiskit-aer
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
import numpy as np
Untuk mengimplementasikan algoritma Deutsch-Jozsa di Qiskit, kita akan mulai dengan mendefinisikan fungsi dj_query yang menghasilkan Circuit kuantum yang mengimplementasikan Gate query, untuk fungsi yang dipilih secara acak yang memenuhi janji untuk masalah Deutsch-Jozsa.
Dengan peluang 50%, fungsinya konstan, dan dengan peluang 50% fungsinya seimbang.
Untuk masing-masing dari dua kemungkinan tersebut, fungsinya dipilih secara seragam dari fungsi-fungsi dengan tipe tersebut.
Argumennya adalah jumlah bit input dari fungsi.
def dj_query(num_qubits):
# Create a circuit implementing for a query gate for a random function
# satisfying the promise for the Deutsch-Jozsa problem.
qc = QuantumCircuit(num_qubits + 1)
if np.random.randint(0, 2):
# Flip output qubit with 50% chance
qc.x(num_qubits)
if np.random.randint(0, 2):
# return constant circuit with 50% chance
return qc
# Choose half the possible input strings
on_states = np.random.choice(
range(2**num_qubits), # numbers to sample from
2**num_qubits // 2, # number of samples
replace=False, # makes sure states are only sampled once
)
def add_cx(qc, bit_string):
for qubit, bit in enumerate(reversed(bit_string)):
if bit == "1":
qc.x(qubit)
return qc
for state in on_states:
qc.barrier() # Barriers are added to help visualize how the functions are created.
qc = add_cx(qc, f"{state:0b}")
qc.mcx(list(range(num_qubits)), num_qubits)
qc = add_cx(qc, f"{state:0b}")
qc.barrier()
return qc
Kita dapat menampilkan implementasi Circuit kuantum dari Gate query menggunakan metode draw seperti biasa.
display(dj_query(3).draw(output="mpl"))
Selanjutnya kita mendefinisikan fungsi yang membuat Circuit Deutsch-Jozsa, dengan mengambil implementasi Circuit kuantum dari Gate query sebagai argumen.
def compile_circuit(function: QuantumCircuit):
# Compiles a circuit for use in the Deutsch-Jozsa algorithm.
n = function.num_qubits - 1
qc = QuantumCircuit(n + 1, n)
qc.x(n)
qc.h(range(n + 1))
qc.compose(function, inplace=True)
qc.h(range(n))
qc.measure(range(n), range(n))
return qc
Terakhir, sebuah fungsi yang menjalankan Circuit Deutsch-Jozsa sekali didefinisikan.
def dj_algorithm(function: QuantumCircuit):
# Determine if a function is constant or balanced.
qc = compile_circuit(function)
result = AerSimulator().run(qc, shots=1, memory=True).result()
measurements = result.get_memory()
if "1" in measurements[0]:
return "balanced"
return "constant"
Kita dapat menguji implementasi kita dengan memilih fungsi secara acak, menampilkan implementasi Circuit kuantum dari Gate query untuk fungsi ini, lalu menjalankan algoritma Deutsch-Jozsa pada fungsi tersebut.
f = dj_query(3)
display(f.draw("mpl"))
display(dj_algorithm(f))

'balanced'
Masalah Bernstein-Vaziraniβ
Selanjutnya, kita akan membahas masalah yang dikenal sebagai masalah Bernstein-Vazirani. Ini juga disebut masalah Fourier sampling, meskipun ada formulasi yang lebih umum dari masalah ini yang juga menggunakan nama tersebut.
Pertama, mari kita perkenalkan beberapa notasi. Untuk dua string biner dan dengan panjang kita mendefinisikan
Kita akan menyebut operasi ini sebagai produk titik biner. Cara alternatif untuk mendefinisikannya adalah seperti ini.
Perhatikan bahwa ini adalah operasi simetris, artinya hasilnya tidak berubah jika kita menukar dan jadi kita bebas melakukan itu kapan saja ketika itu nyaman. Terkadang berguna untuk memikirkan produk titik biner sebagai paritas bit dari di posisi di mana string memiliki atau secara ekivalen, paritas bit dari di posisi di mana string memiliki
Dengan notasi ini di tangan, kita sekarang dapat mendefinisikan masalah Bernstein-Vazirani.
Kita sebenarnya tidak membutuhkan algoritma kuantum baru untuk masalah ini; algoritma Deutsch-Jozsa menyelesaikannya. Demi kejelasan, mari kita sebut Circuit kuantum dari atas, yang tidak mencakup langkah pemrosesan klasik berupa komputasi OR, sebagai Circuit Deutsch-Jozsa.
Analisis algoritmaβ
Untuk menganalisis bagaimana Circuit Deutsch-Jozsa bekerja untuk fungsi yang memenuhi janji untuk masalah Bernstein-Vazirani, kita akan mulai dengan pengamatan singkat. Menggunakan produk titik biner, kita dapat secara alternatif mendeskripsikan aksi dari Gate Hadamard pada keadaan basis standar dari Qubit sebagai berikut.
Mirip dengan yang kita lihat ketika menganalisis algoritma Deutsch, ini karena nilai untuk bilangan bulat apa pun hanya bergantung pada apakah genap atau ganjil.
Beralih ke Circuit Deutsch-Jozsa, setelah lapisan pertama Gate Hadamard dilakukan, keadaan Qubit adalah
Gate query kemudian dilakukan, yang (melalui fenomena phase kickback) mengubah keadaan menjadi
Menggunakan rumus kita untuk aksi dari lapisan Gate Hadamard, kita melihat bahwa lapisan kedua Gate Hadamard kemudian mengubah keadaan ini menjadi
Sekarang kita dapat membuat beberapa penyederhanaan, dalam eksponen di dalam jumlah. Kita dijanjikan bahwa untuk suatu string jadi kita dapat mengekspresikan keadaan sebagai
Karena dan adalah nilai biner, kita dapat mengganti penjumlahan dengan eksklusif-OR β kembali karena satu-satunya hal yang penting untuk bilangan bulat dalam eksponen adalah apakah itu genap atau ganjil. Memanfaatkan simetri produk titik biner, kita mendapatkan ekspresi berikut untuk keadaan:
(Tanda kurung telah ditambahkan untuk kejelasan, meskipun sebenarnya tidak diperlukan karena konvensinya adalah memperlakukan produk titik biner sebagai memiliki prioritas lebih tinggi dari eksklusif-OR.)
Pada titik ini kita akan memanfaatkan rumus berikut.
Kita dapat memperoleh rumus ini melalui rumus serupa untuk bit,
bersama dengan ekspansi produk titik biner dan eksklusif-OR bitwise:
Ini memungkinkan kita untuk mengekspresikan keadaan Circuit tepat sebelum pengukuran seperti ini:
Langkah terakhir adalah memanfaatkan satu rumus lagi, yang berlaku untuk setiap string biner
Di sini kita menggunakan notasi sederhana untuk string yang akan kita gunakan beberapa kali lagi dalam pelajaran ini: adalah string semua-nol dengan panjang
Cara sederhana untuk menunjukkan bahwa rumus ini berlaku adalah dengan mempertimbangkan dua kasus secara terpisah. Jika maka untuk setiap string sehingga nilai setiap suku dalam jumlah adalah dan kita mendapatkan dengan menjumlahkan dan membagi dengan Di sisi lain, jika salah satu bit dari sama dengan maka produk titik biner sama dengan untuk tepat setengah dari kemungkinan pilihan dan untuk setengah lainnya β karena nilai produk titik biner berbalik (dari ke atau dari ke ) jika kita membalik bit apa pun dari di posisi di mana memiliki
Jika kita sekarang menerapkan rumus ini untuk menyederhanakan keadaan Circuit sebelum pengukuran, kita mendapatkan
karena jika dan hanya jika Dengan demikian, pengukuran mengungkapkan tepat string yang kita cari.
Kesulitan klasikβ
Sementara Circuit Deutsch-Jozsa menyelesaikan masalah Bernstein-Vazirani dengan satu query, algoritma query klasik mana pun harus membuat setidaknya query untuk menyelesaikan masalah ini.
Hal ini dapat dibuktikan melalui argumen yang disebut information theoretic, yang sangat sederhana dalam kasus ini. Setiap query klasik mengungkapkan satu bit informasi tentang solusi, dan ada bit informasi yang perlu diungkap β sehingga setidaknya query diperlukan.
Sebenarnya, memang mungkin untuk menyelesaikan masalah Bernstein-Vazirani secara klasik dengan melakukan query fungsi pada masing-masing dari string yang memiliki satu di setiap posisi yang mungkin, dan untuk semua bit lainnya, yang mengungkapkan bit-bit dari satu per satu. Oleh karena itu, keuntungan kuantum dibandingkan algoritma klasik untuk masalah ini adalah query versus query.
Bernstein-Vazirani dengan Qiskitβ
Kita sudah mengimplementasikan Circuit Deutsch-Jozsa di atas, dan di sini kita akan menggunakannya untuk menyelesaikan masalah Bernstein-Vazirani. Pertama kita akan mendefinisikan fungsi yang mengimplementasikan Gate query untuk masalah Bernstein-Vazirani untuk string biner apa pun.
def bv_query(s):
# Create a quantum circuit implementing a query gate for the
# Bernstein-Vazirani problem.
qc = QuantumCircuit(len(s) + 1)
for index, bit in enumerate(reversed(s)):
if bit == "1":
qc.cx(index, len(s))
return qc
display(bv_query("1011").draw(output="mpl"))
Sekarang kita dapat membuat fungsi yang menjalankan Circuit Deutsch-Jozsa pada fungsi tersebut, menggunakan fungsi compile_circuit yang telah didefinisikan sebelumnya.
def bv_algorithm(function: QuantumCircuit):
qc = compile_circuit(function)
result = AerSimulator().run(qc, shots=1, memory=True).result()
return result.get_memory()[0]
display(bv_algorithm(bv_query("1011")))
'1011'
Catatan tentang nomenklaturβ
Dalam konteks masalah Bernstein-Vazirani, umum bahwa algoritma Deutsch-Jozsa disebut sebagai "algoritma Bernstein-Vazirani." Ini sedikit menyesatkan, karena algoritmanya adalah algoritma Deutsch-Jozsa, seperti yang sangat jelas dikatakan oleh Bernstein dan Vazirani dalam karya mereka.
Yang Bernstein dan Vazirani lakukan setelah menunjukkan bahwa algoritma Deutsch-Jozsa menyelesaikan masalah Bernstein-Vazirani (seperti yang dinyatakan di atas) adalah mendefinisikan masalah yang jauh lebih rumit, yang dikenal sebagai masalah recursive Fourier sampling. Ini adalah masalah yang sangat dibuat-buat di mana solusi untuk instance yang berbeda dari masalah tersebut secara efektif membuka level baru dari masalah yang disusun dalam struktur seperti pohon. Masalah Bernstein-Vazirani pada dasarnya hanyalah kasus dasar dari masalah yang lebih rumit ini.
Masalah recursive Fourier sampling adalah contoh pertama yang diketahui dari masalah query di mana algoritma kuantum memiliki keuntungan yang disebut super-polinomial atas algoritma probabilistik, sehingga melampaui keuntungan kuantum dibandingkan klasik yang ditawarkan oleh algoritma Deutsch-Jozsa. Secara intuitif, versi rekursif dari masalah ini memperkuat keuntungan versus dari algoritma kuantum menjadi sesuatu yang jauh lebih besar.
Aspek paling menantang dari analisis matematika yang menetapkan keuntungan ini adalah menunjukkan bahwa algoritma query klasik tidak dapat menyelesaikan masalah tanpa membuat banyak query. Ini sangat khas; untuk banyak masalah bisa sangat sulit untuk mengecualikan pendekatan klasik yang kreatif yang menyelesaikannya secara efisien.
Masalah Simon, dan algoritma untuk itu yang dijelaskan di bagian berikutnya, memang memberikan contoh yang jauh lebih sederhana dari keuntungan super-polinomial (dan, sebenarnya, eksponensial) kuantum dibandingkan algoritma klasik, dan karena alasan ini masalah recursive Fourier sampling lebih jarang dibahas. Namun demikian, ini adalah masalah komputasi yang menarik dengan sendirinya.