Algoritma Grover: di mana daftarnya?


15

Algoritma Grover digunakan, antara lain, untuk mencari item dalam daftar item yang tidak terurut panjangnya . Meskipun ada banyak pertanyaan di sini mengenai topik ini, saya masih merindukan intinya.y[x0,x1,...,xn1]n

Mencari dalam daftar, cara klasik

Biasanya, saya akan merancang fungsi pencarian dengan cara ini Jadi saya memberikan daftar dan item yang diinginkan sebagai input, dan saya menerima posisi dari item dalam daftar sebagai keluaran. Saya pikir saya sudah mengerti bahwa informasi tentang \ mathbf {y} tertanam dalam algoritma melalui gerbang oracle O , jadi fungsi kita menjadi \ mathrm {search} _ \ mathbf {y} ([\ mathbf {x} _1, \ mathbf {x} _2, ..., \ mathbf {x} _n]) = i \ in \ mathbb {N} \ quad \ text {sedemikian rupa} \ mathbf {x} _i = \ mathbf {y} Mari kita buat contoh praktis. Pertimbangkan mencari kartu as sekop 1 \ sekop

search([x0,x1,...,xn1],y)=iNsuch that xi=y
yO
searchy([x1,x2,...,xn])=iNsuch that xi=y
1dalam urutan 8 kartu dari kartu 52 kartu standar :

dek dikocok

Daftar panjang adalah \ mathbf {x} _7 = 6 \ Clubsuit] .8[x0=J, x1=10, x2=4, x3=Q, x4=3, x5=1, x6=6, x7=6]

Elemen yang dicari adalah x5 . Saya harus mendapatkan search(cards)=5 . Setiap kartu dapat dikodekan dengan log252=6 bit, daftar ini memiliki 8 elemen sehingga kita membutuhkan 6×8=48 bit untuk menyandikan daftar. Dalam hal ini, oracle O akan mengimplementasikan fungsi:

