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

קוד שור ב-9 Qubit

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

תיאור הקוד

קוד שור ב-9 Qubit הוא הקוד שמתקבל על ידי שרשור שני הקודים מהסעיף הקודם. כלומר, אנחנו קודם מיישמים קידוד אחד שמקודד Qubit אחד לשלושה, ואז מיישמים את הקידוד השני על כל אחד משלושת ה-Qubit של הקידוד הראשון, ומקבלים בסך הכול תשעה Qubit.

ליתר דיוק, אף שבמקרה המסוים הזה היינו יכולים להחיל את שני הקודים בכל סדר, נבחר להחיל קודם את הגרסה המשונה של קוד החזרה של 3 ביטים (שמגלה שגיאות היפוך פאזה), ואז לקודד כל אחד משלושת ה-Qubit שהתקבלו בנפרד תוך שימוש בקוד החזרה המקורי של 3 ביטים (שמגלה שגיאות היפוך ביט). הנה ייצוג של קידוד זה בצורת Circuit:

Encoding circuit for the 9-qubit Shor code showing three blocks

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

אפשר לתאר את הקוד גם על ידי הצגת האופן שבו שני מצבי הבסיס הסטנדרטיים של ה-Qubit המקורי מקודדים.

0122(000+111)(000+111)(000+111)1122(000111)(000111)(000111)\begin{aligned} \vert 0\rangle & \:\mapsto\: \frac{1}{2\sqrt{2}} (\vert 000\rangle + \vert 111\rangle) \otimes (\vert 000\rangle + \vert 111\rangle) \otimes (\vert 000\rangle + \vert 111\rangle) \\[4mm] \vert 1\rangle & \:\mapsto\: \frac{1}{2\sqrt{2}} (\vert 000\rangle - \vert 111\rangle) \otimes (\vert 000\rangle - \vert 111\rangle) \otimes (\vert 000\rangle - \vert 111\rangle) \end{aligned}

כשיודעים את זה, אפשר לקבוע באמצעות לינאריות כיצד מקודד וקטור מצב Qubit שרירותי.

תיקון שגיאות היפוך ביט ופאזה

שגיאות ו-CNOT Gate

כדי לנתח כיצד שגיאות XX ו-ZZ משפיעות על קידודים של Qubit, הן בקוד שור ב-9 Qubit והן בקודים אחרים, יהיה שימושי לציין כמה יחסים פשוטים בין שגיאות אלה ו-CNOT Gate. כשאנחנו מתחילים לנתח את קוד שור ב-9 Qubit, זה רגע טוב לעצור ולבחון זאת.

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

X errors before and after CNOT gates

המצב דומה עבור ZZ Gate, אלא שתפקידי ה-Qubit הבקרה והיעד מתחלפים. בפרט, שלושת היחסים מתוארים על ידי ה-Circuit הקוונטיים הבאים.

Z errors before and after CNOT gates

תיקון שגיאות היפוך ביט

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

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

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

תיקון שגיאות היפוך פאזה

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

נניח שמתרחשת שגיאת ZZ על אחד מ-9 ה-Qubit של קוד שור, כמו זה המצוין בדיאגרמה הבאה.

Z error on a qubit for the 9-qubit Shor code

כבר ראינו מה קורה כשמתרחשת שגיאת ZZ בעת שימוש בקוד החזרה של 3 ביטים — זה שקול לשגיאת ZZ שמתרחשת לפני הקידוד. בהקשר של קוד שור ב-9 Qubit, כלומר שגיאת ZZ על כל אחד משלושת ה-Qubit בתוך בלוק תמיד מייצרת את אותה השפעה, השקולה לשגיאת ZZ המתרחשת על ה-Qubit המתאים לפני שהקוד הפנימי מוחל.

לדוגמה, דיאגרמת ה-Circuit שלמעלה שקולה לדיאגרמה הבאה. ניתן להסביר זאת בעזרת היחסים בין ZZ ו-CNOT Gate שתוארו לעיל, או פשוט על ידי הערכת ה-Circuit על מצב Qubit שרירותי ψ.\vert\psi\rangle.

Z error prior to the inner code for the 9-qubit Shor code

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

הנה דיאגרמת Circuit הכוללת את מעגל הקידוד, את השגיאה שהוצעה לעיל, יחד עם השלבים שתוארו זה עתה (אך לא שלב התיקון עצמו).

Z error detection for the 9-qubit Shor code

בדוגמה המסוימת הזו, מדידת הסינדרום היא 11,11, המאתרת את שגיאת ה-ZZ כמי שהתרחשה על אחד מה-Qubit בבלוק האמצעי.

יתרון אחד של תיקון שגיאות ZZ לאחר שלב הקידוד מחדש, ולא לפניו, הוא שנוכל לפשט את ה-Circuit שלמעלה. ה-Circuit הבא שקול, אך דורש ארבעה CNOT Gate פחות.

Simplified Z error detection for the 9-qubit Shor code

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

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

שגיאות היפוך ביט ופאזה בו-זמנית

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

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

כדי להבין מדוע, שקלו את הדוגמה המתוארת בדיאגרמת ה-Circuit הבאה, שבה הן שגיאת XX והן שגיאת ZZ השפיעו על ה-Qubit התחתון של הבלוק האמצעי.

An XZ error for the 9-qubit Shor code

