דלג לתוכן הראשי

אלגוריתם דויטש-ג'וזה

אלגוריתם דויטש עולה על כל האלגוריתמים הקלאסיים עבור בעיית שאילתה, אך היתרון צנוע למדי: שאילתה אחת לעומת שתיים. אלגוריתם דויטש-ג'וזה מרחיב יתרון זה — ולמעשה, ניתן להשתמש בו כדי לפתור כמה בעיות שאילתה שונות.

הנה תיאור Circuit קוונטי של אלגוריתם דויטש-ג'וזה. ייתכן שנדרש גם שלב עיבוד קלאסי נוסף, שאינו מוצג באיור, בהתאם לבעיה הספציפית הנפתרת.

Deutsch-Jozsa algorithm

כמובן, עדיין לא דנו בבעיות שאלגוריתם זה פותר; הדבר נעשה בשני הסעיפים הבאים.

בעיית דויטש-ג'וזה

נתחיל עם בעיית השאילתה שאלגוריתם דויטש-ג'וזה נועד לפתור במקורו, המוכרת בשם בעיית דויטש-ג'וזה.

פונקציית הקלט לבעיה זו היא מהצורה f:ΣnΣf:\Sigma^n \rightarrow \Sigma עבור מספר שלם חיובי שרירותי n.n. כמו בבעיית דויטש, המשימה היא להוציא 00 אם ff היא קבועה ו-11 אם ff היא מאוזנת, כלומר מספר מחרוזות הקלט שעליהן הפונקציה מקבלת ערך 00 שווה למספר מחרוזות הקלט שעליהן הפונקציה מקבלת ערך 11.

שימו לב שכאשר nn גדול מ-11, יש פונקציות מהצורה f:ΣnΣf:\Sigma^n \rightarrow \Sigma שאינן קבועות ואינן מאוזנות. לדוגמה, הפונקציה f:Σ2Σf:\Sigma^2\rightarrow\Sigma המוגדרת כך:

f(00)=0f(01)=0f(10)=0f(11)=1\begin{aligned} f(00) & = 0 \\ f(01) & = 0 \\ f(10) & = 0 \\ f(11) & = 1 \end{aligned}

אינה נכללת באף אחת מהקטגוריות הללו. בבעיית דויטש-ג'וזה, פשוט אין אנו מתייחסים לפונקציות כאלה — הן נחשבות לקלטי "לא אכפת". כלומר, לבעיה זו יש הבטחה שהפונקציה ff היא או קבועה או מאוזנת.

בעיית דויטש-ג'וזה

קלט: פונקציה f:{0,1}n{0,1}f:\{0,1\}^n\rightarrow\{0,1\}
הבטחה: ff היא או קבועה או מאוזנת
פלט: 00 אם ff קבועה, 11 אם ff מאוזנת

אלגוריתם דויטש-ג'וזה, עם שאילתתו היחידה, פותר בעיה זו במובן הבא: אם כל אחד מ-nn תוצאות המדידה הוא 00, אז הפונקציה ff קבועה; ואחרת, אם לפחות אחת מתוצאות המדידה היא 11, אז הפונקציה ff מאוזנת. דרך נוספת לומר זאת היא שה-Circuit המתואר לעיל מלווה בשלב עיבוד קלאסי שבו מחושב ה-OR של תוצאות המדידה כדי לייצר את הפלט.

ניתוח האלגוריתם

כדי לנתח את ביצועי אלגוריתם דויטש-ג'וזה לבעיית דויטש-ג'וזה, כדאי להתחיל בחשיבה על פעולת שכבה יחידה של Gate-ים הדאמר. פעולת הדאמר ניתנת לביטוי כמטריצה בצורה הרגילה,

