עכשיו נפנה את תשומת לבנו לבעיית פירוק גורמים שלמים, ונראה כיצד ניתן לפתור אותה ביעילות במחשב קוונטי באמצעות אומדן פאזה.
האלגוריתם שנקבל הוא אלגוריתם שור לפירוק גורמים שלמים.
שור לא תיאר את האלגוריתם שלו במפורש במונחים של אומדן פאזה, אך זוהי דרך טבעית ואינטואיטיבית להסביר כיצד הוא עובד.
נתחיל בדיון על בעיית ביניים המכונה בעיית מציאת הסדר ונראה כיצד אומדן פאזה מספק פתרון לבעיה זו.
לאחר מכן נראה כיצד פתרון יעיל לבעיית מציאת הסדר מעניק לנו פתרון יעיל לבעיית פירוק גורמים שלמים.
(כאשר פתרון לבעיה אחת מספק פתרון לבעיה אחרת כך, אנחנו אומרים שהבעיה השנייה מצטמצמת לראשונה — כלומר במקרה זה אנחנו מצמצמים פירוק גורמים שלמים למציאת סדר.)
החלק השני הזה של אלגוריתם שור אינו משתמש כלל בחישוב קוונטי; הוא קלאסי לחלוטין.
חישוב קוונטי נחוץ רק לפתרון מציאת הסדר.
כדי להסביר את בעיית מציאת הסדר וכיצד ניתן לפתור אותה באמצעות אומדן פאזה, יהיה מועיל להתחיל עם כמה מושגים בסיסיים בתורת מספרים ולהציג בדרך גם סימונים שימושיים.
להתחלה, לכל מספר שלם חיובי נתון N, נגדיר את הקבוצה ZN כך:
ZN={0,1,…,N−1}
לדוגמה,
Z1={0},Z2={0,1},Z3={0,1,2},
וכן הלאה.
אלו הן קבוצות של מספרים, אך אפשר לחשוב עליהן כיותר מסתם קבוצות.
בפרט, אפשר לחשוב על פעולות חשבוניות על ZN כגון חיבור וכפל — ואם נסכים תמיד לקחת את התוצאות מודולו N
(כלומר, לחלק ב-N ולקחת את השארית כתוצאה), תמיד נישאר בתוך הקבוצה הזו כשנבצע פעולות אלו.
שתי הפעולות הספציפיות של חיבור וכפל, שתיהן מודולו N, הופכות את ZN לחוג, שהוא סוג אובייקט חשוב ביסודו באלגברה.
לדוגמה, 3 ו-5 הם איברים של Z7, ואם נכפיל אותם יחד נקבל 3⋅5=15, שמשאיר שארית 1 בחלוקה ב-7.
לפעמים אנחנו מביעים זאת כך:
3⋅5≡1(mod 7)
אבל אפשר גם פשוט לכתוב 3⋅5=1, בתנאי שהובהר שאנחנו עובדים ב-Z7, כדי לשמור על הסימונים פשוטים ככל האפשר.
מבין N האיברים של ZN, האיברים a∈ZN המקיימים gcd(a,N)=1 הם מיוחדים.
לעתים קרובות הקבוצה המכילה איברים אלו מסומנת בכוכבית כך:
ZN∗={a∈ZN:gcd(a,N)=1}
אם נתמקד בפעולת הכפל, הקבוצה ZN∗ יוצרת חבורה — ספציפית חבורה אבלית — שהיא גם כן סוג אובייקט חשוב באלגברה.
עובדה בסיסית על קבוצות אלו (ועל חבורות סופיות בכלל) היא שאם נבחר איבר כלשהו a∈ZN∗ ונכפיל את a בעצמו שוב ושוב, תמיד נגיע בסוף למספר 1.
כדוגמה ראשונה, ניקח N=6.5∈Z6∗ מכיוון ש-gcd(5,6)=1, ואם נכפיל 5 בעצמו נקבל 1,
כפי שהלוח שלמעלה מאשר.
52=1(working within Z6)
כדוגמה שנייה, ניקח N=21.
אם נעבור על המספרים מ-0 עד 20, אלו שיש להם מחלק משותף גדול ביותר שווה ל-1 עם 21 הם:
Z21∗={1,2,4,5,8,10,11,13,16,17,19,20}
לכל אחד מהאיברים האלה, ניתן להעלות את המספר לחזקה של מספר שלם חיובי ולקבל 1.
הנה החזקות הקטנות ביותר שעבורן זה עובד:
קלט: מספרים שלמים חיוביים N ו-a המקיימים gcd(N,a)=1
פלט: המספר השלם החיובי הקטן ביותר r כך ש-ar≡1(mod N)
לחלופין, במונחי הסימון שהצגנו לעיל, ניתן לנו a∈ZN∗, ואנחנו מחפשים את המספר השלם החיובי הקטן ביותר r כך ש-ar=1.
מספר זה r נקרא הסדר של a מודולו N.
כדי לקשור את בעיית מציאת הסדר לאומדן פאזה, בואו נחשוב על הפעולה המוגדרת על מערכת שהמצבים הקלאסיים שלה מתאימים ל-ZN, שבה אנחנו כופלים באיבר קבוע a∈ZN∗.
Ma∣x⟩=∣ax⟩(for each x∈ZN)
להיות מדויק, אנחנו מבצעים את הכפל ב-ZN, כך שמשתמע שאנחנו לוקחים את המכפלה מודולו N בתוך ה-ket בצד ימין של המשוואה.
לדוגמה, אם ניקח N=15 ו-a=2, אז הפעולה של M2 על הבסיס הסטנדרטי {∣0⟩,…,∣14⟩} היא כדלקמן:
זוהי פעולה אוניטרית בתנאי ש-gcd(a,N)=1; היא מערבבת את איברי הבסיס הסטנדרטי {∣0⟩,…,∣N−1⟩}, ולכן כמטריצה היא מטריצת תמורה.
ברור מהגדרתה שפעולה זו היא דטרמיניסטית, ודרך פשוטה לראות שהיא הפיכה היא לחשוב על הסדר r של a מודולו N, ולהכיר שההופכי של Ma הוא Mar−1.
Mar−1Ma=Mar=Mar=M1=I
יש דרך נוספת לחשוב על ההופכי שאינה דורשת ידיעה של r (שהרי זה מה שאנחנו מנסים לחשב).
לכל איבר a∈ZN∗ יש תמיד איבר יחיד b∈ZN∗ המקיים ab=1.
אנחנו מסמנים איבר זה b ב-a−1, וניתן לחשב אותו ביעילות;
הרחבה של אלגוריתם המחלק המשותף הגדול של אוקלידס עושה זאת בעלות ריבועית ב-lg(N).
ולכן
Ma−1Ma=Ma−1a=M1=I.
אז הפעולה Ma היא גם דטרמיניסטית וגם הפיכה.
זה משמעו שהיא מתוארת על ידי מטריצת תמורה, ולכן היא אוניטרית.
עכשיו בואו נחשוב על הווקטורים העצמיים והערכים העצמיים של הפעולה Ma, בהנחה ש-a∈ZN∗.
כפי שנטען זה עתה, הנחה זו אומרת לנו ש-Ma היא אוניטרית.
יש N ערכים עצמיים של Ma, אפשרי שאותו ערך עצמי חוזר מספר פעמים, ובכלל יש חופש מסוים בבחירת הווקטורים העצמיים המתאימים — אבל לא נצטרך להתעסק עם כל האפשרויות.
נתחיל בפשטות ונזהה ווקטור עצמי אחד של Ma.
∣ψ0⟩=r∣1⟩+∣a⟩+⋯+∣ar−1⟩
המספר r הוא הסדר של a מודולו N, כאן ולאורך שאר השיעור.
הערך העצמי המשויך לווקטור עצמי זה הוא 1 מכיוון שאינו משתנה כשכופלים ב-a.
זה קורה מכיוון ש-ar=1, כך שכל מצב בסיס סטנדרטי ∣ak⟩ עובר ל-∣ak+1⟩ עבור k≤r−1, ו-∣ar−1⟩ עובר חזרה ל-∣1⟩.
בצורה לא פורמלית, זה כאילו אנחנו מערבבים לאט את ∣ψ0⟩, אבל הוא כבר מעורבב לגמרי ולכן כלום לא משתנה.
הנה דוגמה נוספת לווקטור עצמי של Ma.
זה מתגלה כמעניין יותר בהקשר של מציאת סדר ואומדן פאזה.
∣ψ1⟩=r∣1⟩+ωr−1∣a⟩+⋯+ωr−(r−1)∣ar−1⟩
לחלופין, אפשר לכתוב ווקטור זה באמצעות סכימה כך:
∣ψ1⟩=r1k=0∑r−1ωr−k∣ak⟩
כאן אנחנו רואים את המספר המרוכב ωr=e2πi/r מופיע באופן טבעי, בשל האופן שבו כפל ב-a עובד מודולו N.
הפעם הערך העצמי המתאים הוא ωr.
כדי לראות זאת, נוכל לחשב תחילה כך:
כדי לפתור את בעיית מציאת הסדר עבור בחירה נתונה של a∈ZN∗, אפשר להפעיל את הליך אומדן הפאזה על הפעולה Ma.
לשם כך, עלינו לממש ביעילות לא רק את Ma בעזרת Circuit קוונטי, אלא גם את Ma2,Ma4,Ma8, וכן הלאה, כמה שנצטרך כדי לקבל אומדן מדויק מספיק מהליך אומדן הפאזה.
כאן נסביר כיצד ניתן לעשות זאת, ונגלה בדיוק כמה דיוק נחוץ בהמשך.
נתחיל עם הפעולה Ma כשלעצמה.
מטבע הדברים, מכיוון שאנחנו עובדים עם מודל ה-Circuit הקוונטי, נשתמש בייצוג בינארי לקידוד המספרים בין 0 ל-N−1.
המספר הגדול ביותר שנצטרך לקודד הוא N−1, כך שמספר הביטים שנצטרך הוא
n=lg(N−1)=⌊log(N−1)⌋+1.
לדוגמה, אם N=21 יש לנו n=lg(N−1)=5.
הנה איך נראה הקידוד של איברי Z21 כמחרוזות בינאריות באורך 5:
0↦000001↦00001⋮20↦10100
ועכשיו, הנה הגדרה מדויקת של כיצד Ma מוגדרת כפעולה של n-Qubit.
Ma∣x⟩={∣ax(modN)⟩∣x⟩0≤x<NN≤x<2n
הנקודה היא שאמנם אכפת לנו רק מהאופן שבו Ma פועלת על ∣0⟩,…,∣N−1⟩, אך עלינו לציין כיצד היא פועלת על 2n−N מצבי הבסיס הסטנדרטי הנותרים — ועלינו לעשות זאת באופן שעדיין נותן לנו פעולה אוניטרית.
הגדרת Ma כך שלא תעשה כלום למצבי הבסיס הסטנדרטי הנותרים משיגה זאת.
באמצעות האלגוריתמים לכפל שלמים ולחלוקה שנדונו בשיעור הקודם, יחד עם המתודולוגיה למימושים הפיכים ונטולי-זבל שלהם, אפשר לבנות Circuit קוונטי המבצע את Ma, לכל בחירה של a∈ZN∗, בעלות O(n2).
הנה אחת הדרכים שניתן לעשות זאת:
בנה Circuit לביצוע הפעולה
∣x⟩∣y⟩↦∣x⟩∣y⊕fa(x)⟩
כאשר
fa(x)={ax(modN)x0≤x<NN≤x<2n
באמצעות השיטה שתוארה בשיעור הקודם.
זה נותן לנו Circuit בגודל O(n2).
החלף את שני המערכות של n-Qubit באמצעות n שערי SWAP כדי להחליף את ה-Qubit-ים בנפרד.
בדומה לשלב הראשון, בנה Circuit לפעולה
∣x⟩∣y⟩↦∣x⟩y⊕fa−1(x)⟩
כאשר a−1 הוא ההופכי של a ב-ZN∗.
על ידי אתחול ה-Qubit-ים התחתונים של n וחיבור שלושת השלבים, מקבלים את הטרנספורמציה הבאה:
השיטה דורשת qubit-ים לסביבת עבודה, אך הם מוחזרים למצב האתחולי שלהם בסוף, מה שמאפשר לנו להשתמש ב-Circuit-ים אלו לאומדן פאזה.
העלות הכוללת של ה-Circuit שאנחנו מקבלים היא O(n2).
כדי לבצע את Ma2,Ma4,Ma8, וכן הלאה, אפשר להשתמש בדיוק באותה שיטה, אלא שנחליף את a ב-a2,a4,a8, וכן הלאה, כאיברים של ZN∗.
כלומר, לכל חזקה k שנבחר, נוכל ליצור Circuit עבור Mak לא על ידי איטרציה k פעמים של ה-Circuit עבור Ma, אלא במקום זאת על ידי חישוב b=ak∈ZN∗ ואז שימוש ב-Circuit עבור Mb.
חישוב חזקות ak∈ZN הוא בעיית האקספוננציאציה המודולרית שהוזכרה בשיעור הקודם.
חישוב זה ניתן לעשות קלאסית, באמצעות האלגוריתם לאקספוננציאציה מודולרית שהוזכר בשיעור הקודם (לעתים קרובות מכונה אלגוריתם החזקה בתורת המספרים החישובית).
למעשה, אנחנו דורשים רק חזקות-של-2 של a, ספציפית
a2,a4,…a2m−1∈ZN∗, ואנחנו יכולים לקבל את החזקות האלה על ידי ריבוע איטרטיבי m−1 פעמים.
כל ריבוע ניתן לביצוע על ידי Circuit בוליאני בגודל O(n2).
בעיקרון, מה שאנחנו עושים כאן בפועל הוא להעביר את בעיית איטרציית Ma עד 2m−1 פעמים לחישוב קלאסי יעיל.
ומזל גדול שזה אפשרי!
לבחירה שרירותית של Circuit קוונטי בבעיית אומדן הפאזה, זה כנראה לא יהיה אפשרי — ובמקרה כזה העלות המתקבלת לאומדן הפאזה גדלה אקספוננציאלית במספר qubit-י הבקרה m.
כדי להבין כיצד ניתן לפתור את בעיית מציאת הסדר בעזרת אמידת פאזה, נתחיל בהנחה שאנחנו מריצים את הליך אמידת הפאזה על הפעולה Ma תוך שימוש בוקטור העצמי ∣ψ1⟩.
להשיג את הוקטור העצמי הזה זה לא דבר פשוט, כפי שנראה — אז זו לא תהיה סוף הסיפור — אבל מועיל להתחיל מכאן.
ערך העצמי של Ma המתאים לוקטור העצמי ∣ψ1⟩ הוא
ωr=e2πir1.
כלומר, ωr=e2πiθ עבור θ=1/r.
לכן, אם נריץ את הליך אמידת הפאזה על Ma תוך שימוש בוקטור העצמי ∣ψ1⟩, נקבל קירוב ל-1/r.
על ידי חישוב ההופכי נוכל ללמוד את r — בתנאי שהקירוב שלנו מדויק מספיק.
בפירוט רב יותר, כשמריצים את הליך אמידת הפאזה עם m qubit בקרה, מה שמתקבל הוא מספר
y∈{0,…,2m−1}.
לאחר מכן לוקחים y/2m כניחוש עבור θ, שהוא 1/r במקרה שלנו.
כדי לגלות מה הוא r מהקירוב הזה, הדבר הטבעי הוא לחשב את ההופכי של הקירוב ולעגל למספר השלם הקרוב ביותר.
⌊y2m+21⌋
לדוגמה, נניח ש-r=6 ואנחנו מבצעים אמידת פאזה על Ma עם הוקטור העצמי ∣ψ1⟩ תוך שימוש ב-m=5 ביטי בקרה.
הקירוב הטוב ביותר ב-5 ביטים ל-1/r=1/6 הוא 5/32, ויש לנו סיכוי לא רע (כ-68% במקרה זה) לקבל את התוצאה y=5 מאמידת הפאזה.
יש לנו
y2m=532=6.4,
ועיגול למספר השלם הקרוב ביותר נותן 6, שהוא התשובה הנכונה.
מצד שני, אם לא נשתמש בדיוק מספיק, ייתכן שלא נקבל את התשובה הנכונה.
למשל, אם ניקח m=4 qubit בקרה באמידת הפאזה, נוכל לקבל את הקירוב הטוב ביותר ב-4 ביטים ל-1/r=1/6, שהוא 3/16.
נטילת ההופכי נותנת
y2m=316=5.333⋯
ועיגול למספר השלם הקרוב ביותר נותן תשובה שגויה — 5.
אז כמה דיוק אנחנו צריכים כדי לקבל את התשובה הנכונה?
אנחנו יודעים ש-r הוא מספר שלם, ובאופן אינטואיטיבי מה שצריך הוא דיוק מספיק כדי להבדיל בין 1/r לבין אפשרויות סמוכות, כולל 1/(r+1) ו-1/(r−1).
המספר הקרוב ביותר ל-1/r שצריך להדאיג אותנו הוא 1/(r+1), והמרחק בין שני המספרים הללו הוא
r1−r+11=r(r+1)1.
לכן, אם נרצה לוודא שלא נטעה בין 1/r ל-1/(r+1), מספיק להשתמש בדיוק מספיק כדי להבטיח שהקירוב הטוב ביותר y/2m ל-1/r קרוב יותר ל-1/r מאשר ל-1/(r+1).
אם נשתמש בדיוק מספיק כדי להבטיח ש
2my−r1<2r(r+1)1,
כך שהשגיאה קטנה מחצי המרחק בין 1/r ל-1/(r+1), אז y/2m יהיה קרוב יותר ל-1/r מאשר לכל אפשרות אחרת, כולל 1/(r+1) ו-1/(r−1).
ניתן לאמת זאת באופן הבא.
נניח ש
2my=r1+ε
עבור ε המקיים
∣ε∣<2r(r+1)1.
כשנוטלים את ההופכי מקבלים
y2m=r1+ε1=1+εrr=r−1+εrεr2.
על ידי מקסום המונה ומינום המכנה, ניתן לחסום את המרחק מ-r כך:
1+εrεr2≤1−2r(r+1)r2r(r+1)r2=2r+1r<21
אנחנו פחות מ-1/2 רחוקים מ-r, ולכן כצפוי נקבל r כשנעגל.
לרוע המזל, מכיוון שעדיין לא ידוע לנו מה הוא r, אנחנו לא יכולים להשתמש בו כדי לדעת כמה דיוק אנחנו צריכים.
מה שניתן לעשות במקום זאת הוא להשתמש בעובדה ש-r חייב להיות קטן מ-N כדי להבטיח שנשתמש בדיוק מספיק.
בפרט, אם נשתמש בדיוק מספיק כדי להבטיח שהקירוב הטוב ביותר y/2m ל-1/r מקיים
2my−r1≤2N21,
אז יהיה לנו דיוק מספיק לקבוע נכון את r כשנחשב את ההופכי.
נטילת m=2lg(N)+1 מבטיחה שיש לנו סיכוי גבוה לקבל אמידה ברמת דיוק זו בשיטה שתוארה קודם.
(נטילת m=2lg(N) מספיקה אם מסתפקים בחסם תחתון של 40% על הסתברות ההצלחה.)
כפי שראינו זה עתה, אם יש לנו את הוקטור העצמי ∣ψ1⟩ של Ma, אנחנו יכולים ללמוד את r דרך אמידת פאזה, כל עוד משתמשים במספר מספיק של qubit בקרה לביצוע זאת עם דיוק מספיק.
לרוע המזל, לא קל להשיג את הוקטור העצמי ∣ψ1⟩, ולכן צריך לגלות כיצד להמשיך.
נניח לרגע שאנחנו ממשיכים בדיוק כמו לעיל, אך עם הוקטור העצמי ∣ψk⟩ במקום ∣ψ1⟩, לכל בחירה של k∈{0,…,r−1} שנבחר לחשוב עליה.
התוצאה שנקבל מהליך אמידת הפאזה תהיה קירוב
2my≈rk.
בהנחה שאנחנו לא יודעים לא את k ולא את r, ייתכן שיאפשר לנו לזהות את r ואולי לא.
למשל, אם k=0 נקבל קירוב y/2m לאפס, שלמרבה הצער אינו מלמד אותנו כלום.
אולם מדובר במקרה יוצא דופן; עבור ערכים אחרים של k, נוכל לפחות ללמוד משהו על r.
ניתן להשתמש באלגוריתם הידוע בשם אלגוריתם השברים המשורשרים כדי להפוך את הקירוב y/2m לשברים קרובים — כולל k/r אם הקירוב מדויק מספיק.
לא נסביר כאן את אלגוריתם השברים המשורשרים.
במקום זאת, הנה פירוט של עובדה ידועה על אלגוריתם זה.
עובדה
בהינתן מספר שלם N≥2 ומספר ממשי α∈(0,1), קיים לכל היותר מספר שלם אחד u,v∈{0,…,N−1} עם v=0 ו-gcd(u,v)=1 המקיים ∣α−u/v∣<2N21.
בהינתן α ו-N,אלגוריתם השברים המשורשרים מוצא את u ואת v, או מדווח שאינם קיימים.
ניתן לממש אלגוריתם זה כמעגל בוליאני בגודל O((lg(N))3).
אם יש לנו קירוב קרוב מאוד y/2m ל-k/r, ונריץ את אלגוריתם השברים המשורשרים עבור N ו-α=y/2m, נקבל את u ואת v כפי שמתוארים בעובדה.
ניתוח העובדה מאפשר לנו להסיק ש
vu=rk.
שימו לב בפרט שאנחנו לא בהכרח לומדים את k ואת r, אנחנו רק לומדים את k/r בצורה מצומצמת.
לדוגמה, וכפי שכבר ציינו, לא נלמד כלום מ-k=0.
אבל זה הערך היחיד של k שבו זה קורה.
כאשר k אינו אפס, יתכן שיש לו מחלקים משותפים עם r, אבל המספר v שנקבל מאלגוריתם השברים המשורשרים חייב לפחות לחלק את r.
זה לא מובן מאליו, אבל אכן נכון שאם יש לנו יכולת ללמוד את u ואת v עבור u/v=k/r עבור k∈{0,…,r−1} שנבחר אחיד אקראית, אז סביר מאוד שנוכל לשחזר את r לאחר מספר קטן של דגימות.
בפרט, אם הניחוש שלנו ל-r הוא המכפל המשותף הקטן ביותר של כל ערכי המכנה v שאנחנו צופים בהם, נהיה צודקים עם הסתברות גבוהה.
בצורה אינטואיטיבית, ערכים מסוימים של k אינם טובים מפני שיש להם מחלקים משותפים עם r, והמחלקים הללו נסתרים ממנו כשאנחנו לומדים את u ואת v.
אבל בחירות אקראיות של k אינן צפויות להסתיר מחלקים של r לאורך זמן, וההסתברות שלא ניחש נכון את r על ידי נטילת המכפל המשותף הקטן ביותר של המכנים שאנחנו צופים בהם יורדת בצורה מעריכית במספר הדגימות.
נותר לטפל בשאלה כיצד להשיג וקטור עצמי ∣ψk⟩ של Ma עליו להריץ את הליך אמידת הפאזה.
כפי שמסתבר, בכלל לא צריך ליצור אותם!
מה שנעשה במקום זאת הוא להריץ את הליך אמידת הפאזה על המצב ∣1⟩, כלומר על הקידוד הבינארי של n ביטים של המספר 1, במקום וקטור עצמי ∣ψ⟩ של Ma.
עד כה דיברנו רק על הרצת הליך אמידת הפאזה על וקטור עצמי מסוים, אבל שום דבר לא מונע אותנו מלהריץ את ההליך על מצב כניסה שאינו וקטור עצמי של Ma, וזה בדיוק מה שאנחנו עושים כאן עם המצב ∣1⟩.
(זהו וקטור עצמי של Ma רק אם a=1, שזה לא בחירה שתעניין אותנו.)
ההנמקה לבחירה במצב ∣1⟩ במקום וקטור עצמי של Ma היא שהמשוואה הבאה נכונה.
∣1⟩=r1k=0∑r−1∣ψk⟩
דרך אחת לאמת משוואה זו היא להשוות את המכפלות הפנימיות של שני הצדדים עם כל מצב בסיס סטנדרטי, תוך שימוש בנוסחאות שהוזכרו קודם בשיעור כדי לעזור בהערכת התוצאות עבור הצד הימני.
כתוצאה מכך, נקבל בדיוק את אותן תוצאות מדידה כאילו בחרנו k∈{0,…,r−1} אחיד אקראית והשתמשנו ב-∣ψk⟩ כוקטור עצמי.
בפירוט רב יותר, בואו נדמיין שאנחנו מריצים את הליך אמידת הפאזה עם המצב ∣1⟩ במקום אחד מהוקטורים העצמיים ∣ψk⟩.
לאחר ביצוע התמרת פורייה הקוונטית ההפוכה, נקבל את המצב
r1k=0∑r−1∣ψk⟩∣γk⟩,
כאשר
∣γk⟩=2m1y=0∑2m−1x=0∑2m−1e2πix(k/r−y/2m)∣y⟩.
הוקטור ∣γk⟩ מייצג את המצב של m ה-Qubit העליונים לאחר שהתמרת פורייה הקוונטית ההפוכה בוצעה עליהם.
לכן, מתוך העובדה ש-{∣ψ0⟩,…,∣ψr−1⟩} הוא קבוצה אורתונורמלית, מוצאים שמדידה של m ה-Qubit העליונים
נותנת קירוב y/2m לערך k/r כאשר k∈{0,…,r−1} נבחר אחיד אקראית.
כפי שכבר דיברנו, זה מאפשר לנו ללמוד את r ברמת ביטחון גבוהה לאחר מספר הרצות עצמאיות, וזה היה המטרה שלנו.
עלות המימוש של כל יחידה מבוקרת Mak היא O(n2).
יש m פעולות יחידה מבוקרת, ו-m=O(n), ולכן העלות הכוללת של פעולות היחידה המבוקרת היא O(n3).
בנוסף, יש לנו m שערי הדאמארד (שתורמים O(n) לעלות), והתמרת פורייה הקוונטית ההפוכה תורמת O(n2) לעלות.
לכן, עלות פעולות היחידה המבוקרת שולטת בעלות של כל ההליך — שהיא לכן O(n3).
בנוסף למעגל הקוונטי עצמו, יש כמה חישובים קלאסיים שצריך לבצע בדרך.
זה כולל חישוב החזקות ak ב-ZN עבור k=2,4,8,…,2m−1, הנדרשות ליצירת שערי היחידה המבוקרת, וכן אלגוריתם השברים המשורשרים שממיר קירובים של θ לשברים.
ניתן לבצע חישובים אלה במעגלים בוליאניים בעלות כוללת של O(n3).
כפי שנהוג, ניתן לשפר את כל החסמים הללו בעזרת אלגוריתמים מהירים אסימפטוטית; חסמים אלה מניחים שימוש באלגוריתמים סטנדרטיים לפעולות חשבון בסיסיות.
הדבר האחרון שנותר לנו לדון בו הוא כיצד פתרון בעיית מציאת הסדר עוזר לנו לפרק למרכיבים ראשוניים.
החלק הזה הוא לגמרי קלאסי — אין לו שום קשר ספציפי לחישוב קוונטי.
הנה הרעיון הבסיסי.
אנחנו רוצים לפרק את המספר N, ואפשר לעשות זאת רקורסיבית.
ספציפית, אפשר להתמקד במשימת פיצולN, כלומר למצוא שני מספרים שלמים b,c≥2 כך ש-N=bc.
זה לא אפשרי אם N הוא מספר ראשוני, אבל אפשר לבדוק ביעילות אם N ראשוני באמצעות אלגוריתם בדיקת ראשוניות תחילה, ואם N אינו ראשוני ננסה לפצל אותו.
ברגע שמפצלים את N, אפשר פשוט להמשיך רקורסיבית על b ו-c עד שכל הגורמים שלנו יהיו ראשוניים ונקבל את הפירוק לגורמים ראשוניים של N.
פיצול מספרים זוגיים הוא פשוט: פשוט מוציאים 2 ו-N/2.
קל גם לפצל חזקות שלמות, כלומר מספרים מהצורה N=sj עבור מספרים שלמים s,j≥2, פשוט על ידי
קירוב השורשים N1/2,N1/3,N1/4, וכן הלאה, ובדיקת מספרים שלמים קרובים כמועמדים עבור s.
אין צורך להרחיק יותר מ-log(N) צעדים בסדרה הזו, כי בנקודה הזו השורש יורד מתחת ל-2 ולא יחשוף מועמדים נוספים.
טוב שאנחנו יכולים לעשות את שני הדברים האלה, כי מציאת סדר לא תעזור לנו לפרק מספרים זוגיים או חזקות של ראשוניים, שבהן המספר s הוא ראשוני במקרה.
אם N אי-זוגי ואינו חזקת ראשוני, לעומת זאת, מציאת סדר מאפשרת לנו לפצל את N.
אלגוריתם הסתברותי לפיצול מספר שלם אי-זוגי ומורכב N שאינו חזקת ראשוני
בחר אקראית a∈{2,…,N−1}.
חשב d=gcd(a,N).
אם d>1 אז הוצא b=d ו-c=N/d ועצור. אחרת המשך לשלב הבא בידיעה ש-a∈ZN∗.
יהי r הסדר של a מודולו N. (כאן נזדקק למציאת סדר.)
אם r זוגי:
5.1 חשב x=ar/2−1 מודולו N
5.2 חשב d=gcd(x,N).
5.3 אם d>1 אז הוצא b=d ו-c=N/d ועצור.
אם הגעת לנקודה הזו, האלגוריתם נכשל במציאת גורם של N.
הרצה של האלגוריתם הזה עשויה להיכשל במציאת גורם של N.
ספציפית, זה קורה בשני מצבים:
הסדר של a מודולו N הוא אי-זוגי.
הסדר של a מודולו N הוא זוגי ו-gcd(ar/2−1,N)=1.
תורת המספרים הבסיסית מוכיחה שעבור בחירה אקראית של a, בהסתברות של לפחות 1/2 אף אחד מהמקרים הללו לא קורה.
למעשה, ההסתברות שאחד מהאירועים הללו מתרחש היא לכל היותר 2−(m−1) כאשר m הוא מספר הגורמים הראשוניים השונים של N,
ולכן נדרשת ההנחה ש-N אינו חזקת ראשוני.
(גם ההנחה ש-N אי-זוגי נדרשת כדי שעובדה זו תהיה נכונה.)
משמעות הדבר היא שלכל הרצה יש סיכוי של לפחות 50% לפצל את N.
לכן, אם נריץ את האלגוריתם t פעמים, בכל פעם עם בחירה אקראית של a, נצליח לפצל את N בהסתברות של לפחות 1−2−t.
הרעיון הבסיסי שעומד מאחורי האלגוריתם הוא כדלקמן.
אם יש לנו בחירה של a שעבורה הסדר r של a מודולו N הוא זוגי, אז r/2 הוא מספר שלם ואפשר לבחון את
המספרים
ar/2−1(modN)andar/2+1(modN).
תוך שימוש בנוסחה Z2−1=(Z+1)(Z−1), אנחנו מסיקים ש-
(ar/2−1)(ar/2+1)=ar−1.
כעת, אנחנו יודעים ש-ar(modN)=1 לפי הגדרת הסדר — דרך אחרת לומר ש-N מחלק ללא שארית את ar−1.
כלומר N מחלק ללא שארית את המכפלה
(ar/2−1)(ar/2+1).
כדי שזה יתאפשר, כל הגורמים הראשוניים של N חייבים להיות גם גורמים ראשוניים של ar/2−1 או ar/2+1 (או שניהם) — ועבור בחירה אקראית של a מתברר שלא סביר שכל הגורמים הראשוניים של N יחלקו אחד מהאיברים בלבד ואף אחד לא יחלק את האחר.