אלגוריתמים קוונטיים: אומדן פאזה
Kento Ueda (15 May 2024)
מחברת זו מספקת את המושגים הבסיסיים ואת היישום של טרנספורמציית פורייה הקוונטית (QFT) ואומדן הפאזה הקוונטי (QPE).
הורד את ה-PDF של ההרצאה המקורית. שים לב שחלק מקטעי הקוד עשויים להיות מיושנים כיוון שמדובר בתמונות סטטיות.
זמן QPU משוער להרצת הניסוי הוא 7 שניות.
1. מבוא
טרנספורמציית פורייה הקוונטית (QFT)
טרנספורמציית פורייה הקוונטית היא המקבילה הקוונטית של טרנספורמציית פורייה הדיסקרטית הקלאסית. זוהי טרנספורמציה לינארית המוחלת על מצבים קוונטיים, הממפה בסיסי חישוב לייצוגי הבסיס של פורייה שלהם. ה-QFT ממלא תפקיד מרכזי באלגוריתמים קוונטיים רבים, ומציע שיטה יעילה לחילוץ מידע תקופתיות ממצבים קוונטיים. ניתן לממש את ה-QFT עם פעולות באמצעות Gates קוונטיים כמו Hadamard gates ו-Control-Phase gates עבור Qubits, מה שמאפשר האצה אקספוננציאלית על פני טרנספורמציית פורייה הקלאסית.
- יישומים: זהו חלק יסודי באלגוריתמים קוונטיים כמו אלגוריתם שור לפירוק מספרים גדולים ולוגריתם דיסקרטי.
אומדן פאזה קוונטי (QPE)
אומדן הפאזה הקוונטי הוא אלגוריתם קוונטי המשמש לאמידת הפאזה הקשורה לווקטור עצמי של אופרטור יוניטרי. אלגוריתם זה מספק גשר בין התכונות המתמטיות המופשטות של מצבים קוונטיים ויישומיהם החישוביים.
- יישומים: הוא יכול לפתור בעיות כמו מציאת ערכים עצמיים של מטריצות יוניטריות ודמיית מערכות קוונטיות.
יחד, QFT ו-QPE מהווים את עמוד השדרה החיוני של אלגוריתמים קוונטיים רבים הפותרים בעיות שאינן ניתנות לפתרון על ידי מחשבים קלאסיים. בסיום מחברת זו, תרכוש הבנה כיצד מיישמים טכניקות אלו.
2. יסודות טרנספורמציית פורייה הקוונטית (QFT)
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer qiskit-ibm-runtime
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit_aer import AerSimulator
from qiskit.visualization import plot_histogram, plot_bloch_multivector
from qiskit.quantum_info import Statevector
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import Sampler
from numpy import pi
בהקבלה לטרנספורמציית פורייה הדיסקרטית, ה-QFT פועל על מצב קוונטי עבור Qubits וממפה אותו למצב הקוונטי .
כאשר .
או בייצוג מטריצה יוניטרית:
2.1. אינטואיציה
טרנספורמציית פורייה הקוונטית (QFT) עושה מיפוי בין שני בסיסים: בסיס החישוב (Z) ובסיס פורייה. אבל מה משמעות בסיס פורייה בהקשר זה? סביר להניח שאתה זוכר שטרנספורמציית פורייה של פונקציה מתארת את הקונבולוציה של על פונקציה סינוסואידלית בתדר . במילים פשוטות: טרנספורמציית פורייה היא פונקציה המתארת כמה מכל תדר נצטרך כדי לבנות פונקציה מפונקציות סינוס (או קוסינוס). כדי לקבל תחושה טובה יותר למה ה-QFT אומר בהקשר זה, שקול את התמונות המדורגות למטה המציגות מספר המקודד בבינארי, באמצעות ארבעה Qubits:
בבסיס החישוב, אנו מאחסנים מספרים בבינארי באמצעות המצבים ו-.
שים לב לתדירות שבה Qubits שונים משתנים; ה-Qubit השמאלי ביותר מתהפך עם כל תוספת במספר, הבא עם כל 2 תוספות, השלישי עם כל 4 תוספות, וכן הלאה.
אם נחיל טרנספורמציית פורייה קוונטית על מצבים אלה, נבצע מיפוי
(לעיתים קרובות אנו מסמנים מצבים בבסיס פורייה באמצעות טילדה (~)).
בבסיס פורייה, אנו מאחסנים מספרים באמצעות סיבובים שונים סביב ציר ה-Z:
IFRAME
המספר שאנחנו רוצים לאחסן קובע את הזווית שבה כל Qubit מסתובב סביב ציר ה-Z. במצב , כל ה-Qubits נמצאים במצב . כפי שנראה בדוגמה לעיל, כדי לקודד את המצב על 4 Qubits, סובבנו את ה-Qubit השמאלי ביותר ב- סיבובים מלאים ( רדיאנים). ה-Qubit הבא מסתובב כפליים מזה ( רדיאנים, או סיבובים מלאים), זווית זו מוכפלת שוב עבור ה-Qubit שאחריו, וכן הלאה.
שוב, שים לב לתדירות שבה כל Qubit משתנה. ה-Qubit השמאלי ביותר (qubit 0) במקרה זה בעל התדר הנמוך ביותר, והימני ביותר בעל הגבוה ביותר.
2.2 דוגמה: QFT של Qubit אחד
נשקול את המקרה של .
ניתן לכתוב את המטריצה היוניטרית:
פעולה זו היא תוצאה של החלת שער ה-Hadamard ().
2.3 ייצוג מכפלה של QFT
נכליל טרנספורמציה עבור , הפועל על המצב .
2.4 דוגמה: בניית Circuit של QFT עם 3 Qubits
מהתיאור לעיל, אולי לא ברור כיצד לבנות Circuit של QFT. לעת עתה, פשוט שים לב שאנחנו מצפים לשלושה Qubits שיהיו להם פאזות המתפתחות בקצבים "שונים". ההבנה של כיצד זה מתורגם לـCircuit נשארת כתרגיל לקורא. ישנם מספר דיאגרמות ודוגמאות ב-PDF של ההרצאה. משאבים נוספים כוללים שיעור זה מקורס יסודות האלגוריתמים הקוונטיים.
נדגים את QFT באמצעות סימולטורים בלבד, ולכן לא נשתמש במסגרת Qiskit patterns עד שנעבור לאומדן פאזה קוונטי.
# Prepare for 3 qubits circuit
qr = QuantumRegister(3)
cr = ClassicalRegister(3)
qc = QuantumCircuit(qr, cr)
qc.h(2)
qc.cp(pi / 2, 1, 2) # Controlled-phase gate from qubit 1 to qubit 2
qc.cp(pi / 4, 0, 2) # Controlled-phase gate from qubit 0 to qubit 2
qc.draw(output="mpl")
qc.h(1)
qc.cp(pi / 2, 0, 1) # Controlled-phase gate from qubit 0 to qubit 1
qc.draw(output="mpl")
qc.h(0)
qc.draw(output="mpl")
qc.swap(0, 2)
qc.draw(output="mpl")
ננסה להחיל QFT על כדוגמה.
ראשית, נאשר את הסימון הבינארי של המספר 5 וניצור את ה-Circuit המקודד את המצב 5:
bin(5)
'0b101'
qc = QuantumCircuit(3)
qc.x(0)
qc.x(2)
qc.draw(output="mpl")
נבדוק את המצבים הקוונטיים באמצעות סימולטור Aer:
statevector = Statevector(qc)
plot_bloch_multivector(statevector)

