נפה ריבועית

שיטת הנפה הריבועית היא שיטה מהירה לפירוק לגורמים של מספר שלם, המתאימה בעיקר למספרים בני 40-100 ספרות עשרוניות (שיטת רו של פולארד עדיפה לפירוק מספרים קטנים יותר, בעוד שבמספרים ארוכים יותר נפת שדה המספרים היא השיטה היעילה ביותר).

שיטת הנפה הריבועית, שהייתה השיטה הראשונה בעלת סיבוכיות תת-אקספוננציאלית לבעיית הפירוק לגורמים, פותחה על ידי קארל פומרנץ בשנת 1981. פומרנץ הרחיב, למעשה, רעיונות קודמים של קרייטצניק (Kraitchnik) וג'ון ד' דיקסון. זו הייתה השיטה המהירה ביותר (באופן אסימפטוטי), עד להמצאתה של נפת שדה המספרים, ב-1993.

עקרונות הנפה הריבועית

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

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

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

מתוך קבוצת ה-(Q(x אנחנו מחפשים תת-קבוצה של מספרים, שמכפלתם היא ריבוע ידוע: . ברגע שמטרה זו הושגה, מתקיים , ולכן גם ; כך מצאנו x ו-y מתאימים לדרישות. אם המספר n הוא מכפלה של שני מספרים ראשוניים גדולים, אז מתקיים בהסתברות ½ , ואז תוצאת ה-GCD תהיה n או 1; במקרה כזה יש להמשיך את תהליך הייצור, ולמצוא זוג אחר של מספרים כמתואר לעיל.

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

קלט: מספר פריק

פלט: אחד הגורמים הראשוניים של

  1. בחירת גורמי בסיס
    בוחרים בסיס גורמים (Factor base) אותו מסמנים , כאשר ויתר האלמנטים הם המספרים הראשוניים החל מ- ועד לגבול מסוים, כאשר בוחרים רק את הראשוניים אשר הוא שארית ריבועית מודולו , כלומר שלהם סימן לז'נדר עיבוד הנוסחה נכשל (שגיאת המרה. השרת ("https://en.wikipedia.org/api/rest_") השיב: "Cannot get mml. Server problem."): {\displaystyle \ \left({\frac {n}{p}}\right)=1} . הגבול העליון עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ B} נקרא גבול חלקות (Smoothness bound) ולמעשה מכתיב את גודל בסיס הגורמים. הערך עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ t} מייצג את מספר הגורמים הראשוניים בבסיס, מספר זה ישפיע ישירות על כמות הווקטורים הדרושים לפירוק ועל גודלם.
  2. הכנת מאגר זוגות שלמים
    מכינים זוגות שלמים , כדלהלן: מחשבים את השורש השלם של אותו מסמנים ב-עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ m} . מכינים את הפולינום עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ q(x)=(x+m)^2-n} , מחשבים את עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ b_i=q(x)} ובודקים אם עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ b_i} הוא מספר חלק ביחס ל-עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ B} (כלומר שכל גורמיו הראשוניים נמצאים בבסיס הגורמים). אם עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ b_i} אינו מספר חלק ביחס ל-עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ B} , בוחרים אחר (את ערכי בוחרים לפי הסדר הזה: ). אם עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ b_i} הוא אכן מספר חלק כלומר ניתן לייצגו כמכפלה של גורמי בסיס: , אזי מגדירים את עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ a_i=(x+m)} , זוג הערכים נוסף למאגר.
    הערה: ניתן לבדוק חלקות באמצעות חלוקה נסיונית (פשוט על ידי חלוקה בכל גורמי הבסיס), אולם שלב זה הוא הקריטי והארוך ביותר באלגוריתם ועל כן יעילותו מתבטאת בעיקר באופן בו מיושמת בדיקת החלקות. באופן מעשי מקובל להשתמש בתהליך הניפוי (sieving) המתואר להלן.
  3. מציאת מספר ריבועי.
    כיוון שהגורמים של כל עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ b_i} ידועים, קל למצוא תת-קבוצה של עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ b_i} אשר מכפלתה היא מספר ריבועי. כיוון שצריך רק מספרים שהחזקה של כל גורם שלהם זוגית. ניתן לפשט זאת על ידי הכנת וקטור בינארי של המעריכים מודולו כלומר עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ (v_{i1},v_{i2},...,v_{it})} כאשר עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ v_{ij}=e_{ij} \mbox{ mod }2} . כיוון שבהכרח בוקטור זה תמצא תלות לינארית כלשהי, משתמשים באלגברה לינארית כדי למצוא תת-קבוצה עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ T} של וקטורים שסכומה הוא וקטור האפס . משנמצאה תת-קבוצה כזו, מכפילים את המספרים החלקים עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ b_i} המתאימים (שהמציין עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ i} שלהם ב-עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ T} ), כלומר מחשבים את עיבוד הנוסחה נכשל (שגיאת המרה. השרת ("https://en.wikipedia.org/api/rest_") השיב: "Cannot get mml. Server problem."): {\displaystyle \ x=\prod _{i\in T}a_{i}{\mbox{ mod }}n} . בהכרח מתקיים ש-עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ \prod_{i \in T} b_i} הוא מספר ריבועי. כמו כן ניתן לראות שגם מכפלת ריבועיהם של כל המתאימים יהיה מספר ריבועי. כלומר עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \ \prod_{i \in T} a^2_i \mbox{ mod }n} נותן מספר ריבועי.
  4. חישוב x ו-y
    מחשבים את השורשים הריבועיים של התוצאה האמורה, את האחד מוצאים על ידי חישוב שורש ריבועי של התוצאה האמורה ואת השני על ידי הכפלת מספרי המתאימים. מציבים ב- את וב- את השורש הריבועי של . מספרים אילו עונים על הדרישה האמורה, קרי ריבועיהם שקולים מודולו . בדרך כלל קיימות מספר תלויות לינאריות כך שבסבירות גבוהה אחת מהן תניב ו- כאלו שאינם שקולים עצמם מודולו .
  5. מציאת גורם ראשוני
    מחשבים את המחלק המשותף המרבי (gcd) של ההפרש של עם . התוצאה תהיה גורם ראשוני של , אשר עשוי להיות גם גורם טריויאלי כמו עצמו או 1. במקרה כזה, מנסים שוב עם תלות לינארית אחרת של המספרים החלקים.

