אלגוריתם דויטש-ג'וזה
אלגוריתם דויטש עולה על כל האלגוריתמים הקלאסיים עבור בעיית שאילתה, אך היתרון צנוע למדי: שאילתה אחת לעומת שתיים. אלגוריתם דויטש-ג'וזה מרחיב יתרון זה — ולמעשה, ניתן להשתמש בו כדי לפתור כמה בעיות שאילתה שונות.
הנה תיאור Circuit קוונטי של אלגוריתם דויטש-ג'וזה. ייתכן שנדרש גם שלב עיבוד קלאסי נוסף, שאינו מוצג באיור, בהתאם לבעיה הספציפית הנפתרת.
כמובן, עדיין לא דנו בבעיות שאלגוריתם זה פותר; הדבר נעשה בשני הסעיפים הבאים.
בעיית דויטש-ג'וזה
נתחיל עם בעיית השאילתה שאלגוריתם דויטש-ג'וזה נועד לפתור במקורו, המוכרת בשם בעיית דויטש-ג'וזה.
פונקציית הקלט לבעיה זו היא מהצורה עבור מספר שלם חיובי שרירותי כמו בבעיית דויטש, המשימה היא להוציא אם היא קבועה ו- אם היא מאוזנת, כלומר מספר מחרוזות הקלט שעליהן הפונקציה מקבלת ערך שווה למספר מחרוזות הקלט שעליהן הפונקציה מקבלת ערך .
שימו לב שכאשר גדול מ-, יש פונקציות מהצורה שאינן קבועות ואינן מאוזנות. לדוגמה, הפונקציה המוגדרת כך:
אינה נכללת באף אחת מהקטגוריות הללו. בבעיית דויטש-ג'וזה, פשוט אין אנחנו מתייחסים לפונקציות כאלה — הן נחשבות לקלטי "לא אכפת". כלומר, לבעיה זו יש הבטחה שהפונקציה היא או קבועה או מאוזנת.
אלגוריתם דויטש-ג'וזה, עם שאילתתו היחידה, פותר בעיה זו במובן הבא: אם כל אחד מ- תוצאות המדידה הוא , אז הפונקציה קבועה; ואחרת, אם לפחות אחת מתוצאות המדידה היא , אז הפונקציה מאוזנת. דרך נוספת לומר זאת היא שה-Circuit המתואר לעיל מלווה בשלב עיבוד קלאסי שבו מחושב ה-OR של תוצאות המדידה כדי לייצר את הפלט.
ניתוח האלגוריתם
כדי לנתח את ביצועי אלגוריתם דויטש-ג'וזה לבעיית דויטש-ג'וזה, כדאי להתחיל בחשיבה על פעולת שכבה יחידה של Gate-ים הדאמר. פעולת הדאמר ניתנת לביטוי כמטריצה בצורה הרגילה,
אך ניתן גם לבטא פעולה זו במונחים של פעולתה על מצבי הבסיס הסטנדרטיים:
שתי המשוואות הללו ניתנות לשילוב לנוסחה יחידה,
הנכונה לשני הבחירות של
עכשיו נניח שבמקום qubit יחיד יש לנו qubit-ים, ופעולת הדאמר מתבצעת על כל אחד מהם. הפעולה המשולבת על ה-Qubit-ים מתוארת על ידי המכפלה הטנזורית ( פעמים), אותה נכתוב כ- לשם תמציתיות ובהירות. באמצעות הנוסחה שלעיל, ולאחר הרחבה ופישוט, ניתן לבטא את פעולת הפעולה המשולבת הזו על מצבי הבסיס הסטנדרטיים של qubit-ים כך:
אגב, כאן אנחנו כותבים מחרוזות בינאריות באורך כ- ו-, בהתאם למוסכמת האינדקסים של Qiskit.
נוסחה זו מספקת לנו כלי שימושי לניתוח ה-Circuit הקוונטי שלעיל. לאחר ביצוע שכבת Gate-י הדאמר הראשונה, מצב ה-Qubit-ים (כולל ה-Qubit השמאלי/התחתון ביותר, המטופל בנפרד מהשאר) הוא:
כאשר מתבצעת פעולת , מצב זה מתמר ל-
דרך אותו תופעת בעיטת הפאזה שראינו בניתוח אלגוריתם דויטש.
לאחר מכן מתבצעת שכבת Gate-י הדאמר השנייה, שמתמרת (לפי הנוסחה שלעיל) מצב זה ל-
ביטוי זה נראה מסובך במקצת, ולא ניתן להסיק הרבה לגבי ההסתברויות לקבל תוצאות מדידה שונות מבלי לדעת יותר על הפונקציה .
למרבה המזל, כל מה שאנחנו צריכים לדעת הוא ההסתברות שכל אחת מתוצאות המדידה תהיה — כי זו ההסתברות שהאלגוריתם קובע ש- קבועה. להסתברות זו יש נוסחה פשוטה.
ביתר פירוט, אם קבועה, אז או ש- לכל מחרוזת ואז ערך הסכום הוא או ש- לכל מחרוזת ואז ערך הסכום הוא חלוקה ב- ולקיחת ריבוע הערך המוחלט נותנת
מצד שני, אם מאוזנת, אז מקבלת ערך על חצי מהמחרוזות וערך על החצי השני, כך שאיברי ו- בסכום מתבטלים ואנחנו נשארים עם הערך .
אנחנו מסיקים שהאלגוריתם פועל כראוי בתנאי שההבטחה מתקיימת.
קושי קלאסי
אלגוריתם דויטש-ג'וזה עובד בכל פעם, תמיד נותן לנו את התשובה הנכונה כאשר ההבטחה מתקיימת, ודורש שאילתה יחידה. כיצד זה משתווה לאלגוריתמים קלאסיים של שאילתות לבעיית דויטש-ג'וזה?
ראשית, כל אלגוריתם קלאסי דטרמיניסטי שפותר נכונה את בעיית דויטש-ג'וזה חייב לבצע מספר אקספוננציאלי של שאילתות: שאילתות נדרשות במקרה הגרוע ביותר. הנימוק הוא שאם אלגוריתם דטרמיניסטי שואל את על מחרוזות שונות או פחות, ומקבל כל פעם אותו ערך פונקציה, אז שתי התשובות עדיין אפשריות. הפונקציה עשויה להיות קבועה, או שהיא מאוזנת אך מחוסר מזל כל השאילתות מחזירות את אותו ערך פונקציה.
האפשרות השנייה עשויה להיראות לא סבירה — אך עבור אלגוריתמים דטרמיניסטיים אין אקראיות או אי-וודאות, כך שהם ייכשלו באופן שיטתי על פונקציות מסוימות. לכן יש לנו יתרון משמעותי של קוונטי על פני אלגוריתמים קלאסיים בהקשר זה.
יש כאן אחיזה, עם זאת, שהיא שאלגוריתמים קלאסיים הסתברותיים יכולים לפתור את בעיית דויטש-ג'וזה בהסתברות גבוהה מאוד באמצעות מספר קטן בלבד של שאילתות. בפרט, אם פשוט נבחר כמה מחרוזות שונות באורך באקראי, ונשאל את על מחרוזות אלו, לא סביר שנקבל את אותו ערך פונקציה לכולן כאשר מאוזנת.
ליתר דיוק, אם נבחר מחרוזות קלט באחידות אקראית, נחשב ונענה אם ערכי הפונקציה זהים כולם, ו- אם לא, אז תמיד נצדק כשהפונקציה קבועה, ונטעה כשהפונקציה מאוזנת בהסתברות של בלבד. אם ניקח לדוגמה, האלגוריתם הזה יענה נכון בהסתברות גדולה מ-%.
מטעם זה, עדיין יש לנו יתרון צנוע למדי של קוונטי על פני אלגוריתמים קלאסיים — אך זהו בכל זאת יתרון מדיד המהווה שיפור על פני אלגוריתם דויטש.
דויטש-ג'וזה עם 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"))
בשלב הבא נגדיר פונקציה שיוצרת את 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))

