פירוק לגורמים של מספר שלם

במתמטיקה, פירוק לגורמים של מספר שלם הוא פירוקו של המספר למספרים קטנים יותר, הנקראים גורמים, כך שמכפלת הגורמים זה בזה תתן את המספר המקורי. לדוגמה, את המספר 6936 ניתן לפרק לגורמים ראשוניים 6936 = 2 3 ⋅ 3 ⋅ 17 2 {\displaystyle 6936=2^{3}\cdot 3\cdot 17^{2}} . לפי המשפט היסודי של האריתמטיקה, לכל מספר טבעי גדול מ-1 קיימת הצגה יחידה כמכפלה של מספרים ראשוניים (עד כדי שינוי סדר הופעת הגורמים). תכונה זו של המספרים הראשוניים הופכת אותם למעין "אטומים" של המספרים השלמים. ידיעת הפירוק לגורמים ראשוניים של מספר מסוים מספקת ידיעה מלאה על כל מחלקיו של מספר זה. דוגמה: הפירוק לגורמים של המספר 6936 המופיע לעיל מלמד אותנו שכל מחלק של מספר זה הוא מהצורה 2 k 1 ⋅ 3 k 2 ⋅ 17 k 3 {\displaystyle 2^{k_{1}}\cdot 3^{k_{2}}\cdot 17^{k_{3}}} כאשר 0 ≤ k 1 ≤ 3 , 0 ≤ k 2 ≤ 1 , 0 ≤ k 3 ≤ 2 {\displaystyle 0\leq k_{1}\leq 3,0\leq k_{2}\leq 1,0\leq k_{3}\leq 2} . זה מביא אותנו ל- 4 ⋅ 2 ⋅ 3 = 24 {\displaystyle 4\cdot 2\cdot 3=24} מחלקים בסך הכל. פירוק לגורמים של מספר שלם גדול במיוחד (בן מאות ספרות) הוא בעיה שפתרונה, באמצעות האלגוריתמים הידועים כעת למטרה זו, דורש מאות שנים, גם כאשר משמשים למטרה זו המחשבים המהירים ביותר. קושי זה הוא הבסיס לשיטות הצפנה א-סימטרית רבות. עד אמצע המאה ה-20 הבעיה העסיקה מעטים שהתמידו בחיפוש שיטות יעילות יותר לפירוק מספרים גדולים לגורמים. במחצית השנייה של המאה ה-20, עם התפתחות המחשבים ועלייתה של הקריפטוגרפיה, במיוחד מערכות אבטחה אסימטריות שמסתמכות על פירוק לגורמים ככלי הצפנה כמו RSA ודומיה, עלתה רמת העניין בבעיה זו. כיום הבעיה נחשבת לאחת הבעיות החשובות בתורת המספרים והיא מעסיקה מתמטיקאים רבים מכל העולם. חשיבותה נודעת לא רק מהיבט קריפטוגרפי אלא בעיקר כבעיה חישובית המשמשת כמדד יכולת וידע טכנולוגי. חברת RSA פרסמה בעבר רשימת מספרים שהם כפולה של שני ראשוניים גדולים, שהציבה כאתגר לציבור עם פרס בצידם למי שיצליח לפרקם לגורמים. מספרים אלה מכונים מספרי האתגר של RSA ומיוצגים על ידי RSA-xxxx כשה-x-ים מציינים את מספר הספרות (בבסיס בינארי, ולעיתים בבסיס עשר). למשל הפרס למי שיצליח לפרק לגורמים את המספר RSA-2048 (בגודל 617 ספרות עשרוניות) היה 200,000 דולר. אולם פרויקט האתגר בוטל בראשית 2008. לפני יותר מ-300 שנה, שיער המתמטיקאי הצרפתי מרן מרסן שהמספר 2 251 − 1 {\displaystyle 2^{251}-1} פריק. 100 שנים מאוחר יותר הוכח שהוא צדק, עם זאת אפילו רק לפני כשני עשורים, המאמץ שנדרש לפירוק מספר זה היה כמעט מעבר ליכולת הטכנולוגית באותה עת. ב-1984 ההערכה הייתה שלפירוק המספר יידרשו 10 20 {\displaystyle 10^{20}} שנים בקירוב. המספר פורק בהצלחה באותה שנה בתוך 32 שעות, שיא עולמי. אם בשנת 1970 בקושי ניתן היה לפרק מספר בן 20 ספרות עשרוניות, הרי שתוך פחות מעשור לאחר מכן חלה התקדמות משמעותית. ב-1980 הצליחו ג'ון ברילהרט ומייקל מוריסון לפרק לגורמים מספר בן 50 ספרות עשרוניות באמצעות שברים משולבים בהתבסס על רעיון של מוריס קרייצ'יק. ב-1990 הצליח צוות מתמטיקאים לפרק לגורמים מספר בן 116 ספרות עשרוניות תוך שימוש באלגוריתם הנפה הריבועית של קארל פומרנץ ובשנת 1994 באמצעות אותו אלגוריתם פורק בהצלחה מספר האתגר RSA-129. במאי 2005 הסתיים באוניברסיטת בון מאמץ ממושך שהחל בסוף 2003 בפירוק המספר RSA-200 (כ-663 סיביות) לגורמים. הפירוק בוצע באמצעות אלגוריתם נפת שדה מספרים הכללי של ג'ון פולארד, האחים לנסטרה (הנדריק וארג'ן) ומרק מאנס, בזמן של 55 שנות מעבד אופטרון 2.2GHz יחיד, על ידי צוות מתמטיקאים בראשות בוהר, בוהם, פרנק וקלנג'ונג. בנובמבר 2005 הצליח אותו צוות עם אותו אלגוריתם לפרק לגורמים את המספר RSA-640 (בגודל 193 ספרות עשרוניות) במאמץ של כ-30 שנות מעבד אופטרון 2.2GHz בתוך חמישה חודשים, בשנת 2020 פורק המספר הגדול ביותר עד כה, (RSA-250), שהוא בעל 250 ספרות עשרוניות (829 ספרות בבסיס בינארי). מספרי פרמה F k = 2 2 k + 1 {\displaystyle F_{k}=2^{2^{k}}+1} נקראים על שמו של פייר דה פרמה, שהתעניין בפירוק לגורמים בשל הקשר למספרים משוכללים ומספרים ידידים. הוא טען והוכיח, כי מספרים מהצורה 2 m + 1 {\displaystyle 2^{m}+1} יכולים להיות ראשוניים רק אם m {\displaystyle m} הוא חזקה של שתיים. הוא האמין שמספרים אלה ראשוניים כולם. כיום ידוע שלא, למשל F 5 = 2 2 5 + 1 {\displaystyle F_{5}=2^{2^{5}}+1} מתחלק ב-641, אם כי פרמה עצמו החמיץ עובדה זו מסיבה לא ידועה. שנים לאחר מכן הוכיח גאוס את חשיבות מספרי פרמה בגאומטריה אלמנטרית, ומתמטיקאים רבים ניסו כוחם בפירוק מספרי פרמה תוך שימוש במיטב האלגוריתמים הידועים בתקופתם. הבעיה הורחבה לבעיה כללית יותר של פירוק מספרים מהצורה b m ± 1 {\displaystyle b^{m}\pm 1} (כאשר b {\displaystyle b} קטן ו- m {\displaystyle m} גדול), המכונים מספרי קנינגהם על שם המתמטיקאי אלן ג'וזף קנינגהם (Allan J. C. Cunningham). פרויקט קנינגהם היווה מעין מבחן כוח להתקדמות בתחום הכללי של פירוק לגורמים. ב-1880 מצאו מתמטיקאים את הגורמים הראשוניים של F 6 {\displaystyle F_{6}} , רק כמאה שנים לאחר מכן ב-1970 הצליחו מוריסון וברילהרט לפרק את F 7 {\displaystyle F_{7}} באמצעות שברים משולבים. מספר פרמה השמיני פורק ב-1980 על ידי ברנט ופולארד באמצעות גרסה של אלגוריתם rho של פולרד היעיל במיוחד במציאת גורמים קטנים. מספר פרמה התשיעי פורק לחלוטין ב-1990 על ידי האחים לנסטרה, מאנאס ופולארד שעשו זאת במאמץ שנמשך כארבעה חודשים, באמצעות נפת שדה המספרים והשתמשו בכוח חישוב של כ-700 מחשבים שגויסו ממקומות שונים ברחבי העולם ומחשב-על אחד שריכז את העבודה. מספר פרמה העשירי פורק לגורמים ב-1999 על ידי ריצ'רד ברנט באמצעות שיטת העקום האליפטי. ב-1988 נעשה שימוש באותה שיטה כדי לפרק לגורמים את F 11 {\displaystyle F_{11}} (שגורמיו הראשוניים (פרט לגדול ביותר) נמצאו כולם קטנים). עד היום (2010), נמצאו כ-250 גורמים ראשוניים של מספרי פרמה מ- F 12 {\displaystyle F_{12}} עד F 2478782 {\displaystyle F_{2478782}} , כאשר מספר פרמה הקטן ביותר שעדיין לא ידוע האם הוא פריק או ראשוני הוא F 33 {\displaystyle F_{33}} . אך פירוקם המלא של מספרים אלו לגורמים טרם צלח. חשיבותם של מספרי קנינגהם כמדד יעילות בפירוק לגורמים הולכת ודועכת לאחרונה, מהסיבה הפשוטה שהמספרים שיש בהם עניין מיוחד כיום (המשמשים בדרך כלל במערכות הצפנה) קשים בהרבה לפירוק ממספרי פרמה המקבילים להם. למשל מודלוס בגודל 512 סיביות (שהוא כפולה של שני מספרים ראשוניים גדולים), דורש זמן ומשאבים פיננסיים הגדולים במידה ניכרת מהזמן והמשאבים שנדרשו בפירוק מספר פרמה התשיעי (המקביל לו). לבעיית הפירוק לגורמים לא ידוע פתרון יעיל אלגוריתמית, כלומר כזה שזמן ריצתו פולינומי ביחס למספר הספרות במספר שמפרקים. ההשערה הרווחת היא שפתרון כזה לא קיים (משמע בעיית הפירוק לגורמים אינה ב-P) ועל השערה זו מבוססות שיטות הצפנה רבות כגון RSA. עם זאת, מבין הבעיות שאינן ניתנות לפתרון יעיל, בעיית הפירוק לגורמים נחשבת ל"קלה באופן יחסי". בפרט סבורים שהיא אינה בעיה NP-קשה. עדות לסברה זו היא אלגוריתם שור, אלגוריתם קוונטי הפותר את בעיית הפירוק לגורמים בזמן פולינומי (מכאן שאילו בעיית הפירוק לגורמים הייתה NP-קשה, אזי NP הייתה מוכלת ב-BQP בניגוד להשערה הרווחת). כמו כן ידוע שבעיית הפירוק לגורמים שייכת ל-co-NP, ולכן אילו היא הייתה NP-קשה הדבר היה גורר NP=co-NP, תוצאה הנחשבת מאוד לא סבירה. מבין כל האלגוריתמים הידועים לפירוק לגורמים עד 1988, נחשב אלגוריתם הנפה הריבועית כאלגוריתם היעיל ביותר לפירוק מספרים גדולים, טוב יותר מפירוק לגורמים באמצעות עקום אליפטי (שיטה שהציע קארל פומרנץ ב-1984) ומאלגוריתם הנפה הרציונלית של דיקסון, אולם עם פרסומו של אלגוריתם נפת שדה מספרים על ידי פולארד, התגלה האחרון כאלגוריתם הטוב ביותר בכל הזמנים לפירוק לגורמים. בשיטה זו פורק המספר RSA-130 בקרוב ל-15 אחוז מהזמן שארך לנפה הריבועית. נכון לשנת 2007, נפת שדה המספרים נחשבת לשיטה היעילה ביותר הידועה כיום לפירוק מספרים גדולים מאוד לגורמים ונמצאת בעיצומו של תהליך מחקר ופיתוח. רעיון הפרש המספרים הריבועיים, מבואר היטב במאמרו של קארל פומרנץ "A Tale of Two Sieves". הוא סיפר שבתחרות מתמטית שבה השתתף כסטודנט ב-1960 הוצג התרגיל: פירוק המספר 8051 לגורמים ראשוניים בתוך חמש דקות (באותה שנה מחשבונים טרם הומצאו). לא קשה לבצע חילוק ניסיוני עד שורש המספר (בערך 90) בתוך חמש דקות, אולם כבכל תחרות הרעיון היה למצוא את הטריק שיקצר את הדרך משמעותית. התשובה פשוטה: 8051 = 8100 − 49 = 90 2 − 7 2 = ( 90 − 7 ) ( 90 + 7 ) = 83 ⋅ 97 {\displaystyle 8051=8100-49=90^{2}-7^{2}=(90-7)(90+7)=83\cdot 97} על טריק זה המכונה הפרש ריבועים, מבוססת שיטת הפירוק לגורמים של המתמטיקאי הצרפתי פרמה. קל להבין זאת אם זוכרים שכל מספר פריק אי-זוגי ניתן לייצוג כהפרש הריבועים: a b = ( a + b 2 ) 2 − ( a − b 2 ) 2 {\displaystyle ab=\left({\frac {a+b}{2}}\right)^{2}-\left({\frac {a-b}{2}}\right)^{2}} כמו שבחילוק ניסיוני (Trial Division) ישנם מקרים קלים כגון אם המספר מכיל גורמים קטנים כלשהם, כך גם בשיטת פרמה. התרגיל המתואר הוא מקרה קל של שיטת פרמה היעילה בתנאי שגורמי המספר אותו מעוניינים לפרק קרובים מאוד לשורשים ריבועיים. אולם במקרה הגרוע שיטת פרמה יעילה פחות מחילוק ניסיוני. מרבית המספרים נופלים בקטגוריה השנייה, כלומר במקרה הממוצע שיטת פרמה אינה יעילה. קרייצ'יק העלה רעיון לשיפור שיטת פרמה, מה שהפך לאחר מכן כבסיס למרבית האלגוריתמים המודרניים. במקום למצוא שלמים u , v {\displaystyle u,v} המקיימים u 2 − v 2 = n {\displaystyle u^{2}-v^{2}=n} עבור השלם n {\displaystyle n} אותו אנו מעוניינים לפרק, מספיק למצוא שלמים כאלו שהם כפולה של n {\displaystyle n} כלומר u 2 ≡ v 2 ( mod n ) {\displaystyle u^{2}\equiv v^{2}\!\!\!\!{\pmod {\!n}}} . לשקילות האחרונה יכולים להיות שני פתרונות, האחד 'אינו מעניין' כאשר u ≡ ± v ( mod n ) {\displaystyle u\equiv \pm v\!\!\!\!{\pmod {\!n}}} והשני 'מעניין' כאשר u ≢ ± v ( mod n ) {\displaystyle u\not \equiv \pm v\!\!\!\!{\pmod {\!n}}} . האחרון מעניין כיוון שלפחות למחצית השלמים הזרים ל- n {\displaystyle n} קיים פתרון כזה אם n {\displaystyle n} אי-זוגי ומתחלק לכל הפחות בשני ראשוניים שונים. וזה מעניין משום שהמחלק המשותף המרבי gcd { n , u − v } {\displaystyle \gcd\{n,u-v\}} הוא גורם ראשוני של n {\displaystyle n} . זאת משום ש- n {\displaystyle n} מחלק את u 2 − v 2 = ( u − v ) ( u + v ) {\displaystyle u^{2}-v^{2}=(u-v)(u+v)} , אולם אינו מחלק אף גורם מהם (כלומר את u , v {\displaystyle u,v} עצמם), עובדה זו מעידה כי u − v < n < u + v {\displaystyle u-v<n<u+v} . לדוגמה עבור n = 2041 {\displaystyle n=2041} , המספר הריבועי הסמוך לו מעליו הוא 46 2 = 2116 {\displaystyle 46^{2}=2116} . אם נגדיר פולינום ממעלה שנייה Q ( x ) = x 2 − n {\displaystyle Q(x)=x^{2}-n} עבור השלמים x = 46 , 47 , 48 , … {\displaystyle x=46,47,48,\ldots } נקבל את התוצאות 75 , 168 , 263 , 360 , 459 , 560 … {\displaystyle 75,168,263,360,459,560\ldots } . אמנם עדיין לא נמצא מספר ריבועי כלשהו, אולם הרעיון הוא למצוא מספר שלמים x {\displaystyle x} המקיימים: x 1 x 2 ⋯ x k = u Q ( x 1 ) Q ( x 2 ) ⋯ Q ( x k ) = v 2 u 2 = x 1 2 x 2 2 ⋯ x k 2 ≡ Q ( x 1 ) Q ( x 2 ) ⋯ Q ( x k ) = v 2 ( mod n ) {\displaystyle {\begin{aligned}x_{1}x_{2}\cdots x_{k}=u\\Q(x_{1})Q(x_{2})\cdots Q(x_{k})=v^{2}\\u^{2}=x_{1}^{2}x_{2}^{2}\cdots x_{k}^{2}\equiv Q(x_{1})Q(x_{2})\cdots Q(x_{k})=v^{2}\!\!\!\!{\pmod {\!n}}\end{aligned}}} הפתרון לקונגרואנציה כעת ברור. אולם איך נמצא x {\displaystyle x} -ים כאלה שכפולת הפולינומים מעליהם נותנת מספר ריבועי? רעיונו של קרייצ'יק הוא שחלק מהפולינומים Q ( x ) {\displaystyle Q(x)} ניתנים לפירוק לגורמים יחסית בקלות, כפי שרואים: 75 = 3 ⋅ 5 2 168 = 2 3 ⋅ 3 ⋅ 7 360 = 2 3 ⋅ 3 2 ⋅ 5 560 = 2 4 ⋅ 5 ⋅ 7 {\displaystyle {\begin{aligned}75&=3\cdot 5^{2}\\168&=2^{3}\cdot 3\cdot 7\\360&=2^{3}\cdot 3^{2}\cdot 5\\560&=2^{4}\cdot 5\cdot 7\end{aligned}}} מתוך הפירוק של ארבעה מספרים אלה אפשר לראות כי 2 10 ⋅ 3 4 ⋅ 5 4 ⋅ 7 2 {\displaystyle 2^{10}\cdot 3^{4}\cdot 5^{4}\cdot 7^{2}} הוא מספר ריבועי וכך מצאנו את u 2 ≡ v 2 ( mod n ) {\displaystyle u^{2}\equiv v^{2}\!\!\!\!{\pmod {\!n}}} כאשר: u = 46 ⋅ 47 ⋅ 49 ⋅ 51 ≡ 311 ( mod 2041 ) v = 2 5 ⋅ 3 2 ⋅ 5 2 ⋅ 7 ≡ 1416 ( mod 2041 ) {\displaystyle {\begin{aligned}u=46\cdot 47\cdot 49\cdot 51\equiv 311\!\!\!\!{\pmod {\!2041}}\\v=2^{5}\cdot 3^{2}\cdot 5^{2}\cdot 7\equiv 1416\!\!\!\!{\pmod {\!2041}}\end{aligned}}} היות ש- 311 ≢ ± 1416 ( mod 2041 ) {\displaystyle 311\not \equiv \pm 1416\!\!\!\!{\pmod {\!2041}}} , נשתמש באלגוריתם אוקלידס לחישוב gcd { 2041 , 1416 − 311 } {\displaystyle \gcd {\bigl \{}2041,1416-311{\bigr \}}} ונמצא כי 2041 = 13 ⋅ 157 {\displaystyle 2041=13\cdot 157} . איך ידענו למצוא את ה- x {\displaystyle x} -ים הנכונים? הרעיון של קרייצ'יק היה פשוט לחפש אותם סדרתית. אלגוריתם קרייצ'יק פותח לאחר מכן על ידי מספר מתמטיקאים, הצעה אחת הייתה להחליף את הפונקציה Q ( x ) = x 2 − n {\displaystyle Q(x)=x^{2}-n} בפונקציה עדיפה הנובעת מהרחבה של השברים המשולבים של שורש n {\displaystyle n} . מסתבר שחיפוש יעיל של סדרה כזו של x {\displaystyle x} -ים המקיימת את התנאי האמור היא בעצם המשימה העיקרית בכל אלגוריתם לפירוק לגורמים. קארל פומרנץ ניצל את האסטרטגיה של ברילהרט ומוריסון כדי לפתח על בסיס שיטת קרייצ'יק את אלגוריתם הנפה הריבועית. הדרך למצוא סדרה המניבה מספר ריבועי נעשית באמצעות אלגברה ליניארית. אם מתייחסים לוקטור v ( m ) {\displaystyle v(m)} כוקטור של מעריכים של הגורמים של m {\displaystyle m} , אזי אפשר לראות שרק אם סכום המעריכים זוגי יתקבל מספר ריבועי. לכן התכסיס הוא לחפש מספרים שניתן לייצגם ככפולה של סדרה קטנה של חזקות ראשוניים אותה מכנים 'בסיס גורמים'. אפשר ל'שחק' בכמה מספרים כאלו עד שעולים על תלות ליניארית של וקטור המעריכים (כלומר וקטור שסכומו אפס) ומשם הדרך למציאת מספר ריבועי מתאים קלה. במרוצת הזמן נוספו עוד שיפורים לאלגוריתם הנפה הריבועית על ידי מתמטיקאים רבים. הדרך לפיתוח אלגוריתם נפת שדה המספרים עוברת דרך הרעיונות המתוארים, אם כי אלגוריתם נפת שדה המספרים הרבה יותר מורכב מקודמיו. במהותו האלגוריתם מבוסס על שיטת פרמה, המציגה את המספר כהפרש של מספרים ריבועיים. אולם הדרך להשיג זאת שונה בתכלית. הגרסה הראשונה שהעלה פולרד התאימה במיוחד למספרים בעלי מבנה מיוחד כמספרי פרמה. האלגוריתם נקרא SNFS קיצור של Special number filed sieve והוא היעיל ביותר הידוע עבור מספרים אילו. מאוחר יותר הורחב האלגוריתם לפירוק כל סוג של מספר. נפת שדה המספרים משתמשת בכמה רעיונות מתקדמים בתורת המספרים כמו שדות אלגבריים מעל מספרים רציונליים, הומומורפיזם, ראשוניים אידיאליים ונורמה של מרחבים וקטוריים מעל שדות מרוכבים. גם לאלגוריתם זה נוספו שיפורים לא מעטים במשך הזמן, על ידי מתמטיקאים רבים ביניהם קופרסמיט, ויידמן, בוהלר, פומרנץ, אודליצקו ואחרים. בהנחה שמחשבים קוונטיים בקנה מידה מלא יהיו מעשיים בזמן הקרוב ניתן יהיה לפרק כל מספר גדול לגורמים בסיבוכיות זמן של O ( log ⁡ ( n ) 3 ) {\displaystyle O(\log(n)^{3})} באמצעות אלגוריתם שור. לעובדה זו השלכות מרחיקות לכת על תורת ההצפנה וכבר בימינו שוקדים מדענים על פיתוח אלגוריתמים פוסט-קוונטיים שיעמדו בפני קריפטואנליזה על מחשב קוונטי כאשר יהיה מעשי. ההערכות מדברות על פחות מ-15 שנה. נכון לשנת 2015 המחשב הקוונטי הגדול ביותר הוא בקנה מידה של 1000 קיוביטטים. מהיבט של קריפטוגרפיה זה די נמוך מהגודל הדרוש כדי לפרק לגורמים מספרים בהם משתמשים במערכות הצפנה מודרניות. פירוק לשברים חלקיים נפה ריבועית – שיטה מהירה לפירוק מספרים לגורמים, המתאימה בעיקר למספרים בני 40–100 ספרות עשרוניות. אלגוריתם שור – אלגוריתם קוונטי לפירוק מספר לגורמים. פירוק לגורמים עבור המושג הכללי. המאמר A Tale of Two Sieves של קרל פומרנץ ממציא הנפה הריבועית ונמנה עם מפתחי NFS. פירוק לגורמים של מספר שלם, באתר MathWorld (באנגלית)