Algoritma Deutsch
Algoritma Deutsch menyelesaikan masalah pariti untuk kes khas di mana Dalam konteks pengkomputeran kuantum, masalah ini kadangkala dirujuk sebagai masalah Deutsch, dan kita akan menggunakan tatanomenklatur itu dalam pelajaran ini.
Untuk lebih tepat, input diwakili oleh fungsi dari satu bit ke satu bit. Terdapat empat fungsi sedemikian:
Fungsi pertama dan terakhir adalah malar manakala dua yang di tengah adalah seimbang, bermakna dua nilai output yang mungkin bagi fungsi tersebut muncul dengan bilangan yang sama apabila kita mengambil semua input. Masalah Deutsch adalah untuk menentukan kategori mana fungsi input tersebut tergolong: malar atau seimbang.
Jika kita melihat fungsi input dalam masalah Deutsch sebagai mewakili capaian rawak kepada rentetan, kita sedang memikirkan tentang rentetan dua bit:
Apabila dilihat dengan cara ini, masalah Deutsch adalah untuk mengira pariti (atau, secara setara, XOR eksklusif) dua bit tersebut.
Setiap algoritma pertanyaan klasik yang menyelesaikan masalah ini dengan betul mesti bertanya kedua-dua bit: dan Jika kita mengetahui bahawa sebagai contoh, jawapannya masih boleh atau bergantung pada sama ada atau masing-masing. Setiap kes lain adalah serupa; mengetahui hanya satu daripada dua bit tidak memberikan sebarang maklumat tentang pariti mereka. Jadi, litar Boolean yang diterangkan dalam bahagian sebelumnya adalah yang terbaik yang boleh kita lakukan dari segi bilangan pertanyaan yang diperlukan untuk menyelesaikan masalah ini.
Penerangan litar kuantumβ
Algoritma Deutsch menyelesaikan masalah Deutsch menggunakan satu pertanyaan sahaja, dengan itu memberikan kelebihan yang boleh diukur bagi kuantum berbanding pengiraan klasik. Ini mungkin kelebihan yang sederhana β satu pertanyaan berbanding dua β tetapi kita perlu bermula dari suatu tempat. Kemajuan saintifik kadangkala mempunyai asal-usul yang kelihatan rendah hati.
Berikut adalah litar kuantum yang menerangkan algoritma Deutsch:
Analisisβ
Untuk menganalisis algoritma Deutsch, kita akan meneliti tindakan litar di atas dan mengenal pasti keadaan Qubit pada masa-masa yang dicadangkan oleh rajah ini:
Keadaan awal adalah dan dua operasi Hadamard di sebelah kiri litar mengubah keadaan ini kepada
(Seperti biasa, kita mengikuti konvensyen susunan Qubit Qiskit, yang meletakkan Qubit atas di sebelah kanan dan Qubit bawah di sebelah kiri.) Mungkin terasa tidak intuitif untuk menulis keadaan produk ini sebahagiannya dalam bentuk teragih (meninggalkan keadaan Qubit 1 dalam bentuk faktor), tetapi ini akan menjadikan ungkapan kita kemudian lebih ringkas.
Seterusnya, gerbang dilaksanakan. Mengikut definisi gerbang nilai fungsi untuk keadaan klasik Qubit atas/paling kanan di-XOR ke atas Qubit bawah/paling kiri, yang mengubah kepada keadaan
Kita boleh memudahkan ungkapan ini dengan memerhatikan bahawa formula
berfungsi untuk kedua-dua nilai yang mungkin Secara lebih eksplisit, dua kes tersebut adalah seperti berikut.
Oleh itu, kita boleh menyatakan secara alternatif seperti ini:
Sesuatu yang menarik baru berlaku! Walaupun tindakan gerbang pada keadaan asas standard membiarkan Qubit atas/paling kanan tidak berubah dan meng-XOR nilai fungsi ke atas Qubit bawah/paling kiri, di sini kita melihat bahawa keadaan Qubit atas/paling kanan telah berubah (secara umumnya) manakala keadaan Qubit bawah/paling kiri kekal sama β khususnya berada dalam keadaan sebelum dan selepas gerbang dilaksanakan. Fenomena ini dikenali sebagai tendangan fasa, dan kita akan membincangkannya dengan lebih lanjut tidak lama lagi.
Dengan satu pemudahan terakhir, iaitu mengeluarkan faktor ke luar jumlah, kita memperoleh ungkapan keadaan ini:
Perhatikan bahawa dalam ungkapan ini, kita mempunyai dalam eksponen berbanding yang mungkin kita jangkakan dari sudut pandang aljabar semata-mata, tetapi kita mendapat hasil yang sama dalam kedua-dua cara. Ini kerana nilai untuk sebarang integer hanya bergantung pada sama ada adalah genap atau ganjil.
Menggunakan gerbang Hadamard terakhir pada Qubit atas meninggalkan kita dengan keadaan
yang membawa kepada hasil yang betul dengan kebarangkalian apabila Qubit kanan/paling atas diukur.
Catatan lanjut tentang tendangan fasaβ
Sebelum meneruskan, mari kita lihat analisis di atas dari sudut yang sedikit berbeza yang mungkin dapat menjelaskan fenomena tendangan fasa.
Pertama, perhatikan bahawa formula berikut berfungsi untuk semua pilihan bit
Ini boleh disahkan dengan menyemaknya untuk dua nilai dan yang mungkin:
Menggunakan formula ini, kita melihat bahawa
untuk setiap pilihan bit Kerana formula ini benar untuk dan kita melihat melalui kelinearan bahawa
untuk semua vektor keadaan Qubit dan oleh itu
Kunci yang menjadikan ini berfungsi ialah Dalam istilah matematik, vektor adalah vektor eigen bagi matriks yang mempunyai nilai eigen
Kita akan membincangkan vektor eigen dan nilai eigen dengan lebih terperinci dalam pelajaran akan datang tentang Anggaran fasa dan pemfaktoran, di mana fenomena tendangan fasa digeneralisasikan kepada operasi uniter lain.
Dengan mengingat bahawa skalar bergerak bebas melalui hasil tensor, kita menemui cara alternatif untuk memikirkan bagaimana operasi mengubah kepada dalam analisis di atas:
Pelaksanaan dalam Qiskitβ
Sekarang mari kita lihat bagaimana kita boleh melaksanakan algoritma Deutsch dalam Qiskit. Kita akan bermula dengan semakan versi dan kemudian melakukan import yang diperlukan khusus untuk pelaksanaan ini. Untuk pelaksanaan algoritma lain yang berikut, kita akan melakukan import yang diperlukan secara berasingan demi modulariti yang lebih baik.
# 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 litar kuantum yang melaksanakan gerbang pertanyaan untuk salah satu daripada empat fungsi atau dari satu bit ke satu bit yang diterangkan sebelumnya. Seperti yang telah kita sebutkan, pelaksanaan gerbang pertanyaan sebenarnya bukan sebahagian daripada algoritma Deutsch itu sendiri; di sini kita pada asasnya hanya menunjukkan satu cara untuk menyediakan input, dalam bentuk pelaksanaan litar gerbang pertanyaan.
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 boleh melihat rupa setiap litar menggunakan kaedah draw. Berikut adalah litar untuk fungsi
display(deutsch_function(3).draw(output="mpl"))
Seterusnya kita akan mencipta litar kuantum sebenar untuk algoritma Deutsch, menggantikan gerbang pertanyaan dengan pelaksanaan litar kuantum yang diberikan sebagai argumen. Tidak lama lagi kita akan memasukkan salah satu daripada empat litar yang ditakrifkan oleh fungsi deutsch_function yang kita takrifkan sebelumnya.
Penghalang disertakan untuk menunjukkan pemisahan visual antara pelaksanaan gerbang pertanyaan dan bahagian lain litar.
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 boleh melihat rupa litar menggunakan kaedah draw.
display(compile_circuit(deutsch_function(3)).draw(output="mpl"))
Akhirnya, kita akan mencipta fungsi yang menjalankan litar yang ditakrifkan sebelumnya sekali dan mengeluarkan hasil yang sesuai: "malar" atau "seimbang."
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 kini boleh menjalankan algoritma Deutsch pada mana-mana satu daripada empat fungsi yang ditakrifkan di atas.
f = deutsch_function(3)
display(deutsch_algorithm(f))
'balanced'