Lewati ke konten utama

Algoritma Deutsch

Algoritma Deutsch memecahkan masalah paritas untuk kasus khusus bahwa n=1.n = 1. 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 f:Ξ£β†’Ξ£f:\Sigma \rightarrow \Sigma dari satu bit ke satu bit. Ada empat fungsi seperti itu:

af1(a)0010af2(a)0011af3(a)0110af4(a)0111\rule[-10mm]{0mm}{10mm} \begin{array}{c|c} a & f_1(a)\\ \hline 0 & 0\\ 1 & 0 \end{array} \qquad \begin{array}{c|c} a & f_2(a)\\ \hline 0 & 0\\ 1 & 1 \end{array} \qquad \begin{array}{c|c} a & f_3(a)\\ \hline 0 & 1\\ 1 & 0 \end{array} \qquad \begin{array}{c|c} a & f_4(a)\\ \hline 0 & 1\\ 1 & 1 \end{array}

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.

Masalah Deutsch

Input: fungsi f:{0,1}β†’{0,1}f:\{0,1\}\rightarrow\{0,1\}
Output: 00 jika ff konstan, 11 jika ff seimbang

Jika kita melihat fungsi input ff dalam masalah Deutsch sebagai mewakili akses acak ke sebuah string, kita sedang memikirkan string dua-bit: f(0)f(1).f(0)f(1).

functionstringf100f201f310f411\begin{array}{cc} \mathsf{function} & \mathsf{string}\\ \hline f_1 & 00 \\ f_2 & 01 \\ f_3 & 10 \\ f_4 & 11 \end{array}

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: f(0)f(0) dan f(1).f(1). Jika kita mengetahui bahwa f(1)=1,f(1) = 1, misalnya, jawabannya masih bisa 00 atau 1,1, tergantung apakah f(0)=1f(0) = 1 atau f(0)=0,f(0) = 0, 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:

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 selama algoritma Deutsch

Keadaan awalnya adalah ∣1⟩∣0⟩,\vert 1\rangle \vert 0 \rangle, dan dua operasi Hadamard di sisi kiri sirkuit mengubah keadaan ini menjadi

βˆ£Ο€1⟩=βˆ£βˆ’βŸ©βˆ£+⟩=12(∣0βŸ©βˆ’βˆ£1⟩)∣0⟩+12(∣0βŸ©βˆ’βˆ£1⟩)∣1⟩.\vert \pi_1 \rangle = \vert - \rangle \vert + \rangle = \frac{1}{2} \bigl( \vert 0\rangle - \vert 1\rangle \bigr) \vert 0\rangle + \frac{1}{2} \bigl( \vert 0\rangle - \vert 1\rangle \bigr) \vert 1\rangle.