הגדרת בסיס הגורמים וטווח הניפוי

שיטת הנפה דורשת דרך יעילה למצוא xi כך שהמכפלה עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \prod Q(x_i)} תתן מספר ריבועי. כדי שזה יתקיים צריך שכל גורם ראשוני המחלק את המכפלה יחלק אותה מספר זוגי של פעמים. לשם כך צריך לפרק לגורמים ראשוניים כל אחד מן המספרים עיבוד הנוסחה נכשל (שגיאת המרה. השרת ("https://en.wikipedia.org/api/rest_") השיב: "Cannot get mml. Server problem."): {\displaystyle Q\left(x_{i}\right)} המרכיבים את המכפלה.

כדי לפשט את הבדיקה אנחנו מעוניינים ש- עיבוד הנוסחה נכשל (שגיאת המרה. השרת ("https://en.wikipedia.org/api/rest_") השיב: "Cannot get mml. Server problem."): {\displaystyle Q\left(x_{i}\right)} יהיו קטנים ככל האפשר, ויתחלקו בראשוניים מתוך קבוצת ראשוניים ידועה לנו – לקבוצה זו נקרא "בסיס הגורמים" ונסמן אותה ב-B. גודלה של הקבוצה B משפיע על ביצועי האלגוריתם, ולכל ווריאנט של הניפוי הריבועי יש לחשב את ה-B האופטימלי לפי גודלו של n.

