אלגוריתם אוקלידס

מתוך המכלול, האנציקלופדיה היהודית
(הופנה מהדף חילוק אוקלידי)
קפיצה לניווט קפיצה לחיפוש

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

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

האלגוריתם הוא אחד מהכלים המרכזיים בתורת המספרים ויש לו שימושים רבים, לדוגמה בצופן RSA.

רקע

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

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

דרך אפשרית למציאת המחלק המשותף המקסימלי היא פירוק שני המספרים לגורמים ראשוניים, והכפלת הגורמים המשותפים. בדוגמה הנ"ל, הפירוק לראשוניים של 36 הוא ‎2×2×3×3 ושל 24 הוא ‎2×2×2×3, הגורמים המשותפים הם 2, 2 ו-3, ומכפלתם היא 12. דרך זו היא אינטואיטיבית, אך אינה שימושית עבור מספרים גדולים, כי פירוק לגורמים הוא פעולה מורכבת ואין שיטה פשוטה לחישובו. אלגוריתם אוקלידס מאפשר את מציאת המחלק המשותף המקסימלי ללא פירוק לגורמים, בדרך פשוטה יחסית. למעשה, שיטות מתקדמות לפירוק לגורמים (לדוגמה אלגוריתם נפת שדה מספרים) משתמשות באלגוריתם אוקלידס.

דרך פעולת האלגוריתם

האלגוריתם מבוסס על העיקרון הבא: הוספת כפולה של אחד המספרים למספר השני, אינה משנה את המחלק המשותף הגדול ביותר. בניסוח מתמטי, אם b,c ו-q מספרים טבעיים אז מתקיים: הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle \ (b,c+qb) = (b,c)} .

בתכונה זו ניתן להשתמש בכיוון ההפוך - במקום להגדיל את אחד המספרים, מקטינים אותו: לכל זוג מספרים a,b, כאשר a הוא הגדול בין השניים, ניתן לחשב את השארית c מחלוקת a ב-b, כך ש-הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle a=c+qb, c<b} . מכאן מתקבל השוויון הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle \ (a,b) = (b,c)} , שבו הוחלף המספר הגדול a במספר c קטן יותר משני המספרים המקוריים, בלי לשנות את המחלק המשותף. אפשר להמשיך בתהליך שוב ושוב עם מספרים קטנים יותר ויותר, עד שמגיעים לזוג שאחד המספרים בו הוא 0; הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle (a,0)=a} , ולפיכך נמצא המחלק המשותף הגדול ביותר.

באופן רקורסיבי ניתן להגדיר את האלגוריתם בצורה הבאה: לחישוב הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle (a,b)} ‏(כאשר a>b), אם b הוא 0, התוצאה היא a. אחרת, חלק את a ב-b ומצא את השארית c; התוצאה היא הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle (b,c)} (שאותה יש לחשב בעזרת אותו אלגוריתם עצמו).

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

הוכחה

ראשית יש להוכיח את השוויון הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle (b,c+qb) = (b,c)} .

נניח ש-g מחלק את b ו-c. אז קיימים m,n טבעיים כך ש-הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle b=mg, c=ng} . מכאן: . כלומר g מחלק את הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle c+qb} , ומכאן שהוא מחלק משותף של b ושל הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle c+qb} .

בכיוון ההפוך, נניח ש-h מחלק את הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle c+qb} וגם את b. אז קיימים m,n טבעיים כך ש-הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle b=mh, c+qb=nh} . מכאן: הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle c=(c+qb)-qb=nh-qmh=(n-qm)h} . כלומר h מחלק את c, ומכאן שהוא מחלק משותף של b ושל c.

קיבלנו שמספר הוא מחלק משותף של הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle c+qb} ושל b אם ורק אם הוא מחלק משותף של b ושל c. לכן קבוצת המחלקים המשותפים של הזוגות זהה, ובפרט האיבר המקסימלי שלהם זהה. מכאן הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle (b,c+qb) = (b,c)} .

דוגמה