לבסוף, נוסיף QFT ונצפה במצב הסופי של ה-Qubits שלנו:
qc.h(2)
qc.cp(pi / 2, 1, 2)
qc.cp(pi / 4, 0, 2)
qc.h(1)
qc.cp(pi / 2, 0, 1)
qc.h(0)
qc.swap(0, 2)
qc.draw(output="mpl")
statevector = Statevector(qc)
plot_bloch_multivector(statevector)

אנחנו יכולים לראות שפונקציית ה-QFT שלנו עבדה נכון. Qubit 0 סובב ב- מסיבוב מלא, Qubit 1 ב- סיבובים מלאים (שווה ערך ל- מסיבוב מלא), ו-Qubit 2 ב- סיבובים מלאים (שווה ערך ל- מסיבוב מלא).
2.5 תרגיל: QFT
(1) מממש QFT של 4 Qubits.
##your code goes here##
(2) החל QFT על , סמלץ ושרטט את וקטור המצב באמצעות כדור בלוך.
##your code goes here##
פתרון התרגיל: QFT
(1)
qr = QuantumRegister(4)
cr = ClassicalRegister(4)
qc = QuantumCircuit(qr, cr)
qc.h(3)
qc.cp(pi / 2, 2, 3)
qc.cp(pi / 4, 1, 3)
qc.cp(pi / 8, 0, 3)
qc.h(2)
qc.cp(pi / 2, 1, 2)
qc.cp(pi / 4, 0, 2)
qc.h(1)
qc.cp(pi / 2, 0, 1)
qc.h(0)
qc.swap(0, 3)
qc.swap(1, 2)
qc.draw(output="mpl")
(2)
bin(14)
'0b1110'
qc = QuantumCircuit(4)
qc.x(1)
qc.x(2)
qc.x(3)
qc.draw("mpl")
qc.h(3)
qc.cp(pi / 2, 2, 3)
qc.cp(pi / 4, 1, 3)
qc.cp(pi / 8, 0, 3)
qc.h(2)
qc.cp(pi / 2, 1, 2)
qc.cp(pi / 4, 0, 2)
qc.h(1)
qc.cp(pi / 2, 0, 1)
qc.h(0)
qc.swap(0, 3)
qc.swap(1, 2)
qc.draw(output="mpl")
statevector = Statevector(qc)
plot_bloch_multivector(statevector)