לצורך הצגת האלגוריתם, נסמן , המספרים הראשוניים הקטנים, לפי סדרם. כדי ש-(Q(x יהיה קטן אנחנו צריכים לבחור x קטן, ואז . נבחר איפה את טווח הניפוי [M,1].

שיפורים אפשריים

א. אם נוסיף לבסיס הגורמים גם את 1-, אז מספרים הקרובים ל-n מלמטה גם הם מספרים קטנים יחסית, וניתן לבחור x שלילי ועדיין לקבל מספרים שקל יחסית לעבוד איתם. כך הכפלנו את טווח הניפוי ל- [M,M-].

ב. את בסיס הגורמים אפשר להקטין על ידי "בדיקת היתכנות": אם עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle p|Q\left(x\right)} , אז עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle (x+\sqrt{n})^2 = Q(x)+n \equiv n \pmod p} , ולכן צריך להכניס לבסיס הגורמים רק מספרים ראשוניים המקיימים, עבור x מתוך טווח הניפוי, את התנאי עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle (x+\sqrt{n})^2 \equiv n \pmod p} . זוהי בדיקה שאפשר להשלים בסיבוכיות נמוכה, לפי משפט ההיפוך הריבועי של גאוס, שמאפשר לחשב את סימן לז'נדר בזמן לוגריתמי (בדומה לחישוב המחלק המשותף המקסימלי באלגוריתם אוקלידס).

הניפוי - Sieving

הגדרה: המספר X הוא חלק מעל הקבוצה B, אם כל הגורמים הראשוניים של X נמצאים ב- B

בשלב הניפוי אנחנו מחפשים עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q(x)} שיכולים להיות חלק מקבוצה המרכיבה מכפלה שהיא מספר ריבועי. לשם כך אנחנו צריכים לעבור על x מתוך טווח הניפוי, לחשב את עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q(x)} ולבדוק האם עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q(x)} חלק מעל B. עבור כל אחד מהמספרים שמתקבלים, אנו צריכים לבדוק אם הוא חלק על ידי מעבר וחלוקה בבסיס הגורמים. פעולה סדרתית כזו אינה מעשית מבחינת זמן ביצוע. לכן נעבוד על בסיס הגורמים במקביל.

לכל p בבסיס הגורמים אם עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle p|Q(x)} אז גם עיבוד הנוסחה נכשל (שגיאת המרה. השרת ("https://en.wikipedia.org/api/rest_") השיב: "Cannot get mml. Server problem."): {\displaystyle p|Q(x+p)} .
ובכיוון ההפוך, אם אז גם .

לכל p נפתור: עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q(x) = s^2 \equiv 0 \pmod p,\ x \in \mathbb{Z}_p}
את המשוואה הזאת ניתן לפתור על ידי האלגוריתם של Shanks-Tonelli.
פתרון המשוואה הריבועית יתן לנו שני שורשים, נסמן אותם ב- עיבוד הנוסחה נכשל (שגיאת המרה. השרת ("https://en.wikipedia.org/api/rest_") השיב: "Cannot get mml. Server problem."): {\displaystyle S_{1}p} ו-עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle S_2p=p-S_1p} . מכאן אנו רואים ש-עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q(x_i)} עבור עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle x_i} מתוך טווח החיפוש מתחלק ב-p כאשר עבור k שלם.

כעת בתהליך שמזכיר מאד את מכונת השרשראות של להמר, אנחנו מתקדמים ולכל x אנחנו בודקים באלו ראשוניים מבסיס הגורמים עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q(x)} מתחלק. כדי לבצע את החיפוש הזה על כל טווח הניפוי כדאי לחלק את העבודה למספר מחשבים במקביל – וכל מחשב יקבל חלק מטווח הניפוי. אנחנו בודקים האם עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q(x)} הוא חלק, אם לא – זורקים אותו ועוברים ל-x הבא, ואם כן שומרים אותו בתוך מטריצה שתוגדר בהמשך.

שיפורים אפשריים