'balanced'
בעיית ברנשטיין-וזירני
כעת נדון בבעיה הידועה בשם בעיית ברנשטיין-וזירני. היא נקראת גם בעיית דגימת פורייה, אם כי קיימות ניסוחים כלליים יותר של בעיה זו הנושאים את אותו השם.
ראשית, נציג סימון כלשהו. עבור כל שתי מחרוזות בינאריות ו- באורך נגדיר
נכנה פעולה זו מכפלה נקודתית בינארית. דרך חלופית להגדירה היא כך:
שים לב שמדובר בפעולה סימטרית, כלומר התוצאה לא משתנה אם נחליף בין ו- כך שאנו חופשיים לעשות זאת כשנוח. לפעמים שימושי לחשוב על המכפלה הנקודתית הבינארית כשוויון הזוגיות של הביטים של במיקומים שבהם שווה או שקולה לכך, הזוגיות של הביטים של במיקומים שבהם שווה
עם הסימון הזה בידינו, נוכל להגדיר את בעיית ברנשטיין-וזירני.
למעשה אין צורך באלגוריתם קוונטי חדש לבעיה זו; אלגוריתם דויטש-ג'וזה פותר אותה. לשם הבהירות, נכנה את המעגל הקוונטי שהוצג לעיל — ללא שלב העיבוד הקלאסי של חישוב ה-OR — מעגל דויטש-ג'וזה.
ניתוח האלגוריתם
כדי לנתח כיצד מעגל דויטש-ג'וזה עובד עבור פונקציה המקיימת את ההבטחה של בעיית ברנשטיין-וזירני, נתחיל בתצפית קצרה. בעזרת המכפלה הנקודתית הבינארית, נוכל לתאר את פעולתם של שערי הדאמרד על מצבי הבסיס הסטנדרטי של qubit-ים כך:
בדומה למה שראינו בניתוח אלגוריתם דויטש, הסיבה לכך היא שהערך לכל מספר שלם תלוי רק בשאלה האם זוגי או אי-זוגי.
כשנפנה למעגל דויטש-ג'וזה, לאחר ביצוע שכבת שערי הדאמרד הראשונה, מצב ה- qubit-ים הוא
לאחר מכן מתבצע שער השאילתה, אשר (דרך תופעת ה-phase kickback) הופך את המצב ל-
בעזרת הנוסחה שלנו לפעולת שכבת שערי הדאמרד, אנחנו רואים ששכבת הדאמרד השנייה הופכת את המצב הזה ל-
עכשיו נוכל לבצע כמה פישוטים בחזקה של בתוך הסכום. מובטח לנו ש- עבור מחרוזת כלשהי ולכן נוכל לכתוב את המצב כ-
מכיוון ש- ו- הם ערכים בינאריים, נוכל להחליף את החיבור ב-XOR — שוב מפני שהדבר היחיד שחשוב עבור מספר שלם בחזקה של הוא אם הוא זוגי או אי-זוגי. תוך שימוש בסימטריה של המכפלה הנקודתית הבינארית, נקבל את הביטוי הבא למצב:
(סוגריים הוספו לצורך הבהירות, אם כי אינם הכרחיים ממש מפני שמקובל להתייחס למכפלה הנקודתית הבינארית כבעלת קדימות גבוהה יותר מ-XOR.)
בשלב זה נעשה שימוש בנוסחה הבאה:
נוכל לגזור נוסחה זו מנוסחה דומה עבור ביטים,
יחד עם פיתוח המכפלה הנקודתית הבינארית וה-XOR הביטי:
זה מאפשר לנו לכתוב את מצב המעגל מיד לפני המדידות כך:
השלב האחרון הוא להשתמש בנוסחה נוספת, המתקיימת לכל מחרוזת בינארית
כאן אנחנו משתמשים בסימון פשוט למחרוזות שנשתמש בו עוד מספר פעמים בשיעור: היא המחרוזת כולה-אפסים באורך
דרך פשוטה להוכיח שנוסחה זו עובדת היא לבחון את שני המקרים בנפרד. אם אז לכל מחרוזת כך שערך כל איבר בסכום הוא ונקבל לאחר הסכימה וחלוקה ב- מאידך, אם אחד מן הביטים של שווה אז המכפלה הנקודתית הבינארית שווה עבור בדיוק מחצית מהבחירות האפשריות של ו- עבור המחצית השנייה — מפני שערך המכפלה הנקודתית מתהפך (מ- ל- או מ- ל-) אם נהפוך כל ביט של במיקום שבו שווה
אם נפעיל כעת נוסחה זו לפישוט מצב המעגל לפני המדידות, נקבל
בשל העובדה ש- אם ורק אם לפיכך, המדידות חושפות בדיוק את המחרוזת שאנו מחפשים.
קושי קלאסי
בעוד שמעגל דויטש-ג'וזה פותר את בעיית ברנשטיין-וזירני בשאילתה אחת, כל אלגוריתם שאילתה קלאסי חייב לבצע לפחות שאילתות כדי לפתור בעיה זו.
ניתן לנמק זאת באמצעות טיעון תיאורטי-אינפורמציוני, שהוא פשוט מאוד במקרה הזה. כל שאילתה קלאסית חושפת ביט מידע אחד על הפתרון, ויש ביטים של מידע שצריך לגלות — לכן נדרשות לפחות שאילתות.
למעשה, ניתן לפתור את בעיית ברנשטיין-וזירני קלאסית על ידי שאילתת הפונקציה על כל אחת מ- המחרוזות שיש בהן אחד בכל מיקום אפשרי ו- בשאר הביטים, מה שחושף את ביטי אחד-אחד. לפיכך, היתרון של אלגוריתמים קוונטיים על פני קלאסיים לבעיה זו הוא שאילתה לעומת שאילתות.
ברנשטיין-וזירני עם Qiskit
כבר מימשנו את מעגל דויטש-ג'וזה לעיל, וכאן נשתמש בו כדי לפתור את בעיית ברנשטיין-וזירני. ראשית נגדיר פונקציה שמממשת שער שאילתה לבעיית ברנשטיין-וזירני עבור כל מחרוזת בינארית
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"))
עכשיו נוכל ליצור פונקציה שמריצה את מעגל דויטש-ג'וזה על הפונקציה, תוך שימוש בפונקציה 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'
הערה על מינוח
בהקשר של בעיית ברנשטיין-וזירני, נפוץ לכנות את אלגוריתם דויטש-ג'וזה "אלגוריתם ברנשטיין-וזירני". זה מעט מטעה, מפני שהאלגוריתם הוא אלגוריתם דויטש-ג'וזה, כפי שברנשטיין ווזירני היו ברורים מאוד בעבודתם.
מה שברנשטיין ווזירני עשו לאחר שהראו שאלגוריתם דויטש-ג'וזה פותר את בעיית ברנשטיין-וזירני (כפי שהיא מנוסחת לעיל) היה להגדיר בעיה הרבה יותר מסובכת, הידועה בשם בעיית דגימת פורייה הרקורסיבית. זוהי בעיה מאולצת מאוד שבה פתרונות למופעים שונים של הבעיה פותחים למעשה רמות חדשות של הבעיה המסודרות במבנה עצי. בעיית ברנשטיין-וזירני היא בעצם רק מקרה הבסיס של הבעיה המסובכת יותר הזו.
בעיית דגימת פורייה הרקורסיבית הייתה הדוגמה הראשונה הידועה לבעיית שאילתה שבה לאלגוריתמים קוונטיים יש יתרון על-פולינומי על פני אלגוריתמים הסתברותיים, ובכך עולה על היתרון של קוונטי על פני קלאסי שמציע אלגוריתם דויטש-ג'וזה. באופן אינטואיטיבי, הגרסה הרקורסיבית של הבעיה מגבירה את יתרון לעומת של האלגוריתמים הקוונטיים למשהו גדול בהרבה.
ההיבט המאתגר ביותר של הניתוח המתמטי המבסס יתרון זה הוא להראות שאלגוריתמי שאילתה קלאסיים אינם יכולים לפתור את הבעיה ללא ביצוע שאילתות רבות. זה די טיפוסי; עבור בעיות רבות יכול להיות קשה מאוד לשלול גישות קלאסיות יצירתיות שפותרות אותן ביעילות.
בעיית סיימון, והאלגוריתם לפתרונה המתואר בחלק הבא, מספקים דוגמה הרבה יותר פשוטה ליתרון על-פולינומי (ולמעשה, מעריכי) של קוונטי על פני אלגוריתמים קלאסיים, ומסיבה זו בעיית דגימת פורייה הרקורסיבית נדונה פחות לעתים קרובות.