Langkau ke kandungan utama

Algoritma Deutsch

Algoritma Deutsch menyelesaikan masalah pariti untuk kes khas di mana n=1.n = 1. 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 f:Ξ£β†’Ξ£f:\Sigma \rightarrow \Sigma dari satu bit ke satu bit. Terdapat empat fungsi sedemikian:

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 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.

Masalah Deutsch

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

Jika kita melihat fungsi input ff dalam masalah Deutsch sebagai mewakili capaian rawak kepada rentetan, kita sedang memikirkan tentang rentetan 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}

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: f(0)f(0) dan f(1).f(1). Jika kita mengetahui bahawa f(1)=1,f(1) = 1, sebagai contoh, jawapannya masih boleh 00 atau 1,1, bergantung pada sama ada f(0)=1f(0) = 1 atau f(0)=0,f(0) = 0, 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:

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

Keadaan awal adalah ∣1⟩∣0⟩,\vert 1\rangle \vert 0 \rangle, dan dua operasi Hadamard di sebelah kiri litar mengubah keadaan ini kepada

βˆ£Ο€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 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 UfU_f dilaksanakan. Mengikut definisi gerbang Uf,U_f, nilai fungsi ff untuk keadaan klasik Qubit atas/paling kanan di-XOR ke atas Qubit bawah/paling kiri, yang mengubah βˆ£Ο€1⟩\vert \pi_1\rangle kepada 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 boleh memudahkan ungkapan ini dengan memerhatikan bahawa formula

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

berfungsi untuk kedua-dua nilai yang mungkin a∈Σ.a\in\Sigma. Secara lebih eksplisit, dua kes tersebut adalah seperti 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}

Oleh itu, kita boleh menyatakan βˆ£Ο€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 berlaku! Walaupun tindakan gerbang UfU_f 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 βˆ£βˆ’βŸ©\vert - \rangle sebelum dan selepas gerbang UfU_f dilaksanakan. Fenomena ini dikenali sebagai tendangan fasa, dan kita akan membincangkannya dengan lebih lanjut tidak lama lagi.

Dengan satu pemudahan terakhir, iaitu mengeluarkan faktor (βˆ’1)f(0)(-1)^{f(0)} ke luar jumlah, kita memperoleh ungkapan keadaan βˆ£Ο€2⟩\vert\pi_2\rangle ini:

βˆ£Ο€2⟩=(βˆ’1)f(0)βˆ£βˆ’βŸ©(∣0⟩+(βˆ’1)f(0)βŠ•f(1)∣1⟩2)={(βˆ’1)f(0)βˆ£βˆ’βŸ©βˆ£+⟩jikaΒ f(0)βŠ•f(1)=0(βˆ’1)f(0)βˆ£βˆ’βŸ©βˆ£βˆ’βŸ©jikaΒ 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{jika $f(0) \oplus f(1) = 0$}\\[1mm] (-1)^{f(0)} \vert - \rangle \vert - \rangle & \text{jika $f(0) \oplus f(1) = 1$}. \end{cases} \end{aligned}

Perhatikan bahawa dalam ungkapan ini, kita mempunyai f(0)βŠ•f(1)f(0) \oplus f(1) dalam eksponen βˆ’1-1 berbanding f(1)βˆ’f(0),f(1) - f(0), yang mungkin kita jangkakan dari sudut pandang aljabar semata-mata, tetapi kita mendapat hasil yang sama dalam kedua-dua cara. Ini kerana nilai (βˆ’1)k(-1)^k untuk sebarang integer kk hanya bergantung pada sama ada kk adalah genap atau ganjil.

Menggunakan gerbang Hadamard terakhir pada Qubit atas meninggalkan kita dengan keadaan

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

yang membawa kepada hasil yang betul dengan kebarangkalian 11 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 b,c∈Σ.b,c\in\Sigma.

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

Ini boleh disahkan dengan menyemaknya untuk dua nilai c=0c = 0 dan c=1c = 1 yang mungkin:

∣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 formula ini, kita melihat bahawa

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. Kerana formula ini benar untuk b=0b=0 dan b=1,b=1, kita melihat melalui kelinearan bahawa

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 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 menjadikan ini berfungsi ialah Xβˆ£βˆ’βŸ©=βˆ’βˆ£βˆ’βŸ©.X\vert - \rangle = - \vert - \rangle. Dalam istilah matematik, vektor βˆ£βˆ’βŸ©\vert - \rangle adalah vektor eigen bagi matriks XX yang mempunyai nilai eigen βˆ’1.-1.

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 UfU_f mengubah βˆ£Ο€1⟩\vert \pi_1\rangle kepada βˆ£Ο€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}

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

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

Output of the previous code cell

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

Output of the previous code cell

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'
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. 26 Mac 2026