פעולת חילוק היא פעולה מורכבת. לכן במקום לעשות חישוב מדויק, כדי לבדוק במהירות את ה”חלקות” של עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q(x)} נבצע הערכה באמצעות מספר הביטים של הגורמים ש-עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q(x)} מתחלק בהם, וכך במהירות גבוהה נקבל תוצאות וודאיות במרבית המקרים, ובאלו שיש לגביהם ספק – פשוט זורקים ועוברים הלאה, לא חסרים לנו מספרים לבדוק.

שלב המטריצה

בשלב זה אנחנו מחזיקים קבוצה עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q} של מספרים גדולים עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q(x_i)} – ואנו צריכים למצוא קבוצה חלקית ל-עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q} כך שמכפלת האיברים של הקבוצה החלקית תתן מספר ריבועי. לשם כך נגדיר ווקטור של חזקות שמייצג מספרים חלקים מעל בסיס הראשוניים שלנו .

עבור m מספר חלק מעל B: עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle m=\prod_{i=1}^k p_i^{v_i}\Rightarrow v(m)=(v_1,v_2,...,v_k) }

אנו צריכים למצוא קבוצת וקטורים המייצגים מספרים מתוך עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q} כך שמכפלת המספרים תהיה מספר ריבועי. לשם כך אנחנו צריכים למצוא קבוצת וקטורי חזקות שסכומם יתן וקטור שכל איבריו זוגיים.

נבנה מטריצה V של וקטורי חזקות, המייצגים עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle Q(x)} חלקים מעל B. ועכשיו אנו צריכים למצוא וקטור בינארי e שהכפלתו במטריצה תתן וקטור שכל איבריו זוגיים.
על ידי החילוץ הגאוסיאני (gaussian elimination) ניתן לפתור את המטריצה, ולקבל וקטור e מתאים.

שיפורים אפשריים

כדי לעשות זאת קל יותר לחישוב נמיר את המטריצה V למטריצה בינארית V2. ואז וקטור e≠0 שמקיים e·V2=0 יהווה פתרון גם עבור המטריצה V.
חשוב לציין שוקטורים מודולו 2 אינם ייצוג חד חד ערכי של וקטורי חזקות – אולם החסכון בזמן חישוב ובגודל הזיכרון – אפילו שהוא לינארי בלבד – משתלם למרות הצורך בהחזקת מיפוי בין הווקטור הבינארי למספר המקורי שהוא מייצג.

דוגמאות לייצוג וקטורי מעל בסיס B

עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle B=\left\{ 2, 3, 5, 7, 11, 13, 17 \right\} \Rightarrow p_k = 17 }

עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \begin{matrix} 3,651,921 &=& 2^0 \cdot 3^2 \cdot 5^0 \cdot 7^4 \cdot 11^0 \cdot 13^2 \cdot 17^0 & = & v(0,2,0,4,0,2,0) & \equiv & v(0,0,0,0,0,0,0) (mod 2) \\ 11,662 & = & 2^1 \cdot 3^0 \cdot 5^0 \cdot 7^3 \cdot 11^0 \cdot 13^0 \cdot 17^1 & = & v(1,0,0,3,0,0,1) & \equiv & v(1,0,0,1,0,0,1) (mod 2) \\ 1,071 & = & \cdot 2^0 \cdot 3^2 \cdot 5^0 \cdot 7^1 \cdot 11^0 \cdot 13^0 \cdot 17^1 & = & v(0,2,0,1,0,0,1) & \equiv & v(0,0,0,1,0,0,1) (mod 2) \end{matrix} }

סיבוכיות