H=(12121212),H = \begin{pmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\[2mm] \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{pmatrix},

אך ניתן גם לבטא פעולה זו במונחים של פעולתה על מצבי הבסיס הסטנדרטיים:

H0=120+121H1=120121.\begin{aligned} H \vert 0\rangle & = \frac{1}{\sqrt{2}} \vert 0 \rangle + \frac{1}{\sqrt{2}} \vert 1 \rangle\\[3mm] H \vert 1\rangle & = \frac{1}{\sqrt{2}} \vert 0 \rangle - \frac{1}{\sqrt{2}} \vert 1 \rangle. \end{aligned}

שתי המשוואות הללו ניתנות לשילוב לנוסחה יחידה,

Ha=120+12(1)a1=12b{0,1}(1)abb,H \vert a \rangle = \frac{1}{\sqrt{2}} \vert 0 \rangle + \frac{1}{\sqrt{2}} (-1)^a \vert 1 \rangle = \frac{1}{\sqrt{2}} \sum_{b\in\{0,1\}} (-1)^{ab} \vert b\rangle,

הנכונה לשני הבחירות של aΣ.a\in\Sigma.

עכשיו נניח שבמקום Qubit יחיד יש לנו nn Qubit-ים, ופעולת הדאמר מתבצעת על כל אחד מהם. הפעולה המשולבת על nn ה-Qubit-ים מתוארת על ידי המכפלה הטנזורית HHH\otimes \cdots \otimes H (nn פעמים), אותה נכתוב כ-HnH^{\otimes n} לשם תמציתיות ובהירות. באמצעות הנוסחה שלעיל, ולאחר הרחבה ופישוט, ניתן לבטא את פעולת הפעולה המשולבת הזו על מצבי הבסיס הסטנדרטיים של nn Qubit-ים כך:

Hnxn1x1x0=(Hxn1)(Hx0)=(12yn1Σ(1)xn1yn1yn1)(12y0Σ(1)x0y0y0)=12nyn1y0Σn(1)xn1yn1++x0y0yn1y0.\begin{aligned} & H^{\otimes n} \vert x_{n-1} \cdots x_1 x_0 \rangle \\ & \qquad = \bigl(H \vert x_{n-1} \rangle \bigr) \otimes \cdots \otimes \bigl(H \vert x_{0} \rangle \bigr) \\ & \qquad = \Biggl( \frac{1}{\sqrt{2}} \sum_{y_{n-1}\in\Sigma} (-1)^{x_{n-1} y_{n-1}} \vert y_{n-1} \rangle \Biggr) \otimes \cdots \otimes \Biggl( \frac{1}{\sqrt{2}} \sum_{y_{0}\in\Sigma} (-1)^{x_{0} y_{0}} \vert y_{0} \rangle \Biggr) \\ & \qquad = \frac{1}{\sqrt{2^n}} \sum_{y_{n-1}\cdots y_0 \in \Sigma^n} (-1)^{x_{n-1}y_{n-1} + \cdots + x_0 y_0} \vert y_{n-1} \cdots y_0 \rangle. \end{aligned}

אגב, כאן אנו כותבים מחרוזות בינאריות באורך nn כ-xn1x0x_{n-1}\cdots x_0 ו-yn1y0y_{n-1}\cdots y_0, בהתאם למוסכמת האינדקסים של Qiskit.

נוסחה זו מספקת לנו כלי שימושי לניתוח ה-Circuit הקוונטי שלעיל. לאחר ביצוע שכבת Gate-י הדאמר הראשונה, מצב n+1n+1 ה-Qubit-ים (כולל ה-Qubit השמאלי/התחתון ביותר, המטופל בנפרד מהשאר) הוא:

(H1)(Hn00)=12nxn1x0Σnxn1x0.\bigl( H \vert 1 \rangle \bigr) \bigl( H^{\otimes n} \vert 0 \cdots 0 \rangle \bigr) = \vert - \rangle \otimes \frac{1}{\sqrt{2^n}} \sum_{x_{n-1}\cdots x_0 \in \Sigma^n} \vert x_{n-1} \cdots x_0 \rangle.

כאשר מתבצעת פעולת UfU_f, מצב זה מתמר ל-

12nxn1x0Σn(1)f(xn1x0)xn1x0\vert - \rangle \otimes \frac{1}{\sqrt{2^n}} \sum_{x_{n-1}\cdots x_0 \in \Sigma^n} (-1)^{f(x_{n-1}\cdots x_0)} \vert x_{n-1} \cdots x_0 \rangle

דרך אותו תופעת בעיטת הפאזה שראינו בניתוח אלגוריתם דויטש.

לאחר מכן מתבצעת שכבת Gate-י הדאמר השנייה, שמתמרת (לפי הנוסחה שלעיל) מצב זה ל-

12nxn1x0Σnyn1y0Σn(1)f(xn1x0)+xn1yn1++x0y0yn1y0.\vert - \rangle \otimes \frac{1}{2^n} \sum_{x_{n-1}\cdots x_0 \in \Sigma^n} \sum_{y_{n-1}\cdots y_0 \in \Sigma^n} (-1)^{f(x_{n-1}\cdots x_0) + x_{n-1}y_{n-1} + \cdots + x_0 y_0} \vert y_{n-1} \cdots y_0 \rangle.

ביטוי זה נראה מסובך במקצת, ולא ניתן להסיק הרבה לגבי ההסתברויות לקבל תוצאות מדידה שונות מבלי לדעת יותר על הפונקציה ff.

למרבה המזל, כל מה שאנחנו צריכים לדעת הוא ההסתברות שכל אחת מתוצאות המדידה תהיה 00 — כי זו ההסתברות שהאלגוריתם קובע ש-ff קבועה. להסתברות זו יש נוסחה פשוטה.

12nxn1x0Σn(1)f(xn1x0)2={1if f is constant0if f is balanced\Biggl\vert \frac{1}{2^n} \sum_{x_{n-1}\cdots x_0 \in \Sigma^n} (-1)^{f(x_{n-1}\cdots x_0)} \Biggr\vert^2 = \begin{cases} 1 & \text{if $f$ is constant}\\[1mm] 0 & \text{if $f$ is balanced} \end{cases}

ביתר פירוט, אם ff קבועה, אז או ש-f(xn1x0)=0f(x_{n-1}\cdots x_0) = 0 לכל מחרוזת xn1x0,x_{n-1}\cdots x_0, ואז ערך הסכום הוא 2n,2^n, או ש-f(xn1x0)=1f(x_{n-1}\cdots x_0) = 1 לכל מחרוזת xn1x0,x_{n-1}\cdots x_0, ואז ערך הסכום הוא 2n.-2^n. חלוקה ב-2n2^n ולקיחת ריבוע הערך המוחלט נותנת 1.1.

מצד שני, אם ff מאוזנת, אז ff מקבלת ערך 00 על חצי מהמחרוזות xn1x0x_{n-1}\cdots x_0 וערך 11 על החצי השני, כך שאיברי +1+1 ו-1-1 בסכום מתבטלים ואנחנו נשארים עם הערך 00.

אנו מסיקים שהאלגוריתם פועל כראוי בתנאי שההבטחה מתקיימת.

קושי קלאסי

אלגוריתם דויטש-ג'וזה עובד בכל פעם, תמיד נותן לנו את התשובה הנכונה כאשר ההבטחה מתקיימת, ודורש שאילתה יחידה. כיצד זה משתווה לאלגוריתמים קלאסיים של שאילתות לבעיית דויטש-ג'וזה?

ראשית, כל אלגוריתם קלאסי דטרמיניסטי שפותר נכונה את בעיית דויטש-ג'וזה חייב לבצע מספר אקספוננציאלי של שאילתות: 2n1+12^{n-1} + 1 שאילתות נדרשות במקרה הגרוע ביותר. הנימוק הוא שאם אלגוריתם דטרמיניסטי שואל את ff על 2n12^{n-1} מחרוזות שונות או פחות, ומקבל כל פעם אותו ערך פונקציה, אז שתי התשובות עדיין אפשריות. הפונקציה עשויה להיות קבועה, או שהיא מאוזנת אך מחוסר מזל כל השאילתות מחזירות את אותו ערך פונקציה.

האפשרות השנייה עשויה להיראות לא סבירה — אך עבור אלגוריתמים דטרמיניסטיים אין אקראיות או אי-וודאות, כך שהם ייכשלו באופן שיטתי על פונקציות מסוימות. לכן יש לנו יתרון משמעותי של קוונטי על פני אלגוריתמים קלאסיים בהקשר זה.

יש כאן אחיזה, עם זאת, שהיא שאלגוריתמים קלאסיים הסתברותיים יכולים לפתור את בעיית דויטש-ג'וזה בהסתברות גבוהה מאוד באמצעות מספר קטן בלבד של שאילתות. בפרט, אם פשוט נבחר כמה מחרוזות שונות באורך nn באקראי, ונשאל את ff על מחרוזות אלו, לא סביר שנקבל את אותו ערך פונקציה לכולן כאשר ff מאוזנת.

ליתר דיוק, אם נבחר kk מחרוזות קלט x1,,xkΣnx^1,\ldots,x^k \in \Sigma^n באחידות אקראית, נחשב f(x1),,f(xk),f(x^1),\ldots,f(x^k), ונענה 00 אם ערכי הפונקציה זהים כולם, ו-11 אם לא, אז תמיד נצדק כשהפונקציה קבועה, ונטעה כשהפונקציה מאוזנת בהסתברות של 2k+12^{-k + 1} בלבד. אם ניקח k=11k = 11 לדוגמה, האלגוריתם הזה יענה נכון בהסתברות גדולה מ-99.999.9%.

מטעם זה, עדיין יש לנו יתרון צנוע למדי של קוונטי על פני אלגוריתמים קלאסיים — אך זהו בכל זאת יתרון מדיד המהווה שיפור על פני אלגוריתם דויטש.

דויטש-ג'וזה עם 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

כדי לממש את אלגוריתם דויטש-ג'וזה ב-Qiskit, נתחיל בהגדרת פונקציה dj_query שמייצרת Circuit קוונטי המממש Gate שאילתה, עבור פונקציה שנבחרת באקראי ומקיימת את ההבטחה לבעיית דויטש-ג'וזה. בהסתברות של 50%, הפונקציה קבועה, ובהסתברות של 50% הפונקציה מאוזנת. לכל אחת משתי האפשרויות הללו, הפונקציה נבחרת באחידות מבין הפונקציות מאותו סוג. הארגומנט הוא מספר סיביות הקלט של הפונקציה.

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

ניתן להציג את מימוש ה-Circuit הקוונטי של Gate השאילתה באמצעות מתודת draw כרגיל.

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

Output of the previous code cell

בשלב הבא נגדיר פונקציה שיוצרת את Circuit דויטש-ג'וזה, ומקבלת כארגומנט מימוש Circuit קוונטי של Gate שאילתה.

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

לבסוף, מוגדרת פונקציה שמריצה את Circuit דויטש-ג'וזה פעם אחת.

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"

ניתן לבדוק את המימוש שלנו על ידי בחירת פונקציה באקראי, הצגת מימוש ה-Circuit הקוונטי של Gate שאילתה עבור פונקציה זו, ולאחר מכן הרצת אלגוריתם דויטש-ג'וזה על אותה פונקציה.

f = dj_query(3)
display(f.draw("mpl"))
display(dj_algorithm(f))

Output of the previous code cell

'balanced'

בעיית ברנשטיין-וזירני

כעת נדון בבעיה הידועה בשם בעיית ברנשטיין-וזירני. היא נקראת גם בעיית דגימת פורייה, אם כי קיימות ניסוחים כלליים יותר של בעיה זו הנושאים את אותו השם.

ראשית, נציג סימון כלשהו. עבור כל שתי מחרוזות בינאריות x=xn1x0x = x_{n-1} \cdots x_0 ו-y=yn1y0y = y_{n-1}\cdots y_0 באורך n,n, נגדיר

xy=xn1yn1x0y0.x \cdot y = x_{n-1} y_{n-1} \oplus \cdots \oplus x_0 y_0.

נכנה פעולה זו מכפלה נקודתית בינארית. דרך חלופית להגדירה היא כך:

xy={1xn1yn1++x0y0 is odd0xn1yn1++x0y0 is evenx \cdot y = \begin{cases} 1 & x_{{n-1}} y_{n-1} + \cdots + x_0 y_0 \text{ is odd}\\[0.5mm] 0 & x_{{n-1}} y_{n-1} + \cdots + x_0 y_0 \text{ is even} \end{cases}

שים לב שמדובר בפעולה סימטרית, כלומר התוצאה לא משתנה אם נחליף בין xx ו-y,y, כך שאנו חופשיים לעשות זאת כשנוח. לפעמים שימושי לחשוב על המכפלה הנקודתית הבינארית xyx \cdot y כשוויון הזוגיות של הביטים של xx במיקומים שבהם yy שווה 1,1, או שקולה לכך, הזוגיות של הביטים של yy במיקומים שבהם xx שווה 1.1.

עם הסימון הזה בידינו, נוכל להגדיר את בעיית ברנשטיין-וזירני.

בעיית ברנשטיין-וזירני

קלט: פונקציה f:{0,1}n{0,1}f:\{0,1\}^n\rightarrow\{0,1\}
הבטחה: קיימת מחרוזת בינארית s=sn1s0s = s_{n-1} \cdots s_0 כך ש-f(x)=sxf(x) = s\cdot x לכל xΣnx\in\Sigma^n
פלט: המחרוזת ss

למעשה אין צורך באלגוריתם קוונטי חדש לבעיה זו; אלגוריתם דויטש-ג'וזסה פותר אותה. לשם הבהירות, נכנה את המעגל הקוונטי שהוצג לעיל — ללא שלב העיבוד הקלאסי של חישוב ה-OR — מעגל דויטש-ג'וזסה.

ניתוח האלגוריתם

כדי לנתח כיצד מעגל דויטש-ג'וזסה עובד עבור פונקציה המקיימת את ההבטחה של בעיית ברנשטיין-וזירני, נתחיל בתצפית קצרה. בעזרת המכפלה הנקודתית הבינארית, נוכל לתאר את פעולתם של nn שערי הדאמרד על מצבי הבסיס הסטנדרטי של nn Qubit-ים כך:

Hnx=12nyΣn(1)xyyH^{\otimes n} \vert x \rangle = \frac{1}{\sqrt{2^n}} \sum_{y\in\Sigma^n} (-1)^{x\cdot y} \vert y\rangle

בדומה למה שראינו בניתוח אלגוריתם דויטש, הסיבה לכך היא שהערך (1)k(-1)^k לכל מספר שלם kk תלוי רק בשאלה האם kk זוגי או אי-זוגי.

כשנפנה למעגל דויטש-ג'וזסה, לאחר ביצוע שכבת שערי הדאמרד הראשונה, מצב ה-n+1n+1 Qubit-ים הוא

12nxΣnx.\vert - \rangle \otimes \frac{1}{\sqrt{2^n}} \sum_{x \in \Sigma^n} \vert x \rangle.

לאחר מכן מתבצע שער השאילתה, אשר (דרך תופעת ה-phase kickback) הופך את המצב ל-

12nxΣn(1)f(x)x.\vert - \rangle \otimes \frac{1}{\sqrt{2^n}} \sum_{x \in \Sigma^n} (-1)^{f(x)} \vert x \rangle.

בעזרת הנוסחה שלנו לפעולת שכבת שערי הדאמרד, אנו רואים ששכבת הדאמרד השנייה הופכת את המצב הזה ל-

12nxΣnyΣn(1)f(x)+xyy.\vert - \rangle \otimes \frac{1}{2^n} \sum_{x \in \Sigma^n} \sum_{y \in \Sigma^n} (-1)^{f(x) + x \cdot y} \vert y \rangle.

עכשיו נוכל לבצע כמה פישוטים בחזקה של 1-1 בתוך הסכום. מובטח לנו ש-f(x)=sxf(x) = s\cdot x עבור מחרוזת כלשהי s=sn1s0,s = s_{n-1} \cdots s_0, ולכן נוכל לכתוב את המצב כ-

12nxΣnyΣn(1)sx+xyy.\vert - \rangle \otimes \frac{1}{2^n} \sum_{x \in \Sigma^n} \sum_{y \in \Sigma^n} (-1)^{s\cdot x + x \cdot y} \vert y \rangle.

מכיוון ש-sxs\cdot x ו-xyx\cdot y הם ערכים בינאריים, נוכל להחליף את החיבור ב-XOR — שוב מפני שהדבר היחיד שחשוב עבור מספר שלם בחזקה של 1-1 הוא אם הוא זוגי או אי-זוגי. תוך שימוש בסימטריה של המכפלה הנקודתית הבינארית, נקבל את הביטוי הבא למצב:

12nxΣnyΣn(1)(sx)(yx)y.\vert - \rangle \otimes \frac{1}{2^n} \sum_{x \in \Sigma^n} \sum_{y \in \Sigma^n} (-1)^{(s\cdot x) \oplus (y \cdot x)} \vert y \rangle.

(סוגריים הוספו לצורך הבהירות, אם כי אינם הכרחיים ממש מפני שמקובל להתייחס למכפלה הנקודתית הבינארית כבעלת קדימות גבוהה יותר מ-XOR.)

בשלב זה נעשה שימוש בנוסחה הבאה:

(sx)(yx)=(sy)x(s\cdot x) \oplus (y \cdot x) = (s \oplus y) \cdot x

נוכל לגזור נוסחה זו מנוסחה דומה עבור ביטים,

(ac)(bc)=(ab)c,(a c) \oplus (b c) = (a \oplus b) c,

יחד עם פיתוח המכפלה הנקודתית הבינארית וה-XOR הביטי:

(sx)(yx)=(sn1xn1)(s0x0)(yn1xn1)(y0x0)=(sn1yn1)xn1(s0y0)x0=(sy)x\begin{aligned} (s\cdot x) \oplus (y \cdot x) & = (s_{n-1} x_{n-1}) \oplus \cdots \oplus (s_{0} x_{0}) \oplus (y_{n-1} x_{n-1}) \oplus \cdots \oplus (y_{0} x_{0}) \\ & = (s_{n-1} \oplus y_{n-1}) x_{n-1} \oplus \cdots \oplus (s_{0} \oplus y_{0}) x_{0} \\ & = (s \oplus y) \cdot x \end{aligned}

זה מאפשר לנו לכתוב את מצב המעגל מיד לפני המדידות כך:

12nxΣnyΣn(1)(sy)xy.\vert - \rangle \otimes \frac{1}{2^n} \sum_{x \in \Sigma^n} \sum_{y \in \Sigma^n} (-1)^{(s\oplus y)\cdot x} \vert y \rangle.

השלב האחרון הוא להשתמש בנוסחה נוספת, המתקיימת לכל מחרוזת בינארית z=zn1z0.z = z_{n-1}\cdots z_0.

12nxΣn(1)zx={1if z=0n0if z0n\frac{1}{2^n} \sum_{x \in \Sigma^n} (-1)^{z \cdot x} = \begin{cases} 1 & \text{if $z = 0^n$}\\ 0 & \text{if $z\neq 0^n$} \end{cases}

כאן אנו משתמשים בסימון פשוט למחרוזות שנשתמש בו עוד מספר פעמים בשיעור: 0n0^n היא המחרוזת כולה-אפסים באורך n.n.

דרך פשוטה להוכיח שנוסחה זו עובדת היא לבחון את שני המקרים בנפרד. אם z=0n,z = 0^n, אז zx=0z\cdot x = 0 לכל מחרוזת xΣn,x\in\Sigma^n, כך שערך כל איבר בסכום הוא 1,1, ונקבל 11 לאחר הסכימה וחלוקה ב-2n.2^n. מאידך, אם אחד מן הביטים של zz שווה 1,1, אז המכפלה הנקודתית הבינארית zxz\cdot x שווה 00 עבור בדיוק מחצית מהבחירות האפשריות של xΣnx\in\Sigma^n ו-11 עבור המחצית השנייה — מפני שערך המכפלה הנקודתית zxz\cdot x מתהפך (מ-00 ל-11 או מ-11 ל-00) אם נהפוך כל ביט של xx במיקום שבו zz שווה 1.1.

אם נפעיל כעת נוסחה זו לפישוט מצב המעגל לפני המדידות, נקבל

12nxΣnyΣn(1)(sy)xy=s,\vert - \rangle \otimes \frac{1}{2^n} \sum_{x \in \Sigma^n} \sum_{y \in \Sigma^n} (-1)^{(s\oplus y)\cdot x} \vert y \rangle = \vert - \rangle \otimes \vert s \rangle,

בשל העובדה ש-sy=0ns\oplus y = 0^n אם ורק אם y=s.y = s. לפיכך, המדידות חושפות בדיוק את המחרוזת ss שאנו מחפשים.

קושי קלאסי

בעוד שמעגל דויטש-ג'וזסה פותר את בעיית ברנשטיין-וזירני בשאילתה אחת, כל אלגוריתם שאילתה קלאסי חייב לבצע לפחות nn שאילתות כדי לפתור בעיה זו.

ניתן לנמק זאת באמצעות טיעון תיאורטי-אינפורמציוני, שהוא פשוט מאוד במקרה הזה. כל שאילתה קלאסית חושפת ביט מידע אחד על הפתרון, ויש nn ביטים של מידע שצריך לגלות — לכן נדרשות לפחות nn שאילתות.

למעשה, ניתן לפתור את בעיית ברנשטיין-וזירני קלאסית על ידי שאילתת הפונקציה על כל אחת מ-nn המחרוזות שיש בהן 11 אחד בכל מיקום אפשרי ו-00 בשאר הביטים, מה שחושף את ביטי ss אחד-אחד. לפיכך, היתרון של אלגוריתמים קוונטיים על פני קלאסיים לבעיה זו הוא שאילתה 11 לעומת nn שאילתות.

ברנשטיין-וזירני עם Qiskit

כבר מימשנו את מעגל דויטש-ג'וזסה לעיל, וכאן נשתמש בו כדי לפתור את בעיית ברנשטיין-וזירני. ראשית נגדיר פונקציה שמממשת שער שאילתה לבעיית ברנשטיין-וזירני עבור כל מחרוזת בינארית s.s.

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

Output of the previous code cell

עכשיו נוכל ליצור פונקציה שמריצה את מעגל דויטש-ג'וזסה על הפונקציה, תוך שימוש בפונקציה compile_circuit שהוגדרה קודם לכן.

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'

הערה על מינוח

בהקשר של בעיית ברנשטיין-וזירני, נפוץ לכנות את אלגוריתם דויטש-ג'וזסה "אלגוריתם ברנשטיין-וזירני". זה מעט מטעה, מפני שהאלגוריתם הוא אלגוריתם דויטש-ג'וזסה, כפי שברנשטיין ווזירני היו ברורים מאוד בעבודתם.

מה שברנשטיין ווזירני עשו לאחר שהראו שאלגוריתם דויטש-ג'וזסה פותר את בעיית ברנשטיין-וזירני (כפי שהיא מנוסחת לעיל) היה להגדיר בעיה הרבה יותר מסובכת, הידועה בשם בעיית דגימת פורייה הרקורסיבית. זוהי בעיה מאולצת מאוד שבה פתרונות למופעים שונים של הבעיה פותחים למעשה רמות חדשות של הבעיה המסודרות במבנה עצי. בעיית ברנשטיין-וזירני היא בעצם רק מקרה הבסיס של הבעיה המסובכת יותר הזו.

בעיית דגימת פורייה הרקורסיבית הייתה הדוגמה הראשונה הידועה לבעיית שאילתה שבה לאלגוריתמים קוונטיים יש יתרון על-פולינומי על פני אלגוריתמים הסתברותיים, ובכך עולה על היתרון של קוונטי על פני קלאסי שמציע אלגוריתם דויטש-ג'וזסה. באופן אינטואיטיבי, הגרסה הרקורסיבית של הבעיה מגבירה את יתרון 11 לעומת nn של האלגוריתמים הקוונטיים למשהו גדול בהרבה.

ההיבט המאתגר ביותר של הניתוח המתמטי המבסס יתרון זה הוא להראות שאלגוריתמי שאילתה קלאסיים אינם יכולים לפתור את הבעיה ללא ביצוע שאילתות רבות. זה די טיפוסי; עבור בעיות רבות יכול להיות קשה מאוד לשלול גישות קלאסיות יצירתיות שפותרות אותן ביעילות.

בעיית סיימון, והאלגוריתם לפתרונה המתואר בחלק הבא, מספקים דוגמה הרבה יותר פשוטה ליתרון על-פולינומי (ולמעשה, מעריכי) של קוונטי על פני אלגוריתמים קלאסיים, ומסיבה זו בעיית דגימת פורייה הרקורסיבית נדונה פחות לעתים קרובות.