בתורת המספרים, **אלגוריתם רו של פולרד** (באנגלית: Pollard's rho algorithm) הוא אלגוריתם הסתברותי לפירוק מספר שלם לגורמים, שפותח ב-1975 על ידי ג'ון פולרד. האלגוריתם מוצא גורם ראשוני אחד, בדרך כלל את הקטן ביותר, וסיבוכיות הריצה שלו מסדר הגודל של שורש הגורם הראשוני. זאת בניגוד לאלגוריתם הפירוק הנאיבי מחד, שסיבוכיות הריצה שלו מסדר גודל של שורש המספר שאותו מבקשים לפרק, ולאלגוריתמים המודרניים לפירוק מאידך, שסיבוכיות הריצה שלהם תת-אקספוננציאלית בלוגריתם של המספר. ב-1981 שימש האלגוריתם (בגרסה משופרת שלו) לפירוק מספר פרמה השמיני (כ-77 ספרות עשרוניות), ונמצא שיש לו גורם ראשוני קטן.

חיפוש התנגשויות
---------------

אלגוריתם rho של פולרד מבוסס על אלגוריתם פלויד למציאת מחזוריות, המטפל בפונקציה {\displaystyle \ f:S\rightarrow S} מקבוצה סופית \ S אל עצמה. איבר התחלתי {\displaystyle \ x\_{0}\in S} מגדיר באינדוקציה את סדרת הערכים שהפונקציה מקבלת, {\displaystyle \ x\_{n+1}=f(x\_{n})}. מכיוון שזו סדרה של ערכים בקבוצה סופית, היא מוכרחה לחזור על עצמה, והמסלול שהיא מתארת יהפוך למחזורי מאותו זמן והלאה. שיטת פולארד נקראת "שיטת \ \rho", בגלל צורת האות היוונית הדומה לתיאור סכמתי של המחזור.

עקרון שובך היונים מבטיח חזרה בתוך {\displaystyle \ n=|S|} צעדים, ולא פחות; עם זאת, אם הפונקציה f אקראית, אז פרדוקס יום הולדת מביא לחזרה בתוך זמן קצר בהרבה - {\displaystyle \ {\sqrt {\pi n/2}}+O(1)} צעדים, בתוחלת.

בעיית המחזוריות מבקשת למצוא התנגשות מפורשת; קרי, למצוא, ביעילות, אינדקסים \ i\neq j שעבורם {\displaystyle \ x\_{i}=x\_{j}}. הדרך הנאיבית היא לאחסן את הרצף \ x\_{i} בזיכרון (למשל באמצעות טבלת גיבוב) ולחפש בכל צעד כפילויות עם הערכים הקודמים. שיטה זו דורשת זיכרון מסדר הגודל של מספר הערכים שיתקבלו עד להתנגשות הראשונה, ובמקרים רבים זו דרישה בלתי מעשית. 

ב-1960 פיתח רוברט פלויד אלגוריתם אלגנטי המוצא התנגשות תוך שימוש בזיכרון זניח בלבד: בחישוב סדרת הערכים, מחשבים במקביל גם את אותה סדרה במהירות כפולה. היינו, מתחילים בזוג ערכים {\displaystyle \ (x\_{0},x\_{0})}, ובכל צעד מחליפים את הזוג {\displaystyle \ (x\_{i},x\_{2i})} בזוג 
{\displaystyle \ (x\_{i+1},x\_{2(i+1)})=(f(x\_{i}),f(f(x\_{2i})))}, ומשווים את שני הרכיבים. ברגע שמתקבל השוויון {\displaystyle \ x\_{m}=x\_{2m}}, נמצאה התנגשות.

שימוש למציאת גורמים
-------------------

כדי למצוא גורם ראשוני של מספר נתון n, הציע פולארד לבחור פונקציה אריתמטית כמו {\displaystyle \ f(x)=x^{2}+1}, המחושבת מנקודת התחלה אקראית מודולו n. ההיוריסטיקה קובעת שפונקציה כזו מתנהגת כמו פונקציה אקראית. בהתאם לאלגוריתם של פלויד, מחשבים שני רצפים במקביל, לאורך אותם ערכים, כשהאחד נע במהירות כפולה מחברו. השוואת בני הזוג {\displaystyle \ x\_{2m},x\_{m}} אינה מתבצעת מודולו n, אלא על ידי חישוב המחלק המשותף המרבי של {\displaystyle \ x\_{i}-x\_{j}} ו-\ n. הרעיון הוא שסדרת הערכים \ x\_{i}, המחושבת מודולו n, **מוגדרת** מודולו כל גורם ראשוני p של n (גם אם p אינו ידוע), ולכן היא מהווה גם סדרה של ערכים במרחב של p השאריות בחלוקה ל-p. התנגשות במרחב הקטן הזה, שאמורה להתרחש בתוך {\displaystyle \ O({\sqrt {p}})} צעדים, תזוהה מיד, מכיוון שההפרש באותו זמן יהיה 0 מודולו p, כך ש-p יחלק את המחלק המשותף המקסימלי {\displaystyle \ \operatorname {gcd} (n,x\_{2m}-x\_{m})}. יש גם סיכוי לכך שההתנגשות תתרחש בו זמנית מודולו כל גורם (חזקת-)ראשוני של n, ואז המחלק המשותף המקסימלי יהיה n, והאלגוריתם נכשל.

האלגוריתם
---------

גרסה בסיסית של אלגוריתם rho עם הפונקציה: {\displaystyle \ f(x)=x^{2}+1}.

1. קבע {\displaystyle \ a=2,b=2}
2. עבור {\displaystyle \ i=1,2,...} בצע כדלהלן:

א. חשב את: {\displaystyle \ a=(a^{2}+1){\mbox{ mod }}n}.
ב. חשב את {\displaystyle \ b=(b^{2}+1){\mbox{ mod }}n} ושוב: {\displaystyle \ b=(b^{2}+1){\mbox{ mod }}n}.
ג. חשב את {\displaystyle \ d={\mbox{gcd}}(|a-b|,n)}
אם {\displaystyle \ d>1} אזי \ d הוא גורם של \ n אחרת,
אם {\displaystyle \ d=n}, האלגוריתם מסתיים בכישלון.
**הערה:** הסיכויים ש-{\displaystyle \ d=n} אינם גבוהים, אך אם בכל זאת האלגוריתם מסתיים כאשר {\displaystyle \ d=n} ישנן מספר אפשרויות. אחת היא לחזור על האלגוריתם עם ערכים התחלתיים שונים. השנייה היא לחזור על האלגוריתם עם פולינום אחר, בעל מקדם חופשי גבוה מ-1 למשל {\displaystyle \ f(x)=x^{2}+c} אם {\displaystyle \ c\neq 0,-2}. 

בהנחה שהפונקציה {\displaystyle \ f(x)=(x^{2}+1){\mbox{ mod }}p} מתנהגת כפונקציה אקראית, זמן הריצה המשוער של האלגוריתם הוא {\displaystyle \ O({\sqrt {p}})} צעדים אריתמטיים (של כפל מודולרי) ועל כן הזמן המשוער למציאת גורם לא טריוויאלי של \ n הוא {\displaystyle \ O(n^{1/4})}.

דוגמה במספרים קטנים
-------------------

הטבלה הבאה מציגה את הלולאה הראשית (שלב 2) באלגוריתם בפירוק המספר {\displaystyle \ n=206360731} : 

|  | \ a | \ b | {\displaystyle \ {\mbox{gcd}}(|a-b|,n)} |
| --- | --- | --- | --- |
| \ 1 | \ 5 | {\displaystyle \ 26} | \ 1 |
| \ 2 | {\displaystyle \ 26} | {\displaystyle \ 458330} | \ 1 |
| {\displaystyle \ 3} | {\displaystyle \ 677} | {\displaystyle \ 41654832} | \ 1 |
| {\displaystyle \ 4} | {\displaystyle \ 458330} | {\displaystyle \ 170662567} | \ 1 |
| \ 5 | {\displaystyle \ 197525474} | {\displaystyle \ 129619099} | {\displaystyle \ 167} |

נמצא ש-{\displaystyle \ 167} הוא אחד הגורמים, למעשה הגורם הקטן ביותר של {\displaystyle \ 206360731}. יתר הגורמים הם {\displaystyle \ 1409} ו-{\displaystyle \ 877}.

גרסה משופרת של האלגוריתם
------------------------

ריצ'רד ברנט פרסם ב-1980 גרסה משופרת של אלגוריתם rho המכונה אלגוריתם פירוק לגורמים מונטה קרלו משופר, המציע שיפור של כ-36 אחוז במקרה הממוצע, ביחס לאלגוריתם המקורי. במקום להשתמש באלגוריתם מחזוריות של פלויד כפי שעושה האלגוריתם של פולרד, אלגוריתם ברנט משתמש בשיטה שונה הנקראת back-tracking (נסיגה) כדי לאתר את מחזוריות הרצף ולמנוע חזרה מיותרת.

קוד C של אלגוריתם מונטה קרלו של ברנט:

```
int BrentPollard(int n, int x0, int m)
{
 int g, x, y = x0, ys, r = 1, q = 1;
 do{
 x = y;
 for(int i = 1; i < r; i++) 
 {
 y = f(y, n);
 }
 int k = 0; 
 do{ 
 ys = y;
 for(int j = 1; j < MIN(m, r-k); j++)
 {
 y = f(y, n);
 q = (q \* ABS(x-y)) % n;
 }
 g = gcd(q, n);
 k += m;
 } while( k < r && g <= 1);
 r <<= 1;
 } while(g <= 1);
 if(g == n)
 {
 do{
 ys = f(ys, n);
 g = gcd(ABS(x - ys), n);
 } while(g <= 1); 
 if(g == n) return 0;
 }
 return g;
}

```

הקלט: \ n הוא המספר המיועד לפירוק, \ m מספר אקראי כלשהו הנמוך מ-\ n, ו-\ x\_0 הוא ערך התחלתי כלשהו בדרך כלל 2. הפונקציה {\displaystyle \ {\mbox{f(x,n)}}} אמורה להיות פונקציה אקראית כלשהי מודולו \ n, כמו {\displaystyle \ f(x)=(x^{2}+3){\mbox{ mod }}n}, המאקרו ABS מייצג ערך מוחלט והפונקציה gcd היא אלגוריתם אוקלידס.

יעילות
------

אלגוריתם rho של פולרד מספק איזון הדדי בין זמן הריצה לבין סיכוי ההצלחה. במקרה הקשה כאשר המספר הוא כפולה של שני גורמים ראשוניים שווים בגודלם בערך, זמן ריצה משוער של {\displaystyle \ O(n^{1/4}\operatorname {polylog} (n))} צעדים, יניב גורם ראשוני בסיכויים של חצי בהערכה גסה (אף על פי שזוהי הערכה היוריסטית בלבד). שאלת יעילות האלגוריתם המדויקת היא בעיה פתוחה.

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

ההישג המשמעותי ביותר של האלגוריתם היה של גרסת ברנט המשופרת, איתה הצליחו ג'ון פולרד וריצ'רד ברנט לפרק את מספר פרמה השמיני {\displaystyle \ F\_{8}=2^{2^{8}}+1} בזמן כולל של שעתיים על מחשב מרכזי מדגם UNIVAC.

ראו גם
------

* פירוק לגורמים של מספר שלם
* אלגוריתם רו של פולרד ללוגריתמים

לקריאה נוספת
------------

* המאמר של ריצ'רד ברנט An Improved Monte Carlo Factorization Algorithm
* הספר Handbook of Applied Cryptography, פרק 3.
* דונלד קנות', **The art of computer programming**. Vol 2: Seminumerical Algorithms.

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

* אלגוריתם rho של פולרד, באתר MathWorld (באנגלית)

| * צ
* ש
* ע
קריפטוגרפיה |
| --- |
| 

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

 |

 |
| 

| הצפנה קלאסית |
| --- |
| 
* מכונת הצפנה
* צופן החלפה
* צופן אתב"ש
* צופן קיסר
* צופן ויז'נר
* צופן ורנם
* צופן פלייפייר
* צופן היל
* אולטרה
* אניגמה
* ציקלומטר
* קולוסוס
* PURPLE
* ג'ייד
* מג'יק
* צופן שחלוף

 |

 |
| 

| צופן בלוקים |
| --- |
| 
* לוציפר
* AES
* 3DES
* DES
* Threefish
* Twofish
* Blowfish
* FEAL
* SEED
* CAST
* IDEA
* RC2
* RC6
* MARS
* RC5
* GOST
* Serpent
* MISTY
* KASUMI
* קמליה
* ARIA
* SAFER
* TEA
* LEA
* CLEFIA
* SEA
* Hummingbird
* PRESENT
* KATAN
* KeeLoq
* Simon & Speck
* אנוביס

 |

 |
| 

| אופני הפעלה |
| --- |
| 
* אופן הפעלה של צופן בלוקים
* EAX
* OCB
* IAPM
* CWC mode
* GCM
* CCM

 |

 |
| 

| צופן זרם |
| --- |
| 
* RC4
* Salsa20
* SOSEMANUK
* Grain
* E0
* A5/1
* A5/2
* A5/3
* A5/4
* MICKEY
* HC-128
* SNOW
* Trivium
* Rabbit
* ZUC
* ChaCha

 |

 |
| 

| הצפנה אסימטרית |
| --- |
| 
* פרוטוקול דיפי-הלמן
* חידות מרקל
* חתימת למפורט
* הצפנת תרמיל
* RSA
* הצפנת רבין
* חתימה דיגיטלית רבין
* צופן אל-גמאל
* חתימה דיגיטלית אל-גמאל
* DSA
* הצפנת בלום-גולדווסר
* ECC
* הצפנת קריימר-שופ
* הצפנת פאיי
* הצפנת מקאליס
* GGH
* NTRU
* עקום 25519
* חתימה דיגיטלית של שנור
* הצפנת אוקמוטו-אושיאמה

 |

 |
| 

| פרוטוקולים |
| --- |
| 
* עץ מרקל
* פרוטוקול אתגר-מענה
* פרוטוקול נידהאם-שרודר
* פרוטוקול קרברוס
* הוכחה באפס ידע
* פרוטוקול פייגה-פיאט-שמיר
* העברה עלומה
* חלוקת סוד
* TLS (SSL)
* Secure Shell
* MQV
* X.509
* פרוטוקול שיתוף מפתח
* מיסור שלא לפרסום
* פרוטוקול סיגנל

 |

 |
| 

| פרימיטיבים תאורטיים |
| --- |
| 
* מחולל פסבדו-אקראי קריפטוגרפי
* פונקציה חד-כיוונית
* תמורה חד-כיוונית
* סיבית קשה
* פונקציה פסבדו-אקראית קריפטוגרפית
* תמורה פסאודו-אקראית
* פונקציית גיבוב קריפטוגרפית
* וקטור אתחול
* פונקציית ספוג
* הצפנה מבוססת סריג

 |

 |
| 

| קריפטואנליזה |
| --- |
| 
* ניתוח תדירויות
* כוח גס
* התקפת איזון זמן/זיכרון
* תקיפת היפגשות באמצע
* קריפטואנליזה ליניארית
* קריפטואנליזה דיפרנציאלית
* התקפת גלוי-ידוע
* התקפת גלוי-נבחר
* התקפת מוצפן-נבחר
* פירוק לגורמים של מספר שלם
* התקפת ערוץ צדדי
* התקפת קורלציה
* התקפת שיבוש
* מודל אורקל אקראי
* התקפת התנגשויות

 |

 |
| 

| בעיות מתמטיות ואלגוריתמים |
| --- |
| 
* בעיית לוגריתם דיסקרטי
* תחשיב אינדקסים
* נפה ריבועית
* אלגוריתם rho של פולרד
* נפת שדה מספרים
* אלגוריתם רו של פולרד ללוגריתמים
* אלגוריתם פוליג-הלמן

 |

 |
| 

| פונקציות גיבוב קריפטוגרפיות |
| --- |
| 
* SHA
* MD5
* MD4
* SHA-1
* SHA-2
* SHA-3
* RIPEMD
* Skein
* BLAKE
* Grøstl
* SipHash

 |

 |
| 

| אימות וזיהוי |
| --- |
| 
* אימות זהות
* סיסמה
* קוד אימות מסרים
* Poly1305
* סיסמה חד-פעמית

 |

 |
| 

| נושאים נלווים |
| --- |
| 
* מספר אקראי
* מספר ראשוני
* יתירות
* מפתח שיחה
* סטגנוגרפיה
* הצפנה קוונטית
* הצפנה פוסט-קוונטית
* עקרון קרקהופס
* אבטחת מידע
* קריפטוגרפיה ויזואלית
* אליס ובוב
* מסיבת חתימה על מפתחות ציבוריים
* שידור מוצפן
* הצפנת דיסקים
* הצפנת סף
* חתימה דיגיטלית מבוססת פונקציית גיבוב
* פונקציה זניחה
* רשת פייסטל
* רשת החלפה-תמורה
* הלבנה
* אימות מסרים
* חתימה עיוורת
* חישוב רב משתתפים בטוח

 |

 |