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

האלגוריתמים הטובים ביותר הידועים, מפרקים מספר גדול \ n,לגורמיו בסיבוכיות זמן של {\displaystyle \ O(e^{(\log(n))^{1/3}(\log \log(n))^{2/3}})}, שאינה פולינומית ב-{\displaystyle \ O(\log(n))}. לעומת זאת, אלגוריתם שור פועל בסיבוכיות זמן של \ O(\log^3(n)). אלגוריתם זה מהווה דוגמה ליתרון אקספוננציאלי בסיבוכיות הזמן של אלגוריתמים קוונטיים לעומת אלגוריתם קלאסי.

השלכות ומשמעויות
----------------

שימוש באלגוריתם זה על מנת לפרק מספרים גדולים מהווה איום על אלגוריתמים מתחום ההצפנה האסימטרית, אשר מושתתים על פעולות מתמטיות עם מספרים גדולים, כגון RSA‏ ו-DSA. שיטות אלו מסתמכות על מספר גדול \ N בן 512–8192 סיביות (מספר בעל מאות ספרות), אשר ידוע לכלל. הגורמים הראשוניים של מספר זה מהווים את המפתח הסודי. שימוש באלגוריתם שור מאפשר מציאת המפתח באופן יעיל, כלומר, במספר "קטן" יחסית של פעולות. מסיבה זו נעשים מאמצים למצוא חלופות פוסט קוונטיות לאלגוריתמים הקיימים, כדי לתת מענה הולם כאשר המחשבים הקוונטיים יהיו מעשיים בקנה מידה המהווה איום מוחשי.

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

תיאור האלגוריתם לפירוק המספר \ N
--------------------------------

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

### השלב הקלאסי

1. בחר מספר כלשהו {\displaystyle \ a<N}.
2. בדוק האם ‎gcd (a, N) ≠ 1‏. אם כן - מצאנו גורם, סיים.
3. אם לא, בצע את השלב הקוונטי על מנת למצוא את המספר \ r, שהוא המחזור של הפונקציה

f
(
x
)
=

a

x

mod

N

{\displaystyle f(x)=a^{x}\mod N}

{\displaystyle f(x)=a^{x}\mod N}
4. אם המספר r המתקבל אי-זוגי, חזור לסעיף 1.
5. אחרת, בדוק האם {\displaystyle a^{r/2}\equiv -1\ (mod\ N)}.
	1. אם כן - חזור ל-1.
	2. אחרת, ל{\displaystyle a^{r/2}\pm 1} גורם ראשוני משותף עם N. חשב {\displaystyle \ gcd(a^{r/2}\pm 1,N)} וקבל גורם ראשוני של N.

(**הסבר**: אם \ r מחזור של \ f(x) אזי {\displaystyle \ a^{r}\equiv 1\ (mod\ N)}, כלומר, {\displaystyle \ a^{r}-1\equiv 0}. נפתח את הביטוי:

 
(

a

r

/

2

−
1
)
(

a

r

/

2

+
1
)
=
k
N
=
k

N

p

N

q

{\displaystyle \ (a^{r/2}-1)(a^{r/2}+1)=kN=kN\_{p}N\_{q}}

{\displaystyle \ (a^{r/2}-1)(a^{r/2}+1)=kN=kN_{p}N_{q}}
כאשר {\displaystyle \ N=N\_{p}N\_{q}}, הגורמים של N).
### השלב הקוואנטי

בחר מספר Q כך ש {\displaystyle N^{2}\leq Q\leq 2N^{2}} וכן Q הוא חזקה שלמה של 2, כלומר ניתן לכתיבה {\displaystyle \ Q=2^{q}} עבור q מספר טבעי.

1. אתחל שני אוגרים קוונטים, בגודל q קיוביטים כל אחד, למצב 



Q

−
1

/

2

∑

x
=
0

Q
−
1

|

x
⟩

|

0
⟩

{\displaystyle Q^{-1/2}\sum \_{x=0}^{Q-1}|x\rangle |0\rangle }