סיבוכיות הנפה הריבועית תלויה בגודל הבסיס B. בסיס ראשוניים הכולל את כל הראשוניים עד n יביא לכך שכל (Q(x הוא חלק מעל B, וכך תהיה הסיבוכיות למציאת (Q(x מתאים (O(1 בלבד. אולם, גודלה של המטריצה במקרה כזה (כ- (n/log(n ) אינו מאפשר לנו ליהנות מהיעילות של השלב הראשון. מצד שני, בסיס ראשוניים קטן מאד (למשל הראשוניים עד 1000) ייצר לנו מטריצה קטנה ונוחה לפתרון, ועל כך נשלם בסיכוי זעיר למצוא (Q(x חלק מעל B.

נסמן ב- (φ(X,B את מספר המספרים החלקים מעל B בטווח [X,1]. הסיכוי שמספר אקראי בתחום [X,1] יהיה חלק מעל B הוא φ(X,B)/X, ולכן כדי למצוא מספר אחד מתאים אנחנו צריכים לעבור על (X/φ(X,B מספרים אקראיים. חשוב להדגיש שהמספרים (Q(x אינם אקראיים במובן הפורמלי, אבל כל הניתוחים ההיוריסטיים של שיטות הפירוק נעשים בהנחה שהם אקראיים במידה מספקת. כיוון שאנחנו צריכים B|=k| מספרים כאלו לבניית המטריצה (כדי להבטיח פתרון לא טריוויאלי), אנחנו צריכים לעבור על (k·X/φ(X,B מספרים. עלות הבדיקה שמועמד (Q(x הוא חלק מעל B היא לינארית ב- B, ולכן העבודה הכוללת בייצור היא (k²·X/φ(X,B פעולות (של ניסיון חילוק מספר בגודל ½n בראשוני קטן).
פומרנץ הראה שכדי לקבל את המינימום עבור הנוסחה הזו צריך שהאיבר הגדול ב-B, אותו סימנו ב- pk, יהיה קרוב ל- עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle e^{\tfrac{1}{2}\cdot\sqrt{log(x)\cdot log(log(x))}}} , והעבודה הנדרשת היא: עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle e^{2\cdot\sqrt{log(x)\cdot log(log(x))}}} , כלומר כ- pk4.

אבל מהו X?
באלגוריתם הניפוי הריבועי אנחנו מייצרים (Q(x מסדר גודל של n½+ε כאשר ε קטן מאד (מכיוון שמספר המועמדים שנבדוק הוא חזקה קטנה של n); כלומר, .
לכן, סדר הגודל של שלב הניפוי הוא: עיבוד הנוסחה נכשל (שגיאת המרה. השרת ("https://en.wikipedia.org/api/rest_") השיב: "Cannot get mml. Server problem."): {\displaystyle e^{\sqrt {2\cdot log(n)\cdot log(log(n))}}}

לאחר שהנתונים נאספו במטריצה (בגודל k על k), צריך למצוא פתרון לא טריוויאלי, בעלות של (O(k3 (האלימינציה של גאוס). למעשה החלק הזה של האלגוריתם הוא מהיר בהרבה, מכיוון שהמטריצה דלילה. בכל אופן מדובר בסיבוכיות זניחה ביחס לשלב איסוף המשוואות.

נפת שדה המספרים מול הנפה הריבועית

שיטה נוספת לפירוק מספר לגורמים היא נפת שדה המספרים (Number Field Sieving), זוהי שיטה מהירה יותר אסימפטוטית מהנפה הריבועית (Quadratic Sieve), אבל מסובכת הרבה יותר.

שתי השיטות מחולקות לשני שלבים: שלב הניפוי ושלב מטריצה.

סדר הגודל של שלב הניפוי בנפת שדה המספרים הוא: עיבוד הנוסחה נכשל (MathML עם גיבוי SVG או PNG (מומלץ לדפדפנים מודרניים ולכלי נגישות): תגובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle e^{c\cdot\sqrt[3]{log(n)\cdot log^2(log(n))}}} כאשר c משתנה לפי סוג הניפוי המדויק בו משתמשים (ברוב המימושים: ).

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

מקורות

  • Landquist, E., “MATH 488: Cryptographic Algorithms”, “The Quadratic Sieve Factoring Algorithm”, December 14, 2001
  • Pomerance, C., “A Tale of Two Sieves”, December, 1996.

ראו גם

  • TWINKLE - מכשיר אלקטרואופטי תאורטי, המממש את שיטת הנפה הריבועית לפירוק מהיר לגורמים.

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

This article is issued from Hamichlol. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.