f(x)={1,x=10,otherwise

Namun, input dari algoritma Grover bukanlah keadaan 48 qubit.

(NB: Gambar deck dikocok diambil dari sini )

Grover dan oracle-nya

Beberapa sumber (mis. Di sini - dijelaskan secara grafis) mengatakan bahwa input dari algoritma berbeda: input adalah keadaan yang diambil dari ruang pencarian mana adalah jumlah elemen dari daftar. Setiap angka sesuai dengan posisi elemen dalam daftar.S={0,1,2,...,N}={0,1,2,...,7}N

Input sekarang menjadi vektor qubit , yang harus menjadi superposisi semua item di ruang pencarian .search()log28=3|ψS

Kita tahu

  • |03qubits=|000 sesuai dengan ;J
  • |13qubits=|001 sesuai dengan ;10
  • |23qubits=|010 sesuai dengan ;4
  • |53qubits=|101 sesuai dengan yang merupakan elemen yang diinginkan;1
  • dan seterusnya...

Dalam hal ini kita memiliki Tetapi dalam kasus ini, oracle kita harus mengimplementasikan fungsi

search(|ψ)=|53qubits
f(|ψ)={1,|ψ=|53qubits0,otherwise

Membangun oracle mengharuskan kita untuk mengetahui bahwa ada di posisi 5. Apa gunanya menjalankan algoritma jika kita sudah mencari elemen untuk membangun oracle?


Saya juga mengalami kesulitan memahami keuntungan dari algoritma Grover. Misalkan saya memiliki N item dalam daftar. Pada setiap panggilan ke Oracle, apakah ia mengevaluasi semua kemungkinan N? Bahkan jika evaluasi sangat cepat tetapi jika kita masih perlu mengulangi semua konfigurasi, maka kompleksitas evaluasi Oracle adalah O (N). Jadi algoritma Grover sepertinya tidak lebih cepat daripada pencarian bodoh. Apakah ini benar?
Sanparith Marukatat

@SparparMarukatat Itu tidak benar. Item daftar Anda adalah ketentuan superposisi negara yang terlibat dalam pencarian. Ketika Oracle beroperasi pada kondisi ini, ia dianggap sebagai satu operasi. Kemampuan Oracle untuk menandai istilah superposisi yang Anda cari adalah bagian mendasar dari wawasan Grover. Untuk memahami algoritme Grover, saya sarankan Anda terlebih dahulu memahami bagaimana penandaan status yang diinginkan terjadi. Setelah itu, pastikan untuk memahami peran negara di Oracle. |
R. Chopin

Jika Anda memahaminya, maka Anda harus mempelajari operator yang mampu meningkatkan amplitudo dari istilah yang diinginkan dalam superposisi sementara pada saat yang sama mengurangi amplitudo dari ketentuan superposisi yang tidak diinginkan. Bagi saya cara termudah untuk mendekati Grover adalah dengan melihat operator invers-tentang-rata. (Beberapa orang mengambil tampilan geometris, tetapi saya tidak menemukannya dengan jelas.)
R. Chopin

Jawaban:


10

Jika Anda memiliki 8 item dalam daftar (seperti pada contoh kartu Anda), maka input oracle adalah 3 (qu) bit. Jumlah kartu di dek (52) tidak relevan, Anda hanya perlu 3 bit untuk mengkodekan 8 kartu.

Anda dapat berpikir bahwa 3 bit mengkodekan posisi dalam daftar kartu yang Anda cari; maka Anda tidak tahu posisinya, tetapi oracle tahu. Jadi jika Anda mencari kartu as sekop, maka sang oracle tahu bahwa kartu as sekop adalah kartu ke-6 (atau penghitungan ke-5 dari nol) dan mengimplementasikan fungsi

f(x)={1,if x = 5, or binary '101'0,otherwise

PS: Lebih baik memikirkan algoritma Grover secara berbeda: Anda memiliki oracle yang mengimplementasikan fungsi boolean yang menghasilkan untuk kombinasi tunggal dari bit input, jika tidak menghasilkan nol, dan tugas Anda adalah menemukan kombinasi tersebut. Masalahnya memiliki kompleksitas yang sama dengan pencarian dalam daftar atau basis data yang tidak disortir, itulah sebabnya mengapa algoritma Grover biasanya digambarkan sebagai pencarian dalam database yang tidak disortir. Tetapi menerapkan algoritma untuk pencarian basis data dunia nyata memang menimbulkan pertanyaan yang berada di luar algoritma itu sendiri. Algoritma Grover hanya mencari apa yang diketahui oracle.1


Ya maaf, bahwa 6 adalah dari suntingan sebelumnya
incud

2
Terima kasih atas jawaban Anda. Saya memperbaiki kesalahan penulisan. Apa gunanya mengeksekusi algoritma jika untuk membangun oracle saya perlu mengetahui posisi elemen yang dicari?
incud

1
@incud Memang itu tidak masuk akal. Saya sudah memperbarui jawabannya.
kludg

" Algoritma Grover hanya mencari apa yang diketahui oracle ": belum tentu. Oracle mungkin memeriksa hanya beberapa properti spesifik dari input, sehingga hasil yang didapat pada akhirnya berisi lebih banyak informasi daripada yang dikodekan dalam oracle itsef. Contoh khas sedang mencari di buku telepon. Peramal "meminta" untuk catatan yang dilampirkan pada nama tertentu, tetapi begitu catatan yang benar ditemukan, orang juga mendapatkan informasi tambahan dari nomor telepon yang terlampir pada catatan itu, yang tidak dikodekan sama sekali di oracle
glS

4

Meskipun mungkin lebih mudah bagi kita untuk berpikir tentang fungsi oracle karena telah menghitung semua nilai-nilai ini, itu bukan apa yang dilakukannya. Dalam kasus yang Anda jelaskan, oracle memiliki 8 input yang mungkin (yaitu dikodekan dalam 3 (qu) bit), dan oracle melakukan semua perhitungan yang Anda butuhkan dengan cepat . Jadi, saat Anda mencoba mengevaluasi oracle untuk beberapa nilai , oracle mencari (dalam hal ini) kartu yang bernilai xxxsesuai dengan, dan kemudian memeriksa apakah kartu itu adalah kartu yang ditandai. Idenya adalah bahwa setiap kali Anda memanggil oracle, itu melewati proses itu sekali. Secara keseluruhan, Anda mengevaluasi fungsi beberapa kali sama dengan berapa kali Anda memanggil oracle. Tujuan dari setiap algoritma pencarian adalah untuk memanggil oracle itu beberapa kali mungkin.

Dalam hal ini terdengar sedikit melingkar (diberi input , temukan kartu mana yang sesuai dengan), ingatlah bahwa tabel pencarian Anda untuk x sesuai dengan kartu apa yang dapat dipesan yang merupakan pertanyaan pencarian yang berbeda, lebih sederhana, dan lebih cepat.xx

Perbedaan utama dalam contoh Anda dibandingkan dengan skenario penggunaan yang lebih realistis adalah:

  • Ruang pencarian biasanya besar. Tidak ada prospek realistis untuk mengkomputasi semua nilai. Memang, itulah tepatnya yang kami coba hindari.

  • Biasanya, kita tidak benar-benar mengatakan 'menemukan kartu as sekop'. Sebaliknya, ada yang non-sepele untuk dievaluasi untuk menguji apakah x adalah item yang 'ditandai' atau tidak. Fakta bahwa oracle dapat memakan waktu yang cukup lama untuk mengevaluasi, bahkan untuk satu entri, adalah apa yang membuat oracle menjadi bagian yang mahal untuk diimplementasikan (dan semua gerbang lainnya diberikan secara gratis) dan mengapa Anda perlu meminimalkan jumlah panggilan .f(x)x

Jadi, sungguh, cara pencarian klasik akan mengatasi masalah Anda adalah: pilih secara acak. Evaluasi y = f ( x ) . Jika y = 1 , kembalikan x , jika tidak ulangi. Sementara efek bersih dari f ( x ) adalah 'adalah input x 0 , entri yang ditandai?', Itu bukan perhitungan aktual yang dilakukannya.xy=f(x)y=1xf(x)x0


2

Pertanyaannya adalah akhirnya: "Apa gunanya mengeksekusi algoritma jika kita sudah mencari elemen untuk membangun oracle?"

Sementara seseorang membuat ulang oracle, itu mungkin bukan orang yang menggunakan oracle.

ukuran daftar

Kami bertanya pada oracle: apa jawaban yang sudah dimilikinya untuk pertanyaan yang sudah dimilikinya? Bahkan Mateus dan Omar akan menanyakan "oracle-for-a-alphabet-symbol" selama runtime, apa posisi simbol-simbolnya dalam string yang telah dikompilasi? Oracle akan memberikan jawaban atas pertanyaan kami setelah hanya satu kali konsultasi, tetapi dalam cerita ini, tidak bisa misalnya menuliskan jawaban sebagai string biner dan mengirimkannya kepada kami melalui saluran komunikasi klasik. Itu akan menyembunyikan jawabannya dalam superposisi bagi kita untuk menariknya keluar.

Saya membiarkan angan-angan atau kiasan melarikan diri dalam bagian berikutnya: kita tidak cukup mendengar jawaban pertama kali, dan kita harus meminta oracle untuk mengulangi jawaban yang sama berulang-ulang sampai kita yakin apa yang dikatakan oracle, kecuali kita mulai berhalusinasi dari kesalahan informasi dalam proses difusi jika kita bertanya terlalu banyak.


2

Mengingat oracle yang Anda berikan, pencarian itu memang tidak ada gunanya. Namun, oracle itu melewatkan titik algoritma Grover karena mencari kartu di setumpuk kartu bukanlah pencarian yang tidak terstruktur karena, seperti yang Anda nyatakan, Anda sudah mengetahui urutannya. Ergo, pencarian Anda terstruktur. Alasan oracle ini digunakan adalah karena itu menunjukkan bagaimana Grover dapat diterapkan tanpa harus membahas oracle yang akan membuat Grover berguna karena oracle tersebut akan lebih rumit daripada berharga. Oleh karena itu, ramalan yang lebih baik untuk menunjukkan manfaat Grover mungkin seperti:

f(x)={1,x[0,,3]+x[4,,7]=10100,otherwise

Apa yang disiratkan oleh oracle ini adalah bahwa Anda memiliki pencarian 8-qubit di mana Anda mengambil empat qubit pertama dan menambahkannya ke empat qubit kedua dan membalikkan M jika penambahan menghasilkan 10 (1010 dalam biner). Perbedaan antara oracle ini dan yang Anda berikan adalah bahwa oracle ini menguji sebuah pola (apakah operan menambah 10) sedangkan Anda menguji kesetaraan (adalah indeks ini 5). Peramal ini jauh lebih sulit untuk dibangun tetapi memanfaatkan kekuatan sebenarnya dari Grover, yang pada dasarnya adalah pencarian dengan kekuatan besar di mana oracle Anda menentukan ruang pencarian.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.