נבחין קודם כל שסדר השגיאות לא משנה, במובן שהיפוך מיקום שגיאות ה-XX וה-ZZ נותן Circuit שקול. כדי להיות מדויקים, XX ו-ZZ לא מתחלפים, הם אנטי-מתחלפים:

XZ=(0110)(1001)=(0110)=(1001)(0110)=ZX.XZ = \begin{pmatrix} 0 & 1\\[1mm] 1 & 0 \end{pmatrix} \begin{pmatrix} 1 & 0\\[1mm] 0 & -1 \end{pmatrix} = \begin{pmatrix} 0 & -1\\[1mm] 1 & 0 \end{pmatrix} = - \begin{pmatrix} 1 & 0\\[1mm] 0 & -1 \end{pmatrix} \begin{pmatrix} 0 & 1\\[1mm] 1 & 0 \end{pmatrix} = -ZX.

מכאן נובע שה-Circuit הבא שקול לזה שלמעלה עד לגורם פאזה גלובלי של 1.-1.

A ZX error for the 9-qubit Shor code

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

A ZX error for the 9-qubit Shor code

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

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

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

הפחתת שגיאות עבור שגיאות אקראיות

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

כדי להיות יותר קונקרטיים, נבחן מודל רעש פשוט שבו שגיאות מתרחשות באופן עצמאי על ה-Qubit, כשכל Qubit חווה שגיאה בהסתברות pp, וללא קורלציה בין שגיאות על Qubit שונים — בדומה לערוץ סימטרי בינארי עבור ביטים קלאסיים. יכולנו להקצות הסתברויות שונות לשגיאות X,X, Y,Y, ו-ZZ להתרחש, אבל כדי לשמור על פשטות מרבית, נבחן את תרחיש הגרוע ביותר עבור קוד שור ב-9 Qubit: שגיאת YY מתרחשת על כל אחד מה-Qubit המושפעים. שגיאת YY, אגב, שקולה (עד לגורם פאזה גלובלי לא רלוונטי) לשגיאות XX וגם ZZ המתרחשות על אותו Qubit, כיוון ש-Y=iXZ.Y = iXZ. זה מסביר את ההתעלמות לכאורה שלנו משגיאות YY עד כה.

כעת, נניח ש-Q\mathsf{Q} הוא Qubit במצב מסוים שאנחנו רוצים להגן עליו מפני שגיאות, ונשקול את האפשרות להשתמש בקוד שור ב-9 Qubit. שאלה טבעית לשאול היא: "האם כדאי לנו להשתמש בו?"

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

קוד שור מתקן כל שגיאת פאולי על Qubit בודד, כולל כמובן שגיאת YY, אבל הוא אינו מתקן כראוי שתי שגיאות YY או יותר. כדי להיות ברורים, אנחנו מניחים שאנחנו משתמשים בתיקוני שגיאות XX ו-ZZ שתוארו קודם בסעיף. (כמובן, אם ידענו מראש שנצטרך לדאוג רק לשגיאות YY, היינו בוחרים את התיקונים שלנו בצורה שונה — אבל זה רמאות בהינתן מודל הרעש, ותמיד נוכל לשנות את המודל על ידי בחירת שגיאות פאולי שונות כדי לגרום לבחירת תיקונים חדשה זו להיכשל כאשר שני Qubit או יותר מושפעים על ידי שגיאות.)

לכן, הקוד מגן על Q\mathsf{Q} כל עוד לכל היותר אחד מתשעת ה-Qubit מושפע על ידי שגיאה, מה שקורה בהסתברות

(1p)9+9p(1p)8.(1-p)^9 + 9 p (1-p)^8.

אחרת, בהסתברות

1(1p)99p(1p)8,1 - (1-p)^9 - 9 p (1-p)^8,

הקוד נכשל בהגנה על Q.\mathsf{Q}.

ספציפית, מה שזה אומר בהקשר הזה הוא שפעולת פאולי שאינה זהות תוחל על ה-Qubit שלנו Q\mathsf{Q} (כ-Qubit לוגי), עד לפאזה גלובלית. כלומר, אם שגיאות XX ו-ZZ מתגלות ומתוקנות עבור קוד שור כפי שתואר קודם בשיעור, נישאר עם הקידוד של מצב השקול, עד לפאזה גלובלית, לקידוד של פעולת פאולי שאינה זהות המוחלת על המצב המקורי של Q.\mathsf{Q}. דרך תמציתית יותר לומר זאת היא שהתרחשה שגיאה לוגית. ייתכן שיהיה לזה השפעה על המצב המקורי של Q\mathsf{Q} — או במילים אחרות ה-Qubit הלוגי שקידדנו עם תשעה Qubit פיזיים — ולא, אך לצורך ניתוח זה, אנחנו מחשיבים אירוע זה ככישלון.

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

1(1p)99p(1p)8<p.1 - (1-p)^9 - 9 p (1-p)^8 < p.

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

Error probability graph for independent Y errors using the Shor code

אם pp קטן מנקודת האיזון הזו, הקוד מועיל; בנקודת האיזון ההסתברויות שוות, כך שאנחנו פשוט מבזבזים זמן יחד עם 8 Qubit אם אנחנו משתמשים בקוד; ומעבר לנקודת האיזון בהחלט אסור להשתמש בקוד זה מכיוון שהוא מגדיל את הסיכוי לשגיאה לוגית על Q.\mathsf{Q}.

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