הדגמה מונפשת של שימוש באלגוריתם אוקלידס לחישוב (1071,462)

נחשב את המחלק המשותף המקסימלי של 1071 ו-462, או (1071, 462):

  • 462 נכנס ב-1071 פעמיים, והשארית היא 147. לפיכך עלינו למצוא את (462, 147).
  • 147 נכנס ב-462 שלוש פעמים, והשארית היא 21. לפיכך עלינו למצוא את (147, 21).
  • 21 נכנס ב-147 7 פעמים בדיוק, כלומר בשארית 0. לפיכך עלינו למצוא את (21, 0).
  • מאחר שהמספר הקטן הוא 0, התשובה היא 21, וזו גם התשובה לשאלה המקורית.

לפתרון ניתן לתת משמעות גאומטרית כמודגם באיור: 21 הוא אורך הצלע של האריח הריבועי הגדול ביותר שמאפשר לרצף במדויק את המלבן שצלעותיו הן 1071 ו-462.

דוגמה למימוש האלגוריתם בצורה רקורסיבית בקוד (JavaScript)
function gcd(a, b) {
	if (b == 0) return a;
	return gcd(b, a % b);
}
דוגמה למימוש האלגוריתם בצורה רקורסיבית בקוד (Python)
def gcd(a, b):
    if b == 0:
        return a
    return gcd(b, a % b)

יעילות

מבחינת סיבוכיות חישובית, האלגוריתם יעיל. מספר הפעולות הנדרשות לביצוע אינו עולה על הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle \ \log_{\varphi}a} (הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle \ \varphi} הוא יחס הזהב). על כן הסיבוכיות שלו היא לוגריתמית. ניתן להגיד שמספר הפעולות אינו עולה על פי-5 ממספר הספרות.

המקרה הגרוע ביותר (worst case) הוא כאשר מדובר בשני מספרי פיבונאצ'י עוקבים; זאת, כיוון שככל שהמנה המתקבלת בפעולות החילוק קטנה יותר, המספר קָטֶן פחות, ויש צורך ביותר פעולות. במספרי פיבונאצ'י כל המנות הן 1, ועל כן התהליך הוא הארוך ביותר. תכונה זו נתגלתה על ידי גבריאל לאמה.

אלגוריתם אוקלידס המורחב

אחת התכונות החשובות של המחלק המשותף המקסימלי היא שניתן להציג אותו בצורה הבאה: , כאשר m,n שלמים.

ניתן לחשב את m,n בעזרת אלגוריתם אוקלידס בעזרת התכונה שאם כל פעם השתמשנו ב-הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle a=c+qb} , אז הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle c=a-qb} . לפיכך, אם אנחנו יודעים בשלב מסוים איך להציג את שני המספרים הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle a} ו-הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle b} בצורה הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle mA+nB} (ההתחלה פשוטה: הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle n=0} ,הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle m=1} , או להפך) ניתן להציב בביטוי הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle c=a-qb} ולהתקדם בשלבי האלגוריתם עד להצגה הרצויה.

לדוגמה, נמצא בדוגמה להלן את ההצגה של 10 כ-הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle 100n+230m} :

  • הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle 100=1\cdot100+0\cdot230}
  • הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle 30=230-2\cdot100=-2\cdot100+1\cdot230}
  • הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle 10=100-3\cdot30=100-3\cdot(-2\cdot100+1\cdot230)=7\cdot100-3\cdot230}

לפיכך: הפענוח נכשל (SVG (אפשר להפעיל MathML בעזרת הרחבת דפדפן): תשובה בלתי־תקינה ("Math extension cannot connect to Restbase.") מהשרת "https://wikimedia.org/api/rest_v1/":): {\displaystyle n=7, m=-3} .

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

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

ראו גם

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

ויקישיתוף מדיה וקבצים בנושא אלגוריתם אוקלידס בוויקישיתוף
הערך באדיבות ויקיפדיה העברית, קרדיט,
רשימת התורמים
רישיון cc-by-sa 3.0

אלגוריתם אוקלידס32431291Q230848