(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 UfU_f dilakukan. Sesuai definisi gate UfU_f, nilai fungsi ff untuk keadaan klasik qubit atas/paling kanan di-XOR ke qubit bawah/paling kiri, yang mengubah βˆ£Ο€1⟩\vert \pi_1\rangle menjadi keadaan

βˆ£Ο€2⟩=12(∣0βŠ•f(0)βŸ©βˆ’βˆ£1βŠ•f(0)⟩)∣0⟩+12(∣0βŠ•f(1)βŸ©βˆ’βˆ£1βŠ•f(1)⟩)∣1⟩.\vert \pi_2 \rangle = \frac{1}{2} \bigl( \vert 0 \oplus f(0) \rangle - \vert 1 \oplus f(0) \rangle \bigr) \vert 0 \rangle + \frac{1}{2} \bigl( \vert 0 \oplus f(1) \rangle - \vert 1 \oplus f(1) \rangle \bigr) \vert 1 \rangle.

Kita bisa menyederhanakan ekspresi ini dengan mengamati bahwa rumus

∣0βŠ•aβŸ©βˆ’βˆ£1βŠ•a⟩=(βˆ’1)a(∣0βŸ©βˆ’βˆ£1⟩)\vert 0 \oplus a\rangle - \vert 1 \oplus a\rangle = (-1)^a \bigl( \vert 0\rangle - \vert 1\rangle \bigr)

berlaku untuk kedua nilai yang mungkin a∈Σ.a\in\Sigma. Lebih eksplisit, dua kasusnya adalah sebagai berikut.

∣0βŠ•0βŸ©βˆ’βˆ£1βŠ•0⟩=∣0βŸ©βˆ’βˆ£1⟩=(βˆ’1)0(∣0βŸ©βˆ’βˆ£1⟩)∣0βŠ•1βŸ©βˆ’βˆ£1βŠ•1⟩=∣1βŸ©βˆ’βˆ£0⟩=(βˆ’1)1(∣0βŸ©βˆ’βˆ£1⟩)\begin{aligned} \vert 0 \oplus 0\rangle - \vert 1 \oplus 0\rangle & = \vert 0 \rangle - \vert 1 \rangle = (-1)^0 \bigl( \vert 0\rangle - \vert 1\rangle \bigr)\\ \vert 0 \oplus 1\rangle - \vert 1 \oplus 1\rangle & = \vert 1 \rangle - \vert 0\rangle = (-1)^1 \bigl( \vert 0\rangle - \vert 1\rangle \bigr) \end{aligned}

Dengan demikian, kita bisa mengekspresikan βˆ£Ο€2⟩\vert\pi_2\rangle secara alternatif seperti ini:

βˆ£Ο€2⟩=12(βˆ’1)f(0)(∣0βŸ©βˆ’βˆ£1⟩)∣0⟩+12(βˆ’1)f(1)(∣0βŸ©βˆ’βˆ£1⟩)∣1⟩=βˆ£βˆ’βŸ©((βˆ’1)f(0)∣0⟩+(βˆ’1)f(1)∣1⟩2).\begin{aligned} \vert\pi_2\rangle & = \frac{1}{2} (-1)^{f(0)} \bigl( \vert 0 \rangle - \vert 1 \rangle \bigr) \vert 0 \rangle + \frac{1}{2} (-1)^{f(1)} \bigl( \vert 0 \rangle - \vert 1 \rangle \bigr) \vert 1 \rangle \\ & = \vert - \rangle \biggl( \frac{(-1)^{f(0)} \vert 0\rangle + (-1)^{f(1)} \vert 1\rangle}{\sqrt{2}}\biggr). \end{aligned}

Sesuatu yang menarik baru saja terjadi! Meskipun aksi gate UfU_f 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 βˆ£βˆ’βŸ©\vert - \rangle sebelum dan sesudah gate UfU_f dilakukan. Fenomena ini dikenal sebagai phase kickback, dan kita akan membahasnya lebih lanjut segera.

Dengan satu penyederhanaan akhir, yaitu menarik faktor (βˆ’1)f(0)(-1)^{f(0)} ke luar dari jumlahan, kita mendapatkan ekspresi keadaan βˆ£Ο€2⟩\vert\pi_2\rangle ini:

βˆ£Ο€2⟩=(βˆ’1)f(0)βˆ£βˆ’βŸ©(∣0⟩+(βˆ’1)f(0)βŠ•f(1)∣1⟩2)={(βˆ’1)f(0)βˆ£βˆ’βŸ©βˆ£+⟩ifΒ f(0)βŠ•f(1)=0(βˆ’1)f(0)βˆ£βˆ’βŸ©βˆ£βˆ’βŸ©ifΒ f(0)βŠ•f(1)=1.\begin{aligned} \vert\pi_2\rangle & = (-1)^{f(0)} \vert - \rangle \biggl( \frac{\vert 0\rangle + (-1)^{f(0) \oplus f(1)} \vert 1\rangle}{\sqrt{2}}\biggr) \\ & = \begin{cases} (-1)^{f(0)} \vert - \rangle \vert + \rangle & \text{if $f(0) \oplus f(1) = 0$}\\[1mm] (-1)^{f(0)} \vert - \rangle \vert - \rangle & \text{if $f(0) \oplus f(1) = 1$}. \end{cases} \end{aligned}

Perhatikan bahwa dalam ekspresi ini, kita memiliki f(0)βŠ•f(1)f(0) \oplus f(1) di eksponen βˆ’1-1 bukan f(1)βˆ’f(0),f(1) - f(0), yang mungkin kita harapkan dari sudut pandang aljabar murni, tetapi kita mendapatkan hasil yang sama dengan cara manapun. Ini karena nilai (βˆ’1)k(-1)^k untuk bilangan bulat kk manapun hanya bergantung pada apakah kk genap atau ganjil.

Menerapkan gate Hadamard akhir ke qubit atas meninggalkan kita dengan keadaan

βˆ£Ο€3⟩={(βˆ’1)f(0)βˆ£βˆ’βŸ©βˆ£0⟩ifΒ f(0)βŠ•f(1)=0(βˆ’1)f(0)βˆ£βˆ’βŸ©βˆ£1⟩ifΒ f(0)βŠ•f(1)=1,\vert \pi_3 \rangle = \begin{cases} (-1)^{f(0)} \vert - \rangle \vert 0 \rangle & \text{if $f(0) \oplus f(1) = 0$}\\[1mm] (-1)^{f(0)} \vert - \rangle \vert 1 \rangle & \text{if $f(0) \oplus f(1) = 1$}, \end{cases}

yang mengarah ke hasil yang benar dengan probabilitas 11 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 b,c∈Σ.b,c\in\Sigma.

∣bβŠ•c⟩=Xc∣b⟩\vert b \oplus c\rangle = X^c \vert b \rangle

Ini bisa diverifikasi dengan memeriksa untuk dua nilai yang mungkin c=0c = 0 dan c=1c = 1:

∣bβŠ•0⟩=∣b⟩=I∣b⟩=X0∣b⟩∣bβŠ•1⟩=∣¬b⟩=X∣b⟩=X1∣b⟩.\begin{aligned} \vert b \oplus 0 \rangle & = \vert b\rangle = \mathbb{I} \vert b \rangle = X^0 \vert b \rangle\\ \vert b \oplus 1 \rangle & = \vert \neg b\rangle = X \vert b \rangle = X^1 \vert b \rangle. \end{aligned}

Menggunakan rumus ini, kita melihat bahwa

Uf(∣b⟩∣a⟩)=∣bβŠ•f(a)⟩∣a⟩=(Xf(a)∣b⟩)∣a⟩U_f \bigl(\vert b\rangle \vert a \rangle\bigr) = \vert b \oplus f(a) \rangle \vert a \rangle = \bigl(X^{f(a)}\vert b \rangle\bigr) \vert a \rangle

untuk setiap pilihan bit a,b∈Σ.a,b\in\Sigma. Karena rumus ini benar untuk b=0b=0 dan b=1,b=1, kita lihat dengan linearitas bahwa

Uf(∣ψ⟩∣a⟩)=(Xf(a)∣ψ⟩)∣a⟩U_f \bigl( \vert \psi \rangle \vert a \rangle \bigr) = \bigl(X^{f(a)}\vert \psi \rangle\bigr) \vert a \rangle

untuk semua vektor keadaan qubit ∣ψ⟩,\vert \psi\rangle, dan oleh karena itu

Uf(βˆ£βˆ’βŸ©βˆ£a⟩)=(Xf(a)βˆ£βˆ’βŸ©)∣a⟩=(βˆ’1)f(a)βˆ£βˆ’βŸ©βˆ£a⟩.U_f \bigl( \vert - \rangle \vert a \rangle \bigr) = \bigl(X^{f(a)} \vert - \rangle \bigr) \vert a \rangle = (-1)^{f(a)} \vert - \rangle \vert a \rangle.

Kunci yang membuat ini bekerja adalah bahwa Xβˆ£βˆ’βŸ©=βˆ’βˆ£βˆ’βŸ©.X\vert - \rangle = - \vert - \rangle. Dalam istilah matematis, vektor βˆ£βˆ’βŸ©\vert - \rangle adalah eigenvector dari matriks XX yang memiliki eigenvalue βˆ’1.-1.

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 UfU_f mengubah βˆ£Ο€1⟩\vert \pi_1\rangle menjadi βˆ£Ο€2⟩\vert \pi_2\rangle dalam analisis di atas:

βˆ£Ο€2⟩=Uf(βˆ£βˆ’βŸ©βˆ£+⟩)=12Uf(βˆ£βˆ’βŸ©βˆ£0⟩)+12Uf(βˆ£βˆ’βŸ©βˆ£1⟩)=βˆ£βˆ’βŸ©((βˆ’1)f(0)∣0⟩+(βˆ’1)f(1)∣1⟩2).\begin{aligned} \vert \pi_2 \rangle & = U_f \bigl( \vert - \rangle \vert + \rangle \bigr)\\ & = \frac{1}{\sqrt{2}} U_f \bigl(\vert - \rangle \vert 0\rangle \bigr) + \frac{1}{\sqrt{2}} U_f \bigl(\vert - \rangle \vert 1\rangle \bigr)\\ & = \vert - \rangle \biggl( \frac{(-1)^{f(0)} \vert 0\rangle + (-1)^{f(1)} \vert 1\rangle}{\sqrt{2}}\biggr). \end{aligned}

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 f1,f_1, f2,f_2, f3,f_3, atau f4f_4 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 f3.f_3.

display(deutsch_function(3).draw(output="mpl"))

Output of the previous code cell

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"))

Output of the previous code cell

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'
Source: IBM Quantum docs β€” updated 15 Jan 2026
English version on doQumentation β€” updated 7 Mei 2026
This translation based on the English version of approx. 27 Mar 2026