{\displaystyle Q^{-1/2}\sum _{x=0}^{Q-1}|x\rangle |0\rangle }
שהוא סופרפוזיציה של Q מצבים.  

2. הפעל את הפונקציה הקוונטית \ f(x) על האוגרים, לקבלת



Q

−
1

/

2

∑

x
=
0

Q
−
1

|

x
⟩

|

f
(
x
)
⟩

{\displaystyle Q^{-1/2}\sum \_{x=0}^{Q-1}|x\rangle |f(x)\rangle }

{\displaystyle Q^{-1/2}\sum _{x=0}^{Q-1}|x\rangle |f(x)\rangle }
3. בצע התמרת פורייה קוונטית על האוגר הראשון. מהתמרת {\displaystyle |x\rangle } מקבלים {\displaystyle Q^{-1/2}\sum \_{y}\omega ^{xy}\left|y\right\rangle }, כאשר {\displaystyle \ \omega ^{i}=e^{2\pi i/Q}}, ועל כן מצב האוגרים לאחר הפעלת השער הוא סופרפוזיציה של הרבה יותר מ \ Q מצבים, אך הרבה פחות מ {\displaystyle \ Q^{2}}:


Q

−
1

∑

x

∑

y

ω

x
y

|

y
⟩

|

f
(
x
)
⟩

{\displaystyle Q^{-1}\sum \_{x}\sum \_{y}\omega ^{xy}|y\rangle |f(x)\rangle }

{\displaystyle Q^{-1}\sum _{x}\sum _{y}\omega ^{xy}|y\rangle |f(x)\rangle }
4. בצע מדידה. מתקבל ערך {\displaystyle \ y\_{m}} כלשהו וערך {\displaystyle \ f(x\_{0})} כלשהו. ההסתברות למדוד את הזוג {\displaystyle \ y\_{m},f(x\_{0})} נתונה על ידי

{\displaystyle \left|Q^{-1}\sum \_{x:\,f(x)=f(x\_{0})}\omega ^{xy}\right|^{2}=Q^{-2}\left|\sum \_{b}\omega ^{(x\_{0}+rb)y}\right|^{2}}

הסתברות זו נובעת מקיומם של ערכים רבים של \ x עבורם {\displaystyle \ f(x)=f(x\_{0})}, כאשר כל האיברים הללו תורמים להסתברות למדוד את אותו המצב {\displaystyle |f(x\_{0})\rangle }. החלק הימני של השוויון נובע מהעובדה שהפונקציה \ f(x) מחזורית, בעלת מחזור r (בהנחה שהאבר \ x\_0 הקטן ביותר באותו מחזור, וb מקבל ערכים מ-0 עד {\displaystyle \ [Q-x\_{0}-1]/r}, אז הביטוי {\displaystyle \ x\_{0}+r\cdot b} כלל ה-\ xים הקטנים מ-\ Q המקיימים {\displaystyle \ f(x)=f(x\_{0})}).
5. מצא מספר \ c ומספר {\displaystyle \ r'}, כך ש {\displaystyle \ r'<N} ו {\displaystyle \ c/r'} קרוב מאוד ל{\displaystyle \ y/Q}, ובאופן מפורש, {\displaystyle \ |y/Q-c/r'|<1/2Q}.

6. קיים סיכוי גבוה מאוד כי {\displaystyle \ r'} הוא המחזור המבוקש. בדוק האם {\displaystyle \ f(x)=f(x+r')}. אם כן, סיים. אם לא - חזור על ביצוע האלגוריתם.

קישורים חיצוניים
----------------

* הסבר מפורט מאוד בעברית על אלגוריתם שור בפרק 9 עמ' 107 ואילך

הערות שוליים
------------

1. ↑  גרסה מתוקנת ומשופרת של המאמר של פיטר שור פירוק לראשוניים של מספרים בזמן פולינומי על ידי מחשב קוונטי (באנגלית)
2. ↑  שחר דולב, מהו מחשב קוונטי, באתר גלילאו 77, ‏01/2005
3. ↑   עמ' 131
4. ↑