מחלק משותף מקסימלי

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש

בתורת המספרים, מחלק משותף מקסימלי (או מחלק משותף גדול ביותר, ממג"ב; וכן gcd קיצור של greatest common divisor) של שני מספרים שלמים הוא המספר הגדול ביותר שמחלק את שניהם. למשל, המחלק המשותף המקסימלי של 12 ו־18 הוא 6. במושג זה, שהוא אבן פינה בתורת המספרים האלמנטרית, עסק כבר אוקלידס, שאף כלל בספרו, יסודות, אלגוריתם לחישוב המחלק המשותף המקסימלי.

המחלק המשותף המקסימלי של שני מספרים הוא מכפלה של כל הגורמים הראשוניים המשותפים לשני המספרים. תכונתו החשובה ביותר של המחלק המשותף המקסימלי היא שאפשר להציג אותו כצירוף שלם של שני הגורמים שלו. לדוגמה, המחלק המשותף המקסימלי של 9 ו- 14 הוא 1, ואפשר להציג \ 1 = 2\cdot 14 - 3 \cdot 9. תכונה זו מאפשרת לחשב הפכי מודולרי ולפתור משוואות מודולריות; מכיוון שניתן למצוא את הצירוף בצורה יעילה, עולה מכך שניתן לבצע חשבון מודולרי בצורה יעילה.

מקובל לסמן את המחלק המשותף המקסימלי של שני מספרים \ a, b בסימון \gcd\left(a,b\right), או בקיצור \ (a,b).

שני מספרים שהמחלק המשותף המקסימלי שלהם הוא 1 (כדוגמת 9 ו- 14) נקראים מספרים זרים או "ראשוניים הדדית".

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

כמה תכונות של המחלק המשותף המקסימלי[עריכת קוד מקור | עריכה]

המחלק המשותף המקסימלי של a ו- b מוגדר היטב, פרט למקרה ש- \ a=b=0 (אז כל מספר מחלק את שניהם). מקרים מיוחדים אחרים הם: \ (a,0)=a; \ (a,a)=a; \ (a,1)=1. תכונה חשובה נוספת, העומדת בבסיס ההגדרה של חבורת אוילר: אם a,b זרים, אז לכל n, \ (n,ab)=(n,a)(n,b). כמו כן, הוא מחלק כל צירוף לינארי במקדמים שלמים של a ו-b (ולכן בפרט הוא המספר החיובי הקטן ביותר שניתן לקבל כצירוף לינארי במקדמים שלמים שלהם).

חישוב המחלק המשותף המקסימלי[עריכת קוד מקור | עריכה]

את המחלק המשותף המקסימלי של שני מספרים אפשר לחשב בנקל מתוך הפירוק לגורמים שלהם; כך לדוגמה המחלק המשותף המקסימלי של 495 ו-525 הוא 15, לפי החישוב:

\ \mbox{gcd}(495,525)=\mbox{gcd}(3^2\cdot 5\cdot 11,3\cdot 5^2\cdot 7)=3\cdot 5=15.

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

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

האלגוריתם מבוסס על אבחנה יסודית: לכל b,q,r, המחלקים המשותפים של b ושל r הם גם המחלקים המשותפים ל- b ול- bq+r. לפיכך, לשני הזוגות יש אותו מחלק משותף מקסימלי: \ (qb+r,b)=(b,r). כדי לחשב את המחלק המשותף המקסימלי של שני מספרים טבעיים a,b, פעל באופן הבא: חלק את המספר הגדול (נאמר, a), במספר הקטן, וכתוב a=qb+r, כאשר \ 0\leq r<b היא השארית. אם r=0, אז המחלק המשותף המקסימלי שווה ל- b. אחרת, המחלק המשותף המקסימלי שווה לזה של b ושל r (ומכיוון שהמספר הגדול בזוג זה קטן מן המספר הגדול בזוג הקודם, התהליך מתקדם ומגיע בהכרח אל סופו).

ידוע שמספר פעולות החילוק בהפעלת האלגוריתם אינו עולה על \ \log_{\varphi}a (כאן \ \varphi מסמן את יחס הזהב), כאשר החישוב הארוך ביותר (עבור מספרים בגודל נתון) מתרחש בחישוב המחלק המשותף המקסימלי של מספרי פיבונאצ'י עוקבים. מכאן שמציאת המחלק המשותף המקסימלי היא יעילה מבחינה חישובית; האלגוריתם פועל במהירות גם עבור מספרים גדולים, בני מאות ספרות.

דוגמה[עריכת קוד מקור | עריכה]

המחלק המשותף המקסימלי של 1071 ו־1029 הוא 21. נראה זאת באמצעות האלגוריתם האוקלידי:

a b q r
1071 1029 1 42
1029 42 24 21
42 21 2 0
21 0  

הצגת המחלק המשותף המקסימלי כצירוף שלם של גורמיו[עריכת קוד מקור | עריכה]

בגרסה מורחבת מעט, מאפשר האלגוריתם האוקלידי לא רק למצוא את המחלק המשותף המקסימלי של שני מספרים, אלא גם להציג אותו כצירוף של מכפלות שלמות של שני המספרים, כלומר: אם \ \gcd\left(a,b\right)=r ניתן למצוא m,n\isin\mathbb{Z} כך ש \ ma+nb=r. האבחנה המרכזית בחישוב היא האבחנה הבאה: אם \ a=qb+r, וכבר ידועה לנו הצגה של \ (b,r) כצירוף לינארי \ (b,r)=mb+nr, ניתן לקבל משתי המשוואות את \ (b,r) כצירוף לינארי של \ a,b באמצעות הצבה פשוטה: \ r=a-qb ולכן \ (a,b)=(b,r)=mb+nr=mb+n(a-qb)=na+(m-qn)b.

ניתן לסכם את האמור לעיל באלגוריתם הבא:

Extended_GCD(a,b)
1. if b == 0 return [a,1,0]
2. q = a/b, r = a%b
3. [d,m,n]=Extended_GCD(b,r)
4. return [d,n,m-qn]

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

מחלק משותף מקסימלי בתחומי שלמות כלליים[עריכת קוד מקור | עריכה]

בכל חוג קומוטטיבי אפשר להגדיר מחלקים: איבר a מחלק איבר b, אם קיים איבר t כך ש- b=ta. יחס החילוק שהוגדר כאן הוא מעין יחס סדר חלש (הוא אינו אנטי-סימטרי), ובעזרתו אפשר לדבר על "מחלק מקסימלי" גם בחוגים שאין בהם יחס סדר טבעי:

  • איבר d הוא מחלק משותף מקסימלי של איברים a,b, אם d מחלק את a ואת b, וכל איבר המחלק את שניהם, מחלק את d.

הגדרה זו מתלכדת עם ההגדרה הרגילה, המתאימה רק לחוג השלמים.

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

  • האידאל \langle d\rangle הוא מחלק משותף מקסימלי של a ו- b אם זהו האידאל הראשי המינימלי המכיל את האידאל \langle a,b\rangle.

ישנם תחומי שלמות מיוחדים, שבהם תמיד קיים מחלק משותף מקסימלי. אחת הדוגמאות היא תחום פריקות יחידה: בחוג כזה, אפשר לכתוב כל זוג איברים a ו- b כמכפלות \ a=u p_1^{t_1}\dots p_n^{t_n} ו- \ b=v p_1^{s_1}\dots p_n^{s_n}, כאשר u,v הפיכים ו- \ p_1,\dots,p_n הם ראשוניים של החוג, שאינם ידידים זה לזה. במקרה זה, המחלק המשותף המקסימלי הוא \ p_1^{\min(t_1,s_1)}\dots p_n^{\min(t_n,s_n)}.

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

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

כלי להדגמת רקורסיה[עריכת קוד מקור | עריכה]

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

int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}

ראו גם[עריכת קוד מקור | עריכה]

קישורים חיצוניים[עריכת קוד מקור | עריכה]